diff --git a/.arcconfig b/.arcconfig index 2d7555dc10..88f04f72c5 100644 --- a/.arcconfig +++ b/.arcconfig @@ -1,11 +1,5 @@ { - "project_id" : "phabricator", - "conduit_uri" : "https://secure.phabricator.com/api/", - "lint.engine" : "PhabricatorLintEngine", - "unit.engine" : "PhutilUnitTestEngine", - "phutil_libraries" : { - "phabricator" : "src/" - }, - "lint.xhpast.naminghook" : "PhabricatorSymbolNameLinter", - "lint.jshint.config" : "support/jshint/jshintconfig" + "phabricator.uri": "https://secure.phabricator.com/", + "load": ["src/"], + "history.immutable": false } diff --git a/.arclint b/.arclint new file mode 100644 index 0000000000..29258b5d3e --- /dev/null +++ b/.arclint @@ -0,0 +1,86 @@ +{ + "exclude": [ + "(^externals/)", + "(^webroot/rsrc/externals/(?!javelin/))", + "(/__tests__/data/)" + ], + "linters": { + "chmod": { + "type": "chmod" + }, + "filename": { + "type": "filename" + }, + "generated": { + "type": "generated" + }, + "javelin": { + "type": "javelin", + "include": "(\\.js$)", + "exclude": [ + "(^support/aphlict/)" + ] + }, + "jshint-browser": { + "type": "jshint", + "include": "(\\.js$)", + "exclude": [ + "(^support/aphlict/server/.*\\.js$)", + "(^webroot/rsrc/externals/javelin/core/init_node\\.js$)" + ], + "jshint.jshintrc": "support/lint/browser.jshintrc" + }, + "jshint-node": { + "type": "jshint", + "include": [ + "(^support/aphlict/server/.*\\.js$)", + "(^webroot/rsrc/externals/javelin/core/init_node\\.js$)" + ], + "jshint.jshintrc": "support/lint/node.jshintrc" + }, + "json": { + "type": "json", + "include": [ + "(^src/docs/book/.*\\.book$)", + "(^support/lint/jshintrc$)", + "(^\\.arcconfig$)", + "(^\\.arclint$)", + "(\\.json$)" + ] + }, + "merge-conflict": { + "type": "merge-conflict" + }, + "nolint": { + "type": "nolint" + }, + "phutil-library": { + "type": "phutil-library", + "include": "(\\.php$)" + }, + "spelling": { + "type": "spelling" + }, + "text": { + "type": "text", + "exclude": [ + "(^src/(.*/)?__tests__/[^/]+/.*\\.(txt|json|expect))" + ] + }, + "text-without-length": { + "type": "text", + "include": [ + "(^src/(.*/)?__tests__/[^/]+/.*\\.(txt|json|expect))" + ], + "severity": { + "3": "disabled" + } + }, + "xhpast": { + "type": "xhpast", + "include": "(\\.php$)", + "standard": "phutil.xhpast", + "xhpast.php-version": "5.5" + } + } +} diff --git a/.arcunit b/.arcunit new file mode 100644 index 0000000000..860ee1aee2 --- /dev/null +++ b/.arcunit @@ -0,0 +1,8 @@ +{ + "engines": { + "phutil": { + "type": "phutil", + "include": "(\\.php$)" + } + } +} diff --git a/.divinerconfig b/.divinerconfig deleted file mode 100644 index 8757fdb13b..0000000000 --- a/.divinerconfig +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name" : "Phabricator", - "src_link" : "https://secure.phabricator.com/diffusion/P/browse/master/%f$%l", - "groups" : { - "intro" : "Introduction", - "config" : "Configuration", - "userguide" : "Application User Guides", - "contrib" : "Contributing", - "developer" : "Phabricator Developer Guides", - "flavortext" : "Flavor Text", - "differential" : "Differential (Code Review)", - "diffusion" : "Diffusion (Repository Browser)", - "maniphest" : "Maniphest (Task Tracking)", - "slowvote" : "Slowvote (Polls)", - "herald" : "Herald (Notifications)", - "conduit" : "Conduit (Phabricator HTTP API)", - "celerity" : "Celerity (CSS/JS Management)", - "phriction" : "Phriction (Wiki)", - "aphront" : "Aphront (Web Stack)", - "console" : "DarkConsole (Debugging Console)", - "storage" : "Storage", - "filestorage" : "File Storage", - "search" : "Search", - "daemon" : "Daemons, Tasks and Workers", - "irc" : "IRC", - "markup" : "Remarkup Extensions", - "metamta" : "MetaMTA (Mail)" - }, - "engines" : [ - ["DivinerArticleEngine", {}], - ["DivinerXHPEngine", {}] - ] -} diff --git a/.editorconfig b/.editorconfig index 0722c45a96..11da68c2c0 100644 --- a/.editorconfig +++ b/.editorconfig @@ -3,13 +3,32 @@ [*] indent_style = space indent_size = 2 +end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true +max_line_length = 80 + +[.arclint] +max_line_length = unset + +[resources/sql/**.sql] +max_line_length = unset + +[scripts/install/install_*.sh] +max_line_length = unset + +[src/applications/differential/parser/__tests__/data/*.diff] +trim_trailing_whitespace = false + +[src/applications/differential/parser/__tests__/messages/long-title.txt] +max_line_length = unset + +[src/applications/diffusion/ssh/__tests__/hgwiredata/*.txt] +max_line_length = unset [externals/**] -; Use editor default (possible autodetection). -indent_style = -indent_size = +indent_style = unset +indent_size = unset trim_trailing_whitespace = false insert_final_newline = false diff --git a/.gitignore b/.gitignore index 6ea4dd528b..b7f6818b8f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,10 @@ -.DS_Store -._* -/webroot/rsrc/custom -.#* -*# -*~ -*.swp - -# NetBeans project files -/nbproject/ - -# PhpStorm project files -.idea/ - -# Arcanist scratch directory -/.arc +# NOTE: Thinking about adding files created by your operating system, IDE, +# or text editor here? Don't! Add them to your per-user .gitignore instead. # Diviner /docs/ -/.divinercache +/.divinercache/ +/src/.cache/ # libphutil /src/.phutil_module_cache @@ -27,6 +14,10 @@ /conf/local/local.json /conf/local/ENVIRONMENT /conf/local/VERSION +/conf/keys/device.pub +/conf/keys/device.key +/conf/keys/device.id +/conf/aphlict/aphlict.custom.json # Impact Font /resources/font/impact.ttf @@ -34,5 +25,20 @@ # User-accessible hook for adhoc debugging scripts /support/debug.php +# User-accessible hook for adhoc startup code +/support/preamble.php + # Users can link binaries here /support/bin/* + +# User extensions +/src/extensions/* + +# NPM local packages +/support/aphlict/server/node_modules/ +/support/aphlict/server/package.json +/support/aphlict/server/package-lock.json + +# Places for users to add custom resources. +/resources/cows/custom/* +/resources/figlet/custom/* diff --git a/LICENSE b/LICENSE index f433b1a53f..d9a10c0d8e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,3 @@ - Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ diff --git a/NOTICE b/NOTICE index db629a5dfa..f514a400e2 100644 --- a/NOTICE +++ b/NOTICE @@ -1,7 +1,21 @@ Phabricator -Copyright 2013 Facebook, Inc. +Copyright 2014 Phacility, Inc. -This product includes software developed at -Facebook, Inc. (http://www.facebook.com/facebook). +Phabricator was originally developed and maintained by Phacility, Inc. -Libraries in externals/ have their own licenses and copyright holders. + http://www.phacility.com/ + +Portions of this software were developed by various contributors, who retain +copyright on their work. These works are licensed to Phacility, Inc. + +Phabricator is available under the Apache 2.0 license. See LICENSE for more +information. + +Phabricator and Phacility are trademarks of Phacility, Inc. For additional +information about trademarks that pertain to this software, see: + + http://www.phacility.com/trademarks/ + +This software uses other open source libraries, which are located in +"externals/" and "webroot/rsrc/externals/". These libraries have their own +licenses and copyright holders. diff --git a/README b/README deleted file mode 100644 index 9221dfdb45..0000000000 --- a/README +++ /dev/null @@ -1,13 +0,0 @@ -Phabricator is an open source collection of web applications which make it -easier to write, review, and share source code. Phabricator was developed at -Facebook. - -It's pretty high-quality and usable, but under active development so things -may change quickly. - -You can learn more about the project and find links to documentation and -resources at: http://phabricator.org/ - -LICENSE - -Phabricator is released under the Apache 2.0 license except as otherwise noted. diff --git a/README.md b/README.md new file mode 100644 index 0000000000..5190845da4 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +Effective June 1, 2021: Phabricator is no longer actively maintained. + +**Phabricator** is a collection of web applications for software development. + +**LICENSE** + +Phabricator is released under the Apache 2.0 license except as otherwise noted. diff --git a/bin/accountadmin b/bin/accountadmin deleted file mode 120000 index a846766c26..0000000000 --- a/bin/accountadmin +++ /dev/null @@ -1 +0,0 @@ -../scripts/user/account_admin.php \ No newline at end of file diff --git a/bin/almanac b/bin/almanac new file mode 120000 index 0000000000..015c541cdc --- /dev/null +++ b/bin/almanac @@ -0,0 +1 @@ +../scripts/almanac/manage_almanac.php \ No newline at end of file diff --git a/bin/bulk b/bin/bulk new file mode 120000 index 0000000000..04d0550497 --- /dev/null +++ b/bin/bulk @@ -0,0 +1 @@ +../scripts/setup/manage_bulk.php \ No newline at end of file diff --git a/bin/calendar b/bin/calendar new file mode 120000 index 0000000000..33929a5ba1 --- /dev/null +++ b/bin/calendar @@ -0,0 +1 @@ +../scripts/setup/manage_calendar.php \ No newline at end of file diff --git a/bin/celerity b/bin/celerity new file mode 120000 index 0000000000..f4558cb181 --- /dev/null +++ b/bin/celerity @@ -0,0 +1 @@ +../scripts/setup/manage_celerity.php \ No newline at end of file diff --git a/bin/commit-hook b/bin/commit-hook new file mode 120000 index 0000000000..9eda12cfb7 --- /dev/null +++ b/bin/commit-hook @@ -0,0 +1 @@ +../scripts/repository/commit_hook.php \ No newline at end of file diff --git a/bin/conduit b/bin/conduit new file mode 120000 index 0000000000..9221340a93 --- /dev/null +++ b/bin/conduit @@ -0,0 +1 @@ +../scripts/setup/manage_conduit.php \ No newline at end of file diff --git a/bin/differential b/bin/differential new file mode 120000 index 0000000000..5a50360da3 --- /dev/null +++ b/bin/differential @@ -0,0 +1 @@ +../scripts/setup/manage_differential.php \ No newline at end of file diff --git a/bin/garbage b/bin/garbage new file mode 120000 index 0000000000..417438c09c --- /dev/null +++ b/bin/garbage @@ -0,0 +1 @@ +../scripts/setup/manage_garbage.php \ No newline at end of file diff --git a/bin/harbormaster b/bin/harbormaster new file mode 120000 index 0000000000..448588ebef --- /dev/null +++ b/bin/harbormaster @@ -0,0 +1 @@ +../scripts/setup/manage_harbormaster.php \ No newline at end of file diff --git a/bin/herald b/bin/herald new file mode 120000 index 0000000000..53f039ddf1 --- /dev/null +++ b/bin/herald @@ -0,0 +1 @@ +../scripts/setup/manage_herald.php \ No newline at end of file diff --git a/bin/i18n b/bin/i18n new file mode 120000 index 0000000000..cb5eaeaab3 --- /dev/null +++ b/bin/i18n @@ -0,0 +1 @@ +../scripts/setup/manage_i18n.php \ No newline at end of file diff --git a/bin/lock b/bin/lock new file mode 120000 index 0000000000..686fa38798 --- /dev/null +++ b/bin/lock @@ -0,0 +1 @@ +../scripts/setup/manage_lock.php \ No newline at end of file diff --git a/bin/nuance b/bin/nuance new file mode 120000 index 0000000000..c2cf50a211 --- /dev/null +++ b/bin/nuance @@ -0,0 +1 @@ +../scripts/setup/manage_nuance.php \ No newline at end of file diff --git a/bin/phortune b/bin/phortune new file mode 120000 index 0000000000..cde0acff7e --- /dev/null +++ b/bin/phortune @@ -0,0 +1 @@ +../scripts/setup/manage_phortune.php \ No newline at end of file diff --git a/bin/policy b/bin/policy new file mode 120000 index 0000000000..ffb2bac562 --- /dev/null +++ b/bin/policy @@ -0,0 +1 @@ +../scripts/setup/manage_policy.php \ No newline at end of file diff --git a/bin/remove b/bin/remove new file mode 120000 index 0000000000..a073e3ebef --- /dev/null +++ b/bin/remove @@ -0,0 +1 @@ +../scripts/setup/manage_remove.php \ No newline at end of file diff --git a/bin/ssh-connect b/bin/ssh-connect new file mode 120000 index 0000000000..79f7c94d03 --- /dev/null +++ b/bin/ssh-connect @@ -0,0 +1 @@ +../scripts/ssh/ssh-connect.php \ No newline at end of file diff --git a/bin/trigger b/bin/trigger new file mode 120000 index 0000000000..37d4b4a7cb --- /dev/null +++ b/bin/trigger @@ -0,0 +1 @@ +../scripts/setup/manage_trigger.php \ No newline at end of file diff --git a/bin/user b/bin/user new file mode 120000 index 0000000000..4b4b6b7ab5 --- /dev/null +++ b/bin/user @@ -0,0 +1 @@ +../scripts/setup/manage_user.php \ No newline at end of file diff --git a/bin/webhook b/bin/webhook new file mode 120000 index 0000000000..d320336874 --- /dev/null +++ b/bin/webhook @@ -0,0 +1 @@ +../scripts/setup/manage_webhook.php \ No newline at end of file diff --git a/bin/worker b/bin/worker new file mode 120000 index 0000000000..d0284581e5 --- /dev/null +++ b/bin/worker @@ -0,0 +1 @@ +../scripts/setup/manage_worker.php \ No newline at end of file diff --git a/conf/__init_conf__.php b/conf/__init_conf__.php index d3b946da5f..18c132c6d4 100644 --- a/conf/__init_conf__.php +++ b/conf/__init_conf__.php @@ -1,13 +1,49 @@ true, + 'darkconsole.enabled' => true, + ); + } + + $files = id(new FileFinder($root.'/conf/')) + ->withType('f') + ->withSuffix('conf.php') + ->withFollowSymlinks(true) + ->find(); + + foreach ($files as $key => $file) { + $file = trim($file, './'); + $files[$key] = preg_replace('/\.conf\.php$/', '', $file); + } + $files = ' '.implode("\n ", $files); + + throw new Exception( + pht( + "CONFIGURATION ERROR\n". + "Config file '%s' does not exist. Valid config files are:\n\n%s", + $original_config, + $files)); + } + // Make sure config file errors are reported. $old_error_level = error_reporting(E_ALL | E_STRICT); $old_display_errors = ini_get('display_errors'); @@ -21,25 +57,11 @@ function phabricator_read_config_file($original_config) { ini_set('display_errors', $old_display_errors); if ($conf === false) { - if (!Filesystem::pathExists($full_config_path)) { - $files = id(new FileFinder($root.'/conf/')) - ->withType('f') - ->withSuffix('conf.php') - ->withFollowSymlinks(true) - ->find(); - - foreach ($files as $key => $file) { - $file = trim($file, './'); - $files[$key] = preg_replace('/\.conf\.php$/', '', $file); - } - $files = " ".implode("\n ", $files); - - throw new Exception( - "CONFIGURATION ERROR\n". - "Config file '{$original_config}' does not exist. Valid config files ". - "are:\n\n".$files); - } - throw new Exception("Failed to read config file '{$config}': {$errors}"); + throw new Exception( + pht( + "Failed to read config file '%s': %s", + $config, + $errors)); } return $conf; diff --git a/conf/aphlict/README b/conf/aphlict/README new file mode 100644 index 0000000000..2786ea5658 --- /dev/null +++ b/conf/aphlict/README @@ -0,0 +1,16 @@ +To customize this configuration, you have two options: create a custom +configuration file in this directory, or specify a path to a configuration file +explicitly when starting Aphlict. + +To create a custom configuration file, copy `aphlict.default.json` in this +directory and rename it `aphlict.custom.json`. If this file exists, it will +be read by default. + +To specify a path when starting Aphlict, use the `--config` flag: + + phabricator/ $ ./bin/aphlict start --config path/to/config.json + +Specifying a configuration file explicitly overrides default configuration. + +For more information about configuring notifications, see the article +"Notifications User Guide: Setup and Configuration" in the documentation. diff --git a/conf/aphlict/aphlict.default.json b/conf/aphlict/aphlict.default.json new file mode 100644 index 0000000000..7afdf7e8ff --- /dev/null +++ b/conf/aphlict/aphlict.default.json @@ -0,0 +1,26 @@ +{ + "servers": [ + { + "type": "client", + "port": 22280, + "listen": "0.0.0.0", + "ssl.key": null, + "ssl.cert": null, + "ssl.chain": null + }, + { + "type": "admin", + "port": 22281, + "listen": "127.0.0.1", + "ssl.key": null, + "ssl.cert": null, + "ssl.chain": null + } + ], + "logs": [ + { + "path": "/var/log/aphlict.log" + } + ], + "pidfile": "/var/tmp/aphlict/pid/aphlict.pid" +} diff --git a/conf/default.conf.php b/conf/default.conf.php deleted file mode 100644 index cf9f963d4e..0000000000 --- a/conf/default.conf.php +++ /dev/null @@ -1,1181 +0,0 @@ - null, - - // If you have multiple environments, provide the production environment URI - // here so that emails, etc., generated in development/sandbox environments - // contain the right links. - 'phabricator.production-uri' => null, - -// -- IMPORTANT! Security! -------------------------------------------------- // - - // IMPORTANT: By default, Phabricator serves files from the same domain the - // application lives on. This is convenient but not secure: it creates a large - // class of vulnerabilities which can not be generally mitigated. - // - // To avoid this, you should configure a second domain in the same way you - // have the primary domain configured (e.g., point it at the same machine and - // set up the same vhost rules) and provide it here. For instance, if your - // primary install is on "http://www.phabricator-example.com/", you could - // configure "http://www.phabricator-files.com/" and specify the entire - // domain (with protocol) here. This will enforce that files are - // served only from the alternate domain. Ideally, you should use a - // completely separate domain name rather than just a different subdomain. - // - // It is STRONGLY RECOMMENDED that you configure this. Your install is NOT - // SECURE unless you do so. - 'security.alternate-file-domain' => null, - - // Default key for HMAC digests where the key is not important (i.e., the - // hash itself is secret). You can change this if you want (to any other - // string), but doing so will break existing sessions and CSRF tokens. - 'security.hmac-key' => '[D\t~Y7eNmnQGJ;rnH6aF;m2!vJ8@v8C=Cs:aQS\.Qw', - - // If the web server responds to both HTTP and HTTPS requests but you want - // users to connect with only HTTPS, you can set this to true to make - // Phabricator redirect HTTP requests to HTTPS. - // - // Normally, you should just configure your server not to accept HTTP traffic, - // but this setting may be useful if you originally used HTTP and have now - // switched to HTTPS but don't want to break old links, or if your webserver - // sits behind a load balancer which terminates HTTPS connections and you - // can not reasonably configure more granular behavior there. - // - // NOTE: Phabricator determines if a request is HTTPS or not by examining the - // PHP $_SERVER['HTTPS'] variable. If you run Apache/mod_php this will - // probably be set correctly for you automatically, but if you run Phabricator - // as CGI/FCGI (e.g., through nginx or lighttpd), you need to configure your - // web server so that it passes the value correctly based on the connection - // type. Alternatively, you can add a PHP snippet to the top of this - // configuration file to directly set $_SERVER['HTTPS'] to the correct value. - 'security.require-https' => false, - - // Is Phabricator permitted to make outbound HTTP requests? - 'security.allow-outbound-http' => true, - - -// -- Internationalization -------------------------------------------------- // - - // This allows customizing texts used in Phabricator. The class must extend - // PhabricatorTranslation. - 'translation.provider' => 'PhabricatorEnglishTranslation', - - // You can use 'translation.override' if you don't want to create a full - // translation to give users an option for switching to it and you just want - // to override some strings in the default translation. - 'translation.override' => array(), - - -// -- Access Policies ------------------------------------------------------- // - - // Phabricator allows you to set the visibility of objects (like repositories - // and source code) to "Public", which means anyone on the internet can see - // them, even without being logged in. This is great for open source, but - // some installs may never want to make anything public, so this policy is - // disabled by default. You can enable it here, which will let you set the - // policy for objects to "Public". With this option disabled, the most open - // policy is "All Users", which means users must be logged in to view things. - 'policy.allow-public' => false, - - -// -- Logging --------------------------------------------------------------- // - - // To enable the Phabricator access log, specify a path here. The Phabricator - // access log can provide more detailed information about Phabricator access - // than normal HTTP access logs (for instance, it can show logged-in users, - // controllers, and other application data). If not set, no log will be - // written. - // - // Make sure the PHP process can write to the log! - 'log.access.path' => null, - - // Format for the access log. If not set, the default format will be used: - // - // "[%D]\t%h\t%u\t%M\t%C\t%m\t%U\t%c\t%T" - // - // Available variables are: - // - // - %c The HTTP response code. - // - %C The controller which handled the request. - // - %D The request date. - // - %e Epoch timestamp. - // - %h The webserver's host name. - // - %p The PID of the server process. - // - %R The HTTP referrer. - // - %r The remote IP. - // - %T The request duration, in microseconds. - // - %U The request path. - // - %u The logged-in username, if one is logged in. - // - %P The logged-in user PHID, if one is logged in. - // - %M The HTTP method. - // - %m For conduit, the Conduit method which was invoked. - // - // If a variable isn't available (for example, %m appears in the file format - // but the request is not a Conduit request), it will be rendered as "-". - // - // Note that the default format is subject to change in the future, so if you - // rely on the log's format, specify it explicitly. - 'log.access.format' => null, - - -// -- DarkConsole ----------------------------------------------------------- // - - // DarkConsole is a administrative debugging/profiling tool built into - // Phabricator. You can leave it disabled unless you're developing against - // Phabricator. - - // Determines whether or not DarkConsole is available. DarkConsole exposes - // some data like queries and stack traces, so you should be careful about - // turning it on in production (although users can not normally see it, even - // if the deployment configuration enables it). - 'darkconsole.enabled' => false, - - // Always enable DarkConsole, even for logged out users. This potentially - // exposes sensitive information to users, so make sure untrusted users can - // not access an install running in this mode. You should definitely leave - // this off in production. It is only really useful for using DarkConsole - // utilities to debug or profile logged-out pages. You must set - // 'darkconsole.enabled' to use this option. - 'darkconsole.always-on' => false, - - // Map of additional configuration values to lock. - 'config.lock' => array(), - - // Map of additional configuration values to hide. - 'config.hide' => array(), - - // Map of additional configuration values to mask. - 'config.mask' => array(), - - // Ignore setup warnings of the following issues. - 'config.ignore-issues' => array(), - -// -- MySQL --------------------------------------------------------------- // - - // Class providing database configuration. It must implement - // DatabaseConfigurationProvider. - 'mysql.configuration-provider' => 'DefaultDatabaseConfigurationProvider', - - // The username to use when connecting to MySQL. - 'mysql.user' => 'root', - - // The password to use when connecting to MySQL. - 'mysql.pass' => '', - - // The MySQL server to connect to. - 'mysql.host' => 'localhost', - - // If you want to connect to a different port than the default (which is 3306) - 'mysql.port' => null, - - // Phabricator supports PHP extensions MySQL and MySQLi. It is possible to - // implement also other access mechanism (e.g. PDO_MySQL). The class must - // extend AphrontMySQLDatabaseConnectionBase. - 'mysql.implementation' => (extension_loaded('mysqli') - ? 'AphrontMySQLiDatabaseConnection' - : 'AphrontMySQLDatabaseConnection'), - - -// -- Notifications --------------------------------------------------------- // - - // Set this to true to enable real-time notifications. You must also run a - // notification server for this to work. Consult the documentation in - // "Notifications User Guide: Setup and Configuration" for instructions. - 'notification.enabled' => false, - - // Client port for the realtime server to listen on, and for realtime clients - // to connect to. Use "localhost" if you are running the notification server - // on the same host as the web server. - 'notification.client-uri' => 'http://localhost:22280/', - - // URI and port for the notification root server. - 'notification.server-uri' => 'http://localhost:22281/', - - // The server must be started as root so it can bind to privileged ports, but - // if you specify a user here it will drop permissions after binding. - 'notification.user' => null, - - // Location where the server should log to. - 'notification.log' => '/var/log/aphlict.log', - - // PID file to use. - 'notification.pidfile' => '/var/run/aphlict.pid', - - // Enable this option to get additional debug output in the browser. - 'notification.debug' => false, - - -// -- Email ----------------------------------------------------------------- // - - // Some Phabricator tools send email notifications, e.g. when Differential - // revisions are updated or Maniphest tasks are changed. These options allow - // you to configure how email is delivered. - - // You can test your mail setup by going to "MetaMTA" in the web interface, - // clicking "Send New Message", and then composing a message. - - // Default address to send mail "From". - 'metamta.default-address' => 'noreply@example.com', - - // Domain used to generate Message-IDs. - 'metamta.domain' => 'example.com', - - // When a message is sent to multiple recipients (for example, several - // reviewers on a code review), Phabricator can either deliver one email to - // everyone (e.g., "To: alincoln, usgrant, htaft") or separate emails to each - // user (e.g., "To: alincoln", "To: usgrant", "To: htaft"). The major - // advantages and disadvantages of each approach are: - // - // - One mail to everyone: - // - Recipients can see To/Cc at a glance. - // - If you use mailing lists, you won't get duplicate mail if you're - // a normal recipient and also Cc'd on a mailing list. - // - Getting threading to work properly is harder, and probably requires - // making mail less useful by turning off options. - // - Sometimes people will "Reply All" and everyone will get two mails, - // one from the user and one from Phabricator turning their mail into - // a comment. - // - Not supported with a private reply-to address. - // - Mails are sent in the server default translation. - // - One mail to each user: - // - Recipients need to look in the mail body to see To/Cc. - // - If you use mailing lists, recipients may sometimes get duplicate - // mail. - // - Getting threading to work properly is easier, and threading settings - // can be customzied by each user. - // - "Reply All" no longer spams all other users. - // - Required if private reply-to addresses are configured. - // - Mails are sent in the language of user preference. - // - // In the code, splitting one outbound email into one-per-recipient is - // sometimes referred to as "multiplexing". - 'metamta.one-mail-per-recipient' => true, - - // When sending a message that has no To recipient (i.e. all recipients - // are CC'd, for example when multiplexing mail), set the To field to the - // following value. If no value is set, messages with no To will have - // their CCs upgraded to To. - 'metamta.placeholder-to-recipient' => null, - - // When a user takes an action which generates an email notification (like - // commenting on a Differential revision), Phabricator can either send that - // mail "From" the user's email address (like "alincoln@logcabin.com") or - // "From" the 'metamta.default-address' address. The user experience is - // generally better if Phabricator uses the user's real address as the "From" - // since the messages are easier to organize when they appear in mail clients, - // but this will only work if the server is authorized to send email on behalf - // of the "From" domain. Practically, this means: - // - If you are doing an install for Example Corp and all the users will - // have corporate @corp.example.com addresses and any hosts Phabricator - // is running on are authorized to send email from corp.example.com, - // you can enable this to make the user experience a little better. - // - If you are doing an install for an open source project and your - // users will be registering via Facebook and using personal email - // addresses, you MUST NOT enable this or virtually all of your outgoing - // email will vanish into SFP blackholes. - // - If your install is anything else, you're much safer leaving this - // off since the risk in turning it on is that your outgoing mail will - // mostly never arrive. - 'metamta.can-send-as-user' => false, - - // Limit the maximum size of the body of an email generated for a diff - // (in bytes). - 'metamta.email-body-limit' => 524288, - - // Adapter class to use to transmit mail to the MTA. The default uses - // PHPMailerLite, which will invoke "sendmail". This is appropriate - // if sendmail actually works on your host, but if you haven't configured mail - // it may not be so great. A number of other mailers are available (e.g., SES, - // SendGrid, SMTP, custom mailers), consult "Configuring Outbound Email" in - // the documentation for details. - 'metamta.mail-adapter' => - 'PhabricatorMailImplementationPHPMailerLiteAdapter', - - // When email is sent, try to hand it off to the MTA immediately instead of - // queueing it for delivery by the daemons. If you are running the Phabricator - // daemons with "phd start", you should disable this to provide a (sometimes - // substantial) performance boost. It's on by default to make setup and - // configuration a little easier. - 'metamta.send-immediately' => true, - - // When email is sent, what format should Phabricator use for user's - // email addresses? Valid values are: - // - 'short' - 'gwashington ' - // - 'real' - 'George Washington ' - // - 'full' - 'gwashington (George Washington) ' - // The default is 'full'. - 'metamta.user-address-format' => 'full', - - // If you're using PHPMailer to send email, provide the mailer and options - // here. PHPMailer is much more enormous than PHPMailerLite, and provides more - // mailers and greater enormity. You need it when you want to use SMTP - // instead of sendmail as the mailer. - 'phpmailer.mailer' => 'smtp', - 'phpmailer.smtp-host' => '', - 'phpmailer.smtp-port' => 25, - - // When using PHPMailer with SMTP, you can set this to one of "tls" or "ssl" - // to use TLS or SSL. Leave it blank for vanilla SMTP. If you're sending - // via Gmail, set it to "ssl". - 'phpmailer.smtp-protocol' => '', - - // Set following if your smtp server requires authentication. - 'phpmailer.smtp-user' => null, - 'phpmailer.smtp-password' => null, - - // If you're using Amazon SES to send email, provide your AWS access key - // and AWS secret key here. To set up Amazon SES with Phabricator, you need - // to: - // - Make sure 'metamta.mail-adapter' is set to: - // "PhabricatorMailImplementationAmazonSESAdapter" - // - Make sure 'metamta.can-send-as-user' is false. - // - Make sure 'metamta.default-address' is configured to something sensible. - // - Make sure 'metamta.default-address' is a validated SES "From" address. - 'amazon-ses.access-key' => null, - 'amazon-ses.secret-key' => null, - - // If you're using Sendgrid to send email, provide your access credentials - // here. This will use the REST API. You can also use Sendgrid as a normal - // SMTP service. - 'sendgrid.api-user' => null, - 'sendgrid.api-key' => null, - - // You can configure a reply handler domain so that email sent from Maniphest - // will have a special "Reply To" address like "T123+82+af19f@example.com" - // that allows recipients to reply by email and interact with tasks. For - // instructions on configurating reply handlers, see the article - // "Configuring Inbound Email" in the Phabricator documentation. By default, - // this is set to 'null' and Phabricator will use a generic 'noreply@' address - // or the address of the acting user instead of a special reply handler - // address (see 'metamta.default-address'). If you set a domain here, - // Phabricator will begin generating private reply handler addresses. See - // also 'metamta.maniphest.reply-handler' to further configure behavior. - // This key should be set to the domain part after the @, like "example.com". - 'metamta.maniphest.reply-handler-domain' => null, - - // You can follow the instructions in "Configuring Inbound Email" in the - // Phabricator documentation and set 'metamta.maniphest.reply-handler-domain' - // to support updating Maniphest tasks by email. If you want more advanced - // customization than this provides, you can override the reply handler - // class with an implementation of your own. This will allow you to do things - // like have a single public reply handler or change how private reply - // handlers are generated and validated. - // - // This key should be set to a loadable subclass of - // PhabricatorMailReplyHandler. - 'metamta.maniphest.reply-handler' => 'ManiphestReplyHandler', - - // If you don't want phabricator to take up an entire domain - // (or subdomain for that matter), you can use this and set a common - // prefix for mail sent by phabricator. It will make use of the fact that - // a mail-address such as phabricator+D123+1hjk213h@example.com will be - // delivered to the phabricator users mailbox. - // Set this to the left part of the email address and it well get - // prepended to all outgoing mail. If you want to use e.g. - // 'phabricator@example.com' this should be set to 'phabricator'. - 'metamta.single-reply-handler-prefix' => null, - - // Prefix prepended to mail sent by Maniphest. You can change this to - // distinguish between testing and development installs, for example. - 'metamta.maniphest.subject-prefix' => '[Maniphest]', - - // See 'metamta.maniphest.reply-handler-domain'. This does the same thing, but - // affects Pholio. - 'metamta.pholio.reply-handler-domain' => null, - - // Prefix prepended to mail sent by Pholio. - 'metamta.pholio.subject-prefix' => '[Pholio]', - - // See 'metamta.maniphest.reply-handler-domain'. This does the same thing, but - // affects Macro. - 'metamta.macro.reply-handler-domain' => null, - - // Prefix prepended to mail sent by Macro. - 'metamta.macro.subject-prefix' => '[Macro]', - - // See 'metamta.maniphest.reply-handler-domain'. This does the same thing, - // but allows email replies via Differential. - 'metamta.differential.reply-handler-domain' => null, - - // See 'metamta.maniphest.reply-handler'. This does the same thing, but - // affects Differential. - 'metamta.differential.reply-handler' => 'DifferentialReplyHandler', - - // Prefix prepended to mail sent by Differential. - 'metamta.differential.subject-prefix' => '[Differential]', - - // Set this to true if you want patches to be attached to mail from - // Differential. This won't work if you are using SendGrid as your mail - // adapter. - 'metamta.differential.attach-patches' => false, - - // To include patches in email bodies, set this to a positive integer. Patches - // will be inlined if they are at most that many lines. For instance, a value - // of 100 means "inline patches if they are no longer than 100 lines". By - // default, patches are not inlined. - 'metamta.differential.inline-patches' => 0, - - // If you enable either of the options above, you can choose what format - // patches are sent in. Valid options are 'unified' (like diff -u) or 'git'. - 'metamta.differential.patch-format' => 'unified', - - // Enables a different format for comments in differential emails. - // Differential will create unified diffs around the comment, which - // will give enough context for people who are only viewing the - // reviews in email to understand what is going on. The context will - // be created based on the range of the comment. - 'metamta.differential.unified-comment-context' => false, - - // Prefix prepended to mail sent by Diffusion. - 'metamta.diffusion.subject-prefix' => '[Diffusion]', - - // See 'metamta.maniphest.reply-handler-domain'. This does the same thing, - // but allows email replies via Diffusion. - 'metamta.diffusion.reply-handler-domain' => null, - - // See 'metamta.maniphest.reply-handler'. This does the same thing, but - // affects Diffusion. - 'metamta.diffusion.reply-handler' => 'PhabricatorAuditReplyHandler', - - // Set this to true if you want patches to be attached to commit notifications - // from Diffusion. This won't work with SendGrid. - 'metamta.diffusion.attach-patches' => false, - - // To include patches in Diffusion email bodies, set this to a positive - // integer. Patches will be inlined if they are at most that many lines. - // By default, patches are not inlined. - 'metamta.diffusion.inline-patches' => 0, - - // If you've enabled attached patches or inline patches for commit emails, you - // can establish a hard byte limit on their size. You should generally set - // reasonable byte and time limits (defaults are 1MB and 60 seconds) to avoid - // sending ridiculously enormous email for changes like "importing an external - // library" or "accidentally committed this full-length movie as text". - 'metamta.diffusion.byte-limit' => 1024 * 1024, - - // If you've enabled attached patches or inline patches for commit emails, you - // can establish a hard time limit on generating them. - 'metamta.diffusion.time-limit' => 60, - - // Prefix prepended to mail sent by Package. - 'metamta.package.subject-prefix' => '[Package]', - - // See 'metamta.maniphest.reply-handler'. This does similar thing for package - // except that it only supports sending out mail and doesn't handle incoming - // email. - 'metamta.package.reply-handler' => 'OwnersPackageReplyHandler', - - // By default, Phabricator generates unique reply-to addresses and sends a - // separate email to each recipient when you enable reply handling. This is - // more secure than using "From" to establish user identity, but can mean - // users may receive multiple emails when they are on mailing lists. Instead, - // you can use a single, non-unique reply to address and authenticate users - // based on the "From" address by setting this to 'true'. This trades away - // a little bit of security for convenience, but it's reasonable in many - // installs. Object interactions are still protected using hashes in the - // single public email address, so objects can not be replied to blindly. - 'metamta.public-replies' => false, - - // You can configure an email address like "bugs@phabricator.example.com" - // which will automatically create Maniphest tasks when users send email - // to it. This relies on the "From" address to authenticate users, so it is - // is not completely secure. To set this up, enter a complete email - // address like "bugs@phabricator.example.com" and then configure mail to - // that address so it routed to Phabricator (if you've already configured - // reply handlers, you're probably already done). See "Configuring Inbound - // Email" in the documentation for more information. - 'metamta.maniphest.public-create-email' => null, - - // If you enable 'metamta.public-replies', Phabricator uses "From" to - // authenticate users. You can additionally enable this setting to try to - // authenticate with 'Reply-To'. Note that this is completely spoofable and - // insecure (any user can set any 'Reply-To' address) but depending on the - // nature of your install or other deliverability conditions this might be - // okay. Generally, you can't do much more by spoofing Reply-To than be - // annoying (you can write but not read content). But, you know, this is - // still **COMPLETELY INSECURE**. - 'metamta.insecure-auth-with-reply-to' => false, - - // If you enable 'metamta.maniphest.public-create-email' and create an - // email address like "bugs@phabricator.example.com", it will default to - // rejecting mail which doesn't come from a known user. However, you might - // want to let anyone send email to this address; to do so, set a default - // author here (a Phabricator username). A typical use of this might be to - // create a "System Agent" user called "bugs" and use that name here. If you - // specify a valid username, mail will always be accepted and used to create - // a task, even if the sender is not a system user. The original email - // address will be stored in an 'From Email' field on the task. - 'metamta.maniphest.default-public-author' => null, - - // You can disable the Herald hints in email if users prefer smaller messages. - // These are the links under the headers "MANAGE HERALD RULES" and - // "WHY DID I GET THIS EMAIL?". If you set this to true, they will not appear - // in any mail. Users can still navigate to the links via the web interface. - 'metamta.herald.show-hints' => true, - - // You can disable the hints under "REPLY HANDLER ACTIONS" if users prefer - // smaller messages. The actions themselves will still work properly. - 'metamta.reply.show-hints' => true, - - // You can disable the "To:" and "Cc:" footers in mail if users prefer - // smaller messages. - 'metamta.recipients.show-hints' => true, - - // If this option is enabled, Phabricator will add a "Precedence: bulk" - // header to transactional mail (e.g., Differential, Maniphest and Herald - // notifications). This may improve the behavior of some auto-responder - // software and prevent it from replying. However, it may also cause - // deliverability issues -- notably, you currently can not send this header - // via Amazon SES, and enabling this option with SES will prevent delivery - // of any affected mail. - 'metamta.precedence-bulk' => false, - - // Mail.app on OS X Lion won't respect threading headers unless the subject - // is prefixed with "Re:". If you enable this option, Phabricator will add - // "Re:" to the subject line of all mail which is expected to thread. If - // you've set 'metamta.one-mail-per-recipient', users can override this - // setting in their preferences. - 'metamta.re-prefix' => false, - - // If true, allow MetaMTA to change mail subjects to put text like - // '[Accepted]' and '[Commented]' in them. This makes subjects more useful, - // but might break threading on some clients. If you've set - // 'metamta.one-mail-per-recipient', users can override this setting in their - // preferences. - 'metamta.vary-subjects' => true, - -// -- Auth ------------------------------------------------------------------ // - - // Maximum number of simultaneous web sessions each user is permitted to have. - // Setting this to "1" will prevent a user from logging in on more than one - // browser at the same time. - 'auth.sessions.web' => 5, - - // Maximum number of simultaneous Conduit sessions each user is permitted - // to have. - 'auth.sessions.conduit' => 5, - - // Set this true to enable the Settings -> SSH Public Keys panel, which will - // allow users to associated SSH public keys with their accounts. This is only - // really useful if you're setting up services over SSH and want to use - // Phabricator for authentication; in most situations you can leave this - // disabled. - 'auth.sshkeys.enabled' => false, - - // If true, email addresses must be verified (by clicking a link in an - // email) before a user can login. By default, verification is optional - // unless 'auth.email-domains' is nonempty (see below). - 'auth.require-email-verification' => false, - - // You can restrict allowed email addresses to certain domains (like - // "yourcompany.com") by setting a list of allowed domains here. Users will - // only be allowed to register using email addresses at one of the domains, - // and will only be able to add new email addresses for these domains. If - // you configure this, it implies 'auth.require-email-verification'. - // - // To configure email domains, set a list of domains like this: - // - // array( - // 'yourcompany.com', - // 'yourcompany.co.uk', - // ) - // - // You should omit the "@" from domains. Note that the domain must match - // exactly. If you allow "yourcompany.com", that permits "joe@yourcompany.com" - // but rejects "joe@mail.yourcompany.com". - 'auth.email-domains' => array(), - - // You can provide an arbitrary block of HTML here, which will appear on the - // login screen. Normally, you'd use this to provide login or registration - // instructions to users. - 'auth.login-message' => null, - - -// -- Accounts -------------------------------------------------------------- // - - // Is basic account information (email, real name, profile picture) editable? - // If you set up Phabricator to automatically synchronize account information - // from some other authoritative system, you can disable this to ensure - // information remains consistent across both systems. - 'account.editable' => true, - - // When users set or reset a password, it must have at least this many - // characters. - 'account.minimum-password-length' => 8, - - -// -- Recaptcha ------------------------------------------------------------- // - - // Is Recaptcha enabled? If disabled, captchas will not appear. You should - // enable Recaptcha if your install is public-facing, as it hinders - // brute-force attacks. - 'recaptcha.enabled' => false, - - // Your Recaptcha public key, obtained from Recaptcha. - 'recaptcha.public-key' => null, - - // Your Recaptcha private key, obtained from Recaptcha. - 'recaptcha.private-key' => null, - - -// -- Misc ------------------------------------------------------------------ // - - // This is hashed with other inputs to generate CSRF tokens. If you want, you - // can change it to some other string which is unique to your install. This - // will make your install more secure in a vague, mostly theoretical way. But - // it will take you like 3 seconds of mashing on your keyboard to set it up so - // you might as well. - 'phabricator.csrf-key' => '0b7ec0592e0a2829d8b71df2fa269b2c6172eca3', - - // This is hashed with other inputs to generate mail tokens. If you want, you - // can change it to some other string which is unique to your install. In - // particular, you will want to do this if you accidentally send a bunch of - // mail somewhere you shouldn't have, to invalidate all old reply-to - // addresses. - 'phabricator.mail-key' => '5ce3e7e8787f6e40dfae861da315a5cdf1018f12', - - - // PHP requires that you set a timezone in your php.ini before using date - // functions, or it will emit a warning. If this isn't possible (for instance, - // because you are using HPHP) you can set some valid constant for - // date_default_timezone_set() here and Phabricator will set it on your - // behalf, silencing the warning. - 'phabricator.timezone' => null, - - // Show stack traces when unhandled exceptions occur, force reloading of - // static resources (skipping the cache), show an error callout if a page - // generated PHP errors, warnings, or notices, force disk reads when - // reloading, and generally make development easier. This option should not - // be enabled in production. - 'phabricator.developer-mode' => false, - - // When users write comments which have URIs, they'll be automatically linked - // if the protocol appears in this set. This whitelist is primarily to prevent - // security issues like javascript:// URIs. - 'uri.allowed-protocols' => array( - 'http' => true, - 'https' => true, - ), - - // Tokenizers are UI controls which let the user select other users, email - // addresses, project names, etc., by typing the first few letters and having - // the control autocomplete from a list. They can load their data in two ways: - // either in a big chunk up front, or as the user types. By default, the data - // is loaded in a big chunk. This is simpler and performs better for small - // datasets. However, if you have a very large number of users or projects, - // (in the ballpark of more than a thousand), loading all that data may become - // slow enough that it's worthwhile to query on demand instead. This makes - // the typeahead slightly less responsive but overall performance will be much - // better if you have a ton of stuff. You can figure out which setting is - // best for your install by changing this setting and then playing with a - // user tokenizer (like the user selectors in Maniphest or Differential) and - // seeing which setting loads faster and feels better. - 'tokenizer.ondemand' => false, - - // By default, Phabricator includes some silly nonsense in the UI, such as - // a submit button called "Clowncopterize" in Differential and a call to - // "Leap Into Action". If you'd prefer more traditional UI strings like - // "Submit", you can set this flag to disable most of the jokes and easter - // eggs. - 'phabricator.serious-business' => false, - - // Should Phabricator show beta applications on the homepage - 'phabricator.show-beta-applications' => false, - - // Contains a list of uninstalled applications - 'phabricator.uninstalled-applications' => array(), - - // Allowing non-members to interact with tasks over email. - 'phabricator.allow-email-users' => false, - -// -- Welcome Screen -------------------------------------------------------- // - - // The custom HTML content for the Phabricator welcome screen. - 'welcome.html' => null, - -// -- Files ----------------------------------------------------------------- // - - // Lists which uploaded file types may be viewed in the browser. If a file - // has a mime type which does not appear in this list, it will always be - // downloaded instead of displayed. This is mainly a usability - // consideration, since browsers tend to freak out when viewing enormous - // binary files. - // - // The keys in this array are viewable mime types; the values are the mime - // types they will be delivered as when they are viewed in the browser. - // - // IMPORTANT: Configure 'security.alternate-file-domain' above! Your install - // is NOT safe if it is left unconfigured. - 'files.viewable-mime-types' => array( - 'image/jpeg' => 'image/jpeg', - 'image/jpg' => 'image/jpg', - 'image/png' => 'image/png', - 'image/gif' => 'image/gif', - 'text/plain' => 'text/plain; charset=utf-8', - 'text/x-diff' => 'text/plain; charset=utf-8', - - // ".ico" favicon files, which have mime type diversity. See: - // http://en.wikipedia.org/wiki/ICO_(file_format)#MIME_type - 'image/x-ico' => 'image/x-icon', - 'image/x-icon' => 'image/x-icon', - 'image/vnd.microsoft.icon' => 'image/x-icon', - ), - - // List of mime types which can be used as the source for an tag. - // This should be a subset of 'files.viewable-mime-types' and exclude files - // like text. - 'files.image-mime-types' => array( - 'image/jpeg' => true, - 'image/jpg' => true, - 'image/png' => true, - 'image/gif' => true, - 'image/x-ico' => true, - 'image/x-icon' => true, - 'image/vnd.microsoft.icon' => true, - ), - - // Configuration option for enabling imagemagick - // to resize animated profile pictures (gif) - 'files.enable-imagemagick' => false, - -// -- Storage --------------------------------------------------------------- // - - // Phabricator allows users to upload files, and can keep them in various - // storage engines. This section allows you to configure which engines - // Phabricator will use, and how it will use them. - - // The largest filesize Phabricator will store in the MySQL BLOB storage - // engine, which just uses a database table to store files. While this isn't a - // best practice, it's really easy to set up. Set this to 0 to disable use of - // the MySQL blob engine. - 'storage.mysql-engine.max-size' => 1000000, - - // Phabricator provides a local disk storage engine, which just writes files - // to some directory on local disk. The webserver must have read/write - // permissions on this directory. This is straightforward and suitable for - // most installs, but will not scale past one web frontend unless the path - // is actually an NFS mount, since you'll end up with some of the files - // written to each web frontend and no way for them to share. To use the - // local disk storage engine, specify the path to a directory here. To - // disable it, specify null. - 'storage.local-disk.path' => null, - - // If you want to store files in Amazon S3, specify an AWS access and secret - // key here and a bucket name below. - 'amazon-s3.access-key' => null, - 'amazon-s3.secret-key' => null, - - // To use a custom endpoint, specify it here. Normally, you do not need to - // configure this. - 'amazon-s3.endpoint' => null, - - // Set this to a valid Amazon S3 bucket to store files there. You must also - // configure S3 access keys above. - 'storage.s3.bucket' => null, - - // Phabricator uses a storage engine selector to choose which storage engine - // to use when writing file data. If you add new storage engines or want to - // provide very custom rules (e.g., write images to one storage engine and - // other files to a different one), you can provide an alternate - // implementation here. The default engine will use choose MySQL, Local Disk, - // and S3, in that order, if they have valid configurations above and a file - // fits within configured limits. - 'storage.engine-selector' => 'PhabricatorDefaultFileStorageEngineSelector', - - // Set the size of the largest file a user may upload. This is used to render - // text like "Maximum file size: 10MB" on interfaces where users can upload - // files, and files larger than this size will be rejected. - // - // Specify this limit in bytes, or using a "K", "M", or "G" suffix. - // - // NOTE: Setting this to a large size is NOT sufficient to allow users to - // upload large files. You must also configure a number of other settings. To - // configure file upload limits, consult the article "Configuring File Upload - // Limits" in the documentation. Once you've configured some limit across all - // levels of the server, you can set this limit to an appropriate value and - // the UI will then reflect the actual configured limit. - 'storage.upload-size-limit' => null, - - // Phabricator puts databases in a namespace, which defualts to "phabricator" - // -- for instance, the Differential database is named - // "phabricator_differential" by default. You can change this namespace if you - // want. Normally, you should not do this unless you are developing - // Phabricator and using namespaces to separate multiple sandbox datasets. - 'storage.default-namespace' => 'phabricator', - - -// -- Search ---------------------------------------------------------------- // - - // Phabricator supports Elastic Search; to use it, specify a host like - // 'http://elastic.example.com:9200/' here. - 'search.elastic.host' => null, - - // Phabricator uses a search engine selector to choose which search engine - // to use when indexing and reconstructing documents, and when executing - // queries. You can override the engine selector to provide a new selector - // class which can select some custom engine you implement, if you want to - // store your documents in some search engine which does not have default - // support. - 'search.engine-selector' => 'PhabricatorDefaultSearchEngineSelector', - - -// -- Differential ---------------------------------------------------------- // - - 'differential.revision-custom-detail-renderer' => null, - - // Array for custom remarkup rules. The array should have a list of - // class names of classes that extend PhutilRemarkupRule - 'differential.custom-remarkup-rules' => null, - - // Array for custom remarkup block rules. The array should have a list of - // class names of classes that extend PhutilRemarkupEngineBlockRule - 'differential.custom-remarkup-block-rules' => null, - - // List of file regexps where whitespace is meaningful and should not - // use 'ignore-all' by default - 'differential.whitespace-matters' => array( - '/\.py$/', - '/\.l?hs$/', - ), - - 'differential.field-selector' => 'DifferentialDefaultFieldSelector', - - // Differential can show "Host" and "Path" fields on revisions, with - // information about the machine and working directory where the - // change came from. These fields are disabled by default because they may - // occasionally have sensitive information; you can set this to true to - // enable them. - 'differential.show-host-field' => false, - - // Differential has a required "Test Plan" field by default, which requires - // authors to fill out information about how they verified the correctness of - // their changes when sending code for review. If you'd prefer not to use - // this field, you can disable it here. You can also make it optional - // (instead of required) below. - 'differential.show-test-plan-field' => true, - - // Differential has a required "Test Plan" field by default. You can make it - // optional by setting this to false. You can also completely remove it above, - // if you prefer. - 'differential.require-test-plan-field' => true, - - // If you set this to true, users can "!accept" revisions via email (normally, - // they can take other actions but can not "!accept"). This action is disabled - // by default because email authentication can be configured to be very weak, - // and, socially, email "!accept" is kind of sketchy and implies revisions may - // not actually be receiving thorough review. - 'differential.enable-email-accept' => false, - - // If you set this to true, users won't need to login to view differential - // revisions. Anonymous users will have read-only access and won't be able to - // interact with the revisions. - 'differential.anonymous-access' => false, - - // List of file regexps that should be treated as if they are generated by - // an automatic process, and thus get hidden by default in differential. - 'differential.generated-paths' => array( - // '/config\.h$/', - // '#/autobuilt/#', - ), - - // If you set this to true, users can accept their own revisions. This action - // is disabled by default because it's most likely not a behavior you want, - // but it proves useful if you are working alone on a project and want to make - // use of all of differential's features. - 'differential.allow-self-accept' => false, - - // If you set this to true, any user can close any revision so long as it has - // been accepted. This can be useful depending on your development model. For - // example, github-style pull requests where the reviewer is often the - // actual committer can benefit from turning this option to true. If false, - // only the submitter can close a revision. - 'differential.always-allow-close' => false, - - // If you set this to true, any user can reopen a revision so long as it has - // been closed. This can be useful if a revision is accidentally closed or - // if a developer changes his or her mind after closing a revision. If it is - // false, reopening is not allowed. - 'differential.allow-reopen' => false, - - // Revisions newer than this number of days are marked as fresh in Action - // Required and Revisions Waiting on You views. Only work days (not weekends - // and holidays) are included. Set to 0 to disable this feature. - 'differential.days-fresh' => 1, - - // Similar to 'differential.days-fresh' but marks stale revisions. If the - // revision is even older than it is marked as old. - 'differential.days-stale' => 3, - -// -- Repositories ---------------------------------------------------------- // - - // The default location in which to store local copies of repositories. - // Anything stored in this directory will be assumed to be under the - // control of phabricator, which means that Phabricator will try to do some - // maintenance on working copies if there are problems (such as a change - // to the remote origin url). This maintenance may include completely - // removing (and recloning) anything in this directory. - // - // When set to null, this option is ignored (i.e. Phabricator will not fully - // control any working copies). - 'repository.default-local-path' => null, - -// -- Maniphest ------------------------------------------------------------- // - - // Array of custom fields for Maniphest tasks. For details on adding custom - // fields to Maniphest, see "Maniphest User Guide: Adding Custom Fields". - 'maniphest.custom-fields' => array(), - - // Class which drives custom field construction. See "Maniphest User Guide: - // Adding Custom Fields" in the documentation for more information. - 'maniphest.custom-task-extensions-class' => 'ManiphestDefaultTaskExtensions', - - // What should the default task priority be in create flows? - // See the constants in @{class:ManiphestTaskPriority} for valid values. - // Defaults to "needs triage". - 'maniphest.default-priority' => 90, - -// -- Phame ----------------------------------------------------------------- // - - // Should Phame users have Disqus comment widget, and if so what's the - // website shortname to use? For example, secure.phabricator.org uses - // "phabricator", which we registered with Disqus. If you aren't familiar - // with Disqus, see: - // Disqus quick start guide - http://docs.disqus.com/help/4/ - // Information on shortnames - http://docs.disqus.com/help/68/ - 'disqus.shortname' => null, - - // Directories to look for Phame skins inside of. - 'phame.skins' => array( - 'externals/skins/', - ), - -// -- Remarkup -------------------------------------------------------------- // - - // If you enable this, linked YouTube videos will be embeded inline. This has - // mild security implications (you'll leak referrers to YouTube) and is pretty - // silly (but sort of awesome). - 'remarkup.enable-embedded-youtube' => false, - - -// -- Cache ----------------------------------------------------------------- // - - // Set this to false to disable the use of gzdeflate()-based compression in - // some caches. This may give you less performant (but more debuggable) - // caching. - 'cache.enable-deflate' => true, - -// -- Garbage Collection ---------------------------------------------------- // - - // Phabricator generates various logs and caches in the database which can - // be garbage collected after a while to make the total data size more - // manageable. To run garbage collection, launch a - // PhabricatorGarbageCollector daemon. - - // These 'ttl' keys configure how much old data the GC daemon keeps around. - // Objects older than the ttl will be collected. Set any value to 0 to store - // data indefinitely. - - 'gcdaemon.ttl.herald-transcripts' => 30 * (24 * 60 * 60), - 'gcdaemon.ttl.daemon-logs' => 7 * (24 * 60 * 60), - 'gcdaemon.ttl.differential-parse-cache' => 14 * (24 * 60 * 60), - 'gcdaemon.ttl.markup-cache' => 30 * (24 * 60 * 60), - 'gcdaemon.ttl.task-archive' => 14 * (24 * 60 * 60), - 'gcdaemon.ttl.general-cache' => 30 * (24 * 60 * 60), - - -// -- Feed ------------------------------------------------------------------ // - - // If you set this to true, you can embed Phabricator activity feeds in other - // pages using iframes. These feeds are completely public, and a login is not - // required to view them! This is intended for things like open source - // projects that want to expose an activity feed on the project homepage. - // - // NOTE: You must also set `policy.allow-public` to true for this setting - // to work properly. - 'feed.public' => false, - - // If you set this to a list of http URIs, when a feed story is published a - // task will be created for each uri that posts the story data to the uri. - // Daemons automagically retry failures 100 times, waiting $fail_count * 60s - // between each subsequent failure. Be sure to keep the daemon console - // (/daemon/) open while developing and testing your end points. - // - // NOTE: URIs are not validated, the URI must return http status 200 within - // 30 seconds, and no permission checks are performed. - 'feed.http-hooks' => array(), - -// -- Drydock --------------------------------------------------------------- // - - // If you want to use Drydock's builtin EC2 Blueprints, configure your AWS - // EC2 credentials here. - 'amazon-ec2.access-key' => null, - 'amazon-ec2.secret-key' => null, - - -// -- Customization --------------------------------------------------------- // - - // Paths to additional phutil libraries to load. - 'load-libraries' => array(), - - 'aphront.default-application-configuration-class' => - 'AphrontDefaultApplicationConfiguration', - - // Directory that phd (the Phabricator daemon control script) should use to - // track running daemons. - 'phd.pid-directory' => '/var/tmp/phd/pid', - - // Directory that the Phabricator daemons should use to store the log file - 'phd.log-directory' => '/var/tmp/phd/log', - - // Number of "TaskMaster" daemons that "phd start" should start. You can - // raise this if you have a task backlog, or explicitly launch more with - // "phd launch taskmaster". - 'phd.start-taskmasters' => 4, - - // Launch daemons in "verbose" mode by default. This creates a lot of output, - // but can help debug issues. Daemons launched in debug mode with "phd debug" - // are always launched in verbose mode. See also 'phd.trace'. - 'phd.verbose' => false, - - // Launch daemons in "trace" mode by default. This creates an ENORMOUS amount - // of output, but can help debug issues. Daemons launched in debug mode with - // "phd debug" are always launched in trace mdoe. See also 'phd.verbose'. - 'phd.trace' => false, - - // Path to custom celerity resource map relative to 'phabricator/src'. - // See also `scripts/celerity_mapper.php`. - 'celerity.resource-path' => '__celerity_resource_map__.php', - - // This value is an input to the hash function when building resource hashes. - // It has no security value, but if you accidentally poison user caches (by - // pushing a bad patch or having something go wrong with a CDN, e.g.) you can - // change this to something else and rebuild the Celerity map to break user - // caches. Unless you are doing Celerity development, it is exceptionally - // unlikely that you need to modify this. - 'celerity.resource-hash' => 'd9455ea150622ee044f7931dabfa52aa', - - // Minify static resources by removing whitespace and comments. You should - // enable this in production, but disable it in development. - 'celerity.minify' => false, - - // You can respond to various application events by installing listeners, - // which will receive callbacks when interesting things occur. Specify a list - // of classes which extend PhabricatorEventListener here. - 'events.listeners' => array(), - -// -- Syntax Highlighting --------------------------------------------------- // - - // Phabricator can highlight PHP by default and use Pygments for other - // languages if enabled. You can provide a custom highlighter engine by - // extending class PhutilSyntaxHighlighterEngine. - 'syntax-highlighter.engine' => 'PhutilDefaultSyntaxHighlighterEngine', - - // If you want syntax highlighting for other languages than PHP then you can - // install the python package 'Pygments', make sure the 'pygmentize' script is - // available in the $PATH of the webserver, and then enable this. - 'pygments.enabled' => false, - - // In places that we display a dropdown to syntax-highlight code, - // this is where that list is defined. - // Syntax is 'lexer-name' => 'Display Name', - 'pygments.dropdown-choices' => array( - 'apacheconf' => 'Apache Configuration', - 'bash' => 'Bash Scripting', - 'brainfuck' => 'Brainf*ck', - 'c' => 'C', - 'cpp' => 'C++', - 'css' => 'CSS', - 'd' => 'D', - 'diff' => 'Diff', - 'django' => 'Django Templating', - 'erb' => 'Embedded Ruby/ERB', - 'erlang' => 'Erlang', - 'haskell' => 'Haskell', - 'html' => 'HTML', - 'java' => 'Java', - 'js' => 'Javascript', - 'mysql' => 'MySQL', - 'objc' => 'Objective-C', - 'perl' => 'Perl', - 'php' => 'PHP', - 'rest' => 'reStructuredText', - 'text' => 'Plain Text', - 'python' => 'Python', - 'rainbow' => 'Rainbow', - 'remarkup' => 'Remarkup', - 'ruby' => 'Ruby', - 'xml' => 'XML', - ), - - // This is an override list of regular expressions which allows you to choose - // what language files are highlighted as. If your projects have certain rules - // about filenames or use unusual or ambiguous language extensions, you can - // create a mapping here. This is an ordered dictionary of regular expressions - // which will be tested against the filename. They should map to either an - // explicit language as a string value, or a numeric index into the captured - // groups as an integer. - 'syntax.filemap' => array( - // Example: Treat all '*.xyz' files as PHP. - // '@\\.xyz$@' => 'php', - - // Example: Treat 'httpd.conf' as 'apacheconf'. - // '@/httpd\\.conf$@' => 'apacheconf', - - // Example: Treat all '*.x.bak' file as '.x'. NOTE: we map to capturing - // group 1 by specifying the mapping as "1". - // '@\\.([^.]+)\\.bak$@' => 1, - - '@\.arcconfig$@' => 'js', - '@\.divinerconfig$@' => 'js', - ), - - // Set the default monospaced font style for users who haven't set a custom - // style. - 'style.monospace' => '10px "Menlo", "Consolas", "Monaco", monospace', - 'style.monospace.windows' => '11px "Menlo", "Consolas", "Monaco", monospace', - - -// -- Debugging ------------------------------------------------------------- // - - // Enable this to change HTTP redirects into normal pages with a link to the - // redirection target. For example, after you submit a form you'll get a page - // saying "normally, you'd be redirected...". This is useful to examine - // service or profiler information on write pathways, or debug redirects. It - // also makes the UX horrible for normal use, so you should enable it only - // when debugging. - // - // NOTE: This does not currently work for forms with Javascript "workflow", - // since the redirect happens in Javascript. - 'debug.stop-on-redirect' => false, - - // Set the rate for how often to do sampled profiling. On average, one - // request for every number of requests specified here will be sampled. - // Set this value to 0 to completely disable profiling. In a production - // environment, this value should either be set to 0 (to disable) or to - // a large number (to sample only a few requests). - 'debug.profile-rate' => 0, - -// -- Environment ---------------------------------------------------------- // - - // Phabricator occasionally shells out to other binaries on the server. - // An example of this is the "pygmentize" command, used to syntax-highlight - // code written in languages other than PHP. By default, it is assumed that - // these binaries are in the $PATH of the user running Phabricator (normally - // 'apache', 'httpd', or 'nobody'). Here you can add extra directories to - // the $PATH environment variable, for when these binaries are in non-standard - // locations. - 'environment.append-paths' => array(), - -// -- Audit ---------------------------------------------------------- // - - // Controls whether or not task creator can Close Audits - 'audit.can-author-close-audit' => false, -); diff --git a/conf/development.conf.php b/conf/development.conf.php deleted file mode 100644 index 704011402c..0000000000 --- a/conf/development.conf.php +++ /dev/null @@ -1,8 +0,0 @@ - true, - 'darkconsole.enabled' => true, - -) + phabricator_read_config_file('default'); diff --git a/conf/keys/.keep b/conf/keys/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/conf/production.conf.php b/conf/production.conf.php deleted file mode 100644 index e9a474ee11..0000000000 --- a/conf/production.conf.php +++ /dev/null @@ -1,6 +0,0 @@ -__accessKey; } - public function getSecretKey() { return $this->__secretKey; } - public function getHost() { return $this->__host; } - - protected $__verifyHost = 1; - protected $__verifyPeer = 1; - - // verifyHost and verifyPeer determine whether curl verifies ssl certificates. - // It may be necessary to disable these checks on certain systems. - // These only have an effect if SSL is enabled. - public function verifyHost() { return $this->__verifyHost; } - public function enableVerifyHost($enable = true) { $this->__verifyHost = $enable; } - - public function verifyPeer() { return $this->__verifyPeer; } - public function enableVerifyPeer($enable = true) { $this->__verifyPeer = $enable; } - - // If you use exceptions, errors will be communicated by throwing a - // SimpleEmailServiceException. By default, they will be trigger_error()'d. - protected $__useExceptions = 0; - public function useExceptions() { return $this->__useExceptions; } - public function enableUseExceptions($enable = true) { $this->__useExceptions = $enable; } - - /** - * Constructor - * - * @param string $accessKey Access key - * @param string $secretKey Secret key - * @return void - */ - public function __construct($accessKey = null, $secretKey = null, $host = 'email.us-east-1.amazonaws.com') { - if ($accessKey !== null && $secretKey !== null) { - $this->setAuth($accessKey, $secretKey); - } - $this->__host = $host; - } - - /** - * Set AWS access key and secret key - * - * @param string $accessKey Access key - * @param string $secretKey Secret key - * @return void - */ - public function setAuth($accessKey, $secretKey) { - $this->__accessKey = $accessKey; - $this->__secretKey = $secretKey; - } - - /** - * Lists the email addresses that have been verified and can be used as the 'From' address - * - * @return An array containing two items: a list of verified email addresses, and the request id. - */ - public function listVerifiedEmailAddresses() { - $rest = new SimpleEmailServiceRequest($this, 'GET'); - $rest->setParameter('Action', 'ListVerifiedEmailAddresses'); - - $rest = $rest->getResponse(); - if($rest->error === false && $rest->code !== 200) { - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - } - if($rest->error !== false) { - $this->__triggerError('listVerifiedEmailAddresses', $rest->error); - return false; - } - - $response = array(); - if(!isset($rest->body)) { - return $response; - } - - $addresses = array(); - foreach($rest->body->ListVerifiedEmailAddressesResult->VerifiedEmailAddresses->member as $address) { - $addresses[] = (string)$address; - } - - $response['Addresses'] = $addresses; - $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId; - - return $response; - } - - /** - * Requests verification of the provided email address, so it can be used - * as the 'From' address when sending emails through SimpleEmailService. - * - * After submitting this request, you should receive a verification email - * from Amazon at the specified address containing instructions to follow. - * - * @param string email The email address to get verified - * @return The request id for this request. - */ - public function verifyEmailAddress($email) { - $rest = new SimpleEmailServiceRequest($this, 'POST'); - $rest->setParameter('Action', 'VerifyEmailAddress'); - $rest->setParameter('EmailAddress', $email); - - $rest = $rest->getResponse(); - if($rest->error === false && $rest->code !== 200) { - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - } - if($rest->error !== false) { - $this->__triggerError('verifyEmailAddress', $rest->error); - return false; - } - - $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId; - return $response; - } - - /** - * Removes the specified email address from the list of verified addresses. - * - * @param string email The email address to remove - * @return The request id for this request. - */ - public function deleteVerifiedEmailAddress($email) { - $rest = new SimpleEmailServiceRequest($this, 'DELETE'); - $rest->setParameter('Action', 'DeleteVerifiedEmailAddress'); - $rest->setParameter('EmailAddress', $email); - - $rest = $rest->getResponse(); - if($rest->error === false && $rest->code !== 200) { - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - } - if($rest->error !== false) { - $this->__triggerError('deleteVerifiedEmailAddress', $rest->error); - return false; - } - - $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId; - return $response; - } - - /** - * Retrieves information on the current activity limits for this account. - * See http://docs.amazonwebservices.com/ses/latest/APIReference/API_GetSendQuota.html - * - * @return An array containing information on this account's activity limits. - */ - public function getSendQuota() { - $rest = new SimpleEmailServiceRequest($this, 'GET'); - $rest->setParameter('Action', 'GetSendQuota'); - - $rest = $rest->getResponse(); - if($rest->error === false && $rest->code !== 200) { - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - } - if($rest->error !== false) { - $this->__triggerError('getSendQuota', $rest->error); - return false; - } - - $response = array(); - if(!isset($rest->body)) { - return $response; - } - - $response['Max24HourSend'] = (string)$rest->body->GetSendQuotaResult->Max24HourSend; - $response['MaxSendRate'] = (string)$rest->body->GetSendQuotaResult->MaxSendRate; - $response['SentLast24Hours'] = (string)$rest->body->GetSendQuotaResult->SentLast24Hours; - $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId; - - return $response; - } - - /** - * Retrieves statistics for the last two weeks of activity on this account. - * See http://docs.amazonwebservices.com/ses/latest/APIReference/API_GetSendStatistics.html - * - * @return An array of activity statistics. Each array item covers a 15-minute period. - */ - public function getSendStatistics() { - $rest = new SimpleEmailServiceRequest($this, 'GET'); - $rest->setParameter('Action', 'GetSendStatistics'); - - $rest = $rest->getResponse(); - if($rest->error === false && $rest->code !== 200) { - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - } - if($rest->error !== false) { - $this->__triggerError('getSendStatistics', $rest->error); - return false; - } - - $response = array(); - if(!isset($rest->body)) { - return $response; - } - - $datapoints = array(); - foreach($rest->body->GetSendStatisticsResult->SendDataPoints->member as $datapoint) { - $p = array(); - $p['Bounces'] = (string)$datapoint->Bounces; - $p['Complaints'] = (string)$datapoint->Complaints; - $p['DeliveryAttempts'] = (string)$datapoint->DeliveryAttempts; - $p['Rejects'] = (string)$datapoint->Rejects; - $p['Timestamp'] = (string)$datapoint->Timestamp; - - $datapoints[] = $p; - } - - $response['SendDataPoints'] = $datapoints; - $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId; - - return $response; - } - - - public function sendRawEmail($raw) { - $rest = new SimpleEmailServiceRequest($this, 'POST'); - $rest->setParameter('Action', 'SendRawEmail'); - $rest->setParameter('RawMessage.Data', base64_encode($raw)); - - $rest = $rest->getResponse(); - if($rest->error === false && $rest->code !== 200) { - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - } - if($rest->error !== false) { - $this->__triggerError('sendRawEmail', $rest->error); - return false; - } - - $response['MessageId'] = (string)$rest->body->SendEmailResult->MessageId; - $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId; - return $response; - } - - /** - * Given a SimpleEmailServiceMessage object, submits the message to the service for sending. - * - * @return An array containing the unique identifier for this message and a separate request id. - * Returns false if the provided message is missing any required fields. - */ - public function sendEmail($sesMessage) { - if(!$sesMessage->validate()) { - return false; - } - - $rest = new SimpleEmailServiceRequest($this, 'POST'); - $rest->setParameter('Action', 'SendEmail'); - - $i = 1; - foreach($sesMessage->to as $to) { - $rest->setParameter('Destination.ToAddresses.member.'.$i, $to); - $i++; - } - - if(is_array($sesMessage->cc)) { - $i = 1; - foreach($sesMessage->cc as $cc) { - $rest->setParameter('Destination.CcAddresses.member.'.$i, $cc); - $i++; - } - } - - if(is_array($sesMessage->bcc)) { - $i = 1; - foreach($sesMessage->bcc as $bcc) { - $rest->setParameter('Destination.BccAddresses.member.'.$i, $bcc); - $i++; - } - } - - if(is_array($sesMessage->replyto)) { - $i = 1; - foreach($sesMessage->replyto as $replyto) { - $rest->setParameter('ReplyToAddresses.member.'.$i, $replyto); - $i++; - } - } - - $rest->setParameter('Source', $sesMessage->from); - - if($sesMessage->returnpath != null) { - $rest->setParameter('ReturnPath', $sesMessage->returnpath); - } - - if($sesMessage->subject != null && strlen($sesMessage->subject) > 0) { - $rest->setParameter('Message.Subject.Data', $sesMessage->subject); - if($sesMessage->subjectCharset != null && strlen($sesMessage->subjectCharset) > 0) { - $rest->setParameter('Message.Subject.Charset', $sesMessage->subjectCharset); - } - } - - - if($sesMessage->messagetext != null && strlen($sesMessage->messagetext) > 0) { - $rest->setParameter('Message.Body.Text.Data', $sesMessage->messagetext); - if($sesMessage->messageTextCharset != null && strlen($sesMessage->messageTextCharset) > 0) { - $rest->setParameter('Message.Body.Text.Charset', $sesMessage->messageTextCharset); - } - } - - if($sesMessage->messagehtml != null && strlen($sesMessage->messagehtml) > 0) { - $rest->setParameter('Message.Body.Html.Data', $sesMessage->messagehtml); - if($sesMessage->messageHtmlCharset != null && strlen($sesMessage->messageHtmlCharset) > 0) { - $rest->setParameter('Message.Body.Html.Charset', $sesMessage->messageHtmlCharset); - } - } - - $rest = $rest->getResponse(); - if($rest->error === false && $rest->code !== 200) { - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - } - if($rest->error !== false) { - $this->__triggerError('sendEmail', $rest->error); - return false; - } - - $response['MessageId'] = (string)$rest->body->SendEmailResult->MessageId; - $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId; - return $response; - } - - /** - * Trigger an error message - * - * @internal Used by member functions to output errors - * @param array $error Array containing error information - * @return string - */ - public function __triggerError($functionname, $error) - { - if($error == false) { - $message = sprintf("SimpleEmailService::%s(): Encountered an error, but no description given", $functionname); - } - else if(isset($error['curl']) && $error['curl']) - { - $message = sprintf("SimpleEmailService::%s(): %s %s", $functionname, $error['code'], $error['message']); - } - else if(isset($error['Error'])) - { - $e = $error['Error']; - $message = sprintf("SimpleEmailService::%s(): %s - %s: %s\nRequest Id: %s\n", $functionname, $e['Type'], $e['Code'], $e['Message'], $error['RequestId']); - } - - if ($this->useExceptions()) { - throw new SimpleEmailServiceException($message); - } else { - trigger_error($message, E_USER_WARNING); - } - } - - /** - * Callback handler for 503 retries. - * - * @internal Used by SimpleDBRequest to call the user-specified callback, if set - * @param $attempt The number of failed attempts so far - * @return The retry delay in microseconds, or 0 to stop retrying. - */ - public function __executeServiceTemporarilyUnavailableRetryDelay($attempt) - { - if(is_callable($this->__serviceUnavailableRetryDelayCallback)) { - $callback = $this->__serviceUnavailableRetryDelayCallback; - return $callback($attempt); - } - return 0; - } -} - -final class SimpleEmailServiceRequest -{ - private $ses, $verb, $parameters = array(); - public $response; - - /** - * Constructor - * - * @param string $ses The SimpleEmailService object making this request - * @param string $action action - * @param string $verb HTTP verb - * @return mixed - */ - function __construct($ses, $verb) { - $this->ses = $ses; - $this->verb = $verb; - $this->response = new STDClass; - $this->response->error = false; - } - - /** - * Set request parameter - * - * @param string $key Key - * @param string $value Value - * @param boolean $replace Whether to replace the key if it already exists (default true) - * @return void - */ - public function setParameter($key, $value, $replace = true) { - if(!$replace && isset($this->parameters[$key])) - { - $temp = (array)($this->parameters[$key]); - $temp[] = $value; - $this->parameters[$key] = $temp; - } - else - { - $this->parameters[$key] = $value; - } - } - - /** - * Get the response - * - * @return object | false - */ - public function getResponse() { - - $params = array(); - foreach ($this->parameters as $var => $value) - { - if(is_array($value)) - { - foreach($value as $v) - { - $params[] = $var.'='.$this->__customUrlEncode($v); - } - } - else - { - $params[] = $var.'='.$this->__customUrlEncode($value); - } - } - - sort($params, SORT_STRING); - - // must be in format 'Sun, 06 Nov 1994 08:49:37 GMT' - $date = gmdate('D, d M Y H:i:s e'); - - $query = implode('&', $params); - - $headers = array(); - $headers[] = 'Date: '.$date; - $headers[] = 'Host: '.$this->ses->getHost(); - - $auth = 'AWS3-HTTPS AWSAccessKeyId='.$this->ses->getAccessKey(); - $auth .= ',Algorithm=HmacSHA256,Signature='.$this->__getSignature($date); - $headers[] = 'X-Amzn-Authorization: '.$auth; - - $url = 'https://'.$this->ses->getHost().'/'; - - // Basic setup - $curl = curl_init(); - curl_setopt($curl, CURLOPT_USERAGENT, 'SimpleEmailService/php'); - - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, ($this->ses->verifyHost() ? 2 : 0)); - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, ($this->ses->verifyPeer() ? 1 : 0)); - - // Request types - switch ($this->verb) { - case 'GET': - $url .= '?'.$query; - break; - case 'POST': - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->verb); - curl_setopt($curl, CURLOPT_POSTFIELDS, $query); - $headers[] = 'Content-Type: application/x-www-form-urlencoded'; - break; - case 'DELETE': - $url .= '?'.$query; - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE'); - break; - default: break; - } - curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - curl_setopt($curl, CURLOPT_HEADER, false); - - curl_setopt($curl, CURLOPT_URL, $url); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, false); - curl_setopt($curl, CURLOPT_WRITEFUNCTION, array(&$this, '__responseWriteCallback')); - curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); - - // Execute, grab errors - if (curl_exec($curl)) { - $this->response->code = curl_getinfo($curl, CURLINFO_HTTP_CODE); - } else { - $this->response->error = array( - 'curl' => true, - 'code' => curl_errno($curl), - 'message' => curl_error($curl), - 'resource' => $this->resource - ); - } - - @curl_close($curl); - - // Parse body into XML - if ($this->response->error === false && isset($this->response->body)) { - $this->response->body = simplexml_load_string($this->response->body); - - // Grab SES errors - if (!in_array($this->response->code, array(200, 201, 202, 204)) - && isset($this->response->body->Error)) { - $error = $this->response->body->Error; - $output = array(); - $output['curl'] = false; - $output['Error'] = array(); - $output['Error']['Type'] = (string)$error->Type; - $output['Error']['Code'] = (string)$error->Code; - $output['Error']['Message'] = (string)$error->Message; - $output['RequestId'] = (string)$this->response->body->RequestId; - - $this->response->error = $output; - unset($this->response->body); - } - } - - return $this->response; - } - - /** - * CURL write callback - * - * @param resource &$curl CURL resource - * @param string &$data Data - * @return integer - */ - private function __responseWriteCallback(&$curl, &$data) { - $this->response->body .= $data; - return strlen($data); - } - - /** - * Contributed by afx114 - * URL encode the parameters as per http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?Query_QueryAuth.html - * PHP's rawurlencode() follows RFC 1738, not RFC 3986 as required by Amazon. The only difference is the tilde (~), so convert it back after rawurlencode - * See: http://www.morganney.com/blog/API/AWS-Product-Advertising-API-Requires-a-Signed-Request.php - * - * @param string $var String to encode - * @return string - */ - private function __customUrlEncode($var) { - return str_replace('%7E', '~', rawurlencode($var)); - } - - /** - * Generate the auth string using Hmac-SHA256 - * - * @internal Used by SimpleDBRequest::getResponse() - * @param string $string String to sign - * @return string - */ - private function __getSignature($string) { - return base64_encode(hash_hmac('sha256', $string, $this->ses->getSecretKey(), true)); - } -} - - -final class SimpleEmailServiceMessage { - - // these are public for convenience only - // these are not to be used outside of the SimpleEmailService class! - public $to, $cc, $bcc, $replyto; - public $from, $returnpath; - public $subject, $messagetext, $messagehtml; - public $subjectCharset, $messageTextCharset, $messageHtmlCharset; - - function __construct() { - $to = array(); - $cc = array(); - $bcc = array(); - $replyto = array(); - - $from = null; - $returnpath = null; - - $subject = null; - $messagetext = null; - $messagehtml = null; - - $subjectCharset = null; - $messageTextCharset = null; - $messageHtmlCharset = null; - } - - - /** - * addTo, addCC, addBCC, and addReplyTo have the following behavior: - * If a single address is passed, it is appended to the current list of addresses. - * If an array of addresses is passed, that array is merged into the current list. - */ - function addTo($to) { - if(!is_array($to)) { - $this->to[] = $to; - } - else { - $this->to = array_merge($this->to, $to); - } - } - - function addCC($cc) { - if(!is_array($cc)) { - $this->cc[] = $cc; - } - else { - $this->cc = array_merge($this->cc, $cc); - } - } - - function addBCC($bcc) { - if(!is_array($bcc)) { - $this->bcc[] = $bcc; - } - else { - $this->bcc = array_merge($this->bcc, $bcc); - } - } - - function addReplyTo($replyto) { - if(!is_array($replyto)) { - $this->replyto[] = $replyto; - } - else { - $this->replyto = array_merge($this->replyto, $replyto); - } - } - - function setFrom($from) { - $this->from = $from; - } - - function setReturnPath($returnpath) { - $this->returnpath = $returnpath; - } - - function setSubject($subject) { - $this->subject = $subject; - } - - function setSubjectCharset($charset) { - $this->subjectCharset = $charset; - } - - function setMessageFromString($text, $html = null) { - $this->messagetext = $text; - $this->messagehtml = $html; - } - - function setMessageFromFile($textfile, $htmlfile = null) { - if(file_exists($textfile) && is_file($textfile) && is_readable($textfile)) { - $this->messagetext = file_get_contents($textfile); - } - if(file_exists($htmlfile) && is_file($htmlfile) && is_readable($htmlfile)) { - $this->messagehtml = file_get_contents($htmlfile); - } - } - - function setMessageFromURL($texturl, $htmlurl = null) { - $this->messagetext = file_get_contents($texturl); - if($htmlurl !== null) { - $this->messagehtml = file_get_contents($htmlurl); - } - } - - function setMessageCharset($textCharset, $htmlCharset = null) { - $this->messageTextCharset = $textCharset; - $this->messageHtmlCharset = $htmlCharset; - } - - /** - * Validates whether the message object has sufficient information to submit a request to SES. - * This does not guarantee the message will arrive, nor that the request will succeed; - * instead, it makes sure that no required fields are missing. - * - * This is used internally before attempting a SendEmail or SendRawEmail request, - * but it can be used outside of this file if verification is desired. - * May be useful if e.g. the data is being populated from a form; developers can generally - * use this function to verify completeness instead of writing custom logic. - * - * @return boolean - */ - public function validate() { - if(count($this->to) == 0) - return false; - if($this->from == null || strlen($this->from) == 0) - return false; - if($this->messagetext == null) - return false; - return true; - } -} - - -/** - * Thrown by SimpleEmailService when errors occur if you call - * enableUseExceptions(true). - */ -final class SimpleEmailServiceException extends Exception { - -} \ No newline at end of file diff --git a/externals/balanced-php/.gitignore b/externals/balanced-php/.gitignore deleted file mode 100644 index dc4e206783..0000000000 --- a/externals/balanced-php/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -# composer -.buildpath -composer.lock -composer.phar -vendor -*~ -*# -# phar -*.phar - -# eclipse-pdt -.settings -.project -*.iml diff --git a/externals/balanced-php/.travis.yml b/externals/balanced-php/.travis.yml deleted file mode 100644 index 9448540876..0000000000 --- a/externals/balanced-php/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: php -before_script: - - curl -s http://getcomposer.org/installer | php - - php composer.phar install -script: phpunit --bootstrap vendor/autoload.php --exclude-group suite tests/ -php: - - 5.3 - - 5.4 diff --git a/externals/balanced-php/LICENSE b/externals/balanced-php/LICENSE deleted file mode 100644 index 5e0cd0dff2..0000000000 --- a/externals/balanced-php/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2012 Balanced - -MIT License - -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. \ No newline at end of file diff --git a/externals/balanced-php/README.md b/externals/balanced-php/README.md deleted file mode 100644 index 8da0373331..0000000000 --- a/externals/balanced-php/README.md +++ /dev/null @@ -1,156 +0,0 @@ -# Balanced - -Online Marketplace Payments - -[![Build Status](https://secure.travis-ci.org/balanced/balanced-php.png)](http://travis-ci.org/balanced/balanced-php) - -The design of this library was heavily influenced by [Httpful](https://github.com/nategood/httpful). - -## Requirements - -- [PHP](http://www.php.net) >= 5.3 **with** [cURL](http://www.php.net/manual/en/curl.installation.php) -- [RESTful](https://github.com/bninja/restful) >= 0.1 -- [Httpful](https://github.com/nategood/httpful) >= 0.1 - -## Issues - -Please use appropriately tagged github [issues](https://github.com/balanced/balanced-php/issues) to request features or report bugs. - -## Installation - -You can install using [composer](#composer), a [phar](#phar) package or from [source](#source). Note that Balanced is [PSR-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md) compliant: - -### Composer - -If you don't have Composer [install](http://getcomposer.org/doc/00-intro.md#installation) it: - - $ curl -s https://getcomposer.org/installer | php - -Add this to your `composer.json`: - - { - "require": { - "balanced/balanced": "*" - } - } - -Refresh your dependencies: - - $ php composer.phar update - - -Then make sure to `require` the autoloader and initialize all: - - composer.json - - php composer.phar install - - curl https://raw.github.com/balanced/balanced-php/master/example/example.php > example.php - - php example.php - - curl https://raw.github.com/balanced/balanced-php/master/example/buyer-example.php > buyer-example.php - - php -S 127.0.0.1:9321 buyer-example.php - # now open a browser and go to http://127.0.0.1:9321/ to view how to tokenize cards and add to a buyer - -## Usage - -See https://www.balancedpayments.com/docs/overview?language=php for tutorials and documentation. - -## Testing - - $ phpunit --bootstrap vendor/autoload.php tests/ - -Or if you'd like to skip network calls: - - $ phpunit --exclude-group suite --bootstrap vendor/autoload.php tests/ - -## Publishing - -1. Ensure that **all** [tests](#testing) pass -2. Increment minor `VERSION` in `src/Balanced/Settings` and `composer.json` (`git commit -am 'v{VERSION} release'`) -3. Tag it (`git tag -a v{VERSION} -m 'v{VERSION} release'`) -4. Push the tag (`git push --tag`) -5. [Packagist](http://packagist.org/packages/balanced/balanced) will see the new tag and take it from there -6. Build (`build-phar`) and upload a [phar](http://php.net/manual/en/book.phar.php) file - -## Contributing - -1. Fork it -2. Create your feature branch (`git checkout -b my-new-feature`) -3. Write your code **and [tests](#testing)** -4. Ensure all tests still pass (`phpunit --bootstrap vendor/autoload.php tests/`) -5. Commit your changes (`git commit -am 'Add some feature'`) -6. Push to the branch (`git push origin my-new-feature`) -7. Create new pull request - -## Contributors - -* [Jacob Rus](https://github.com/jrus) -* [Leon Smith](https://github.com/leonsmith) -* [Matt Drollette](https://github.com/MDrollette) -* [You](https://github.com/balanced/balanced-php/issues)! diff --git a/externals/balanced-php/bootstrap.php b/externals/balanced-php/bootstrap.php deleted file mode 100644 index cb127980a2..0000000000 --- a/externals/balanced-php/bootstrap.php +++ /dev/null @@ -1,4 +0,0 @@ -setStub($stub); -exit_unless($phar, "Unable to create a phar. Make sure you have phar.readonly=0 set in your ini file."); -$phar->buildFromDirectory(dirname($source_dir)); -echo "[ OK ]\n"; - -echo "Renaming Phar... "; -$phar_versioned_name = 'balanced-' . \Balanced\Settings::VERSION . '.phar'; -$phar_versioned_path = $base_dir . '/' . $phar_versioned_name; -rename($phar_path, $phar_versioned_path); -echo "[ OK ]\n"; \ No newline at end of file diff --git a/externals/balanced-php/composer.json b/externals/balanced-php/composer.json deleted file mode 100644 index 9cb9660b3b..0000000000 --- a/externals/balanced-php/composer.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "balanced/balanced", - "description": "Client for Balanced API", - "homepage": "http://github.com/balanced/balanced-php", - "license": "MIT", - "keywords": ["payments", "api"], - "version": "0.7.1", - "authors": [ - { - "name": "Balanced", - "email": "dev@balancedpayments.com", - "homepage": "http://www.balancedpayments.com/" - } - ], - "require": { - "nategood/httpful": "*", - "bninja/restful": "*" - }, - "autoload": { - "psr-0": { - "Balanced": "src/" - } - } -} diff --git a/externals/balanced-php/example/bank-account-debits.php b/externals/balanced-php/example/bank-account-debits.php deleted file mode 100644 index 0149e58d23..0000000000 --- a/externals/balanced-php/example/bank-account-debits.php +++ /dev/null @@ -1,54 +0,0 @@ -save(); -Balanced\Settings::$api_key = $key->secret; -$marketplace = new Balanced\Marketplace(); -$marketplace->save(); - -// create a bank account -$bank_account = $marketplace->createBankAccount("Jack Q Merchant", - "123123123", - "123123123" -); -$buyer = $marketplace->createAccount("buyer@example.org"); -$buyer->addBankAccount($bank_account); - -print("you can't debit from a bank account until you verify it\n"); -try { - $buyer->debit(100); -} catch (Exception $e) { - printf("Debit failed, %s\n", $e->getMessage()); -} - -// authenticate -$verification = $bank_account->verify(); - -try { - $verification->confirm(1, 2); -} catch (Balanced\Errors\BankAccountVerificationFailure $e) { - printf('Authentication error , %s\n', $e->getMessage()); - print("PROTIP: for TEST bank accounts the valid amount is always 1 and 1\n"); - -} - -$verification->confirm(1, 1); - -$debit = $buyer->debit(100); -printf("debited the bank account %s for %d cents\n", - $debit->source->uri, - $debit->amount -); -print("and there you have it"); - -?> diff --git a/externals/balanced-php/example/buyer-example.php b/externals/balanced-php/example/buyer-example.php deleted file mode 100644 index 20b38ef5ca..0000000000 --- a/externals/balanced-php/example/buyer-example.php +++ /dev/null @@ -1,157 +0,0 @@ -uri; - return; - } catch (Balanced\Errors\Error $e) { - echo $e->getMessage(); - return; - } - } -} - -function create_buyer($email_address, $card_uri) { - $marketplace = Balanced\Marketplace::mine(); - try { - # new buyer - $buyer = $marketplace->createBuyer( - $email_address, - $card_uri); - } - catch (Balanced\Errors\DuplicateAccountEmailAddress $e) { - # oops, account for $email_address already exists so just add the card - $buyer = Balanced\Account::get($e->extras->account_uri); - $buyer->addCard($card_uri); - } - return $buyer; -} - -?> - - - - - - -

Balanced Sample - Collect Credit Card Information

-
-
-
-
- - -
-
- - -
-
- - / -
-
- - -
- -
-
-
-
- - - - - diff --git a/externals/balanced-php/example/composer.json b/externals/balanced-php/example/composer.json deleted file mode 100644 index 58b9453ab1..0000000000 --- a/externals/balanced-php/example/composer.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "require": { - "balanced/balanced": "*" - } -} diff --git a/externals/balanced-php/example/debit-example.php b/externals/balanced-php/example/debit-example.php deleted file mode 100644 index e8993e11a5..0000000000 --- a/externals/balanced-php/example/debit-example.php +++ /dev/null @@ -1,42 +0,0 @@ -cards->create(array( - "card_number" => "5105105105105100", - "expiration_month" => "12", - "expiration_year" => "2015" -)); -print "our card: " . $card->uri . "\n"; - -print "create a **buyer** account with that card\n"; -$buyer = $marketplace->createBuyer(null, $card->uri); -print "our buyer account: " . $buyer->uri . "\n"; - -print "debit our buyer, let's say $15\n"; -try { - $debit = $buyer->debit(1500); - print "our buyer debit: " . $debit->uri . "\n"; -} -catch (Balanced\Errors\Declined $e) { - print "oh no, the processor declined the debit!\n"; -} -catch (Balanced\Errors\NoFundingSource $e) { - print "oh no, the buyer has not active funding sources!\n"; -} -catch (Balanced\Errors\CannotDebit $e) { - print "oh no, the buyer has no debitable funding sources!\n"; -} - -print "and there you have it 8)\n"; - -?> \ No newline at end of file diff --git a/externals/balanced-php/example/events-and-callbacks.php b/externals/balanced-php/example/events-and-callbacks.php deleted file mode 100644 index 9127c53f41..0000000000 --- a/externals/balanced-php/example/events-and-callbacks.php +++ /dev/null @@ -1,59 +0,0 @@ -save(); -Balanced\Settings::$api_key = $key->secret; -$marketplace = new Balanced\Marketplace(); -$marketplace->save(); - -// let"s create a requestb.in -$ch = curl_init("http://requestb.in/api/v1/bins"); -curl_setopt($ch, CURLOPT_POST, true); -curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); -curl_setopt($ch, CURLOPT_HTTPHEADER, array( - 'Content-Type: application/json', - 'Content-Length: ' . 0) -); -$result = json_decode(curl_exec($ch)); -$bin_name = $result->name; -$callback_url = "http://requestb.in/" . $bin_name; -$requests_url = "http://requestb.in/api/v1/bins/" . $bin_name . "/requests"; - -printf("let's create a callback\n"); -$marketplace->createCallback($callback_url); - -printf("let's create a card and associate it with a new account\n"); -$card = $marketplace->cards->create(array( - "card_number" => "5105105105105100", - "expiration_month" => "12", - "expiration_year" => "2015" -)); -$buyer = $marketplace->createBuyer("buyer@example.org", $card->uri); - -printf("generate a debit (which implicitly creates and captures a hold)\n"); -$buyer->debit(100); - -foreach ($marketplace->events as $event) { - printf("this was a %s event, it occurred at %s\n", - $event->type, - $event->occurred_at - ); -} - -printf("ok, let's check with requestb.in to see if our callbacks fired at %s\n", $callback_url); -printf("we received callbacks, you can view them at http://requestb.in/%s?inspect\n", - $bin_name -); - -?> diff --git a/externals/balanced-php/example/example.php b/externals/balanced-php/example/example.php deleted file mode 100644 index 6f0c81dd4a..0000000000 --- a/externals/balanced-php/example/example.php +++ /dev/null @@ -1,120 +0,0 @@ -save(); -print "Our secret is " . $key->secret . "\n"; - -print "configure with our secret " . $key->secret . "\n"; -Balanced\Settings::$api_key = $key->secret; - -print "create our marketplace"; -$marketplace = new Balanced\Marketplace(); -$marketplace->save(); - -if (Balanced\Merchant::me() == null) { - throw new Exception("Balanced\Merchant::me() should not be null"); -} - -print "What's my merchant? Easy: Balanced\Merchant::me(): " . Balanced\Merchant::me()->uri . "\n"; - -if (Balanced\Marketplace::mine() == null) { - throw new Exception("Balanced\Marketplace::mine() should never be null"); -} - -print "What's my marketplace? Easy: Balanced\Marketplace::mine(): " .Balanced\Marketplace::mine()->uri . "\n"; - -print "My marketplace's name is " . $marketplace->name . "\n"; -print "Changing it to TestFooey\n"; -$marketplace->name = "TestFooey"; -$marketplace->save(); -print "My marketplace name is now " . $marketplace->name . "\n"; - -if ($marketplace->name != "TestFooey") { - throw new Exception("Marketplace name is NOT TestFooey"); -} - -print "Cool, let's create a card\n"; -$card = $marketplace->cards->create(array( - "card_number" => "5105105105105100", - "expiration_month" => "12", - "expiration_year" => "2015" -)); - -print "Our card: " . $card->uri . "\n"; - -print "Create out **buyer** account\n"; -$buyer = $marketplace->createBuyer("buyer@example.org", $card->uri); -print "our buyer account: " . $buyer->uri . "\n"; - -print "hold some amount of funds on the buyer, let's say $15\n"; -$the_hold = $buyer->hold(1500); - -print "ok, no more holds! let's capture it (for the full amount)\n"; -$debit = $the_hold->capture(); - -print "hmm, ho much money do i have in escrow? it should equal the debit amount\n"; -$marketplace = Balanced\Marketplace::mine(); -if ($marketplace->in_escrow != 1500) { - throw new Exception("1500 is not in escrow! This is wrong"); -} -print "I have " . $marketplace->in_escrow . " in escrow!\n"; - -print "Cool. now let me refund the full amount"; -$refund = $debit->refund(); - -print "ok, we have a merchant that's signing up, let's create an account for them first, let's create their bank account\n"; - -$bank_account = $marketplace->createBankAccount("Jack Q Merchant", - "123123123", /* account_number */ - "123123123" /* bank_code (routing number is USA)*/ - ); - -$identity = array( - "type" => "person", - "name" => "Billy Jones", - "street_address" => "801 High St", - "postal_code" => "94301", - "country" => "USA", - "dob" => "1979-02", - "phone_number" => "+16505551234" -); - -$merchant = $marketplace->createMerchant('merchant@example.org', - $identity, - $bank_account->uri -); - -print "our buyer is interested in buying something for $130\n"; -$another_debit = $buyer->debit(13000, "MARKETPLACE.COM"); - -print "let's credit our merchant $110\n"; -$credit = $merchant->credit(11000, "Buyer purchase something on Marketplace.com"); - -print "let's assume the marketplace charges 15%, so it earned $20\n"; -$mp_credit = $marketplace->owner_account->credit(2000, - "Commission from MARKETPLACE.COM"); - -print "ok, let's invalidate the card used so it cannot be used again\n"; -$card->is_valid = false; -$card->save(); - -print "how do we look up an existing object from the URI?\n"; -$the_buyer = Balanced\Account::get($buyer->uri); -print "we got the buyer " . $the_buyer->email_address . "\n"; - -$the_debit = Balanced\Debit::get($debit->uri); -print "we got the debit: " . $the_debit->uri . "\n"; - -$the_credit = Balanced\Credit::get($credit->uri); -print "we got the credit: " . $the_credit->uri . "\n"; - -print "and there you have it :)\n"; - -?> \ No newline at end of file diff --git a/externals/balanced-php/example/iterate-example.php b/externals/balanced-php/example/iterate-example.php deleted file mode 100644 index 1b79931aa0..0000000000 --- a/externals/balanced-php/example/iterate-example.php +++ /dev/null @@ -1,71 +0,0 @@ -save(); -Balanced\Settings::$api_key = $key->secret; -$marketplace = new Balanced\Marketplace(); -$marketplace->save(); - -$card = $marketplace->cards->create(array( - "card_number" => "5105105105105100", - "expiration_month" => "12", - "expiration_year" => "2015" - )); - -$buyer = $marketplace->createBuyer("buyer@example.com", $card->uri); - -$debit = $buyer->debit(1500); -$debit->refund(100); -$debit->refund(100); -$debit->refund(100); - -echo $debit->refunds->total() . " refunds" . "\n"; - -$total = 0; - -foreach ($debit->refunds as $r) { - $total += $r->amount; - print "refund = " . $r->amount . "\n"; -} - -print $total . "\n"; - -# bigger pagination example - -print "Create 60 **buyer** with cards accounts\n"; - -for ($i = 0; $i < 60; $i++) { - $card = $marketplace->cards->create(array( - "card_number" => "5105105105105100", - "expiration_month" => "12", - "expiration_year" => "2015" - )); - $buyer = $marketplace->createBuyer("buyer" . $i . "@example.org", $card->uri); - print '.'; -} - -print "\n"; - -$cards = $marketplace->cards; - -print $cards->total() . " cards in Marketplace\n"; - -foreach ($cards as $c) { - print "card " . $c->uri . "\n"; -} - -# let's iterate through cards for just a single account - -foreach ($buyer->cards as $c) { - print "buyer's card " . $c->uri . "\n"; -} - -print "and there you have it :)\n"; - - -?> diff --git a/externals/balanced-php/example/test-composer.php b/externals/balanced-php/example/test-composer.php deleted file mode 100644 index 26ed0c77b3..0000000000 --- a/externals/balanced-php/example/test-composer.php +++ /dev/null @@ -1,14 +0,0 @@ - - * print \Balanced\Settings::$api_key == null; - * $api_key = new \Balanced\APIKey(); - * $api_key = api_key->save(); - * $secret = $api_key->secret; - * print $secret; - * - * - * Then save the returned secret (we don't store it) and configure the client - * to use it: - * - * - * \Balanced\Settings::$api_key = 'my-api-key-secret'; - * - * - * You can later add another api key if you'd like to rotate or expire old - * ones: - * - * - * $api_key = new \Balanced\APIKey(); - * $api_key = api_key->save(); - * $new_secret = $api_key->secret; - * print $new_secret; - * - * \Balanced\Settings::$api_key = $new_secret; - * - * \Balanced\APIKey::query() - * ->sort(\Balanced\APIKey::f->created_at->desc()) - * ->first() - * ->delete(); - * - */ -class APIKey extends Resource -{ - protected static $_uri_spec = null; - - public static function init() - { - self::$_uri_spec = new URISpec('api_keys', 'id', '/v1'); - self::$_registry->add(get_called_class()); - } -} diff --git a/externals/balanced-php/src/Balanced/Account.php b/externals/balanced-php/src/Balanced/Account.php deleted file mode 100644 index d09f89e044..0000000000 --- a/externals/balanced-php/src/Balanced/Account.php +++ /dev/null @@ -1,217 +0,0 @@ -createBuyer or - * Balanced\Marketplace->createMerchant. - * - * - * $marketplace = \Balanced\Marketplace::mine(); - * - * $card = $marketplace->cards->create(array( - * 'street_address' => $street_address, - * 'city' => 'Jollywood', - * 'region' => 'CA', - * 'postal_code' => '90210', - * 'name' => 'Captain Chunk', - * 'card_number' => '4111111111111111', - * 'expiration_month' => 7, - * 'expiration_year' => 2015 - * )); - * - * $buyer = $marketplace->createBuyer( - * 'buyer@example.com', - * $card->uri, - * array( - * 'my_id' => '1212121', - * ) - * ); - * - * - * @see Balanced\Marketplace->createBuyer - * @see Balanced\Marketplace->createMerchant - */ -class Account extends Resource -{ - protected static $_uri_spec = null; - - public static function init() - { - self::$_uri_spec = new URISpec('accounts', 'id'); - self::$_registry->add(get_called_class()); - } - - /** - * Credit the account. - * - * @param int amount Amount to credit the account in USD pennies. - * @param string description Optional description of the credit. - * @param array[string]string meta Optional metadata to associate with the credit. - * @param mixed destination Optional URI of a funding destination (i.e. \Balanced\BankAccount) associated with this account to credit. If not specified the funding destination most recently added to the account is used. - * @param string appears_on_statement_as Optional description of the credit as it will appears on the customer's billing statement. - * - * @return \Balanced\Credit - */ - public function credit( - $amount, - $description = null, - $meta = null, - $destination = null, - $appears_on_statement_as = null) - { - if ($destination == null) - $destination_uri = null; - else - $destination_uri = is_string($destination) ? $destination : $destination->uri; - return $this->credits->create(array( - 'amount' => $amount, - 'description' => $description, - 'meta' => $meta, - 'destination_uri' => $destination_uri, - 'appears_on_statement_as' => $appears_on_statement_as - )); - } - - /** - * Debit the account. - * - * @param int amount Amount to debit the account in USD pennies. - * @param string appears_on_statement_as Optional description of the debit as it will appears on the customer's billing statement. - * @param string description Optional description of the debit. - * @param array[string]string meta Optional metadata to associate with the debit. - * @param mixed Optional funding source (i.e. \Balanced\Card) or URI of a funding source associated with this account to debit. If not specified the funding source most recently added to the account is used. - * - * @return \Balanced\Debit - */ - public function debit( - $amount, - $appears_on_statement_as = null, - $description = null, - $meta = null, - $source = null, - $on_behalf_of = null) - { - if ($source == null) { - $source_uri = null; - } else if (is_string($source)) { - $source_uri = $source; - } else { - $source_uri = $source->uri; - } - - if ($on_behalf_of == null) { - $on_behalf_of_uri = null; - } else if (is_string($on_behalf_of)) { - $on_behalf_of_uri = $on_behalf_of; - } else { - $on_behalf_of_uri = $on_behalf_of->uri; - } - - if (isset($this->uri) && $on_behalf_of_uri == $this->uri) - throw new \InvalidArgumentException( - 'The on_behalf_of parameter MAY NOT be the same account as the account you are debiting!' - ); - - return $this->debits->create(array( - 'amount' => $amount, - 'description' => $description, - 'meta' => $meta, - 'source_uri' => $source_uri, - 'on_behalf_of_uri' => $on_behalf_of_uri, - 'appears_on_statement_as' => $appears_on_statement_as - )); - } - - /** - * Create a hold (i.e. a guaranteed pending debit) for account funds. You - * can later capture or void. A hold is associated with a account funding - * source (i.e. \Balanced\Card). If you don't specify the source then the - * current primary funding source for the account is used. - * - * @param int amount Amount of the hold in USD pennies. - * @param string Optional description Description of the hold. - * @param string Optional URI referencing the card to use for the hold. - * @param array[string]string meta Optional metadata to associate with the hold. - * - * @return \Balanced\Hold - */ - public function hold( - $amount, - $description = null, - $source_uri = null, - $meta = null) - { - return $this->holds->create(array( - 'amount' => $amount, - 'description' => $description, - 'source_uri' => $source_uri, - 'meta' => $meta - )); - } - - /** - * Creates or associates a created card with the account. The default - * funding source for the account will be this card. - * - * @see \Balanced\Marketplace->createCard - * - * @param mixed card \Balanced\Card or URI referencing a card to associate with the account. Alternatively it can be an associative array describing a card to create and associate with the account. - * - * @return \Balanced\Account - */ - public function addCard($card) - { - if (is_string($card)) - $this->card_uri = $card; - else if (is_array($card)) - $this->card = $card; - else - $this->card_uri = $card->uri; - return $this->save(); - } - - /** - * Creates or associates a created bank account with the account. The - * new default funding destination for the account will be this bank account. - * - * @see \Balanced\Marketplace->createBankAccount - * - * @param mixed bank_account \Balanced\BankAccount or URI for a bank account to associate with the account. Alternatively it can be an associative array describing a bank account to create and associate with the account. - * - * @return \Balanced\Account - */ - public function addBankAccount($bank_account) - { - if (is_string($bank_account)) - $this->bank_account_uri = $bank_account; - else if (is_array($bank_account)) - $this->bank_account = $bank_account; - else - $this->bank_account_uri = $bank_account->uri; - return $this->save(); - } - - /** - * Promotes a role-less or buyer account to a merchant. - * - * @see Balanced\Marketplace::createMerchant - * - * @param mixed merchant Associative array describing the merchants identity or a URI referencing a created merchant. - * - * @return \Balanced\Account - */ - public function promoteToMerchant($merchant) - { - if (is_string($merchant)) - $this->merchant_uri = $merchant; - else - $this->merchant = $merchant; - return $this->save(); - } -} diff --git a/externals/balanced-php/src/Balanced/BankAccount.php b/externals/balanced-php/src/Balanced/BankAccount.php deleted file mode 100644 index 3d920c6308..0000000000 --- a/externals/balanced-php/src/Balanced/BankAccount.php +++ /dev/null @@ -1,127 +0,0 @@ - - * $marketplace = \Balanced\Marketplace::mine(); - * - * $bank_account = $marketplace->bank_accounts->create(array( - * 'name' => 'name', - * 'account_number' => '11223344', - * 'bank_code' => '1313123', - * )); - * - * $account = $marketplace - * ->accounts - * ->query() - * ->filter(Account::f->email_address->eq('merchant@example.com')) - * ->one(); - * $account->addBankAccount($bank_account->uri); - * - */ -class BankAccount extends Resource -{ - protected static $_uri_spec = null; - - public static function init() - { - self::$_uri_spec = new URISpec('bank_accounts', 'id', '/v1'); - self::$_registry->add(get_called_class()); - } - - /** - * Credit a bank account. - * - * @param int amount Amount to credit in USD pennies. - * @param string description Optional description of the credit. - * @param string appears_on_statement_as Optional description of the credit as it will appears on the customer's billing statement. - * - * @return \Balanced\Credit - * - * - * $bank_account = new \Balanced\BankAccount(array( - * 'account_number' => '12341234', - * 'name' => 'Fit Finlay', - * 'bank_code' => '325182797', - * 'type' => 'checking', - * )); - * - * $credit = $bank_account->credit(123, 'something descriptive'); - * - */ - public function credit( - $amount, - $description = null, - $meta = null, - $appears_on_statement_as = null) - { - if (!property_exists($this, 'account') || $this->account == null) { - $credit = $this->credits->create(array( - 'amount' => $amount, - 'description' => $description, - )); - } else { - $credit = $this->account->credit( - $amount, - $description, - $meta, - $this->uri, - $appears_on_statement_as - ); - } - return $credit; - } - - public function verify() - { - $response = self::getClient()->post( - $this->verifications_uri, null - ); - $verification = new BankAccountVerification(); - $verification->_objectify($response->body); - return $verification; - } -} - -/** - * Represents an verification for a bank account which is a pre-requisite if - * you want to create debits using the associated bank account. The side-effect - * of creating a verification is that 2 random amounts will be deposited into - * the account which must then be confirmed via the confirm method to ensure - * that you have access to the bank account in question. - * - * You can create these via Balanced\Marketplace::bank_accounts::verify. - * - * - * $marketplace = \Balanced\Marketplace::mine(); - * - * $bank_account = $marketplace->bank_accounts->create(array( - * 'name' => 'name', - * 'account_number' => '11223344', - * 'bank_code' => '1313123', - * )); - * - * $verification = $bank_account->verify(); - * - */ -class BankAccountVerification extends Resource { - - public function confirm($amount1, $amount2) { - $this->amount_1 = $amount1; - $this->amount_2 = $amount2; - $this->save(); - return $this; - } -} diff --git a/externals/balanced-php/src/Balanced/Bootstrap.php b/externals/balanced-php/src/Balanced/Bootstrap.php deleted file mode 100644 index 7fed7b7025..0000000000 --- a/externals/balanced-php/src/Balanced/Bootstrap.php +++ /dev/null @@ -1,79 +0,0 @@ -createCallback. - * - */ -class Callback extends Resource -{ - protected static $_uri_spec = null; - - public static function init() - { - self::$_uri_spec = new URISpec('callbacks', 'id'); - self::$_registry->add(get_called_class()); - } -} diff --git a/externals/balanced-php/src/Balanced/Card.php b/externals/balanced-php/src/Balanced/Card.php deleted file mode 100644 index 57351ee185..0000000000 --- a/externals/balanced-php/src/Balanced/Card.php +++ /dev/null @@ -1,61 +0,0 @@ - - * $marketplace = \Balanced\Marketplace::mine(); - * - * $card = $marketplace->cards->create(array( - * 'name' => 'name', - * 'account_number' => '11223344', - * 'bank_code' => '1313123' - * )); - * - * $account = $marketplace - * ->accounts - * ->query() - * ->filter(Account::f->email_address->eq('buyer@example.com')) - * ->one(); - * $account->addCard($card->uri); - * - */ -class Card extends Resource -{ - protected static $_uri_spec = null; - - public static function init() - { - self::$_uri_spec = new URISpec('cards', 'id', '/v1'); - self::$_registry->add(get_called_class()); - } - - public function debit( - $amount, - $appears_on_statement_as = null, - $description = null, - $meta = null, - $source = null) - { - if ($this->account == null) { - throw new \UnexpectedValueException('Card is not associated with an account.'); - } - return $this->account->debit( - $amount, - $appears_on_statement_as, - $description, - $meta, - $this->uri); - } -} diff --git a/externals/balanced-php/src/Balanced/Credit.php b/externals/balanced-php/src/Balanced/Credit.php deleted file mode 100644 index 67d97d1bd0..0000000000 --- a/externals/balanced-php/src/Balanced/Credit.php +++ /dev/null @@ -1,75 +0,0 @@ - - * $marketplace = \Balanced\Marketplace::mine(); - * - * $account = $marketplace - * ->accounts - * ->query() - * ->filter(Account::f->email_address->eq('merchant@example.com')) - * ->one(); - * - * $credit = $account->credit( - * 100, - * 'how it ' - * array( - * 'my_id': '112233' - * ) - * ); - * - */ -class Credit extends Resource -{ - protected static $_uri_spec = null; - - public static function init() - { - self::$_uri_spec = new URISpec('credits', 'id', '/v1'); - self::$_registry->add(get_called_class()); - } - - /** - * Credit an unstored bank account. - * - * @param int amount Amount to credit in USD pennies. - * @param string description Optional description of the credit. - * @param mixed bank_account Associative array describing a bank account to credit. The bank account will *not* be stored. - * - * @return \Balanced\Credit - * - * - * $credit = \Balanced\Credit::bankAccount( - * 123, - * array( - * 'account_number' => '12341234', - * 'name' => 'Fit Finlay', - * 'bank_code' => '325182797', - * 'type' => 'checking', - * ), - * 'something descriptive'); - * - */ - public static function bankAccount( - $amount, - $bank_account, - $description = null) - { - $credit = new Credit(array( - 'amount' => $amount, - 'bank_account' => $bank_account, - 'description' => $description - )); - $credit->save(); - return $credit; - } -} diff --git a/externals/balanced-php/src/Balanced/Debit.php b/externals/balanced-php/src/Balanced/Debit.php deleted file mode 100644 index d1e87e4f65..0000000000 --- a/externals/balanced-php/src/Balanced/Debit.php +++ /dev/null @@ -1,64 +0,0 @@ - - * $marketplace = \Balanced\Marketplace::mine(); - * - * $account = $marketplace - * ->accounts - * ->query() - * ->filter(Account::f->email_address->eq('buyer@example.com')) - * ->one(); - * - * $debit = $account->debit( - * 100, - * 'how it appears on the statement', - * 'a description', - * array( - * 'my_id': '443322' - * ) - * ); - * - */ -class Debit extends Resource -{ - protected static $_uri_spec = null; - - public static function init() - { - self::$_uri_spec = new URISpec('debits', 'id'); - self::$_registry->add(get_called_class()); - } - - /** - * Create a refund for this debit. You can create multiple refunds for a - * debit but the total amount of the refunds must be less than the debit - * amount. - * - * @param int amount Optional amount of the refund in USD pennies. If unspecified then the full debit amount is used. - * @param string description Optional description of the refund. - * @param array[string]string meta Optional metadata to associate with the refund. - * - * @return \Balanced\Refund - */ - public function refund( - $amount = null, - $description = null, - $meta = null) - { - return $this->refunds->create(array( - 'amount' => $amount, - 'description' => $description, - 'meta' => $meta - )); - } -} diff --git a/externals/balanced-php/src/Balanced/Errors.php b/externals/balanced-php/src/Balanced/Errors.php deleted file mode 100644 index 363bd84f97..0000000000 --- a/externals/balanced-php/src/Balanced/Errors.php +++ /dev/null @@ -1,135 +0,0 @@ -add(get_called_class()); - } -} diff --git a/externals/balanced-php/src/Balanced/Hold.php b/externals/balanced-php/src/Balanced/Hold.php deleted file mode 100644 index ce286b8346..0000000000 --- a/externals/balanced-php/src/Balanced/Hold.php +++ /dev/null @@ -1,77 +0,0 @@ - - * $marketplace = \Balanced\Marketplace::mine(); - * - * $account = $marketplace - * ->accounts - * ->query() - * ->filter(Account::f->email_address->eq('buyer@example.com')) - * ->one(); - * - * $hold = $account->hold( - * 100, - * 'a description', - * null, - * array( - * 'my_id': '1293712837' - * ) - * ); - * - * $debit = $hold->capture(); - * - */ -class Hold extends Resource -{ - protected static $_uri_spec = null; - - public static function init() - { - self::$_uri_spec = new URISpec('holds', 'id'); - self::$_registry->add(get_called_class()); - } - - /** - ** Voids a pending hold. This releases the held funds. Once voided a hold - * is not longer pending can cannot be re-captured or re-voided. - * - * @return \Balanced\Hold - */ - public function void() - { - $this->is_void = true; - return $this->save(); - } - - /** - * Captures a pending hold. This results in a debit. Once captured a hold - * is not longer pending can cannot be re-captured or re-voided. - * - * @param int amount Optional Portion of the pending hold to capture. If not specified the full amount associated with the hold is captured. - * - * @return \Balanced\Debit - */ - public function capture($amount = null) - { - $this->debit = $this->account->debits->create(array( - 'hold_uri' => $this->uri, - 'amount' => $amount, - )); - return $this->debit; - } -} diff --git a/externals/balanced-php/src/Balanced/Marketplace.php b/externals/balanced-php/src/Balanced/Marketplace.php deleted file mode 100644 index bf31353374..0000000000 --- a/externals/balanced-php/src/Balanced/Marketplace.php +++ /dev/null @@ -1,325 +0,0 @@ - - * $api_key = new \Balanced\APIKey(); - * $api_key->save(); - * $secret = $api_key->secret // better save this somewhere - * print $secret; - * \Balanced\Settings::$api_key = $secret; - * - * $marketplace = new \Balanced\Marketplace(); - * $marketplace->save(); - * var_dump($marketplace); - * - * - * Each api key is uniquely associated with an api key so once you've created a - * marketplace: - * - * - * \Balanced\Settings::$api_key = $secret; - * $marketplace = \Balanced\Marketplace::mine(); // this is the marketplace associated with $secret - * - */ -class Marketplace extends Resource -{ - protected static $_uri_spec = null; - - public static function init() - { - self::$_uri_spec = new URISpec('marketplaces', 'id', '/v1'); - self::$_registry->add(get_called_class()); - } - - /** - * Get the marketplace associated with the currently configured - * \Balanced\Settings::$api_key. - * - * @throws \RESTful\Exceptions\NoResultFound - * @return \Balanced\Marketplace - */ - public static function mine() - { - return self::query()->one(); - } - - /** - * Create a card. These can later be associated with an account using - * \Balanced\Account->addCard or \Balanced\Marketplace->createBuyer. - * - * @param string street_address Street address. Use null if there is no address for the card. - * @param string city City. Use null if there is no address for the card. - * @param string postal_code Postal code. Use null if there is no address for the card. - * @param string name Name as it appears on the card. - * @param string card_number Card number. - * @param string security_code Card security code. Use null if it is no available. - * @param int expiration_month Expiration month. - * @param int expiration_year Expiration year. - * - * @return \Balanced\Card - */ - public function createCard( - $street_address, - $city, - $region, - $postal_code, - $name, - $card_number, - $security_code, - $expiration_month, - $expiration_year) - { - if ($region != null && strlen($region) > 0) { - trigger_error("The region parameter will be deprecated in the next minor version of balanced-php", E_USER_NOTICE); - } - - return $this->cards->create(array( - 'street_address' => $street_address, - 'city' => $city, - 'region' => $region, - 'postal_code' => $postal_code, - 'name' => $name, - 'card_number' => $card_number, - 'security_code' => $security_code, - 'expiration_month' => $expiration_month, - 'expiration_year' => $expiration_year - )); - } - - /** - * Create a bank account. These can later be associated with an account - * using \Balanced\Account->addBankAccount. - * - * @param string name Name of the account holder. - * @param string account_number Account number. - * @param string routing_number Bank code or routing number. - * @param string type checking or savings - * @param array meta Single level mapping from string keys to string values. - * - * @return \Balanced\BankAccount - */ - public function createBankAccount( - $name, - $account_number, - $routing_number, - $type, - $meta = null - ) - { - return $this->bank_accounts->create(array( - 'name' => $name, - 'account_number' => $account_number, - 'routing_number' => $routing_number, - 'type' => $type, - 'meta' => $meta - )); - } - - /** - * Create a role-less account. You can later turn this into a buyer by - * adding a funding source (e.g a card) or a merchant using - * \Balanced\Account->promoteToMerchant. - * - * @param string email_address Optional email address. There can only be one account with this email address. - * @param array[string]string meta Optional metadata to associate with the account. - * - * @return \Balanced\Account - */ - public function createAccount($email_address = null, $meta = null) - { - return $this->accounts->create(array( - 'email_address' => $email_address, - 'meta' => $meta, - )); - } - - /** - * Find or create a role-less account by email address. You can later turn - * this into a buyer by adding a funding source (e.g a card) or a merchant - * using \Balanced\Account->promoteToMerchant. - * - * @param string email_address Email address. There can only be one account with this email address. - * - * @return \Balanced\Account - */ - function findOrCreateAccountByEmailAddress($email_address) - { - $marketplace = Marketplace::mine(); - try { - $account = $this->accounts->create(array( - 'email_address' => $email_address - )); - } - catch (Errors\DuplicateAccountEmailAddress $e) { - $account = Account::get($e->extras->account_uri); - } - return $account; - } - - /** - * Create a buyer account. - * - * @param string email_address Optional email address. There can only be one account with this email address. - * @param string card_uri URI referencing a card to associate with the account. - * @param array[string]string meta Optional metadata to associate with the account. - * @param string name Optional name of the account. - * - * @return \Balanced\Account - */ - public function createBuyer($email_address, $card_uri, $meta = null, $name = null) - { - return $this->accounts->create(array( - 'email_address' => $email_address, - 'card_uri' => $card_uri, - 'meta' => $meta, - 'name' => $name - )); - } - - /** - * Create a merchant account. - * - * Unlike buyers the identity of a merchant must be established before - * the account can function as a merchant (i.e. be credited). A merchant - * can be either a person or a business. Either way that information is - * represented as an associative array and passed as the merchant parameter - * when creating the merchant account. - * - * For a person the array looks like this: - * - * - * array( - * 'type' => 'person', - * 'name' => 'William James', - * 'tax_id' => '393-48-3992', - * 'street_address' => '167 West 74th Street', - * 'postal_code' => '10023', - * 'dob' => '1842-01-01', - * 'phone_number' => '+16505551234', - * 'country_code' => 'USA' - * ) - * - * - * For a business the array looks like this: - * - * - * array( - * 'type' => 'business', - * 'name' => 'Levain Bakery', - * 'tax_id' => '253912384', - * 'street_address' => '167 West 74th Street', - * 'postal_code' => '10023', - * 'phone_number' => '+16505551234', - * 'country_code' => 'USA', - * 'person' => array( - * 'name' => 'William James', - * 'tax_id' => '393483992', - * 'street_address' => '167 West 74th Street', - * 'postal_code' => '10023', - * 'dob' => '1842-01-01', - * 'phone_number' => '+16505551234', - * 'country_code' => 'USA', - * ) - * ) - * - * - * In some cases the identity of the merchant, person or business, cannot - * be verified in which case a \Balanced\Exceptions\HTTPError is thrown: - * - * - * $identity = array( - * 'type' => 'business', - * 'name' => 'Levain Bakery', - * 'tax_id' => '253912384', - * 'street_address' => '167 West 74th Street', - * 'postal_code' => '10023', - * 'phone_number' => '+16505551234', - * 'country_code' => 'USA', - * 'person' => array( - * 'name' => 'William James', - * 'tax_id' => '393483992', - * 'street_address' => '167 West 74th Street', - * 'postal_code' => '10023', - * 'dob' => '1842-01-01', - * 'phone_number' => '+16505551234', - * 'country_code' => 'USA', - * ), - * ); - * - * try { - * $merchant = \Balanced\Marketplace::mine()->createMerchant( - * 'merchant@example.com', - * $identity, - * ); - * catch (\Balanced\Exceptions\HTTPError $e) { - * if ($e->code != 300) { - * throw $e; - * } - * print e->response->header['Location'] // this is where merchant must signup - * } - * - * - * Once the merchant has completed signup you can use the resulting URI to - * create an account for them on your marketplace: - * - * - * $merchant = self::$marketplace->createMerchant( - * 'merchant@example.com', - * null, - * null, - * $merchant_uri - * ); - * - * - * @param string email_address Optional email address. There can only be one account with this email address. - * @param array[string]mixed merchant Associative array describing the merchants identity. - * @param string $bank_account_uri Optional URI referencing a bank account to associate with this account. - * @param string $merchant_uri URI of a merchant created via the redirection sign-up flow. - * @param string $name Optional name of the merchant. - * @param array[string]string meta Optional metadata to associate with the account. - * - * @return \Balanced\Account - */ - public function createMerchant( - $email_address = null, - $merchant = null, - $bank_account_uri = null, - $merchant_uri = null, - $name = null, - $meta = null) - { - return $this->accounts->create(array( - 'email_address' => $email_address, - 'merchant' => $merchant, - 'merchant_uri' => $merchant_uri, - 'bank_account_uri' => $bank_account_uri, - 'name' => $name, - 'meta' => $meta, - )); - } - - /* - * Create a callback. - * - * @param string url URL of callback. - */ - public function createCallback( - $url - ) - { - return $this->callbacks->create(array( - 'url' => $url - )); - } -} diff --git a/externals/balanced-php/src/Balanced/Merchant.php b/externals/balanced-php/src/Balanced/Merchant.php deleted file mode 100644 index 7848215bea..0000000000 --- a/externals/balanced-php/src/Balanced/Merchant.php +++ /dev/null @@ -1,51 +0,0 @@ -add(get_called_class()); - } - - /** - * Return the merchant identity associated with the current - * Balanced\Settings::$api_key. If you are not authenticated (i.e. - * ) then Balanced\Exceptions\NoResult - * will be thrown. - * - * - * $merchant = \Balanced\Merchant::me(); - * $owner_account = \Balanced\Marketplace::mine()->owner_account; - * assert($merchant->id == $owner_account->merchant->id); - * - * - * @throws \RESTful\Exceptions\NoResultFound - * @return \Balanced\Merchant - */ - public static function me() - { - return self::query()->one(); - } -} diff --git a/externals/balanced-php/src/Balanced/Refund.php b/externals/balanced-php/src/Balanced/Refund.php deleted file mode 100644 index e4e1c033fb..0000000000 --- a/externals/balanced-php/src/Balanced/Refund.php +++ /dev/null @@ -1,50 +0,0 @@ - - * $marketplace = \Balanced\Marketplace::mine(); - * - * $account = $marketplace - * ->accounts - * ->query() - * ->filter(Account::f->email_address->eq('buyer@example.com')) - * ->one(); - * - * $debit = $account->debit( - * 100, - * 'how it appears on the statement', - * 'a description', - * array( - * 'my_id': '443322' - * ) - * ); - * - * $debit->refund( - * 99, - * 'some description', - * array( - * 'my_id': '123123' - * ) - * ); - * - */ -class Refund extends Resource -{ - protected static $_uri_spec = null; - - public static function init() - { - self::$_uri_spec = new URISpec('refunds', 'id'); - self::$_registry->add(get_called_class()); - } -} - diff --git a/externals/balanced-php/src/Balanced/Resource.php b/externals/balanced-php/src/Balanced/Resource.php deleted file mode 100644 index 0cbc304516..0000000000 --- a/externals/balanced-php/src/Balanced/Resource.php +++ /dev/null @@ -1,48 +0,0 @@ -body, 'category_code') && - array_key_exists($response->body->category_code, Error::$codes)) - $error = new Error::$codes[$response->body->category_code]($response); - else - $error = new HTTPError($response); - return $error; - } - - public static function getClient() - { - $class = get_called_class(); - return $class::$_client; - } - - public static function getRegistry() - { - $class = get_called_class(); - return $class::$_registry; - } - - public static function getURISpec() - { - $class = get_called_class(); - return $class::$_uri_spec; - } -} diff --git a/externals/balanced-php/src/Balanced/Settings.php b/externals/balanced-php/src/Balanced/Settings.php deleted file mode 100644 index e4fc3a9ab3..0000000000 --- a/externals/balanced-php/src/Balanced/Settings.php +++ /dev/null @@ -1,43 +0,0 @@ - - * \Balanced\Settngs::api_key = 'my-api-key-secret'; - * - * - * or all at once: - * - * - * \Balanced\Settngs::configure( - * 'https://api.balancedpayments.com/', - * 'my-api-key-secret' - * ); - * - */ -class Settings -{ - const VERSION = '0.7.1'; - - public static $url_root = 'https://api.balancedpayments.com/', - $api_key = null, - $agent = 'balanced-php', - $version = Settings::VERSION; - - /** - * Configure all settings. - * - * @param string url_root The root (schema://hostname[:port]) to use when constructing api URLs. - * @param string api_key The api key secret to use for authenticating when talking to the api. If null then api usage is limited to uauthenticated endpoints. - */ - public static function configure($url_root, $api_key) - { - self::$url_root= $url_root; - self::$api_key = $api_key; - } -} diff --git a/externals/balanced-php/tests/Balanced/ResourceTest.php b/externals/balanced-php/tests/Balanced/ResourceTest.php deleted file mode 100644 index 4888934f12..0000000000 --- a/externals/balanced-php/tests/Balanced/ResourceTest.php +++ /dev/null @@ -1,614 +0,0 @@ -expectOutputString(''); - $result = Resource::getRegistry()->match('/v1/api_keys'); - return; - $expected = array( - 'collection' => true, - 'class' => 'Balanced\APIKey', - ); - $this->assertEquals($expected, $result); - $result = Resource::getRegistry()->match('/v1/api_keys/1234'); - $expected = array( - 'collection' => false, - 'class' => 'Balanced\APIKey', - 'ids' => array('id' => '1234'), - ); - $this->assertEquals($expected, $result); - } -} - -class MarketplaceTest extends \PHPUnit_Framework_TestCase -{ - function testRegistry() - { - $result = Resource::getRegistry()->match('/v1/marketplaces'); - $expected = array( - 'collection' => true, - 'class' => 'Balanced\Marketplace', - ); - $this->assertEquals($expected, $result); - $result = Resource::getRegistry()->match('/v1/marketplaces/1122'); - $expected = array( - 'collection' => false, - 'class' => 'Balanced\Marketplace', - 'ids' => array('id' => '1122'), - ); - $this->assertEquals($expected, $result); - } - - function testCreateCard() - { - $collection = $this->getMock( - '\RESTful\Collection', - array('create'), - array('\Balanced\Card', 'some/uri', null) - ); - - $collection->expects($this->once()) - ->method('create') - ->with(array( - 'street_address' => '123 Fake Street', - 'city' => 'Jollywood', - 'region' => '', - 'postal_code' => '90210', - 'name' => 'khalkhalash', - 'card_number' => '4112344112344113', - 'security_code' => '123', - 'expiration_month' => 12, - 'expiration_year' => 2013, - )); - - $marketplace = new Marketplace(array('cards' => $collection)); - $marketplace->createCard( - '123 Fake Street', - 'Jollywood', - '', - '90210', - 'khalkhalash', - '4112344112344113', - '123', - 12, - 2013); - } - - function testCreateBankAccount() - { - $collection = $this->getMock( - '\RESTful\Collection', - array('create'), - array('\Balanced\BankAccount', 'some/uri', null) - ); - - $collection->expects($this->once()) - ->method('create') - ->with(array( - 'name' => 'Homer Jay', - 'account_number' => '112233a', - 'routing_number' => '121042882', - 'type' => 'savings', - 'meta' => null - )); - - $marketplace = new Marketplace(array('bank_accounts' => $collection)); - $marketplace->createBankAccount( - 'Homer Jay', - '112233a', - '121042882', - 'savings'); - } - - function testCreateAccount() - { - $collection = $this->getMock( - '\RESTful\Collection', - array('create'), - array('\Balanced\Account', 'some/uri', null) - ); - - $collection->expects($this->once()) - ->method('create') - ->with(array( - 'email_address' => 'role-less@example.com', - 'meta' => array('test#' => 'test_d') - )); - - $marketplace = new Marketplace(array('accounts' => $collection)); - $marketplace->createAccount( - 'role-less@example.com', - array('test#' => 'test_d') - ); - } - - function testCreateBuyer() - { - $collection = $this->getMock( - '\RESTful\Collection', - array('create'), - array('\Balanced\Account', 'some/uri', null) - ); - - $collection->expects($this->once()) - ->method('create') - ->with(array( - 'email_address' => 'buyer@example.com', - 'card_uri' => '/some/card/uri', - 'meta' => array('test#' => 'test_d'), - 'name' => 'Buy Er' - )); - - $marketplace = new Marketplace(array('accounts' => $collection)); - $marketplace->createBuyer( - 'buyer@example.com', - '/some/card/uri', - array('test#' => 'test_d'), - 'Buy Er' - ); - } -} - -class AccountTest extends \PHPUnit_Framework_TestCase -{ - function testRegistry() - { - $result = Resource::getRegistry()->match('/v1/accounts'); - $expected = array( - 'collection' => true, - 'class' => 'Balanced\Account', - ); - $this->assertEquals($expected, $result); - $result = Resource::getRegistry()->match('/v1/accounts/0099'); - $expected = array( - 'collection' => false, - 'class' => 'Balanced\Account', - 'ids' => array('id' => '0099'), - ); - $this->assertEquals($expected, $result); - } - - function testCredit() - { - $collection = $this->getMock( - '\RESTful\Collection', - array('create'), - array('\Balanced\Credit', 'some/uri', null) - ); - - $collection - ->expects($this->once()) - ->method('create') - ->with(array( - 'amount' => 101, - 'description' => 'something sweet', - 'meta' => null, - 'destination_uri' => null, - 'appears_on_statement_as' => null - )); - - $account = new Account(array('credits' => $collection)); - $account->credit(101, 'something sweet'); - } - - function testDebit() - { - $collection = $this->getMock( - '\RESTful\Collection', - array('create'), - array('\Balanced\Debit', 'some/uri', null) - ); - - $collection - ->expects($this->once()) - ->method('create') - ->with(array( - 'amount' => 9911, - 'description' => 'something tangy', - 'appears_on_statement_as' => 'BAL*TANG', - 'meta' => null, - 'source_uri' => null, - 'on_behalf_of_uri' => null, - )); - - $account = new Account(array('debits' => $collection)); - $account->debit(9911, 'BAL*TANG', 'something tangy'); - } - - function testHold() - { - $collection = $this->getMock( - '\RESTful\Collection', - array('create'), - array('\Balanced\Hold', 'some/uri', null) - ); - - $collection - ->expects($this->once()) - ->method('create') - ->with(array( - 'amount' => 1243, - 'description' => 'something crispy', - 'source_uri' => '/some/card/uri', - 'meta' => array('test#' => 'test_d') - )); - - $account = new Account(array('holds' => $collection)); - $account->hold( - 1243, - 'something crispy', - '/some/card/uri', - array('test#' => 'test_d') - ); - } - - function testAddCard() - { - $account = $this->getMock( - '\Balanced\Account', - array('save') - ); - - $account - ->expects($this->once()) - ->method('save') - ->with(); - - $account->addCard('/my/new/card/121212'); - $this->assertEquals($account->card_uri, '/my/new/card/121212'); - } - - function testAddBankAccount() - { - $account = $this->getMock( - '\Balanced\Account', - array('save') - ); - - $account - ->expects($this->once()) - ->method('save') - ->with(); - - $account->addBankAccount('/my/new/bank_account/121212'); - $this->assertEquals($account->bank_account_uri, '/my/new/bank_account/121212'); - } - - function testPromotToMerchant() - { - $account = $this->getMock( - '\Balanced\Account', - array('save') - ); - - $account - ->expects($this->once()) - ->method('save') - ->with(); - - $merchant = array( - 'type' => 'person', - 'name' => 'William James', - 'tax_id' => '393-48-3992', - 'street_address' => '167 West 74th Street', - 'postal_code' => '10023', - 'dob' => '1842-01-01', - 'phone_number' => '+16505551234', - 'country_code' => 'USA' - ); - - $account->promoteToMerchant($merchant); - $this->assertEquals($account->merchant, $merchant); - } -} - -class HoldTest extends \PHPUnit_Framework_TestCase -{ - function testRegistry() - { - $result = Resource::getRegistry()->match('/v1/holds'); - $expected = array( - 'collection' => true, - 'class' => 'Balanced\Hold', - ); - $this->assertEquals($expected, $result); - $result = Resource::getRegistry()->match('/v1/holds/112233'); - $expected = array( - 'collection' => false, - 'class' => 'Balanced\Hold', - 'ids' => array('id' => '112233'), - ); - $this->assertEquals($expected, $result); - } - - function testVoid() - { - $hold = $this->getMock( - '\Balanced\Hold', - array('save') - ); - - $hold - ->expects($this->once()) - ->method('save') - ->with(); - - $hold->void(); - $this->assertTrue($hold->is_void); - } - - function testCapture() - { - $collection = $this->getMock( - '\RESTful\Collection', - array('create'), - array('\Balanced\Debit', 'some/uri', null) - ); - - $collection - ->expects($this->once()) - ->method('create') - ->with(array( - 'hold_uri' => 'some/hold/uri', - 'amount' => 2211, - )); - - $account = new Account(array('debits' => $collection)); - - $hold = new Hold(array('uri' => 'some/hold/uri', 'account' => $account)); - - $hold->capture(2211); - } -} - -class CreditTest extends \PHPUnit_Framework_TestCase -{ - function testRegistry() - { - $result = Resource::getRegistry()->match('/v1/credits'); - $expected = array( - 'collection' => true, - 'class' => 'Balanced\Credit', - ); - $this->assertEquals($expected, $result); - $result = Resource::getRegistry()->match('/v1/credits/9988'); - $expected = array( - 'collection' => false, - 'class' => 'Balanced\Credit', - 'ids' => array('id' => '9988'), - ); - $this->assertEquals($expected, $result); - } -} - -class DebitTest extends \PHPUnit_Framework_TestCase -{ - function testRegistry() - { - $result = Resource::getRegistry()->match('/v1/debits'); - $expected = array( - 'collection' => true, - 'class' => 'Balanced\Debit', - ); - $this->assertEquals($expected, $result); - $result = Resource::getRegistry()->match('/v1/debits/4545'); - $expected = array( - 'collection' => false, - 'class' => 'Balanced\Debit', - 'ids' => array('id' => '4545'), - ); - $this->assertEquals($expected, $result); - } - - function testRefund() - { - $collection = $this->getMock( - '\RESTful\Collection', - array('create'), - array('\Balanced\Refund', 'some/uri', null) - ); - - $collection - ->expects($this->once()) - ->method('create') - ->with(array( - 'amount' => 5645, - 'description' => null, - 'meta' => array('test#' => 'test_d') - )); - - $debit = new Debit(array('refunds' => $collection)); - - $debit->refund(5645, null, array('test#' => 'test_d')); - } -} - -class RefundTest extends \PHPUnit_Framework_TestCase -{ - function testRegistry() - { - $result = Resource::getRegistry()->match('/v1/refunds'); - $expected = array( - 'collection' => true, - 'class' => 'Balanced\Refund', - ); - $this->assertEquals($expected, $result); - $result = Resource::getRegistry()->match('/v1/refunds/1287'); - $expected = array( - 'collection' => false, - 'class' => 'Balanced\Refund', - 'ids' => array('id' => '1287'), - ); - $this->assertEquals($expected, $result); - } -} - -class BankAccountTest extends \PHPUnit_Framework_TestCase -{ - function testRegistry() - { - $result = Resource::getRegistry()->match('/v1/bank_accounts'); - $expected = array( - 'collection' => true, - 'class' => 'Balanced\BankAccount', - ); - $this->assertEquals($expected, $result); - $result = Resource::getRegistry()->match('/v1/bank_accounts/887766'); - $expected = array( - 'collection' => false, - 'class' => 'Balanced\BankAccount', - 'ids' => array('id' => '887766'), - ); - $this->assertEquals($expected, $result); - } - - function testCreditAccount() - { - $collection = $this->getMock( - '\RESTful\Collection', - array('create'), - array('\Balanced\Credit', 'some/uri', null) - ); - - $collection - ->expects($this->once()) - ->method('create') - ->with(array( - 'amount' => 101, - 'description' => 'something super sweet', - 'meta' => null, - 'destination_uri' => '/some/other/uri', - 'appears_on_statement_as' => null - )); - - $account = new Account(array('credits' => $collection)); - $bank_account = new BankAccount(array('uri' => '/some/other/uri', 'account' => $account)); - - $bank_account->credit(101, 'something super sweet'); - } - - function testCreditAccountless() - { - $collection = $this->getMock( - '\RESTful\Collection', - array('create'), - array('\Balanced\Credit', 'some/uri', null) - ); - - $collection - ->expects($this->once()) - ->method('create') - ->with(array( - 'amount' => 101, - 'description' => 'something super sweet', - )); - $bank_account = new BankAccount(array( - 'uri' => '/some/other/uri', - 'account' => null, - 'credits' => $collection, - )); - - $bank_account->credit(101, 'something super sweet'); - } -} - -class CardTest extends \PHPUnit_Framework_TestCase -{ - function testRegistry() - { - $result = Resource::getRegistry()->match('/v1/cards'); - $expected = array( - 'collection' => true, - 'class' => 'Balanced\Card', - ); - $this->assertEquals($expected, $result); - $result = Resource::getRegistry()->match('/v1/cards/136asd6713'); - $expected = array( - 'collection' => false, - 'class' => 'Balanced\Card', - 'ids' => array('id' => '136asd6713'), - ); - $this->assertEquals($expected, $result); - } - - function testDebit() - { - $collection = $this->getMock( - '\RESTful\Collection', - array('create'), - array('\Balanced\Debit', 'some/uri', null) - ); - - $account = new Account(array('debits' => $collection)); - $card = new Card(array('uri' => '/some/uri', 'account' => $account )); - - $collection - ->expects($this->once()) - ->method('create') - ->with(array( - 'amount' => 9911, - 'description' => 'something tangy', - 'appears_on_statement_as' => 'BAL*TANG', - 'meta' => null, - 'source_uri' => '/some/uri', - 'on_behalf_of_uri' => null, - )); - - $card->debit(9911, 'BAL*TANG', 'something tangy'); - } - - /** - * @expectedException \UnexpectedValueException - */ - function testNotAssociatedDebit() - { - $card = new Card(array('uri' => '/some/uri', 'account' => null )); - $card->debit(9911, 'BAL*TANG', 'something tangy'); - } -} - - -class MerchantTest extends \PHPUnit_Framework_TestCase -{ - function testRegistry() - { - $result = Resource::getRegistry()->match('/v1/merchants'); - $expected = array( - 'collection' => true, - 'class' => 'Balanced\Merchant', - ); - $this->assertEquals($expected, $result); - $result = Resource::getRegistry()->match('/v1/merchants/136asd6713'); - $expected = array( - 'collection' => false, - 'class' => 'Balanced\Merchant', - 'ids' => array('id' => '136asd6713'), - ); - $this->assertEquals($expected, $result); - } -} diff --git a/externals/balanced-php/tests/Balanced/SuiteTest.php b/externals/balanced-php/tests/Balanced/SuiteTest.php deleted file mode 100644 index 83cdbb162d..0000000000 --- a/externals/balanced-php/tests/Balanced/SuiteTest.php +++ /dev/null @@ -1,800 +0,0 @@ - - *
  • $BALANCED_URL_ROOT If set applies to \Balanced\Settings::$url_root. - *
  • $BALANCED_API_KEY If set applies to \Balanced\Settings::$api_key. - * - * - * @group suite - */ -class SuiteTest extends \PHPUnit_Framework_TestCase -{ - static $key, - $marketplace, - $email_counter = 0; - - static function _createBuyer($email_address = null, $card = null) - { - if ($email_address == null) - $email_address = sprintf('m+%d@poundpay.com', self::$email_counter++); - if ($card == null) - $card = self::_createCard(); - return self::$marketplace->createBuyer( - $email_address, - $card->uri, - array('test#' => 'test_d'), - 'Hobo Joe' - ); - } - - static function _createCard($account = null) - { - $card = self::$marketplace->createCard( - '123 Fake Street', - 'Jollywood', - null, - '90210', - 'khalkhalash', - '4112344112344113', - null, - 12, - 2013); - if ($account != null) { - $account->addCard($card); - $card = Card::get($card->uri); - } - return $card; - } - - static function _createBankAccount($account = null) - { - $bank_account = self::$marketplace->createBankAccount( - 'Homer Jay', - '112233a', - '121042882', - 'checking' - ); - if ($account != null) { - $account->addBankAccount($bank_account); - $bank_account = $account->bank_accounts[0]; - } - return $bank_account; - } - - public static function _createPersonMerchant($email_address = null, $bank_account = null) - { - if ($email_address == null) - $email_address = sprintf('m+%d@poundpay.com', self::$email_counter++); - if ($bank_account == null) - $bank_account = self::_createBankAccount(); - $merchant = array( - 'type' => 'person', - 'name' => 'William James', - 'tax_id' => '393-48-3992', - 'street_address' => '167 West 74th Street', - 'postal_code' => '10023', - 'dob' => '1842-01-01', - 'phone_number' => '+16505551234', - 'country_code' => 'USA' - ); - return self::$marketplace->createMerchant( - $email_address, - $merchant, - $bank_account->uri - ); - } - - public static function _createBusinessMerchant($email_address = null, $bank_account = null) - { - if ($email_address == null) - $email_address = sprintf('m+%d@poundpay.com', self::$email_counter++); - if ($bank_account == null) - $bank_account = self::_createBankAccount(); - $merchant = array( - 'type' => 'business', - 'name' => 'Levain Bakery', - 'tax_id' => '253912384', - 'street_address' => '167 West 74th Street', - 'postal_code' => '10023', - 'phone_number' => '+16505551234', - 'country_code' => 'USA', - 'person' => array( - 'name' => 'William James', - 'tax_id' => '393483992', - 'street_address' => '167 West 74th Street', - 'postal_code' => '10023', - 'dob' => '1842-01-01', - 'phone_number' => '+16505551234', - 'country_code' => 'USA', - ), - ); - return self::$marketplace->createMerchant( - $email_address, - $merchant, - $bank_account->uri - ); - } - - public static function setUpBeforeClass() - { - // url root - $url_root = getenv('BALANCED_URL_ROOT'); - if ($url_root != '') { - Settings::$url_root = $url_root; - } - else - Settings::$url_root = 'https://api.balancedpayments.com/'; - - // api key - $api_key = getenv('BALANCED_API_KEY'); - if ($api_key != '') { - Settings::$api_key = $api_key; - } - else { - self::$key = new APIKey(); - self::$key->save(); - Settings::$api_key = self::$key->secret; - } - - // marketplace - try { - self::$marketplace = Marketplace::mine(); - } - catch(\RESTful\Exceptions\NoResultFound $e) { - self::$marketplace = new Marketplace(); - self::$marketplace->save(); - } - } - - function testMarketplaceMine() - { - $marketplace = Marketplace::mine(); - $this->assertEquals($this::$marketplace->id, $marketplace->id); - } - - /** - * @expectedException \RESTful\Exceptions\HTTPError - */ - function testAnotherMarketplace() - { - $marketplace = new Marketplace(); - $marketplace->save(); - } - - /** - * @expectedException \RESTful\Exceptions\HTTPError - */ - function testDuplicateEmailAddress() - { - self::_createBuyer('dupe@poundpay.com'); - self::_createBuyer('dupe@poundpay.com'); - } - - function testIndexMarketplace() - { - $marketplaces = Marketplace::query()->all(); - $this->assertEquals(count($marketplaces), 1); - } - - function testCreateBuyer() - { - self::_createBuyer(); - } - - function testCreateAccountWithoutEmailAddress() - { - self::$marketplace->createAccount(); - } - - function testFindOrCreateAccountByEmailAddress() - { - $account1 = self::$marketplace->createAccount('foc@example.com'); - $account2 = self::$marketplace->findOrCreateAccountByEmailAddress('foc@example.com'); - $this->assertEquals($account2->id, $account2->id); - $account3 = self::$marketplace->findOrCreateAccountByEmailAddress('foc2@example.com'); - $this->assertNotEquals($account3->id, $account1->id); - } - - function testGetBuyer() - { - $buyer1 = self::_createBuyer(); - $buyer2 = Account::get($buyer1->uri); - $this->assertEquals($buyer1->id, $buyer2->id); - } - - - function testMe() - { - $marketplace = Marketplace::mine(); - $merchant = Merchant::me(); - $this->assertEquals($marketplace->id, $merchant->marketplace->id); - } - - function testDebitAndRefundBuyer() - { - $buyer = self::_createBuyer(); - $debit = $buyer->debit( - 1000, - 'Softie', - 'something i bought', - array('hi' => 'bye') - ); - $refund = $debit->refund(100); - } - - /** - * @expectedException \RESTful\Exceptions\HTTPError - */ - function testDebitZero() - { - $buyer = self::_createBuyer(); - $debit = $buyer->debit( - 0, - 'Softie', - 'something i bought' - ); - } - - function testMultipleRefunds() - { - $buyer = self::_createBuyer(); - $debit = $buyer->debit( - 1500, - 'Softie', - 'something tart', - array('hi' => 'bye')); - $refunds = array( - $debit->refund(100), - $debit->refund(100), - $debit->refund(100), - $debit->refund(100)); - $expected_refund_ids = array_map( - function($x) { - return $x->id; - }, $refunds); - sort($expected_refund_ids); - $this->assertEquals($debit->refunds->total(), 4); - - // itemization - $total = 0; - $refund_ids = array(); - foreach ($debit->refunds as $refund) { - $total += $refund->amount; - array_push($refund_ids, $refund->id); - } - sort($refund_ids); - $this->assertEquals($total, 400); - $this->assertEquals($expected_refund_ids, $refund_ids); - - // pagination - $total = 0; - $refund_ids = array(); - foreach ($debit->refunds->paginate() as $page) { - foreach ($page->items as $refund) { - $total += $refund->amount; - array_push($refund_ids, $refund->id); - } - } - sort($refund_ids); - $this->assertEquals($total, 400); - $this->assertEquals($expected_refund_ids, $refund_ids); - } - - function testDebitSource() - { - $buyer = self::_createBuyer(); - $card1 = self::_createCard($buyer); - $card2 = self::_createCard($buyer); - - $credit = $buyer->debit( - 1000, - 'Softie', - 'something i bought' - ); - $this->assertEquals($credit->source->id, $card2->id); - - $credit = $buyer->debit( - 1000, - 'Softie', - 'something i bought', - null, - $card1 - ); - $this->assertEquals($credit->source->id, $card1->id); - } - - function testDebitOnBehalfOf() - { - $buyer = self::_createBuyer(); - $merchant = self::$marketplace->createAccount(null); - $card1 = self::_createCard($buyer); - - $debit = $buyer->debit(1000, null, null, null, null, $merchant); - $this->assertEquals($debit->amount, 1000); - // for now just test the debit succeeds. - // TODO: once the on_behalf_of actually shows up on the response, test it. - } - - /** - * @expectedException \InvalidArgumentException - */ - function testDebitOnBehalfOfFailsForBuyer() - { - $buyer = self::_createBuyer(); - $card1 = self::_createCard($buyer); - $debit = $buyer->debit(1000, null, null, null, null, $buyer); - } - - function testCreateAndVoidHold() - { - $buyer = self::_createBuyer(); - $hold = $buyer->hold(1000); - $this->assertEquals($hold->is_void, false); - $hold->void(); - $this->assertEquals($hold->is_void, true); - } - - function testCreateAndCaptureHold() - { - $buyer = self::_createBuyer(); - $hold = $buyer->hold(1000); - $debit = $hold->capture(909); - $this->assertEquals($debit->account->id, $buyer->id); - $this->assertEquals($debit->hold->id, $hold->id); - $this->assertEquals($hold->debit->id, $debit->id); - } - - function testCreatePersonMerchant() - { - $merchant = self::_createPersonMerchant(); - } - - function testCreateBusinessMerchant() - { - $merchant = self::_createBusinessMerchant(); - } - - /** - * @expectedException \RESTful\Exceptions\HTTPError - */ - function testCreditRequiresNonZeroAmount() - { - $buyer = self::_createBuyer(); - $buyer->debit( - 1000, - 'Softie', - 'something i bought' - ); - $merchant = self::_createBusinessMerchant(); - $merchant->credit(0); - } - - /** - * @expectedException \RESTful\Exceptions\HTTPError - */ - function testCreditMoreThanEscrowBalanceFails() - { - $buyer = self::_createBuyer(); - $buyer->credit( - 1000, - 'something i bought', - null, - null, - 'Softie' - ); - $merchant = self::_createBusinessMerchant(); - $merchant->credit(self::$marketplace->in_escrow + 1); - } - - function testCreditDestiation() - { - $buyer = self::_createBuyer(); - $buyer->debit(3000); # NOTE: build up escrow balance to credit - - $merchant = self::_createPersonMerchant(); - $bank_account1 = self::_createBankAccount($merchant); - $bank_account2 = self::_createBankAccount($merchant); - - $credit = $merchant->credit( - 1000, - 'something i sold', - null, - null, - 'Softie' - ); - $this->assertEquals($credit->destination->id, $bank_account2->id); - - $credit = $merchant->credit( - 1000, - 'something i sold', - null, - $bank_account1, - 'Softie' - ); - $this->assertEquals($credit->destination->id, $bank_account1->id); - } - - function testAssociateCard() - { - $merchant = self::_createPersonMerchant(); - $card = self::_createCard(); - $merchant->addCard($card->uri); - } - - function testAssociateBankAccount() - { - $merchant = self::_createPersonMerchant(); - $bank_account = self::_createBankAccount(); - $merchant->addBankAccount($bank_account->uri); - } - - function testCardMasking() - { - $card = self::$marketplace->createCard( - '123 Fake Street', - 'Jollywood', - null, - '90210', - 'khalkhalash', - '4112344112344113', - '123', - 12, - 2013); - $this->assertEquals($card->last_four, '4113'); - $this->assertFalse(property_exists($card, 'number')); - } - - function testBankAccountMasking() - { - $bank_account = self::$marketplace->createBankAccount( - 'Homer Jay', - '112233a', - '121042882', - 'checking' - ); - $this->assertEquals($bank_account->last_four, '233a'); - $this->assertEquals($bank_account->account_number, 'xxx233a'); - } - - function testFilteringAndSorting() - { - $buyer = self::_createBuyer(); - $debit1 = $buyer->debit(1122, null, null, array('tag' => '1')); - $debit2 = $buyer->debit(3322, null, null, array('tag' => '1')); - $debit3 = $buyer->debit(2211, null, null, array('tag' => '2')); - - $getId = function($o) { - return $o->id; - }; - - $debits = ( - self::$marketplace->debits->query() - ->filter(Debit::$f->meta->tag->eq('1')) - ->sort(Debit::$f->created_at->asc()) - ->all()); - $debit_ids = array_map($getId, $debits); - $this->assertEquals($debit_ids, array($debit1->id, $debit2->id)); - - $debits = ( - self::$marketplace->debits->query() - ->filter(Debit::$f->meta->tag->eq('2')) - ->all()); - $debit_ids = array_map($getId, $debits); - $this->assertEquals($debit_ids, array($debit3->id)); - - $debits = ( - self::$marketplace->debits->query() - ->filter(Debit::$f->meta->contains('tag')) - ->sort(Debit::$f->created_at->asc()) - ->all()); - $debit_ids = array_map($getId, $debits); - $this->assertEquals($debit_ids, array($debit1->id, $debit2->id, $debit3->id)); - - $debits = ( - self::$marketplace->debits->query() - ->filter(Debit::$f->meta->contains('tag')) - ->sort(Debit::$f->amount->desc()) - ->all()); - $debit_ids = array_map($getId, $debits); - $this->assertEquals($debit_ids, array($debit2->id, $debit3->id, $debit1->id)); - } - - function testMerchantIdentityFailure() - { - // NOTE: postal_code == '99999' && region == 'EX' triggers identity failure - $identity = array( - 'type' => 'business', - 'name' => 'Levain Bakery', - 'tax_id' => '253912384', - 'street_address' => '167 West 74th Street', - 'postal_code' => '99999', - 'region' => 'EX', - 'phone_number' => '+16505551234', - 'country_code' => 'USA', - 'person' => array( - 'name' => 'William James', - 'tax_id' => '393483992', - 'street_address' => '167 West 74th Street', - 'postal_code' => '99999', - 'region' => 'EX', - 'dob' => '1842-01-01', - 'phone_number' => '+16505551234', - 'country_code' => 'USA', - ), - ); - - try { - self::$marketplace->createMerchant( - sprintf('m+%d@poundpay.com', self::$email_counter++), - $identity); - } - catch(\RESTful\Exceptions\HTTPError $e) { - $this->assertEquals($e->response->code, 300); - $expected = sprintf('https://www.balancedpayments.com/marketplaces/%s/kyc', self::$marketplace->id); - $this->assertEquals($e->redirect_uri, $expected); - $this->assertEquals($e->response->headers['Location'], $expected); - return; - } - $this->fail('Expected exception HTTPError not raised.'); - } - - function testInternationalCard() - { - $payload = array( - 'card_number' => '4111111111111111', - 'city' => '\xe9\x83\xbd\xe7\x95\x99\xe5\xb8\x82', - 'country_code' => 'JPN', - 'expiration_month' => 12, - 'expiration_year' => 2014, - 'name' => 'Johnny Fresh', - 'postal_code' => '4020054', - 'street_address' => '\xe7\x94\xb0\xe5\x8e\x9f\xef\xbc\x93\xe3\x83\xbc\xef\xbc\x98\xe3\x83\xbc\xef\xbc\x91' - ); - $card = self::$marketplace->cards->create($payload); - $this->assertEquals($card->street_address, $payload['street_address']); - } - - /** - * @expectedException \RESTful\Exceptions\NoResultFound - */ - function testAccountWithEmailAddressNotFound() - { - self::$marketplace->accounts->query() - ->filter(Account::$f->email_address->eq('unlikely@address.com')) - ->one(); - } - - function testDebitACard() - { - $buyer = self::_createBuyer(); - $card = self::_createCard($buyer); - $debit = $card->debit( - 1000, - 'Softie', - 'something i bought', - array('hi' => 'bye')); - $this->assertEquals($debit->source->uri, $card->uri); - } - - /** - * @expectedException \UnexpectedValueException - */ - function testDebitAnUnassociatedCard() - { - $card = self::_createCard(); - $card->debit(1000, 'Softie'); - } - - function testCreditABankAccount() - { - $buyer = self::_createBuyer(); - $buyer->debit(101); # NOTE: build up escrow balance to credit - - $merchant = self::_createPersonMerchant(); - $bank_account = self::_createBankAccount($merchant); - $credit = $bank_account->credit(55, 'something sour'); - $this->assertEquals($credit->destination->uri, $bank_account->uri); - } - - function testQuery() - { - $buyer = self::_createBuyer(); - $tag = '123123123123'; - $debit1 = $buyer->debit(1122, null, null, array('tag' => $tag)); - $debit2 = $buyer->debit(3322, null, null, array('tag' => $tag)); - $debit3 = $buyer->debit(2211, null, null, array('tag' => $tag)); - $expected_debit_ids = array($debit1->id, $debit2->id, $debit3->id); - - $query = ( - self::$marketplace->debits->query() - ->filter(Debit::$f->meta->tag->eq($tag)) - ->sort(Debit::$f->created_at->asc()) - ->limit(1)); - - $this->assertEquals($query->total(), 3); - - $debit_ids = array(); - foreach ($query as $debits) { - array_push($debit_ids, $debits->id); - } - $this->assertEquals($debit_ids, $expected_debit_ids); - - $debit_ids = array($query[0]->id, $query[1]->id, $query[2]->id); - $this->assertEquals($debit_ids, $expected_debit_ids); - } - - function testBuyerPromoteToMerchant() - { - $merchant = array( - 'type' => 'person', - 'name' => 'William James', - 'tax_id' => '393-48-3992', - 'street_address' => '167 West 74th Street', - 'postal_code' => '10023', - 'dob' => '1842-01-01', - 'phone_number' => '+16505551234', - 'country_code' => 'USA' - ); - $buyer = self::_createBuyer(); - $buyer->promoteToMerchant($merchant); - } - - function testCreditAccountlessBankAccount() - { - $buyer = self::_createBuyer(); - $buyer->debit(101); # NOTE: build up escrow balance to credit - - $bank_account = self::_createBankAccount(); - $credit = $bank_account->credit(55, 'something sour'); - $this->assertEquals($credit->bank_account->id, $bank_account->id); - $bank_account = $bank_account->get($bank_account->id); - $this->assertEquals($bank_account->credits->total(), 1); - } - - function testCreditUnstoredBankAccount() - { - $buyer = self::_createBuyer(); - $buyer->debit(101); # NOTE: build up escrow balance to credit - - $credit = Credit::bankAccount( - 55, - array( - 'name' => 'Homer Jay', - 'account_number' => '112233a', - 'routing_number' => '121042882', - 'type' => 'checking', - ), - 'something sour'); - $this->assertFalse(property_exists($credit->bank_account, 'uri')); - $this->assertFalse(property_exists($credit->bank_account, 'id')); - $this->assertEquals($credit->bank_account->name, 'Homer Jay'); - $this->assertEquals($credit->bank_account->account_number, 'xxx233a'); - $this->assertEquals($credit->bank_account->type, 'checking'); - } - - function testDeleteBankAccount() - { - $buyer = self::_createBuyer(); - $buyer->debit(101); # NOTE: build up escrow balance to credit - - $bank_account = self::_createBankAccount(); - $credit = $bank_account->credit(55, 'something sour'); - $this->assertTrue(property_exists($credit->bank_account, 'uri')); - $this->assertTrue(property_exists($credit->bank_account, 'id')); - $bank_account = BankAccount::get($bank_account->id); - $bank_account->delete(); - $credit = Credit::get($credit->uri); - $this->assertFalse(property_exists($credit->bank_account, 'uri')); - $this->assertFalse(property_exists($credit->bank_account, 'id')); - } - - function testGetBankAccounById() - { - $bank_account = self::_createBankAccount(); - $bank_account_2 = BankAccount::get($bank_account->id); - $this->assertEquals($bank_account_2->id, $bank_account->id); - } - - /** - * @expectedException \Balanced\Errors\InsufficientFunds - */ - function testInsufficientFunds() - { - $marketplace = Marketplace::get(self::$marketplace->uri); - $amount = $marketplace->in_escrow + 100; - $credit = Credit::bankAccount( - $amount, - array( - 'name' => 'Homer Jay', - 'account_number' => '112233a', - 'routing_number' => '121042882', - 'type' => 'checking', - ), - 'something sour'); - } - - function testCreateCallback() { - $callback = self::$marketplace->createCallback( - 'http://example.com/php' - ); - $this->assertEquals($callback->url, 'http://example.com/php'); - } - - /** - * @expectedException \Balanced\Errors\BankAccountVerificationFailure - */ - function testBankAccountVerificationFailure() { - $bank_account = self::_createBankAccount(); - $buyer = self::_createBuyer(); - $buyer->addBankAccount($bank_account); - $verification = $bank_account->verify(); - $verification->confirm(1, 2); - } - - /** - * @expectedException \Balanced\Errors\BankAccountVerificationFailure - */ - function testBankAccountVerificationDuplicate() { - $bank_account = self::_createBankAccount(); - $buyer = self::_createBuyer(); - $buyer->addBankAccount($bank_account); - $bank_account->verify(); - $bank_account->verify(); - } - - function testBankAccountVerificationSuccess() { - $bank_account = self::_createBankAccount(); - $buyer = self::_createBuyer(); - $buyer->addBankAccount($bank_account); - $verification = $bank_account->verify(); - $verification->confirm(1, 1); - - // this will fail if the bank account is not verified - $debit = $buyer->debit( - 1000, - 'Softie', - 'something i bought', - array('hi' => 'bye'), - $bank_account - ); - $this->assertTrue(strpos($debit->source->uri, 'bank_account') > 0); - } - - function testEvents() { - $prev_num_events = Marketplace::mine()->events->total(); - $account = self::_createBuyer(); - $account->debit(123); - $cur_num_events = Marketplace::mine()->events->total(); - $count = 0; - while ($cur_num_events == $prev_num_events && $count < 10) { - printf("waiting for events - %d, %d == %d\n", $count + 1, $cur_num_events, $prev_num_events); - sleep(2); // 2 seconds - $cur_num_events = Marketplace::mine()->events->total(); - $count += 1; - } - $this->assertTrue($cur_num_events > $prev_num_events); - } -} diff --git a/externals/balanced-php/tests/phpunit.xml b/externals/balanced-php/tests/phpunit.xml deleted file mode 100644 index 2f42baf208..0000000000 --- a/externals/balanced-php/tests/phpunit.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - . - - - - - diff --git a/externals/cldr/cldr_windows_timezones.xml b/externals/cldr/cldr_windows_timezones.xml new file mode 100644 index 0000000000..47b689d8af --- /dev/null +++ b/externals/cldr/cldr_windows_timezones.xml @@ -0,0 +1,769 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/externals/cowsay/ChangeLog b/externals/cowsay/ChangeLog new file mode 100644 index 0000000000..b28ef91b85 --- /dev/null +++ b/externals/cowsay/ChangeLog @@ -0,0 +1,31 @@ +3.03 28 May 1999 + - Added cows/tux.cow, as suggested by xmanoel@i.am + - Compatibility with 5.6.0, due to a change in qw(). + - Renamed devil.cow to daemon.cow, since I know better. :-) + +3.02 04 November 1999 + - Fixed boneheaded code placement so that cowsay -l actually works. + +3.01 01 November 1999 + - Fixed compatibility issues between the Text::Wrap module + that changed between 5.005_02 and 5.005_03. + - Fixed tab expansion issues with Text::Tabs. + +3.0 13 April 1999, released 14 August 1999 + - Rewritten into Perl 5 and presented to the world. + +-- Not present in CVS from here on down -- + +2.x Date? + - Arbitrary messages. + - Figlet support (-n). + - Line wrap length (-w). + - Multiple pre-set expressions. + - Better arg parsing loop. + - Message from stdin or command line. + +1.0 Date? + - SUBJECT is VERB OBJECT + +$Id: ChangeLog,v 1.4 2000/05/29 17:55:24 tony Exp $ +This file is part of cowsay. (c) 1999-2000 Tony Monroe. diff --git a/externals/cowsay/INSTALL b/externals/cowsay/INSTALL new file mode 100644 index 0000000000..d3844ca565 --- /dev/null +++ b/externals/cowsay/INSTALL @@ -0,0 +1,15 @@ +================= +Installing cowsay +================= + +If you really want to get things installed a nice and pretty way, + + sh install.sh + +It will ask approximately one question. If you can't answer it, +you need serious help. + +If the install goes well, you can start cowing immediately! Just +be sure to read the manual page first... + +$Id: INSTALL,v 1.1 1999/08/14 08:03:17 tony Exp $ diff --git a/externals/cowsay/LICENSE b/externals/cowsay/LICENSE new file mode 100644 index 0000000000..944770492d --- /dev/null +++ b/externals/cowsay/LICENSE @@ -0,0 +1,36 @@ +============== +cowsay License +============== + +cowsay is distributed under the same licensing terms as Perl: the +Artistic License or the GNU General Public License. If you don't +want to track down these licenses and read them for yourself, use +the parts that I'd prefer: + +(0) I wrote it and you didn't. + +(1) Give credit where credit is due if you borrow the code for some +other purpose. + +(2) If you have any bugfixes or suggestions, please notify me so +that I may incorporate them. + +(3) If you try to make money off of cowsay, you suck. + +=============== +cowsay Legalese +=============== + +(0) Copyright (c) 1999 Tony Monroe. All rights reserved. All +lefts may or may not be reversed at my discretion. + +(1) This software package can be freely redistributed or modified +under the terms described above in the "cowsay License" section +of this file. + +(2) cowsay is provided "as is," with no warranties whatsoever, +expressed or implied. If you want some implied warranty about +merchantability and/or fitness for a particular purpose, you will +not find it here, because there is no such thing here. + +(3) I hate legalese. diff --git a/externals/cowsay/MANIFEST b/externals/cowsay/MANIFEST new file mode 100644 index 0000000000..a3ff805fed --- /dev/null +++ b/externals/cowsay/MANIFEST @@ -0,0 +1,11 @@ +ChangeLog Changes to recent versions. +INSTALL Instructions for installing cowsay. +LICENSE The license for use and redistribution of cowsay. +MANIFEST This file. +README Read this first. Really. +Wrap.pm.diff Diff for Text/Wrap.pm. +cows/* Support files used by cowsay. +cowsay Main cowsay executable. +cowsay.1 Main cowsay manual page. +install.sh cowsay installation script. +pgp_public_key.txt Verify the signature file with this key. diff --git a/externals/cowsay/README b/externals/cowsay/README new file mode 100644 index 0000000000..b5de08c405 --- /dev/null +++ b/externals/cowsay/README @@ -0,0 +1,38 @@ +=========== +cowsay 3.03 +=========== + +cowsay is a configurable talking cow, written in Perl. It operates +much as the figlet program does, and it written in the same spirit +of silliness. + +cowsay is actually a pretty old program. It has not really been +released before, and I am releasing it in the hope that someone +other than myself will be amused by it. + +The first major version of cowsay had one cow and one message +template: $foo is $verb $bar. Not very flexible, but people managed +to do pretty interesting things with it. The second major version +scrapped many of the limitations of the first, by allowing arbitrary +messages, multiple cowfiles, and even support for cows talking in +figlet. The third version was a rewrite of the second into Perl +5, whereupon the code got a lot smaller and more manageable. :-) + +If you are using Perl 5.004, you may have problems with Text::Wrap. +(Yeesh, this module changes more than it should...) I've included +a diff for the Text::Wrap (version 97.011701) that is shipped with +5.004_04; the concept is simple enough that even older Perls can +take advantage of this silly little patch; if there is a "sub fill" +in the documentation for the module, copy it to a more useful +section of that file. If not, just take "sub fill" wholesale from +the patch. Oh, and consider upgrading to 5.005_03 or later. +Please. You'll like it, I promise. + +To install cowsay, consult the INSTALL file in this directory. + +For the terms and conditions of use, consult the LICENSE file in +this directory. + +-- Tony Monroe (tony@nog.net) + +$Id: README,v 1.3 2000/05/28 06:24:46 tony Exp $ diff --git a/externals/cowsay/Wrap.pm.diff b/externals/cowsay/Wrap.pm.diff new file mode 100644 index 0000000000..1da064079e --- /dev/null +++ b/externals/cowsay/Wrap.pm.diff @@ -0,0 +1,47 @@ +*** Wrap.pm.in Thu May 22 00:21:42 1997 +--- Wrap.pm Fri Nov 12 10:00:15 1999 +*************** +*** 3,9 **** + require Exporter; + + @ISA = (Exporter); +! @EXPORT = qw(wrap); + @EXPORT_OK = qw($columns); + + $VERSION = 97.011701; +--- 3,9 ---- + require Exporter; + + @ISA = (Exporter); +! @EXPORT = qw(wrap fill); + @EXPORT_OK = qw($columns); + + $VERSION = 97.011701; +*************** +*** 66,71 **** +--- 66,90 ---- + + print "-----------$r---------\n" if $debug;; + return $r; ++ } ++ ++ ## Copied up from below. ++ sub fill ++ { ++ my ($ip, $xp, @raw) = @_; ++ my @para; ++ my $pp; ++ ++ for $pp (split(/\n\s+/, join("\n",@raw))) { ++ $pp =~ s/\s+/ /g; ++ my $x = wrap($ip, $xp, $pp); ++ push(@para, $x); ++ } ++ ++ # if paragraph_indent is the same as line_indent, ++ # separate paragraphs with blank lines ++ ++ return join ($ip eq $xp ? "\n\n" : "\n", @para); + } + + 1; diff --git a/externals/cowsay/cows/bunny.cow b/externals/cowsay/cows/bunny.cow new file mode 100644 index 0000000000..869933f72a --- /dev/null +++ b/externals/cowsay/cows/bunny.cow @@ -0,0 +1,10 @@ +## +## A cute little wabbit +## +$the_cow = <> 5.4 +## +$the_cow = < \\ _ -~ `. ^-` ^-_ + ///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~ + /.-~ +EOC diff --git a/externals/cowsay/cows/elephant.cow b/externals/cowsay/cows/elephant.cow new file mode 100644 index 0000000000..959cd3f6dd --- /dev/null +++ b/externals/cowsay/cows/elephant.cow @@ -0,0 +1,15 @@ +## +## An elephant out and about +## +$the_cow = < < > .---. + $thoughts | \\ \\ - ~ ~ - / / | + _____ ..-~ ~-..-~ + | | \\~~~\\.' `./~~~/ + --------- \\__/ \\__/ + .' O \\ / / \\ " + (_____, `._.' | } \\/~~~/ + `----. / } | / \\__/ + `-. | / | / `. ,~~| + ~-.__| /_ - ~ ^| /- _ `..-' + | / | / ~-. `-. _ _ _ + |_____| |_____| ~ - . _ _ _ _ _> +EOC diff --git a/externals/cowsay/cows/supermilker.cow b/externals/cowsay/cows/supermilker.cow new file mode 100644 index 0000000000..1424f9e668 --- /dev/null +++ b/externals/cowsay/cows/supermilker.cow @@ -0,0 +1,10 @@ +## +## A cow being milked, probably from Lars Smith (lars@csua.berkeley.edu) +## +$the_cow = <____) >___ ^\\_\\_\\_\\_\\_\\_\\) + ^^^//\\\\_^^//\\\\_^ ^(\\_\\_\\_\\) + ^^^ ^^ ^^^ ^ +EOC diff --git a/externals/cowsay/cows/turtle.cow b/externals/cowsay/cows/turtle.cow new file mode 100644 index 0000000000..4286b0948a --- /dev/null +++ b/externals/cowsay/cows/turtle.cow @@ -0,0 +1,20 @@ +## +## A mysterious turtle... +## +$the_cow = < 'oo', + 'f' => 'default.cow', + 'n' => 0, + 'T' => ' ', + 'W' => 40, +); + +getopts('bde:f:ghlLnNpstT:wW:y', \%opts); + +&display_usage if $opts{'h'}; +&list_cowfiles if $opts{'l'}; + +$borg = $opts{'b'}; +$dead = $opts{'d'}; +$greedy = $opts{'g'}; +$paranoid = $opts{'p'}; +$stoned = $opts{'s'}; +$tired = $opts{'t'}; +$wired = $opts{'w'}; +$young = $opts{'y'}; +$eyes = substr($opts{'e'}, 0, 2); +$tongue = substr($opts{'T'}, 0, 2); +$the_cow = ""; + +&slurp_input; +$Text::Wrap::columns = $opts{'W'}; +@message = ($opts{'n'} ? expand(@message) : + split("\n", fill("", "", @message))); +&construct_balloon; +&construct_face; +&get_cow; +print @balloon_lines; +print $the_cow; + +sub list_cowfiles { + my $basedir; + my @dirfiles; + chop($basedir = cwd); + for my $d (split(/$pathsep/, $cowpath)) { + print "Cow files in $d:\n"; + opendir(COWDIR, $d) || die "$0: Cannot open $d\n"; + for my $file (readdir COWDIR) { + if ($file =~ s/\.cow$//) { + push(@dirfiles, $file); + } + } + closedir(COWDIR); + print wrap("", "", sort @dirfiles), "\n"; + @dirfiles = (); + chdir($basedir); + } + exit(0); +} + +sub slurp_input { + unless ($ARGV[0]) { + chomp(@message = ); + } else { + &display_usage if $opts{'n'}; + @message = join(' ', @ARGV); + } +} + +sub maxlength { + my ($l, $m); + $m = -1; + for my $i (@_) { + $l = length $i; + $m = $l if ($l > $m); + } + return $m; +} + +sub construct_balloon { + my $max = &maxlength(@message); + my $max2 = $max + 2; ## border space fudge. + my $format = "%s %-${max}s %s\n"; + my @border; ## up-left, up-right, down-left, down-right, left, right + if ($0 =~ /think/i) { + $thoughts = 'o'; + @border = qw[ ( ) ( ) ( ) ]; + } elsif (@message < 2) { + $thoughts = '\\'; + @border = qw[ < > ]; + } else { + $thoughts = '\\'; + if ($V and $V gt v5.6.0) { # Thanks, perldelta. + @border = qw[ / \\ \\ / | | ]; + } else { + @border = qw[ / \ \ / | | ]; + } + } + push(@balloon_lines, + " " . ("_" x $max2) . " \n" , + sprintf($format, $border[0], $message[0], $border[1]), + (@message < 2 ? "" : + map { sprintf($format, $border[4], $_, $border[5]) } + @message[1 .. $#message - 1]), + (@message < 2 ? "" : + sprintf($format, $border[2], $message[$#message], $border[3])), + " " . ("-" x $max2) . " \n" + ); +} + +sub construct_face { + if ($borg) { $eyes = "=="; } + if ($dead) { $eyes = "xx"; $tongue = "U "; } + if ($greedy) { $eyes = "\$\$"; } + if ($paranoid) { $eyes = "@@"; } + if ($stoned) { $eyes = "**"; $tongue = "U "; } + if ($tired) { $eyes = "--"; } + if ($wired) { $eyes = "OO"; } + if ($young) { $eyes = ".."; } +} + +sub get_cow { +## +## Get a cow from the specified cowfile; otherwise use the default cow +## which was defined above in $the_cow. +## + my $f = $opts{'f'}; + my $full = ""; + if ($opts{'f'} =~ m,/,) { + $full = $opts{'f'}; + } else { + for my $d (split(/:/, $cowpath)) { + if (-f "$d/$f") { + $full = "$d/$f"; + last; + } elsif (-f "$d/$f.cow") { + $full = "$d/$f.cow"; + last; + } + } + if ($full eq "") { + die "$progname: Could not find $f cowfile!\n"; + } + } + do $full; + die "$progname: $@\n" if $@; +} + +sub display_usage { + die </dev/null 2>&1; then + echo Found a good perl in $perl + goodperls="$goodperls $perl" + fi +done +echo The following perl executables will run cowsay: +echo $goodperls +echo I recommend the latest stable perl you can find. +set $goodperls +if [ -z "$1" ]; then + echo Ack! You do not have Perl 5 installed correctly! + echo Get thee to CPAN! + exit 1 +fi +usethisperl=$1 +echo I will be using $1 because I know it will work. + +echo Now I need an installation prefix. I will use /usr/local unless +printf "you give me a better idea here: " +if [ -n "$backdoor" ]; then + prefix=$backdoor + printf "%s (specified on command line)\n" $prefix +else + read prefix +fi + +PREFIX=${prefix:-/usr/local} + +echo Okay, time to install this puppy. + +echo s,%BANGPERL%,!$usethisperl,\; > install.pl +echo s,%PREFIX%,$PREFIX,\; >> install.pl +set -x +mkdir -p $PREFIX/bin || (mkdir $PREFIX; mkdir $PREFIX/bin) +$usethisperl -p install.pl cowsay > $PREFIX/bin/cowsay +chmod a+x $PREFIX/bin/cowsay +ln -s cowsay $PREFIX/bin/cowthink +mkdir -p $PREFIX/man/man1 || ($mkdir $PREFIX; mkdir $PREFIX/man; mkdir $PREFIX/man/man1) +$usethisperl -p install.pl cowsay.1 > $PREFIX/man/man1/cowsay.1 +chmod a+r $PREFIX/man/man1/cowsay.1 +ln -s cowsay.1 $PREFIX/man/man1/cowthink.1 +mkdir -p $PREFIX/share/cows || (mkdir $PREFIX; mkdir $PREFIX/share; mkdir $PREFIX/share/cows) +tar -cf - $filelist | (cd $PREFIX/share && tar -xvf -) +set +x + +echo Okay, let us see if the install actually worked. + +if [ ! -f $PREFIX/share/cows/default.cow ]; then + echo The default cow file did not make it across! + echo Ooops, it failed...sorry! + exit 1 +fi + +echo Installation complete! Enjoy the cows! diff --git a/externals/cowsay/pgp_public_key.txt b/externals/cowsay/pgp_public_key.txt new file mode 100644 index 0000000000..135735e6f9 --- /dev/null +++ b/externals/cowsay/pgp_public_key.txt @@ -0,0 +1,14 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: 2.6.2 + +mQCNAzNS+H4AAAEEAMilCcxLMIqMNXhZoeHjbeJGnHoKP0JpKDejz66qBlDwP+du +FvVBHkyNIuU3orKe7l/aXIR8TcpjrxdcmrjjzwuB1aV48V4swT7v9UXvv9YP41Pd +1pXYXNelXHmE0eKSfcnkkFmYTJBXPaPNTJ3rpZpZOEW3SfgrrheqQm6w/6IJAAUR +tBpUb255IE1vbnJvZSA8dG9ueUBub2cubmV0PrQdVG9ueSBNb25yb2UgPHRtb25y +b2VAbm9nLm5ldD6JAJUDBRA2bDA5F6pCbrD/ogkBASOZA/9XtYSpcPjpi62MTEZl +l+wV1svtlUlPvKkDE7FB9bwnMbF1FgGhTe/H4/8qDu20m5eGxMX58Ri7HPXWjjJ/ +CrUWMzGVbg1JBkgh+d9QvEywmR0j4WezaifW1nCbxk0GrW1PjJyGb3kx7vrIF1Km +xt6VwxTgfJzjIioBJFb4EiDyaLQnVG9ueSBNb25yb2UgPHRtb25yb2VAQ1NVQS5C +ZXJrZWxleS5FRFU+ +=WpM4 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/externals/figlet/.gitignore b/externals/figlet/.gitignore new file mode 100644 index 0000000000..dc65b3c3eb --- /dev/null +++ b/externals/figlet/.gitignore @@ -0,0 +1,8 @@ +chkfont +figlet +tags +*.o +core +*~ +tests.log +*.tar.gz diff --git a/externals/figlet/CHANGES b/externals/figlet/CHANGES new file mode 100644 index 0000000000..4f2d6e9edb --- /dev/null +++ b/externals/figlet/CHANGES @@ -0,0 +1,205 @@ +Changes in FIGlet 2.2.5 +----------------------- + +FIGlet 2.2.5 is a revision of FIGlet 2.2.4 containing updated andproperly +licensed ISO8859 map files. The full list of changes is: + +o Add regression tests for uskata and jis0201 control files + +o Properly escape minus signs in figlist(6) man page (Jonathan + McCrohan) + +o Fix chkfont coredump on invalid input (Kenneth Davies and + Jonathan McCrohan) + +o Update ISO8859 map files to fix licensing issue raised in Debian + bugs 673096 and 674844 + +o Re-add missing figmagic and getopt.c files which were left out + of releases 2.2.3 and 2.2.4 + +o Fix output of test script in MacOS X + +These changes were made by Claudio Matsuoka +31 May 2012 + +Changes in FIGlet 2.2.4 +----------------------- + +FIGlet 2.2.4 is a revision of FIGlet 2.2.3 featuring bugfixes and support +to tlf2 fonts. The full list of changes is: + +o Add support to Sam Hocevar's TOIlet TLF fonts containing UTF-8 + encoded Unicode characters. + +o Add infocode 5 to list supported font formats + +o Fix rendering error caused by the previous attempt to fix invalid + memory accesses when smushing at start of line + +o New environment variable FIGLET_FONTDIR can be used to specify + the path to search for fonts + +o Add regression tests + +These changes were made by Claudio Matsuoka +26 January 2011 + +Changes in FIGlet 2.2.3 +----------------------- + +FIGlet 2.2.3 is a revision of FIGlet 2.2.2 featuring minor bugfixes and +important licensing changes in the zipio files. The full list of +changes is: + +o License changed from "Academic Free License" to "New BSD License" + (3-clause) as agreed by FIGlet authors + +o New JIS X 0201 control file (Micah Cowan) + +o Fix behavior of JIS0201 SHIFT-OUT and SHIFT-IN that were previouly + inverted (Micah Cowan) + +o Fix memory violation when smushing at line start + +o Fix handling of memory allocation errors + +o Relicense Ed Hamrick zipio under the MIT license. This should + eliminate any concerns about redistribution of FIGlet as libre + software. + +o Update Makefile to meet modern standards in variable naming, using + BINDIR as the pathname for binary files and reservind DESTDIR + as the extra prefix commonly used in package building. + +o Add a Turbo C makefile, just because I had the compiler. (this + also tests portability to old compilers and foreign platforms) + +o Add Jonathon Abbott's man pages for figlist, showfigfonts and + chkfont originally contributed to the Debian Project + +These changes were made by Claudio Matsuoka +12 January 2011 + +Changes in FIGlet 2.2.2 +----------------------- + +License changed from "Artistic License" to "Academic Free +License" as agreed by FIGlet authors. 05 July 2005 + +Changes in FIGlet 2.2.1 +----------------------- + +FIGlet 2.2.1 is a minor revision of FIGlet 2.2. The files +README, Makefile, figfont.txt, figlet.c and figlet.6 have been +changed to reflect changes in documentation, official contact +details etc. FTP-NOTE merged into README. FAQ and CHANGES +added to the distribution. + +All other files are identical with the 2.2 release. + +These changes were made by Christiaan Keet + +Changes in FIGlet 2.2 +--------------------- + +FIGlet 2.2 is a moderate revision of FIGlet 2.1.2. The new features are: + +o font files and control files can be compressed using ``zip'', and + will be automatically decompressed + +o new commands in controlfiles provide support for + single-byte (default), double-byte, HZ, Shift-JIS, and Unicode + UTF-8 encodings of the input + +o ISO 2022 escape sequences are decoded and interpreted + +o control files can now have the format of Unicode Consortium + mapping tables (two columns of numbers representing + input character and output character, no ranges, # comments) + +o new options -s (smush, same as -m-2), -k (kern, same as -m0), + -S (forced smushing), and -W (full width, same as -m-1) make + -m option unnecessary except for font designers. The -S option + works even if the font's smushmode is 0 or -1, in which case + the smushmode is read from a new parameter in the + font's first line, or does universal overlapping if no such parameter + exists + +o universal smushing (-o option to force it, but -S will use it + if no smush rules are available) makes FIGcharacters overlap by + one place independent of how they are constructed + more fonts smushable. + +o file "figmagic" can be appended to your system magic number + file to make the "file" command recognize FIGlet files + +o file "figfont.txt" is an implementation-independent specification + for FIGlet fonts and control files + +o integrated support for extended characters (extended Latin in + "standard", Greek in "big", katakana in "banner", Hebrew in new + "ivrit" fonts) with appropriate controlfiles + +o smushing rule 16 has changed slightly: "/\" now smushes + into "|" and "\/" smushes into "Y"; "><" still smushes + into "X" and "<>" is still not smushed at all. + +o -A option introduced in FIGlet 2.1.2 is now optional; + if any words appear on the command line after the options, + they are formatted, and the standard input is not read. + +These changes were made by John Cowan . + +Changes in FIGlet 2.1.2 +------------------------ + +FIGlet 2.1.2 is a minor revision of FIGlet 2.1.1. The files +README, FTP-NOTE, figlet.c and figlet.6 have been changed. All other +files are identical with the 2.1.1 release. + +o The only new option is -A, which causes FIGlet to read input + from the command line. + +These changes were made by Gilbert Healton as Glenn +Chappell is now busy as a new professor of Mathematics. + +Changes in FIGlet 2.1 +---------------------- + +A number of minor bugs and major incompatibility problems have been +fixed. FIGlet 2.1 should compile correctly on many operating systems for +which FIGlet 2.0 did not. + +o The "-F" command line option, which used to list all the available + fonts, has been removed, since it made FIGlet incompatible with some + operating systems. It has been replaced by the "figlist" script. The + "showfigfonts" script has been updated so that it no longer requires + the "-F" option to be available. + +o The FIGlet font file format has been extended to allow an arbitrarily + large number of characters. The ISO Latin-1 character set, which + includes many accented letters and special symbols, has been added to + most standard fonts. + +o FIGlet can now print right-to-left. This can be specified on the + command line ("-R") or in the font file. Thus, for example, Hebrew and + Arabic fonts can be handled more easily. + +o FIGlet can now right justify its output. This is the default when + right-to-left printing is selected. It can also be specified on the + command line ("-r"). + +o FIGlet now supports "control files". These can be used to change which + character FIGlet will print when it sees a certain input character -- + sort of an expanded version of the "-D" option. For example, a control + file could convert lower-case letters to upper-case or map certain + ASCII characters to accented letters. Control file names end with the + suffix ".flc". Select a control file by using "-C controlfile" on the + command line. Several controlfiles can be used at once by giving + muliple "-C" options. + +o There is now a way for programs that use FIGlet to get various + information from FIGlet, for example, what version of FIGlet is being + used or the name of the default font directory. This information is + gotten through the "-I" option. See the man page for details. diff --git a/externals/figlet/FAQ b/externals/figlet/FAQ new file mode 100644 index 0000000000..8e8ca43163 --- /dev/null +++ b/externals/figlet/FAQ @@ -0,0 +1,63 @@ + _____ _____ _____ __ __ _____ _____ _____ +| __| | __| |____| |_ | __| _ | | This FIGlet FAQ is +| __|- -| | | | - _| _| | __| | | | posted once a month +|__| |_____|_____|__|____|__| |__| |__|__|__ _| on figlet@figlet.org + info@figlet.org http://www.figlet.org/ |__| [FIGlet FAQ v0.91] + +=========================================================================== +The latest version of FIGlet is 2.2.5 and can be downloaded from +ftp://ftp.figlet.org/pub/figlet/program +=========================================================================== + +1 What is FIGlet? +2 Where can I get FIGlet from? +3 Where can I get more fonts for FIGlet? +4 Where can I hear about regular FIGlet program and font updates? +5 How can I contribute? +6 Why am I getting this mail and can you make it stop? +7 Where does the name FIGlet come from? + +=========================================================================== + +1. What is FIGlet? + FIGlet is a program for making large letters out of ordinary text + _ _ _ _ _ _ + | (_) | _____ | |_| |__ (_)___ + | | | |/ / _ \ | __| '_ \| / __| + | | | < __/ | |_| | | | \__ \ + |_|_|_|\_\___| \__|_| |_|_|___/ + +2. Where can I get FIGlet from? + From the official FIGlet website at http://www.figlet.org/ + or from the FIGlet FTP site at ftp://ftp.figlet.org/pub/figlet/ + +3. Where can I get more fonts for FIGlet? + From the FTP site at ftp://ftp.figlet.org/pub/figlet/fonts/ + There are currently over 400 fonts available for download + +4 Where can I hear about regular FIGlet program and font updates? + There is a mailing list for FIGlet for general discussions about + FIGlet and a place where you can ask questions or share ideas + with other FIGlet users. It is also the place where we will publish + news about new fonts, new software updates etc. + + To subscribe or unsubscribe from the FIGlet mailing list, + please send email to figlet-subscribe@figlet.org or visit the + following web page: http://www.figlet.org/mailman/listinfo/figlet + +5. How can I contribute? + To contribute new fonts, software or information, please contact + us at info@figlet.org + +6. Why am I getting this mail and can you make it stop? + If you received this email it is probably because you are subscribed + to the FIGlet mailing list. Please see Question 4 of this FAQ on how + to unsubscribe from the FIGlet list. + +7. Where does the name FIGlet come from? + "Frank, Ian and Glen's letters" + + += FAQ Maintainer ========================================================== +Christiaan Keet keet@plig.net July 2005 +=========================================================================== diff --git a/externals/figlet/LICENSE b/externals/figlet/LICENSE new file mode 100644 index 0000000000..a841aeaa0a --- /dev/null +++ b/externals/figlet/LICENSE @@ -0,0 +1,30 @@ +Copyright (C) 1991, 1993, 1994 Glenn Chappell and Ian Chai +Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 John Cowan +Copyright (C) 2002 Christiaan Keet +Copyright (C) 2011 Claudio Matsuoka +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/externals/figlet/Makefile b/externals/figlet/Makefile new file mode 100644 index 0000000000..e92bcaf582 --- /dev/null +++ b/externals/figlet/Makefile @@ -0,0 +1,122 @@ +# Makefile for figlet version 2.2.4 (26 Jan 2011) +# adapted from Makefile for figlet version 2.2.2 (05 July 2005) +# adapted from Makefile for figlet version 2.2 (15 Oct 1996) +# Copyright 1993, 1994,1995 Glenn Chappell and Ian Chai +# Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan +# Copyright 2002 Christiaan Keet +# Copyright 2011 Claudio Matsuoka + +# Please notice that to follow modern standards and ease third-party +# package creation, binaries are now installed under BINDIR, and DESTDIR +# is reserved for the installation pathname prefix. +# +# Please make sure BINDIR, MANDIR, DEFAULTFONTDIR and +# DEFAULTFONTFILE are defined to reflect the situation +# on your computer. See README for details. + +# Don't change this even if your shell is different. The only reason +# for changing this is if sh is not in the same place. +SHELL = /bin/sh + +# The C compiler and linker to use +CC = gcc +CFLAGS = -g -O2 -Wall -Wno-unused-value +LD = gcc +LDFLAGS = + +# Feature flags: +# define TLF_FONTS to use TOIlet TLF fonts +XCFLAGS = -DTLF_FONTS + +# Where to install files +prefix = /usr/local + +# Where the executables should be put +BINDIR = $(prefix)/bin + +# Where the man page should be put +MANDIR = $(prefix)/man + +# Where figlet will search first for fonts (the ".flf" files). +DEFAULTFONTDIR = $(prefix)/share/figlet +# Use this definition if you can't put things in $(prefix)/share/figlet +#DEFAULTFONTDIR = fonts + +# The filename of the font to be used if no other is specified, +# without suffix.(standard is recommended, but any other can be +# used). This font file should reside in the directory specified +# by DEFAULTFONTDIR. +DEFAULTFONTFILE = standard + +## +## END OF CONFIGURATION SECTION +## + +VERSION = 2.2.5 +DIST = figlet-$(VERSION) +OBJS = figlet.o zipio.o crc.o inflate.o utf8.o +BINS = figlet chkfont figlist showfigfonts +MANUAL = figlet.6 chkfont.6 figlist.6 showfigfonts.6 +DFILES = Makefile Makefile.tc $(MANUAL) $(OBJS:.o=.c) chkfont.c getopt.c \ + figlist showfigfonts CHANGES FAQ README LICENSE figfont.txt \ + crc.h inflate.h zipio.h utf8.h run-tests.sh figmagic + +.c.o: + $(CC) -c $(CFLAGS) $(XCFLAGS) -DDEFAULTFONTDIR=\"$(DEFAULTFONTDIR)\" \ + -DDEFAULTFONTFILE=\"$(DEFAULTFONTFILE)\" -o $*.o $< + +all: $(BINS) + +figlet: $(OBJS) + $(LD) $(LDFLAGS) -o $@ $(OBJS) + +chkfont: chkfont.o + $(LD) $(LDFLAGS) -o $@ chkfont.o + +clean: + rm -f *.o *~ core figlet chkfont + +install: all + mkdir -p $(DESTDIR)$(BINDIR) + mkdir -p $(DESTDIR)$(MANDIR)/man6 + mkdir -p $(DESTDIR)$(DEFAULTFONTDIR) + cp $(BINS) $(DESTDIR)$(BINDIR) + cp $(MANUAL) $(DESTDIR)$(MANDIR)/man6 + cp fonts/*.flf $(DESTDIR)$(DEFAULTFONTDIR) + cp fonts/*.flc $(DESTDIR)$(DEFAULTFONTDIR) + +dist: + rm -Rf $(DIST) $(DIST).tar.gz + mkdir $(DIST)/ + cp $(DFILES) $(DIST)/ + mkdir $(DIST)/fonts + cp fonts/*.fl[fc] $(DIST)/fonts + mkdir $(DIST)/tests + cp tests/*txt tests/emboss.tlf $(DIST)/tests + tar cvf - $(DIST) | gzip -9c > $(DIST).tar.gz + rm -Rf $(DIST) + tar xf $(DIST).tar.gz + (cd $(DIST); make all check vercheck) + @rm -Rf $(DIST) + @echo + @ls -l $(DIST).tar.gz + +check: + @echo "Run tests in `pwd`" + @./run-tests.sh fonts + @echo + +vercheck: + @printf "Infocode: "; ./figlet -I1 + @./figlet -v|sed -n '/Version/s/.*\(Version\)/\1/p' + @printf "README: "; head -1 < README|sed 's/.*) //' + @printf "FAQ: "; grep latest FAQ|sed 's/ and can.*//' + @grep -h "^\.TH" *.6 + +$(OBJS) chkfont.o getopt.o: Makefile +chkfont.o: chkfont.c +crc.o: crc.c crc.h +figlet.o: figlet.c zipio.h +getopt.o: getopt.c +inflate.o: inflate.c inflate.h +zipio.o: zipio.c zipio.h inflate.h crc.h diff --git a/externals/figlet/Makefile.tc b/externals/figlet/Makefile.tc new file mode 100644 index 0000000000..435fc580c9 --- /dev/null +++ b/externals/figlet/Makefile.tc @@ -0,0 +1,42 @@ +# Turbo C makefile for figlet +# adapted from Makefile for figlet version 2.3.0 (11 Jan 2011) +# adapted from Makefile for figlet version 2.2.2 (05 July 2005) +# adapted from Makefile for figlet version 2.2 (15 Oct 1996) +# Copyright 1993, 1994,1995 Glenn Chappell and Ian Chai +# Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan +# Copyright 2002 Christiaan Keet +# Copyright 2011 Claudio Matsuoka + +# The C compiler and linker to use +CC = tcc +CFLAGS = -mc -I\tc\include +LD = tcc +LDFLAGS = -mc -L\tc\lib + +# Use this definition if you can't put things in /usr/local/share/figlet +DEFAULTFONTDIR = fonts + +# The filename of the font to be used if no other is specified +# (standard.flf is recommended, but any other can be used). +# This font file should reside in the directory specified by +# DEFAULTFONTDIR. +DEFAULTFONTFILE = standard.flf + +## +## END OF CONFIGURATION SECTION +## + +OBJS = figlet.obj zipio.obj crc.obj inflate.obj getopt.obj +BINS = figlet.exe chkfont.exe + +.c.obj: + $(CC) -c $(CFLAGS) -DDEFAULTFONTDIR="$(DEFAULTFONTDIR)" \ + -DDEFAULTFONTFILE="$(DEFAULTFONTFILE)" -o$*.obj $< + +all: $(BINS) + +figlet.exe: $(OBJS) + $(LD) $(LDFLAGS) -o$@ $(OBJS) + +chkfont.exe: chkfont.obj + $(LD) $(LDFLAGS) -o$@ chkfont.obj diff --git a/externals/figlet/README b/externals/figlet/README new file mode 100644 index 0000000000..f6f2c752d0 --- /dev/null +++ b/externals/figlet/README @@ -0,0 +1,242 @@ +About FIGlet (Frank, Ian & Glenn's Letters) release 2.2.5, 31 May 2012 +-------------------------------------------------------------------------- +FIGlet is a program that creates large characters out of ordinary +screen characters + _ _ _ _ _ _ +| (_) | _____ | |_| |__ (_)___ +| | | |/ / _ \ | __| '_ \| / __| +| | | < __/ | |_| | | | \__ \_ +|_|_|_|\_\___| \__|_| |_|_|___(_) + +(This is meant to be viewed in a monospaced font.) FIGlet can create +characters in many different styles and can kern and "smush" these +characters together in various ways. FIGlet output is generally +reminiscent of the sort of "signatures" many people like to put at the +end of e-mail and UseNet messages. + +If you like FIGlet (hey, even if you *hate* FIGlet), please send an +e-mail message to + +The official FIGlet web page: http://www.figlet.org/ + +Files -- Unix version +--------------------- + +README -- This file. +figlet.c -- The FIGlet source code. +zipio.h, -- A package for reading ZIP archives +zipio.c, +inflate.c, +crc.c +utf8.h, -- A package to convert strings between UTF-8 and UCS-4. +utf8.c +getopt.c -- Source for the standard "getopt" routine, in case you + don't have it in your C library. Not used by default. +Makefile -- The FIGlet makefile. Used by the make command. +figlet.6 -- The FIGlet man(ual) page. +figlist -- Script that lists available fonts and control files. +showfigfonts -- Script that gives a sample of each available font. +chkfont.c -- Source code for chkfont: a program that checks FIGlet + fonts for formatting errors. You can ignore this file + unless you intend to design or edit fonts. +figfont.txt -- Text file that explains the format of FIGlet fonts. + You can ignore this file unless you intend to design + or edit fonts. +fonts -- Directory containing fonts and control files. +.flf -- All files ending in ".flf" are FIGlet font files. +.flc -- All files ending in ".flc" are FIGlet control files. + +Files -- DOS version +-------------------- + +README -- This file +figlet.exe -- The FIGlet program. +figlet.man -- The FIGlet man(ual) page. +showall.bat -- Batch file that lists available fonts and samples of each. +chkfont.exe -- A program that checks FIGlet fonts for formatting errors. + You can ignore this file unless you intend to design + or edit fonts. +figfont.txt -- Text file that explains the format of FIGlet fonts. + You can ignore this file unless you intend to design + or edit fonts. +fonts -- Directory containing fonts and control files. +.flf -- All files ending in ".flf" are FIGlet font files. +.flc -- All files ending in ".flc" are FIGlet control files. + + +Installing FIGlet --- Unix version +---------------------------------- + +First decide in which directories FIGlet and the FIGlet font files +(the ".flf" files) will be stored (we recommend "/usr/games" and +"/usr/games/lib/figlet.dir", respectively) and which will be the +default font (we recommend "standard.flf"). + +Edit "Makefile", and set the variables DEFAULTFONTDIR and +DEFAULTFONTFILE to the appropriate values. Set DEFAULTFONTDIR to be +the full pathname of the directory in which you will keep the FIGlet +font files. Set DEFAULTFONTFILE to be the filename of the default +font. + +At this point, you have two choices: + +(1) Just compile FIGlet. To go this, go into the directory containing +the FIGlet source, and type "make figlet". Then copy the various files +to the proper locations. The executable (figlet), along with figlist +and showfigfonts, goes wherever you keep your executables. The fonts +(.flf) and control files (.flc) go in the default font +directory. The man page (figlet.6) goes in section 6 (usually +/usr/man/man6). If you cannot, or do not want to, install the man page, +you can probably still read it using + + nroff -man figlet.6 | more + +(2) Do a complete installation. To do the this, set the variables +BINDIR and MANDIR in Makefile to the appropriate values. BINDIR +should be the full pathname of the directory in which the executable +files should be put (we recommend "/usr/games"); MANDIR should be the +full pathname of the directory in which the figlet man page should be +put, generally "/usr/man/man6". Once DEFAULTFONTDIR, DEFAULTFONTFILE, +BINDIR and MANDIR have been set, in the directory containing the FIGlet +source, type "make install". + +If space is a problem, the only files you absolutely must have to run +figlet are "figlet" (the executable) and at least one font (preferably +the one you chose to be the default font). + +Installing FIGlet -- DOS version +-------------------------------- + +Unpack the ZIPfile using PKUNZIP, Info-Zip UNZIP, WinUnzip, or any other +ZIP-compatible program. Be sure to use the -d option with PKUNZIP +in order to preserve the directory structure. We recommend that you +unpack the archive into C:\FIGLET, but any directory will do. + +If you unpack the archive on top of an older version of FIGlet, be +sure to delete the file FIGLET.COM. The executable program in this +release is named FIGLET.EXE. You can keep your old fonts by putting +them in a FONTS subdirectory before unpacking. (There are upgraded +versions of the standard fonts in the archive.) + +Using FIGlet +------------ + +(Note: FIGlet needs a good thorough tutorial. Currently I don't have +the time to write one, but if anyone wants to do so, go right ahead. +I'd be glad to help out a little. Write us at if +you're interested. -GGC-) + +At the shell prompt, type "figlet". Then type, say, "Hello, world!" +and press return. "Hello, world!" in nice, big, designer characters +should appear on your screen. If you chose standard.flf to be the +default font, you should see + _ _ _ _ _ _ _ +| | | | ___| | | ___ __ _____ _ __| | __| | | +| |_| |/ _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` | | +| _ | __/ | | (_) | \ V V / (_) | | | | (_| |_| +|_| |_|\___|_|_|\___( ) \_/\_/ \___/|_| |_|\__,_(_) + |/ +Then type something else, or type an EOF (typically control-D) to quit +FIGlet. + +Now you can send the output of figlet to a file (e.g., "figlet > file") +and e-mail it to your friends (who will probably say, "Wow! It must +have taken you hours to put that together!") + +To use other fonts, use the "-f" command line option. For example, if +you had said "figlet -f smslant" above, you would have seen + __ __ ____ __ ____ + / // /__ / / /__ _ _____ ____/ /__/ / / + / _ / -_) / / _ \_ | |/|/ / _ \/ __/ / _ /_/ +/_//_/\__/_/_/\___( ) |__,__/\___/_/ /_/\_,_(_) + |/ + +Here are some other useful command line options: + +-c center -- centers the output of FIGlet. +-k tells FIGlet to kern characters without smushing them together. +-t terminal -- FIGlet asks your terminal how wide it is, and uses + this to determine when to break lines. Normally, FIGlet assumes + 80 columns so that people with wide terminals won't annoy the + people they e-mail FIGlet output to. +-p paragraph mode -- eliminates some spurious line breaks when piping + a multi-line file through FIGlet. +-v version -- prints information about your copy of FIGlet. + +For in-depth explanations of these and other options, see the man page. +DOS users, see figlet.man. + + +Other Fonts & Mailing List +-------------------------- + +A good number of FIGlet fonts have been developed, most of which are +not included in the standard FIGlet package. Many of these can be +obtained from http://www.figlet.org/ Some non-Roman fonts are +available at this site. As of this writing, we have Hebrew, Cyrillic +(Russian) and Greek. + +There are 3 mailing lists available for FIGlet: + figlet@figlet.org General discussion of FIGlet + figletfonts@figlet.org Announcements about fonts + figletsoftware@figlet.org Announcements about software + (The last two lists are moderated) + +To subscribe or unsubscribe from the FIGlet mailing lists, please visit +the corresponding URL: + http://www.figlet.org/mailman/listinfo/figlet + http://www.figlet.org/mailman/listinfo/figletfonts + http://www.figlet.org/mailman/listinfo/figletsoftware + +Also, for those who maintain archives of figlet fonts, please note that +all of the standard fonts have been changed, as of release 2.1, to +include non-ASCII characters. These fonts are the following: + +big.flf (also contains Greek) +banner.flf (also contains Cyrillic and Japanese katakana) +block.flf +bubble.flf +digital.flf +ivrit.flf (right-to-left, also contains Hebrew) +lean.flf +mini.flf +script.flf +shadow.flf +slant.flf +small.flf +smscript.flf +smshadow.flf +smslant.dld +standard.flf +term.flf + +The new versions of these fonts can be identified by the words "figlet +release 2.1" somewhere in the first few lines. + + +Other Stuff +----------- + +FIGlet is available for operating systems other than Unix. +Please see ftp://ftp.figlet.org/program/ + +Although you don't have to design your own fonts to use FIGlet, we'd +certainly like it if lots of people did make up new FIGlet fonts. If +you feel like giving it a try, see the "FONT FILE FORMAT" section of +the man page. If you do design a font, please let us know by mailing us +at + +See "Other Things to Try" in the EXAMPLES section of the man page +for... well... other things to try. + + +Authors +------- + +FIGlet was written mostly by Glenn Chappell . The +author not being an e-mail fanatic, most correspondence (bug reports, rave +reviews, etc.) used to be handled to his secretary (who is definitely +an e-mail fanatic), Ian Chai and has since moved on to +another FIGlet enthusiast, Christiaan Keet . Current +maintenance is conducted by Claudio Matsuoka . + diff --git a/externals/figlet/chkfont.6 b/externals/figlet/chkfont.6 new file mode 100644 index 0000000000..681d6ad556 --- /dev/null +++ b/externals/figlet/chkfont.6 @@ -0,0 +1,52 @@ +.\" chkfont +.\" By Glenn Chappell +.\" +.\" This program checks figlet 2.0/2.1 font files for format errors. +.\" It also looks for signs of common problems and gives warnings. +.\" chkfont does not modify font files. +.\" +.\" Usage: chkfont fontfile ... +.\" +.\" Note: This is very much a spare-time project. It's probably +.\" full o' bugs. +.\" +.\" Manual page by Jonathon Abbott, for the Debian Project +.\" slightly modified by Francesco Tapparo, for the Debian Project +.TH CHKFONT 6 "31 May 2012" "v2.2.5" + +.SH NAME +chkfont \- checks figlet 2.0 and up font files for format errors + +.SH SYNOPSIS +.B chkfont +[ +.I fontfile +] + +.SH DESCRIPTION +This program checks figlet 2.0 and up font files for format errors. +It also looks for signs of common problems and gives warnings. +chkfont does not modify font files. + +.SH EXAMPLES +To use +.B chkfont +on the "big" font +.RS + +.B example% chkfont /usr/share/figlet/big.flf + +.RE + +.SH BUGS +Doesn't work on compressed font files. + +.SH AUTHORS +chkfont was written by Glenn Chappell + +This manual page was written by Jonathon Abbott for the Debian Project. + +.SH "SEE ALSO" +.BR figlet (6), +.BR showfigfonts (6), +.BR figlist (6) diff --git a/externals/figlet/chkfont.c b/externals/figlet/chkfont.c new file mode 100644 index 0000000000..63bf381b31 --- /dev/null +++ b/externals/figlet/chkfont.c @@ -0,0 +1,476 @@ +#include +#include +#include +#ifdef __STDC__ +#include +#endif + +#define DATE "20 Feb 1996" +#define VERSION "2.2" + +/* + chkfont + By Glenn Chappell + + This program checks figlet 2.0/2.1 font files for format errors. + It also looks for signs of common problems and gives warnings. + chkfont does not modify font files. + + Usage: chkfont fontfile ... + + Note: This is very much a spare-time project. It's probably + full o' bugs .... +*/ + +/* #define CHECKBLANKS */ +#define FONTFILESUFFIX ".flf" +#define FONTFILEMAGICNUMBER "flf2" +char posshardblanks[9] = { '!', '@', '#', '$', '%', '&', '*', 0x7f, 0 }; + +char *myname,*fontfilename; +FILE *fontfile; +char hardblank; +int charheight,upheight,maxlen=0,old_layout; +int spectagcnt; +char *fileline; +int maxlinelength=0,currline; +int ec,wc; + +int incon_endmarkwarn,endmark_countwarn,nonincrwarn; +int bigcodetagwarn,deutschcodetagwarn,asciicodetagwarn; +int codetagcnt; +int gone; + +void weregone(really) +int really; +{ +if (!really && 2*ec+wc<=40) { + return; + } +if (ec+wc>0) printf("*******************************************************************************\n"); +if (!really) { + printf("%s: Too many errors/warnings.\n",fontfilename); + } +printf("%s: Errors: %d, Warnings: %d\n",fontfilename,ec,wc); +if (currline>1 && maxlen!=maxlinelength) { + printf("%s: maxlen: %d, actual max line length: %d\n", + fontfilename,maxlen,maxlinelength); + if (codetagcnt>0 && spectagcnt==-1) { + printf("%s: Code-tagged characters: %d\n",fontfilename,codetagcnt); + } + } +printf("-------------------------------------------------------------------------------\n"); +gone=1; +} + +char *my_alloc(size) +int size; +{ +char *ptr; + +ptr=(char *)malloc(size); +if (ptr==NULL) { + fprintf(stderr,"%s: Out of memory\n",myname); + exit(1); + } +return(ptr); +} + +int badsuffix(path,suffix) +char *path; +char *suffix; +{ + char ucsuffix[10]; + char *s; + + strcpy(ucsuffix,suffix); + for (s = ucsuffix; *s; s++) { + *s = toupper(*s); + } + + if (strlen(path)\n"); +fprintf(stderr,"Version: %s, date: %s\n",VERSION,DATE); +fprintf(stderr,"Checks figlet 2.0/2.1 font files for format errors.\n"); +fprintf(stderr,"(Does not modify font files.)\n"); +fprintf(stderr,"Usage: %s fontfile ...\n",myname); +exit(1); +} + +void readchar() +{ +int i,expected_width,k,len,newlen,diff,l; +char endmark,expected_endmark; +int leadblanks,minleadblanks,trailblanks,mintrailblanks; +char *ret; + +expected_width = expected_endmark = 0; /* prevent compiler warning */ +for (i=0;imaxlinelength) { + maxlinelength=len; + } + if (len>maxlen) { + printf("%s: ERROR- Line length > maxlen in line %d.\n", + fontfilename,currline); + ec++; + weregone(0); if (gone) return; + } + k=len; + endmark=k<0?'\0':(k==0||fileline[k]!='\n')?fileline[k]:fileline[k-1]; + for(;k>=0?(fileline[k]=='\n' || fileline[k]==endmark):0;k--) { + fileline[k]='\0'; + } + newlen=strlen(fileline); + for (l=0;l=0 ? fileline[l]==' ' : 0;l--) ; + trailblanks = newlen-1-l; + if (i==0) { + expected_endmark = endmark; + expected_width = newlen; + minleadblanks = leadblanks; + mintrailblanks = trailblanks; + if (endmark==' ') { + printf("%s: Warning- Blank endmark in line %d.\n", + fontfilename,currline); + wc++; + weregone(0); if (gone) return; + } + } + else { + if (leadblanks2) { + printf("%s: ERROR- Too many endmarks in line %d.\n", + fontfilename,currline); + ec++; + weregone(0); if (gone) return; + } + else if (charheight>1 && (diff!=(i==charheight-1)+1)) { + if (!endmark_countwarn) { + printf("%s: Warning- Endchar count convention violated in line %d.\n", + fontfilename,currline); + printf("%s: (Above warning will only be printed once.)\n", + fontfilename); + endmark_countwarn = 1; + wc++; + weregone(0); if (gone) return; + } + } + } +#ifdef CHECKBLANKS +if (minleadblanks+mintrailblanks>0 && old_layout>=0) { + printf("%s: Warning- Leading/trailing blanks in char. ending at line %d.\n", + fontfilename,currline); + printf("%s: (Above warning only given when old_layout > -1.)\n", + fontfilename); + wc++; + weregone(0); if (gone) return; + } +#endif /* #ifdef CHECKBLANKS */ +} + + +void checkit() +{ +int i,k,cmtcount,numsread,ffrighttoleft,have_layout,layout; +char magicnum[5],cha; +long oldord,theord; +int tmpcnt,len; + +ec=0;wc=0; +incon_endmarkwarn=0; endmark_countwarn=0; nonincrwarn=0; +bigcodetagwarn=0; deutschcodetagwarn=0; +asciicodetagwarn=0; +codetagcnt=0; +gone=0; +if (!strcmp(fontfilename,"-")) { + fontfilename="(stdin)"; + fontfile=stdin; + } +else { + fontfile=fopen(fontfilename,"r"); + if (fontfile == NULL) { + fprintf(stderr,"%s: Could not open file '%s'\n",myname,fontfilename); + exit(1); + } + } + +if (fontfile!=stdin) { + if (badsuffix(fontfilename,FONTFILESUFFIX)) { + printf("%s: ERROR- Filename does not end with '%s'.\n", + fontfilename,FONTFILESUFFIX); + ec++; + weregone(0); if (gone) return; + } + } +numsread=fscanf(fontfile,"%4s",magicnum); +if (numsread == EOF) { + printf("%s: ERROR- can't read magic number.\n",fontfilename); + ec++; + weregone(0); if (gone) return; + } +if (strcmp(magicnum,FONTFILEMAGICNUMBER)) { + printf("%s: ERROR- Incorrect magic number.\n",fontfilename); + ec++; + weregone(0); if (gone) return; + } +cha=getc(fontfile); +if (cha!='a') { + printf("%s: Warning- Sub-version character is not 'a'.\n",fontfilename); + wc++; + weregone(0); if (gone) return; + } +fileline=(char*)my_alloc(sizeof(char)*(1001)); +if (fgets(fileline,1001,fontfile)==NULL) { + fileline[0] = '\0'; + } +if (strlen(fileline)>0 ? fileline[strlen(fileline)-1]!='\n' : 0) { + while(k=getc(fontfile),k!='\n'&&k!=EOF) ; /* Advance to end of line */ + } +numsread=sscanf(fileline,"%c %d %d %d %d %d %d %d %d", + &hardblank,&charheight,&upheight,&maxlen,&old_layout,&cmtcount, + &ffrighttoleft,&layout,&spectagcnt); +free(fileline); +fileline = NULL; +if (numsread<7) { + ffrighttoleft=0; + } +if (numsread<9) { + spectagcnt=-1; + } +have_layout = (numsread>=8); +if (6>numsread) { + printf("%s: ERROR (fatal)- First line improperly formatted.\n",fontfilename); + ec++; + weregone(1); if (gone) return; + } +if (!strchr(posshardblanks,hardblank)) { + printf("%s: Warning- Unusual hardblank.\n",fontfilename); + wc++; + weregone(0); if (gone) return; + } +if (charheight<1) { + printf("%s: ERROR (fatal)- charheight not positive.\n",fontfilename); + ec++; + weregone(1); if (gone) return; + } +if (upheight>charheight || upheight<1) { + printf("%s: ERROR- up_height out of bounds.\n",fontfilename); + ec++; + weregone(0); if (gone) return; + } +if (maxlen<1) { + printf("%s: ERROR (fatal)- maxlen not positive.\n",fontfilename); + ec++; + weregone(1); if (gone) return; + } +if (old_layout<-1) { + printf("%s: ERROR- old_layout < -1.\n",fontfilename); + ec++; + weregone(0); if (gone) return; + } +if (old_layout>63) { + printf("%s: ERROR- old_layout > 63.\n",fontfilename); + ec++; + weregone(0); if (gone) return; + } +if (have_layout && layout<0) { + printf("%s: ERROR- layout < 0.\n", fontfilename); + ec++; + weregone(0); if (gone) return; + } +if (have_layout &&layout>32767) { + printf("%s: ERROR- layout > 32767.\n", fontfilename); + ec++; + weregone(0); if (gone) return; + } +if (have_layout && old_layout == -1 && (layout & 192)) { + printf("%s: ERROR- layout %d is inconsistent with old_layout -1.\n", + fontfilename,layout); + ec++; + weregone(0); if (gone) return; + } +if (have_layout && old_layout == 0 && (layout & 192) != 64 && + (layout & 255) != 128) { + printf("%s: ERROR- layout %d is inconsistent with old_layout 0.\n", + fontfilename,layout); + ec++; + weregone(0); if (gone) return; + } +if (have_layout && old_layout > 0 && + (!(layout & 128) || old_layout != (layout & 63))) { + printf("%s: ERROR- layout %d is inconsistent with old_layout %d.\n", + fontfilename,layout,old_layout); + ec++; + weregone(0); if (gone) return; + } +if (cmtcount<0) { + printf("%s: ERROR- cmt_count is negative.\n",fontfilename); + ec++; + weregone(0); if (gone) return; + } +if (ffrighttoleft<0 || ffrighttoleft>1) { + printf("%s: ERROR- rtol out of bounds.\n",fontfilename); + ec++; + weregone(0); if (gone) return; + } + +for (i=1;i<=cmtcount;i++) { + while(k=getc(fontfile),k!='\n'&&k!=EOF) ; /* Advance to end of line */ + } + +maxlinelength = 0; +currline=cmtcount+1; +fileline=(char*)my_alloc(sizeof(char)*(maxlen+1001)); +for (i=0;i<102;i++) { + readchar(); + if (gone) return; + } + +oldord=0; +while(fgets(fileline,maxlen+1000,fontfile)!=NULL) { + currline++; + len=strlen(fileline)-1; + if (len-100>maxlinelength) { + maxlinelength=len-100; + } + if (len>maxlen+100) { + printf("%s: ERROR- Code tag line way too long in line %d.\n", + fontfilename,currline); + ec++; + weregone(0); if (gone) return; + } + tmpcnt=sscanf(fileline,"%li",&theord); + if (tmpcnt<1) { + printf("%s: Warning- Extra chars after font in line %d.\n", + fontfilename,currline); + wc++; + weregone(0); if (gone) return; + break; + } + codetagcnt++; + if (theord>65535 && !bigcodetagwarn) { + printf("%s: Warning- Code tag > 65535 in line %d.\n", + fontfilename,currline); + printf("%s: (Above warning will only be printed once.)\n", + fontfilename); + bigcodetagwarn = 1; + wc++; + weregone(0); if (gone) return; + } + if (theord==-1) { + printf("%s: ERROR- Code tag -1 (unusable) in line %d.\n", + fontfilename,currline); + ec++; + weregone(0); if (gone) return; + break; + } + if (theord>=-255 && theord<=-249 &&!deutschcodetagwarn) { + printf("%s: Warning- Code tag in old Deutsch area in line %d.\n", + fontfilename,currline); + printf("%s: (Above warning will only be printed once.)\n", + fontfilename); + deutschcodetagwarn = 1; + wc++; + weregone(0); if (gone) return; + } + if (theord<127 && theord>31 && !asciicodetagwarn) { + printf("%s: Warning- Code tag in ASCII range in line %d.\n", + fontfilename,currline); + printf("%s: (Above warning will only be printed once.)\n", + fontfilename); + asciicodetagwarn = 1; + wc++; + weregone(0); if (gone) return; + } + else if (theord<=oldord && theord>=0 && oldord>=0 && !nonincrwarn) { + printf("%s: Warning- Non-increasing code tag in line %d.\n", + fontfilename,currline); + printf("%s: (Above warning will only be printed once.)\n", + fontfilename); + nonincrwarn = 1; + wc++; + weregone(0); if (gone) return; + } + oldord=theord; + readchar(); + if (gone) return; + } + +if (spectagcnt!=-1 && spectagcnt!=codetagcnt) { + printf("%s: ERROR- Inconsistent Codetag_Cnt value %d\n", + fontfilename, spectagcnt); + ec++; + weregone(0); if (gone) return; + } + +if (fontfile!=stdin) fclose(fontfile); + +weregone(1); if (gone) return; +} + + +int main(argc,argv) +int argc; +char *argv[]; +{ +int arg; + +if ((myname=strrchr(argv[0],'/'))!=NULL) { + myname++; + } +else { + myname = argv[0]; + } +if (argc<2) { + usageerr(); + } +for (arg=1;arg> 8); + } + + return crc; +} diff --git a/externals/figlet/crc.h b/externals/figlet/crc.h new file mode 100644 index 0000000000..bd7c5361f8 --- /dev/null +++ b/externals/figlet/crc.h @@ -0,0 +1,62 @@ +/* + * crc.h - CRC calculation routine + * + * Version 1.0.1 + */ + +/* + * Copyright (C) 1995, Edward B. Hamrick + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of the copyright holders + * not be used in advertising or publicity pertaining to distribution of + * the software without specific, written prior permission. The copyright + * holders makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, + * IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT + * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * Changes from 1.0 to 1.0.1: + * Relicensed under the MIT license, with consent of the copyright holders. + * Claudio Matsuoka (Jan 11 2011) + */ + +/* + * This CRC algorithm is the same as that used in zip. Normally it + * should be initialized with 0xffffffff, and the final CRC stored + * should be crc ^ 0xffffffff. + * + * It implements the polynomial: + * + * x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1 + */ + +#ifndef __CRC_H +#define __CRC_H + +#ifdef __cplusplus +extern "C" { +#endif + +unsigned long CrcUpdate( /* returns updated crc */ + unsigned long crc, /* starting crc */ + unsigned char *buffer, /* buffer to use to update crc */ + long length /* length of buffer */ +); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/externals/figlet/figfont.txt b/externals/figlet/figfont.txt new file mode 100644 index 0000000000..8cbe6ea7b5 --- /dev/null +++ b/externals/figlet/figfont.txt @@ -0,0 +1,1695 @@ + _____ ___ ____ __ _ + | ___||_ _|/ ___| / _| ___ _ __ | |_ ___ _ + | |_ | || | _ | |_ / _ \ | '_ \ | __|/ __|(_) + | _| | || |_| || _|| (_) || | | || |_ \__ \ _ + |_| |___|\____||_| \___/ |_| |_| \__||___/(_) + + The FIGfont Version 2 FIGfont and FIGdriver Standard + === ======= ======= = ======= === ========= ======== + Draft 2.0 Copyright 1996, 1997 + by John Cowan and Paul Burton + Portions Copyright 1991, 1993, 1994 + by Glenn Chappell and Ian Chai + May be freely copied and distributed. + + Figlet lives at: http://www.figlet.org/ + + _____ __ __ + / ___/__ ___ / /____ ___ / /____ +/ /__/ _ \/ _ \/ __/ -_) _ \/ __(_-< +\___/\___/_//_/\__/\__/_//_/\__/___/ + + INTRODUCTION + BASIC DEFINITIONS AND CONCEPTS + "FIGfont" + "FIGcharacters" and "Sub-characters" + "FIGdriver" + "FIGure" + "FIG" + "Layout Modes" + "Smushing Rules" + "Hardblanks" + CREATING FIGFONTS + The Header Line + Interpretation of Layout Parameters + Setting Layout Parameters Step-by-Step + FIGfont Comments + FIGcharacter Data + - Basic Data Structure + - Character Codes + - Required FIGcharacters + - Code Tagged FIGcharacters + NOTES - AVOIDING ERRORS AND GENERAL ADVICE + CONTROL FILES + Standard Format + Extended Commands + STANDARDIZED CAPABILITIES OF CURRENT AND FUTURE FIGDRIVERS + CHART OF CAPABILITIES OF FIGLET 2.2.2 AND FIGWIN 1.0 + + +INTRODUCTION +============ + +This document specifies the format of font files, and the associated control +files, used by the FIGlet and FIGWin programs (FIGdrivers). It is written +for designers who wish to build fonts (FIGfonts) usable by either program, +and also serves as a standard for development of future versions or similar +FIGdrivers. Some features explained here are not supported by both programs. +See separate documentation to learn how to use FIGlet or FIGWin. + +NOTE: FIGWin 1.0 is packaged with a program called FIGfont Editor for Windows +1.0, which is just that. It does not require a complete understanding of +this document to create FIGfonts. However it is a good idea to become +familiar with the "BASIC DEFINITIONS AND CONCEPTS" information before using +it. + +If you design a FIGfont, please send an e-mail announcement to +, the FIGlet fonts mailing list, and email a copy +to info@figlet.org for us to put it on the ftp site (ftp://ftp.figlet.org/) + +BASIC DEFINITIONS AND CONCEPTS +===== =========== === ======== + +"FIGfont" + +A FIGfont is a file which represents the graphical arrangement of characters +representing larger characters. Since a FIGfont file is a text file, it can +be created with any text editing program on any platform. The filename of a +FIGfont file must end with ".flf", which stands for "IGettering +ont". + + +"FIGcharacters" and "Sub-characters" + +Because FIGfonts describe large characters which consist of smaller +characters, confusion can result when descussing one or the other. +Therefore, the terms "FIGcharacter" and "sub-character" are used, +respectively. + + +"FIGdriver" + +The term FIGdriver is used in this document to encompass FIGlet, FIGWin, and +any future programs which use FIGfonts. + + +"FIGure" + +A FIGure (thusly capitalized) is an image created by a FIGdriver. + + +"FIG" + +A bit of history: + +In Spring 1991, inspired by the Email signature of a friend named Frank, and +goaded on by Ian Chai, Glenn Chappell wrote a nifty little 170-line "C" +program called "newban", which would create large letters out of ordinary +text characters. At the time, it was only compiled for UNIX. In hindsight, +we now call it "FIGlet 1.0". FIGlet stands for rank, an, and lenn's +ters. In various incarnations, newban circulated around the net for a +couple of years. It had one font, which included only lowercase letters. + +In early 1993, Ian decided newban was due for a few changes, so together Ian +and Glenn added the full ASCII character set, to start with. First, though, +Ian had to find a copy of the source, since Glenn had tossed it away as not +worth the disk space. Ian and Glenn discussed what could be done with it, +decided on a general re-write, and, 7 months later, ended up with 888 lines +of code, 13 FIGfonts and documentation. This was FIGlet 2.0, the first real +release. + +To their great surprise, FIGlet took the net by storm. They received floods +of "FIGlet is great!" messages and a new contributed FIGfont about once a +week. To handle all the traffic, Ian quickly set up a mailing list, Daniel +Simmons kindly offered space for an FTP site, several people volunteered to +port FIGlet to non-Unix operating systems, ...and bug reports poured in. + +Because of these, and the need to make FIGlet more "international", Ian and +Glenn released a new version of FIGlet which could handle non-ASCII character +sets and right-to-left printing. This was FIGlet 2.1, which, in a couple of +weeks, became figlet 2.1.1. This weighed in at 1314 lines, and there were +over 60 FIGfonts. + +By late 1996, FIGlet had quite a following of fans subscribing to its mailing +list. It had been ported to MS-DOS, Macintosh, Amiga, Apple II GS, Atari ST, +Acorn and OS/2. FIGlet had been further updated, and there were nearly 200 +FIGfonts. + +John Cowan and Paul Burton are two FIGlet fans who decided to create new +versions. While John wrote FIGlet version 2.2 using C, Paul wrote FIGWin +1.0, the first true GUI (Windows) implementation of FIGlet, using Visual +Basic. John and Paul worked together to add new features to FIGfont files +which could be read by both programs, and together wrote this document, which +we hope helps to establish consistency in FIGfonts and help with the creation +of future FIGdrivers. FIGlet 2.2 has about 4800 lines of code, of which +over half is a support library for reading compressed files. + +Three years later, in July 2005, FIGlet 2.2.2 was released under a new License +(the ``Academic Free License 2.1''). This version has proved to be very +stable, and persisted for more five years until minor bugfixes and another +license change resulted in the release of FIGlet 2.2.3 in January 2011. All +license concerns involving contributed code were solved and FIGlet is now +distributed under the ``New BSD License''. Contributed fonts amounted to more +than 400. + +FIGlet 2.2 and FIGWin 1.0 both allow greater flexibility by use of new +information which can be contained in FIGfont files without interfering with +the function of older FIGdrivers. + +NOTE: The Macintosh version of FIGlet is still command-line driven as of this +writing, and a GUI version is very much in demand. The FIGlet C code is +written to be easily plugged in to a GUI shell, so it will be a relatively +easy task for a Macintosh developer. + + + + +"Layout Modes" + +A FIGdriver may arrange FIGcharacters using one of three "layout modes", +which define the spacing between FIGcharacters. The layout mode for the +horizontal axis may differ from the layout mode for the vertical axis. A +default choice is defined for each axis by every FIGfont. + +The three layout modes are: + + Full Size (Separately called "Full Width" or "Full Height".) + + Represents each FIGcharacter occupying the full width or + height of its arrangement of sub-characters as designed. + + Fitting Only (Separately called "Kerning or "Vertical Fitting".) + + Moves FIGcharacters closer together until they touch. + Typographers use the term "kerning" for this phenomenon + when applied to the horizontal axis, but fitting also + includes this as a vertical behavior, for which there is + apparently no established typographical term. + + Smushing (Same term for both axes.) + + Moves FIGcharacters one step closer after they touch, so that + they partially occupy the same space. A FIGdriver must decide + what sub-character to display at each junction. There are two + ways of making these decisions: by controlled smushing or by + universal smushing. + + Controlled smushing uses a set of "smushing rules" selected by + the designer of a FIGfont. (See "Smushing Rules" below.) + Each rule is a comparison of the two sub-characters which must + be joined to yield what to display at the junction. + Controlled smushing will not always allow smushing to occur, + because the compared sub-characters may not correspond to any + active rule. Wherever smushing cannot occur, fitting occurs + instead. + + Universal smushing simply overrides the sub-character from the + earlier FIGcharacter with the sub-character from the later + FIGcharacter. This produces an "overlapping" effect with some + FIGfonts, wherin the latter FIGcharacter may appear to be "in + front". + + A FIGfont which does not specify any smushing rules for a + particular axis indicates that universal smushing is to occur + when smushing is requested. Therefore, it is not possible for + a FIGfont designer to "forbid" smushing. However there are + ways to ensure that smushing does not cause a FIGfont to be + illegible when smushed. This is especially important for + smaller FIGfonts. (See "Hardblanks" for details.) + +For vertical fitting or smushing, entire lines of output FIGcharacters are +"moved" as a unit. + +Not all FIGdrivers do vertical fitting or smushing. At present, FIGWin 1.0 +does, but FIGlet 2.2 does not. Further, while FIGlet 2.2 allows the user to +override the FIGfont designer's set of smushing rules, FIGWin 1.0 does not. + +NOTE: In the documentation of FIGlet versions prior to 2.2, the term +"smushmode" was used to mean the layout mode, and this term further included +the smushing rules (if any) to be applied. However, since the layout mode +may or may not involve smushing, we are straying from the use of this +somewhat misleading term. + + +"Smushing Rules" + +Again, smushing rules are for controlled smushing. If none are defined to be +active in a FIGfont, universal smushing occurs instead. + +Generally, if a FIGfont is "drawn at the borders" using sub-characters +"-_|/\[]{}()<>", you will want to use controlled smushing by selecting from +the rules below. Otherwise, if your FIGfont uses a lot of other +sub-characters, do not select any rules and universal smushing will occur +instead. (See "Hardblanks" below if your FIGfont is very small and would +become illegible if smushed.) Experimentation is the best way to make these +decisions. + +There are six possible horizontal smushing rules and five possible vertical +smushing rules. Below is a description of all of the rules. + +NOTE: Ignore the "code values" for now. They are explained later. + + The Six Horizontal Smushing Rules + + Rule 1: EQUAL CHARACTER SMUSHING (code value 1) + + Two sub-characters are smushed into a single sub-character + if they are the same. This rule does not smush + hardblanks. (See "Hardblanks" below.) + + Rule 2: UNDERSCORE SMUSHING (code value 2) + + An underscore ("_") will be replaced by any of: "|", "/", + "\", "[", "]", "{", "}", "(", ")", "<" or ">". + + Rule 3: HIERARCHY SMUSHING (code value 4) + + A hierarchy of six classes is used: "|", "/\", "[]", "{}", + "()", and "<>". When two smushing sub-characters are + from different classes, the one from the latter class + will be used. + + Rule 4: OPPOSITE PAIR SMUSHING (code value 8) + + Smushes opposing brackets ("[]" or "]["), braces ("{}" or + "}{") and parentheses ("()" or ")(") together, replacing + any such pair with a vertical bar ("|"). + + Rule 5: BIG X SMUSHING (code value 16) + + Smushes "/\" into "|", "\/" into "Y", and "><" into "X". + Note that "<>" is not smushed in any way by this rule. + The name "BIG X" is historical; originally all three pairs + were smushed into "X". + + Rule 6: HARDBLANK SMUSHING (code value 32) + + Smushes two hardblanks together, replacing them with a + single hardblank. (See "Hardblanks" below.) + + + The Five Vertical Smushing Rules + + Rule 1: EQUAL CHARACTER SMUSHING (code value 256) + + Same as horizontal smushing rule 1. + + Rule 2: UNDERSCORE SMUSHING (code value 512) + + Same as horizontal smushing rule 2. + + Rule 3: HIERARCHY SMUSHING (code value 1024) + + Same as horizontal smushing rule 3. + + Rule 4: HORIZONTAL LINE SMUSHING (code value 2048) + + Smushes stacked pairs of "-" and "_", replacing them with + a single "=" sub-character. It does not matter which is + found above the other. Note that vertical smushing rule 1 + will smush IDENTICAL pairs of horizontal lines, while this + rule smushes horizontal lines consisting of DIFFERENT + sub-characters. + + Rule 5: VERTICAL LINE SUPERSMUSHING (code value 4096) + + This one rule is different from all others, in that it + "supersmushes" vertical lines consisting of several + vertical bars ("|"). This creates the illusion that + FIGcharacters have slid vertically against each other. + Supersmushing continues until any sub-characters other + than "|" would have to be smushed. Supersmushing can + produce impressive results, but it is seldom possible, + since other sub-characters would usually have to be + considered for smushing as soon as any such stacked + vertical lines are encountered. + + +"Hardblanks" + +A hardblank is a special sub-character which is displayed as a blank (space) +in rendered FIGures, but is treated more like a "visible" sub-character when +fitting or smushing horizontally. Therefore, hardblanks keep adjacent +FIGcharacters a certain distance apart. + +NOTE: Hardblanks act the same as blanks for vertical operations. + +Hardblanks have three purposes: + + 1) Hardblanks are used to create the blank (space) FIGcharacter. + + Usually the space FIGcharacter is simply one or two vertical + columns of hardblanks. Some slanted FIGfonts as shown below + have a diagonal arrangement of hardblanks instead. + + 2) Hardblanks can prevent "unreasonable" fitting or smushing. + + Normally when fitting or smushing, the blank (space) + sub-character is considered "vacant space". In the following + example, a capital "C" FIGcharacter is smushed with a "minus" + FIGcharacter. + ______ ______ + / ____/ / ____/ + / / ____ >>-Becomes-> / / ____ + / /___ /___/ / /__/___/ + \____/ \____/ + + The FIGure above looks like a capital G. To prevent this, a + FIGfont designer might place a hardblank in the center of the + capital C. In the following example, the hardblank is + represented as a "$": + ______ ______ + / ____/ / ____/ + / / $ ____ >>-Becomes-> / / ____ + / /___ /___/ / /___/___/ + \____/ \____/ + + Using hardblanks in this manner ensures that FIGcharacters + with a lot of empty space will not be unreasonably "invaded" + by adjacent FIGcharacters. Generally, FIGcharacters such as + capital C, L or T, or small punctuation marks such as commas, + may contain hardblanks, since they may contain a lot of vacant + space which is "accessible" from either side. + + 3) Hardblanks can prevent smushing from making FIGfonts illegible. + + This legitimate purpose of hardblanks is often overused. If a + FIGfont designer is absolutely sure that smushing "visible" + sub-characters would make their FIGfont illegible, hardblanks + may be positioned at the end of each row of sub-characters, + against the visible sub-characters, creating a barrier. + + With older FIGdrivers, using hardblanks for this purpose meant + that FIGcharacters would have to be separated by at least one + blank in output FIGures, since only a hardblank could smush + with another hardblank. However with the advent of universal + smushing, this is no longer necessary. Hardblanks ARE + overriden by any visible sub-character when performing + universal smushing. Hardblanks still represent a "stopping + point", but only AFTER their locations are occupied. + + NOTE: Earlier it was stated that universal smushing overrides + the sub-character from the former FIGcharacter with the + sub-character from the latter FIGcharacter. Hardblanks (and + blanks or spaces) are the exception to this rule; they will + always be overriden by visible sub-characters, regardless of + which FIGcharacter contains the hardblank. This ensures that + no visible sub-characters "disappear". + + Therefore, one can design a FIGfont with a default behavior of + universal smushing, while the output FIGure would LOOK like + the effect of fitting, or even full size if additional + hardblanks are used. If a user "scales down" the layout mode + to fitting, the result would look like "extra spacing" between + FIGcharacters. + + Taking this concept further, a FIGcharacter may also include + extra blanks (spaces) on the left side of each FIGcharacter, + which would define the FIGcharacter's width as slightly larger + than required for the visible sub-characters and hardblanks. + With such a FIGfont, a user who further "scales down" the + layout mode to full size would see even greater spacing. + + These techniques prevent horizontal smushing from causing a + FIGfont to become illegible, while offering greater + flexibility of output to users. + + NOTE: These techniques cannot be used to prevent vertical + smushing of visible sub-characters, since hardblanks are not + respected in the vertical axis. Although it is possible to + select only one vertical smushing rule which involves only + sub-characters which are not used in your FIGfont, it is + recommend that you do NOT do so. In our opinion, most users + would prefer to get what they ask for, rather than being + told, in effect: "I, the FIGfont designer, have decided that + you wouldn't like the results of vertical smushing, so I have + prevented you from trying it." Instead, we recommend setting + the default behavior to either fitting or full height, and + either allowing universal smushing, or selecting vertical + smushing rules which seem most appropriate. A user of your + FIGfont will quickly see why you did not choose smushing as + the default vertical layout mode, and will agree with you. + + +"Character Sets" and "Character Codes" + +When you type using your keyboard, you are actually sending your computer a +series of numbers. Each number must be interpreted by your computer so that +it knows what character to display. The computer uses a list of definitions, +called a "character set". The numbers which represent each character are + called "character codes". + +There are many character sets, most of which are internationally accepted as +standards. By far, the most common character set is ASCII, which stands for +"American Standard Code for Information Interchange". ASCII identifies its +characters with codes ranging from 0 to 127. + +NOTE: The term "ASCII art" has become well-understood to mean artistic images +which consist of characters on your screen (such as FIGures). + +For a list of the printable ASCII characters with the corresponding codes, +see the section "REQUIRED CHARACTERS" below. The other ASCII codes in the +range of 0 through 31 are "control characters" such as carriage-return +(code 13), linefeed/newline (code 10), tab (code 9), backspace (code 8) or +null (code 0). Code 127 is a delete in ASCII. + +Getting more technical for just a moment: A byte consisting of 8 bits (eight + 1's or 0's) may represent a number from 0 to 255. Therefore, most computers +have DIRECT access to 256 characters at any given time. A character set +which includes 256 characters is called an 8-bit character set. + +For Latin-based languages, ASCII is almost always the first half of a larger +8-bit character set. Latin-1 is the most common example of an 8-bit +character set. Latin-1 includes all of ASCII, and adds characters with codes +from 128 to 255 which include umlauted ("double-dotted") letters and +characters with various other accents. In the United States, Windows and +most Unix systems have Latin-1 directly available. + +Most modern systems allow the possibility of changing 8-bit character sets. +On Windows systems, character sets are referred to as "code pages". There +are many other character sets which are not mentioned here. DOS has its own +character set (which also has international variants) that includes graphics +characters for drawing lines. It is also an extension of ASCII. + +For some languages, 8-bit character sets are insufficient, particularly on +East Asian systems. Therefore, some systems allow 2 bytes for each +character, which multiplies the 256 possibilties by 256, resulting in 65536 +possible characters. (Much more than the world will ever need.) + +Unicode is a character set standard which is intended to fulfill the +worldwide need for a single character set which includes all characters used +worldwide. Unicode includes character codes from 0 to 65535, although at +present, only about 22,000 characters have been officially assigned and named +by the Unicode Consortium. The alphabets and other writing systems +representable with Unicode include all Latin-alphabet systems, Greek, +Russian and other Cyrillic-alphabet systems, Hebrew, Arabic, the various +languages of India, Chinese, Japanese, Korean, and others. The existing +Unicode symbols include chess pieces, astrological signs, gaming symbols, +telephones, pointing fingers, etc. --- just about any type of FIGcharacter +you may wish to create. Unicode is constantly (but slowly) being extended +to handle new writing systems and symbols. Information on Unicode is +available at http://www.unicode.org and at ftp://unicode.org . + +Unicode, Latin-1, and ASCII all specify the same meanings for overlapping +character codes: ASCII 65 = Latin-1 65 = Unicode 65 = "A", formally known +as "LATIN CAPITAL LETTER A". + +Since a keyboard usually has only about 100 keys, your computer may contain +a program called a "keyboard map", which will interpret certain keystrokes +or combinations of keystrokes as different character codes. Keyboard maps +use "mapping tables" to make these determinations. The appropriate keyboard +activity for a given character code may involve several keystrokes. Almost +all systems are capable of handling at least 8-bit character sets (containing +256 characters), so there is always an active keyboard map, at least for +those characters which are not actually painted on the keys. (United States +users may not even know that their computer can interpret special keystrokes. +Such keystrokes may be something similar to holding down the ALT key while +typing a character code on the numeric keypad. Try it!) + +Below are characters 160 through 255, AS REPRESENTED ON YOUR SYSTEM. + + ������������������������������������������������ + ������������������������������������������������ + +IMPORTANT NOTE: Depending on which character set is active on your system, +you may see different characters. This document (like all computer +documents) does not contains characters per se, only bytes. What you see +above is your particular computer's representation of these byte values. +In other words, your active character set. However, if it is Latin-1, the +first visible character is an inverted "!", and the last is an umlauted "y". +Although we can safely assume your computer has ASCII, it does not +necessarily have the Latin-1 character set active. + +What does all this have to do with FIGfonts??? + +First, it should be evident that it is best to use only ASCII characters for +sub-characters when possible. This will ensure portability to different +platforms. + +FIGlet has gained international popularity, but early versions were made to +handle only FIGcharacters with assigned character codes corresponding to +ASCII. So, over the years there have been four methods used to create +"virtual mapping tables" within the program itself: + + The first method was simply to create FIGcharacters which do not + look like the ASCII character set implies. For example, a + FIGfont might contain Greek letters, and within its comments, it + may say, "If you type A, you'll get a Greek Alpha" etc. With + the advent of newer features, it is preferable not to use this + method. Instead, when possible, add new FIGcharacters to + existing FIGfonts or create new FIGfonts with FIGcharacters coded + to match the expectations of ASCII/Latin-1/Unicode, and create an + appropriate control file. (See "CONTROL FILES" below.) Remember + that Unicode includes almost any character for which you may want + to create a FIGcharacter. + + The second method was very specific, to accommodate the German + audience. A special option was added to the FIGlet program + which would re-route input characters "[", "\", and "]" to + umlauted A, O and U, while "{", "|", and "}" would become the + respective lowercase versions of these. Also, "~" was made to + become the s-z character when this special option was used. This + was called "the -D option." The addition of this feature meant + that all compatible FIGfonts must contain these Deutsch (German) + FIGcharacters, in addition to the ASCII FIGcharacters. Although + this option is still available in the most recent version, it is + no longer necessary, as the same result can be achieved by the + newer features described below. However, the requirement for + Deutsch FIGcharacters remains for backward compatibility. (Or at + least zero-width FIGcharacters in their place.) + + Later, FIGlet was made to accept control files, which are quite + literally a form of mapping table. (See "CONTROL FILES" below.) + This was a significant advance for internationalization. + + FIGlet 2.2 can now accept specially encoded formats of input + text which imply more than one byte per character. + + +CREATING FIGFONTS +======== ======== + +NOTE: FIGWin 1.0 is packaged with a program called FIGfont Editor for Windows +1.0, which is just that. There is no need to read further if you intend to +use it. However, the section "CONTROL FILES" below is still relevant. + +Since a FIGfont file is a text file, it can be created with any text editing +program on any platform, and will still be compatible with FIGdrivers on all +operating systems, except that the bytes used to indicate the end of each +text line may vary. (PC's use carriage return and linefeed at the end of +each line, Macintosh uses carriage return only, and UNIX uses linefeed only.) + +This minor difference among operating systems is handled easily by setting +your FTP program to ASCII mode during upload or download. So there is no +need to be concerned about this as long as you remember to do this during +file transfer. + +The filename of a FIGfont file must end with ".flf", which stands for +"IGettering ont". The first part of the filename should contain +only letters, and should be lowercase on operating systems which permit case +sensitive filenames. The filename should be unique in the first 8 +characters, since some older file systems truncate longer filenames. + +It is easier to modify an existing FIGfont than it is to create a new one +from scratch. The first step is to read and understand this document. +You may want to load "standard.flf" or another FIGfont into a text editor as +an example while you read. + +A FIGfont file contains three portions: a header line, comments, and +FIGcharacter data. + + +THE HEADER LINE + +The header line gives information about the FIGfont. Here is an example +showing the names of all parameters: + + flf2a$ 6 5 20 15 3 0 143 229 NOTE: The first five characters in + | | | | | | | | | | the entire file must be "flf2a". + / / | | | | | | | \ + Signature / / | | | | | \ Codetag_Count + Hardblank / / | | | \ Full_Layout* + Height / | | \ Print_Direction + Baseline / \ Comment_Lines + Max_Length Old_Layout* + + * The two layout parameters are closely related and fairly complex. + (See "INTERPRETATION OF LAYOUT PARAMETERS".) + +For those desiring a quick explanation, the above line indicates that this +FIGfont uses "$" to represent the hardblank in FIGcharacter data, it has +FIGcharacters which are 6 lines tall, 5 of which are above the baseline, no +line in the FIGfont data is more than 20 columns wide, the default horizontal +layout is represented by the number 15, there are 3 comment lines, the +default print direction for this FIGfont is left-to-right, a complete +description of default and possible horizontal and vertical layouts is +represented by the number 143, and there are 229 code-tagged characters. + +The first seven parameters are required. The last three (Direction, +Full_Layout, and Codetag_Count, are not. This allows for backward +compatibility with older FIGfonts, but a FIGfont without these parameters would +force a FIGdriver to "guess" (by means not described in this document) the +information it would expect to find in Full_Layout. For this reason, inclusion +of all parameters is strongly recommended. + +Future versions of this standard may add more parameters after Codetag_Count. + +A description of each parameter follows: + + Signature + +The signature is the first five characters: "flf2a". The first four +characters "flf2" identify the file as compatible with FIGlet version 2.0 or +later (and FIGWin 1.0). The "a" is currently ignored, but cannot be omitted. +Different characters in the "a" location may mean something in future +versions of this standard. If so, you can be sure your FIGfonts will still +work if this character is "a". + + Hardblank + +Immediately following the signature is the hardblank character. The +hardblank character in the header line defines which sub-character will be +used to represent hardblanks in the FIGcharacter data. + +By convention, the usual hardblank is a "$", but it can be any character +except a blank (space), a carriage-return, a newline (linefeed) or a null +character. If you want the entire printable ASCII set available to use, make +the hardblank a "delete" character (character code 127). With the exception +of delete, it is inadvisable to use non-printable characters as a hardblank. + + Height + +The Height parameter specifies the consistent height of every FIGcharacter, +measured in sub-characters. Note that ALL FIGcharacters in a given FIGfont +have the same height, since this includes any empty space above or below. +This is a measurement from the top of the tallest FIGcharacter to the bottom +of the lowest hanging FIGcharacter, such as a lowercase g. + + Baseline + +The Baseline parameter is the number of lines of sub-characters from the +baseline of a FIGcharacter to the top of the tallest FIGcharacter. The +baseline of a FIGfont is an imaginary line on top of which capital letters +would rest, while the tails of lowercase g, j, p, q, and y may hang below. +In other words, Baseline is the height of a FIGcharacter, ignoring any +descenders. + +This parameter does not affect the output of FIGlet 2.2 or FIGWin 1.0, but +future versions or other future FIGdrivers may use it. The Baseline +parameter should be correctly set to reflect the true baseline as described +above. It is an error for Baseline to be less than 1 or greater than the +Height parameter. + + Max_Length + +The Max_Length parameter is the maximum length of any line describing a +FIGcharacter. This is usually the width of the widest FIGcharacter, plus 2 +(to accommodate endmarks as described later.) However, you can (and probably +should) set Max_Length slightly larger than this as a safety measure in case +your FIGfont is edited to include wider FIGcharacters. FIGlet (but not +FIGWin 1.0) uses this number to minimize the memory taken up by a FIGfont, +which is important in the case of FIGfonts with many FIGcharacters. + + Old_Layout + +(See "INTERPRETATION OF LAYOUT PARAMETERS" below.) + + Comment_Lines + +Between the first line and the actual FIGcharacters of the FIGfont are the +comment lines. The Comment_Lines parameter specifies how many lines there +are. Comments are optional, but recommended to properly document the origin +of a FIGfont. + + Print_Direction + +The Print_Direction parameter tells which direction the font is to be +printed by default. A value of 0 means left-to-right, and 1 means +right-to-left. If this parameter is absent, 0 (left-to-right) is assumed. +Print_Direction may not specify vertical print, although FIGdrivers are +capable of vertical print. Versions of FIGlet prior to 2.1 ignore this +parameter. + + Full_Layout + +(See "INTERPRETATION OF LAYOUT PARAMETERS" just below.) + + Codetag_Count + +Indicates the number of code-tagged (non-required) FIGcharacters in this +FIGfont. This is always equal to the total number of FIGcharacters in the font +minus 102. This parameter is typically ignored by FIGdrivers, but can be +used to verify that no characters are missing from the end of the FIGfont. +The chkfont program will display the number of codetagged characters +in the FIGfont on which it is run, making it easy to insert this parameter +after a FIGfont is written. + + +INTERPRETATION OF LAYOUT PARAMETERS + +Full_Layout describes ALL information about horizontal and vertical layout: +the default layout modes and potential smushing rules, even when smushing is +not a default layout mode. + +Old_Layout does not include all of the information desired by the most +recent FIGdrivers, which is the inspiration for the creation of the new +Full_Layout parameter. Old_Layout is still required for backward +compatibility, and FIGdrivers must be able to interpret FIGfonts which do not +have the Full_Layout parameter. (See "STANDARDIZED CAPABILITIES OF CURRENT +AND FUTURE FIGDRIVERS".) + +Versions of FIGlet prior to 2.2 do not recognize the Full_Layout parameter. +Documentation accompanying FIGlet versions prior to 2.2 refer to Old_Layout +as "smushmode", which is somewhat misleading since it can indicate layout +modes other than smushing. + +Old_Layout and Full_Layout must contain some redundant information. + +Setting the layout parameters is a matter of adding numbers together ("code +values"). What follows is a chart of the meanings of all code values. +(You may skip down to "SETTING LAYOUT PARAMETERS STEP BY STEP" if you prefer, +or if you find this portion confusing.) + +Full_Layout: (Legal values 0 to 32767) + + 1 Apply horizontal smushing rule 1 when smushing + 2 Apply horizontal smushing rule 2 when smushing + 4 Apply horizontal smushing rule 3 when smushing + 8 Apply horizontal smushing rule 4 when smushing + 16 Apply horizontal smushing rule 5 when smushing + 32 Apply horizontal smushing rule 6 when smushing + 64 Horizontal fitting (kerning) by default + 128 Horizontal smushing by default (Overrides 64) + 256 Apply vertical smushing rule 1 when smushing + 512 Apply vertical smushing rule 2 when smushing + 1024 Apply vertical smushing rule 3 when smushing + 2048 Apply vertical smushing rule 4 when smushing + 4096 Apply vertical smushing rule 5 when smushing + 8192 Vertical fitting by default + 16384 Vertical smushing by default (Overrides 8192) + +When no smushing rules are included in Full_Layout for a given axis, the +meaning is that universal smushing shall occur, either by default or when +requested. + +Old_Layout: (Legal values -1 to 63) + + -1 Full-width layout by default + 0 Horizontal fitting (kerning) layout by default* + 1 Apply horizontal smushing rule 1 by default + 2 Apply horizontal smushing rule 2 by default + 4 Apply horizontal smushing rule 3 by default + 8 Apply horizontal smushing rule 4 by default + 16 Apply horizontal smushing rule 5 by default + 32 Apply horizontal smushing rule 6 by default + +* When Full_Layout indicates UNIVERSAL smushing as a horizontal default +(i.e., when none of the code values of horizontal smushing rules are included +and code value 128 is included in Full_Layout) Old_Layout must be set to 0 +(zero). Older FIGdrivers which cannot read the Full_Layout parameter are +also incapable of universal smushing. Therefore they would be directed to +the "next best thing", which is horizontal fitting (kerning). + +NOTE: You should NOT add the -1 value to any positive code value for +Old_Layout. This would be a logical contradiction. + +See "STANDARDIZED CAPABILITIES OF CURRENT AND FUTURE FIGDRIVERS" for the +behavior of a FIGdriver when the Full_Layout parameter is absent (presumably +in an older FIGfont). + +The following rules establish consistency between Old_Layout and Full_Layout. + + If full width is to be the horizontal default: + Old_Layout must be -1. + Full_Layout must NOT include code values 64 nor 128. + + If horizontal fitting (kerning) is to be default: + Old_Layout must be 0. + Full_Layout must include code value 64. + Full_Layout must NOT include code value 128. + + If CONTROLLED smushing is to be the horizontal default: + Old_Layout must be a positive number, represented by the added + code values of all desired horizontal smushing rules. + Full_Layout must include the code values for the SAME set of + horizontal smushing rules as included in Old_Layout. + Full_Layout must include code value 128. + + If UNIVERSAL smushing is to be the horizontal default: + Old_Layout must be 0. + Full_Layout must include code value 128. + Full_Layout must NOT include any code value under 64. + +In general terms, if Old_Layout specifies horizontal smushing rules, +Full_Layout must specify the same set of horizontal rules, and both must +indicate the same horizontal default layout mode. + + +SETTING LAYOUT PARAMETERS STEP-BY-STEP + +The following step-by-step process will yield correct and consistent values +for the two layout parameters. You may skip this if you find the +explanations above easier to use. + +Step 1: Start with 0 for both numbers. + + Write "Old_Layout" and "Full_Layout" on a piece of paper. + Write the number 0 next to each. + The number 0 may be crossed out and changed several times below. + Go to step 2. + +Step 2: Set the DEFAULT HORIZONTAL LAYOUT MODE. + + If you want to use FULL WIDTH as the default + Make Old_Layout -1 + Go to step 3. + If you want to use HORIZONTAL FITTING (kerning) as the default + Make Full_Layout 64 + Go to step 3. + If you want to use HORIZONTAL SMUSHING as the default + Make Full_Layout 128 + Go to step 3. + +Step 3: Specify HOW TO SMUSH HORIZONTALLY WHEN SMUSHING. + + If you want to use UNIVERSAL smushing for the horizontal axis + Go to step 4. + If you want to use CONTROLLED smushing for the horizontal axis + Add together the code values for all the horizontal smushing + rules you want from the list below to get the horizontal + smushing rules total. + + EQUAL CHARACTER SMUSHING 1 + UNDERSCORE SMUSHING 2 + HIERARCHY SMUSHING 4 + OPPOSITE PAIR SMUSHING 8 + BIG X SMUSHING 16 + HARDBLANK SMUSHING 32 + + Horizontal smushing rules total: ___ + + If Full_Layout is currently 128 + Change Old_Layout to the horizontal smushing rules total. + Increase Full_Layout by the horizontal smushing rules total. + Go to Step 4. + If Full_Layout is currently 0 or 64 + Increase Full_Layout by the horizontal smusing rules total. + Go to Step 4. + +Step 4: Set the DEFAULT VERTICAL LAYOUT MODE. + + If you want to use FULL HEIGHT as the default + Go to step 5. + If you want to use VERTICAL FITTING as the default + Increase Full_Layout by 8192. + Go to step 5. + If you want to use VERTICAL SMUSHING as the default + Increase Full_Layout by 16384. + Go to step 5. + +Step 5: Specify HOW TO SMUSH VERTICALLY WHEN SMUSHING. + + If you want to use UNIVERSAL smushing for the vertical axis + Go to step 6. + If you want to use CONTROLLED smushing for the vertical axis + Add together the code values for all the vertical smushing + rules you want from the list below to get the vertical + smushing rules total. + + EQUAL CHARACTER SMUSHING 256 + UNDERSCORE SMUSHING 512 + HIERARCHY SMUSHING 1024 + HORIZONTAL LINE SMUSHING 2048 + VERTICAL LINE SUPERSMUSHING 4096 + + Vertical smushing rules total: ____ + + Increase Full_Layout by the vertical smushing rules total. + Go to step 6. + +Step 6: You're done. + +The resulting value of Old_Layout will be a number from -1 to 63. +The resulting value of Full_Layout will be a number from 0 and 32767. + + +FIGFONT COMMENTS + +After the header line are FIGfont comments. The comments can be as many +lines as you like, but should at least include your name and Email address. +Here is an example which also shows the header line. + + flf2a$ 6 5 20 15 3 0 143 + Example by Glenn Chappell 8/94 + Permission is hereby given to modify this font, as long as the + modifier's name is placed on a comment line. + +Comments are not required, but they are appreciated. Please comment your +FIGfonts. + +Remember to adjust the Comment_Lines parameter as you add lines to your +comments. Don't forget that blank lines DO count. + + +FIGCHARACTER DATA +============ ==== + +The FIGcharacter data begins on the next line after the comments and +continues to the end of the file. + +BASIC DATA STRUCTURE + +The sub-characters in the file are given exactly as they should be output, +with two exceptions: + + 1) Hardblanks should be the hardblank character specified in the + header line, not a blank (space). + + 2) Every line has one or two endmark characters, whose column + locations define the width of each FIGcharacter. + +In most FIGfonts, the endmark character is either "@" or "#". The FIGdriver +will eliminate the last block of consecutive equal characters from each line +of sub-characters when the font is read in. By convention, the last line of +a FIGcharacter has two endmarks, while all the rest have one. This makes it +easy to see where FIGcharacters begin and end. No line should have more +than two endmarks. + +Below is an example of the first few FIGcharacters, taken from small.flf. + +NOTE: The line drawn below consisting of "|" represents the left margin of +your editor. It is NOT part of the FIGfont. Also note that hardblanks are +represented as "$" in this FIGfont, as would be described in the header line. + + |$@ + |$@ + blank/space |$@ + |$@ + |$@@ + | _ @ + || |@ + exclamation point ||_|@ + |(_)@ + | @@ + | _ _ @ + |( | )@ + double quote | V V @ + | $ @ + | @@ + | _ _ @ + | _| | |_ @ + number sign ||_ . _|@ + ||_ _|@ + | |_|_| @@ + | @ + | ||_@ + dollar sign |(_-<@ + |/ _/@ + | || @@ + +Notice that each FIGcharacter occupies the same number of lines (6 lines, in +this case), which must also be expressed in the header line as the Height +parameter. + +Also notice that for every FIGcharacter, there must be a consistent width +(length) for each line once the endmarks are removed. To do otherwise would +be an error. + +Be aware of the vertical alignment of each FIGcharacter within its height, +so that all FIGcharacters will be properly lined up when printed. + +If one of the last sub-characters in a particular FIGcharacter is "@", you +should use another character for the endmark in that FIGcharacter so that +the intended "@" is not interpreted as an endmark. "#" is a common +alternative. + +Load a few existing FIGfonts into your favorite text editor for other +examples. + + +REQUIRED FIGCHARACTERS + +Some FIGcharacters are required, and must be represented in a specific order. +Specifically: all of the printable character codes from ASCII shown in the +table below, in order, plus character codes 196, 214, 220, 228, 246, 252, +and 223, in that order. In Latin-1, these extra 7 characters represent the +following German characters: umlauted "A", "O", "U", "a", "o" and "u"; and +also "ess-zed". + + Printable portion of the ASCII character set: + + 32 (blank/space) 64 @ 96 ` + 33 ! 65 A 97 a + 34 " 66 B 98 b + 35 # 67 C 99 c + 36 $ 68 D 100 d + 37 % 69 E 101 e + 38 & 70 F 102 f + 39 ' 71 G 103 g + 40 ( 72 H 104 h + 41 ) 73 I 105 i + 42 * 74 J 106 j + 43 + 75 K 107 k + 44 , 76 L 108 l + 45 - 77 M 109 m + 46 . 78 N 110 n + 47 / 79 O 111 o + 48 0 80 P 112 p + 49 1 81 Q 113 q + 50 2 82 R 114 r + 51 3 83 S 115 s + 52 4 84 T 116 t + 53 5 85 U 117 u + 54 6 86 V 118 v + 55 7 87 W 119 w + 56 8 88 X 120 x + 57 9 89 Y 121 y + 58 : 90 Z 122 z + 59 ; 91 [ 123 { + 60 < 92 \ 124 | + 61 = 93 ] 125 } + 62 > 94 ^ 126 ~ + 63 ? 95 _ + + Additional required Deutsch FIGcharacters, in order: + + 196 (umlauted "A" -- two dots over letter "A") + 214 (umlauted "O" -- two dots over letter "O") + 220 (umlauted "U" -- two dots over letter "U") + 228 (umlauted "a" -- two dots over letter "a") + 246 (umlauted "o" -- two dots over letter "o") + 252 (umlauted "u" -- two dots over letter "u") + 223 ("ess-zed" -- see FIGcharacter illustration below) + ___ + / _ \ + | |/ / + Ess-zed >>---> | |\ \ + | ||_/ + |_| + +If you do not wish to define FIGcharacters for all of those required above, +you MAY create "empty" FIGcharacters in their place by placing endmarks flush +with the left margin. The Deutsch FIGcharacters are commonly created as +empty. If your FIGfont includes only capital letters, please copy them to +the appropriate lowercase locations, rather than leaving lowercase letters +empty. A FIGfont which does not include at least all ASCII letters, a space, +and a few basic punctuation marks will probably frustrate some users. (For +example "@" is more frequently desired as a FIGcharacter than you may think, +since Email addresses may be written as FIGures.) + + +CODE TAGGED FIGCHARACTERS + +After the required FIGcharacters, you may create FIGcharacters with any +character code in the range of -2147483648 to +2147483647. (Over four +billion possibilities, which is "virtual infinity" for this purpose.) +One exception: character code -1 is NOT allowed for technical reasons. +It is advisable to assign character codes such that the appearance of your +FIGcharacters matches the expectations of ASCII/Latin-1/Unicode, with a few +exceptions: + + 1) If a FIGcharacter with code 0 is present, it is treated + specially. It is a FIGfont's "missing character". Whenever + the FIGdriver is told to print a character which doesn't exist + in the current FIGfont, it will print FIGcharacter 0. If there + is no FIGcharacter 0, nothing will be printed. + + 2) If a FIGfont contains a non-Latin alphabet in character codes + in the ASCII range 32-126 (which is discouraged), we have found + it helpful to include a human-readable translation table as one + of the FIGcharacters instead of a "glyph". Typically, the "~" + would contain this table. The translation table FIGcharacter + would contain a list of all the special characters in the + FIGfont, along with the ASCII characters to which they + correspond. Keep this table no more than 79 columns wide. + (Thanks to Gedaliah Friedenberg for this idea.) + + 3) In more extensive Unicode fonts, you can assign a negative + character code (other than -1) to one or more translation + tables, similar to #2 above. (All Unicode character codes are + positive.) And, you will most likely suggest within the + comments that a user access one of several control files (See + "CONTROL FILES" below) to gain access to Latin-2, Latin-3, or + other 8-bit standardized character sets. The control files may + redirect the "~" character to one of the negative character codes so + that the translation table would display the table when "~" is + given for input. Doing this allows you to still have a "~" + FIGcharacter for those who do not use a control file. + +Those FIGcharacters which are not required must have an explicit character +code in a separate line preceding them, called a "code tag". A code tag +contains the value of the character code, followed by whitespace (a few +spaces), and perhaps an optional comment. The comment is usually the name of +the FIGcharacter. The Unicode Consortium has assigned formal names to all +officially accepted characters, and these may be used. An entire code tag, +including the comment, should not occupy more than 95 columns. (Over 100 +characters here may make older versions of FIGlet crash.) + +Here is an example, showing two code tagged FIGcharacters after the last two +required Deutsch FIGcharacters. Again, the line drawn below consisting of +"|" represents the left margin of your editor, and is NOT part of the FIGfont. + + | _ _ @ + |(_) (_)@ + || | | |@ + || |_| |@ + | \__,_|@ + | @@ + | ___ @ + | / _ \@ + || |/ /@ + || |\ \@ + || ||_/@ + ||_| @@ + |161 INVERTED EXCLAMATION MARK + | _ @ + |(_)@ + || |@ + || |@ + ||_|@ + | @@ + |162 CENT SIGN + | _ @ + | | | @ + | / __)@ + || (__ @ + | \ )@ + | |_| @@ + + +A character code may be expressed in decimal (as shown above, numbers we're +all familiar with), or in Octal (seldom used) or in hexadecimal. + +Character codes expressed in octal must be preceded by "0" (zero), and if +negative, "-" (minus) must precede the "0". There are eight octal digits: +01234567. You may recall octal numbers from school as "base 8 numbers". + +Character codes expressed in hexadecimal must be preceded by "0x" or "0X". +(That's also a zero.) If negative, the "-" must precede the "0x". There are +16 hexadecimal digits: 01234567890ABCDEF. (The "letter-digits" may also be +lowercase.) Hexadecimal is "base 16". + +It is common to express character codes less than 256 (in the range of an +8-bit character set) as decimal, while FIGfonts which extend into the Unicode +range would have character codes expressed in hexadecimal. This is because +the Unicode Standard expresses character codes in hexadecimal, which is +helpful for programmers. + +The code tagged FIGcharacters may be listed in any order, but simple +sequential order is recommended. + +If two or more FIGcharacters have the same character code, the last one in +the FIGfont is the one used. It is common for the Deutsch FIGcharacters to +be given twice in a FIGfont, just to maintain a consistent order for the +Latin-1 range (128 to 255). + +It is not advisable to assign character codes in the range of 1 to 31, since +this range includes control characters in ASCII. Character code 127 is a +delete in ASCII, and is also not advised. Character codes 128 to 159 are +additional control characters in Latin-1, and they too should not be used. +All of the above are legal, technically, but are not part of what is legal +for input, so they could only be accessed by use of a control file. +(See "CONTROL FILES" below.) If you are still tempted to use them, consider +negative character codes instead, which are meaningless in all standardized +character sets. + +Again, the character code -1 is illegal for technical reasons. + + +NOTES - AVOIDING ERRORS AND GENERAL ADVICE +===== ======== ====== === ======= ====== + +It is very important that every character in a font has the same height, and, +once the endmarks are removed, that all the lines constituting a single +FIGcharacter have the same length. Be careful also that no lines in the font +file have trailing blanks (spaces), as the FIGdriver will take these to be +the endmarks. (FIGWin 1.0 will not consider blanks to be endmarks.) + +Errors in a FIGfont can be detected by using the "chkfont" program, +part of the standard FIGlet package, and also available, as of this +writing from http://www.figlet.org/ +� +For FIGWin users, the FIGWin program will report errors when a FIGfont is +read in; it is less forgiving than FIGlet, which can produce nonsense if the +FIGfont is incorrectly formatted. + +Remember that sub-characters outside of the ASCII range will not necessarily +display the same way on your system as on others. + +The blank (space) FIGcharacter should usually consist of one or two columns +of hardblanks and nothing else; slanted fonts are an exception to this rule. +If the space FIGcharacter does not contain any hardblanks, it will disappear +when horizontal fitting (kerning) or smushing occurs. + +Again, if you design a FIGfont, please let us know! + + +CONTROL FILES +======= ===== + +A FIGfont control file is a separate text file, associated with one or more +FIGfonts, that indicates how to map input characters into FIGfont character +codes. By default, FIGdrivers read single bytes from the input source and +interpret them as Latin-1 FIGcharacters. + +FIGlet version 2.2 (and later) can optionally interpret its input as DBCS or +UTF-8 characters, making it possible to access FIGcharacters with codes +outside the Latin-1 range (greater than 255). + +In addition, though, all versions of FIGlet can use control files to +transform specific character codes (or ranges of codes) as other codes +(or ranges). Multiple control files can be specified, in which case multiple +stages of transformation are performed. + +The filename of a control file always ends with ".flc". + +CONTROL FILE FORMAT + +Control files contain several kinds of lines. Lines beginning with "#", as +well as blank lines, are comment lines and are ignored. All other lines are +command lines, with one of the following formats: + + t inchar outchar + t inchar1-inchar2 outchar1-outchar2 + number number + f + h + j + b + u + g{0|1|2|3} {94|96|94x94} [char] + g{L|R} {0|1|2|3} + +where "inchar", "outchar", and "char" are either Latin-1 characters +representing their own codes, or else are numeric character codes preceded by +a "\" character; and "number" is a numeric character code with no preceding +"\" character. + +Thus "A" represents the code 65, as does "\65", and "\0x100" represents the +code 256 (100 in hexadecimal). In addition, "\ " (backslash followed by a +space) represents the code 32 (space), and the following backslash sequences +are also understood: + + \a code 7 (a bell/alert) + \b code 8 (a backspace) + \e code 27 (an ESC character) + \f code 12 (a form feed) + \n code 10 (a newline/line feed) + \r code 13 (a carriage return) + \t code 9 (a horizontal tab) + \v code 11 (a vertical tab) + \\ code 92 (a backslash) + +All of these combinations except perhaps "\\" are very unlikely to be used, +but they are provided just in case they are needed. + +Whitespace characters are used between "t" and "inchar" and between "inchar" +and "outchar", but not around the "-" characters used in the second type of +"t" command. + +The term "string" refers to any number of characters represented in the +format given above. The characters begin after the whitespace following the +letter "s", and continue to the end of the line. + +Anything following the first letter of an "f", "h", "j", or "u" command is +ignored. + +The first type of "t" command transforms characters with the code "inchar" +into characters with the code "outchar". The second type of "t" command +transforms characters in the range "inchar1" to "inchar2" as the +corresponding codes in the range "outchar1" to "outchar2". Both ranges must +be of the same size. The form "number number" is equivalent to a "t" +command of the first type, and is provided for compatibility with the mapping +tables issued by the Unicode Consortium. + +Multiple transformation stages can be encoded in a single control file by +using "f" commands to separate the stages. + +Versions of FIGlet before 2.1 required that the first line of a control file +consist of the signature string "flc2a". This signature line is still +permitted in FIGlet 2.2 and later versions, but is no longer required. + +Here is an example of a control file. The blanks at the beginning of each +line are for readability only, and are not part of the file. + +The following control file: + + flc2a + t # $ + t A-Z a-z + +will map the "#" character to "$", and will also convert uppercase ASCII to +lowercase ASCII. + +If a number of consecutive "t" commands are given, then for each character +processed, only the first applicable command (if any) will be executed. +Consider this control file: + + t A B + t B A + +It will swap the characters "A" and "B". If the FIGdriver reads an "A", the +first command will change "A" to "B", in which case the second will not be +executed. If the FIGdriver reads a "B", the first command will have no +effect, and the second command will change "B" to "A". Here is another +control file: + + t A B + t A C + +In this example, the second line is never executed. In short, a sequence of +"t" lines "does what it ought to". + +More complex files, in which a single character is acted upon by several "t" +commands, can be set up using an "f" command. For example: + + flc2a + t a-z A-Z + f + t Q ~ + +This control file specifies two transformation stages. In the first stage, +lowercase ASCII letters are changed to their uppercase equivalents. The +second stage maps any Q (whether original or a converted "q") into the "~" +character. If the "f" command were omitted, "q" characters would remain "Q" +and not be converted to "~". + +EXTENDED COMMANDS + +The "h", "j", "b", "u", and "g" commands are only understood by FIGlet +version 2.2 or later. They control how a FIGdriver interprets bytes in the +input. By default, the FIGdriver interprets each byte of input as a distinct +character. This mode is suitable for most character encodings. All these +commands are logically acted on before any other control file commands, no +matter where in the sequence of control files they appear. They are also +mutually exclusive; if more than one of these commands is found, only the +last is acted on. Multiple "g" commands are permitted, however. + +The "h" command forces the input to be interpreted in HZ mode, which is used +for the HZ character encoding of Chinese text. In this mode, the sequence +"~{" (which is removed from the input) signals that all following characters +are two bytes long until the sequence "~}" is detected. In addition, the +sequence "~~" is changed to just "~", and all other two-byte sequences +beginning with "~" are removed from the input. The character code +corresponding to a two-byte character is: + + first character * 256 + second character + +The "j" command forces the input to be interpreted in Shift-JIS mode (also +called "MS-Kanji mode"). Input bytes in the ranges 128-159 and 224-239 are +read as the high-order byte of a two-byte character; all other bytes are +interpreted as one-byte characters. The value of a two-byte character is +determined in the same way as in HZ mode. + +The "b" command forces the input to be interpreted in DBCS mode, which is +suitable for processing HZ or Shift-GB Chinese text or Korean text. Input +bytes in the ranges 128-255 are read as the high-order byte of a two-byte +character; all other bytes are interpreted as one-byte characters. The +value of a two-byte character is determined in the same way as in HZ mode. + +The "u" command forces the input to be interpreted in UTF-8 mode, which +causes any input byte in the range 0x80 to 0xFF to be interpreted as the +first byte of a multi-byte Unicode (ISO 10646) character. UTF-8 characters +can be from 1 to 6 bytes long. An incorrectly formatted sequence is +interpreted as the character 128 (normally an unused control character). + +Otherwise, the input is allowed to contain ISO 2022 escape sequences, which +are decoded to generate appropriate character codes. These character codes +are *not* a subset of Unicode, but may be more useful in processing East +Asian text. A brief explanation of ISO 2022 is given here in order to +clarify how a FIGdriver should interpret it. The "g" command provides +information for the ISO 2022 interpreter, and is explained below. + +ISO 2022 text is specified using a mixture of registered character sets. +At any time, up to four character sets may be available. Character sets +have one of three sizes: single-byte character sets with 94 characters +(e.g. ASCII), single-byte character sets with 96 characters (e.g. the top +halves of ISO Latin-1 to Latin-5), or double-byte character sets with +94 x 94 characters (e.g. JIS 0208X-1983). Each registered character set has +a standard designating byte in the range 48 to 125; the bytes are unique withi +n character set sizes, but may be reused across sizes. For example, byte 66 +designates the 94-character set ASCII, the 96-character set ISO Latin-2 (top +half), and the 94 x 94 Japanese character set JIS 0208X-1983. In this +document, the designating byte of a character set will be represented by . + +The four available character sets are labeled G0, G1, G2, and G3. Initially, +G0 is the 94-character set ASCII, and G1 is the 96-character set ISO Latin-1 +(top half). The other character sets are unassigned. The following escape +sequences (where ESC = the byte 27) specify changes to the available +character sets: + + ESC ( Set G0 to the 94-character set + ESC ) Set G1 to the 94-character set + ESC * Set G2 to the 94-character set + ESC + Set G3 to the 94-character set + ESC - Set G1 to the 96-character set + ESC . Set G2 to the 96-character set + ESC / Set G3 to the 96-character set + ESC $ Set G0 to the 94 x 94 character set + ESC $ ( Set G0 to the 94 x 94 character set + ESC $ ) Set G1 to the 94 x 94 character set + ESC $ * Set G2 to the 94 x 94 character set + ESC $ + Set G3 to the 94 x 94 character set + + +Note that G0 may not be a 96-character set, and that there are two ways to +specify a 94 x 94 character set in G0, of which the first is deprecated. + +ISO 2022 decoding affects input bytes in the ranges 33 to 126 and 160 to 255, +known as "the left half" and "the right half" respectively. All other bytes, +unless they belong to a control sequence shown in this document, remain +unchanged. Initially, the left half is interpreted as character set G0, +and the right half as character set G1. This can be changed by the following +control sequences: + + SI (byte 15) Interpret the left half as G1 characters + SO (byte 14) Interpret the left half as G0 characters + ESC n Interpret the left half as G2 characters + ESC o Interpret the left half as G3 characters + ESC ~ Interpret the right half as G1 characters + ESC } Interpret the right half as G2 characters + ESC | Interpret the right half as G3 characters + SS2 (byte 142) Interpret next character only as G2 + ESC N Interpret next character only as G2 + SS3 (byte 143) Interpret next character only as G3 + ESC O Interpret next character only as G3 + + +This rich schema may be used in various ways. In ISO-2022-JP, the Japanese +flavor of ISO 2022, only the bytes 33-126 and the G0 character set is used, +and escape sequences are used to switch between ASCII, ISO-646-JP (the +Japanese national variant of ASCII), and JIS 0208X-1983. In other versions, +the G1 character set has 94 x 94 size, and so any byte in the range 160-255 +is automatically the first byte of a double-byte character. + +FIGdrivers that support ISO 2022 do so in the following way. Each character i +is decoded and assigned to a character set . + + If the character belongs to a 94-bit character set, + then if its value exceeds 128, it is reduced by 128, + and the value 65536 * is added to it, + unless is 66 (ASCII). + If the character belongs to a 96-bit character set, + then if its value is less than 128, it is increased by 128, + and the value 65536 * is added to it, + unless is 65 (ISO Latin-1). + If the character belongs to a 94 x 94 character set, + then the value is the sum of: + the first byte * 256, + plus the second byte, + plus the value 65536 * . + + +Thus, the character code 65 ("A") in ASCII remains 65, the character code +196 in ISO Latin-1 ("A-umlaut") remains 196, the character code 65 (0x41) +in ISO-646-JP (whose is 74 = 0x4A) becomes 0x4A0041 =4849729, and the +two-byte sequence 33 33 (0x21 0x21) in JIS 0208X-1983 (whose is +65 = 0x41) becomes 0x412121 = 4268321. These codes may be used in compiling +FIGfonts suitable for use with ISO 2022 encoded text. + +The initial settings of G0 through G3 and their assignments to the left half +and the right half can be altered in a control file by using "g" commands, +as follows: + + g {0|1|2|3} {94|96|94x94} [] + +specifies that one of G0-G3 is a 94, 96, or 94x94 character set with +designating character . If no designating character is specified, then a + value of zero is assumed. + +For example, the list of control commands: + + g 0 94 B + g 1 96 A + +sets the G0 character set to ASCII (94-character set "B") and the G1 +character set to the top half of Latin-1 (96-character set "A"). (This is the +default setting). + +To change the initial assignments of G0 to the left half and G1 to the right +half, "g" commands of the form + + g {L|R} {0|1|2|3} + +For example, the command: + + g R 2 + +causes right-half bytes (in the range 160-255) to be interpreted as G2. +Whether these bytes are interpreted singly or in pairs depends on the type +of character set that is currently available as G2. + +Spaces may be freely used or omitted in "g" commands. + +The standard FIGlet distribution contains mapping tables for Latin-2 (ISO 8859-2), +Latin-3 (ISO 8859-3), Latin-4 (ISO 8859-4), and Latin-5 (ISO 8859-9). They +can be used with the font "standard.flf", which contains all the characters +used in these standards. + + +STANDARDIZED CAPABILITIES OF CURRENT AND FUTURE FIGDRIVERS +============ ============ == ======= === ====== ========== + +We assert the following as the "Law" of our intentions: + +PROFIT + +All future FIGdrivers shall be FREE OF CHARGE to the general public via the +Internet. Any advertisements of other works by the author must be in +documentation only, and limited to ONE "screenful", and shall not appear by +normal program behavior, nor interfere with normal behavior. No FIGdriver +shall disable itself after a set period of time or request "donations". +No FIGdriver shall offer any other FIGdriver with improved capability for +creating FIGures in exchange for money. + +REQUIRED FEATURES OF FUTURE VERSIONS + +Future FIGdrivers must read and process FIGfont files as described in this +document, but are not necessarily expected to process control files, smush, +perform fitting or kerning, perform vertical operations, or even produce +multiple lines in output FIGures. + +FIGDRIVER NAMES + +Future FIGdrivers must be named to include capitalized "FIG" and shall have +an incremental version number specific to its own platform. + +BACKWARDS COMPATIBILITY OF FUTURE VERSIONS + +Any future FIGdriver created for the same platform as an existing FIGdriver, +and using the same name as the existing FIGdriver, shall be considered a new +version of the preceding FIGdriver, and shall contain all historical comments +of updates to past versions on the same platform, and shall have full +capability of the preceding versions. If the source code is not provided to +the general public, it shall be at least provided to any potential developers +of later versions, and such comments relating to past versions shall be +accessible to any user by other means or documentation. If a new program is +created on a platform that already has an existing FIGdriver, it must be +given a new and distinct name. This allows multiple FIGdrivers to exist for +the same platform with different capabilities. + +The format of FIGfonts may not be modified to be non-backwards compatible +UNLESS: + + 1) The new format is easily editable as an ASCII text file, + beginning with the characters "flf" followed by a sequential + number. + + 2) At least all of the same information can be derived from the + new format as the prior format (currently "flf2"). This + includes the main comments which give credit to the FIGfont + designer. + + 3) Individuals are found who are willing and have the ability to + either port or develop versions for at least UNIX, DOS, + Windows, and Amiga which will read both the new formats AND the + prior format (currently "flf2"), and retain the capability of + past versions. It is intended that this will be expanded to + include Macintosh if a GUI version exists. This list of + required operating systems may be reduced if an operating + system falls out of popularity or increased if a new operating + system for which there is a FIGdriver comes into greater + popularity, according to the consensus of opinions of past + developers for the most popular operating systems. + + 4) A C, Java, or other version must always exist which can + receive input and instructions either from a command line, a + file, or directly over the internet so that FIGures can be + obtained from internet-based services without the need to + download any FIGdriver. + + 5) All existing FIGfonts available from the "official" point of + distribution (http://www.figlet.org/), + must be converted to the new format, and offered for download + alongsidethe new versions. + +THE FUNCTION OF WORD WRAPPING + +All future FIGdrivers should duplicate these behaviors, unless a version is +only capable of outputting one-line FIGures, which is acceptable as long no +preceding versions exist for its platform which can output multiple-line +FIGures. + +FIGdrivers which perform word wrapping do so by watching for blanks (spaces) +in input text, making sure that the FIGure is no more wide than the maximum +width allowed. + +Input text may also include linebreaks, so that a user may specify where +lines begin or end instead of relying on the word wrapping of the FIGdriver. +(Linebreaks are represented by different bytes on different platforms, so +each FIGdriver must watch for the appropriate linebreaks for its particular +platform.) + +When a FIGdriver word wraps and there are several consecutive blanks in input +text where the wrapping occurred, the FIGdriver will disregard all blanks +until the next non-blank input character is encountered. However, if blanks +in input text immediately follow a linebreak, or if blanks are the first +characters in the input text, the blanks will be "printed", moving any +visible FIGcharacters which follow on the same output line to the right. +Similarly, if an image is right-aligned, and blanks immediately precede +linebreaks or the end of input text, a FIGdriver will move an entire line of +output FIGcharacters to the left to make room for the blank FIGcharacters +until the left margin is encountered. (If the print direction is +right-to-left, everything stated in this paragraph is reversed.) + +Word processing programs or text editors usually behave similarly in all +regards to word wrapping. + +GENERAL INTENT FOR CROSS-PLATFORM PORTABILITY + +Currently, all versions of FIGlet are compiled from C code, while FIGWin 1.0 +is written in Visual Basic. Over time it is intended that a later version of +FIGWin will be created using a GUI C programming language, and that the +FIGlet C code shall continue to be written to be easily "plugged in" to a +GUI shell. It is preferable for developers of FIGdrivers for new platforms +to use C or a GUI version of C, so that when the core rendering engine of +FIGlet is updated, it will be portable to other platforms. + +CONTROL FILE COMMANDS + +New control file commands may be added to later versions of this standard. +However, the commands "c", "d", and "s" are permanently reserved and may +never be given a meaning. + +FILE COMPRESSION + +FIGfonts (and control files) are often quite long, especially if many +FIGcharacters are included, or if the FIGcharacters are large. Therefore, +some FIGdrivers (at present, only FIGlet version 2.2 or later) allow +compressed FIGfonts and control files. + +The standard for FIG compression is to place the FIGfont or control file into +a ZIP archive. ZIP archives can be created by the proprietary program PKZIP +on DOS and Windows platforms, or by the free program Info-ZIP ZIP on almost +all platforms. More information on ZIP can be obtained at +http://www.cdrom.com/pub/infozip/Info-Zip.html . + +The ZIP archive must contain only a single file. Any files in the archive +after the first are ignored by FIGdrivers. In addition, the standard +extension ".zip" of the archive must be changed to ".flf" or ".flc" as +appropriate. It does not matter what the name of the file within the +archive is. + + + +CHART OF CAPABILITIES OF FIGLET 2.2 AND FIGWIN 1.0 +===== == ============ == ====== === === ====== === + +The following chart lists all capabilities which are either new with the +release of both FIGdrivers, or is not a common capability among both. + + FIGlet 2.2 FIGWIN 1.0 + Interpreting the Full_Layout parameter: Yes Yes + Universal smushing: Yes Yes + Supporting multi-byte input text formats: Yes No + Processing control files: Yes No + Changing default smushing rules: Yes No + Bundled with a GUI editor of FIGfonts: No Yes + Vertical fitting and smushing: No Yes + + ___________ __ _ + \_ _____/ ____ |__| ____ ___ __ | | + | __)_ / \ | |/ _ < | || | + | \ | \ | ( <_> )___ | \| + /_______ /___| /\__| |\____// ____| __ + \/ \/\______| \/ \/ diff --git a/externals/figlet/figlet.6 b/externals/figlet/figlet.6 new file mode 100644 index 0000000000..ff2231140e --- /dev/null +++ b/externals/figlet/figlet.6 @@ -0,0 +1,1102 @@ +.\" FIGlet +.\" Copyright (C) 1991, 1993, 1994 Glenn Chappell and Ian Chai +.\" Internet: +.\" Portions Copyright 1996, 1997, 1998, 1999, 2000, 2001 by John Cowan +.\" Portions Copyright 2002 by Christiaan Keet +.\" Portions Copyright 2011, 2012 by Claudio Matsuoka +.\" FIGlet, along with the various FIGlet fonts and documentation, may +.\" be freely copied and distributed. +.\" If you use FIGlet, please send an e-mail message to +.\" +.\" +.TH FIGLET 6 "31 May 2012" "v2.2.5" + +.SH NAME +FIGlet \- display large characters made up of ordinary screen characters + +.SH SYNOPSIS +.B figlet +[ +.B \-cklnoprstvxDELNRSWX +] +[ +.B \-d +.I fontdirectory +] +.PD 0 +.IP +.PD +[ +.B \-f +.I fontfile +] +[ +.B \-m +.I layoutmode +] +.PD 0 +.IP +.PD +[ +.B \-w +.IR outputwidth +] +[ +.B \-C +.I controlfile +] +.PD 0 +.IP +.PD +[ +.B \-I +.I infocode +] +[ +.I message +] + +.SH DESCRIPTION +.B FIGlet +prints its input using large characters +(called ``FIGcharacters'')made up of ordinary +screen characters +(called ``sub-characters''). +.B FIGlet +output is generally reminiscent of the +sort of ``signatures'' many people like to put at the end of e-mail +and UseNet messages. It is also reminiscent of the output of some banner +programs, although it is oriented normally, not sideways. + +.B FIGlet +can print in a variety of fonts, both left-to-right and right-to-left, +with adjacent FIGcharacters kerned and ``smushed'' together in various ways. +.B FIGlet +fonts are stored in +separate files, which can be identified by the suffix +.RB `` .flf ''. +In systems with UTF-8 support +.B FIGlet +may also support TOIlet +.RB `` .tlf '' +fonts. Most +.B FIGlet +font files will be stored in +.B FIGlet's +default font directory. + +.B FIGlet +can also use ``control files'', which tell it to map certain input +characters to certain other characters, similar to the Unix +.B tr +command. Control files can be identified by the suffix +.RB `` .flc ''. +Most +.B FIGlet +control files will be stored in +.B FIGlet's +default font directory. + +You can store +.B FIGlet +fonts and control files +in compressed form. +See +.BR "COMPRESSED FONTS" . + +.SH USAGE +Just start up +.B FIGlet +(type +.RB `` figlet '') +and then type whatever you want. +Alternatively, pipe a file or the output of another command through +.BR FIGlet , +or put input on the command line +after the options. +See +.B EXAMPLES +for other things to do. + +.SH OPTIONS +.B FIGlet +reads command line options from left to right, and only the last +option that affects a parameter has any effect. Almost every option +has an inverse, so that, for example, if +.B FIGlet +is customized with a shell +.BR alias , +all the options are usually still available. + +Commonly-used options are +.BR \-f , +.BR \-c , +.BR \-k , +.BR \-t , +.B \-p +and +.BR \-v . + +.TP +.BI \-f \ fontfile +Select the font. The +.B .flf +suffix may be left off of +.IR fontfile , +in which case +.B FIGlet +automatically appends it. +.B FIGlet +looks for the file first in the default font directory and then +in the current directory, or, if +.I fontfile +was given as a full pathname, in the given directory. +If the +.B \-f +option is not specified, +.B FIGlet +uses the font that was specified +when it was compiled. To find out which font this is, use the +.B \-I3 +option. + +.TP +.BI \-d \ fontdirectory +Change the default font directory. +.B FIGlet +looks for fonts first in the +default directory and then in the current directory. +If the +.B \-d +option is not specified, +.B FIGlet +uses the directory that was specified +when it was compiled. To find out which directory this is, use the +.B \-I2 +option. + +.TP +.B \-c +.PD 0 +.TP +.B \-l +.PD 0 +.TP +.B \-r +.PD 0 +.TP +.B \-x +.PD +These options handle the justification of +.B FIGlet +output. +.B \-c +centers the output horizontally. +.B \-l +makes the output flush-left. +.B \-r +makes it flush-right. +.B \-x +(default) sets the justification according to whether left-to-right or +right-to-left text is selected. Left-to-right text will be flush-left, +while right-to-left text will be flush-right. (Left-to-right versus +right-to-left text is controlled by +.BR \-L , +.B \-R +and +.BR \-X .) + +.TP +.B \-t +.PD 0 +.TP +.BI \-w \ outputwidth +.PD +These options control the +.IR outputwidth , +or the screen width +.B FIGlet +assumes when formatting its output. +.B FIGlet +uses the +.I outputwidth +to determine when to break lines and how to center +the output. Normally, +.B FIGlet +assumes 80 columns so that people with wide terminals +won't annoy the people they e-mail +.B FIGlet +output to. +.B \-t +sets the +.I outputwidth +to the terminal width. If the terminal width cannot be determined, +the previous +.I outputwidth +is retained. +.B \-w +sets the +.I outputwidth +to the given integer. An +.I outputwidth +of 1 is a special value that tells +.B FIGlet +to print each non-space FIGcharacter, in its entirety, on a separate line, +no matter how wide it is. + +.TP +.B \-p +.PD 0 +.TP +.B \-n +.PD +These options control how +.B FIGlet +handles newlines. +.B \-p +puts +.B FIGlet +into ``paragraph mode'', which eliminates some unnecessary line +breaks when piping a multi-line file through +.BR FIGlet . +In paragraph mode, +.B FIGlet +treats line breaks within a paragraph as if they were merely blanks +between words. (Specifically, +.B \-p +causes +.B FIGlet +to convert any newline which is not preceded by a newline and not +followed by a space character into a blank.) +.B \-n +(default) puts +.B FIGlet +back to normal, in which every newline +.B FIGlet +reads causes it to produce a line break. + +.TP +.B \-D +.PD 0 +.TP +.B \-E +.PD +.B \-D +switches to the German (ISO 646-DE) character set. Turns `[', `\e' +and `]' into umlauted A, O and U, respectively. `{', `|' and `}' turn +into the respective lower case versions of these. `~' turns into s-z. +.B \-E +turns off +.B \-D +processing. +These options are deprecated, +which means they probably will not appear +in the next version of +.BR FIGlet . + +.TP +.BI \-C \ controlfile +.PD 0 +.TP +.B \-N +.PD +These options deal with +.B FIGlet +.IR controlfiles . +A +.I controlfile +is a file containing a list of commands that +.B FIGlet +executes each time it reads a character. These commands can map certain +input characters to other characters, similar to the Unix +.B tr +command or the +.B FIGlet +.B \-D +option. +.B FIGlet +maintains a list of +.IR controlfiles , +which is empty when +.B FIGlet +starts up. +.B \-C +adds the given +.I controlfile +to the list. +.B \-N +clears the +.I controlfile +list, cancelling the effect of any previous +.BR \-C . +.B FIGlet +executes the commands in all +.I controlfiles +in the list. See +the file +.IR figfont.txt , +provided with FIGlet, +for details on how to write a +.IR controlfile . + +.TP +.B \-s +.PD 0 +.TP +.B \-S +.PD 0 +.TP +.B \-k +.PD 0 +.TP +.B \-W +.PD +.TP +.B \-o +.PD +These options control how +.B FIGlet +spaces the FIGcharacters that it outputs. +.B \-s +(default) and +.B \-S +cause ``smushing''. +The FIGcharacters are displayed +as close together as possible, +and overlapping sub-characters are removed. +Exactly which sub-characters count as ``overlapping'' +depends on the font's +.IR layoutmode , +which is defined by the font's author. +.B \-k +causes ``kerning''. As many blanks as possible are +removed between FIGcharacters, so that they +touch, but the FIGcharacters are not smushed. +.B \-W +makes +.B FIGlet +display all FIGcharacters at their full width, +which may be fixed or variable, depending on the font. + +The difference between +.B \-s +and +.B \-S +is that +.B \-s +will not smush a font whose author specified +kerning or full width as the default +.IR layoutmode , +whereas +.B \-S +will attempt to do so. + +If there is no information in the font +about how to smush, +or if the +.B \-o +option is specified, +then the FIGcharacters are ``overlapped''. +This means that after kerning, +the first subcharacter of +each FIGcharacter is removed. +(This is not done if a FIGcharacter +contains only one subcharacter.) + +.TP +.BI \-m \ layoutmode +Specifies an explicit +.I layoutmode +between +.B 1 +and +.BR 63 . +.I Smushmodes +are explained in +.IR figfont.txt , +which also provides complete information +on the format of a +.B FIGlet +font. +For the sake of backward compatibility +with versions of +.B FIGlet +before 2.2, +.B \-m0 +is equivalent to +.BR \-k , +.B \-m-1 +is equivalent to +.BR \-W , +and +.B \-m-2 +is equivalent to +.BR \-s . +The +.B \-m +switch is normally +used only by font designers testing the various +.I layoutmodes +with a new font. + +.TP +.B \-v +.PD 0 +.TP +.BI \-I \ infocode +.PD +These options print various information about +.BR FIGlet , +then exit. If several of these options are given on the command line, only +the last is executed, and only after +all other command-line options have been dealt with. + +.B \-v +prints version and copyright information, as well as a ``Usage: ...'' +line. +.B \-I +prints the information corresponding to the given +.I infocode +in a consistent, reliable (i.e., guaranteed to be the same in +future releases) format. +.B \-I +is primarily intended to be used by programs that use +.BR FIGlet . +.I infocode +can be any of the following. +.RS +.TP +.BR -1 " Normal operation (default)." +This +.I infocode +indicates that +.B FIGlet +should operate normally, not giving any informational printout, +printing its input in the selected font. +.TP +.BR 0 " Version and copyright." +This is identical to +.BR \-v . +.TP +.BR 1 " Version (integer)." +This will print the version of your copy of +.B FIGlet +as a decimal integer. The main version number is multiplied by 10000, +the sub-version number is multiplied by 100, and the sub-sub-version +number is multiplied by 1. These are added together, and the result is +printed out. For example, +.B FIGlet +2.2 will print +.RB `` 20200 '' +, version 2.2.1 will print +.RB `` 20201 ''. +Similarly, version 3.7.2 would print +.RB `` 30702 ''. +These numbers are guaranteed to be +ascending, with later versions having higher numbers. Note that +the first major release of +.BR FIGlet , +version 2.0, did not have the +.B \-I +option. +.TP +.BR 2 " Default font directory." +This will print the default font directory. It is affected by the +.B \-d +option. +.TP +.BR 3 " Font." +This will print the name of the font +.B FIGlet +would use. It is affected by +the +.B \-f +option. +This is not a filename; the +.RB `` .flf '' +suffix is not printed. +.TP +.BR 4 " Output width." +This will print the value +.B FIGlet +would use for +.IR outputwidth , +the number of columns wide +.B FIGlet +assumes the screen is. +It is affected by the +.B \-w +and +.B \-t +options. +.TP +.BR 5 " Supported font formats." +This will list font formats supported by +.B FIGlet . +Possible formats are +.RB `` flf2 '' +for FIGfont Version 2 +.B .flf +files and +.RB `` tlf2 '' +for TOIlet +.B .tlf +files. +.RE +.IP +If +.I infocode +is any other positive value, +.B FIGlet +will simply exit without printing anything. + +.TP +.B \-L +.PD 0 +.TP +.B \-R +.PD 0 +.TP +.B \-X +.PD +These options control whether +.B FIGlet +prints left-to-right or right-to-left. +.B \-L +selects left-to-right printing. +.B \-R +selects right-to-left printing. +.B \-X +(default) makes +.B FIGlet +use whichever is specified in the font file. + +Once the options are read, +if there are any remaining words on the command line, +they are used instead +of standard input as the source of text. +This feature +allows shell scripts to generate large letters without having to dummy +up standard input files. + +An empty argument, obtained by two sequential quotes, +results in a line break. + +.SH EXAMPLES +To use +.B FIGlet +with its default settings, simply type +.RS +.nf +.ft B + +example% figlet + +.ft R +.fi +.RE +and then type whatever you like. + +To change the font, use the +.B \-f +option, for example, +.RS +.nf +.ft B + +example% figlet \-f script + +.ft R +.fi +.RE + +Use the +.B \-c +option if you would prefer centered output: +.RS +.nf +.ft B + +example% figlet \-c + +.ft R +.fi +.RE + +We have found that the most common use of +.B FIGlet +is making up large text to be placed in e-mail messages. For this +reason, +.B FIGlet +defaults to 80 column output. If you are using a wider terminal, and +would like +.B FIGlet +to use the full width of your terminal, use the +.B \-t +option: +.RS +.nf +.ft B + +example% figlet \-t + +.ft R +.fi +.RE + +If you don't want +.B FIGlet +to smush FIGcharacters into each other, use the +.B \-k +option: +.RS +.nf +.ft B + +example% figlet \-k + +.ft R +.fi +.RE + +If +.B figlet +gets its input from a file, it is often a good idea to use +.BR \-p : +.RS +.nf +.ft B + +example% figlet \-p < myfile + +.ft R +.fi +.RE + +Of course, the above can be combined: +.RS +.nf +.ft B + +example% figlet \-ptk \-f shadow < anotherfile +example% figlet \-cf slant + +.ft R +.fi +.RE + +Finally, if you want to have +.B FIGlet +take the input from the command +line instead of a file: +.RS +.nf +.ft B + +example% figlet Hello world + +.ft R +.fi +.RE + +.SS Other Things to Try +On many systems nice effects can be obtained from the +.B lean +font by piping it through +.BR tr . +Some you might want to try are the following: + +.RS +.nf +.ft B +example% figlet \-f lean | tr ' _/' ' ()' +example% figlet \-f lean | tr ' _/' './\e\e' +example% figlet \-f lean | tr ' _/' ' //' +example% figlet \-f lean | tr ' _/' '/ ' +.ft R +.fi +.RE + +Similar things can be done with the +.B block +font and many of the other +.B FIGlet +fonts. + +.SH COMPRESSED FONTS +You can compress the fonts and controlfiles +using the +.B zip +archiving program. +Place only one font or controlfile in each archive, +and rename the archive file (which will have a name +ending in +.BR .zip ) +back to +.B .flf +or +.B .flc +as the case may be. +If you don't rename the file appropriately, +.B FIGlet +won't be able to find it. + +.B FIGlet +does not care what the filename within the +.B .zip +archive is, and will process only the first file. + +The +.B .zip +format was chosen because tools to create and manipulate it +are widely available for free +on many platforms. + +.SH THE STANDARD FONTS + +Here are a few notes about some of the fonts provided with +.IR FIGlet . +You can get many other font from the Web site +.br +http://www.figlet.org/ This location +should also contain the latest version of +.B FIGlet +and other related utilities. + +The font +.I standard +is the basic +.B FIGlet +font, used when no other font is specified. +(This default can be changed when +.B FIGlet +is compiled on your system.) +The +.I controlfiles +.IR 8859-2 , +.IR 8859-3 , +.IR 8859-4 , +and +.I 8859-9 +are provided for interpreting those character sets, +also known as ISO Latin-2 through Latin-5 respectively. +The character set 8859-1 (ISO Latin-1) is +.B FIGlet's +default and requires no special +.IR controlfile . + +Closely related are the fonts +.IR slant , +.IR shadow , +.IR small , +.I smslant +(both small and slanted), +.IR smshadow , +(both small and shadowed), +and +.IR big . +These fonts support only Latin-1, except that +.I big +supports Greek FIGcharacters as well; +the +.I controlfiles +.I frango +(for Greek text written in Latin characters, so-called +.RI `` frangovlakhika ''), +and +.I 8859-7 +(for mixed Latin/Greek text) +are provided. + +The +.I ivrit +font is a right-to-left font +including both Latin and Hebrew FIGcharacters; +the Latin characters are those of the +.I standard +font. +The available +.I controlfiles +are +.IR ilhebrew , +which maps the letters you get +by typing on a U.S. keyboard +as if it were a Hebrew keyboard; +.IR ushebrew , +which makes a reasonable mapping from +Latin letters to Hebrew ones; +and +.IR 8859-8 , +which supports mixed Latin/Hebrew text. +.B Warning: +.B FIGlet +doesn't support bidirectional text, +so everything will come out right-to-left, +even Latin letters. + +The fonts +.IR terminal , +.IR digital , +and +.I bubble +output the input character with some decoration around it +(or no decoration, +in the case of +.IR terminal ). +The characters coded 128 to 159, +which have varying interpretations, are output as-is. +You can use the appropriate +.I controlfiles +to process Latin-2, Latin-3, or Latin-4 (but not Latin-5) text, +provided your output device +has screen or printer fonts that +are appropriate for these character sets. + +Two script fonts are available: +.IR script , +which is larger than +.IR standard , +and +.IR smscript , +which is smaller. + +The font +.I lean +is made up solely of `/' and `_' sub-characters; +.I block +is a straight (non-leaning) version of it. + +The font +.I mini +is very small, and especially suitable for e-mail signatures. + +The font +.I banner +looks like the output of the +.B banner +program; +it is a capitals and small capitals font +that doesn't support the ISO Latin-1 extensions +to plain ASCII. +It does, however, support the Japanese +.I katakana +syllabary; +the +.I controlfile +.I uskata +maps the upper-case and lower-case Latin letters +into the 48 basic +.I katakana +characters, +and the +.I controlfile +.I jis0201 +handles JIS 0201X (JIS-Roman) +mixed Latin and +.I katakana +text. +Furthermore, the +.I banner +font also supports Cyrillic (Russian) +FIGcharacters; the +.I controlfile +.I 8859-5 +supports mixed Latin and Cyrillic text, +the +.I controlfile +.I koi8r +supports the popular KOI8-R mapping of mixed text, +and the +.I controlfile +.I moscow +supports a +sensible mapping from Latin to Cyrillic, +compatible with the +.I moscow +font (not supplied). + +The fonts +.I mnemonic +and +.I safemnem +support the mnemonic character set +documented in RFC 1345. +They implement a large subset of Unicode +(over 1800 characters) very crudely, +using ASCII-based mnemonic sequences, +and are good for getting a quick look +at UTF-8 unicode files, +using the controlfile +.IR utf8 . + +.SH ENVIRONMENT +.TP +.B FIGLET_FONTDIR +If +.RB $ FIGLET_FONTDIR +is set, its value is used as a path to search for font files. + +.SH FILES +.PD 0 +.TP 20 +.IB file .flf +.B FIGlet +font file +.TP 20 +.IB file .flc +.B FIGlet +control file +.PD + +.SH DIAGNOSTICS +.B FIGlet's +diagnostics are intended to be self-explanatory. Possible +messages are + +.RS +.nf +.ft B +Usage: ... +Out of memory +Unable to open font file +Not a FIGlet 2 font file +Unable to open control file +Not a FIGlet 2 control file +"\-t" is disabled, since ioctl is not fully implemented. +.ft R +.fi +.RE + +This last message is printed when the +.B \-t +option is given, but the operating system in use does not include +the system call +.B FIGlet +uses to determine the terminal width. + +.B FIGlet +also prints an explanatory message if the +.B \-F +option is given on the command line. +The earlier version of +.BR FIGlet , +version 2.0, listed the available fonts when the +.B \-F +option was given. This option has been removed from +.B FIGlet +2.1. It has been replaced by the +.B figlist +script, which is part of the standard +.B FIGlet +package. + +.SH ORIGIN +.RB `` FIGlet '' +stands for ``Frank, Ian and Glenn's LETters''. Inspired by Frank's .sig, +Glenn wrote (most of) it, and Ian helped. + +Most of the standard +.B FIGlet +fonts were inspired by signatures on various UseNet +articles. Since typically hundreds of people use the same style of +letters in their signatures, it was often not deemed necessary to give +credit to any one font designer. + +.SH BUGS +Very little error checking is done on font and control files. While +.B FIGlet +tries to be forgiving of errors, and should (hopefully) never actually +crash, using an improperly-formatted file with +.B FIGlet +will produce unpredictable output. + +.B FIGlet +does not handle format characters in a very intelligent way. +A tab character is converted to a blank, and vertical-tab, form-feed and +carriage-return are each converted to a newline. On many systems, tabs +can be handled better by piping files through +.B expand +before piping through +.BR FIGlet . + +.B FIGlet +output is quite ugly if it is displayed in a proportionally-spaced font. +I suppose this is to be expected. + +Please report any errors you find in this man page or the program to + +.SH WEBSITE AND MAILING LIST +You can get many fonts which are not in the basic +.B FIGlet +package from the Web site +http://www.figlet.org/ It +should also contain the latest version of +.B FIGlet +and other utilities related to +.BR FIGlet . + +There is a mailing list for +.B FIGlet +for general discussions about +.B FIGlet +and a place where you can ask questions or share ideas +with other +.B FIGlet +users. It is also the place where we will publish +news about new fonts, new software updates etc. + +To subscribe or unsubscribe from the +.B FIGlet +mailing list, +please send email to figlet-subscribe@figlet.org or figlet-unsubscribe@figlet.org or visit the +following web page: http://www.figlet.org/mailman/listinfo/figlet + +.SH AUTHORS +Glenn Chappell did most of the work. +You can e-mail him but he is not an e-mail fanatic; people who e-mail +Glenn will probably get answers, but if you e-mail his best friend: + +Ian Chai, who +.I is +an e-mail fanatic, you'll get answers, endless conversation about the +mysteries of life, invitations to join some 473 mailing lists and a +free toaster. (Well, ok, maybe not the free toaster.) + +Frank inspired this whole project with his .sig, but don't e-mail +him; he's decidedly an un-e-mail-fanatic. + +Gilbert "The Mad Programmer" Healton added the +.B \-A +option for version 2.1.1. This option specified input from +the command line; it is still allowed, +but has no effect. + +John Cowan added the +.BR \-o , +.BR \-s , +.BR \-k , +.BR \-S , +and +.B \-W +options, and +the support for Unicode mapping tables, +ISO 2022/HZ/Shift-JIS/UTF-8 input, +and compressed fonts +and control files. +He also revised this documentation, +with a lot of input from +Paul Burton. + +Claudio Matsuoka added the support for +.B .tlf +files for version 2.2.4 and performs random hacks and bugfixes. + +As a fan of FIGlet, Christiaan Keet revised the official FIGlet documentation +and set up the new FIGlet website at http://www.figlet.org/ (and the +corresponding ftp://ftp.figlet.org/pub/figlet/) + +.SH SEE ALSO +.BR figlist (6), +.BR chkfont (6), +.BR showfigfonts (6), +.BR toilet (1) diff --git a/externals/figlet/figlet.c b/externals/figlet/figlet.c new file mode 100644 index 0000000000..d34b19a8b8 --- /dev/null +++ b/externals/figlet/figlet.c @@ -0,0 +1,2131 @@ +/**************************************************************************** + + FIGlet Copyright 1991, 1993, 1994 Glenn Chappell and Ian Chai + FIGlet Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan + FIGlet Copyright 2002 Christiaan Keet + FIGlet Copyright 2011, 2012 Claudio Matsuoka + Portions written by Paul Burton and Christiaan Keet + Internet: + FIGlet, along with the various FIGlet fonts and documentation, is + copyrighted under the provisions of the New BSD License (3-clause) + (as listed in the file "LICENSE" which is included in this package) +****************************************************************************/ + +#define DATE "31 May 2012" +#define VERSION "2.2.5" +#define VERSION_INT 20205 + +/* FIGlet (Frank, Ian & Glenn's Letters) */ +/* by Glenn Chappell */ +/* Apr 1991 */ +/* Automatic file addition by Ian Chai May 1991 */ +/* Punctuation and numbers addition by Ian Chai Jan 1993 */ +/* Full ASCII by Glenn Chappell Feb 1993 */ +/* Line-breaking, general rewrite by Glenn Chappell Mar 1993 */ +/* Hard blanks by Glenn Chappell Apr 1993 */ +/* Release 2.0 5 Aug 1993 */ +/* Right-to-left printing, extended char set by Glenn Chappell Dec 1993 */ +/* Control files by Glenn Chappell Feb 1994 */ +/* Release 2.1 12 Aug 1994 */ +/* Release 2.1.1 25 Aug 1994 */ +/* Release 2.1.2 by Gilbert (Mad Programmer) Healton: Add -A command line + option. Sept 8, 1996 */ +/* Release 2.2 by John Cowan: multibyte inputs, compressed fonts, + mapping tables, kerning/smushing options. */ +/* Release 2.2.1 by Christiaan Keet: minor updates including readmes + FAQs and comments. 13 July 2002. The new official FIGlet website is + http://www.figlet.org/ */ +/* Release 2.2.2 by Christiaan Keet: License changed from "Artistic License" + to "Academic Free License" as agreed by FIGlet authors. 05 July 2005 */ +/* Release 2.2.3 by Claudio Matsuoka, 12 Jan 2011: BSD license, fixes */ +/* Release 2.2.4 by Claudio Matsuoka, 26 Jan 2011: tlf2 font support */ +/* Release 2.2.5 by Claudio Matsuoka, 31 May 2012: flc licensing, minor fixes */ + +/*--------------------------------------------------------------------------- + DEFAULTFONTDIR and DEFAULTFONTFILE should be defined in the Makefile. + DEFAULTFONTDIR is the full path name of the directory in which FIGlet + will search first for fonts (the ".flf" files). + DEFAULTFONTFILE is the filename of the font to be used if no other + is specified (standard.flf is recommended, but any other can be + used). This file should reside in the directory specified by + DEFAULTFONTDIR. +---------------------------------------------------------------------------*/ +#ifndef DEFAULTFONTDIR +#define DEFAULTFONTDIR "fonts" +#endif +#ifndef DEFAULTFONTFILE +#define DEFAULTFONTFILE "standard.flf" +#endif + +#include +#ifdef __STDC__ +#include +#endif +#include +#include +#include +#include /* Needed for get_columns */ + +#if defined(unix) || defined(__unix__) || defined(__APPLE__) +#include +#include /* Needed for get_columns */ +#endif + +#ifdef TLF_FONTS +#include +#include +#include "utf8.h" +#endif + +#include "zipio.h" /* Package for reading compressed files */ + +#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */ + +#define DIRSEP '/' +#define DIRSEP2 '\\' +/* Leave alone for Unix and MS-DOS/Windows! +Note: '/' also used in filename in get_columns(). */ + +#define FONTFILESUFFIX ".flf" +#define FONTFILEMAGICNUMBER "flf2" +#define FSUFFIXLEN MYSTRLEN(FONTFILESUFFIX) +#define CONTROLFILESUFFIX ".flc" +#define CONTROLFILEMAGICNUMBER "flc2" /* no longer used in 2.2 */ +#define CSUFFIXLEN MYSTRLEN(CONTROLFILESUFFIX) +#define DEFAULTCOLUMNS 80 +#define MAXLEN 255 /* Maximum character width */ + +/* Add support for Sam Hocevar's TOIlet fonts */ +#ifdef TLF_FONTS +#define TOILETFILESUFFIX ".tlf" +#define TOILETFILEMAGICNUMBER "tlf2" +#define TSUFFIXLEN MYSTRLEN(TOILETFILESUFFIX) + +int toiletfont; /* true if font is a TOIlet TLF font */ +#endif + + +/**************************************************************************** + + Globals dealing with chars that are read + +****************************************************************************/ + +typedef long inchr; /* "char" read from stdin */ + +inchr *inchrline; /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */ + /* Note: not null-terminated. */ +int inchrlinelen,inchrlinelenlimit; +inchr deutsch[7] = {196, 214, 220, 228, 246, 252, 223}; + /* Latin-1 codes for German letters, respectively: + LATIN CAPITAL LETTER A WITH DIAERESIS = A-umlaut + LATIN CAPITAL LETTER O WITH DIAERESIS = O-umlaut + LATIN CAPITAL LETTER U WITH DIAERESIS = U-umlaut + LATIN SMALL LETTER A WITH DIAERESIS = a-umlaut + LATIN SMALL LETTER O WITH DIAERESIS = o-umlaut + LATIN SMALL LETTER U WITH DIAERESIS = u-umlaut + LATIN SMALL LETTER SHARP S = ess-zed + */ + +int hzmode; /* true if reading double-bytes in HZ mode */ +int gndbl[4]; /* gndbl[n] is true if Gn is double-byte */ +inchr gn[4]; /* Gn character sets: ASCII, Latin-1, none, none */ +int gl; /* 0-3 specifies left-half Gn character set */ +int gr; /* 0-3 specifies right-half Gn character set */ + +int Myargc; /* to avoid passing around argc and argv */ +char **Myargv; + +/**************************************************************************** + + Globals dealing with chars that are written + +****************************************************************************/ + +#ifdef TLF_FONTS +typedef wchar_t outchr; /* "char" written to stdout */ +#define STRLEN(x) wcslen(x) +#define STRCPY(x,y) wcscpy((x),(y)) +#define STRCAT(x,y) wcscat((x),(y)) +#define ISSPACE(x) iswspace(x) +#else +typedef char outchr; /* "char" written to stdout */ +#define STRLEN(x) MYSTRLEN(x) +#define STRCPY(x,y) strcpy((x),(y)) +#define STRCAT(x,y) strcat((x),(y)) +#define ISSPACE(x) isspace(x) +#endif + +typedef struct fc { + inchr ord; + outchr **thechar; /* Alloc'd char thechar[charheight][]; */ + struct fc *next; + } fcharnode; + +fcharnode *fcharlist; +outchr **currchar; +int currcharwidth; +int previouscharwidth; +outchr **outputline; /* Alloc'd char outputline[charheight][outlinelenlimit+1]; */ +int outlinelen; + + +/**************************************************************************** + + Globals dealing with command file storage + +****************************************************************************/ + +typedef struct cfn { + char *thename; + struct cfn *next; + } cfnamenode; + +cfnamenode *cfilelist,**cfilelistend; + +typedef struct cm { + int thecommand; + inchr rangelo; + inchr rangehi; + inchr offset; + struct cm *next; + } comnode; + +comnode *commandlist,**commandlistend; + +/**************************************************************************** + + Globals affected by command line options + +****************************************************************************/ + +int deutschflag,justification,paragraphflag,right2left,multibyte; +int cmdinput; + +#define SM_SMUSH 128 +#define SM_KERN 64 +#define SM_EQUAL 1 +#define SM_LOWLINE 2 +#define SM_HIERARCHY 4 +#define SM_PAIR 8 +#define SM_BIGX 16 +#define SM_HARDBLANK 32 + +int smushmode; + +#define SMO_NO 0 /* no command-line smushmode */ +#define SMO_YES 1 /* use command-line smushmode, ignore font smushmode */ +#define SMO_FORCE 2 /* logically OR command-line and font smushmodes */ + +int smushoverride; + +int outputwidth; +int outlinelenlimit; +char *fontdirname,*fontname; + + +/**************************************************************************** + + Globals read from font file + +****************************************************************************/ + +char hardblank; +int charheight; + + +/**************************************************************************** + + Name of program, used in error messages + +****************************************************************************/ + +char *myname; + + +#ifdef TIOCGWINSZ +/**************************************************************************** + + get_columns + + Determines the number of columns of /dev/tty. Returns the number of + columns, or -1 if error. May return 0 if columns unknown. + Requires include files and . + by Glenn Chappell & Ian Chai 14 Apr 1993 + +****************************************************************************/ + +int get_columns() +{ + struct winsize ws; + int fd,result; + + if ((fd = open("/dev/tty",O_WRONLY))<0) return -1; + result = ioctl(fd,TIOCGWINSZ,&ws); + close(fd); + return result?-1:ws.ws_col; +} +#endif /* ifdef TIOCGWINSZ */ + + +/**************************************************************************** + + myalloc + + Calls malloc. If malloc returns error, prints error message and + quits. + +****************************************************************************/ + +#ifdef __STDC__ +char *myalloc(size_t size) +#else +char *myalloc(size) +int size; +#endif +{ + char *ptr; +#ifndef __STDC__ + extern void *malloc(); +#endif + + if ((ptr = (char*)malloc(size))==NULL) { + fprintf(stderr,"%s: Out of memory\n",myname); + exit(1); + } + else { + return ptr; + } +} + + +/**************************************************************************** + + hasdirsep + + Returns true if s1 contains a DIRSEP or DIRSEP2 character. + +****************************************************************************/ + +int hasdirsep(s1) +char *s1; +{ + if (strchr(s1, DIRSEP)) return 1; + else if (strchr(s1, DIRSEP2)) return 1; + else return 0; +} + +/**************************************************************************** + + suffixcmp + + Returns true if s2 is a suffix of s1; uses case-blind comparison. + +****************************************************************************/ + +int suffixcmp(s1, s2) +char *s1; +char *s2; +{ + int len1, len2; + + len1 = MYSTRLEN(s1); + len2 = MYSTRLEN(s2); + if (len2 > len1) return 0; + s1 += len1 - len2; + while (*s1) { + if (tolower(*s1) != tolower(*s2)) return 0; + s1++; + s2++; + } + return 1; +} + +/**************************************************************************** + + skiptoeol + + Skips to the end of a line, given a stream. Handles \r, \n, or \r\n. + +****************************************************************************/ + +void skiptoeol(fp) +ZFILE *fp; +{ + int dummy; + + while (dummy=Zgetc(fp),dummy!=EOF) { + if (dummy == '\n') return; + if (dummy == '\r') { + dummy = Zgetc(fp); + if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp); + return; + } + } +} + + +/**************************************************************************** + + myfgets + + Local version of fgets. Handles \r, \n, and \r\n terminators. + +****************************************************************************/ + +char *myfgets(line,maxlen,fp) +char *line; +int maxlen; +ZFILE *fp; +{ + int c = 0; + char *p; + + p = line; + while((c=Zgetc(fp))!=EOF&&maxlen) { + *p++ = c; + maxlen--; + if (c=='\n') break; + if (c=='\r') { + c = Zgetc(fp); + if (c != EOF && c != '\n') Zungetc(c,fp); + *(p-1) = '\n'; + break; + } + } + *p = 0; + return (c==EOF) ? NULL : line; +} + + +/**************************************************************************** + + usageerr + + Prints "Usage: ...." line to the given stream. + +****************************************************************************/ + +void printusage(out) +FILE *out; +{ + fprintf(out, + "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n", + myname); + fprintf(out, + " [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n"); + fprintf(out, + " [ -C controlfile ] [ -I infocode ] [ message ]\n"); +} + + +/**************************************************************************** + + printinfo + + Prints version and copyright message, or utility information. + +****************************************************************************/ + +void printinfo(infonum) +int infonum; +{ + switch (infonum) { + case 0: /* Copyright message */ + printf("FIGlet Copyright (C) 1991-2012 Glenn Chappell, Ian Chai, "); + printf("John Cowan,\nChristiaan Keet and Claudio Matsuoka\n"); + printf("Internet: "); + printf("Version: %s, date: %s\n\n",VERSION,DATE); + printf("FIGlet, along with the various FIGlet fonts"); + printf(" and documentation, may be\n"); + printf("freely copied and distributed.\n\n"); + printf("If you use FIGlet, please send an"); + printf(" e-mail message to .\n\n"); + printf("The latest version of FIGlet is available from the"); + printf(" web site,\n\thttp://www.figlet.org/\n\n"); + printusage(stdout); + break; + case 1: /* Version (integer) */ + printf("%d\n",VERSION_INT); + break; + case 2: /* Font directory */ + printf("%s\n",fontdirname); + break; + case 3: /* Font */ + printf("%s\n",fontname); + break; + case 4: /* Outputwidth */ + printf("%d\n",outputwidth); + break; + case 5: /* Font formats */ + printf("%s", FONTFILEMAGICNUMBER); +#ifdef TLF_FONTS + printf(" %s", TOILETFILEMAGICNUMBER); +#endif + printf("\n"); + } +} + + +/**************************************************************************** + + readmagic + + Reads a four-character magic string from a stream. + +****************************************************************************/ +void readmagic(fp,magic) +ZFILE *fp; +char *magic; +{ + int i; + + for (i=0;i<4;i++) { + magic[i] = Zgetc(fp); + } + magic[4] = 0; + } + +/**************************************************************************** + + skipws + + Skips whitespace characters from a stream. + +****************************************************************************/ +void skipws(fp) +ZFILE *fp; +{ + int c; + while (c=Zgetc(fp),isascii(c)&&isspace(c)) ; + Zungetc(c,fp); + } + +/**************************************************************************** + + readnum + + Reads a number from a stream. Accepts "0" prefix for octal and + "0x" or "0X" for hexadecimal. Ignores leading whitespace. + +****************************************************************************/ +void readnum(fp,nump) +ZFILE *fp; +inchr *nump; +{ + int acc = 0; + char *p; + int c; + int base; + int sign = 1; + char digits[] = "0123456789ABCDEF"; + + skipws(fp); + c = Zgetc(fp); + if (c=='-') { + sign = -1; + } + else { + Zungetc(c,fp); + } + c = Zgetc(fp); + if (c=='0') { + c = Zgetc(fp); + if (c=='x'||c=='X') { + base = 16; + } + else { + base = 8; + Zungetc(c,fp); + } + } + else { + base = 10; + Zungetc(c,fp); + } + + while((c=Zgetc(fp))!=EOF) { + c=toupper(c); + p=strchr(digits,c); + if (!p) { + Zungetc(c,fp); + *nump = acc * sign; + return; + } + acc = acc*base+(p-digits); + } + *nump = acc * sign; + } + +/**************************************************************************** + + readTchar + + Reads a control file "T" command character specification. + + Character is a single byte, an escape sequence, or + an escaped numeric. + +****************************************************************************/ + +inchr readTchar(fp) +ZFILE *fp; +{ + inchr thechar; + char next; + + thechar=Zgetc(fp); + if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */ + Zungetc(thechar,fp); + return '\0'; + } + if (thechar!='\\') return thechar; + next=Zgetc(fp); + switch(next) { + case 'a': + return 7; + case 'b': + return 8; + case 'e': + return 27; + case 'f': + return 12; + case 'n': + return 10; + case 'r': + return 13; + case 't': + return 9; + case 'v': + return 11; + default: + if (next=='-' || next=='x' || (next>='0' && next<='9')) { + Zungetc(next,fp); + readnum(fp,&thechar); + return thechar; + } + return next; + } +} + +/**************************************************************************** + + charsetname + + Get a Tchar representing a charset name, or 0 if none available. + Called in getcharset(). + +****************************************************************************/ + +inchr charsetname(fp) +ZFILE *fp; +{ + inchr result; + + result = readTchar(fp); + if (result == '\n' || result == '\r') { + result = 0; + Zungetc(result,fp); + } + return result; + } + +/**************************************************************************** + + charset + + Processes "g[0123]" character set specifier + Called in readcontrol(). + +****************************************************************************/ + +void charset(n, controlfile) +int n; +ZFILE *controlfile; +{ + int ch; + + skipws(controlfile); + if (Zgetc(controlfile) != '9') { + skiptoeol(controlfile); + return; + } + ch = Zgetc(controlfile); + if (ch == '6') { + gn[n] = 65536L * charsetname(controlfile) + 0x80; + gndbl[n] = 0; + skiptoeol(controlfile); + return; + } + if (ch != '4') { + skiptoeol(controlfile); + return; + } + ch = Zgetc(controlfile); + if (ch == 'x') { + if (Zgetc(controlfile) != '9') { + skiptoeol(controlfile); + return; + } + if (Zgetc(controlfile) != '4') { + skiptoeol(controlfile); + return; + } + skipws(controlfile); + gn[n] = 65536L * charsetname(controlfile); + gndbl[n] = 1; + skiptoeol(controlfile); + return; + } + Zungetc(ch, controlfile); + skipws(controlfile); + gn[n] = 65536L * charsetname(controlfile); + gndbl[n] = 0; + return; + } + +/**************************************************************************** + + FIGopen + + Given a FIGlet font or control file name and suffix, return the file + or NULL if not found + +****************************************************************************/ + +ZFILE *FIGopen(name,suffix) +char *name; +char *suffix; +{ + char *fontpath; + ZFILE *fontfile; + struct stat st; + int namelen; + + namelen = MYSTRLEN(fontdirname); + fontpath = (char*)alloca(sizeof(char)* + (namelen+MYSTRLEN(name)+MYSTRLEN(suffix)+2)); + fontfile = NULL; + if (!hasdirsep(name)) { /* not a full path name */ + strcpy(fontpath,fontdirname); + fontpath[namelen] = DIRSEP; + fontpath[namelen+1] = '\0'; + strcat(fontpath,name); + strcat(fontpath,suffix); + if(stat(fontpath,&st)==0) goto ok; + } + /* just append suffix */ + strcpy(fontpath,name); + strcat(fontpath,suffix); + if(stat(fontpath,&st)==0) goto ok; + + return NULL; + +ok: + fontfile = Zopen(fontpath,"rb"); + return fontfile; +} + +/**************************************************************************** + + readcontrol + + Allocates memory and reads in the given control file. + Called in readcontrolfiles(). + +****************************************************************************/ + +void readcontrol(controlname) +char *controlname; +{ + inchr firstch,lastch; + char dashcheck; + inchr offset; + int command; + ZFILE *controlfile; + + controlfile = FIGopen(controlname,CONTROLFILESUFFIX); + + if (controlfile==NULL) { + fprintf(stderr,"%s: %s: Unable to open control file\n",myname, + controlname); + exit(1); + } + + (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); + (*commandlistend)->thecommand = 0; /* Begin with a freeze command */ + commandlistend = &(*commandlistend)->next; + (*commandlistend) = NULL; + + while(command=Zgetc(controlfile),command!=EOF) { + switch (command) { + case 't': /* Translate */ + skipws(controlfile); + firstch=readTchar(controlfile); + if ((dashcheck=Zgetc(controlfile))=='-') { + lastch=readTchar(controlfile); + } + else { + Zungetc(dashcheck,controlfile); + lastch=firstch; + } + skipws(controlfile); + offset=readTchar(controlfile)-firstch; + skiptoeol(controlfile); + (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); + (*commandlistend)->thecommand = 1; + (*commandlistend)->rangelo = firstch; + (*commandlistend)->rangehi = lastch; + (*commandlistend)->offset = offset; + commandlistend = &(*commandlistend)->next; + (*commandlistend) = NULL; + break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case '-': + /* Mapping table entry */ + Zungetc(command,controlfile); + readnum(controlfile,&firstch); + skipws(controlfile); + readnum(controlfile,&lastch); + offset=lastch-firstch; + lastch=firstch; + skiptoeol(controlfile); + (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); + (*commandlistend)->thecommand = 1; + (*commandlistend)->rangelo = firstch; + (*commandlistend)->rangehi = lastch; + (*commandlistend)->offset = offset; + commandlistend = &(*commandlistend)->next; + (*commandlistend) = NULL; + break; + case 'f': /* freeze */ + skiptoeol(controlfile); + (*commandlistend) = (comnode*)myalloc(sizeof(comnode)); + (*commandlistend)->thecommand = 0; + commandlistend = &(*commandlistend)->next; + (*commandlistend) = NULL; + break; + case 'b': /* DBCS input mode */ + multibyte = 1; + break; + case 'u': /* UTF-8 input mode */ + multibyte = 2; + break; + case 'h': /* HZ input mode */ + multibyte = 3; + break; + case 'j': /* Shift-JIS input mode */ + multibyte = 4; + break; + case 'g': /* ISO 2022 character set choices */ + multibyte = 0; + skipws(controlfile); + command=Zgetc(controlfile); + switch (command) { + case '0': /* define G0 charset */ + charset(0, controlfile); + break; + case '1': /* set G1 charset */ + charset(1, controlfile); + break; + case '2': /* set G2 charset */ + charset(2, controlfile); + break; + case '3': /* set G3 charset */ + charset(3, controlfile); + break; + case 'l': case 'L': /* define left half */ + skipws(controlfile); + gl = Zgetc(controlfile) - '0'; + skiptoeol(controlfile); + break; + case 'r': case 'R': /* define right half */ + skipws(controlfile); + gr = Zgetc(controlfile) - '0'; + skiptoeol(controlfile); + break; + default: /* meaningless "g" command */ + skiptoeol(controlfile); + } + case '\r': case '\n': /* blank line */ + break; + default: /* Includes '#' */ + skiptoeol(controlfile); + } + } + Zclose(controlfile); +} + + +/**************************************************************************** + + readcontrolfiles + + Reads in the controlfiles names in cfilelist. Uses readcontrol. + Called in main(). + +****************************************************************************/ + +void readcontrolfiles() +{ + cfnamenode *cfnptr; + + for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) { + readcontrol(cfnptr->thename); + } +} + + +/**************************************************************************** + + clearcfilelist + + Clears the control file list. Assumes thename does not need freeing. + +****************************************************************************/ + +void clearcfilelist() +{ + cfnamenode *cfnptr1,*cfnptr2; + + cfnptr1 = cfilelist; + while (cfnptr1 != NULL) { + cfnptr2 = cfnptr1->next; + free(cfnptr1); + cfnptr1 = cfnptr2; + } + cfilelist = NULL; + cfilelistend = &cfilelist; +} + + +/**************************************************************************** + + getparams + + Handles all command-line parameters. Puts all parameters within + bounds. + +****************************************************************************/ + +void getparams() +{ + extern char *optarg; + extern int optind; + int c; /* "Should" be a char -- need int for "!= -1" test*/ + int columns,infoprint; + char *controlname,*env; + + if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) { + myname++; + } + else { + myname = Myargv[0]; + } + fontdirname = DEFAULTFONTDIR; + env = getenv("FIGLET_FONTDIR"); + if (env!=NULL) { + fontdirname = env; + } + fontname = DEFAULTFONTFILE; + cfilelist = NULL; + cfilelistend = &cfilelist; + commandlist = NULL; + commandlistend = &commandlist; + smushoverride = SMO_NO; + deutschflag = 0; + justification = -1; + right2left = -1; + paragraphflag = 0; + infoprint = -1; + cmdinput = 0; + outputwidth = DEFAULTCOLUMNS; + gn[1] = 0x80; + gr = 1; + while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) { + /* Note: -F is not a legal option -- prints a special err message. */ + switch (c) { + case 'A': + cmdinput = 1; + break; + case 'D': + deutschflag = 1; + break; + case 'E': + deutschflag = 0; + break; + case 'X': + right2left = -1; + break; + case 'L': + right2left = 0; + break; + case 'R': + right2left = 1; + break; + case 'x': + justification = -1; + break; + case 'l': + justification = 0; + break; + case 'c': + justification = 1; + break; + case 'r': + justification = 2; + break; + case 'p': + paragraphflag = 1; + break; + case 'n': + paragraphflag = 0; + break; + case 's': + smushoverride = SMO_NO; + break; + case 'k': + smushmode = SM_KERN; + smushoverride = SMO_YES; + break; + case 'S': + smushmode = SM_SMUSH; + smushoverride = SMO_FORCE; + break; + case 'o': + smushmode = SM_SMUSH; + smushoverride = SMO_YES; + break; + case 'W': + smushmode = 0; + smushoverride = SMO_YES; + break; + case 't': +#ifdef TIOCGWINSZ + columns = get_columns(); + if (columns>0) { + outputwidth = columns; + } +#else /* ifdef TIOCGWINSZ */ + fprintf(stderr, + "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n", + myname); +#endif /* ifdef TIOCGWINSZ */ + break; + case 'v': + infoprint = 0; + break; + case 'I': + infoprint = atoi(optarg); + break; + case 'm': + smushmode = atoi(optarg); + if (smushmode < -1) { + smushoverride = SMO_NO; + break; + } + if (smushmode == 0) smushmode = SM_KERN; + else if (smushmode == -1) smushmode = 0; + else smushmode = (smushmode & 63) | SM_SMUSH; + smushoverride = SMO_YES; + break; + case 'w': + columns = atoi(optarg); + if (columns>0) { + outputwidth = columns; + } + break; + case 'd': + fontdirname = optarg; + break; + case 'f': + fontname = optarg; + if (suffixcmp(fontname,FONTFILESUFFIX)) { + fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0'; + } +#ifdef TLF_FONTS + else if (suffixcmp(fontname,TOILETFILESUFFIX)) { + fontname[MYSTRLEN(fontname)-TSUFFIXLEN] = '\0'; + } +#endif + break; + case 'C': + controlname = optarg; + if (suffixcmp(controlname, CONTROLFILESUFFIX)) { + controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0'; + } + (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode)); + (*cfilelistend)->thename = controlname; + cfilelistend = &(*cfilelistend)->next; + (*cfilelistend) = NULL; + break; + case 'N': + clearcfilelist(); + multibyte = 0; + gn[0] = 0; + gn[1] = 0x80; + gn[2] = gn[3] = 0; + gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0; + gl = 0; + gr = 1; + break; + case 'F': /* Not a legal option */ + fprintf(stderr,"%s: illegal option -- F\n",myname); + printusage(stderr); + fprintf(stderr,"\nBecause of numerous incompatibilities, the"); + fprintf(stderr," \"-F\" option has been\n"); + fprintf(stderr,"removed. It has been replaced by the \"figlist\""); + fprintf(stderr," program, which is now\n"); + fprintf(stderr,"included in the basic FIGlet package. \"figlist\""); + fprintf(stderr," is also available\n"); + fprintf(stderr,"from http://www.figlet.org/"); + fprintf(stderr,"under UNIX utilities.\n"); + exit(1); + break; + default: + printusage(stderr); + exit(1); + } + } + if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */ + outlinelenlimit = outputwidth-1; + if (infoprint>=0) { + printinfo(infoprint); + exit(0); + } +} + + +/**************************************************************************** + + clearline + + Clears both the input (inchrline) and output (outputline) storage. + +****************************************************************************/ + +void clearline() +{ + int i; + + for (i=0;iord = theord; + fcharlist->thechar = (outchr**)myalloc(sizeof(outchr*)*charheight); + fcharlist->next = fclsave; + + outline[0] = 0; + + for (row=0;row=0 && ISSPACE(outline[k])) { /* remove trailing spaces */ + k--; + } + if (k>=0) { + endchar = outline[k]; /* remove endmarks */ + while (k>=0 && outline[k]==endchar) { + k--; + } + } + outline[k+1] = '\0'; + fcharlist->thechar[row] = (outchr*)myalloc(sizeof(outchr)*(STRLEN(outline)+1)); + STRCPY(fcharlist->thechar[row],outline); + } +} + + +/**************************************************************************** + + readfont + + Allocates memory, initializes variables, and reads in the font. + Called near beginning of main(). + +****************************************************************************/ + +void readfont() +{ + int i,row,numsread; + inchr theord; + int maxlen,cmtlines,ffright2left; + int smush,smush2; + char fileline[MAXLEN+1],magicnum[5]; + ZFILE *fontfile; + + fontfile = FIGopen(fontname,FONTFILESUFFIX); +#ifdef TLF_FONTS + if (fontfile==NULL) { + fontfile = FIGopen(fontname,TOILETFILESUFFIX); + if(fontfile) toiletfont = 1; + } +#endif + + if (fontfile==NULL) { + fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontname); + exit(1); + } + + readmagic(fontfile,magicnum); + if (myfgets(fileline,MAXLEN,fontfile)==NULL) { + fileline[0] = '\0'; + } + if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) { + skiptoeol(fontfile); + } + numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d", + &hardblank,&charheight,&maxlen,&smush,&cmtlines, + &ffright2left,&smush2); + + if (maxlen > MAXLEN) { + fprintf(stderr,"%s: %s: character is too wide\n",myname,fontname); + exit(1); + } +#ifdef TLF_FONTS + if ((!toiletfont && strcmp(magicnum,FONTFILEMAGICNUMBER)) || + (toiletfont && strcmp(magicnum,TOILETFILEMAGICNUMBER)) || numsread<5) { +#else + if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) { +#endif + fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontname); + exit(1); + } + for (i=1;i<=cmtlines;i++) { + skiptoeol(fontfile); + } + + if (numsread<6) { + ffright2left = 0; + } + + if (numsread<7) { /* if no smush2, decode smush into smush2 */ + if (smush == 0) smush2 = SM_KERN; + else if (smush < 0) smush2 = 0; + else smush2 = (smush & 31) | SM_SMUSH; + } + + if (charheight<1) { + charheight = 1; + } + + if (maxlen<1) { + maxlen = 1; + } + + maxlen += 100; /* Give ourselves some extra room */ + + if (smushoverride == SMO_NO) + smushmode = smush2; + else if (smushoverride == SMO_FORCE) + smushmode |= smush2; + + if (right2left<0) { + right2left = ffright2left; + } + + if (justification<0) { + justification = 2*right2left; + } + + /* Allocate "missing" character */ + fcharlist = (fcharnode*)myalloc(sizeof(fcharnode)); + fcharlist->ord = 0; + fcharlist->thechar = (outchr**)myalloc(sizeof(outchr*)*charheight); + fcharlist->next = NULL; + for (row=0;rowthechar[row] = (outchr*)myalloc(sizeof(outchr)); + fcharlist->thechar[row][0] = '\0'; + } + for (theord=' ';theord<='~';theord++) { + readfontchar(fontfile,theord); + } + for (theord=0;theord<=6;theord++) { + readfontchar(fontfile,deutsch[theord]); + } + while (myfgets(fileline,maxlen+1,fontfile)==NULL?0: + sscanf(fileline,"%li",&theord)==1) { + readfontchar(fontfile,theord); + } + Zclose(fontfile); +} + + +/**************************************************************************** + + linealloc + + Allocates & clears outputline, inchrline. Sets inchrlinelenlimit. + Called near beginning of main(). + +****************************************************************************/ + +void linealloc() +{ + int row; + + outputline = (outchr**)myalloc(sizeof(outchr*)*charheight); + for (row=0;roword!=c; + charptr=charptr->next) ; + if (charptr!=NULL) { + currchar = charptr->thechar; + } + else { + for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0; + charptr=charptr->next) ; + currchar = charptr->thechar; + } + previouscharwidth = currcharwidth; + currcharwidth = STRLEN(currchar[0]); +} + + +/**************************************************************************** + + smushem + + Given 2 characters, attempts to smush them into 1, according to + smushmode. Returns smushed character or '\0' if no smushing can be + done. + + smushmode values are sum of following (all values smush blanks): + 1: Smush equal chars (not hardblanks) + 2: Smush '_' with any char in hierarchy below + 4: hierarchy: "|", "/\", "[]", "{}", "()", "<>" + Each class in hier. can be replaced by later class. + 8: [ + ] -> |, { + } -> |, ( + ) -> | + 16: / + \ -> X, > + < -> X (only in that order) + 32: hardblank + hardblank -> hardblank + +****************************************************************************/ + +outchr smushem(lch,rch) +outchr lch,rch; +{ + if (lch==' ') return rch; + if (rch==' ') return lch; + + if (previouscharwidth<2 || currcharwidth<2) return '\0'; + /* Disallows overlapping if the previous character */ + /* or the current character has a width of 1 or zero. */ + + if ((smushmode & SM_SMUSH) == 0) return '\0'; /* kerning */ + + if ((smushmode & 63) == 0) { + /* This is smushing by universal overlapping. */ + if (lch==' ') return rch; + if (rch==' ') return lch; + if (lch==hardblank) return rch; + if (rch==hardblank) return lch; + /* Above four lines ensure overlapping preference to */ + /* visible characters. */ + if (right2left==1) return lch; + /* Above line ensures that the dominant (foreground) */ + /* fig-character for overlapping is the latter in the */ + /* user's text, not necessarily the rightmost character. */ + return rch; + /* Occurs in the absence of above exceptions. */ + } + + if (smushmode & SM_HARDBLANK) { + if (lch==hardblank && rch==hardblank) return lch; + } + + if (lch==hardblank || rch==hardblank) return '\0'; + + if (smushmode & SM_EQUAL) { + if (lch==rch) return lch; + } + + if (smushmode & SM_LOWLINE) { + if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch; + if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch; + } + + if (smushmode & SM_HIERARCHY) { + if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch; + if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch; + if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch; + if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch; + if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch; + if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch; + if (strchr("{}",lch) && strchr("()<>",rch)) return rch; + if (strchr("{}",rch) && strchr("()<>",lch)) return lch; + if (strchr("()",lch) && strchr("<>",rch)) return rch; + if (strchr("()",rch) && strchr("<>",lch)) return lch; + } + + if (smushmode & SM_PAIR) { + if (lch=='[' && rch==']') return '|'; + if (rch=='[' && lch==']') return '|'; + if (lch=='{' && rch=='}') return '|'; + if (rch=='{' && lch=='}') return '|'; + if (lch=='(' && rch==')') return '|'; + if (rch=='(' && lch==')') return '|'; + } + + if (smushmode & SM_BIGX) { + if (lch=='/' && rch=='\\') return '|'; + if (rch=='/' && lch=='\\') return 'Y'; + if (lch=='>' && rch=='<') return 'X'; + /* Don't want the reverse of above to give 'X'. */ + } + + return '\0'; +} + + +/**************************************************************************** + + smushamt + + Returns the maximum amount that the current character can be smushed + into the current line. + +****************************************************************************/ + +int smushamt() +{ + int maxsmush,amt; + int row,linebd,charbd; + outchr ch1,ch2; + + if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) { + return 0; + } + maxsmush = currcharwidth; + for (row=0;rowSTRLEN(outputline[row])) { + maxsmush=STRLEN(outputline[row]); + } + for (charbd=STRLEN(currchar[row]); + ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ; + for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ; + amt = linebd+currcharwidth-1-charbd; + } + else { + for (linebd=STRLEN(outputline[row]); + ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ; + for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ; + amt = charbd+outlinelen-1-linebd; + } + if (!ch1||ch1==' ') { + amt++; + } + else if (ch2) { + if (smushem(ch1,ch2)!='\0') { + amt++; + } + } + if (amtoutlinelenlimit + ||inchrlinelen+1>inchrlinelenlimit) { + return 0; + } + + templine = (outchr*)myalloc(sizeof(outchr)*(outlinelenlimit+1)); + for (row=0;row1) { + if (len>outputwidth-1) { + len = outputwidth-1; + } + if (justification>0) { + for (i=1;(3-justification)*i+len+justification-2=0;i--) { + if (!gotspace && inchrline[i]==' ') { + gotspace = 1; + lastspace = i; + } + if (gotspace && inchrline[i]!=' ') { + break; + } + } + len1 = i+1; + len2 = inchrlinelen-lastspace-1; + for (i=0;ithecommand ? + (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) { + c += cmptr->offset; + while(cmptr!=NULL ? cmptr->thecommand : 0) { + cmptr=cmptr->next; + } + } + else { + cmptr=cmptr->next; + } + } + return c; +} + +/**************************************************************************** + + Agetchar + + Replacement to getchar(). + Acts exactly like getchar if -A is NOT specified, + else obtains input from All remaining command line words. + +****************************************************************************/ + +int Agetchar() +{ + extern int optind; /* current argv[] element under study */ + static int AgetMode = 0; /* >= 0 for displacement into argv[n], <0 EOF */ + char *arg; /* pointer to active character */ + int c; /* current character */ + + if ( ! cmdinput ) /* is -A active? */ + return( getchar() ); /* no: return stdin character */ + + if ( AgetMode < 0 || optind >= Myargc ) /* EOF is sticky: */ + return( EOF ); /* **ensure it now and forever more */ + + /* find next character */ + arg = Myargv[optind]; /* pointer to active arg */ + c = arg[AgetMode++]&0xFF; /* get appropriate char of arg */ + + if ( ! c ) /* at '\0' that terminates word? */ + { /* at end of word: return ' ' if normal word, '\n' if empty */ + c = ' '; /* suppose normal word and return blank */ + if ( AgetMode == 1 ) /* if ran out in very 1st char, force \n */ + c = '\n'; /* (allows "hello '' world" to do \n at '') */ + AgetMode = 0; /* return to char 0 in NEXT word */ + if ( ++optind >= Myargc ) /* run up word count and check if at "EOF" */ + { /* just ran out of arguments */ + c = EOF; /* return EOF */ + AgetMode = -1; /* ensure all future returns return EOF */ + } + } + + return( c ); /* return appropriate character */ + +} /* end: Agetchar() */ + + +/**************************************************************************** + + iso2022 + + Called by getinchr. Interprets ISO 2022 sequences + +******************************************************************************/ + +inchr iso2022() +{ + inchr ch; + inchr ch2; + int save_gl; + int save_gr; + + ch = Agetchar(); + if (ch == EOF) return ch; + if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */ + if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */ + switch (ch) { + case 14: /* invoke G1 into GL */ + gl = 1; + return iso2022(); + case 15: /* invoke G0 into GL */ + gl = 0; + return iso2022(); + case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */ + save_gl = gl; save_gr = gr; + gl = gr = 2; + ch = iso2022(); + gl = save_gl; gr = save_gr; + return ch; + case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */ + save_gl = gl; save_gr = gr; + gl = gr = 3; + ch = iso2022(); + gl = save_gl; gr = save_gr; + return ch; + case 'n' + 0x100: /* invoke G2 into GL */ + gl = 2; + return iso2022(); + case 'o' + 0x100: /* invoke G3 into GL */ + gl = 3; + return iso2022(); + case '~' + 0x100: /* invoke G1 into GR */ + gr = 1; + return iso2022(); + case '}' + 0x100: /* invoke G2 into GR */ + gr = 2; + return iso2022(); + case '|' + 0x100: /* invoke G3 into GR */ + gr = 3; + return iso2022(); + case '(' + 0x100: /* set G0 to 94-char set */ + ch = Agetchar(); + if (ch == 'B') ch = 0; /* ASCII */ + gn[0] = ch << 16; + gndbl[0] = 0; + return iso2022(); + case ')' + 0x100: /* set G1 to 94-char set */ + ch = Agetchar(); + if (ch == 'B') ch = 0; + gn[1] = ch << 16; + gndbl[1] = 0; + return iso2022(); + case '*' + 0x100: /* set G2 to 94-char set */ + ch = Agetchar(); + if (ch == 'B') ch = 0; + gn[2] = ch << 16; + gndbl[2] = 0; + return iso2022(); + case '+' + 0x100: /* set G3 to 94-char set */ + ch = Agetchar(); + if (ch == 'B') ch = 0; + gn[3] = ch << 16; + gndbl[3] = 0; + return iso2022(); + case '-' + 0x100: /* set G1 to 96-char set */ + ch = Agetchar(); + if (ch == 'A') ch = 0; /* Latin-1 top half */ + gn[1] = (ch << 16) | 0x80; + gndbl[1] = 0; + return iso2022(); + case '.' + 0x100: /* set G2 to 96-char set */ + ch = Agetchar(); + if (ch == 'A') ch = 0; + gn[2] = (ch << 16) | 0x80; + gndbl[2] = 0; + return iso2022(); + case '/' + 0x100: /* set G3 to 96-char set */ + ch = Agetchar(); + if (ch == 'A') ch = 0; + gn[3] = (ch << 16) | 0x80; + gndbl[3] = 0; + return iso2022(); + case '(' + 0x200: /* set G0 to 94 x 94 char set */ + ch = Agetchar(); + gn[0] = ch << 16; + gndbl[0] = 1; + return iso2022(); + case ')' + 0x200: /* set G1 to 94 x 94 char set */ + ch = Agetchar(); + gn[1] = ch << 16; + gndbl[1] = 1; + return iso2022(); + case '*' + 0x200: /* set G2 to 94 x 94 char set */ + ch = Agetchar(); + gn[2] = ch << 16; + gndbl[2] = 1; + return iso2022(); + case '+' + 0x200: /* set G3 to 94 x 94 char set */ + ch = Agetchar(); + gn[3] = ch << 16; + gndbl[3] = 1; + return iso2022(); + default: + if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */ + gn[0] = (ch & ~0x200) << 16; + gndbl[0] = 1; + return iso2022(); + } + } + + if (ch >= 0x21 && ch <= 0x7E) { /* process GL */ + if (gndbl[gl]) { + ch2 = Agetchar(); + return gn[gl] | (ch << 8) | ch2; + } + else return gn[gl] | ch; + } + else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */ + if (gndbl[gr]) { + ch2 = Agetchar(); + return gn[gr] | (ch << 8) | ch2; + } + else return gn[gr] | (ch & ~0x80); + } + else return ch; + } + +/**************************************************************************** + + ungetinchr + + Called by main. Pushes back an "inchr" to be read by getinchr + on the next call. + +******************************************************************************/ +inchr getinchr_buffer; +int getinchr_flag; + +inchr ungetinchr(c) +inchr c; +{ + getinchr_buffer = c; + getinchr_flag = 1; + return c; +} + +/***************************************************************************** + + getinchr + + Called by main. Processes multibyte characters. Invokes Agetchar. + If multibyte = 0, ISO 2022 mode (see iso2022 routine). + If multibyte = 1, double-byte mode (0x00-0x7f bytes are characters, + 0x80-0xFF bytes are first byte of a double-byte character). + If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters, + 0x80-0xBF bytes are nonfirst byte of a multibyte character, + 0xC0-0xFD bytes are first byte of a multibyte character, + 0xFE-0xFF bytes are errors (all errors return code 0x0080)). + If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it, + "~~" is a tilde, "~x" for all other x is ignored). + If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte + of a double-byte character, all other bytes are characters). + + +*****************************************************************************/ + +inchr getinchr() +{ + int ch, ch2, ch3, ch4, ch5, ch6; + + if (getinchr_flag) { + getinchr_flag = 0; + return getinchr_buffer; + } + + switch(multibyte) { + case 0: /* single-byte */ + return iso2022(); + case 1: /* DBCS */ + ch = Agetchar(); + if ((ch >= 0x80 && ch <= 0x9F) || + (ch >= 0xE0 && ch <= 0xEF)) { + ch = (ch << 8) + Agetchar(); + } + return ch; + case 2: /* UTF-8 */ + ch = Agetchar(); + if (ch < 0x80) return ch; /* handles EOF, too */ + if (ch < 0xC0 || ch > 0xFD) + return 0x0080; /* illegal first character */ + ch2 = Agetchar() & 0x3F; + if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2; + ch3 = Agetchar() & 0x3F; + if (ch < 0xF0) + return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3; + ch4 = Agetchar() & 0x3F; + if (ch < 0xF8) + return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4; + ch5 = Agetchar() & 0x3F; + if (ch < 0xFC) + return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) + + (ch4 << 6) + ch5; + ch6 = Agetchar() & 0x3F; + return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) + + (ch4 << 12) + (ch5 << 6) + ch6; + case 3: /* HZ */ + ch = Agetchar(); + if (ch == EOF) return ch; + if (hzmode) { + ch = (ch << 8) + Agetchar(); + if (ch == ('}' << 8) + '~') { + hzmode = 0; + return getinchr(); + } + return ch; + } + else if (ch == '~') { + ch = Agetchar(); + if (ch == '{') { + hzmode = 1; + return getinchr(); + } + else if (ch == '~') { + return ch; + } + else { + return getinchr(); + } + } + else return ch; + case 4: /* Shift-JIS */ + ch = Agetchar(); + if ((ch >= 0x80 && ch <= 0x9F) || + (ch >= 0xE0 && ch <= 0xEF)) { + ch = (ch << 8) + Agetchar(); + } + return ch; + default: + return 0x80; + } + } + +/**************************************************************************** + + main + + The main program, of course. + Reads characters 1 by 1 from stdin, and makes lines out of them using + addchar. Handles line breaking, (which accounts for most of the + complexity in this function). + +****************************************************************************/ + +int main(argc,argv) +int argc; +char *argv[]; +{ + inchr c,c2; + int i; + int last_was_eol_flag; +/*--------------------------------------------------------------------------- + wordbreakmode: + -1: /^$/ and blanks are to be absorbed (when line break was forced + by a blank or character larger than outlinelenlimit) + 0: /^ *$/ and blanks are not to be absorbed + 1: /[^ ]$/ no word break yet + 2: /[^ ] *$/ + 3: /[^ ]$/ had a word break +---------------------------------------------------------------------------*/ + int wordbreakmode; + int char_not_added; + + Myargc = argc; + Myargv = argv; + getparams(); + readcontrolfiles(); + readfont(); + linealloc(); + + wordbreakmode = 0; + last_was_eol_flag = 0; + +#ifdef TLF_FONTS + toiletfont = 0; +#endif + + while ((c = getinchr())!=EOF) { + + if (c=='\n'&¶graphflag&&!last_was_eol_flag) { + ungetinchr(c2 = getinchr()); + c = ((isascii(c2)&&isspace(c2))?'\n':' '); + } + last_was_eol_flag = (isascii(c)&&isspace(c)&&c!='\t'&&c!=' '); + + if (deutschflag) { + if (c>='[' && c<=']') { + c = deutsch[c-'[']; + } + else if (c >='{' && c <= '~') { + c = deutsch[c-'{'+3]; + } + } + + c = handlemapping(c); + + if (isascii(c)&&isspace(c)) { + c = (c=='\t'||c==' ') ? ' ' : '\n'; + } + + if ((c>'\0' && c<' ' && c!='\n') || c==127) continue; + +/* + Note: The following code is complex and thoroughly tested. + Be careful when modifying! +*/ + + do { + char_not_added = 0; + + if (wordbreakmode== -1) { + if (c==' ') { + break; + } + else if (c=='\n') { + wordbreakmode = 0; + break; + } + wordbreakmode = 0; + } + + if (c=='\n') { + printline(); + wordbreakmode = 0; + } + + else if (addchar(c)) { + if (c!=' ') { + wordbreakmode = (wordbreakmode>=2)?3:1; + } + else { + wordbreakmode = (wordbreakmode>0)?2:0; + } + } + + else if (outlinelen==0) { + for (i=0;i1) { + putstring(currchar[i]+STRLEN(currchar[i])-outlinelenlimit); + } + else { + putstring(currchar[i]); + } + } + wordbreakmode = -1; + } + + else if (c==' ') { + if (wordbreakmode==2) { + splitline(); + } + else { + printline(); + } + wordbreakmode = -1; + } + + else { + if (wordbreakmode>=2) { + splitline(); + } + else { + printline(); + } + wordbreakmode = (wordbreakmode==3)?1:0; + char_not_added = 1; + } + + } while (char_not_added); + } + + if (outlinelen!=0) { + printline(); + } + return 0; +} diff --git a/externals/figlet/figlist b/externals/figlet/figlist new file mode 100755 index 0000000000..6dea3b2cf8 --- /dev/null +++ b/externals/figlet/figlist @@ -0,0 +1,64 @@ +#!/bin/sh - +# figlist by Glenn Chappell +# figlet release 2.1.1 -- 25 Aug 1994 +# +# Lists all fonts and control files in figlet's default font directory. +# Replaces "figlet -F", which was removed from figlet version 2.1. +# +# Usage: figlist [ -d directory ] + +DIR=`dirname $0` +FIGLET=$DIR/figlet + +# Get figlet version +FIGLETVERSION=`$FIGLET -I1 2>/dev/null` +if [ -z "$FIGLETVERSION" ]; then + FIGLETVERSION=20000 +fi + +USAGE="Usage: `basename $0` [ -d directory ]" + +if [ "$1" = "-d" ]; then + FONTDIROPT="-d $2" + if [ $# -ne 2 ]; then + echo "$USAGE" + exit 1 + fi +else + FONTDIROPT="" + if [ $# -ne 0 ]; then + echo "$USAGE" + exit 1 + fi +fi + +if [ "$FIGLETVERSION" -lt 20100 ]; then + # figlet 2.0 + $FIGLET $FONTDIROPT -F + exit +fi + +# From here on we may assume figlet 2.1 or later + +FONTDIR=`$FIGLET $FONTDIROPT -I2` +FONT=`$FIGLET -I3` +echo "Default font: $FONT" +echo "Font directory: $FONTDIR" + +if [ -d "$FONTDIR" ] && [ -r "$FONTDIR" ]; then + cd "$FONTDIR" + if ls *.flf >/dev/null 2>&1 ; then + echo "Figlet fonts in this directory:" + ls *.flf 2>/dev/null | sed s/\.flf$// + else + echo 'No figlet fonts in this directory' + fi + if ls *.flc >/dev/null 2>&1 ; then + echo "Figlet control files in this directory:" + ls *.flc 2>/dev/null | sed s/\.flc$// + else + echo 'No figlet control files in this directory' + fi +else + echo 'Unable to open directory' +fi diff --git a/externals/figlet/figlist.6 b/externals/figlet/figlist.6 new file mode 100644 index 0000000000..c8b7cae5c9 --- /dev/null +++ b/externals/figlet/figlist.6 @@ -0,0 +1,52 @@ +.\" figlist by Glenn Chappell +.\" figlet release 2.1.1 -- 25 Aug 1994 +.\" +.\" Lists all fonts and control files in figlet's default font directory. +.\" Replaces "figlet -F", which was removed from figlet version 2.1. +.\" +.\" Usage: figlist [ -d directory ] +.\" +.\" Manual page by Jonathon Abbott, for the Debian Project +.\" slightly modified by Francesco Tapparo, for the Debian Project +.TH FIGLIST 6 "31 May 2012" "v2.2.5" + +.SH NAME +figlist \- lists figlet fonts and control files + +.SH SYNOPSIS +.B figlist +[ +.B \-d +.I directory +] + +.SH DESCRIPTION +Lists all fonts and control files in figlet's default font directory. +Replaces "figlet \-F", which was removed from figlet version 2.1. + +.SH EXAMPLES +To use +.B figlist +with its default settings, simply type +.RS + +.B example% figlist + +.RE + +To list all the font and control files in /usr/share/fonts/figlet +.RS + +.B example% figlist \-d /usr/share/fonts/figlet + +.RE + +.SH AUTHORS +figlist was written by Glenn Chappell + +This manual page was written by Jonathon Abbott for the Debian Project. + +.SH "SEE ALSO" +.BR figlet (6), +.BR chkfont (6), +.BR showfigfonts (6) diff --git a/externals/figlet/figmagic b/externals/figlet/figmagic new file mode 100644 index 0000000000..5e9a01a0de --- /dev/null +++ b/externals/figlet/figmagic @@ -0,0 +1,6 @@ +# Append this file to your /etc/magic or /usr/share/misc/magic file +# to enable the ``file'' command to report on FIGlet fonts and controlfiles. +0 string flf FIGlet font +>3 string >2a version %-2.2s +0 string flc FIGlet controlfile +>3 string >2a version %-2.2s diff --git a/externals/figlet/fonts/646-ca.flc b/externals/figlet/fonts/646-ca.flc new file mode 100644 index 0000000000..b5f3071183 --- /dev/null +++ b/externals/figlet/fonts/646-ca.flc @@ -0,0 +1,157 @@ +# +# Name: CSA_Z243.4-1985-1 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# CSA_Z243.4-1985-1 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the CSA_Z243.4-1985-1 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in CSA_Z243.4-1985-1 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-121 +# &g0esc x2877 &g1esc x2977 &g2esc x2a77 &g3esc x2b77 +# &alias ISO646-CA +# &alias csa7-1 +# &alias ca +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0x5C 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0x5D 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0x5E 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0x5F 0x005F # LOW LINE +0x60 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0x7C 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0x7D 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0x7E 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-ca2.flc b/externals/figlet/fonts/646-ca2.flc new file mode 100644 index 0000000000..a7be02f68c --- /dev/null +++ b/externals/figlet/fonts/646-ca2.flc @@ -0,0 +1,156 @@ +# +# Name: CSA_Z243.4-1985-2 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# CSA_Z243.4-1985-2 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the CSA_Z243.4-1985-2 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in CSA_Z243.4-1985-2 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-122 +# &alias ISO646-CA2 +# &g0esc x2878 &g1esc x2978 &g2esc x2a78 &g3esc x2b78 +# &alias csa7-2 +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0x5C 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0x5D 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0x5E 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0x5F 0x005F # LOW LINE +0x60 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0x7C 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0x7D 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0x7E 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-cn.flc b/externals/figlet/fonts/646-cn.flc new file mode 100644 index 0000000000..fc42581b87 --- /dev/null +++ b/externals/figlet/fonts/646-cn.flc @@ -0,0 +1,156 @@ +# +# Name: GB_1988-80 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# GB_1988-80 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the GB_1988-80 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in GB_1988-80 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-57 +# &g0esc x2854 &g1esc x2954 &g2esc x2a54 &g3esc x2b54 +# &alias cn +# &alias ISO646-CN +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x00A5 # YEN SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x203E # OVERLINE +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-cu.flc b/externals/figlet/fonts/646-cu.flc new file mode 100644 index 0000000000..a9cd5fdb03 --- /dev/null +++ b/externals/figlet/fonts/646-cu.flc @@ -0,0 +1,156 @@ +# +# Name: NC_NC00-10:81 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# NC_NC00-10:81 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the NC_NC00-10:81 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in NC_NC00-10:81 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias cuba +# &alias iso-ir-151 +# &alias ISO646-CU +# &g0esc x282141 &g1esc x292141 &g2esc x2a2141 &g3esc x2b2141 +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x00A4 # CURRENCY SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00A1 # INVERTED EXCLAMATION MARK +0x5C 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x00BF # INVERTED QUESTION MARK +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00B4 # ACUTE ACCENT +0x7C 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0x7D 0x005B # LEFT SQUARE BRACKET +0x7E 0x00A8 # DIAERESIS +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-de.flc b/externals/figlet/fonts/646-de.flc new file mode 100644 index 0000000000..716a42ffbf --- /dev/null +++ b/externals/figlet/fonts/646-de.flc @@ -0,0 +1,156 @@ +# +# Name: DIN_66003 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# DIN_66003 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the DIN_66003 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in DIN_66003 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-21 +# &g0esc x284b &g1esc x294b &g2esc x2a4b &g3esc x2b4b +# &alias de +# &alias ISO646-DE +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x00A7 # SECTION SIGN +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0x5C 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0x5D 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0x7C 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0x7D 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0x7E 0x00DF # LATIN SMALL LETTER SHARP S (German) +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-dk.flc b/externals/figlet/fonts/646-dk.flc new file mode 100644 index 0000000000..3d9ddae013 --- /dev/null +++ b/externals/figlet/fonts/646-dk.flc @@ -0,0 +1,155 @@ +# +# Name: DS_2089 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# DS_2089 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the DS_2089 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in DS_2089 order +# +# Any comments or problems, contact +# +# &rem source: Danish Standard, DS 2089, February 1974 +# &alias DS2089 +# &alias ISO646-DK +# &alias dk +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00C6 # LATIN CAPITAL LETTER AE +0x5C 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0x5D 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E6 # LATIN SMALL LETTER AE +0x7C 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0x7D 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-es.flc b/externals/figlet/fonts/646-es.flc new file mode 100644 index 0000000000..b996d786b3 --- /dev/null +++ b/externals/figlet/fonts/646-es.flc @@ -0,0 +1,155 @@ +# +# Name: ES to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# ES characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ES code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ES order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-17 +# &alias ISO646-ES +# &g0esc x285a &g1esc x295a &g2esc x2a5a &g3esc x2b5a +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x00A3 # POUND SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x00A7 # SECTION SIGN +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00A1 # INVERTED EXCLAMATION MARK +0x5C 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0x5D 0x00BF # INVERTED QUESTION MARK +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00B0 # DEGREE SIGN +0x7C 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0x7D 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-es2.flc b/externals/figlet/fonts/646-es2.flc new file mode 100644 index 0000000000..1f282ceb78 --- /dev/null +++ b/externals/figlet/fonts/646-es2.flc @@ -0,0 +1,155 @@ +# +# Name: ES2 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# ES2 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ES2 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ES2 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-85 +# &alias ISO646-ES2 +# &g0esc x2868 &g1esc x2968 &g2esc x2a68 &g3esc x2b68 +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x2219 # BULLET OPERATOR +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00A1 # INVERTED EXCLAMATION MARK +0x5C 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0x5D 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0x5E 0x00BF # INVERTED QUESTION MARK +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00B4 # ACUTE ACCENT +0x7C 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0x7D 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0x7E 0x00A8 # DIAERESIS +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-fr.flc b/externals/figlet/fonts/646-fr.flc new file mode 100644 index 0000000000..225b2fb8e6 --- /dev/null +++ b/externals/figlet/fonts/646-fr.flc @@ -0,0 +1,156 @@ +# +# Name: NF_Z_62-010 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# NF_Z_62-010 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the NF_Z_62-010 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in NF_Z_62-010 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-69 +# &alias ISO646-FR +# &g0esc x2866 &g1esc x2966 &g2esc x2a66 &g3esc x2b66 +# &alias fr +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x00A3 # POUND SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00B0 # DEGREE SIGN +0x5C 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0x5D 0x00A7 # SECTION SIGN +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x00B5 # MICRO SIGN +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0x7C 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0x7D 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0x7E 0x00A8 # DIAERESIS +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-gb.flc b/externals/figlet/fonts/646-gb.flc new file mode 100644 index 0000000000..4e9d648c9b --- /dev/null +++ b/externals/figlet/fonts/646-gb.flc @@ -0,0 +1,157 @@ +# +# Name: BS_4730 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# BS_4730 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the BS_4730 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in BS_4730 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-4 +# &alias ISO646-GB +# &g0esc x2841 &g1esc x2941 &g2esc x2a41 &g3esc x2b41 +# &alias gb +# &alias uk +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x00A3 # POUND SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x203E # OVERLINE +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-hu.flc b/externals/figlet/fonts/646-hu.flc new file mode 100644 index 0000000000..9ad58c31e7 --- /dev/null +++ b/externals/figlet/fonts/646-hu.flc @@ -0,0 +1,156 @@ +# +# Name: MSZ_7795.3 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# MSZ_7795.3 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the MSZ_7795.3 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in MSZ_7795.3 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-86 +# &alias ISO646-HU +# &g0esc x2869 &g1esc x2969 &g2esc x2a69 &g3esc x2b69 +# &alias hu +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x00A4 # CURRENCY SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0x5C 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0x5D 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0x7C 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0x7D 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0x7E 0x02DD # DOUBLE ACUTE ACCENT +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-irv.flc b/externals/figlet/fonts/646-irv.flc new file mode 100644 index 0000000000..caf629229c --- /dev/null +++ b/externals/figlet/fonts/646-irv.flc @@ -0,0 +1,155 @@ +# +# Name: ISO_646.irv:1983 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# ISO_646.irv:1983 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO_646.irv:1983 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO_646.irv:1983 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-2 +# &alias irv +# &g0esc x2840 &g1esc x2940 &g2esc x2a40 &g3esc x2b40 +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x00A4 # CURRENCY SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x203E # OVERLINE +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-it.flc b/externals/figlet/fonts/646-it.flc new file mode 100644 index 0000000000..657125bd85 --- /dev/null +++ b/externals/figlet/fonts/646-it.flc @@ -0,0 +1,155 @@ +# +# Name: IT to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# IT characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the IT code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in IT order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-15 +# &alias ISO646-IT +# &g0esc x2859 &g1esc x2959 &g2esc x2a59 &g3esc x2b59 +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x00A3 # POUND SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x00A7 # SECTION SIGN +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00B0 # DEGREE SIGN +0x5C 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0x5D 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0x7C 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0x7D 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0x7E 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-jp.flc b/externals/figlet/fonts/646-jp.flc new file mode 100644 index 0000000000..a3bc3513d6 --- /dev/null +++ b/externals/figlet/fonts/646-jp.flc @@ -0,0 +1,156 @@ +# +# Name: JIS_C6220-1969-ro to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# JIS_C6220-1969-ro characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the JIS_C6220-1969-ro code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in JIS_C6220-1969-ro order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-14 +# &g0esc x284a &g1esc x294a &g2esc x2a4a &g3esc x2b4a +# &alias jp +# &alias ISO646-JP +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x00A5 # YEN SIGN +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x203E # OVERLINE +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-kr.flc b/externals/figlet/fonts/646-kr.flc new file mode 100644 index 0000000000..6966895e56 --- /dev/null +++ b/externals/figlet/fonts/646-kr.flc @@ -0,0 +1,152 @@ +# +# Name: KSC5636 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# KSC5636 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the KSC5636 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in KSC5636 order +# +# Any comments or problems, contact +# +# &alias ISO646-KR +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x20A9 # WON SIGN +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-no.flc b/externals/figlet/fonts/646-no.flc new file mode 100644 index 0000000000..3f4776656f --- /dev/null +++ b/externals/figlet/fonts/646-no.flc @@ -0,0 +1,156 @@ +# +# Name: NS_4551-1 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# NS_4551-1 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the NS_4551-1 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in NS_4551-1 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-60 +# &alias ISO646-NO +# &g0esc x2860 &g1esc x2960 &g2esc x2a60 &g3esc x2b60 +# &alias no +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00C6 # LATIN CAPITAL LETTER AE +0x5C 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0x5D 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E6 # LATIN SMALL LETTER AE +0x7C 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0x7D 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0x7E 0x203E # OVERLINE +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-no2.flc b/externals/figlet/fonts/646-no2.flc new file mode 100644 index 0000000000..c5ca075a2c --- /dev/null +++ b/externals/figlet/fonts/646-no2.flc @@ -0,0 +1,156 @@ +# +# Name: NS_4551-2 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# NS_4551-2 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the NS_4551-2 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in NS_4551-2 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias ISO646-NO2 +# &alias iso-ir-61 +# &g0esc x2861 &g1esc x2961 &g2esc x2a61 &g3esc x2b61 +# &alias no2 +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x00B6 # PILCROW SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00C6 # LATIN CAPITAL LETTER AE +0x5C 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0x5D 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E6 # LATIN SMALL LETTER AE +0x7C 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0x7D 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0x7E 0x007C # VERTICAL LINE +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-pt.flc b/externals/figlet/fonts/646-pt.flc new file mode 100644 index 0000000000..37571886c9 --- /dev/null +++ b/externals/figlet/fonts/646-pt.flc @@ -0,0 +1,155 @@ +# +# Name: PT to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# PT characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the PT code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in PT order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-16 +# &alias ISO646-PT +# &g0esc x284c &g1esc x294c &g2esc x2a4c &g3esc x2b4c +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x00A7 # SECTION SIGN +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0x5C 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0x5D 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0x7C 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0x7D 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0x7E 0x00B0 # DEGREE SIGN +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-pt2.flc b/externals/figlet/fonts/646-pt2.flc new file mode 100644 index 0000000000..8a00e61ec8 --- /dev/null +++ b/externals/figlet/fonts/646-pt2.flc @@ -0,0 +1,155 @@ +# +# Name: PT2 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# PT2 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the PT2 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in PT2 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-84 +# &alias ISO646-PT2 +# &g0esc x2867 &g1esc x2967 &g2esc x2a67 &g3esc x2b67 +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x00B4 # ACUTE ACCENT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0x5C 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0x5D 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0x7C 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0x7D 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0x7E 0x203E # OVERLINE +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-se.flc b/externals/figlet/fonts/646-se.flc new file mode 100644 index 0000000000..424e886a01 --- /dev/null +++ b/externals/figlet/fonts/646-se.flc @@ -0,0 +1,158 @@ +# +# Name: SEN_850200_B to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# SEN_850200_B characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the SEN_850200_B code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in SEN_850200_B order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-10 +# &alias FI +# &alias ISO646-FI +# &alias ISO646-SE +# &alias se +# &g0esc x2847 &g1esc x2947 &g2esc x2a47 &g3esc x2b47 +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x00A4 # CURRENCY SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0x5C 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0x5D 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0x7C 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0x7D 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0x7E 0x203E # OVERLINE +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-se2.flc b/externals/figlet/fonts/646-se2.flc new file mode 100644 index 0000000000..38c86cd37c --- /dev/null +++ b/externals/figlet/fonts/646-se2.flc @@ -0,0 +1,156 @@ +# +# Name: SEN_850200_C to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# SEN_850200_C characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the SEN_850200_C code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in SEN_850200_C order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-11 +# &alias ISO646-SE2 +# &g0esc x2848 &g1esc x2948 &g2esc x2a48 &g3esc x2b48 +# &alias se2 +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x00A4 # CURRENCY SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0x5C 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0x5D 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0x5E 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0x5F 0x005F # LOW LINE +0x60 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0x7C 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0x7D 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0x7E 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/646-yu.flc b/externals/figlet/fonts/646-yu.flc new file mode 100644 index 0000000000..6307a6aff4 --- /dev/null +++ b/externals/figlet/fonts/646-yu.flc @@ -0,0 +1,157 @@ +# +# Name: JUS_I.B1.002 to Unicode +# Unicode version: 2.0 +# Table version: 0.1 +# Table format: Format A +# Date: 0097-01-24 +# Authors: John Cowan (conversion) +# Keld Simonsen (RFC 1345) +# +# General notes: +# +# This table contains data obtained from RFC 1345 on how +# JUS_I.B1.002 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the JUS_I.B1.002 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in JUS_I.B1.002 order +# +# Any comments or problems, contact +# +# &rem source: ECMA registry +# &alias iso-ir-141 +# &g0esc x287a &g1esc x297a &g2esc x2a7a &g3esc x2b7a +# &alias ISO646-YU +# &alias js +# &alias yu +0x00 0x0000 # NULL (NUL) +0x01 0x0001 # START OF HEADING (SOH) +0x02 0x0002 # START OF TEXT (STX) +0x03 0x0003 # END OF TEXT (ETX) +0x04 0x0004 # END OF TRANSMISSION (EOT) +0x05 0x0005 # ENQUIRY (ENQ) +0x06 0x0006 # ACKNOWLEDGE (ACK) +0x07 0x0007 # BELL (BEL) +0x08 0x0008 # BACKSPACE (BS) +0x09 0x0009 # CHARACTER TABULATION (HT) +0x0A 0x000A # LINE FEED (LF) +0x0B 0x000B # LINE TABULATION (VT) +0x0C 0x000C # FORM FEED (FF) +0x0D 0x000D # CARRIAGE RETURN (CR) +0x0E 0x000E # SHIFT OUT (SO) +0x0F 0x000F # SHIFT IN (SI) +0x10 0x0010 # DATALINK ESCAPE (DLE) +0x11 0x0011 # DEVICE CONTROL ONE (DC1) +0x12 0x0012 # DEVICE CONTROL TWO (DC2) +0x13 0x0013 # DEVICE CONTROL THREE (DC3) +0x14 0x0014 # DEVICE CONTROL FOUR (DC4) +0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK) +0x16 0x0016 # SYNCRONOUS IDLE (SYN) +0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB) +0x18 0x0018 # CANCEL (CAN) +0x19 0x0019 # END OF MEDIUM (EM) +0x1A 0x001A # SUBSTITUTE (SUB) +0x1B 0x001B # ESCAPE (ESC) +0x1C 0x001C # FILE SEPARATOR (IS4) +0x1D 0x001D # GROUP SEPARATOR (IS3) +0x1E 0x001E # RECORD SEPARATOR (IS2) +0x1F 0x001F # UNIT SEPARATOR (IS1) +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0x5C 0x0110 # LATIN CAPITAL LETTER D WITH STROKE +0x5D 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE +0x5E 0x010C # LATIN CAPITAL LETTER C WITH CARON +0x5F 0x005F # LOW LINE +0x60 0x017E # LATIN SMALL LETTER Z WITH CARON +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x0161 # LATIN SMALL LETTER S WITH CARON +0x7C 0x0111 # LATIN SMALL LETTER D WITH STROKE +0x7D 0x0107 # LATIN SMALL LETTER C WITH ACUTE +0x7E 0x010D # LATIN SMALL LETTER C WITH CARON +0x7F 0x007F # DELETE (DEL) diff --git a/externals/figlet/fonts/8859-2.flc b/externals/figlet/fonts/8859-2.flc new file mode 100644 index 0000000000..e45df25eb8 --- /dev/null +++ b/externals/figlet/fonts/8859-2.flc @@ -0,0 +1,303 @@ +# +# Name: ISO 8859-2:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-2:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-2 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK +0xA2 0x02D8 # BREVE +0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x013D # LATIN CAPITAL LETTER L WITH CARON +0xA6 0x015A # LATIN CAPITAL LETTER S WITH ACUTE +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA +0xAB 0x0164 # LATIN CAPITAL LETTER T WITH CARON +0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK +0xB2 0x02DB # OGONEK +0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x013E # LATIN SMALL LETTER L WITH CARON +0xB6 0x015B # LATIN SMALL LETTER S WITH ACUTE +0xB7 0x02C7 # CARON +0xB8 0x00B8 # CEDILLA +0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON +0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA +0xBB 0x0165 # LATIN SMALL LETTER T WITH CARON +0xBC 0x017A # LATIN SMALL LETTER Z WITH ACUTE +0xBD 0x02DD # DOUBLE ACUTE ACCENT +0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON +0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE +0xC0 0x0154 # LATIN CAPITAL LETTER R WITH ACUTE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x0102 # LATIN CAPITAL LETTER A WITH BREVE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x0139 # LATIN CAPITAL LETTER L WITH ACUTE +0xC6 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x011A # LATIN CAPITAL LETTER E WITH CARON +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x010E # LATIN CAPITAL LETTER D WITH CARON +0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE +0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE +0xD2 0x0147 # LATIN CAPITAL LETTER N WITH CARON +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x0158 # LATIN CAPITAL LETTER R WITH CARON +0xD9 0x016E # LATIN CAPITAL LETTER U WITH RING ABOVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE +0xDE 0x0162 # LATIN CAPITAL LETTER T WITH CEDILLA +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x0155 # LATIN SMALL LETTER R WITH ACUTE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x0103 # LATIN SMALL LETTER A WITH BREVE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x013A # LATIN SMALL LETTER L WITH ACUTE +0xE6 0x0107 # LATIN SMALL LETTER C WITH ACUTE +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x010D # LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x011B # LATIN SMALL LETTER E WITH CARON +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x010F # LATIN SMALL LETTER D WITH CARON +0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE +0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE +0xF2 0x0148 # LATIN SMALL LETTER N WITH CARON +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x0159 # LATIN SMALL LETTER R WITH CARON +0xF9 0x016F # LATIN SMALL LETTER U WITH RING ABOVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE +0xFE 0x0163 # LATIN SMALL LETTER T WITH CEDILLA +0xFF 0x02D9 # DOT ABOVE diff --git a/externals/figlet/fonts/8859-3.flc b/externals/figlet/fonts/8859-3.flc new file mode 100644 index 0000000000..9b6ac69dd8 --- /dev/null +++ b/externals/figlet/fonts/8859-3.flc @@ -0,0 +1,296 @@ +# +# Name: ISO/IEC 8859-3:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-3:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-3 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-3 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0126 # LATIN CAPITAL LETTER H WITH STROKE +0xA2 0x02D8 # BREVE +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA6 0x0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE +0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA +0xAB 0x011E # LATIN CAPITAL LETTER G WITH BREVE +0xAC 0x0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0xAD 0x00AD # SOFT HYPHEN +0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x0127 # LATIN SMALL LETTER H WITH STROKE +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x00B5 # MICRO SIGN +0xB6 0x0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00B8 # CEDILLA +0xB9 0x0131 # LATIN SMALL LETTER DOTLESS I +0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA +0xBB 0x011F # LATIN SMALL LETTER G WITH BREVE +0xBC 0x0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE +0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x010A # LATIN CAPITAL LETTER C WITH DOT ABOVE +0xC6 0x0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x016C # LATIN CAPITAL LETTER U WITH BREVE +0xDE 0x015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x010B # LATIN SMALL LETTER C WITH DOT ABOVE +0xE6 0x0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x0121 # LATIN SMALL LETTER G WITH DOT ABOVE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x011D # LATIN SMALL LETTER G WITH CIRCUMFLEX +0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x016D # LATIN SMALL LETTER U WITH BREVE +0xFE 0x015D # LATIN SMALL LETTER S WITH CIRCUMFLEX +0xFF 0x02D9 # DOT ABOVE diff --git a/externals/figlet/fonts/8859-4.flc b/externals/figlet/fonts/8859-4.flc new file mode 100644 index 0000000000..662e698ab2 --- /dev/null +++ b/externals/figlet/fonts/8859-4.flc @@ -0,0 +1,303 @@ +# +# Name: ISO/IEC 8859-4:1998 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-4:1998 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-4 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-4 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK +0xA2 0x0138 # LATIN SMALL LETTER KRA +0xA3 0x0156 # LATIN CAPITAL LETTER R WITH CEDILLA +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x0128 # LATIN CAPITAL LETTER I WITH TILDE +0xA6 0x013B # LATIN CAPITAL LETTER L WITH CEDILLA +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON +0xAA 0x0112 # LATIN CAPITAL LETTER E WITH MACRON +0xAB 0x0122 # LATIN CAPITAL LETTER G WITH CEDILLA +0xAC 0x0166 # LATIN CAPITAL LETTER T WITH STROKE +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK +0xB2 0x02DB # OGONEK +0xB3 0x0157 # LATIN SMALL LETTER R WITH CEDILLA +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x0129 # LATIN SMALL LETTER I WITH TILDE +0xB6 0x013C # LATIN SMALL LETTER L WITH CEDILLA +0xB7 0x02C7 # CARON +0xB8 0x00B8 # CEDILLA +0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON +0xBA 0x0113 # LATIN SMALL LETTER E WITH MACRON +0xBB 0x0123 # LATIN SMALL LETTER G WITH CEDILLA +0xBC 0x0167 # LATIN SMALL LETTER T WITH STROKE +0xBD 0x014A # LATIN CAPITAL LETTER ENG +0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON +0xBF 0x014B # LATIN SMALL LETTER ENG +0xC0 0x0100 # LATIN CAPITAL LETTER A WITH MACRON +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x012E # LATIN CAPITAL LETTER I WITH OGONEK +0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x012A # LATIN CAPITAL LETTER I WITH MACRON +0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE +0xD1 0x0145 # LATIN CAPITAL LETTER N WITH CEDILLA +0xD2 0x014C # LATIN CAPITAL LETTER O WITH MACRON +0xD3 0x0136 # LATIN CAPITAL LETTER K WITH CEDILLA +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x0172 # LATIN CAPITAL LETTER U WITH OGONEK +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x0168 # LATIN CAPITAL LETTER U WITH TILDE +0xDE 0x016A # LATIN CAPITAL LETTER U WITH MACRON +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x0101 # LATIN SMALL LETTER A WITH MACRON +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x012F # LATIN SMALL LETTER I WITH OGONEK +0xE8 0x010D # LATIN SMALL LETTER C WITH CARON +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x0117 # LATIN SMALL LETTER E WITH DOT ABOVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x012B # LATIN SMALL LETTER I WITH MACRON +0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE +0xF1 0x0146 # LATIN SMALL LETTER N WITH CEDILLA +0xF2 0x014D # LATIN SMALL LETTER O WITH MACRON +0xF3 0x0137 # LATIN SMALL LETTER K WITH CEDILLA +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x0173 # LATIN SMALL LETTER U WITH OGONEK +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x0169 # LATIN SMALL LETTER U WITH TILDE +0xFE 0x016B # LATIN SMALL LETTER U WITH MACRON +0xFF 0x02D9 # DOT ABOVE diff --git a/externals/figlet/fonts/8859-5.flc b/externals/figlet/fonts/8859-5.flc new file mode 100644 index 0000000000..a7ed1ce2ab --- /dev/null +++ b/externals/figlet/fonts/8859-5.flc @@ -0,0 +1,303 @@ +# +# Name: ISO 8859-5:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-5:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-5 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-5 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x0401 # CYRILLIC CAPITAL LETTER IO +0xA2 0x0402 # CYRILLIC CAPITAL LETTER DJE +0xA3 0x0403 # CYRILLIC CAPITAL LETTER GJE +0xA4 0x0404 # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0xA5 0x0405 # CYRILLIC CAPITAL LETTER DZE +0xA6 0x0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0xA7 0x0407 # CYRILLIC CAPITAL LETTER YI +0xA8 0x0408 # CYRILLIC CAPITAL LETTER JE +0xA9 0x0409 # CYRILLIC CAPITAL LETTER LJE +0xAA 0x040A # CYRILLIC CAPITAL LETTER NJE +0xAB 0x040B # CYRILLIC CAPITAL LETTER TSHE +0xAC 0x040C # CYRILLIC CAPITAL LETTER KJE +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x040E # CYRILLIC CAPITAL LETTER SHORT U +0xAF 0x040F # CYRILLIC CAPITAL LETTER DZHE +0xB0 0x0410 # CYRILLIC CAPITAL LETTER A +0xB1 0x0411 # CYRILLIC CAPITAL LETTER BE +0xB2 0x0412 # CYRILLIC CAPITAL LETTER VE +0xB3 0x0413 # CYRILLIC CAPITAL LETTER GHE +0xB4 0x0414 # CYRILLIC CAPITAL LETTER DE +0xB5 0x0415 # CYRILLIC CAPITAL LETTER IE +0xB6 0x0416 # CYRILLIC CAPITAL LETTER ZHE +0xB7 0x0417 # CYRILLIC CAPITAL LETTER ZE +0xB8 0x0418 # CYRILLIC CAPITAL LETTER I +0xB9 0x0419 # CYRILLIC CAPITAL LETTER SHORT I +0xBA 0x041A # CYRILLIC CAPITAL LETTER KA +0xBB 0x041B # CYRILLIC CAPITAL LETTER EL +0xBC 0x041C # CYRILLIC CAPITAL LETTER EM +0xBD 0x041D # CYRILLIC CAPITAL LETTER EN +0xBE 0x041E # CYRILLIC CAPITAL LETTER O +0xBF 0x041F # CYRILLIC CAPITAL LETTER PE +0xC0 0x0420 # CYRILLIC CAPITAL LETTER ER +0xC1 0x0421 # CYRILLIC CAPITAL LETTER ES +0xC2 0x0422 # CYRILLIC CAPITAL LETTER TE +0xC3 0x0423 # CYRILLIC CAPITAL LETTER U +0xC4 0x0424 # CYRILLIC CAPITAL LETTER EF +0xC5 0x0425 # CYRILLIC CAPITAL LETTER HA +0xC6 0x0426 # CYRILLIC CAPITAL LETTER TSE +0xC7 0x0427 # CYRILLIC CAPITAL LETTER CHE +0xC8 0x0428 # CYRILLIC CAPITAL LETTER SHA +0xC9 0x0429 # CYRILLIC CAPITAL LETTER SHCHA +0xCA 0x042A # CYRILLIC CAPITAL LETTER HARD SIGN +0xCB 0x042B # CYRILLIC CAPITAL LETTER YERU +0xCC 0x042C # CYRILLIC CAPITAL LETTER SOFT SIGN +0xCD 0x042D # CYRILLIC CAPITAL LETTER E +0xCE 0x042E # CYRILLIC CAPITAL LETTER YU +0xCF 0x042F # CYRILLIC CAPITAL LETTER YA +0xD0 0x0430 # CYRILLIC SMALL LETTER A +0xD1 0x0431 # CYRILLIC SMALL LETTER BE +0xD2 0x0432 # CYRILLIC SMALL LETTER VE +0xD3 0x0433 # CYRILLIC SMALL LETTER GHE +0xD4 0x0434 # CYRILLIC SMALL LETTER DE +0xD5 0x0435 # CYRILLIC SMALL LETTER IE +0xD6 0x0436 # CYRILLIC SMALL LETTER ZHE +0xD7 0x0437 # CYRILLIC SMALL LETTER ZE +0xD8 0x0438 # CYRILLIC SMALL LETTER I +0xD9 0x0439 # CYRILLIC SMALL LETTER SHORT I +0xDA 0x043A # CYRILLIC SMALL LETTER KA +0xDB 0x043B # CYRILLIC SMALL LETTER EL +0xDC 0x043C # CYRILLIC SMALL LETTER EM +0xDD 0x043D # CYRILLIC SMALL LETTER EN +0xDE 0x043E # CYRILLIC SMALL LETTER O +0xDF 0x043F # CYRILLIC SMALL LETTER PE +0xE0 0x0440 # CYRILLIC SMALL LETTER ER +0xE1 0x0441 # CYRILLIC SMALL LETTER ES +0xE2 0x0442 # CYRILLIC SMALL LETTER TE +0xE3 0x0443 # CYRILLIC SMALL LETTER U +0xE4 0x0444 # CYRILLIC SMALL LETTER EF +0xE5 0x0445 # CYRILLIC SMALL LETTER HA +0xE6 0x0446 # CYRILLIC SMALL LETTER TSE +0xE7 0x0447 # CYRILLIC SMALL LETTER CHE +0xE8 0x0448 # CYRILLIC SMALL LETTER SHA +0xE9 0x0449 # CYRILLIC SMALL LETTER SHCHA +0xEA 0x044A # CYRILLIC SMALL LETTER HARD SIGN +0xEB 0x044B # CYRILLIC SMALL LETTER YERU +0xEC 0x044C # CYRILLIC SMALL LETTER SOFT SIGN +0xED 0x044D # CYRILLIC SMALL LETTER E +0xEE 0x044E # CYRILLIC SMALL LETTER YU +0xEF 0x044F # CYRILLIC SMALL LETTER YA +0xF0 0x2116 # NUMERO SIGN +0xF1 0x0451 # CYRILLIC SMALL LETTER IO +0xF2 0x0452 # CYRILLIC SMALL LETTER DJE +0xF3 0x0453 # CYRILLIC SMALL LETTER GJE +0xF4 0x0454 # CYRILLIC SMALL LETTER UKRAINIAN IE +0xF5 0x0455 # CYRILLIC SMALL LETTER DZE +0xF6 0x0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +0xF7 0x0457 # CYRILLIC SMALL LETTER YI +0xF8 0x0458 # CYRILLIC SMALL LETTER JE +0xF9 0x0459 # CYRILLIC SMALL LETTER LJE +0xFA 0x045A # CYRILLIC SMALL LETTER NJE +0xFB 0x045B # CYRILLIC SMALL LETTER TSHE +0xFC 0x045C # CYRILLIC SMALL LETTER KJE +0xFD 0x00A7 # SECTION SIGN +0xFE 0x045E # CYRILLIC SMALL LETTER SHORT U +0xFF 0x045F # CYRILLIC SMALL LETTER DZHE diff --git a/externals/figlet/fonts/8859-7.flc b/externals/figlet/fonts/8859-7.flc new file mode 100644 index 0000000000..bc46b74719 --- /dev/null +++ b/externals/figlet/fonts/8859-7.flc @@ -0,0 +1,308 @@ +# +# Name: ISO 8859-7:2003 to Unicode +# Unicode version: 4.0 +# Table version: 2.0 +# Table format: Format A +# Date: 2003-Nov-12 +# Authors: Ken Whistler +# +# Copyright (c) 1991-2003 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO 8859-7:2003 characters map into Unicode. +# +# ISO 8859-7:1987 is equivalent to ISO-IR-126, ELOT 928, +# and ECMA 118. ISO 8859-7:2003 adds two currency signs +# and one other character not in the earlier standard. +# +# Format: Three tab-separated columns +# Column #1 is the ISO 8859-7 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO 8859-7 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# Remap 0xA1 to U+2018 (instead of 0x02BD) to match text of 8859-7 +# Remap 0xA2 to U+2019 (instead of 0x02BC) to match text of 8859-7 +# +# 2.0 version updates 1.0 version by adding mappings for the +# three newly added characters 0xA4, 0xA5, 0xAA. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact the Unicode Consortium at: +# +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x2018 # LEFT SINGLE QUOTATION MARK +0xA2 0x2019 # RIGHT SINGLE QUOTATION MARK +0xA3 0x00A3 # POUND SIGN +0xA4 0x20AC # EURO SIGN +0xA5 0x20AF # DRACHMA SIGN +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x037A # GREEK YPOGEGRAMMENI +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAF 0x2015 # HORIZONTAL BAR +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x0384 # GREEK TONOS +0xB5 0x0385 # GREEK DIALYTIKA TONOS +0xB6 0x0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS +0xB9 0x0389 # GREEK CAPITAL LETTER ETA WITH TONOS +0xBA 0x038A # GREEK CAPITAL LETTER IOTA WITH TONOS +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x038C # GREEK CAPITAL LETTER OMICRON WITH TONOS +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x038E # GREEK CAPITAL LETTER UPSILON WITH TONOS +0xBF 0x038F # GREEK CAPITAL LETTER OMEGA WITH TONOS +0xC0 0x0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0xC1 0x0391 # GREEK CAPITAL LETTER ALPHA +0xC2 0x0392 # GREEK CAPITAL LETTER BETA +0xC3 0x0393 # GREEK CAPITAL LETTER GAMMA +0xC4 0x0394 # GREEK CAPITAL LETTER DELTA +0xC5 0x0395 # GREEK CAPITAL LETTER EPSILON +0xC6 0x0396 # GREEK CAPITAL LETTER ZETA +0xC7 0x0397 # GREEK CAPITAL LETTER ETA +0xC8 0x0398 # GREEK CAPITAL LETTER THETA +0xC9 0x0399 # GREEK CAPITAL LETTER IOTA +0xCA 0x039A # GREEK CAPITAL LETTER KAPPA +0xCB 0x039B # GREEK CAPITAL LETTER LAMDA +0xCC 0x039C # GREEK CAPITAL LETTER MU +0xCD 0x039D # GREEK CAPITAL LETTER NU +0xCE 0x039E # GREEK CAPITAL LETTER XI +0xCF 0x039F # GREEK CAPITAL LETTER OMICRON +0xD0 0x03A0 # GREEK CAPITAL LETTER PI +0xD1 0x03A1 # GREEK CAPITAL LETTER RHO +0xD3 0x03A3 # GREEK CAPITAL LETTER SIGMA +0xD4 0x03A4 # GREEK CAPITAL LETTER TAU +0xD5 0x03A5 # GREEK CAPITAL LETTER UPSILON +0xD6 0x03A6 # GREEK CAPITAL LETTER PHI +0xD7 0x03A7 # GREEK CAPITAL LETTER CHI +0xD8 0x03A8 # GREEK CAPITAL LETTER PSI +0xD9 0x03A9 # GREEK CAPITAL LETTER OMEGA +0xDA 0x03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +0xDB 0x03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +0xDC 0x03AC # GREEK SMALL LETTER ALPHA WITH TONOS +0xDD 0x03AD # GREEK SMALL LETTER EPSILON WITH TONOS +0xDE 0x03AE # GREEK SMALL LETTER ETA WITH TONOS +0xDF 0x03AF # GREEK SMALL LETTER IOTA WITH TONOS +0xE0 0x03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +0xE1 0x03B1 # GREEK SMALL LETTER ALPHA +0xE2 0x03B2 # GREEK SMALL LETTER BETA +0xE3 0x03B3 # GREEK SMALL LETTER GAMMA +0xE4 0x03B4 # GREEK SMALL LETTER DELTA +0xE5 0x03B5 # GREEK SMALL LETTER EPSILON +0xE6 0x03B6 # GREEK SMALL LETTER ZETA +0xE7 0x03B7 # GREEK SMALL LETTER ETA +0xE8 0x03B8 # GREEK SMALL LETTER THETA +0xE9 0x03B9 # GREEK SMALL LETTER IOTA +0xEA 0x03BA # GREEK SMALL LETTER KAPPA +0xEB 0x03BB # GREEK SMALL LETTER LAMDA +0xEC 0x03BC # GREEK SMALL LETTER MU +0xED 0x03BD # GREEK SMALL LETTER NU +0xEE 0x03BE # GREEK SMALL LETTER XI +0xEF 0x03BF # GREEK SMALL LETTER OMICRON +0xF0 0x03C0 # GREEK SMALL LETTER PI +0xF1 0x03C1 # GREEK SMALL LETTER RHO +0xF2 0x03C2 # GREEK SMALL LETTER FINAL SIGMA +0xF3 0x03C3 # GREEK SMALL LETTER SIGMA +0xF4 0x03C4 # GREEK SMALL LETTER TAU +0xF5 0x03C5 # GREEK SMALL LETTER UPSILON +0xF6 0x03C6 # GREEK SMALL LETTER PHI +0xF7 0x03C7 # GREEK SMALL LETTER CHI +0xF8 0x03C8 # GREEK SMALL LETTER PSI +0xF9 0x03C9 # GREEK SMALL LETTER OMEGA +0xFA 0x03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA +0xFB 0x03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA +0xFC 0x03CC # GREEK SMALL LETTER OMICRON WITH TONOS +0xFD 0x03CD # GREEK SMALL LETTER UPSILON WITH TONOS +0xFE 0x03CE # GREEK SMALL LETTER OMEGA WITH TONOS diff --git a/externals/figlet/fonts/8859-8.flc b/externals/figlet/fonts/8859-8.flc new file mode 100644 index 0000000000..bc8da4c7fd --- /dev/null +++ b/externals/figlet/fonts/8859-8.flc @@ -0,0 +1,270 @@ +# +# Name: ISO/IEC 8859-8:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.1 +# Table format: Format A +# Date: 2000-Jan-03 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on optical media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-8:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-8 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-8 order. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# 1.1 version updates to the published 8859-8:1999, correcting +# the mapping of 0xAF and adding mappings for LRM and RLM. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA2 0x00A2 # CENT SIGN +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x00A5 # YEN SIGN +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x00D7 # MULTIPLICATION SIGN +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x00B5 # MICRO SIGN +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00B8 # CEDILLA +0xB9 0x00B9 # SUPERSCRIPT ONE +0xBA 0x00F7 # DIVISION SIGN +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC # VULGAR FRACTION ONE QUARTER +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS +0xDF 0x2017 # DOUBLE LOW LINE +0xE0 0x05D0 # HEBREW LETTER ALEF +0xE1 0x05D1 # HEBREW LETTER BET +0xE2 0x05D2 # HEBREW LETTER GIMEL +0xE3 0x05D3 # HEBREW LETTER DALET +0xE4 0x05D4 # HEBREW LETTER HE +0xE5 0x05D5 # HEBREW LETTER VAV +0xE6 0x05D6 # HEBREW LETTER ZAYIN +0xE7 0x05D7 # HEBREW LETTER HET +0xE8 0x05D8 # HEBREW LETTER TET +0xE9 0x05D9 # HEBREW LETTER YOD +0xEA 0x05DA # HEBREW LETTER FINAL KAF +0xEB 0x05DB # HEBREW LETTER KAF +0xEC 0x05DC # HEBREW LETTER LAMED +0xED 0x05DD # HEBREW LETTER FINAL MEM +0xEE 0x05DE # HEBREW LETTER MEM +0xEF 0x05DF # HEBREW LETTER FINAL NUN +0xF0 0x05E0 # HEBREW LETTER NUN +0xF1 0x05E1 # HEBREW LETTER SAMEKH +0xF2 0x05E2 # HEBREW LETTER AYIN +0xF3 0x05E3 # HEBREW LETTER FINAL PE +0xF4 0x05E4 # HEBREW LETTER PE +0xF5 0x05E5 # HEBREW LETTER FINAL TSADI +0xF6 0x05E6 # HEBREW LETTER TSADI +0xF7 0x05E7 # HEBREW LETTER QOF +0xF8 0x05E8 # HEBREW LETTER RESH +0xF9 0x05E9 # HEBREW LETTER SHIN +0xFA 0x05EA # HEBREW LETTER TAV +0xFD 0x200E # LEFT-TO-RIGHT MARK +0xFE 0x200F # RIGHT-TO-LEFT MARK + diff --git a/externals/figlet/fonts/8859-9.flc b/externals/figlet/fonts/8859-9.flc new file mode 100644 index 0000000000..22901f1077 --- /dev/null +++ b/externals/figlet/fonts/8859-9.flc @@ -0,0 +1,307 @@ +# +# Name: ISO/IEC 8859-9:1999 to Unicode +# Unicode version: 3.0 +# Table version: 1.0 +# Table format: Format A +# Date: 1999 July 27 +# Authors: Ken Whistler +# +# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved. +# +# This file is provided as-is by Unicode, Inc. (The Unicode Consortium). +# No claims are made as to fitness for any particular purpose. No +# warranties of any kind are expressed or implied. The recipient +# agrees to determine applicability of information provided. If this +# file has been provided on magnetic media by Unicode, Inc., the sole +# remedy for any claim will be exchange of defective media within 90 +# days of receipt. +# +# Unicode, Inc. hereby grants the right to freely use the information +# supplied in this file in the creation of products supporting the +# Unicode Standard, and to make copies of this file in any form for +# internal or external distribution as long as this notice remains +# attached. +# +# General notes: +# +# This table contains the data the Unicode Consortium has on how +# ISO/IEC 8859-9:1999 characters map into Unicode. +# +# Format: Three tab-separated columns +# Column #1 is the ISO/IEC 8859-9 code (in hex as 0xXX) +# Column #2 is the Unicode (in hex as 0xXXXX) +# Column #3 the Unicode name (follows a comment sign, '#') +# +# The entries are in ISO/IEC 8859-9 order. +# +# ISO/IEC 8859-9 is also equivalent to ISO-IR-148. +# +# Version history +# 1.0 version updates 0.1 version by adding mappings for all +# control characters. +# +# Updated versions of this file may be found in: +# +# +# Any comments or problems, contact +# Please note that is an archival address; +# notices will be checked, but do not expect an immediate response. +# +0x00 0x0000 # NULL +0x01 0x0001 # START OF HEADING +0x02 0x0002 # START OF TEXT +0x03 0x0003 # END OF TEXT +0x04 0x0004 # END OF TRANSMISSION +0x05 0x0005 # ENQUIRY +0x06 0x0006 # ACKNOWLEDGE +0x07 0x0007 # BELL +0x08 0x0008 # BACKSPACE +0x09 0x0009 # HORIZONTAL TABULATION +0x0A 0x000A # LINE FEED +0x0B 0x000B # VERTICAL TABULATION +0x0C 0x000C # FORM FEED +0x0D 0x000D # CARRIAGE RETURN +0x0E 0x000E # SHIFT OUT +0x0F 0x000F # SHIFT IN +0x10 0x0010 # DATA LINK ESCAPE +0x11 0x0011 # DEVICE CONTROL ONE +0x12 0x0012 # DEVICE CONTROL TWO +0x13 0x0013 # DEVICE CONTROL THREE +0x14 0x0014 # DEVICE CONTROL FOUR +0x15 0x0015 # NEGATIVE ACKNOWLEDGE +0x16 0x0016 # SYNCHRONOUS IDLE +0x17 0x0017 # END OF TRANSMISSION BLOCK +0x18 0x0018 # CANCEL +0x19 0x0019 # END OF MEDIUM +0x1A 0x001A # SUBSTITUTE +0x1B 0x001B # ESCAPE +0x1C 0x001C # FILE SEPARATOR +0x1D 0x001D # GROUP SEPARATOR +0x1E 0x001E # RECORD SEPARATOR +0x1F 0x001F # UNIT SEPARATOR +0x20 0x0020 # SPACE +0x21 0x0021 # EXCLAMATION MARK +0x22 0x0022 # QUOTATION MARK +0x23 0x0023 # NUMBER SIGN +0x24 0x0024 # DOLLAR SIGN +0x25 0x0025 # PERCENT SIGN +0x26 0x0026 # AMPERSAND +0x27 0x0027 # APOSTROPHE +0x28 0x0028 # LEFT PARENTHESIS +0x29 0x0029 # RIGHT PARENTHESIS +0x2A 0x002A # ASTERISK +0x2B 0x002B # PLUS SIGN +0x2C 0x002C # COMMA +0x2D 0x002D # HYPHEN-MINUS +0x2E 0x002E # FULL STOP +0x2F 0x002F # SOLIDUS +0x30 0x0030 # DIGIT ZERO +0x31 0x0031 # DIGIT ONE +0x32 0x0032 # DIGIT TWO +0x33 0x0033 # DIGIT THREE +0x34 0x0034 # DIGIT FOUR +0x35 0x0035 # DIGIT FIVE +0x36 0x0036 # DIGIT SIX +0x37 0x0037 # DIGIT SEVEN +0x38 0x0038 # DIGIT EIGHT +0x39 0x0039 # DIGIT NINE +0x3A 0x003A # COLON +0x3B 0x003B # SEMICOLON +0x3C 0x003C # LESS-THAN SIGN +0x3D 0x003D # EQUALS SIGN +0x3E 0x003E # GREATER-THAN SIGN +0x3F 0x003F # QUESTION MARK +0x40 0x0040 # COMMERCIAL AT +0x41 0x0041 # LATIN CAPITAL LETTER A +0x42 0x0042 # LATIN CAPITAL LETTER B +0x43 0x0043 # LATIN CAPITAL LETTER C +0x44 0x0044 # LATIN CAPITAL LETTER D +0x45 0x0045 # LATIN CAPITAL LETTER E +0x46 0x0046 # LATIN CAPITAL LETTER F +0x47 0x0047 # LATIN CAPITAL LETTER G +0x48 0x0048 # LATIN CAPITAL LETTER H +0x49 0x0049 # LATIN CAPITAL LETTER I +0x4A 0x004A # LATIN CAPITAL LETTER J +0x4B 0x004B # LATIN CAPITAL LETTER K +0x4C 0x004C # LATIN CAPITAL LETTER L +0x4D 0x004D # LATIN CAPITAL LETTER M +0x4E 0x004E # LATIN CAPITAL LETTER N +0x4F 0x004F # LATIN CAPITAL LETTER O +0x50 0x0050 # LATIN CAPITAL LETTER P +0x51 0x0051 # LATIN CAPITAL LETTER Q +0x52 0x0052 # LATIN CAPITAL LETTER R +0x53 0x0053 # LATIN CAPITAL LETTER S +0x54 0x0054 # LATIN CAPITAL LETTER T +0x55 0x0055 # LATIN CAPITAL LETTER U +0x56 0x0056 # LATIN CAPITAL LETTER V +0x57 0x0057 # LATIN CAPITAL LETTER W +0x58 0x0058 # LATIN CAPITAL LETTER X +0x59 0x0059 # LATIN CAPITAL LETTER Y +0x5A 0x005A # LATIN CAPITAL LETTER Z +0x5B 0x005B # LEFT SQUARE BRACKET +0x5C 0x005C # REVERSE SOLIDUS +0x5D 0x005D # RIGHT SQUARE BRACKET +0x5E 0x005E # CIRCUMFLEX ACCENT +0x5F 0x005F # LOW LINE +0x60 0x0060 # GRAVE ACCENT +0x61 0x0061 # LATIN SMALL LETTER A +0x62 0x0062 # LATIN SMALL LETTER B +0x63 0x0063 # LATIN SMALL LETTER C +0x64 0x0064 # LATIN SMALL LETTER D +0x65 0x0065 # LATIN SMALL LETTER E +0x66 0x0066 # LATIN SMALL LETTER F +0x67 0x0067 # LATIN SMALL LETTER G +0x68 0x0068 # LATIN SMALL LETTER H +0x69 0x0069 # LATIN SMALL LETTER I +0x6A 0x006A # LATIN SMALL LETTER J +0x6B 0x006B # LATIN SMALL LETTER K +0x6C 0x006C # LATIN SMALL LETTER L +0x6D 0x006D # LATIN SMALL LETTER M +0x6E 0x006E # LATIN SMALL LETTER N +0x6F 0x006F # LATIN SMALL LETTER O +0x70 0x0070 # LATIN SMALL LETTER P +0x71 0x0071 # LATIN SMALL LETTER Q +0x72 0x0072 # LATIN SMALL LETTER R +0x73 0x0073 # LATIN SMALL LETTER S +0x74 0x0074 # LATIN SMALL LETTER T +0x75 0x0075 # LATIN SMALL LETTER U +0x76 0x0076 # LATIN SMALL LETTER V +0x77 0x0077 # LATIN SMALL LETTER W +0x78 0x0078 # LATIN SMALL LETTER X +0x79 0x0079 # LATIN SMALL LETTER Y +0x7A 0x007A # LATIN SMALL LETTER Z +0x7B 0x007B # LEFT CURLY BRACKET +0x7C 0x007C # VERTICAL LINE +0x7D 0x007D # RIGHT CURLY BRACKET +0x7E 0x007E # TILDE +0x7F 0x007F # DELETE +0x80 0x0080 # +0x81 0x0081 # +0x82 0x0082 # +0x83 0x0083 # +0x84 0x0084 # +0x85 0x0085 # +0x86 0x0086 # +0x87 0x0087 # +0x88 0x0088 # +0x89 0x0089 # +0x8A 0x008A # +0x8B 0x008B # +0x8C 0x008C # +0x8D 0x008D # +0x8E 0x008E # +0x8F 0x008F # +0x90 0x0090 # +0x91 0x0091 # +0x92 0x0092 # +0x93 0x0093 # +0x94 0x0094 # +0x95 0x0095 # +0x96 0x0096 # +0x97 0x0097 # +0x98 0x0098 # +0x99 0x0099 # +0x9A 0x009A # +0x9B 0x009B # +0x9C 0x009C # +0x9D 0x009D # +0x9E 0x009E # +0x9F 0x009F # +0xA0 0x00A0 # NO-BREAK SPACE +0xA1 0x00A1 # INVERTED EXCLAMATION MARK +0xA2 0x00A2 # CENT SIGN +0xA3 0x00A3 # POUND SIGN +0xA4 0x00A4 # CURRENCY SIGN +0xA5 0x00A5 # YEN SIGN +0xA6 0x00A6 # BROKEN BAR +0xA7 0x00A7 # SECTION SIGN +0xA8 0x00A8 # DIAERESIS +0xA9 0x00A9 # COPYRIGHT SIGN +0xAA 0x00AA # FEMININE ORDINAL INDICATOR +0xAB 0x00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +0xAC 0x00AC # NOT SIGN +0xAD 0x00AD # SOFT HYPHEN +0xAE 0x00AE # REGISTERED SIGN +0xAF 0x00AF # MACRON +0xB0 0x00B0 # DEGREE SIGN +0xB1 0x00B1 # PLUS-MINUS SIGN +0xB2 0x00B2 # SUPERSCRIPT TWO +0xB3 0x00B3 # SUPERSCRIPT THREE +0xB4 0x00B4 # ACUTE ACCENT +0xB5 0x00B5 # MICRO SIGN +0xB6 0x00B6 # PILCROW SIGN +0xB7 0x00B7 # MIDDLE DOT +0xB8 0x00B8 # CEDILLA +0xB9 0x00B9 # SUPERSCRIPT ONE +0xBA 0x00BA # MASCULINE ORDINAL INDICATOR +0xBB 0x00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +0xBC 0x00BC # VULGAR FRACTION ONE QUARTER +0xBD 0x00BD # VULGAR FRACTION ONE HALF +0xBE 0x00BE # VULGAR FRACTION THREE QUARTERS +0xBF 0x00BF # INVERTED QUESTION MARK +0xC0 0x00C0 # LATIN CAPITAL LETTER A WITH GRAVE +0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE +0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +0xC3 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE +0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +0xC5 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +0xC6 0x00C6 # LATIN CAPITAL LETTER AE +0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +0xC8 0x00C8 # LATIN CAPITAL LETTER E WITH GRAVE +0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE +0xCA 0x00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +0xCC 0x00CC # LATIN CAPITAL LETTER I WITH GRAVE +0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE +0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +0xCF 0x00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +0xD0 0x011E # LATIN CAPITAL LETTER G WITH BREVE +0xD1 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE +0xD2 0x00D2 # LATIN CAPITAL LETTER O WITH GRAVE +0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE +0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +0xD5 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE +0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +0xD7 0x00D7 # MULTIPLICATION SIGN +0xD8 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE +0xD9 0x00D9 # LATIN CAPITAL LETTER U WITH GRAVE +0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE +0xDB 0x00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +0xDD 0x0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE +0xDE 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA +0xDF 0x00DF # LATIN SMALL LETTER SHARP S +0xE0 0x00E0 # LATIN SMALL LETTER A WITH GRAVE +0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE +0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +0xE3 0x00E3 # LATIN SMALL LETTER A WITH TILDE +0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS +0xE5 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE +0xE6 0x00E6 # LATIN SMALL LETTER AE +0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA +0xE8 0x00E8 # LATIN SMALL LETTER E WITH GRAVE +0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE +0xEA 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS +0xEC 0x00EC # LATIN SMALL LETTER I WITH GRAVE +0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE +0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +0xEF 0x00EF # LATIN SMALL LETTER I WITH DIAERESIS +0xF0 0x011F # LATIN SMALL LETTER G WITH BREVE +0xF1 0x00F1 # LATIN SMALL LETTER N WITH TILDE +0xF2 0x00F2 # LATIN SMALL LETTER O WITH GRAVE +0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE +0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0xF5 0x00F5 # LATIN SMALL LETTER O WITH TILDE +0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS +0xF7 0x00F7 # DIVISION SIGN +0xF8 0x00F8 # LATIN SMALL LETTER O WITH STROKE +0xF9 0x00F9 # LATIN SMALL LETTER U WITH GRAVE +0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE +0xFB 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS +0xFD 0x0131 # LATIN SMALL LETTER DOTLESS I +0xFE 0x015F # LATIN SMALL LETTER S WITH CEDILLA +0xFF 0x00FF # LATIN SMALL LETTER Y WITH DIAERESIS + + diff --git a/externals/figlet/fonts/banner.flf b/externals/figlet/fonts/banner.flf new file mode 100644 index 0000000000..8fc3489f20 --- /dev/null +++ b/externals/figlet/fonts/banner.flf @@ -0,0 +1,2494 @@ +flf2a$ 8 7 54 0 12 0 64 185 +banner.flf version 2 by Ryan Youck (youck@cs.uregina.ca) +(From a unix program called banner) +I am not responsible for use of this font +Thanks to Glenn Chappell for his help +Katakana characters by Vinney Thai +Cyrillic characters from "koi8x8" BDF font. +Date: August 11, 1994 + +Merged by John Cowan +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + $ $@ + $ $@ + $ $@ + $ $@ + $ $@ + $ $@ + $ $@ + $ $@@ + ###$@ + ###$@ + ###$@ + # $@ + $@ + ###$@ + ###$@ + $@@ + ### ###$@ + ### ###$@ + # # $@ + $ $@ + $ $@ + $@ + $@ + $@@ + # # $@ + # # $@ + #######$@ + # # $@ + #######$@ + # # $@ + # # $@ + $@@ + ##### $@ + # # #$@ + # # $@ + ##### $@ + # #$@ + # # #$@ + ##### $@ + $@@ + ### #$@ + # # # $@ + ### # $@ + # $@ + # ###$@ + # # #$@ + # ###$@ + $@@ + ## $@ + # # $@ + ## $@ + ### $@ + # # #$@ + # # $@ + ### #$@ + $@@ + ###$@ + ###$@ + # $@ + # $@ + $@ + $@ + $@ + $@@ + ##$@ + # $@ + # $@ + # $@ + # $@ + # $@ + ##$@ + $@@ + ## $@ + # $@ + #$@ + #$@ + #$@ + # $@ + ## $@ + $@@ + $@ + # # $@ + # # $@ + #######$@ + # # $@ + # # $@ + $@ + $@@ + $@ + # $@ + # $@ + #####$@ + # $@ + # $@ + $@ + $@@ + $@ + $@ + $@ + $@ + ###$@ + ###$@ + # $@ + # $@@ + $@ + $@ + $@ + #####$@ + $@ + $@ + $@ + $@@ + $@ + $@ + $@ + $@ + ###$@ + ###$@ + ###$@ + $@@ + #$@ + # $@ + # $@ + # $@ + # $@ + # $@ + # $@ + $@@ + ### $@ + # # $@ + # #$@ + # #$@ + # #$@ + # # $@ + ### $@ + $@@ + # $@ + ## $@ + # # $@ + # $@ + # $@ + # $@ + #####$@ + $@@ + ##### $@ + # #$@ + #$@ + ##### $@ + # $@ + # $@ + #######$@ + $@@ + ##### $@ + # #$@ + #$@ + ##### $@ + #$@ + # #$@ + ##### $@ + $@@ + # $@ + # # $@ + # # $@ + # # $@ + #######$@ + # $@ + # $@ + $@@ + #######$@ + # $@ + # $@ + ###### $@ + #$@ + # #$@ + ##### $@ + $@@ + ##### $@ + # #$@ + # $@ + ###### $@ + # #$@ + # #$@ + ##### $@ + $@@ + #######$@ + # # $@ + # $@ + # $@ + # $@ + # $@ + # $@ + $@@ + ##### $@ + # #$@ + # #$@ + ##### $@ + # #$@ + # #$@ + ##### $@ + $@@ + ##### $@ + # #$@ + # #$@ + ######$@ + #$@ + # #$@ + ##### $@ + $@@ + # $@ + ###$@ + # $@ + $@ + # $@ + ###$@ + # $@ + $@@ + $@ + ###$@ + ###$@ + $@ + ###$@ + ###$@ + # $@ + # $@@ + #$@ + # $@ + # $@ + # $@ + # $@ + # $@ + #$@ + $@@ + $@ + $@ + #####$@ + $@ + #####$@ + $@ + $@ + $@@ + # $@ + # $@ + # $@ + #$@ + # $@ + # $@ + # $@ + $@@ + ##### $@ + # #$@ + #$@ + ### $@ + # $@ + $@ + # $@ + $@@ + ##### $@ + # #$@ + # ### #$@ + # ### #$@ + # #### $@ + # $@ + ##### $@ + $@@ + # $@ + # # $@ + # # $@ + # #$@ + #######$@ + # #$@ + # #$@ + $@@ + ###### $@ + # #$@ + # #$@ + ###### $@ + # #$@ + # #$@ + ###### $@ + $@@ + ##### $@ + # #$@ + # $@ + # $@ + # $@ + # #$@ + ##### $@ + $@@ + ###### $@ + # #$@ + # #$@ + # #$@ + # #$@ + # #$@ + ###### $@ + $@@ + #######$@ + # $@ + # $@ + ##### $@ + # $@ + # $@ + #######$@ + $@@ + #######$@ + # $@ + # $@ + ##### $@ + # $@ + # $@ + # $@ + $@@ + ##### $@ + # #$@ + # $@ + # ####$@ + # #$@ + # #$@ + ##### $@ + $@@ + # #$@ + # #$@ + # #$@ + #######$@ + # #$@ + # #$@ + # #$@ + $@@ + ###$@ + # $@ + # $@ + # $@ + # $@ + # $@ + ###$@ + $@@ + #$@ + #$@ + #$@ + #$@ + # #$@ + # #$@ + ##### $@ + $@@ + # #$@ + # # $@ + # # $@ + ### $@ + # # $@ + # # $@ + # #$@ + $@@ + # $@ + # $@ + # $@ + # $@ + # $@ + # $@ + #######$@ + $@@ + # #$@ + ## ##$@ + # # # #$@ + # # #$@ + # #$@ + # #$@ + # #$@ + $@@ + # #$@ + ## #$@ + # # #$@ + # # #$@ + # # #$@ + # ##$@ + # #$@ + $@@ + #######$@ + # #$@ + # #$@ + # #$@ + # #$@ + # #$@ + #######$@ + $@@ + ###### $@ + # #$@ + # #$@ + ###### $@ + # $@ + # $@ + # $@ + $@@ + ##### $@ + # #$@ + # #$@ + # #$@ + # # #$@ + # # $@ + #### #$@ + $@@ + ###### $@ + # #$@ + # #$@ + ###### $@ + # # $@ + # # $@ + # #$@ + $@@ + ##### $@ + # #$@ + # $@ + ##### $@ + #$@ + # #$@ + ##### $@ + $@@ + #######$@ + # $@ + # $@ + # $@ + # $@ + # $@ + # $@ + $@@ + # #$@ + # #$@ + # #$@ + # #$@ + # #$@ + # #$@ + ##### $@ + $@@ + # #$@ + # #$@ + # #$@ + # #$@ + # # $@ + # # $@ + # $@ + $@@ + # #$@ + # # #$@ + # # #$@ + # # #$@ + # # #$@ + # # #$@ + ## ## $@ + $@@ + # #$@ + # # $@ + # # $@ + # $@ + # # $@ + # # $@ + # #$@ + $@@ + # #$@ + # # $@ + # # $@ + # $@ + # $@ + # $@ + # $@ + $@@ + #######$@ + # $@ + # $@ + # $@ + # $@ + # $@ + #######$@ + $@@ + #####$@ + # $@ + # $@ + # $@ + # $@ + # $@ + #####$@ + $@@ + # $@ + # $@ + # $@ + # $@ + # $@ + # $@ + #$@ + $@@ + #####$@ + #$@ + #$@ + #$@ + #$@ + #$@ + #####$@ + $@@ + # $@ + # # $@ + # #$@ + $@ + $@ + $@ + $@ + $@@ + $@ + $@ + $@ + $@ + $@ + $@ + $@ + #######$@@ + ###$@ + ###$@ + # $@ + #$@ + $@ + $@ + $@ + $@@ + $@ + ## $@ + # # $@ + # #$@ + ######$@ + # #$@ + # #$@ + $@@ + $@ + ##### $@ + # #$@ + ##### $@ + # #$@ + # #$@ + ##### $@ + $@@ + $@ + #### $@ + # #$@ + # $@ + # $@ + # #$@ + #### $@ + $@@ + $@ + ##### $@ + # #$@ + # #$@ + # #$@ + # #$@ + ##### $@ + $@@ + $@ + ######$@ + # $@ + ##### $@ + # $@ + # $@ + ######$@ + $@@ + $@ + ######$@ + # $@ + ##### $@ + # $@ + # $@ + # $@ + $@@ + $@ + #### $@ + # #$@ + # $@ + # ###$@ + # #$@ + #### $@ + $@@ + $@ + # #$@ + # #$@ + ######$@ + # #$@ + # #$@ + # #$@ + $@@ + $@ + #$@ + #$@ + #$@ + #$@ + #$@ + #$@ + $@@ + $@ + #$@ + #$@ + #$@ + #$@ + # #$@ + #### $@ + $@@ + $@ + # #$@ + # # $@ + #### $@ + # # $@ + # # $@ + # #$@ + $@@ + $@ + # $@ + # $@ + # $@ + # $@ + # $@ + ######$@ + $@@ + $@ + # #$@ + ## ##$@ + # ## #$@ + # #$@ + # #$@ + # #$@ + $@@ + $@ + # #$@ + ## #$@ + # # #$@ + # # #$@ + # ##$@ + # #$@ + $@@ + $@ + #### $@ + # #$@ + # #$@ + # #$@ + # #$@ + #### $@ + $@@ + $@ + ##### $@ + # #$@ + # #$@ + ##### $@ + # $@ + # $@ + $@@ + $@ + #### $@ + # #$@ + # #$@ + # # #$@ + # # $@ + ### #$@ + $@@ + $@ + ##### $@ + # #$@ + # #$@ + ##### $@ + # # $@ + # #$@ + $@@ + $@ + #### $@ + # $@ + #### $@ + #$@ + # #$@ + #### $@ + $@@ + $@ + #####$@ + # $@ + # $@ + # $@ + # $@ + # $@ + $@@ + $@ + # #$@ + # #$@ + # #$@ + # #$@ + # #$@ + #### $@ + $@@ + $@ + # #$@ + # #$@ + # #$@ + # #$@ + # # $@ + ## $@ + $@@ + $@ + # #$@ + # #$@ + # #$@ + # ## #$@ + ## ##$@ + # #$@ + $@@ + $@ + # #$@ + # # $@ + ## $@ + ## $@ + # # $@ + # #$@ + $@@ + $@ + # #$@ + # # $@ + # $@ + # $@ + # $@ + # $@ + $@@ + $@ + ######$@ + # $@ + # $@ + # $@ + # $@ + ######$@ + $@@ + ###$@ + # $@ + # $@ + ## $@ + # $@ + # $@ + ###$@ + $@@ + #$@ + #$@ + #$@ + $@ + #$@ + #$@ + #$@ + $@@ + ### $@ + # $@ + # $@ + ##$@ + # $@ + # $@ + ### $@ + $@@ + ## $@ + # # #$@ + ## $@ + $@ + $@ + $@ + $@ + $@@ + # # #$@ + # # $@ + # # $@ + # #$@ + #######$@ + # #$@ + # #$@ + $@@ + # #$@ + ##### $@ + # #$@ + # #$@ + # #$@ + # #$@ + ##### $@ + $@@ + # #$@ + $@ + # #$@ + # #$@ + # #$@ + # #$@ + ##### $@ + $@@ + $@ + # #$@ + #### $@ + # #$@ + ######$@ + # #$@ + # #$@ + $@@ + $@ + # #$@ + #### $@ + # #$@ + # #$@ + # #$@ + #### $@ + $@@ + $@ + # #$@ + $@ + # #$@ + # #$@ + # #$@ + #### $@ + $@@ + ###### $@ + # #$@ + # #$@ + ###### $@ + # #$@ + # #$@ + ###### $@ + # $@@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + ########$@ + ## $@ + ## $@ + ## $@@ +169 COPYRIGHT SIGN + $@ + $@ + $@ + $@ + $@ + $@ + $@ + $@@ +176 DEGREE SIGN + $@ + $@ + $@ + $@ + ########$@ + $@ + $@ + $@@ +178 SUPERSCRIPT TWO + ## $@ + ## $@ + ## $@ + ## $@ + ########$@ + ## $@ + ## $@ + ## $@@ +183 MIDDLE DOT + ## $@ + ## $@ + #####$@ + ## $@ + #####$@ + ## $@ + ## $@ + ## $@@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + # # #$@ + # # $@ + # # $@ + # #$@ + #######$@ + # #$@ + # #$@ + $@@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + # #$@ + ##### $@ + # #$@ + # #$@ + # #$@ + # #$@ + ##### $@ + $@@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + # #$@ + $@ + # #$@ + # #$@ + # #$@ + # #$@ + ##### $@ + $@@ +223 LATIN SMALL LETTER SHARP S + ###### $@ + # #$@ + # #$@ + ###### $@ + # #$@ + # #$@ + ###### $@ + # $@@ +228 LATIN SMALL LETTER A WITH DIAERESIS + $@ + # #$@ + #### $@ + # #$@ + ######$@ + # #$@ + # #$@ + $@@ +246 LATIN SMALL LETTER O WITH DIAERESIS + $@ + # #$@ + #### $@ + # #$@ + # #$@ + # #$@ + #### $@ + $@@ +247 DIVISION SIGN + #### $@ + #### $@ + #### $@ + #### $@ + #####$@ + #### $@ + #### $@ + #### $@@ +252 LATIN SMALL LETTER U WITH DIAERESIS + $@ + # #$@ + $@ + # #$@ + # #$@ + # #$@ + #### $@ + $@@ +0x0401 CYRILLIC CAPITAL LETTER IO + ########$@ + ########$@ + ########$@ + ########$@ + ########$@ + ########$@ + ########$@ + ########$@@ +0x0410 CYRILLIC CAPITAL LETTER A + ####$@ + ## ##$@ + ## ##$@ + ## ##$@ + #######$@ + ## ##$@ + ## ##$@ + $@@ +0x0411 CYRILLIC CAPITAL LETTER BE + #######$@ + ## $@ + ## $@ + ###### $@ + ## ##$@ + ## ##$@ + ###### $@ + $@@ +0x0412 CYRILLIC CAPITAL LETTER VE + ###### $@ + ## ##$@ + ## ##$@ + ###### $@ + ## ##$@ + ## ##$@ + ###### $@ + $@@ +0x0413 CYRILLIC CAPITAL LETTER GHE + #######$@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x0414 CYRILLIC CAPITAL LETTER DE + #### $@ + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + #######$@ + ## ##$@ + $@@ +0x0415 CYRILLIC CAPITAL LETTER IE + #######$@ + ## $@ + ## $@ + ###### $@ + ## $@ + ## $@ + #######$@ + $@@ +0x0416 CYRILLIC CAPITAL LETTER ZHE + ## # ##$@ + # # # $@ + ### $@ + ### $@ + # # # $@ + # # # $@ + ## # ##$@ + $@@ +0x0417 CYRILLIC CAPITAL LETTER ZE + ##### $@ + ## ##$@ + ##$@ + ## $@ + ##$@ + ## ##$@ + ##### $@ + $@@ +0x0418 CYRILLIC CAPITAL LETTER I + ## ##$@ + ## ###$@ + ## ###$@ + ## # ##$@ + ### ##$@ + ## ##$@ + ## ##$@ + $@@ +0x0419 CYRILLIC CAPITAL LETTER SHORT I + ## ## #$@ + ## ##$@ + ## ###$@ + ## # ##$@ + ### ##$@ + ## ##$@ + ## ##$@ + $@@ +0x041A CYRILLIC CAPITAL LETTER KA + ## ##$@ + ## ## $@ + ## ## $@ + ##### $@ + ## ## $@ + ## ##$@ + ## ##$@ + $@@ +0x041B CYRILLIC CAPITAL LETTER EL + #####$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x041C CYRILLIC CAPITAL LETTER EM + ## ##$@ + ## ##$@ + ### ###$@ + ## # ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x041D CYRILLIC CAPITAL LETTER EN + ## ##$@ + ## ##$@ + ## ##$@ + #######$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x041E CYRILLIC CAPITAL LETTER O + ##### $@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + ##### $@ + $@@ +0x041F CYRILLIC CAPITAL LETTER PE + #######$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x0420 CYRILLIC CAPITAL LETTER ER + ###### $@ + ## ##$@ + ## ##$@ + ###### $@ + ## $@ + ## $@ + ## $@ + $@@ +0x0421 CYRILLIC CAPITAL LETTER ES + ##### $@ + ## ##$@ + ## $@ + ## $@ + ## $@ + ## ##$@ + ##### $@ + $@@ +0x0422 CYRILLIC CAPITAL LETTER TE + ###### $@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x0423 CYRILLIC CAPITAL LETTER U + ## ##$@ + ## ##$@ + ## ##$@ + ######$@ + ##$@ + ## ##$@ + ##### $@ + $@@ +0x0424 CYRILLIC CAPITAL LETTER EF + # $@ + ##### $@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ##### $@ + # $@ + $@@ +0x0425 CYRILLIC CAPITAL LETTER HA + ## ##$@ + ## ## $@ + ### $@ + ### $@ + ### $@ + ## ## $@ + ## ##$@ + $@@ +0x0426 CYRILLIC CAPITAL LETTER TSE + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + #######$@ + #$@@ +0x0427 CYRILLIC CAPITAL LETTER CHE + ## ##$@ + ## ##$@ + ## ##$@ + ######$@ + ##$@ + ##$@ + ##$@ + $@@ +0x0428 CYRILLIC CAPITAL LETTER SHA + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + #######$@ + $@@ +0x0429 CYRILLIC CAPITAL LETTER SHCHA + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + #######$@ + #$@@ +0x042A CYRILLIC CAPITAL LETTER HARD SIGN + ### $@ + ### $@ + ## $@ + ##### $@ + ## ##$@ + ## ##$@ + ##### $@ + $@@ +0x042B CYRILLIC CAPITAL LETTER YERU + ## ##$@ + ## ##$@ + ## ##$@ + #### #$@ + ## # #$@ + ## # #$@ + #### #$@ + $@@ +0x042C CYRILLIC CAPITAL LETTER SOFT SIGN + ## $@ + ## $@ + ## $@ + ###### $@ + ## ##$@ + ## ##$@ + ###### $@ + $@@ +0x042D CYRILLIC CAPITAL LETTER E + ##### $@ + ## ##$@ + ##$@ + #####$@ + ##$@ + ## ##$@ + ##### $@ + $@@ +0x042E CYRILLIC CAPITAL LETTER YU + ## ## $@ + ## # ##$@ + ## # ##$@ + #### ##$@ + ## # ##$@ + ## # ##$@ + ## ## $@ + $@@ +0x042F CYRILLIC CAPITAL LETTER YA + #####$@ + ## ##$@ + ## ##$@ + #####$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x0430 CYRILLIC SMALL LETTER A + $@ + $@ + #### $@ + ## $@ + ##### $@ + ## ## $@ + ######$@ + $@@ +0x0431 CYRILLIC SMALL LETTER BE + $@ + ## $@ + #### $@ + ## $@ + ###### $@ + ## ##$@ + ##### $@ + $@@ +0x0432 CYRILLIC SMALL LETTER VE + $@ + $@ + ##### $@ + ## ## $@ + ###### $@ + ## ##$@ + ###### $@ + $@@ +0x0433 CYRILLIC SMALL LETTER GHE + $@ + $@ + ##### $@ + ##$@ + ##### $@ + ## $@ + ######$@ + $@@ +0x0434 CYRILLIC SMALL LETTER DE + $@ + #### $@ + ##$@ + #####$@ + ## ##$@ + ## ##$@ + ##### $@ + $@@ +0x0435 CYRILLIC SMALL LETTER IE + $@ + $@ + ##### $@ + ## ##$@ + ###### $@ + ## $@ + ##### $@ + $@@ +0x0436 CYRILLIC SMALL LETTER ZHE + $@ + $@ + ## # ##$@ + # # # $@ + ### $@ + # # # $@ + ## # ##$@ + $@@ +0x0437 CYRILLIC SMALL LETTER ZE + $@ + $@ + ##### $@ + ## ##$@ + ### $@ + ## ##$@ + ##### $@ + $@@ +0x0438 CYRILLIC SMALL LETTER I + $@ + $@ + ## ##$@ + ## ###$@ + ## # ##$@ + ### ##$@ + ## ##$@ + $@@ +0x0439 CYRILLIC SMALL LETTER SHORT I + $@ + ## $@ + ## ##$@ + ## ###$@ + ## # ##$@ + ### ##$@ + ## ##$@ + $@@ +0x043A CYRILLIC SMALL LETTER KA + $@ + $@ + ## ##$@ + ## ## $@ + ##### $@ + ## ## $@ + ## ##$@ + $@@ +0x043B CYRILLIC SMALL LETTER EL + $@ + $@ + #####$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x043C CYRILLIC SMALL LETTER EM + $@ + $@ + ## ##$@ + ### ###$@ + ## # ##$@ + ## ##$@ + ## ##$@ + $@@ +0x043D CYRILLIC SMALL LETTER EN + $@ + $@ + ## ##$@ + ## ##$@ + #######$@ + ## ##$@ + ## ##$@ + $@@ +0x043E CYRILLIC SMALL LETTER O + $@ + $@ + ##### $@ + ## ##$@ + ## ##$@ + ## ##$@ + ##### $@ + $@@ +0x043F CYRILLIC SMALL LETTER PE + $@ + $@ + ###### $@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x0440 CYRILLIC SMALL LETTER ER + $@ + $@ + ###### $@ + ## ##$@ + ###### $@ + ## $@ + ## $@ + $@@ +0x0441 CYRILLIC SMALL LETTER ES + $@ + $@ + ##### $@ + ## $@ + ## $@ + ## $@ + ##### $@ + $@@ +0x0442 CYRILLIC SMALL LETTER TE + $@ + $@ + ###### $@ + ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x0443 CYRILLIC SMALL LETTER U + $@ + $@ + ## ##$@ + ## ##$@ + ## ##$@ + ######$@ + ##$@ + ##### $@@ +0x0444 CYRILLIC SMALL LETTER EF + $@ + # $@ + ##### $@ + ## # ##$@ + ## # ##$@ + ##### $@ + # $@ + $@@ +0x0445 CYRILLIC SMALL LETTER HA + $@ + $@ + ## ##$@ + ## ## $@ + ### $@ + ## ## $@ + ## ##$@ + $@@ +0x0446 CYRILLIC SMALL LETTER TSE + $@ + $@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ## $@ + ### ##$@ + #$@@ +0x0447 CYRILLIC SMALL LETTER CHE + $@ + $@ + ## ##$@ + ## ##$@ + ######$@ + ##$@ + ##$@ + $@@ +0x0448 CYRILLIC SMALL LETTER SHA + $@ + $@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + #######$@ + $@@ +0x0449 CYRILLIC SMALL LETTER SHCHA + $@ + $@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + #######$@ + #$@@ +0x044A CYRILLIC SMALL LETTER HARD SIGN + $@ + $@ + ### $@ + ## $@ + ##### $@ + ## ##$@ + ##### $@ + $@@ +0x044B CYRILLIC SMALL LETTER YERU + $@ + $@ + ## ##$@ + ## ##$@ + #### #$@ + ## # #$@ + #### #$@ + $@@ +0x044C CYRILLIC SMALL LETTER SOFT SIGN + $@ + $@ + ## $@ + ## $@ + ###### $@ + ## ##$@ + ###### $@ + $@@ +0x044D CYRILLIC SMALL LETTER E + $@ + $@ + ###### $@ + ##$@ + #####$@ + ##$@ + ###### $@ + $@@ +0x044E CYRILLIC SMALL LETTER YU + $@ + $@ + # ### $@ + # ## ##$@ + #### ##$@ + # ## ##$@ + # ### $@ + $@@ +0x044F CYRILLIC SMALL LETTER YA + $@ + $@ + #####$@ + ## ##$@ + #####$@ + ## ##$@ + ## ##$@ + $@@ +0x0451 CYRILLIC SMALL LETTER IO + $@ + $@ + ########$@ + $@ + #### ###$@ + ## ## $@ + ## ## $@ + ## ## $@@ +0x2219 BULLET OPERATOR + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + #######$@ + $@ + $@ + $@@ +0x221A SQUARE ROOT + ## $@ + ## $@ + ##### $@ + ## $@ + ##### $@ + $@ + $@ + $@@ +0x2248 ALMOST EQUAL TO + $@ + $@ + $@ + $@ + ##### $@ + ## $@ + ## $@ + ## $@@ +0x2264 LESS-THAN OR EQUAL TO + ## $@ + ## $@ + ## $@ + ## $@ + #####$@ + $@ + $@ + $@@ +0x2265 GREATER-THAN OR EQUAL TO + ## $@ + ## $@ + ## $@ + ## $@ + ########$@ + $@ + $@ + $@@ +0x2320 TOP HALF INTEGRAL + $@ + $@ + #######$@ + ##$@ + #### ##$@ + ## ##$@ + ## ##$@ + ## ##$@@ +0x2321 BOTTOM HALF INTEGRAL + ## $@ + ## $@ + ## $@ + ## $@ + #####$@ + ## $@ + ## $@ + ## $@@ +0x2500 BOX DRAWINGS LIGHT HORIZONTAL + ## $@ + $@ + ## $@ + ## $@ + ## $@ + ## ##$@ + #### $@ + $@@ +0x2502 BOX DRAWINGS LIGHT VERTICAL + $@ + $@ + $@ + ######$@ + ## $@ + ## $@ + $@ + $@@ +0x250C BOX DRAWINGS LIGHT DOWN AND RIGHT + $@ + $@ + $@ + ######$@ + ##$@ + ##$@ + $@ + $@@ +0x2510 BOX DRAWINGS LIGHT DOWN AND LEFT + ## ##$@ + ## ## $@ + ## ## $@ + ## #### $@ + ## ##$@ + ## ## $@ + ## ## $@ + ####$@@ +0x2514 BOX DRAWINGS LIGHT UP AND RIGHT + ## ##$@ + ## ## $@ + ## ## $@ + ## ## ##$@ + ## ###$@ + ## ####$@ + ## ####$@ + ##$@@ +0x2518 BOX DRAWINGS LIGHT UP AND LEFT + ## $@ + ## $@ + $@ + ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT + $@ + ## ##$@ + ## ## $@ + ## ## $@ + ## ## $@ + ## ##$@ + $@ + $@@ +0x2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT + $@ + ## ## $@ + ## ## $@ + ## ##$@ + ## ## $@ + ## ## $@ + $@ + $@@ +0x252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + # #$@ + # # $@ + # #$@ + # # $@ + # #$@ + # # $@ + # #$@ + # # $@@ +0x2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL + # # # #$@ + # # # # $@ + # # # #$@ + # # # # $@ + # # # #$@ + # # # # $@ + # # # #$@ + # # # # $@@ +0x253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + ## ## ##$@ + ### ###$@ + ## ## ##$@ + ### ### $@ + ## ## ##$@ + ### ###$@ + ## ## ##$@ + ### ### $@@ +0x2550 BOX DRAWINGS DOUBLE HORIZONTAL + ## ## $@ + ## ## $@ + ## ###$@ + ## $@ + ######$@ + $@ + $@ + $@@ +0x2551 BOX DRAWINGS DOUBLE VERTICAL + $@ + $@ + ######$@ + ## $@ + ## ###$@ + ## ## $@ + ## ## $@ + ## ## $@@ +0x2552 BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + ## ## $@ + ## ## $@ + #### ###$@ + $@ + ########$@ + $@ + $@ + $@@ +0x2553 BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + #### $@ + #### $@ + #####$@ + ## $@ + #####$@ + #### $@ + #### $@ + #### $@@ +0x2554 BOX DRAWINGS DOUBLE DOWN AND RIGHT + $@ + $@ + ########$@ + $@ + ########$@ + $@ + $@ + $@@ +0x2555 BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + #### $@ + #### $@ + #######$@ + $@ + #######$@ + #### $@ + #### $@ + #### $@@ +0x2556 BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + ## $@ + ## $@ + ########$@ + $@ + ########$@ + $@ + $@ + $@@ +0x2557 BOX DRAWINGS DOUBLE DOWN AND LEFT + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + ########$@ + $@ + $@ + $@@ +0x2558 BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + $@ + $@ + ########$@ + $@ + ########$@ + ## $@ + ## $@ + ## $@@ +0x2559 BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + $@ + $@ + $@ + $@ + ########$@ + ## ## $@ + ## ## $@ + ## ## $@@ +0x255A BOX DRAWINGS DOUBLE UP AND RIGHT + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + ######$@ + $@ + $@ + $@@ +0x255B BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + ## $@ + ## $@ + #####$@ + ## $@ + #####$@ + $@ + $@ + $@@ +0x255C BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + $@ + $@ + #####$@ + ## $@ + #####$@ + ## $@ + ## $@ + ## $@@ +0x255D BOX DRAWINGS DOUBLE UP AND LEFT + $@ + $@ + $@ + $@ + ######$@ + ## ## $@ + ## ## $@ + ## ## $@@ +0x255E BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + ########$@ + ## ## $@ + ## ## $@ + ## ## $@@ +0x255F BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + ## $@ + ## $@ + ########$@ + ## $@ + ########$@ + ## $@ + ## $@ + ## $@@ +0x2560 BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + ## $@ + ## $@ + ## $@ + ## $@ + ##### $@ + $@ + $@ + $@@ +0x2561 BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + $@ + $@ + $@ + $@ + #####$@ + ## $@ + ## $@ + ## $@@ +0x2562 BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + $@ + $@ + $@ + $@ + ########$@ + ########$@ + ########$@ + ########$@@ +0x2563 BOX DRAWINGS DOUBLE VERTICAL AND LEFT + #### $@ + #### $@ + #### $@ + #### $@ + #### $@ + #### $@ + #### $@ + #### $@@ +0x2564 BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + ####$@ + ####$@ + ####$@ + ####$@ + ####$@ + ####$@ + ####$@ + ####$@@ +0x2565 BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + ########$@ + ########$@ + ########$@ + ########$@ + $@ + $@ + $@ + $@@ +0x2566 BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + ### $@ + ## ## $@ + ## ## $@ + ### $@ + $@ + $@ + $@ + $@@ +0x2567 BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + $@ + $@ + $@ + ## $@ + ## $@ + $@ + $@ + $@@ +0x2568 BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + $@ + $@ + $@ + $@ + ## $@ + $@ + $@ + $@@ +0x2569 BOX DRAWINGS DOUBLE UP AND HORIZONTAL + ####$@ + ## $@ + ## $@ + ## $@ + ### ## $@ + ## ## $@ + #### $@ + ### $@@ +0x256A BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + #### $@ + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + $@ + $@ + $@@ +0x256B BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + ### $@ + ## $@ + ## $@ + ## $@ + #### $@ + $@ + $@ + $@@ +0x256C BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + $@ + $@ + #### $@ + #### $@ + #### $@ + #### $@ + $@ + $@@ +0x2580 UPPER HALF BLOCK + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@@ +0x2584 LOWER HALF BLOCK + ## $@ + ## $@ + ## $@ + ## $@ + ##### $@ + ## $@ + ## $@ + ## $@@ +0x2588 FULL BLOCK + ## $@ + ## $@ + ##### $@ + ## $@ + ##### $@ + ## $@ + ## $@ + ## $@@ +0x258C LEFT HALF BLOCK + ####$@ + ####$@ + ####$@ + ####$@ + ######$@ + ####$@ + ####$@ + ####$@@ +0x2590 RIGHT HALF BLOCK + $@ + $@ + $@ + $@ + #######$@ + ## ##$@ + ## ##$@ + ## ##$@@ +0x2591 LIGHT SHADE + $@ + $@ + ##### $@ + ## $@ + ##### $@ + ## $@ + ## $@ + ## $@@ +0x2592 MEDIUM SHADE + ####$@ + ####$@ + ######$@ + ##$@ + ######$@ + ####$@ + ####$@ + ####$@@ +0x2593 DARK SHADE + ####$@ + ####$@ + ####$@ + ####$@ + ####$@ + ####$@ + ####$@ + ####$@@ +0x25A0 BLACK SQUARE + ## ##$@ + ## ##$@ + #### ##$@ + ##$@ + #######$@ + $@ + $@ + $@@ +0x30A2 A + ##########$@ + ### $@ + # $@ + # $@ + # $@ + # $@ + # $@ + $@@ +0x30A4 I + ##$@ + ## $@ + ## # $@ + ## # $@ + # $@ + # $@ + # $@ + $@@ +0x30A6 U + # $@ + ##########$@ + # #$@ + ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30A8 E + $@ + ####### $@ + # $@ + # $@ + # $@ + # $@ + ##########$@ + $@@ +0x30AA O + # $@ + ##########$@ + ## $@ + ## # $@ + ## # $@ + ## ## $@ + # $@ + $@@ +0x30AB KA + # $@ + ##########$@ + # #$@ + # #$@ + # #$@ + # # # $@ + # # $@ + $@@ +0x30AD KI + # # $@ + # # $@ + # # # $@ + # $@ + # # $@ + # # $@ + #$@ + $@@ +0x30AF KU + # $@ + ########$@ + # #$@ + # ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30B1 KE + # $@ + ########$@ + # # $@ + # # $@ + # $@ + # $@ + # $@ + $@@ +0x30B3 KO + $@ + ##########$@ + #$@ + #$@ + #$@ + #$@ + ######### $@ + $@@ +0x30B5 SA + # # $@ + ##########$@ + # # $@ + # $@ + # $@ + # $@ + # $@ + $@@ +0x30B7 SI (SHI) + # #$@ + # # # $@ + # # $@ + ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30B9 SU + ########$@ + #$@ + # $@ + ## $@ + ## # $@ + ## # $@ + # #$@ + $@@ +0x30BB SE + # $@ + # $@ + ##########$@ + # # $@ + # $@ + # $@ + ###### $@ + $@@ +0x30BD SO + # #$@ + # #$@ + # $@ + # $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30BF TA + # $@ + #######$@ + # # $@ + # # # $@ + ### $@ + ## $@ + ## $@ + $@@ +0x30C1 TI (CHI) + ## $@ + ###### $@ + # $@ + ##########$@ + # $@ + # $@ + ## $@ + $@@ +0x30C4 TU (TSU) + # # #$@ + # # #$@ + # $@ + # $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30C6 TE + ###### $@ + $@ + ##########$@ + # $@ + # $@ + # $@ + ## $@ + $@@ +0x30C8 TO + # $@ + # $@ + ## $@ + # # $@ + # #$@ + # $@ + # $@ + $@@ +0x30CA NA + # $@ + ##########$@ + # $@ + # $@ + # $@ + # $@ + ## $@ + $@@ +0x30CB NI + $@ + $@ + ###### $@ + $@ + $@ + ##########$@ + $@ + $@@ +0x30CC NU + ##########$@ + #$@ + # # $@ + # ## $@ + ## $@ + ## # $@ + ## # $@ + $@@ +0x30CD NE + # $@ + ##########$@ + # $@ + ### $@ + ###### $@ + ## # ##$@ + # $@ + $@@ +0x30CE NO + #$@ + #$@ + # $@ + # $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30CF HA + $@ + $@ + # # $@ + # # $@ + # #$@ + # $@ + $@ + $@@ +0x30D2 HI + # $@ + # ### $@ + #### $@ + # $@ + # $@ + # $@ + #######$@ + $@@ +0x30D5 HU (FU) + ########$@ + #$@ + #$@ + # $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30D8 HE + $@ + $@ + ## $@ + # ## $@ + # ## $@ + ##$@ + $@ + $@@ +0x30DB HO + # $@ + ##########$@ + # $@ + # # # $@ + # # # $@ + # ## #$@ + # $@ + $@@ +0x30DE MA + $@ + ##########$@ + # $@ + # $@ + # # $@ + # $@ + # $@ + $@@ +0x30DF MI + #### $@ + ##$@ + ### $@ + ###$@ + $@ + ### $@ + ###$@ + $@@ +0x30E0 MU + # $@ + # $@ + # $@ + # $@ + # # $@ + ######### $@ + #$@ + $@@ +0x30E1 ME + #$@ + # $@ + # # $@ + # # $@ + # $@ + ## # $@ + ## # $@ + $@@ +0x30E2 MO + ###### $@ + # $@ + ##########$@ + # $@ + # $@ + # $@ + #### $@ + $@@ +0x30E4 YA + # ## $@ + # ## # $@ + ### $@ + # # $@ + # $@ + # $@ + # $@ + $@@ +0x30E6 YU + $@ + ###### $@ + # $@ + # $@ + # $@ + ##########$@ + $@ + $@@ +0x30E8 YO + $@ + ###### $@ + # $@ + # $@ + # $@ + ##########$@ + $@ + $@@ +0x30E9 RA + ###### $@ + $@ + ##########$@ + # #$@ + ## $@ + ## $@ + ## $@ + $@@ +0x30EA RI + # #$@ + # #$@ + # #$@ + # #$@ + # $@ + # $@ + ## $@ + $@@ +0x30EB RU + # # $@ + # # $@ + # # $@ + # # #$@ + # # # $@ + # # # $@ + # ## $@ + $@@ +0x30EC RE + # $@ + # $@ + # $@ + # ##$@ + # ## $@ + # ## $@ + ## $@ + $@@ +0x30ED RO + $@ + #########$@ + # #$@ + # #$@ + # #$@ + #########$@ + $@ + $@@ +0x30EF WA + ##########$@ + # #$@ + # $@ + # $@ + # $@ + ## $@ + ## $@ + $@@ +0x30F0 WI + # $@ + ####### $@ + # # $@ + # # $@ + ##########$@ + # $@ + # $@ + $@@ +0x30F1 WE + #########$@ + #$@ + #$@ + ######## $@ + # $@ + # $@ + ######## $@ + $@@ +0x30F2 WO + ##########$@ + #$@ + # $@ + ######## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30F3 N + #$@ + # #$@ + # # $@ + # $@ + ## $@ + ## $@ + ## $@ + $@@ +-0x0004 KATAMAP + @ +a-A i-B u-C e-D o-E ka-F ki-G ku-H ke-I ko-J @ +sa-K shi-L su-M se-N so-O ta-P chi-Q tsu-R te-S to-T@ +na-U ni-V nu-W ne-X no-Y ha-Z hi-a fu-b he-c ho-d @ +ma-e mi-f mu-g me-h mo-i ya-j yu-k we-l yo-m @ +ra-n ri-o ru-p re-q ro-r wa-s wi-t wo-u @ +n-v @ + @@ +-0x0006 MOSCOWMAP +a-a, b-b, v-v, g-g, d-d, e-e, zh-j, z-z, i-i@ +short i->, k-k, l-l, m-m, n-n, o-o, p-p, r-r@ +s-s, t-t, u-u, f-f, kh-h, ts-q, ch-c, sh-w @ +shch-x, hard-\, yeru-|, soft-/, reverse e-~ @ +yu-`, ya-y @ +Capitals use Latin capital letters, except: @ +Reverse E-<, Yu-@ @ +No caps for short i, hard, yeru, soft. @@ diff --git a/externals/figlet/fonts/big.flf b/externals/figlet/fonts/big.flf new file mode 100644 index 0000000000..07c468c9e5 --- /dev/null +++ b/externals/figlet/fonts/big.flf @@ -0,0 +1,2204 @@ +flf2a$ 8 6 59 15 10 0 24463 153 +Big by Glenn Chappell 4/93 -- based on Standard +Includes ISO Latin-1 +Greek characters by Bruce Jakeway +figlet release 2.2 -- November 1996 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + $@ + $@ + $@ + $@ + $@ + $@ + $@ + $@@ + _ @ + | |@ + | |@ + | |@ + |_|@ + (_)@ + @ + @@ + _ _ @ + ( | )@ + V V @ + $ @ + $ @ + $ @ + @ + @@ + _ _ @ + _| || |_ @ + |_ __ _|@ + _| || |_ @ + |_ __ _|@ + |_||_| @ + @ + @@ + _ @ + | | @ + / __)@ + \__ \@ + ( /@ + |_| @ + @ + @@ + _ __@ + (_) / /@ + / / @ + / / @ + / / _ @ + /_/ (_)@ + @ + @@ + @ + ___ @ + ( _ ) @ + / _ \/\@ + | (_> <@ + \___/\/@ + @ + @@ + _ @ + ( )@ + |/ @ + $ @ + $ @ + $ @ + @ + @@ + __@ + / /@ + | | @ + | | @ + | | @ + | | @ + \_\@ + @@ + __ @ + \ \ @ + | |@ + | |@ + | |@ + | |@ + /_/ @ + @@ + _ @ + /\| |/\ @ + \ ` ' / @ + |_ _|@ + / , . \ @ + \/|_|\/ @ + @ + @@ + @ + _ @ + _| |_ @ + |_ _|@ + |_| @ + $ @ + @ + @@ + @ + @ + @ + @ + _ @ + ( )@ + |/ @ + @@ + @ + @ + ______ @ + |______|@ + $ @ + $ @ + @ + @@ + @ + @ + @ + @ + _ @ + (_)@ + @ + @@ + __@ + / /@ + / / @ + / / @ + / / @ + /_/ @ + @ + @@ + ___ @ + / _ \ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ + __ @ + /_ |@ + | |@ + | |@ + | |@ + |_|@ + @ + @@ + ___ @ + |__ \ @ + $) |@ + / / @ + / /_ @ + |____|@ + @ + @@ + ____ @ + |___ \ @ + __) |@ + |__ < @ + ___) |@ + |____/ @ + @ + @@ + _ _ @ + | || | @ + | || |_ @ + |__ _|@ + | | @ + |_| @ + @ + @@ + _____ @ + | ____|@ + | |__ @ + |___ \ @ + ___) |@ + |____/ @ + @ + @@ + __ @ + / / @ + / /_ @ + | '_ \ @ + | (_) |@ + \___/ @ + @ + @@ + ______ @ + |____ |@ + $/ / @ + / / @ + / / @ + /_/ @ + @ + @@ + ___ @ + / _ \ @ + | (_) |@ + > _ < @ + | (_) |@ + \___/ @ + @ + @@ + ___ @ + / _ \ @ + | (_) |@ + \__, |@ + / / @ + /_/ @ + @ + @@ + @ + _ @ + (_)@ + $ @ + _ @ + (_)@ + @ + @@ + @ + _ @ + (_)@ + $ @ + _ @ + ( )@ + |/ @ + @@ + __@ + / /@ + / / @ + < < @ + \ \ @ + \_\@ + @ + @@ + @ + ______ @ + |______|@ + ______ @ + |______|@ + @ + @ + @@ + __ @ + \ \ @ + \ \ @ + > >@ + / / @ + /_/ @ + @ + @@ + ___ @ + |__ \ @ + ) |@ + / / @ + |_| @ + (_) @ + @ + @@ + @ + ____ @ + / __ \ @ + / / _` |@ + | | (_| |@ + \ \__,_|@ + \____/ @ + @@ + @ + /\ @ + / \ @ + / /\ \ @ + / ____ \ @ + /_/ \_\@ + @ + @@ + ____ @ + | _ \ @ + | |_) |@ + | _ < @ + | |_) |@ + |____/ @ + @ + @@ + _____ @ + / ____|@ + | | $ @ + | | $ @ + | |____ @ + \_____|@ + @ + @@ + _____ @ + | __ \ @ + | | | |@ + | | | |@ + | |__| |@ + |_____/ @ + @ + @@ + ______ @ + | ____|@ + | |__ @ + | __| @ + | |____ @ + |______|@ + @ + @@ + ______ @ + | ____|@ + | |__ @ + | __| @ + | | @ + |_| @ + @ + @@ + _____ @ + / ____|@ + | | __ @ + | | |_ |@ + | |__| |@ + \_____|@ + @ + @@ + _ _ @ + | | | |@ + | |__| |@ + | __ |@ + | | | |@ + |_| |_|@ + @ + @@ + _____ @ + |_ _|@ + | | @ + | | @ + _| |_ @ + |_____|@ + @ + @@ + _ @ + | |@ + | |@ + _ | |@ + | |__| |@ + \____/ @ + @ + @@ + _ __@ + | |/ /@ + | ' / @ + | < @ + | . \ @ + |_|\_\@ + @ + @@ + _ @ + | | @ + | | @ + | | @ + | |____ @ + |______|@ + @ + @@ + __ __ @ + | \/ |@ + | \ / |@ + | |\/| |@ + | | | |@ + |_| |_|@ + @ + @@ + _ _ @ + | \ | |@ + | \| |@ + | . ` |@ + | |\ |@ + |_| \_|@ + @ + @@ + ____ @ + / __ \ @ + | | | |@ + | | | |@ + | |__| |@ + \____/ @ + @ + @@ + _____ @ + | __ \ @ + | |__) |@ + | ___/ @ + | | @ + |_| @ + @ + @@ + ____ @ + / __ \ @ + | | | |@ + | | | |@ + | |__| |@ + \___\_\@ + @ + @@ + _____ @ + | __ \ @ + | |__) |@ + | _ / @ + | | \ \ @ + |_| \_\@ + @ + @@ + _____ @ + / ____|@ + | (___ @ + \___ \ @ + ____) |@ + |_____/ @ + @ + @@ + _______ @ + |__ __|@ + | | @ + | | @ + | | @ + |_| @ + @ + @@ + _ _ @ + | | | |@ + | | | |@ + | | | |@ + | |__| |@ + \____/ @ + @ + @@ + __ __@ + \ \ / /@ + \ \ / / @ + \ \/ / @ + \ / @ + \/ @ + @ + @@ + __ __@ + \ \ / /@ + \ \ /\ / / @ + \ \/ \/ / @ + \ /\ / @ + \/ \/ @ + @ + @@ + __ __@ + \ \ / /@ + \ V / @ + > < @ + / . \ @ + /_/ \_\@ + @ + @@ + __ __@ + \ \ / /@ + \ \_/ / @ + \ / @ + | | @ + |_| @ + @ + @@ + ______@ + |___ /@ + $/ / @ + / / @ + / /__ @ + /_____|@ + @ + @@ + ___ @ + | _|@ + | | @ + | | @ + | | @ + | |_ @ + |___|@ + @@ + __ @ + \ \ @ + \ \ @ + \ \ @ + \ \ @ + \_\@ + @ + @@ + ___ @ + |_ |@ + | |@ + | |@ + | |@ + _| |@ + |___|@ + @@ + /\ @ + |/\|@ + $ @ + $ @ + $ @ + $ @ + @ + @@ + @ + @ + @ + @ + @ + $ @ + ______ @ + |______|@@ + _ @ + ( )@ + \|@ + $ @ + $ @ + $ @ + @ + @@ + @ + @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ + _ @ + | | @ + | |__ @ + | '_ \ @ + | |_) |@ + |_.__/ @ + @ + @@ + @ + @ + ___ @ + / __|@ + | (__ @ + \___|@ + @ + @@ + _ @ + | |@ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ + @ + @ + ___ @ + / _ \@ + | __/@ + \___|@ + @ + @@ + __ @ + / _|@ + | |_ @ + | _|@ + | | @ + |_| @ + @ + @@ + @ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + __/ |@ + |___/ @@ + _ @ + | | @ + | |__ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @ + @@ + _ @ + (_)@ + _ @ + | |@ + | |@ + |_|@ + @ + @@ + _ @ + (_)@ + _ @ + | |@ + | |@ + | |@ + _/ |@ + |__/ @@ + _ @ + | | @ + | | __@ + | |/ /@ + | < @ + |_|\_\@ + @ + @@ + _ @ + | |@ + | |@ + | |@ + | |@ + |_|@ + @ + @@ + @ + @ + _ __ ___ @ + | '_ ` _ \ @ + | | | | | |@ + |_| |_| |_|@ + @ + @@ + @ + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @ + @@ + @ + @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ + @ + @ + _ __ @ + | '_ \ @ + | |_) |@ + | .__/ @ + | | @ + |_| @@ + @ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + | |@ + |_|@@ + @ + @ + _ __ @ + | '__|@ + | | @ + |_| @ + @ + @@ + @ + @ + ___ @ + / __|@ + \__ \@ + |___/@ + @ + @@ + _ @ + | | @ + | |_ @ + | __|@ + | |_ @ + \__|@ + @ + @@ + @ + @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @ + @@ + @ + @ + __ __@ + \ \ / /@ + \ V / @ + \_/ @ + @ + @@ + @ + @ + __ __@ + \ \ /\ / /@ + \ V V / @ + \_/\_/ @ + @ + @@ + @ + @ + __ __@ + \ \/ /@ + > < @ + /_/\_\@ + @ + @@ + @ + @ + _ _ @ + | | | |@ + | |_| |@ + \__, |@ + __/ |@ + |___/ @@ + @ + @ + ____@ + |_ /@ + / / @ + /___|@ + @ + @@ + __@ + / /@ + | | @ + / / @ + \ \ @ + | | @ + \_\@ + @@ + _ @ + | |@ + | |@ + | |@ + | |@ + | |@ + | |@ + |_|@@ + __ @ + \ \ @ + | | @ + \ \@ + / /@ + | | @ + /_/ @ + @@ + /\/|@ + |/\/ @ + $ @ + $ @ + $ @ + $ @ + @ + @@ + _ _ @ + (_)_(_) @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ + _ _ @ + (_) (_)@ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ + _ _ @ + (_) (_)@ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ + _ _ @ + (_) (_)@ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ + _ _ @ + (_) (_)@ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @ + @@ + ___ @ + / _ \ @ + | | ) |@ + | |< < @ + | | ) |@ + | ||_/ @ + |_| @ + @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + | |@ + | |@ + | |@ + |_|@ + @ + @@ +162 CENT SIGN + @ + _ @ + | | @ + / __)@ + | (__ @ + \ )@ + |_| @ + @@ +163 POUND SIGN + ___ @ + / ,_\ @ + _| |_ @ + |__ __| @ + | |____ @ + (_,_____|@ + @ + @@ +164 CURRENCY SIGN + @ + /\___/\@ + \ _ /@ + | (_) |@ + / ___ \@ + \/ \/@ + @ + @@ +165 YEN SIGN + __ __ @ + \ \ / / @ + _\ V /_ @ + |___ ___|@ + |___ ___|@ + |_| @ + @ + @@ +166 BROKEN BAR + _ @ + | |@ + | |@ + |_|@ + _ @ + | |@ + | |@ + |_|@@ +167 SECTION SIGN + __ @ + _/ _)@ + / \ \ @ + \ \\ \@ + \ \_/@ + (__/ @ + @ + @@ +168 DIAERESIS + _ _ @ + (_) (_)@ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + @ + @@ +169 COPYRIGHT SIGN + ________ @ + / ____ \ @ + / / ___| \ @ + | | | |@ + | | |___ |@ + \ \____| / @ + \________/ @ + @@ +170 FEMININE ORDINAL INDICATOR + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + |_____|@ + $ @ + @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ + / / / @ + < < < @ + \ \ \ @ + \_\_\@ + @ + @@ +172 NOT SIGN + @ + @ + ______ @ + |____ |@ + |_|@ + $ @ + @ + @@ +173 SOFT HYPHEN + @ + @ + _____ @ + |_____|@ + $ @ + $ @ + @ + @@ +174 REGISTERED SIGN + ________ @ + / ____ \ @ + / | _ \ \ @ + | | |_) | |@ + | | _ < |@ + \ |_| \_\ / @ + \________/ @ + @@ +175 MACRON + ______ @ + |______|@ + $ @ + $ @ + $ @ + $ @ + @ + @@ +176 DEGREE SIGN + __ @ + / \ @ + | () |@ + \__/ @ + $ @ + $ @ + @ + @@ +177 PLUS-MINUS SIGN + _ @ + _| |_ @ + |_ _|@ + |_| @ + _____ @ + |_____|@ + @ + @@ +178 SUPERSCRIPT TWO + ___ @ + |_ )@ + / / @ + /___|@ + $ @ + $ @ + @ + @@ +179 SUPERSCRIPT THREE + ____@ + |__ /@ + |_ \@ + |___/@ + $ @ + $ @ + @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ + $ @ + $ @ + @ + @@ +181 MICRO SIGN + @ + @ + _ _ @ + | | | |@ + | |_| |@ + | ._,_|@ + | | @ + |_| @@ +182 PILCROW SIGN + ______ @ + / |@ + | (| || |@ + \__ || |@ + | || |@ + |_||_|@ + @ + @@ +183 MIDDLE DOT + @ + @ + _ @ + (_)@ + $ @ + $ @ + @ + @@ +184 CEDILLA + @ + @ + @ + @ + @ + _ @ + )_)@ + @@ +185 SUPERSCRIPT ONE + _ @ + / |@ + | |@ + |_|@ + $ @ + $ @ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + |_____|@ + $ @ + @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + ____ @ + \ \ \ @ + \ \ \ @ + > > >@ + / / / @ + /_/_/ @ + @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ __ @ + / | / / @ + | |/ / _ @ + |_/ / | | @ + / /|_ _|@ + /_/ |_| @ + @ + @@ +189 VULGAR FRACTION ONE HALF + _ __ @ + / | / / @ + | |/ /__ @ + |_/ /_ )@ + / / / / @ + /_/ /___|@ + @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ____ __ @ + |__ / / / @ + |_ \/ / _ @ + |___/ / | | @ + / /|_ _|@ + /_/ |_| @ + @ + @@ +191 INVERTED QUESTION MARK + _ @ + (_) @ + | | @ + / / @ + | (__ @ + \___|@ + @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + \_\ @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __ @ + /_/ @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //\ @ + |/_\| @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/| @ + |/\/ @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_) @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + (o) @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ +198 LATIN CAPITAL LETTER AE + _______ @ + / ____|@ + / |__ @ + / /| __| @ + / ___ |____ @ + /_/ |______|@ + @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + _____ @ + / ____|@ + | | $ @ + | | $ @ + | |____ @ + \_____|@ + )_) @ + @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + _\_\_ @ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __ @ + _/_/_ @ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //\ @ + |/ \| @ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_) (_)@ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + \_\ @ + |_ _|@ + | | @ + | | @ + |___|@ + @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __ @ + /_/ @ + |_ _|@ + | | @ + | | @ + |___|@ + @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + |_ _|@ + | | @ + | | @ + |___|@ + @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + |_ _| @ + | | @ + | | @ + |___| @ + @ + @@ +208 LATIN CAPITAL LETTER ETH + _____ @ + | __ \ @ + _| |_ | |@ + |__ __|| |@ + | |__| |@ + |_____/ @ + @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/| @ + |/\/_ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/| @ + |/\/ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +215 MULTIPLICATION SIGN + @ + @ + /\/\@ + > <@ + \/\/@ + $ @ + @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _____ @ + / __// @ + | | // |@ + | |//| |@ + | //_| |@ + //___/ @ + @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ + __/_/__@ + \ \ / /@ + \ V / @ + | | @ + |_| @ + @ + @@ +222 LATIN CAPITAL LETTER THORN + _ @ + | |___ @ + | __ \ @ + | |__) |@ + | ___/ @ + |_| @ + @ + @@ +223 LATIN SMALL LETTER SHARP S + ___ @ + / _ \ @ + | | ) |@ + | |< < @ + | | ) |@ + | ||_/ @ + |_| @ + @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + \_\ @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + /_/ @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //\ @ + |/ \| @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/| @ + |/\/ @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_) (_)@ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + (()) @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ +230 LATIN SMALL LETTER AE + @ + @ + __ ____ @ + / _` _ \@ + | (_| __/@ + \__,____|@ + @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + @ + ___ @ + / __|@ + | (__ @ + \___|@ + )_) @ + @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + \_\ @ + ___ @ + / _ \@ + | __/@ + \___|@ + @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __ @ + /_/ @ + ___ @ + / _ \@ + | __/@ + \___|@ + @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //\ @ + |/ \|@ + ___ @ + / _ \@ + | __/@ + \___|@ + @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_) (_)@ + ___ @ + / _ \ @ + | __/ @ + \___| @ + @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + _ @ + | |@ + | |@ + |_|@ + @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + _ @ + | |@ + | |@ + |_|@ + @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //\ @ + |/ \|@ + _ @ + | | @ + | | @ + |_| @ + @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_) (_)@ + _ @ + | | @ + | | @ + |_| @ + @ + @@ +240 LATIN SMALL LETTER ETH + /\/\ @ + > < @ + \/\ \ @ + / _` |@ + | (_) |@ + \___/ @ + @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/| @ + |/\/ @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + \_\ @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __ @ + /_/ @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //\ @ + |/ \| @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/| @ + |/\/ @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_) (_)@ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ +247 DIVISION SIGN + _ @ + (_) @ + _______ @ + |_______|@ + _ @ + (_) @ + @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + @ + ____ @ + / _//\ @ + | (//) |@ + \//__/ @ + @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + \_\ @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + /_/ @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + /_/ @ + _ _ @ + | | | |@ + | |_| |@ + \__, |@ + __/ |@ + |___/ @@ +254 LATIN SMALL LETTER THORN + _ @ + | | @ + | |__ @ + | '_ \ @ + | |_) |@ + | .__/ @ + | | @ + |_| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_) (_)@ + _ _ @ + | | | |@ + | |_| |@ + \__, |@ + __/ |@ + |___/ @@ +0x02BC MODIFIER LETTER APOSTROPHE + @ + @ + ))@ + @ + @ + @ + @ + @@ +0x02BD MODIFIER LETTER REVERSED COMMA + @ + @ + ((@ + @ + @ + @ + @ + @@ +0x037A GREEK YPOGEGRAMMENI + @ + @ + @ + @ + @ + @ + @ + ||@@ +0x0387 GREEK ANO TELEIA + @ + $ @ + _ @ + (_)@ + @ + $ @ + @ + @@ +0x0391 GREEK CAPITAL LETTER ALPHA + ___ @ + / _ \ @ + | |_| |@ + | _ |@ + | | | |@ + |_| |_|@ + @ + @@ +0x0392 GREEK CAPITAL LETTER BETA + ____ @ + | _ \ @ + | |_) )@ + | _ ( @ + | |_) )@ + |____/ @ + @ + @@ +0x0393 GREEK CAPITAL LETTER GAMMA + _____ @ + | ___)@ + | |$ @ + | |$ @ + | | @ + |_| @ + @ + @@ +0x0394 GREEK CAPITAL LETTER DELTA + @ + /\ @ + / \ @ + / /\ \ @ + / /__\ \ @ + /________\@ + @ + @@ +0x0395 GREEK CAPITAL LETTER EPSILON + _____ @ + | ___)@ + | |_ @ + | _) @ + | |___ @ + |_____)@ + @ + @@ +0x0396 GREEK CAPITAL LETTER ZETA + ______@ + (___ /@ + / / @ + / / @ + / /__ @ + /_____)@ + @ + @@ +0x0397 GREEK CAPITAL LETTER ETA + _ _ @ + | | | |@ + | |_| |@ + | _ |@ + | | | |@ + |_| |_|@ + @ + @@ +0x0398 GREEK CAPITAL LETTER THETA + ____ @ + / __ \ @ + | |__| |@ + | __ |@ + | |__| |@ + \____/ @ + @ + @@ +0x0399 GREEK CAPITAL LETTER IOTA + ___ @ + ( )@ + | | @ + | | @ + | | @ + (___)@ + @ + @@ +0x039A GREEK CAPITAL LETTER KAPPA + _ __@ + | | / /@ + | |/ / @ + | < @ + | |\ \ @ + |_| \_\@ + @ + @@ +0x039B GREEK CAPITAL LETTER LAMDA + @ + /\ @ + / \ @ + / /\ \ @ + / / \ \ @ + /_/ \_\@ + @ + @@ +0x039C GREEK CAPITAL LETTER MU + __ __ @ + | \ / |@ + | v |@ + | |\_/| |@ + | | | |@ + |_| |_|@ + @ + @@ +0x039D GREEK CAPITAL LETTER NU + _ _ @ + | \ | |@ + | \| |@ + | |@ + | |\ |@ + |_| \_|@ + @ + @@ +0x039E GREEK CAPITAL LETTER XI + _____ @ + (_____)@ + ___ @ + (___) @ + _____ @ + (_____)@ + @ + @@ +0x039F GREEK CAPITAL LETTER OMICRON + ___ @ + / _ \ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +0x03A0 GREEK CAPITAL LETTER PI + _______ @ + ( _ )@ + | | | | @ + | | | | @ + | | | | @ + |_| |_| @ + @ + @@ +0x03A1 GREEK CAPITAL LETTER RHO + ____ @ + | _ \ @ + | |_) )@ + | __/ @ + | | @ + |_| @ + @ + @@ +0x03A3 GREEK CAPITAL LETTER SIGMA + ______ @ + \ ___)@ + \ \ @ + > > @ + / /__ @ + /_____)@ + @ + @@ +0x03A4 GREEK CAPITAL LETTER TAU + _____ @ + (_ _)@ + | | @ + | | @ + | | @ + |_| @ + @ + @@ +0x03A5 GREEK CAPITAL LETTER UPSILON + __ __ @ + (_ \ / _)@ + \ v / @ + | | @ + | | @ + |_| @ + @ + @@ +0x03A6 GREEK CAPITAL LETTER PHI + _ @ + _| |_ @ + / \ @ + ( (| |) )@ + \_ _/ @ + |_| @ + @ + @@ +0x03A7 GREEK CAPITAL LETTER CHI + __ __@ + \ \ / /@ + \ v / @ + > < @ + / ^ \ @ + /_/ \_\@ + @ + @@ +0x03A8 GREEK CAPITAL LETTER PSI + _ _ _ @ + | || || |@ + | \| |/ |@ + \_ _/ @ + | | @ + |_| @ + @ + @@ +0x03A9 GREEK CAPITAL LETTER OMEGA + ____ @ + / __ \ @ + | | | | @ + | | | | @ + _\ \/ /_ @ + (___||___)@ + @ + @@ +0x03B1 GREEK SMALL LETTER ALPHA + @ + @ + __ __@ + / \/ /@ + ( () < @ + \__/\_\@ + @ + @@ +0x03B2 GREEK SMALL LETTER BETA + ___ @ + / _ \ @ + | |_) )@ + | _ < @ + | |_) )@ + | __/ @ + | | @ + |_| @@ +0x03B3 GREEK SMALL LETTER GAMMA + @ + @ + _ _ @ + ( \ / )@ + \ v / @ + | | @ + | | @ + |_| @@ +0x03B4 GREEK SMALL LETTER DELTA + __ @ + / _) @ + \ \ @ + / _ \ @ + ( (_) )@ + \___/ @ + @ + @@ +0x03B5 GREEK SMALL LETTER EPSILON + @ + @ + ___ @ + / __)@ + > _) @ + \___)@ + @ + @@ +0x03B6 GREEK SMALL LETTER ZETA + _____ @ + \__ ) @ + / / @ + / / @ + | |__ @ + \__ \ @ + ) )@ + (_/ @@ +0x03B7 GREEK SMALL LETTER ETA + @ + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| | |@ + | |@ + |_|@@ +0x03B8 GREEK SMALL LETTER THETA + ___ @ + / _ \ @ + | |_| |@ + | _ |@ + | |_| |@ + \___/ @ + @ + @@ +0x03B9 GREEK SMALL LETTER IOTA + @ + @ + _ @ + | | @ + | | @ + \_)@ + @ + @@ +0x03BA GREEK SMALL LETTER KAPPA + @ + @ + _ __@ + | |/ /@ + | < @ + |_|\_\@ + @ + @@ +0x03BB GREEK SMALL LETTER LAMDA + __ @ + \ \ @ + \ \ @ + > \ @ + / ^ \ @ + /_/ \_\@ + @ + @@ +0x03BC GREEK SMALL LETTER MU + @ + @ + _ _ @ + | | | |@ + | |_| |@ + | ._,_|@ + | | @ + |_| @@ +0x03BD GREEK SMALL LETTER NU + @ + @ + _ __@ + | |/ /@ + | / / @ + |__/ @ + @ + @@ +0x03BE GREEK SMALL LETTER XI + \=\__ @ + > __) @ + ( (_ @ + > _) @ + ( (__ @ + \__ \ @ + ) )@ + (_/ @@ +0x03BF GREEK SMALL LETTER OMICRON + @ + @ + ___ @ + / _ \ @ + ( (_) )@ + \___/ @ + @ + @@ +0x03C0 GREEK SMALL LETTER PI + @ + @ + ______ @ + ( __ )@ + | || | @ + |_||_| @ + @ + @@ +0x03C1 GREEK SMALL LETTER RHO + @ + @ + ___ @ + / _ \ @ + | |_) )@ + | __/ @ + | | @ + |_| @@ +0x03C2 GREEK SMALL LETTER FINAL SIGMA + @ + @ + ____ @ + / ___)@ + ( (__ @ + \__ \ @ + _) )@ + (__/ @@ +0x03C3 GREEK SMALL LETTER SIGMA + @ + @ + ____ @ + / ._)@ + ( () ) @ + \__/ @ + @ + @@ +0x03C4 GREEK SMALL LETTER TAU + @ + @ + ___ @ + ( )@ + | | @ + \_)@ + @ + @@ +0x03C5 GREEK SMALL LETTER UPSILON + @ + @ + _ _ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +0x03C6 GREEK SMALL LETTER PHI + _ @ + | | @ + _| |_ @ + / \ @ + ( (| |) )@ + \_ _/ @ + | | @ + |_| @@ +0x03C7 GREEK SMALL LETTER CHI + @ + @ + __ __@ + \ \ / /@ + \ v / @ + > < @ + / ^ \ @ + /_/ \_\@@ +0x03C8 GREEK SMALL LETTER PSI + @ + @ + _ _ _ @ + | || || |@ + | \| |/ |@ + \_ _/ @ + | | @ + |_| @@ +0x03C9 GREEK SMALL LETTER OMEGA + @ + @ + __ __ @ + / / _ \ \ @ + | |_/ \_| |@ + \___^___/ @ + @ + @@ +0x03D1 GREEK THETA SYMBOL + ___ @ + / _ \ @ + ( (_| |_ @ + _ \ _ _)@ + | |___| | @ + \_____/ @ + @ + @@ +0x03D5 GREEK PHI SYMBOL + @ + @ + _ __ @ + | | / \ @ + | || || )@ + \_ _/ @ + | | @ + |_| @@ +0x03D6 GREEK PI SYMBOL + @ + @ + _________ @ + ( _____ )@ + | |_/ \_| |@ + \___^___/ @ + @ + @@ +-0x0005 +alpha = a, beta = b, gamma = g, delta = d, epsilon = e @ +zeta = z, eta = h, theta = q, iota = i, lamda = l, mu = m@ +nu = n, xi = x, omicron = o, pi = p, rho = r, sigma = s @ +phi = f, chi = c, psi = y, omega = w, final sigma = V @ + pi symbol = v, theta symbol = J, phi symbol = j @ + middle dot = :, ypogegrammeni = _ @ + rough breathing = (, smooth breathing = ) @ + acute accent = ', grave accent = `, dialytika = ^ @@ diff --git a/externals/figlet/fonts/block.flf b/externals/figlet/fonts/block.flf new file mode 100644 index 0000000000..b1172f049e --- /dev/null +++ b/externals/figlet/fonts/block.flf @@ -0,0 +1,1691 @@ +flf2a$ 8 6 27 0 10 0 576 96 +Block by Glenn Chappell 4/93 -- straight version of Lean +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +$ $@ +$ $@ +$ $@ +$ $@ +$ $@ +$ $@ +$ $@ +$ $@@ + $$@ + _| $@ + _| $@ + _| $@ + $$@ + _| $@ + $$@ + @@ + _| _| $@ + _| _| $@ + $$@ + $$ @ + $$ @ + $$ @ + @ + @@ + $$ @ + _| _| $@ + _|_|_|_|_| $@ + _| _| $@ + _|_|_|_|_| $@ + _| _| $@ + $$ @ + @@ + $$ @ + _| $@ + _|_|_| $@ + _|_| $@ + _|_| $@ + _|_|_| $@ + _| $@ + $$ @@ + $$@ + _|_| _| $@ + _|_| _| $@ + _| $@ + _| _|_| $@ + _| _|_| $@ + $$@ + @@ + $$ @ + _| $ @ + _| _| $@ + _|_| _| $@ + _| _| $@ + _|_| _| $@ + $$@ + @@ + _| $@ + _| $@ + $$ @ + $$ @ + $$ @ + $$ @ + @ + @@ + _| $@ + _| $@ + _| $ @ + _| $ @ + _| $ @ + _| $@ + _| $@ + $$@@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + $$ @@ + $$@ + _| _| _| $@ + _|_|_| $@ + _|_|_|_|_| $@ + _|_|_| $@ + _| _| _| $@ + $$@ + @@ + $$ @ + _| $ @ + _| $@ + _|_|_|_|_| $@ + _| $@ + _| $ @ + $$ @ + @@ + @ + @ + @ + @ + $$@ + _| $@ + _| $@ + $$ @@ + @ + @ + $$@ + _|_|_|_|_| $@ + $$@ + @ + @ + @@ + @ + @ + @ + @ + $$@ + _| $@ + $$@ + @@ + $$@ + _| $@ + _| $@ + _| $ @ + _| $ @ + _| $ @ + $$ @ + @@ + $$ @ + _| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _| $@ + $$ @ + @@ + $$@ + _| $@ + _|_| $@ + _| $@ + _| $@ + _| $@ + $$@ + @@ + $$ @ + _|_| $@ + _| _| $@ + _| $@ + _| $@ + _|_|_|_| $@ + $$@ + @@ + $$ @ + _|_|_| $@ + _| $@ + _|_| $@ + _| $@ + _|_|_| $@ + $$ @ + @@ + $$ @ + _| _| $ @ + _| _| $@ + _|_|_|_| $@ + _| $@ + _| $ @ + $$ @ + @@ + $$@ + _|_|_|_| $@ + _| $@ + _|_|_| $@ + _| $@ + _|_|_| $@ + $$ @ + @@ + $$@ + _|_|_| $@ + _| $@ + _|_|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + $$@ + _|_|_|_|_| $@ + _| $@ + _| $@ + _| $ @ + _| $ @ + $$ @ + @@ + $$ @ + _|_| $@ + _| _| $@ + _|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + $$ @ + _|_| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _|_|_| $@ + $$ @ + @@ + @ + $$@ + _| $@ + $$@ + $$@ + _| $@ + $$@ + @@ + @ + $$@ + _| $@ + $$@ + $$@ + _| $@ + _| $@ + $$ @@ + $$@ + _| $@ + _| $@ + _| $ @ + _| $@ + _| $@ + $$@ + @@ + @ + $$@ + _|_|_|_|_| $@ + $$@ + _|_|_|_|_| $@ + $$@ + @ + @@ + $$ @ + _| $ @ + _| $@ + _| $@ + _| $@ + _| $ @ + $$ @ + @@ + $$ @ + _|_| $@ + _| $@ + _|_| $@ + $$ @ + _| $ @ + $$ @ + @@ + $$ @ + _|_|_|_|_| $@ + _| _| $@ + _| _|_|_| _| $@ + _| _| _| _| $@ + _| _|_|_|_| $@ + _| $@ + _|_|_|_|_|_| $@@ + $$ @ + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + $$ @ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$ @ + @@ + $$@ + _|_|_| $@ + _| $@ + _| $ @ + _| $@ + _|_|_| $@ + $$@ + @@ + $$ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$ @ + @@ + $$@ + _|_|_|_| $@ + _| $@ + _|_|_| $ @ + _| $@ + _|_|_|_| $@ + $$@ + @@ + $$@ + _|_|_|_| $@ + _| $@ + _|_|_| $ @ + _| $ @ + _| $ @ + $$ @ + @@ + $$@ + _|_|_| $@ + _| $@ + _| _|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ + $$@ + _| _| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + $$@ + _|_|_| $@ + _| $@ + _| $ @ + _| $@ + _|_|_| $@ + $$@ + @@ + $$@ + _| $@ + _| $@ + _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + $$@ + _| _| $@ + _| _| $@ + _|_| $ @ + _| _| $@ + _| _| $@ + $$@ + @@ + $$ @ + _| $ @ + _| $ @ + _| $ @ + _| $@ + _|_|_|_| $@ + $$@ + @@ + $$@ + _| _| $@ + _|_| _|_| $@ + _| _| _| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + $$@ + _| _| $@ + _|_| _| $@ + _| _| _| $@ + _| _|_| $@ + _| _| $@ + $$@ + @@ + $$ @ + _|_| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + $$ @ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + _| $ @ + _| $ @ + $$ @ + @@ + $$ @ + _|_| $ @ + _| _| $ @ + _| _|_| $ @ + _| _| $@ + _|_| _| $@ + $$@ + @@ + $$ @ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + $$@ + _|_|_| $@ + _| $@ + _|_| $@ + _| $@ + _|_|_| $@ + $$ @ + @@ + $$@ + _|_|_|_|_| $@ + _| $@ + _| $ @ + _| $ @ + _| $ @ + $$ @ + @@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _| $ @ + $$ @ + @@ + $$@ + _| _| $@ + _| _| $@ + _| _| _| $@ + _| _| _| $@ + _| _| $ @ + $$ @ + @@ + $$@ + _| _| $@ + _| _| $@ + _| $ @ + _| _| $@ + _| _| $@ + $$@ + @@ + $$@ + _| _| $@ + _| _| $@ + _| $ @ + _| $ @ + _| $ @ + $$ @ + @@ + $$@ + _|_|_|_|_| $@ + _| $@ + _| $ @ + _| $@ + _|_|_|_|_| $@ + $$@ + @@ + _|_| $@ + _| $@ + _| $ @ + _| $ @ + _| $ @ + _| $@ + _|_| $@ + $$@@ + $$ @ + _| $ @ + _| $ @ + _| $ @ + _| $@ + _| $@ + $$@ + @@ + _|_| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _|_| $@ + $$@@ + _| $@ + _| _| $@ + $$@ + $$ @ + $$ @ + $$ @ + @ + @@ + @ + @ + $$ @ + $$ @ + $$ @ + $$ @ + $$@ + _|_|_|_|_| $@@ + _| $@ + _| $@ + $$@ + $$ @ + $$ @ + $$ @ + @ + @@ + @ + $$@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ + $$ @ + _| $ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$ @ + @@ + @ + $$@ + _|_|_| $@ + _| $@ + _| $@ + _|_|_| $@ + $$@ + @@ + $$@ + _| $@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ + @ + $$ @ + _|_| $@ + _|_|_|_| $@ + _| $@ + _|_|_| $@ + $$@ + @@ + $$@ + _|_| $@ + _| $@ + _|_|_|_| $@ + _| $@ + _| $ @ + $$ @ + @@ + @ + $$@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _|_| $@@ + $$ @ + _| $ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + $$@ + _| $@ + $$@ + _| $@ + _| $@ + _| $@ + $$@ + @@ + $$@ + _| $@ + $$@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@@ + $$ @ + _| $ @ + _| _| $ @ + _|_| $ @ + _| _| $@ + _| _| $@ + $$@ + @@ + $$@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + $$@ + @@ + @ + $$ @ + _|_|_| _|_| $@ + _| _| _| $@ + _| _| _| $@ + _| _| _| $@ + $$@ + @@ + @ + $$ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + @ + $$ @ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + @ + $$ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $ @ + _| $ @@ + @ + $$@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _| $@@ + @ + $$@ + _| _|_| $@ + _|_| $@ + _| $ @ + _| $ @ + $$ @ + @@ + @ + $$@ + _|_|_| $@ + _|_| $@ + _|_| $@ + _|_|_| $@ + $$ @ + @@ + $$ @ + _| $@ + _|_|_|_| @ + _| $@ + _| $@ + _|_| $@ + $$@ + @@ + @ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ + @ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _| $ @ + $$ @ + @@ + @ + $$@ + _| _| _| $@ + _| _| _| $@ + _| _| _| _| $@ + _| _| $ @ + $$ @ + @@ + @ + $$@ + _| _| $@ + _|_| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + @ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _|_| $@@ + @ + $$@ + _|_|_|_| $@ + _| $@ + _| $@ + _|_|_|_| $@ + $$@ + @@ + _| $@ + _| $@ + _| $@ + _| $ @ + _| $@ + _| $@ + _| $@ + $$@@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@@ + _| $ @ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $ @ + $$ @@ + _| _| $@ + _| _| $@ + $$ @ + $$ @ + $$ @ + $$ @ + @ + @@ + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + _| _| $@ + $$@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ + $$ @ + _|_| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _| $ @ + $$ @@ +160 NO-BREAK SPACE + $ $@ + $ $@ + $ $@ + $ $@ + $ $@ + $ $@ + $ $@ + $ $@@ +161 INVERTED EXCLAMATION MARK + $$@ + _| $@ + $$@ + _| $@ + _| $@ + _| $@ + $$@ + @@ +162 CENT SIGN + $$ @ + _| $@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + $$ @@ +163 POUND SIGN + $$ @ + _|_| $ @ + _| _| $ @ + _|_|_| $ @ + _| $@ + _|_|_| _| $@ + _|_| _|_| $@ + @@ +164 CURRENCY SIGN + $$@ + _| _| $@ + _|_|_|_| $@ + _| _| $ @ + _| _| $ @ + _|_|_|_| $@ + _| _| $@ + $$@@ +165 YEN SIGN + $$@ + _| _| $@ + _| _| $@ + _|_|_|_|_| $@ + _| $@ + _|_|_|_|_| $@ + _| $@ + $$ @@ +166 BROKEN BAR + _| $@ + _| $@ + _| $@ + $$@ + $$@ + _| $@ + _| $@ + _| $@@ +167 SECTION SIGN + _|_| $@ + _| $@ + _| $@ + _| _| $@ + _| $@ + _| $@ + _|_| $@ + $$ @@ +168 DIAERESIS + _| _| $@ + $$@ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + @ + @@ +169 COPYRIGHT SIGN + _|_|_|_| $ @ + _| _| $@ + _| _|_|_| _| $@ + _| _| _| $@ + _| _| _| $@ + _| _|_|_| _| $@ + _| _| $@ + _|_|_|_| $ @@ +170 FEMININE ORDINAL INDICATOR + $$@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + _|_|_|_| $@ + @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + $$@ + _| _| $@ + _| _| $@ + _| _| $ @ + _| _| $@ + _| _| $@ + $$@ + @@ +172 NOT SIGN + @ + @ + $$@ + _|_|_|_|_| $@ + _| $@ + $$@ + @ + @@ +173 SOFT HYPHEN + @ + @ + $$@ + _|_|_|_| $@ + $$@ + $$ @ + @ + @@ +174 REGISTERED SIGN + _|_|_|_| $ @ + _| _| $@ + _| _|_|_| _| $@ + _| _| _| _| $@ + _| _|_|_| _| $@ + _| _| _| _| $@ + _| _| $@ + _|_|_|_| $ @@ +175 MACRON + _|_|_|_|_| $@ + $$@ + $$ @ + $$ @ + $$ @ + $$ @ + @ + @@ +176 DEGREE SIGN + _| $@ + _| _| $@ + _| $@ + $$ @ + $$ @ + $$ @ + @ + @@ +177 PLUS-MINUS SIGN + $$ @ + _| $ @ + _| $@ + _|_|_|_|_| $@ + _| $@ + _|_|_|_|_| $@ + $$@ + @@ +178 SUPERSCRIPT TWO + $$ @ + _|_| $@ + _| $@ + _| $@ + _|_|_| $@ + $$@ + @ + @@ +179 SUPERSCRIPT THREE + $$@ + _|_|_| $@ + _| $@ + _| $@ + _|_| $@ + $$ @ + @ + @@ +180 ACUTE ACCENT + _| $@ + _| $@ + $$ @ + $$ @ + $$ @ + $$ @ + @ + @@ +181 MICRO SIGN + @ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_|_| $@ + _| $@ + _| $ @@ +182 PILCROW SIGN + $$@ + _|_|_|_| $@ + _|_|_| _| $@ + _|_| _| $@ + _| _| $@ + _| _| $@ + $$@ + @@ +183 MIDDLE DOT + @ + @ + $$@ + _| $@ + $$@ + $$ @ + @ + @@ +184 CEDILLA + @ + @ + @ + @ + @ + $$@ + _| $@ + _|_| $@@ +185 SUPERSCRIPT ONE + $$@ + _| $@ + _|_| $@ + _| $@ + _| $@ + $$@ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + $$ @ + _|_| $@ + _| _| $@ + _|_| $@ + $$@ + _|_|_|_| $@ + @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + $$ @ + _| _| $ @ + _| _| $@ + _| _| $@ + _| _| $@ + _| _| $ @ + $$ @ + @@ +188 VULGAR FRACTION ONE QUARTER + $$ @ + _| _| $ @ + _|_| _| _| _| $ @ + _| _| _| _| $@ + _| _| _|_|_|_| $@ + _| _| $@ + $$ @ + @@ +189 VULGAR FRACTION ONE HALF + $$ @ + _| _| $ @ + _|_| _| _|_| $@ + _| _| _| $@ + _| _| _| $@ + _| _|_|_| $@ + $$@ + @@ +190 VULGAR FRACTION THREE QUARTERS + $$ @ + _|_|_| _| $ @ + _| _| _| _| $ @ + _| _| _| _| $@ + _|_| _| _|_|_|_| $@ + _| _| $@ + $$ @ + @@ +191 INVERTED QUESTION MARK + $$@ + _| $@ + $$@ + _|_| $@ + _| $@ + _|_| $@ + $$@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + _| $ @ + _| $ @ + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _| $ @ + _| $ @ + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + $$@ + _|_| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + _| _| $@ + _| _| $@ + $$ @ + _|_| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _|_| $@ + _| _| $@ + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ +198 LATIN CAPITAL LETTER AE + $$@ + _|_|_|_|_|_| $@ + _| _| $@ + _|_|_|_|_|_| $ @ + _| _| $@ + _| _|_|_|_| $@ + $$@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + $$@ + _|_|_| $@ + _| $@ + _| $ @ + _| $@ + _|_|_| $@ + _| $@ + _|_| $ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + _| $ @ + _| $@ + _|_|_|_| $@ + _|_|_| $ @ + _| $@ + _|_|_|_| $@ + $$@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _| $ @ + _| $@ + _|_|_|_| $@ + _|_|_| $ @ + _| $@ + _|_|_|_| $@ + $$@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _|_|_| $ @ + _| $@ + _|_|_|_| $@ + $$@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _| _| $@ + $$@ + _|_|_|_| $@ + _|_|_| $ @ + _| $@ + _|_|_|_| $@ + $$@ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + _| $ @ + _| $@ + _|_|_| $@ + _| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _| $@ + _| $@ + _|_|_| $@ + _| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _| _| $@ + $$@ + _|_|_| $@ + _| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +208 LATIN CAPITAL LETTER ETH + $$ @ + _|_|_| $@ + _| _| $@ + _|_|_| _| $@ + _| _| $@ + _|_|_| $@ + $$ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + _| _| $@ + _| _| $@ + _| _| $@ + _|_| _| $@ + _| _|_| $@ + _| _| $@ + $$@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + _| $ @ + _| $ @ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _| $ @ + _| $ @ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + _| _| $@ + _| _| $@ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +215 MULTIPLICATION SIGN + @ + $$@ + _| _| $@ + _| $@ + _| _| $@ + $$@ + @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + $$@ + _|_|_|_| $@ + _| _|_| $@ + _| _| _| $@ + _|_| _| $@ + _|_|_|_| $@ + $$ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + _| $ @ + _| $ @ + $$@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _| $ @ + _| $ @ + $$@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _| $ @ + _| $@ + _| _| $@ + _| _| $@ + _| $ @ + _| $ @ + $$ @ + @@ +222 LATIN CAPITAL LETTER THORN + $$ @ + _| $ @ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + _| $ @ + $$ @ + @@ +223 LATIN SMALL LETTER SHARP S + $$ @ + _|_| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _| $ @ + $$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + _| $ @ + _| $ @ + $$@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + _| $@ + _| $@ + $$@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + _| $@ + _| _| $@ + $$@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + _| _| $@ + _| _| $@ + $$@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _| _| $@ + $$@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + _| $@ + _| _| $@ + _| $@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +230 LATIN SMALL LETTER AE + @ + $$ @ + _|_|_| _|_| $@ + _| _|_|_|_|_| $@ + _| _|_| $@ + _|_|_| _|_|_| $@ + $$@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + $$@ + _|_|_| $@ + _| $@ + _| $@ + _|_|_| $@ + _| $@ + _|_| $ @@ +232 LATIN SMALL LETTER E WITH GRAVE + _| $@ + _| $ @ + _|_| $@ + _|_|_|_| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + _| $@ + _| $@ + _|_| $@ + _|_|_|_| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + _|_| $@ + _|_|_|_| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _| _| $@ + $$@ + _|_| $@ + _|_|_|_| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + _| $@ + _| $@ + $$@ + _| $@ + _| $@ + _| $@ + $$@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + _| $@ + _| $@ + $$ @ + _| $ @ + _| $ @ + _| $ @ + $$ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + _| $@ + _| _| $@ + $$@ + _| $ @ + _| $ @ + _| $ @ + $$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _| _| $@ + $$@ + _| $ @ + _| $ @ + _| $ @ + _| $ @ + $$ @ + @@ +240 LATIN SMALL LETTER ETH + _| _| $ @ + _| $ @ + _| _| $@ + _|_|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + _| _| $@ + _| _| $@ + $$ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + $$@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + _| $ @ + _| $ @ + $$ @ + _|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + _| $ @ + _| $ @ + $$ @ + _|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + _|_|_| $@ + _| _| $@ + $$ @ + _|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +247 DIVISION SIGN + $$ @ + _| $ @ + $$@ + _|_|_|_|_| $@ + $$@ + _| $ @ + $$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + $$@ + _|_|_| $@ + _| _|_| $@ + _|_| _| $@ + _|_|_| $@ + $$ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + _| $ @ + _| $ @ + $$@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + _| $@ + _| $@ + $$@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _| $ @ + _| $ @ + $$@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _|_| $@@ +254 LATIN SMALL LETTER THORN + $$ @ + _| $ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $ @ + _| $ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _|_| $@@ diff --git a/externals/figlet/fonts/bubble.flf b/externals/figlet/fonts/bubble.flf new file mode 100644 index 0000000000..efd0a71964 --- /dev/null +++ b/externals/figlet/fonts/bubble.flf @@ -0,0 +1,1630 @@ +flf2a 4 3 8 15 11 0 10127 242 +Bubble by Glenn Chappell 4/93 +Includes characters 128-255 +Enhanced for Latin-2,3,4 by John Cowan +Latin character sets supported only if your screen font does +figlet release 2.2 -- November 1996 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + @ + @ + @ + @@ + _ @ + / \ @ + ( ! )@ + \_/ @@ + _ @ + / \ @ + ( " )@ + \_/ @@ + _ @ + / \ @ + ( # )@ + \_/ @@ + _ @ + / \ @ + ( $ )@ + \_/ @@ + _ @ + / \ @ + ( % )@ + \_/ @@ + _ @ + / \ @ + ( & )@ + \_/ @@ + _ @ + / \ @ + ( ' )@ + \_/ @@ + _ @ + / \ @ + ( ( )@ + \_/ @@ + _ @ + / \ @ + ( ) )@ + \_/ @@ + _ @ + / \ @ + ( * )@ + \_/ @@ + _ @ + / \ @ + ( + )@ + \_/ @@ + _ @ + / \ @ + ( , )@ + \_/ @@ + _ @ + / \ @ + ( - )@ + \_/ @@ + _ @ + / \ @ + ( . )@ + \_/ @@ + _ @ + / \ @ + ( / )@ + \_/ @@ + _ @ + / \ @ + ( 0 )@ + \_/ @@ + _ @ + / \ @ + ( 1 )@ + \_/ @@ + _ @ + / \ @ + ( 2 )@ + \_/ @@ + _ @ + / \ @ + ( 3 )@ + \_/ @@ + _ @ + / \ @ + ( 4 )@ + \_/ @@ + _ @ + / \ @ + ( 5 )@ + \_/ @@ + _ @ + / \ @ + ( 6 )@ + \_/ @@ + _ @ + / \ @ + ( 7 )@ + \_/ @@ + _ @ + / \ @ + ( 8 )@ + \_/ @@ + _ @ + / \ @ + ( 9 )@ + \_/ @@ + _ @ + / \ @ + ( : )@ + \_/ @@ + _ @ + / \ @ + ( ; )@ + \_/ @@ + _ @ + / \ @ + ( < )@ + \_/ @@ + _ @ + / \ @ + ( = )@ + \_/ @@ + _ @ + / \ @ + ( > )@ + \_/ @@ + _ @ + / \ @ + ( ? )@ + \_/ @@ + _ @ + / \ @ + ( @ )@ + \_/ @@ + _ @ + / \ @ + ( A )@ + \_/ @@ + _ @ + / \ @ + ( B )@ + \_/ @@ + _ @ + / \ @ + ( C )@ + \_/ @@ + _ @ + / \ @ + ( D )@ + \_/ @@ + _ @ + / \ @ + ( E )@ + \_/ @@ + _ @ + / \ @ + ( F )@ + \_/ @@ + _ @ + / \ @ + ( G )@ + \_/ @@ + _ @ + / \ @ + ( H )@ + \_/ @@ + _ @ + / \ @ + ( I )@ + \_/ @@ + _ @ + / \ @ + ( J )@ + \_/ @@ + _ @ + / \ @ + ( K )@ + \_/ @@ + _ @ + / \ @ + ( L )@ + \_/ @@ + _ @ + / \ @ + ( M )@ + \_/ @@ + _ @ + / \ @ + ( N )@ + \_/ @@ + _ @ + / \ @ + ( O )@ + \_/ @@ + _ @ + / \ @ + ( P )@ + \_/ @@ + _ @ + / \ @ + ( Q )@ + \_/ @@ + _ @ + / \ @ + ( R )@ + \_/ @@ + _ @ + / \ @ + ( S )@ + \_/ @@ + _ @ + / \ @ + ( T )@ + \_/ @@ + _ @ + / \ @ + ( U )@ + \_/ @@ + _ @ + / \ @ + ( V )@ + \_/ @@ + _ @ + / \ @ + ( W )@ + \_/ @@ + _ @ + / \ @ + ( X )@ + \_/ @@ + _ @ + / \ @ + ( Y )@ + \_/ @@ + _ @ + / \ @ + ( Z )@ + \_/ @@ + _ @ + / \ @ + ( [ )@ + \_/ @@ + _ @ + / \ @ + ( \ )@ + \_/ @@ + _ @ + / \ @ + ( ] )@ + \_/ @@ + _ @ + / \ @ + ( ^ )@ + \_/ @@ + _ @ + / \ @ + ( _ )@ + \_/ @@ + _ @ + / \ @ + ( ` )@ + \_/ @@ + _ @ + / \ @ + ( a )@ + \_/ @@ + _ @ + / \ @ + ( b )@ + \_/ @@ + _ @ + / \ @ + ( c )@ + \_/ @@ + _ @ + / \ @ + ( d )@ + \_/ @@ + _ @ + / \ @ + ( e )@ + \_/ @@ + _ @ + / \ @ + ( f )@ + \_/ @@ + _ @ + / \ @ + ( g )@ + \_/ @@ + _ @ + / \ @ + ( h )@ + \_/ @@ + _ @ + / \ @ + ( i )@ + \_/ @@ + _ @ + / \ @ + ( j )@ + \_/ @@ + _ @ + / \ @ + ( k )@ + \_/ @@ + _ @ + / \ @ + ( l )@ + \_/ @@ + _ @ + / \ @ + ( m )@ + \_/ @@ + _ @ + / \ @ + ( n )@ + \_/ @@ + _ @ + / \ @ + ( o )@ + \_/ @@ + _ @ + / \ @ + ( p )@ + \_/ @@ + _ @ + / \ @ + ( q )@ + \_/ @@ + _ @ + / \ @ + ( r )@ + \_/ @@ + _ @ + / \ @ + ( s )@ + \_/ @@ + _ @ + / \ @ + ( t )@ + \_/ @@ + _ @ + / \ @ + ( u )@ + \_/ @@ + _ @ + / \ @ + ( v )@ + \_/ @@ + _ @ + / \ @ + ( w )@ + \_/ @@ + _ @ + / \ @ + ( x )@ + \_/ @@ + _ @ + / \ @ + ( y )@ + \_/ @@ + _ @ + / \ @ + ( z )@ + \_/ @@ + _ @ + / \ @ + ( { )@ + \_/ @@ + _ @ + / \ @ + ( | )@ + \_/ @@ + _ @ + / \ @ + ( } )@ + \_/ @@ + _ @ + / \ @ + ( ~ )@ + \_/ @@ + _ @ + / \ @ + ( � )@ + \_/ @@ + _ @ + / \ @ + ( � )@ + \_/ @@ + _ @ + / \ @ + ( � )@ + \_/ @@ + _ @ + / \ @ + ( � )@ + \_/ @@ + _ @ + / \ @ + ( � )@ + \_/ @@ + _ @ + / \ @ + ( � )@ + \_/ @@ + _ @ + / \ @ + ( � )@ + \_/ @@ +128 + _ @ + / \ @ + ( � )@ + \_/ @@ +129 + _ @ + / \ @ + ( � )@ + \_/ @@ +130 + _ @ + / \ @ + ( � )@ + \_/ @@ +131 + _ @ + / \ @ + ( � )@ + \_/ @@ +132 + _ @ + / \ @ + ( � )@ + \_/ @@ +133 + _ @ + / \ @ + ( � )@ + \_/ @@ +134 + _ @ + / \ @ + ( � )@ + \_/ @@ +135 + _ @ + / \ @ + ( � )@ + \_/ @@ +136 + _ @ + / \ @ + ( � )@ + \_/ @@ +137 + _ @ + / \ @ + ( � )@ + \_/ @@ +138 + _ @ + / \ @ + ( � )@ + \_/ @@ +139 + _ @ + / \ @ + ( � )@ + \_/ @@ +140 + _ @ + / \ @ + ( � )@ + \_/ @@ +141 + _ @ + / \ @ + ( � )@ + \_/ @@ +142 + _ @ + / \ @ + ( � )@ + \_/ @@ +143 + _ @ + / \ @ + ( � )@ + \_/ @@ +144 + _ @ + / \ @ + ( � )@ + \_/ @@ +145 + _ @ + / \ @ + ( � )@ + \_/ @@ +146 + _ @ + / \ @ + ( � )@ + \_/ @@ +147 + _ @ + / \ @ + ( � )@ + \_/ @@ +148 + _ @ + / \ @ + ( � )@ + \_/ @@ +149 + _ @ + / \ @ + ( � )@ + \_/ @@ +150 + _ @ + / \ @ + ( � )@ + \_/ @@ +151 + _ @ + / \ @ + ( � )@ + \_/ @@ +152 + _ @ + / \ @ + ( � )@ + \_/ @@ +153 + _ @ + / \ @ + ( � )@ + \_/ @@ +154 + _ @ + / \ @ + ( � )@ + \_/ @@ +155 + _ @ + / \ @ + ( � )@ + \_/ @@ +156 + _ @ + / \ @ + ( � )@ + \_/ @@ +157 + _ @ + / \ @ + ( � )@ + \_/ @@ +158 + _ @ + / \ @ + ( � )@ + \_/ @@ +159 + _ @ + / \ @ + ( � )@ + \_/ @@ +160 NO-BREAK SPACE + _ @ + / \ @ + ( � )@ + \_/ @@ +161 INVERTED EXCLAMATION MARK + _ @ + / \ @ + ( � )@ + \_/ @@ +162 CENT SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +163 POUND SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +164 CURRENCY SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +165 YEN SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +166 BROKEN BAR + _ @ + / \ @ + ( � )@ + \_/ @@ +167 SECTION SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +168 DIAERESIS + _ @ + / \ @ + ( � )@ + \_/ @@ +169 COPYRIGHT SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +170 FEMININE ORDINAL INDICATOR + _ @ + / \ @ + ( � )@ + \_/ @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + _ @ + / \ @ + ( � )@ + \_/ @@ +172 NOT SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +173 SOFT HYPHEN + _ @ + / \ @ + ( � )@ + \_/ @@ +174 REGISTERED SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +175 MACRON + _ @ + / \ @ + ( � )@ + \_/ @@ +176 DEGREE SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +177 PLUS-MINUS SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +178 SUPERSCRIPT TWO + _ @ + / \ @ + ( � )@ + \_/ @@ +179 SUPERSCRIPT THREE + _ @ + / \ @ + ( � )@ + \_/ @@ +180 ACUTE ACCENT + _ @ + / \ @ + ( � )@ + \_/ @@ +181 MICRO SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +182 PILCROW SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +183 MIDDLE DOT + _ @ + / \ @ + ( � )@ + \_/ @@ +184 CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +185 SUPERSCRIPT ONE + _ @ + / \ @ + ( � )@ + \_/ @@ +186 MASCULINE ORDINAL INDICATOR + _ @ + / \ @ + ( � )@ + \_/ @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + _ @ + / \ @ + ( � )@ + \_/ @@ +188 VULGAR FRACTION ONE QUARTER + _ @ + / \ @ + ( � )@ + \_/ @@ +189 VULGAR FRACTION ONE HALF + _ @ + / \ @ + ( � )@ + \_/ @@ +190 VULGAR FRACTION THREE QUARTERS + _ @ + / \ @ + ( � )@ + \_/ @@ +191 INVERTED QUESTION MARK + _ @ + / \ @ + ( � )@ + \_/ @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + _ @ + / \ @ + ( � )@ + \_/ @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +195 LATIN CAPITAL LETTER A WITH TILDE + _ @ + / \ @ + ( � )@ + \_/ @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ @ + / \ @ + ( � )@ + \_/ @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +198 LATIN CAPITAL LETTER AE + _ @ + / \ @ + ( � )@ + \_/ @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + _ @ + / \ @ + ( � )@ + \_/ @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ @ + / \ @ + ( � )@ + \_/ @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + _ @ + / \ @ + ( � )@ + \_/ @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ @ + / \ @ + ( � )@ + \_/ @@ +208 LATIN CAPITAL LETTER ETH + _ @ + / \ @ + ( � )@ + \_/ @@ +209 LATIN CAPITAL LETTER N WITH TILDE + _ @ + / \ @ + ( � )@ + \_/ @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + _ @ + / \ @ + ( � )@ + \_/ @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +213 LATIN CAPITAL LETTER O WITH TILDE + _ @ + / \ @ + ( � )@ + \_/ @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ @ + / \ @ + ( � )@ + \_/ @@ +215 MULTIPLICATION SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _ @ + / \ @ + ( � )@ + \_/ @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + _ @ + / \ @ + ( � )@ + \_/ @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ @ + / \ @ + ( � )@ + \_/ @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +222 LATIN CAPITAL LETTER THORN + _ @ + / \ @ + ( � )@ + \_/ @@ +223 LATIN SMALL LETTER SHARP S + _ @ + / \ @ + ( � )@ + \_/ @@ +224 LATIN SMALL LETTER A WITH GRAVE + _ @ + / \ @ + ( � )@ + \_/ @@ +225 LATIN SMALL LETTER A WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +227 LATIN SMALL LETTER A WITH TILDE + _ @ + / \ @ + ( � )@ + \_/ @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ @ + / \ @ + ( � )@ + \_/ @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +230 LATIN SMALL LETTER AE + _ @ + / \ @ + ( � )@ + \_/ @@ +231 LATIN SMALL LETTER C WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +232 LATIN SMALL LETTER E WITH GRAVE + _ @ + / \ @ + ( � )@ + \_/ @@ +233 LATIN SMALL LETTER E WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ @ + / \ @ + ( � )@ + \_/ @@ +236 LATIN SMALL LETTER I WITH GRAVE + _ @ + / \ @ + ( � )@ + \_/ @@ +237 LATIN SMALL LETTER I WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ @ + / \ @ + ( � )@ + \_/ @@ +240 LATIN SMALL LETTER ETH + _ @ + / \ @ + ( � )@ + \_/ @@ +241 LATIN SMALL LETTER N WITH TILDE + _ @ + / \ @ + ( � )@ + \_/ @@ +242 LATIN SMALL LETTER O WITH GRAVE + _ @ + / \ @ + ( � )@ + \_/ @@ +243 LATIN SMALL LETTER O WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +245 LATIN SMALL LETTER O WITH TILDE + _ @ + / \ @ + ( � )@ + \_/ @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ @ + / \ @ + ( � )@ + \_/ @@ +247 DIVISION SIGN + _ @ + / \ @ + ( � )@ + \_/ @@ +248 LATIN SMALL LETTER O WITH STROKE + _ @ + / \ @ + ( � )@ + \_/ @@ +249 LATIN SMALL LETTER U WITH GRAVE + _ @ + / \ @ + ( � )@ + \_/ @@ +250 LATIN SMALL LETTER U WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ @ + / \ @ + ( � )@ + \_/ @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +254 LATIN SMALL LETTER THORN + _ @ + / \ @ + ( � )@ + \_/ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0101 LATIN SMALL LETTER A WITH MACRON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0103 LATIN SMALL LETTER A WITH BREVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0105 LATIN SMALL LETTER A WITH OGONEK + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0107 LATIN SMALL LETTER C WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x010B LATIN SMALL LETTER C WITH DOT ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x010C LATIN CAPITAL LETTER C WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x010D LATIN SMALL LETTER C WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x010E LATIN CAPITAL LETTER D WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x010F LATIN SMALL LETTER D WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0111 LATIN SMALL LETTER D WITH STROKE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0113 LATIN SMALL LETTER E WITH MACRON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0119 LATIN SMALL LETTER E WITH OGONEK + _ @ + / \ @ + ( � )@ + \_/ @@ +0x011A LATIN CAPITAL LETTER E WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x011B LATIN SMALL LETTER E WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +0x011E LATIN CAPITAL LETTER G WITH BREVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x011F LATIN SMALL LETTER G WITH BREVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0127 LATIN SMALL LETTER H WITH STROKE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0129 LATIN SMALL LETTER I WITH TILDE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x012A LATIN CAPITAL LETTER I WITH MACRON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x012B LATIN SMALL LETTER I WITH MACRON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x012E LATIN CAPITAL LETTER I WITH OGONEK + _ @ + / \ @ + ( � )@ + \_/ @@ +0x012F LATIN SMALL LETTER I WITH OGONEK + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0131 LATIN SMALL LETTER DOTLESS I + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0138 LATIN SMALL LETTER KRA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x013A LATIN SMALL LETTER L WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x013B LATIN CAPITAL LETTER L WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x013C LATIN SMALL LETTER L WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x013D LATIN CAPITAL LETTER L WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x013E LATIN SMALL LETTER L WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0142 LATIN SMALL LETTER L WITH STROKE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0144 LATIN SMALL LETTER N WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0147 LATIN CAPITAL LETTER N WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0148 LATIN SMALL LETTER N WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x014A LATIN CAPITAL LETTER ENG + _ @ + / \ @ + ( � )@ + \_/ @@ +0x014B LATIN SMALL LETTER ENG + _ @ + / \ @ + ( � )@ + \_/ @@ +0x014C LATIN CAPITAL LETTER O WITH MACRON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x014D LATIN SMALL LETTER O WITH MACRON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0155 LATIN SMALL LETTER R WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0158 LATIN CAPITAL LETTER R WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0159 LATIN SMALL LETTER R WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x015A LATIN CAPITAL LETTER S WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x015B LATIN SMALL LETTER S WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX + _ @ + / \ @ + ( � )@ + \_/ @@ +0x015E LATIN CAPITAL LETTER S WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x015F LATIN SMALL LETTER S WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0160 LATIN CAPITAL LETTER S WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0161 LATIN SMALL LETTER S WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0164 LATIN CAPITAL LETTER T WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0165 LATIN SMALL LETTER T WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0167 LATIN SMALL LETTER T WITH STROKE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0169 LATIN SMALL LETTER U WITH TILDE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x016A LATIN CAPITAL LETTER U WITH MACRON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x016B LATIN SMALL LETTER U WITH MACRON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x016C LATIN CAPITAL LETTER U WITH BREVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x016D LATIN SMALL LETTER U WITH BREVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x016E LATIN CAPITAL LETTER U WITH RING ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x016F LATIN SMALL LETTER U WITH RING ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0173 LATIN SMALL LETTER U WITH OGONEK + _ @ + / \ @ + ( � )@ + \_/ @@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x017A LATIN SMALL LETTER Z WITH ACUTE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x017C LATIN SMALL LETTER Z WITH DOT ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x017D LATIN CAPITAL LETTER Z WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x017E LATIN SMALL LETTER Z WITH CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x02C7 CARON + _ @ + / \ @ + ( � )@ + \_/ @@ +0x02D8 BREVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x02D9 DOT ABOVE + _ @ + / \ @ + ( � )@ + \_/ @@ +0x02DB OGONEK + _ @ + / \ @ + ( � )@ + \_/ @@ +0x02DD DOUBLE ACUTE ACCENT + _ @ + / \ @ + ( � )@ + \_/ @@ diff --git a/externals/figlet/fonts/digital.flf b/externals/figlet/fonts/digital.flf new file mode 100644 index 0000000000..6b7a1cabbf --- /dev/null +++ b/externals/figlet/fonts/digital.flf @@ -0,0 +1,1286 @@ +flf2a 3 2 6 1 11 0 16513 242 +Digital by Glenn Chappell 1/94 -- based on Bubble +Includes characters 128-255 +Enhanced for Latin-2,3,4 by John Cowan +Latin character sets supported only if your screen font does +figlet release 2.2 -- November 1996 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + @ + @ + @@ + +-+@ + |!|@ + +-+@@ + +-+@ + |"|@ + +-+@@ + +-+@ + |#|@ + +-+@@ + +-+@ + |$|@ + +-+@@ + +-+@ + |%|@ + +-+@@ + +-+@ + |&|@ + +-+@@ + +-+@ + |'|@ + +-+@@ + +-+@ + |(|@ + +-+@@ + +-+@ + |)|@ + +-+@@ + +-+@ + |*|@ + +-+@@ + +-+@ + |+|@ + +-+@@ + +-+@ + |,|@ + +-+@@ + +-+@ + |-|@ + +-+@@ + +-+@ + |.|@ + +-+@@ + +-+@ + |/|@ + +-+@@ + +-+@ + |0|@ + +-+@@ + +-+@ + |1|@ + +-+@@ + +-+@ + |2|@ + +-+@@ + +-+@ + |3|@ + +-+@@ + +-+@ + |4|@ + +-+@@ + +-+@ + |5|@ + +-+@@ + +-+@ + |6|@ + +-+@@ + +-+@ + |7|@ + +-+@@ + +-+@ + |8|@ + +-+@@ + +-+@ + |9|@ + +-+@@ + +-+@ + |:|@ + +-+@@ + +-+@ + |;|@ + +-+@@ + +-+@ + |<|@ + +-+@@ + +-+@ + |=|@ + +-+@@ + +-+@ + |>|@ + +-+@@ + +-+@ + |?|@ + +-+@@ + +-+@ + |@|@ + +-+@@ + +-+@ + |A|@ + +-+@@ + +-+@ + |B|@ + +-+@@ + +-+@ + |C|@ + +-+@@ + +-+@ + |D|@ + +-+@@ + +-+@ + |E|@ + +-+@@ + +-+@ + |F|@ + +-+@@ + +-+@ + |G|@ + +-+@@ + +-+@ + |H|@ + +-+@@ + +-+@ + |I|@ + +-+@@ + +-+@ + |J|@ + +-+@@ + +-+@ + |K|@ + +-+@@ + +-+@ + |L|@ + +-+@@ + +-+@ + |M|@ + +-+@@ + +-+@ + |N|@ + +-+@@ + +-+@ + |O|@ + +-+@@ + +-+@ + |P|@ + +-+@@ + +-+@ + |Q|@ + +-+@@ + +-+@ + |R|@ + +-+@@ + +-+@ + |S|@ + +-+@@ + +-+@ + |T|@ + +-+@@ + +-+@ + |U|@ + +-+@@ + +-+@ + |V|@ + +-+@@ + +-+@ + |W|@ + +-+@@ + +-+@ + |X|@ + +-+@@ + +-+@ + |Y|@ + +-+@@ + +-+@ + |Z|@ + +-+@@ + +-+@ + |[|@ + +-+@@ + +-+@ + |\|@ + +-+@@ + +-+@ + |]|@ + +-+@@ + +-+@ + |^|@ + +-+@@ + +-+@ + |_|@ + +-+@@ + +-+@ + |`|@ + +-+@@ + +-+@ + |a|@ + +-+@@ + +-+@ + |b|@ + +-+@@ + +-+@ + |c|@ + +-+@@ + +-+@ + |d|@ + +-+@@ + +-+@ + |e|@ + +-+@@ + +-+@ + |f|@ + +-+@@ + +-+@ + |g|@ + +-+@@ + +-+@ + |h|@ + +-+@@ + +-+@ + |i|@ + +-+@@ + +-+@ + |j|@ + +-+@@ + +-+@ + |k|@ + +-+@@ + +-+@ + |l|@ + +-+@@ + +-+@ + |m|@ + +-+@@ + +-+@ + |n|@ + +-+@@ + +-+@ + |o|@ + +-+@@ + +-+@ + |p|@ + +-+@@ + +-+@ + |q|@ + +-+@@ + +-+@ + |r|@ + +-+@@ + +-+@ + |s|@ + +-+@@ + +-+@ + |t|@ + +-+@@ + +-+@ + |u|@ + +-+@@ + +-+@ + |v|@ + +-+@@ + +-+@ + |w|@ + +-+@@ + +-+@ + |x|@ + +-+@@ + +-+@ + |y|@ + +-+@@ + +-+@ + |z|@ + +-+@@ + +-+@ + |{|@ + +-+@@ + +-+@ + |||@ + +-+@@ + +-+@ + |}|@ + +-+@@ + +-+@ + |~|@ + +-+@@ + +-+@ + |�|@ + +-+@@ + +-+@ + |�|@ + +-+@@ + +-+@ + |�|@ + +-+@@ + +-+@ + |�|@ + +-+@@ + +-+@ + |�|@ + +-+@@ + +-+@ + |�|@ + +-+@@ + +-+@ + |�|@ + +-+@@ +128 + +-+@ + |�|@ + +-+@@ +129 + +-+@ + |�|@ + +-+@@ +130 + +-+@ + |�|@ + +-+@@ +131 + +-+@ + |�|@ + +-+@@ +132 + +-+@ + |�|@ + +-+@@ +133 + +-+@ + |�|@ + +-+@@ +134 + +-+@ + |�|@ + +-+@@ +135 + +-+@ + |�|@ + +-+@@ +136 + +-+@ + |�|@ + +-+@@ +137 + +-+@ + |�|@ + +-+@@ +138 + +-+@ + |�|@ + +-+@@ +139 + +-+@ + |�|@ + +-+@@ +140 + +-+@ + |�|@ + +-+@@ +141 + +-+@ + |�|@ + +-+@@ +142 + +-+@ + |�|@ + +-+@@ +143 + +-+@ + |�|@ + +-+@@ +144 + +-+@ + |�|@ + +-+@@ +145 + +-+@ + |�|@ + +-+@@ +146 + +-+@ + |�|@ + +-+@@ +147 + +-+@ + |�|@ + +-+@@ +148 + +-+@ + |�|@ + +-+@@ +149 + +-+@ + |�|@ + +-+@@ +150 + +-+@ + |�|@ + +-+@@ +151 + +-+@ + |�|@ + +-+@@ +152 + +-+@ + |�|@ + +-+@@ +153 + +-+@ + |�|@ + +-+@@ +154 + +-+@ + |�|@ + +-+@@ +155 + +-+@ + |�|@ + +-+@@ +156 + +-+@ + |�|@ + +-+@@ +157 + +-+@ + |�|@ + +-+@@ +158 + +-+@ + |�|@ + +-+@@ +159 + +-+@ + |�|@ + +-+@@ +160 NO-BREAK SPACE + +-+@ + |�|@ + +-+@@ +161 INVERTED EXCLAMATION MARK + +-+@ + |�|@ + +-+@@ +162 CENT SIGN + +-+@ + |�|@ + +-+@@ +163 POUND SIGN + +-+@ + |�|@ + +-+@@ +164 CURRENCY SIGN + +-+@ + |�|@ + +-+@@ +165 YEN SIGN + +-+@ + |�|@ + +-+@@ +166 BROKEN BAR + +-+@ + |�|@ + +-+@@ +167 SECTION SIGN + +-+@ + |�|@ + +-+@@ +168 DIAERESIS + +-+@ + |�|@ + +-+@@ +169 COPYRIGHT SIGN + +-+@ + |�|@ + +-+@@ +170 FEMININE ORDINAL INDICATOR + +-+@ + |�|@ + +-+@@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + +-+@ + |�|@ + +-+@@ +172 NOT SIGN + +-+@ + |�|@ + +-+@@ +173 SOFT HYPHEN + +-+@ + |�|@ + +-+@@ +174 REGISTERED SIGN + +-+@ + |�|@ + +-+@@ +175 MACRON + +-+@ + |�|@ + +-+@@ +176 DEGREE SIGN + +-+@ + |�|@ + +-+@@ +177 PLUS-MINUS SIGN + +-+@ + |�|@ + +-+@@ +178 SUPERSCRIPT TWO + +-+@ + |�|@ + +-+@@ +179 SUPERSCRIPT THREE + +-+@ + |�|@ + +-+@@ +180 ACUTE ACCENT + +-+@ + |�|@ + +-+@@ +181 MICRO SIGN + +-+@ + |�|@ + +-+@@ +182 PILCROW SIGN + +-+@ + |�|@ + +-+@@ +183 MIDDLE DOT + +-+@ + |�|@ + +-+@@ +184 CEDILLA + +-+@ + |�|@ + +-+@@ +185 SUPERSCRIPT ONE + +-+@ + |�|@ + +-+@@ +186 MASCULINE ORDINAL INDICATOR + +-+@ + |�|@ + +-+@@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + +-+@ + |�|@ + +-+@@ +188 VULGAR FRACTION ONE QUARTER + +-+@ + |�|@ + +-+@@ +189 VULGAR FRACTION ONE HALF + +-+@ + |�|@ + +-+@@ +190 VULGAR FRACTION THREE QUARTERS + +-+@ + |�|@ + +-+@@ +191 INVERTED QUESTION MARK + +-+@ + |�|@ + +-+@@ +192 LATIN CAPITAL LETTER A WITH GRAVE + +-+@ + |�|@ + +-+@@ +193 LATIN CAPITAL LETTER A WITH ACUTE + +-+@ + |�|@ + +-+@@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +195 LATIN CAPITAL LETTER A WITH TILDE + +-+@ + |�|@ + +-+@@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + +-+@ + |�|@ + +-+@@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + +-+@ + |�|@ + +-+@@ +198 LATIN CAPITAL LETTER AE + +-+@ + |�|@ + +-+@@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + +-+@ + |�|@ + +-+@@ +200 LATIN CAPITAL LETTER E WITH GRAVE + +-+@ + |�|@ + +-+@@ +201 LATIN CAPITAL LETTER E WITH ACUTE + +-+@ + |�|@ + +-+@@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + +-+@ + |�|@ + +-+@@ +204 LATIN CAPITAL LETTER I WITH GRAVE + +-+@ + |�|@ + +-+@@ +205 LATIN CAPITAL LETTER I WITH ACUTE + +-+@ + |�|@ + +-+@@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + +-+@ + |�|@ + +-+@@ +208 LATIN CAPITAL LETTER ETH + +-+@ + |�|@ + +-+@@ +209 LATIN CAPITAL LETTER N WITH TILDE + +-+@ + |�|@ + +-+@@ +210 LATIN CAPITAL LETTER O WITH GRAVE + +-+@ + |�|@ + +-+@@ +211 LATIN CAPITAL LETTER O WITH ACUTE + +-+@ + |�|@ + +-+@@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +213 LATIN CAPITAL LETTER O WITH TILDE + +-+@ + |�|@ + +-+@@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + +-+@ + |�|@ + +-+@@ +215 MULTIPLICATION SIGN + +-+@ + |�|@ + +-+@@ +216 LATIN CAPITAL LETTER O WITH STROKE + +-+@ + |�|@ + +-+@@ +217 LATIN CAPITAL LETTER U WITH GRAVE + +-+@ + |�|@ + +-+@@ +218 LATIN CAPITAL LETTER U WITH ACUTE + +-+@ + |�|@ + +-+@@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + +-+@ + |�|@ + +-+@@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + +-+@ + |�|@ + +-+@@ +222 LATIN CAPITAL LETTER THORN + +-+@ + |�|@ + +-+@@ +223 LATIN SMALL LETTER SHARP S + +-+@ + |�|@ + +-+@@ +224 LATIN SMALL LETTER A WITH GRAVE + +-+@ + |�|@ + +-+@@ +225 LATIN SMALL LETTER A WITH ACUTE + +-+@ + |�|@ + +-+@@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +227 LATIN SMALL LETTER A WITH TILDE + +-+@ + |�|@ + +-+@@ +228 LATIN SMALL LETTER A WITH DIAERESIS + +-+@ + |�|@ + +-+@@ +229 LATIN SMALL LETTER A WITH RING ABOVE + +-+@ + |�|@ + +-+@@ +230 LATIN SMALL LETTER AE + +-+@ + |�|@ + +-+@@ +231 LATIN SMALL LETTER C WITH CEDILLA + +-+@ + |�|@ + +-+@@ +232 LATIN SMALL LETTER E WITH GRAVE + +-+@ + |�|@ + +-+@@ +233 LATIN SMALL LETTER E WITH ACUTE + +-+@ + |�|@ + +-+@@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +235 LATIN SMALL LETTER E WITH DIAERESIS + +-+@ + |�|@ + +-+@@ +236 LATIN SMALL LETTER I WITH GRAVE + +-+@ + |�|@ + +-+@@ +237 LATIN SMALL LETTER I WITH ACUTE + +-+@ + |�|@ + +-+@@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +239 LATIN SMALL LETTER I WITH DIAERESIS + +-+@ + |�|@ + +-+@@ +240 LATIN SMALL LETTER ETH + +-+@ + |�|@ + +-+@@ +241 LATIN SMALL LETTER N WITH TILDE + +-+@ + |�|@ + +-+@@ +242 LATIN SMALL LETTER O WITH GRAVE + +-+@ + |�|@ + +-+@@ +243 LATIN SMALL LETTER O WITH ACUTE + +-+@ + |�|@ + +-+@@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +245 LATIN SMALL LETTER O WITH TILDE + +-+@ + |�|@ + +-+@@ +246 LATIN SMALL LETTER O WITH DIAERESIS + +-+@ + |�|@ + +-+@@ +247 DIVISION SIGN + +-+@ + |�|@ + +-+@@ +248 LATIN SMALL LETTER O WITH STROKE + +-+@ + |�|@ + +-+@@ +249 LATIN SMALL LETTER U WITH GRAVE + +-+@ + |�|@ + +-+@@ +250 LATIN SMALL LETTER U WITH ACUTE + +-+@ + |�|@ + +-+@@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +252 LATIN SMALL LETTER U WITH DIAERESIS + +-+@ + |�|@ + +-+@@ +253 LATIN SMALL LETTER Y WITH ACUTE + +-+@ + |�|@ + +-+@@ +254 LATIN SMALL LETTER THORN + +-+@ + |�|@ + +-+@@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + +-+@ + |�|@ + +-+@@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON + +-+@ + |�|@ + +-+@@ +0x0101 LATIN SMALL LETTER A WITH MACRON + +-+@ + |�|@ + +-+@@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE + +-+@ + |�|@ + +-+@@ +0x0103 LATIN SMALL LETTER A WITH BREVE + +-+@ + |�|@ + +-+@@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK + +-+@ + |�|@ + +-+@@ +0x0105 LATIN SMALL LETTER A WITH OGONEK + +-+@ + |�|@ + +-+@@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE + +-+@ + |�|@ + +-+@@ +0x0107 LATIN SMALL LETTER C WITH ACUTE + +-+@ + |�|@ + +-+@@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE + +-+@ + |�|@ + +-+@@ +0x010B LATIN SMALL LETTER C WITH DOT ABOVE + +-+@ + |�|@ + +-+@@ +0x010C LATIN CAPITAL LETTER C WITH CARON + +-+@ + |�|@ + +-+@@ +0x010D LATIN SMALL LETTER C WITH CARON + +-+@ + |�|@ + +-+@@ +0x010E LATIN CAPITAL LETTER D WITH CARON + +-+@ + |�|@ + +-+@@ +0x010F LATIN SMALL LETTER D WITH CARON + +-+@ + |�|@ + +-+@@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE + +-+@ + |�|@ + +-+@@ +0x0111 LATIN SMALL LETTER D WITH STROKE + +-+@ + |�|@ + +-+@@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON + +-+@ + |�|@ + +-+@@ +0x0113 LATIN SMALL LETTER E WITH MACRON + +-+@ + |�|@ + +-+@@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE + +-+@ + |�|@ + +-+@@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE + +-+@ + |�|@ + +-+@@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK + +-+@ + |�|@ + +-+@@ +0x0119 LATIN SMALL LETTER E WITH OGONEK + +-+@ + |�|@ + +-+@@ +0x011A LATIN CAPITAL LETTER E WITH CARON + +-+@ + |�|@ + +-+@@ +0x011B LATIN SMALL LETTER E WITH CARON + +-+@ + |�|@ + +-+@@ +0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +0x011E LATIN CAPITAL LETTER G WITH BREVE + +-+@ + |�|@ + +-+@@ +0x011F LATIN SMALL LETTER G WITH BREVE + +-+@ + |�|@ + +-+@@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE + +-+@ + |�|@ + +-+@@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE + +-+@ + |�|@ + +-+@@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE + +-+@ + |�|@ + +-+@@ +0x0127 LATIN SMALL LETTER H WITH STROKE + +-+@ + |�|@ + +-+@@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE + +-+@ + |�|@ + +-+@@ +0x0129 LATIN SMALL LETTER I WITH TILDE + +-+@ + |�|@ + +-+@@ +0x012A LATIN CAPITAL LETTER I WITH MACRON + +-+@ + |�|@ + +-+@@ +0x012B LATIN SMALL LETTER I WITH MACRON + +-+@ + |�|@ + +-+@@ +0x012E LATIN CAPITAL LETTER I WITH OGONEK + +-+@ + |�|@ + +-+@@ +0x012F LATIN SMALL LETTER I WITH OGONEK + +-+@ + |�|@ + +-+@@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE + +-+@ + |�|@ + +-+@@ +0x0131 LATIN SMALL LETTER DOTLESS I + +-+@ + |�|@ + +-+@@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x0138 LATIN SMALL LETTER KRA + +-+@ + |�|@ + +-+@@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE + +-+@ + |�|@ + +-+@@ +0x013A LATIN SMALL LETTER L WITH ACUTE + +-+@ + |�|@ + +-+@@ +0x013B LATIN CAPITAL LETTER L WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x013C LATIN SMALL LETTER L WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x013D LATIN CAPITAL LETTER L WITH CARON + +-+@ + |�|@ + +-+@@ +0x013E LATIN SMALL LETTER L WITH CARON + +-+@ + |�|@ + +-+@@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE + +-+@ + |�|@ + +-+@@ +0x0142 LATIN SMALL LETTER L WITH STROKE + +-+@ + |�|@ + +-+@@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE + +-+@ + |�|@ + +-+@@ +0x0144 LATIN SMALL LETTER N WITH ACUTE + +-+@ + |�|@ + +-+@@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x0147 LATIN CAPITAL LETTER N WITH CARON + +-+@ + |�|@ + +-+@@ +0x0148 LATIN SMALL LETTER N WITH CARON + +-+@ + |�|@ + +-+@@ +0x014A LATIN CAPITAL LETTER ENG + +-+@ + |�|@ + +-+@@ +0x014B LATIN SMALL LETTER ENG + +-+@ + |�|@ + +-+@@ +0x014C LATIN CAPITAL LETTER O WITH MACRON + +-+@ + |�|@ + +-+@@ +0x014D LATIN SMALL LETTER O WITH MACRON + +-+@ + |�|@ + +-+@@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + +-+@ + |�|@ + +-+@@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE + +-+@ + |�|@ + +-+@@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE + +-+@ + |�|@ + +-+@@ +0x0155 LATIN SMALL LETTER R WITH ACUTE + +-+@ + |�|@ + +-+@@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x0158 LATIN CAPITAL LETTER R WITH CARON + +-+@ + |�|@ + +-+@@ +0x0159 LATIN SMALL LETTER R WITH CARON + +-+@ + |�|@ + +-+@@ +0x015A LATIN CAPITAL LETTER S WITH ACUTE + +-+@ + |�|@ + +-+@@ +0x015B LATIN SMALL LETTER S WITH ACUTE + +-+@ + |�|@ + +-+@@ +0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX + +-+@ + |�|@ + +-+@@ +0x015E LATIN CAPITAL LETTER S WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x015F LATIN SMALL LETTER S WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x0160 LATIN CAPITAL LETTER S WITH CARON + +-+@ + |�|@ + +-+@@ +0x0161 LATIN SMALL LETTER S WITH CARON + +-+@ + |�|@ + +-+@@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA + +-+@ + |�|@ + +-+@@ +0x0164 LATIN CAPITAL LETTER T WITH CARON + +-+@ + |�|@ + +-+@@ +0x0165 LATIN SMALL LETTER T WITH CARON + +-+@ + |�|@ + +-+@@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE + +-+@ + |�|@ + +-+@@ +0x0167 LATIN SMALL LETTER T WITH STROKE + +-+@ + |�|@ + +-+@@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE + +-+@ + |�|@ + +-+@@ +0x0169 LATIN SMALL LETTER U WITH TILDE + +-+@ + |�|@ + +-+@@ +0x016A LATIN CAPITAL LETTER U WITH MACRON + +-+@ + |�|@ + +-+@@ +0x016B LATIN SMALL LETTER U WITH MACRON + +-+@ + |�|@ + +-+@@ +0x016C LATIN CAPITAL LETTER U WITH BREVE + +-+@ + |�|@ + +-+@@ +0x016D LATIN SMALL LETTER U WITH BREVE + +-+@ + |�|@ + +-+@@ +0x016E LATIN CAPITAL LETTER U WITH RING ABOVE + +-+@ + |�|@ + +-+@@ +0x016F LATIN SMALL LETTER U WITH RING ABOVE + +-+@ + |�|@ + +-+@@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + +-+@ + |�|@ + +-+@@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE + +-+@ + |�|@ + +-+@@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK + +-+@ + |�|@ + +-+@@ +0x0173 LATIN SMALL LETTER U WITH OGONEK + +-+@ + |�|@ + +-+@@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE + +-+@ + |�|@ + +-+@@ +0x017A LATIN SMALL LETTER Z WITH ACUTE + +-+@ + |�|@ + +-+@@ +0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE + +-+@ + |�|@ + +-+@@ +0x017C LATIN SMALL LETTER Z WITH DOT ABOVE + +-+@ + |�|@ + +-+@@ +0x017D LATIN CAPITAL LETTER Z WITH CARON + +-+@ + |�|@ + +-+@@ +0x017E LATIN SMALL LETTER Z WITH CARON + +-+@ + |�|@ + +-+@@ +0x02C7 CARON + +-+@ + |�|@ + +-+@@ +0x02D8 BREVE + +-+@ + |�|@ + +-+@@ +0x02D9 DOT ABOVE + +-+@ + |�|@ + +-+@@ +0x02DB OGONEK + +-+@ + |�|@ + +-+@@ +0x02DD DOUBLE ACUTE ACCENT + +-+@ + |�|@ + +-+@@ diff --git a/externals/figlet/fonts/frango.flc b/externals/figlet/fonts/frango.flc new file mode 100644 index 0000000000..0196230a2e --- /dev/null +++ b/externals/figlet/fonts/frango.flc @@ -0,0 +1,65 @@ +flc2a +# This file can be used with a Unicode-Greek FIGfont +# to convert "frangovlakhika" (Greek written in Latin +# letters) into real Greek. +# +# The mapping is the same as that used by the "ntgreek" FIGfont. + +t ( \0x02BD +t ) \0x02BC +t : \0x0387 +t A \0x0391 +t B \0x0392 +t C \0x03A7 +t D \0x0394 +t E \0x0395 +t F \0x03A6 +t G \0x0393 +t H \0x0397 +t I \0x0399 +t J \0x03D1 +t K \0x039A +t L \0x039B +t M \0x039C +t N \0x039D +t O \0x039F +t P \0x03A0 +t Q \0x0398 +t R \0x03A1 +t S \0x03A3 +t T \0x03A4 +t U \0x03A5 +t V \0x03C2 sigma +t W \0x03A9 +t X \0x039E +t Y \0x03A8 +t Z \0x0396 +t _ \0x037A +t a \0x03b1 +t b \0x03b2 +t c \0x03C7 +t d \0x03B4 +t e \0x03B5 +t f \0x03C6 +t g \0x03B3 +t h \0x03B7 +t i \0x03B9 +t j \0x03D5 +t k \0x03BA +t l \0x03BB +t m \0x03BC +t n \0x03BD +t o \0x03BF +t p \0x03C0 +t q \0x03B8 +t r \0x03C1 +t s \0x03C3 +t t \0x03C4 +t u \0x03C5 +t v \0x03D6 +t w \0x03C9 +t x \0x03BE +t y \0x03C8 +t z \0x03B6 +t ' \0x00A8 +t ~ \-5 diff --git a/externals/figlet/fonts/hz.flc b/externals/figlet/fonts/hz.flc new file mode 100644 index 0000000000..2d89e4bcf8 --- /dev/null +++ b/externals/figlet/fonts/hz.flc @@ -0,0 +1,4 @@ +flc2a +# Set HZ input mode (a 7-bit encoding of GB Chinese text) +# Meaningful only to FIGlet 2.2 beta 4 or better +h diff --git a/externals/figlet/fonts/ilhebrew.flc b/externals/figlet/fonts/ilhebrew.flc new file mode 100644 index 0000000000..1b46d79563 --- /dev/null +++ b/externals/figlet/fonts/ilhebrew.flc @@ -0,0 +1,38 @@ +flc2a +# implements a natural mapping from the Hebrew keyboard +# to Hebrew letters in the Ivrit font. +# Note that capital letters remain unchanged. + +t t \0x05d0 +t c \0x05d1 +t d \0x05d2 +t s \0x05d3 +t v \0x05d4 +t u \0x05d5 +t z \0x05d6 +t j \0x05d7 +t y \0x05d8 +t h \0x05d9 +t f \0x05db +t l \0x05da +t k \0x05dc +t n \0x05de +t o \0x05dd +t b \0x05e0 +t i \0x05df +t x \0x05e1 +t g \0x05e2 +t p \0x05e3 +t ; \0x05e4 +t m \0x05e6 +t . \0x05e5 +t e \0x05e7 +t r \0x05e8 +t a \0x05e9 +t , \0x05ea +t ' , +t / . +t ` ; +t q / +t w ' +t ~ \-2 diff --git a/externals/figlet/fonts/ivrit.flf b/externals/figlet/fonts/ivrit.flf new file mode 100644 index 0000000000..69f16d4948 --- /dev/null +++ b/externals/figlet/fonts/ivrit.flf @@ -0,0 +1,900 @@ +flf2a$ 6 5 76 15 14 1 16271 39 +Ivrit (Hebrew) Unicode font assembled by John Cowan +Latin chars from Standard by G. Chappell & Ian Chai +Hebrew chars from Jerusalem by Gedaliah Friedenberg + Use "ilhebrew.flc" for Hebrew keyboard mapping + Use "ushebrew.flc" for U.S.-style keyboard mapping ("febrew" script) + Use "8859-8.flc" for ISO 8859-8 text + Or use UTF-8 +WARNING! FIGfonts aren't bidirectional; this is strictly right-to-left + (by default) even for the Latin characters. +figlet release 2.2 -- November 1996 + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + $@ + $@ + $@ + $@ + $@ + $@@ + _ @ + | |@ + | |@ + |_|@ + (_)@ + @@ + _ _ @ + ( | )@ + V V @ + $ @ + $ @ + @@ + _ _ @ + _| || |_ @ + |_ .. _|@ + |_ _|@ + |_||_| @ + @@ + _ @ + | | @ + / __)@ + \__ \@ + ( /@ + |_| @@ + _ __@ + (_)/ /@ + / / @ + / /_ @ + /_/(_)@ + @@ + ___ @ + ( _ ) @ + / _ \/\@ + | (_> <@ + \___/\/@ + @@ + _ @ + ( )@ + |/ @ + $ @ + $ @ + @@ + __@ + / /@ + | | @ + | | @ + | | @ + \_\@@ + __ @ + \ \ @ + | |@ + | |@ + | |@ + /_/ @@ + @ + __/\__@ + \ /@ + /_ _\@ + \/ @ + @@ + @ + _ @ + _| |_ @ + |_ _|@ + |_| @ + @@ + @ + @ + @ + _ @ + ( )@ + |/ @@ + @ + @ + _____ @ + |_____|@ + $ @ + @@ + @ + @ + @ + _ @ + (_)@ + @@ + __@ + / /@ + / / @ + / / @ + /_/ @ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + _ @ + / |@ + | |@ + | |@ + |_|@ + @@ + ____ @ + |___ \ @ + __) |@ + / __/ @ + |_____|@ + @@ + _____ @ + |___ / @ + |_ \ @ + ___) |@ + |____/ @ + @@ + _ _ @ + | || | @ + | || |_ @ + |__ _|@ + |_| @ + @@ + ____ @ + | ___| @ + |___ \ @ + ___) |@ + |____/ @ + @@ + __ @ + / /_ @ + | '_ \ @ + | (_) |@ + \___/ @ + @@ + _____ @ + |___ |@ + / / @ + / / @ + /_/ @ + @@ + ___ @ + ( _ ) @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + ___ @ + / _ \ @ + | (_) |@ + \__, |@ + /_/ @ + @@ + @ + _ @ + (_)@ + _ @ + (_)@ + @@ + @ + _ @ + (_)@ + _ @ + ( )@ + |/ @@ + __@ + / /@ + / / @ + \ \ @ + \_\@ + @@ + @ + _____ @ + |_____|@ + |_____|@ + $ @ + @@ + __ @ + \ \ @ + \ \@ + / /@ + /_/ @ + @@ + ___ @ + |__ \@ + / /@ + |_| @ + (_) @ + @@ + ____ @ + / __ \ @ + / / _` |@ + | | (_| |@ + \ \__,_|@ + \____/ @@ + _ @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @@ + ____ @ + | __ ) @ + | _ \ @ + | |_) |@ + |____/ @ + @@ + ____ @ + / ___|@ + | | @ + | |___ @ + \____|@ + @@ + ____ @ + | _ \ @ + | | | |@ + | |_| |@ + |____/ @ + @@ + _____ @ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @@ + _____ @ + | ___|@ + | |_ @ + | _| @ + |_| @ + @@ + ____ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ + _ _ @ + | | | |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ + ___ @ + |_ _|@ + | | @ + | | @ + |___|@ + @@ + _ @ + | |@ + _ | |@ + | |_| |@ + \___/ @ + @@ + _ __@ + | |/ /@ + | ' / @ + | . \ @ + |_|\_\@ + @@ + _ @ + | | @ + | | @ + | |___ @ + |_____|@ + @@ + __ __ @ + | \/ |@ + | |\/| |@ + | | | |@ + |_| |_|@ + @@ + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + ____ @ + | _ \ @ + | |_) |@ + | __/ @ + |_| @ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \__\_\@ + @@ + ____ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ + ____ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + @@ + _ _ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @@ + __ __@ + \ \ / /@ + \ \ / / @ + \ V / @ + \_/ @ + @@ + __ __@ + \ \ / /@ + \ \ /\ / / @ + \ V V / @ + \_/\_/ @ + @@ + __ __@ + \ \/ /@ + \ / @ + / \ @ + /_/\_\@ + @@ + __ __@ + \ \ / /@ + \ V / @ + | | @ + |_| @ + @@ + _____@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ + __ @ + | _|@ + | | @ + | | @ + | | @ + |__|@@ + __ @ + \ \ @ + \ \ @ + \ \ @ + \_\@ + @@ + __ @ + |_ |@ + | |@ + | |@ + | |@ + |__|@@ + /\ @ + |/\|@ + $ @ + $ @ + $ @ + @@ + @ + @ + @ + @ + _____ @ + |_____|@@ + _ @ + ( )@ + \|@ + $ @ + $ @ + @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ + _ @ + | |__ @ + | '_ \ @ + | |_) |@ + |_.__/ @ + @@ + @ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ + _ @ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ + @ + ___ @ + / _ \@ + | __/@ + \___|@ + @@ + __ @ + / _|@ + | |_ @ + | _|@ + |_| @ + @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ + _ @ + | |__ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ + _ @ + (_)@ + | |@ + | |@ + |_|@ + @@ + _ @ + (_)@ + | |@ + | |@ + _/ |@ + |__/ @@ + _ @ + | | __@ + | |/ /@ + | < @ + |_|\_\@ + @@ + _ @ + | |@ + | |@ + | |@ + |_|@ + @@ + @ + _ __ ___ @ + | '_ ` _ \ @ + | | | | | |@ + |_| |_| |_|@ + @@ + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ + @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + @ + _ __ @ + | '_ \ @ + | |_) |@ + | .__/ @ + |_| @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |_|@@ + @ + _ __ @ + | '__|@ + | | @ + |_| @ + @@ + @ + ___ @ + / __|@ + \__ \@ + |___/@ + @@ + _ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + @@ + @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ + @ + __ __@ + \ \ / /@ + \ V / @ + \_/ @ + @@ + @ + __ __@ + \ \ /\ / /@ + \ V V / @ + \_/\_/ @ + @@ + @ + __ __@ + \ \/ /@ + > < @ + /_/\_\@ + @@ + @ + _ _ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ + @ + ____@ + |_ /@ + / / @ + /___|@ + @@ + __@ + / /@ + | | @ + < < @ + | | @ + \_\@@ + _ @ + | |@ + | |@ + | |@ + | |@ + |_|@@ + __ @ + \ \ @ + | | @ + > >@ + | | @ + /_/ @@ + /\/|@ + |/\/ @ + $ @ + $ @ + $ @ + @@ + _ _ @ + (_)_(_)@ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_)_(_)@ + / _` |@ + | (_| |@ + \__,_|@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + | (_) |@ + \___/ @ + @@ + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__,_|@ + @@ + ___ @ + / _ \@ + | |/ /@ + | |\ \@ + | ||_/@ + |_| @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@ + $@@ +173 SOFT HYPHEN + @ + @ + _____ @ + |_____|@ + $ @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \___/ @ + @@ +223 LATIN SMALL LETTER SHARP S + ___ @ + / _ \@ + | |/ /@ + | |\ \@ + | ||_/@ + |_| @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | (_) |@ + \___/ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x05D0 HEBREW LETTER ALEF + __ __@ + \ \ / /@ + | V / @ + | |\ \ @ + |_| \_\@ + @@ +0x05D1 HEBREW LETTER BET + ______ @ + |____ | @ + | | @ + _____| |_@ + /________/@ + @@ +0x05D2 HEBREW LETTER GIMEL + ____ @ + |__ | @ + | | @ + ____| | @ + /____/\_\@ + @@ +0x05D3 HEBREW LETTER DALET + _______ @ + |____ |@ + | | @ + | | @ + |_| @ + @@ +0x05D4 HEBREW LETTER HE + _______ @ + |_____ |@ + _ | |@ + | | | |@ + |_| |_|@ + @@ +0x05D5 HEBREW LETTER VAV + ___ @ + |_ |@ + | |@ + | |@ + |_|@ + @@ +0x05D6 HEBREW LETTER ZAYIN + ________ @ + \__ __\@ + | | @ + | | @ + |_| @ + @@ +0x05D7 HEBREW LETTER HET + _______ @ + |. __ |@ + | | | |@ + | | | |@ + |_| |_|@ + @@ +0x05D8 HEBREW LETTER TET + __ ___ @ + |. | /_ |@ + | | | |@ + | |___| |@ + |_______|@ + @@ +0x05D9 HEBREW LETTER YOD + ___ @ + |_ |@ + |_|@ + $ @ + $ @ + @@ +0x05DA HEBREW LETTER FINAL KAF + _______ @ + |____ .|@ + | | @ + | | @ + | | @ + |_| @@ +0x05DB HEBREW LETTER KAF + _____ @ + |____ \ @ + | |@ + ____| |@ + |_____/ @ + @@ +0x05DC HEBREW LETTER LAMED + |=|____ @ + |____ |@ + / / @ + / / @ + /_/ @ + @@ +0x05DD HEBREW LETTER FINAL MEM + ________ @ + |. ___ |@ + | | | |@ + | |___| |@ + |_______|@ + @@ +0x05DE HEBREW LETTER MEM + _______ @ + |. __ |@ + | | | |@ + | | _| |@ + |_||___|@ + @@ +0x05DF HEBREW LETTER FINAL NUN + ___ @ + |_ |@ + | |@ + | |@ + | |@ + |_|@@ +0x05E0 HEBREW LETTER NUN + ___ @ + |_ |@ + | |@ + __| |@ + |____|@ + @@ +0x05E1 HEBREW LETTER SAMEKH + _______ @ + |. __ |@ + | | | |@ + | |__/ |@ + |_____/ @ + @@ +0x05E2 HEBREW LETTER AYIN + __ _ @ + \ \ | |@ + \ \| |@ + __\ ` |@ + |______|@ + @@ +0x05E3 HEBREW LETTER FINAL PE + ______ @ + | __ |@ + | |_ | |@ + |___|| |@ + | |@ + |_|@@ +0x05E4 HEBREW LETTER PE + _______ @ + | ___ |@ + \_\ | |@ + _____| |@ + |_______|@ + @@ +0x05E5 HEBREW LETTER FINAL TSADI + __ _ @ + |. | | |@ + | | // @ + | |// @ + | | @ + |_| @@ +0x05E6 HEBREW LETTER TSADI + __ __.@ + \ \ / / @ + \ V / @ + ___\ \ @ + |______| @ + @@ +0x05E7 HEBREW LETTER QOF + ______ @ + |____ |@ + _ | |@ + | | |_|@ + | | @ + |_| @@ +0x05E8 HEBREW LETTER RESH + ______ @ + |____ |@ + | |@ + | |@ + |_|@ + @@ +0x05E9 HEBREW LETTER SHIN + _ _ _ @ + | | | | | |@ + | | | | | |@ + | |/ /_/ / @ + |_______/ @ + @@ +0x05EA HEBREW LETTER TAV + ______ @ + | __ |@ + | | | |@ + _| | | |@ + |___| |_|@ + @@ +0x2721 STAR OF DAVID + @ + __/\__@ + \ /@ + /_ _\@ + \/ @ + @@ +-0x0002 +aleph = t, bet/vet = c, gimel = d, dalet = s, he = v, vav = u, zayin = z @ +het = j, tet = y, yod = h, kaf/chaf = f, final kaf = l, lamed = k, mem = n@ +final mem = o, nun = b, final nun = i, samekh = x, ayin = g, pe/fe = p, @ +final pe = ;, tsadi = m, final tsadi = ., qof = e, resh = r, shin/sin = a @ +tav = , comma = ', period = /, semicolon = `, slash = q, apostrophe = w @ +Star of David = * @@ +-0x0003 +aleph = a, bet/vet = b, gimel = g, dalet = d, he = h, vav = v, zayin = z @ +het = c, tet = t, yod = y, kaf/chaf = k, final kaf = f, lamed = l, mem = m@ +final mem = o, nun = n, final nun = i, samekh = e, ayin = _, pe/fe = p, @ +final pe = u, tsadi = j, final tsadi = w, qof = q, resh = r, shin/sin = s @ +tav = x @ +Star of David = * @@ diff --git a/externals/figlet/fonts/jis0201.flc b/externals/figlet/fonts/jis0201.flc new file mode 100644 index 0000000000..6a32e62ef9 --- /dev/null +++ b/externals/figlet/fonts/jis0201.flc @@ -0,0 +1,249 @@ +# JIS X 0201 (1976) mappings for ISO 2022 usage. + +# Invoke JIS Roman in G0/GL, and JIS Katakana ("halfwidth" katakana, but +# we map it to fullwidth for compatibility with existing fonts) in +# G1/GR. +# +# This means that the Katakana is available in the high bytes, or you +# can use SHIFT OUT (0x1E) to cause the low-value bytes (in the ASCII +# code value range) to invoke Katakana characters (using SHIFT IN (0x1F) +# to switch back). Of course, this being ISO 2022, you can also use the +# escape sequences ESC ( I and ESC ( J to shift it in and out. + +g 0 94 J +g 1 94 I +g L 0 +g R 1 + +# JIS Roman: ISO 646 variant just like ASCII, but with for +# , and for . + +0x4A0020 0x20 +0x4A0021 0x21 +0x4A0022 0x22 +0x4A0023 0x23 +0x4A0024 0x24 +0x4A0025 0x25 +0x4A0026 0x26 +0x4A0027 0x27 +0x4A0028 0x28 +0x4A0029 0x29 +0x4A002A 0x2A +0x4A002B 0x2B +0x4A002C 0x2C +0x4A002D 0x2D +0x4A002E 0x2E +0x4A002F 0x2F +0x4A0030 0x30 +0x4A0031 0x31 +0x4A0032 0x32 +0x4A0033 0x33 +0x4A0034 0x34 +0x4A0035 0x35 +0x4A0036 0x36 +0x4A0037 0x37 +0x4A0038 0x38 +0x4A0039 0x39 +0x4A003A 0x3A +0x4A003B 0x3B +0x4A003C 0x3C +0x4A003D 0x3D +0x4A003E 0x3E +0x4A003F 0x3F +0x4A0040 0x40 +0x4A0041 0x41 +0x4A0042 0x42 +0x4A0043 0x43 +0x4A0044 0x44 +0x4A0045 0x45 +0x4A0046 0x46 +0x4A0047 0x47 +0x4A0048 0x48 +0x4A0049 0x49 +0x4A004A 0x4A +0x4A004B 0x4B +0x4A004C 0x4C +0x4A004D 0x4D +0x4A004E 0x4E +0x4A004F 0x4F +0x4A0050 0x50 +0x4A0051 0x51 +0x4A0052 0x52 +0x4A0053 0x53 +0x4A0054 0x54 +0x4A0055 0x55 +0x4A0056 0x56 +0x4A0057 0x57 +0x4A0058 0x58 +0x4A0059 0x59 +0x4A005A 0x5A +0x4A005B 0x5B +0x4A005C 0xA5 # \ -> Yen +0x4A005D 0x5D +0x4A005E 0x5E +0x4A005F 0x5F +0x4A0060 0x60 +0x4A0061 0x61 +0x4A0062 0x62 +0x4A0063 0x63 +0x4A0064 0x64 +0x4A0065 0x65 +0x4A0066 0x66 +0x4A0067 0x67 +0x4A0068 0x68 +0x4A0069 0x69 +0x4A006A 0x6A +0x4A006B 0x6B +0x4A006C 0x6C +0x4A006D 0x6D +0x4A006E 0x6E +0x4A006F 0x6F +0x4A0070 0x70 +0x4A0071 0x71 +0x4A0072 0x72 +0x4A0073 0x73 +0x4A0074 0x74 +0x4A0075 0x75 +0x4A0076 0x76 +0x4A0077 0x77 +0x4A0078 0x78 +0x4A0079 0x79 +0x4A007A 0x7A +0x4A007B 0x7B +0x4A007C 0x7C +0x4A007D 0x7D +0x4A007E 0x203E + + +# Mappings for JIS Katakana. + +0x490021 0x3002 +0x490022 0x300C +0x490023 0x300D +0x490024 0x3001 +0x490025 0x30FB +0x490026 0x30F2 +0x490027 0x30A1 +0x490028 0x30A3 +0x490029 0x30A5 +0x49002A 0x30A7 +0x49002B 0x30A9 +0x49002C 0x30E3 +0x49002D 0x30E5 +0x49002E 0x30E7 +0x49002F 0x30C3 +0x490030 0x30FC +0x490031 0x30A2 +0x490032 0x30A4 +0x490033 0x30A6 +0x490034 0x30A8 +0x490035 0x30AA +0x490036 0x30AB +0x490037 0x30AD +0x490038 0x30AF +0x490039 0x30B1 +0x49003A 0x30B3 +0x49003B 0x30B5 +0x49003C 0x30B7 +0x49003D 0x30B9 +0x49003E 0x30BB +0x49003F 0x30BD +0x490040 0x30BF +0x490041 0x30C1 +0x490042 0x30C4 +0x490043 0x30C6 +0x490044 0x30C8 +0x490045 0x30CA +0x490046 0x30CB +0x490047 0x30CC +0x490048 0x30CD +0x490049 0x30CE +0x49004A 0x30CF +0x49004B 0x30D2 +0x49004C 0x30D5 +0x49004D 0x30D8 +0x49004E 0x30DB +0x49004F 0x30DE +0x490050 0x30DF +0x490051 0x30E0 +0x490052 0x30E1 +0x490053 0x30E2 +0x490054 0x30E4 +0x490055 0x30E6 +0x490056 0x30E8 +0x490057 0x30E9 +0x490058 0x30EA +0x490059 0x30EB +0x49005A 0x30EC +0x49005B 0x30ED +0x49005C 0x30EF +0x49005D 0x30F3 +0x49005E 0x309B +0x49005F 0x309C + +# For reference, here's what they'd map to if we were mapping to +# halfwidth Katakana. +# +# 0x490021 0xFF61 +# 0x490022 0xFF62 +# 0x490023 0xFF63 +# 0x490024 0xFF64 +# 0x490025 0xFF65 +# 0x490026 0xFF66 +# 0x490027 0xFF67 +# 0x490028 0xFF68 +# 0x490029 0xFF69 +# 0x49002A 0xFF6A +# 0x49002B 0xFF6B +# 0x49002C 0xFF6C +# 0x49002D 0xFF6D +# 0x49002E 0xFF6E +# 0x49002F 0xFF6F +# 0x490030 0xFF70 +# 0x490031 0xFF71 +# 0x490032 0xFF72 +# 0x490033 0xFF73 +# 0x490034 0xFF74 +# 0x490035 0xFF75 +# 0x490036 0xFF76 +# 0x490037 0xFF77 +# 0x490038 0xFF78 +# 0x490039 0xFF79 +# 0x49003A 0xFF7A +# 0x49003B 0xFF7B +# 0x49003C 0xFF7C +# 0x49003D 0xFF7D +# 0x49003E 0xFF7E +# 0x49003F 0xFF7F +# 0x490040 0xFF80 +# 0x490041 0xFF81 +# 0x490042 0xFF82 +# 0x490043 0xFF83 +# 0x490044 0xFF84 +# 0x490045 0xFF85 +# 0x490046 0xFF86 +# 0x490047 0xFF87 +# 0x490048 0xFF88 +# 0x490049 0xFF89 +# 0x49004A 0xFF8A +# 0x49004B 0xFF8B +# 0x49004C 0xFF8C +# 0x49004D 0xFF8D +# 0x49004E 0xFF8E +# 0x49004F 0xFF8F +# 0x490050 0xFF90 +# 0x490051 0xFF91 +# 0x490052 0xFF92 +# 0x490053 0xFF93 +# 0x490054 0xFF94 +# 0x490055 0xFF95 +# 0x490056 0xFF96 +# 0x490057 0xFF97 +# 0x490058 0xFF98 +# 0x490059 0xFF99 +# 0x49005A 0xFF9A +# 0x49005B 0xFF9B +# 0x49005C 0xFF9C +# 0x49005D 0xFF9D +# 0x49005E 0xFF9E +# 0x49005F 0xFF9F diff --git a/externals/figlet/fonts/koi8r.flc b/externals/figlet/fonts/koi8r.flc new file mode 100644 index 0000000000..e324d8b049 --- /dev/null +++ b/externals/figlet/fonts/koi8r.flc @@ -0,0 +1,128 @@ +t \0x80 \0x2500 +t \0x81 \0x2502 +t \0x82 \0x250c +t \0x83 \0x2510 +t \0x84 \0x2514 +t \0x85 \0x2518 +t \0x86 \0x251c +t \0x87 \0x2524 +t \0x88 \0x252c +t \0x89 \0x2534 +t \0x8a \0x253c +t \0x8b \0x2580 +t \0x8c \0x2584 +t \0x8d \0x2588 +t \0x8e \0x258c +t \0x8f \0x2590 +t \0x90 \0x2591 +t \0x91 \0x2592 +t \0x92 \0x2593 +t \0x93 \0x2320 +t \0x94 \0x25a0 +t \0x95 \0x2219 +t \0x96 \0x221a +t \0x97 \0x2248 +t \0x98 \0x2264 +t \0x99 \0x2265 +t \0x9a \0x00a0 +t \0x9b \0x2321 +t \0x9c \0x00b0 +t \0x9d \0x00b2 +t \0x9e \0x00b7 +t \0x9f \0x00f7 +t \0xa0 \0x2550 +t \0xa1 \0x2551 +t \0xa2 \0x2552 +t \0xa3 \0x0451 +t \0xa4 \0x2553 +t \0xa5 \0x2554 +t \0xa6 \0x2555 +t \0xa7 \0x2556 +t \0xa8 \0x2557 +t \0xa9 \0x2558 +t \0xaa \0x2559 +t \0xab \0x255a +t \0xac \0x255b +t \0xad \0x255c +t \0xae \0x255d +t \0xaf \0x255e +t \0xb0 \0x255f +t \0xb1 \0x2560 +t \0xb2 \0x2561 +t \0xb3 \0x0401 +t \0xb4 \0x2562 +t \0xb5 \0x2563 +t \0xb6 \0x2564 +t \0xb7 \0x2565 +t \0xb8 \0x2566 +t \0xb9 \0x2567 +t \0xba \0x2568 +t \0xbb \0x2569 +t \0xbc \0x256a +t \0xbd \0x256b +t \0xbe \0x256c +t \0xbf \0x00a9 +t \0xc0 \0x044e +t \0xc1 \0x0430 +t \0xc2 \0x0431 +t \0xc3 \0x0446 +t \0xc4 \0x0434 +t \0xc5 \0x0435 +t \0xc6 \0x0444 +t \0xc7 \0x0433 +t \0xc8 \0x0445 +t \0xc9 \0x0438 +t \0xca \0x0439 +t \0xcb \0x043a +t \0xcc \0x043b +t \0xcd \0x043c +t \0xce \0x043d +t \0xcf \0x043e +t \0xd0 \0x043f +t \0xd1 \0x044f +t \0xd2 \0x0440 +t \0xd3 \0x0441 +t \0xd4 \0x0442 +t \0xd5 \0x0443 +t \0xd6 \0x0436 +t \0xd7 \0x0432 +t \0xd8 \0x044c +t \0xd9 \0x044b +t \0xda \0x0437 +t \0xdb \0x0448 +t \0xdc \0x044d +t \0xdd \0x0449 +t \0xde \0x0447 +t \0xdf \0x044a +t \0xe0 \0x042e +t \0xe1 \0x0410 +t \0xe2 \0x0411 +t \0xe3 \0x0426 +t \0xe4 \0x0414 +t \0xe5 \0x0415 +t \0xe6 \0x0424 +t \0xe7 \0x0413 +t \0xe8 \0x0425 +t \0xe9 \0x0418 +t \0xea \0x0419 +t \0xeb \0x041a +t \0xec \0x041b +t \0xed \0x041c +t \0xee \0x041d +t \0xef \0x041e +t \0xf0 \0x041f +t \0xf1 \0x042f +t \0xf2 \0x0420 +t \0xf3 \0x0421 +t \0xf4 \0x0422 +t \0xf5 \0x0423 +t \0xf6 \0x0416 +t \0xf7 \0x0412 +t \0xf8 \0x042c +t \0xf9 \0x042b +t \0xfa \0x0417 +t \0xfb \0x0428 +t \0xfc \0x042d +t \0xfd \0x0429 +t \0xfe \0x0427 +t \0xff \0x042a diff --git a/externals/figlet/fonts/lean.flf b/externals/figlet/fonts/lean.flf new file mode 100644 index 0000000000..7e53563c0a --- /dev/null +++ b/externals/figlet/fonts/lean.flf @@ -0,0 +1,1691 @@ +flf2a$ 8 6 27 0 10 0 576 96 +Lean by Glenn Chappell 4/93 -- based on various .sig's +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $ $@ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + $ $ @ +$ $ @@ + $$@ + _/ $ @ + _/ $ @ + _/ $ @ + $$ @ +_/ $ @ + $$ @ + @@ + _/ _/ $@ + _/ _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + $$ @ + _/ _/ $@ + _/_/_/_/_/ $ @ + _/ _/ $ @ +_/_/_/_/_/ $ @ + _/ _/ $ @ + $$ @ + @@ + $$ @ + _/ $@ + _/_/_/ $ @ + _/_/ $ @ + _/_/ $ @ +_/_/_/ $ @ + _/ $ @ + $$ @@ + $$@ + _/_/ _/ $ @ + _/_/ _/ $ @ + _/ $ @ + _/ _/_/ $ @ +_/ _/_/ $ @ + $$ @ + @@ + $$ @ + _/ $ @ + _/ _/ $@ + _/_/ _/ $ @ +_/ _/ $ @ + _/_/ _/ $ @ + $$ @ + @@ + _/ $@ + _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + _/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + _/ $ @ + $$ @@ + _/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @@ + $$@ + _/ _/ _/ $ @ + _/_/_/ $ @ + _/_/_/_/_/ $ @ + _/_/_/ $ @ +_/ _/ _/ $ @ + $$ @ + @@ + $$ @ + _/ $ @ + _/ $@ +_/_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + $$ @ + @@ + @ + @ + @ + @ + $$@ + _/ $ @ +_/ $ @ + $$ @@ + @ + @ + $$@ +_/_/_/_/_/ $ @ + $$ @ + @ + @ + @@ + @ + @ + @ + @ + $$@ +_/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/_/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ $ @ + _/_/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $@ +_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + @ + $$@ + _/ $ @ + $$ @ + $$ @ +_/ $ @ + $$ @ + @@ + @ + $$@ + _/ $ @ + $$ @ + $$ @ + _/ $ @ +_/ $ @ + $$ @@ + $$@ + _/ $ @ + _/ $ @ +_/ $ @ + _/ $ @ + _/ $ @ + $$ @ + @@ + @ + $$@ + _/_/_/_/_/ $ @ + $$ @ +_/_/_/_/_/ $ @ + $$ @ + @ + @@ + $$ @ + _/ $ @ + _/ $@ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ $ @ + _/_/ $ @ + $$ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/_/_/_/ $@ + _/ _/ $ @ + _/ _/_/_/ _/ $ @ + _/ _/ _/ _/ $ @ +_/ _/_/_/_/ $ @ + _/ $ @ + _/_/_/_/_/_/ $ @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/ _/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/ $ @ + _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $@ +_/_/_/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/_/ _/_/ $ @ + _/ _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/_/ _/ $ @ + _/ _/ _/ $ @ + _/ _/_/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ _/_/ $ @ +_/ _/ $ @ + _/_/ _/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/_/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ +_/_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/ _/ $ @ + _/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ _/ $ @ + _/ _/ _/ $ @ + _/ _/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ +_/ _/ $ @ + _/ _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/_/_/_/_/ $ @ + $$ @ + @@ + _/_/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/_/ $ @ + $$ @@ + $$ @ +_/ $ @ + _/ $ @ + _/ $ @ + _/ $@ + _/ $ @ + $$ @ + @@ + _/_/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/_/ $ @ + $$ @@ + _/ $@ + _/ _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + @ + @ + @ + @ + @ + $$ @ + $$@ +_/_/_/_/_/ $ @@ + _/ $@ + _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + @ + $$@ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$ @ + _/ $ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + @ + $$@ + _/_/_/ $ @ + _/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/ $@ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/ $ @ + _/ $ @ +_/_/_/_/ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + @ + $$@ + _/_/_/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ + $$ @ + _/ $ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @@ + $$ @ + _/ $@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/_/ _/_/ $@ + _/ _/ _/ $ @ + _/ _/ _/ $ @ +_/ _/ _/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/ $@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/ $ @@ + @ + $$@ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + _/ $ @ + _/ $ @@ + @ + $$@ + _/ _/_/ $ @ + _/_/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + @ + $$@ + _/_/_/ $ @ + _/_/ $ @ + _/_/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$ @ + _/ $@ +_/_/_/_/ @ + _/ $ @ +_/ $ @ + _/_/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ $ @ +_/ _/ $ @ + _/ _/ $ @ + _/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ _/ $ @ +_/ _/ _/ $ @ + _/ _/ _/ _/ $ @ + _/ _/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ + @ + $$@ + _/_/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ + _/ $@ + _/ $ @ + _/ $ @ +_/ $ @ + _/ $ @ +_/ $ @ + _/ $ @ + $$ @@ + _/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @@ + _/ $ @ + _/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @@ + _/ _/ $@ +_/ _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ +_/ $ @ + $$ @@ +160 NO-BREAK SPACE + $ $@ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + $ $ @ +$ $ @@ +161 INVERTED EXCLAMATION MARK + $$@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +162 CENT SIGN + $$ @ + _/ $@ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + _/ $ @ + $$ @@ +163 POUND SIGN + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ + _/_/_/ _/ $ @ +_/_/ _/_/ $ @ + @@ +164 CURRENCY SIGN + $$@ + _/ _/ $ @ + _/_/_/_/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @@ +165 YEN SIGN + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/_/ $ @ + _/ $ @ +_/_/_/_/_/ $ @ + _/ $ @ + $$ @@ +166 BROKEN BAR + _/ $@ + _/ $ @ + _/ $ @ + $$ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @@ +167 SECTION SIGN + _/_/ $@ + _/ $ @ + _/ $ @ + _/ _/ $ @ + _/ $ @ + _/ $ @ +_/_/ $ @ + $$ @@ +168 DIAERESIS + _/ _/ $@ + $$ @ + $ $ @ + $ $ @ + $ $ @ +$ $ @ + @ + @@ +169 COPYRIGHT SIGN + _/_/_/_/ $ @ + _/ _/ $@ + _/ _/_/_/ _/ $ @ + _/ _/ _/ $ @ + _/ _/ _/ $ @ +_/ _/_/_/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @@ +170 FEMININE ORDINAL INDICATOR + $$@ + _/_/_/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + $$ @ +_/_/_/_/ $ @ + @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + $$@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + $$ @ + @@ +172 NOT SIGN + @ + @ + $$@ +_/_/_/_/_/ $ @ + _/ $ @ + $$ @ + @ + @@ +173 SOFT HYPHEN + @ + @ + $$@ +_/_/_/_/ $ @ + $$ @ + $$ @ + @ + @@ +174 REGISTERED SIGN + _/_/_/_/ $ @ + _/ _/ $@ + _/ _/_/_/ _/ $ @ + _/ _/ _/ _/ $ @ + _/ _/_/_/ _/ $ @ +_/ _/ _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @@ +175 MACRON + _/_/_/_/_/ $@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ +176 DEGREE SIGN + _/ $@ + _/ _/ $ @ + _/ $ @ + $$ @ + $$ @ +$$ @ + @ + @@ +177 PLUS-MINUS SIGN + $$ @ + _/ $ @ + _/ $@ + _/_/_/_/_/ $ @ + _/ $ @ +_/_/_/_/_/ $ @ + $$ @ + @@ +178 SUPERSCRIPT TWO + $$ @ + _/_/ $@ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @ + @@ +179 SUPERSCRIPT THREE + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/ $ @ + $$ @ + @ + @@ +180 ACUTE ACCENT + _/ $@ + _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ +181 MICRO SIGN + @ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ + _/ $ @ +_/ $ @@ +182 PILCROW SIGN + $$@ + _/_/_/_/ $ @ +_/_/_/ _/ $ @ + _/_/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + $$ @ + @@ +183 MIDDLE DOT + @ + @ + $$@ + _/ $ @ + $$ @ +$$ @ + @ + @@ +184 CEDILLA + @ + @ + @ + @ + @ + $$@ + _/ $ @ +_/_/ $ @@ +185 SUPERSCRIPT ONE + $$@ + _/ $ @ +_/_/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ + $$ @ +_/_/_/_/ $ @ + @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + $$ @ + _/ _/ $ @ + _/ _/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ +188 VULGAR FRACTION ONE QUARTER + $$ @ + _/ _/ $@ +_/_/ _/ _/ _/ $ @ + _/ _/ _/ _/ $@ +_/ _/ _/_/_/_/ $ @ + _/ _/ $ @ + $$ @ + @@ +189 VULGAR FRACTION ONE HALF + $$ @ + _/ _/ $ @ +_/_/ _/ _/_/ $@ + _/ _/ _/ $ @ +_/ _/ _/ $ @ + _/ _/_/_/ $ @ + $$ @ + @@ +190 VULGAR FRACTION THREE QUARTERS + $$ @ + _/_/_/ _/ $@ + _/ _/ _/ _/ $ @ + _/ _/ _/ _/ $@ +_/_/ _/ _/_/_/_/ $ @ + _/ _/ $ @ + $$ @ + @@ +191 INVERTED QUESTION MARK + $$@ + _/ $ @ + $$ @ + _/_/ $ @ +_/ $ @ + _/_/ $ @ + $$ @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + _/ $@ + _/ $ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _/ $@ + _/ $ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + $$ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + _/ _/ $@ + _/ _/ $ @ + $$ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +198 LATIN CAPITAL LETTER AE + $$@ + _/_/_/_/_/_/ $ @ + _/ _/ $ @ + _/_/_/_/_/_/ $ @ + _/ _/ $ @ +_/ _/_/_/_/ $ @ + $$ @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + _/ $ @ + _/ $@ + _/_/_/_/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _/ $ @ + _/ $@ + _/_/_/_/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + _/_/_/_/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/_/_/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + _/ $ @ + _/ $@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _/ $@ + _/ $ @ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + _/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +208 LATIN CAPITAL LETTER ETH + $$ @ + _/_/_/ $@ + _/ _/ $ @ +_/_/_/ _/ $ @ + _/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + _/ _/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/_/ _/ $ @ + _/ _/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + _/ $@ + _/ $ @ + _/_/ $@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _/ $@ + _/ $ @ + _/_/ $@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + _/ _/ $@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +215 MULTIPLICATION SIGN + @ + $$@ + _/ _/ $ @ + _/ $ @ +_/ _/ $ @ + $$ @ + @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + $$@ + _/_/_/_/ $ @ + _/ _/_/ $ @ + _/ _/ _/ $ @ + _/_/ _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + _/ $@ + _/ $ @ + $$@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _/ $@ + _/ $ @ + $$@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + $$ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _/ $ @ + _/ $@ +_/ _/ $ @ + _/ _/ $ @ + _/ $ @ + _/ $ @ + $$ @ + @@ +222 LATIN CAPITAL LETTER THORN + $$ @ + _/ $ @ + _/_/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ +_/ $ @ + $$ @ + @@ +223 LATIN SMALL LETTER SHARP S + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ +_/ $ @ + $$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + _/ $@ + _/ $ @ + $$@ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + _/ $@ + _/ $ @ + $$ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + _/ $@ + _/ _/ $ @ + $$ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + _/ _/ $@ + _/ _/ $ @ + $$ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + _/ $@ + _/ _/ $ @ + _/ $ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +230 LATIN SMALL LETTER AE + @ + $$ @ + _/_/_/ _/_/ $@ + _/ _/_/_/_/_/ $ @ +_/ _/_/ $ @ + _/_/_/ _/_/_/ $ @ + $$ @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ +232 LATIN SMALL LETTER E WITH GRAVE + _/ $@ + _/ $ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + _/ $@ + _/ $ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + _/ $@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + _/ $@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + _/ $@ + _/ _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _/ _/ $@ + $$ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +240 LATIN SMALL LETTER ETH + _/ _/ $@ + _/ $ @ + _/ _/ $@ + _/_/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + _/ _/ $@ + _/ _/ $ @ + $$ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + _/ $@ + _/ $ @ + $$ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + _/ $@ + _/ $ @ + $$ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + $$ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + _/_/_/ $@ + _/ _/ $ @ + $$ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +247 DIVISION SIGN + $$ @ + _/ $ @ + $$@ +_/_/_/_/_/ $ @ + $$ @ + _/ $ @ + $$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + $$@ + _/_/_/ $ @ + _/ _/_/ $ @ + _/_/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + _/ $ @ + _/ $ @ + $$@ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + _/ $@ + _/ $ @ + $$ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + $$ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _/ $@ + _/ $ @ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ +254 LATIN SMALL LETTER THORN + $$ @ + _/ $ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/ $ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ diff --git a/externals/figlet/fonts/mini.flf b/externals/figlet/fonts/mini.flf new file mode 100644 index 0000000000..3b72606ca0 --- /dev/null +++ b/externals/figlet/fonts/mini.flf @@ -0,0 +1,899 @@ +flf2a$ 4 3 10 0 10 0 1920 96 +Mini by Glenn Chappell 4/93 +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +$$@ +$$@ +$$@ +$$@@ + @ + |$@ + o$@ + @@ + @ + ||$@ + @ + @@ + @ + -|-|-$@ + -|-|-$@ + @@ + _$@ + (|$ @ + _|)$@ + @@ + @ + O/$@ + /O$@ + @@ + @ + ()$ @ + (_X$@ + @@ + @ + /$@ + @ + @@ + @ + /$@ + |$ @ + \$@@ + @ + \$ @ + |$@ + /$ @@ + @ + \|/$@ + /|\$@ + @@ + @ + _|_$@ + |$ @ + @@ + @ + @ + o$@ + /$@@ + @ + __$@ + @ + @@ + @ + @ + o$@ + @@ + @ + /$@ + /$ @ + @@ + _$ @ + / \$@ + \_/$@ + @@ + @ + /|$@ + |$@ + @@ + _$ @ + )$@ + /_$@ + @@ + _$ @ + _)$@ + _)$@ + @@ + @ + |_|_$@ + |$ @ + @@ + _$ @ + |_$ @ + _)$@ + @@ + _$ @ + |_$ @ + |_)$@ + @@ + __$@ + /$@ + /$ @ + @@ + _$ @ + (_)$@ + (_)$@ + @@ + _$ @ + (_|$@ + |$@ + @@ + @ + o$@ + o$@ + @@ + @ + o$@ + o$@ + /$@@ + @ + /$@ + \$@ + @@ + @ + --$@ + --$@ + @@ + @ + \$@ + /$@ + @@ + _$ @ + )$@ + o$ @ + @@ + __$ @ + / \$@ + | (|/$@ + \__$ @@ + @ + /\$ @ + /--\$@ + @@ + _$ @ + |_)$@ + |_)$@ + @@ + _$@ + /$ @ + \_$@ + @@ + _$ @ + | \$@ + |_/$@ + @@ + _$@ + |_$@ + |_$@ + @@ + _$@ + |_$@ + |$ @ + @@ + __$@ + /__$@ + \_|$@ + @@ + @ + |_|$@ + | |$@ + @@ + ___$@ + |$ @ + _|_$@ + @@ + @ + |$@ + \_|$@ + @@ + @ + |/$@ + |\$@ + @@ + @ + |$ @ + |_$@ + @@ + @ + |\/|$@ + | |$@ + @@ + @ + |\ |$@ + | \|$@ + @@ + _$ @ + / \$@ + \_/$@ + @@ + _$ @ + |_)$@ + |$ @ + @@ + _$ @ + / \$@ + \_X$@ + @@ + _$ @ + |_)$@ + | \$@ + @@ + __$@ + (_$ @ + __)$@ + @@ + ___$@ + |$ @ + |$ @ + @@ + @ + | |$@ + |_|$@ + @@ + @ + \ /$@ + \/$ @ + @@ + @ + \ /$@ + \/\/$ @ + @@ + @ + \/$@ + /\$@ + @@ + @ + \_/$@ + |$ @ + @@ + __$@ + /$@ + /_$@ + @@ + _$@ + |$ @ + |_$@ + @@ + @ + \$ @ + \$@ + @@ + _$ @ + |$@ + _|$@ + @@ + /\$@ + @ + @ + @@ + @ + @ + @ + __$@@ + @ + \$@ + @ + @@ + @ + _.$@ + (_|$@ + @@ + @ + |_$ @ + |_)$@ + @@ + @ + _$@ + (_$@ + @@ + @ + _|$@ + (_|$@ + @@ + @ + _$ @ + (/_$@ + @@ + _$@ + _|_$@ + |$ @ + @@ + @ + _$ @ + (_|$@ + _|$@@ + @ + |_$ @ + | |$@ + @@ + @ + o$@ + |$@ + @@ + @ + o$@ + |$@ + _|$@@ + @ + |$ @ + |<$@ + @@ + @ + |$@ + |$@ + @@ + @ + ._ _$ @ + | | |$@ + @@ + @ + ._$ @ + | |$@ + @@ + @ + _$ @ + (_)$@ + @@ + @ + ._$ @ + |_)$@ + |$ @@ + @ + _.$@ + (_|$@ + |$@@ + @ + ._$@ + |$ @ + @@ + @ + _$@ + _>$@ + @@ + @ + _|_$@ + |_$@ + @@ + @ + @ + |_|$@ + @@ + @ + @ + \/$@ + @@ + @ + @ + \/\/$@ + @@ + @ + @ + ><$@ + @@ + @ + @ + \/$@ + /$ @@ + @ + _$ @ + /_$@ + @@ + ,-$@ + _|$ @ + |$ @ + `-$@@ + |$@ + |$@ + |$@ + |$@@ + -.$ @ + |_$@ + |$ @ + -'$ @@ + /\/$@ + @ + @ + @@ + o o$@ + /\$ @ + /--\$@ + @@ + o_o$@ + / \$@ + \_/$@ + @@ + o o$@ + | |$@ + |_|$@ + @@ + o o$@ + _.$@ + (_|$@ + @@ + o o$@ + _$ @ + (_)$@ + @@ + o o$@ + @ + |_|$@ + @@ + _$ @ + | )$@ + | )$@ + |$ @@ +160 NO-BREAK SPACE + $$@ + $$@ + $$@ + $$@@ +161 INVERTED EXCLAMATION MARK + @ + o$@ + |$@ + @@ +162 CENT SIGN + @ + |_$@ + (__$@ + |$ @@ +163 POUND SIGN + _$ @ + _/_`$ @ + |___$@ + @@ +164 CURRENCY SIGN + @ + `o'$@ + ' `$@ + @@ +165 YEN SIGN + @ + _\_/_$@ + --|--$@ + @@ +166 BROKEN BAR + |$@ + |$@ + |$@ + |$@@ +167 SECTION SIGN + _$@ + ($ @ + ()$@ + _)$@@ +168 DIAERESIS + o o$@ + @ + @ + @@ +169 COPYRIGHT SIGN + _$ @ + |C|$@ + `-'$@ + @@ +170 FEMININE ORDINAL INDICATOR + _.$@ + (_|$@ + ---$@ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + //$@ + \\$@ + @@ +172 NOT SIGN + @ + __$ @ + |$@ + @@ +173 SOFT HYPHEN + @ + _$@ + @ + @@ +174 REGISTERED SIGN + _$ @ + |R|$@ + `-'$@ + @@ +175 MACRON + __$@ + @ + @ + @@ +176 DEGREE SIGN + O$@ + @ + @ + @@ +177 PLUS-MINUS SIGN + @ + _|_$@ + _|_$@ + @@ +178 SUPERSCRIPT TWO + 2$@ + @ + @ + @@ +179 SUPERSCRIPT THREE + 3$@ + @ + @ + @@ +180 ACUTE ACCENT + /$@ + @ + @ + @@ +181 MICRO SIGN + @ + @ + |_|$@ + |$ @@ +182 PILCROW SIGN + __$ @ + (| |$@ + | |$@ + @@ +183 MIDDLE DOT + @ + o$@ + @ + @@ +184 CEDILLA + @ + @ + @ + S$@@ +185 SUPERSCRIPT ONE + 1$@ + @ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + _$ @ + (_)$@ + ---$@ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + \\$@ + //$@ + @@ +188 VULGAR FRACTION ONE QUARTER + @ + 1/$@ + /4$@ + @@ +189 VULGAR FRACTION ONE HALF + @ + 1/$@ + /2$@ + @@ +190 VULGAR FRACTION THREE QUARTERS + @ + 3/$@ + /4$@ + @@ +191 INVERTED QUESTION MARK + @ + o$@ + (_$@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \$ @ + /\$ @ + /--\$@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + /$ @ + /\$ @ + /--\$@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\$ @ + /\$ @ + /--\$@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/$@ + /\$ @ + /--\$@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + o o$@ + /\$ @ + /--\$@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + O$ @ + / \$ @ + /---\$@ + @@ +198 LATIN CAPITAL LETTER AE + _$@ + /|_$@ + /-|_$@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + _$@ + /$ @ + \_$@ + S$@@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \_$@ + |_$@ + |_$@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _/$@ + |_$ @ + |_$ @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\$@ + |_$ @ + |_$ @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + o_o$@ + |_$ @ + |_$ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \__$@ + |$ @ + _|_$@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __/$@ + |$ @ + _|_$@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\$@ + ___$@ + _|_$@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + o_o$@ + |$ @ + _|_$@ + @@ +208 LATIN CAPITAL LETTER ETH + _$ @ + _|_\$@ + |_/$@ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/$@ + |\ |$@ + | \|$@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \$ @ + / \$@ + \_/$@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + /$ @ + / \$@ + \_/$@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\$@ + / \$@ + \_/$@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/$@ + / \$@ + \_/$@ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + o_o$@ + / \$@ + \_/$@ + @@ +215 MULTIPLICATION SIGN + @ + @ + X$@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + __$ @ + / /\$@ + \/_/$@ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \$ @ + | |$@ + |_|$@ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + /$ @ + | |$@ + |_|$@ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\$@ + | |$@ + |_|$@ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + o o$@ + | |$@ + |_|$@ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + /$ @ + \_/$@ + |$ @ + @@ +222 LATIN CAPITAL LETTER THORN + |_$ @ + |_)$@ + |$ @ + @@ +223 LATIN SMALL LETTER SHARP S + _$ @ + | )$@ + | )$@ + |$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + \$ @ + _.$@ + (_|$@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + /$ @ + _.$@ + (_|$@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\$@ + _.$@ + (_|$@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/$@ + _.$@ + (_|$@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + o o$@ + _.$@ + (_|$@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + O$ @ + _.$@ + (_|$@ + @@ +230 LATIN SMALL LETTER AE + @ + ___$ @ + (_|/_$@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _$@ + (_$@ + S$@@ +232 LATIN SMALL LETTER E WITH GRAVE + \$ @ + _$ @ + (/_$@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + /$ @ + _$ @ + (/_$@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\$@ + _$ @ + (/_$@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + o o$@ + _$ @ + (/_$@ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \$@ + @ + |$@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + /$@ + @ + |$@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\$@ + @ + |$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + o o$@ + @ + |$ @ + @@ +240 LATIN SMALL LETTER ETH + X$ @ + \$ @ + (_|$@ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/$@ + ._$ @ + | |$@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \$ @ + _$ @ + (_)$@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + /$ @ + _$ @ + (_)$@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\$@ + _$ @ + (_)$@ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/$@ + _$ @ + (_)$@ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + o o$@ + _$ @ + (_)$@ + @@ +247 DIVISION SIGN + o$ @ + ---$@ + o$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + _$ @ + (/)$@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + \$ @ + @ + |_|$@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + /$ @ + @ + |_|$@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\$@ + @ + |_|$@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + o o$@ + @ + |_|$@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + /$@ + @ + \/$@ + /$ @@ +254 LATIN SMALL LETTER THORN + @ + |_$ @ + |_)$@ + |$ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + oo$@ + @ + \/$@ + /$ @@ diff --git a/externals/figlet/fonts/mnemonic.flf b/externals/figlet/fonts/mnemonic.flf new file mode 100644 index 0000000000..03e4baa786 --- /dev/null +++ b/externals/figlet/fonts/mnemonic.flf @@ -0,0 +1,3702 @@ +flf2a$ 1 1 12 -1 5 0 0 1797 +mnemonic - a FIGfont by John Cowan +This font uses the mnemonics of RFC1345 +(http://ds.internic.net/rfc/rfc1345.txt) to implement a really large character +set rather crudely, but reversibly. Two-letter mnemonics +are prefixed by &; larger mnemonics are prefixed by &_ and followed by _. +&SP@@ +!@@ +"@@ +&Nb@@ +&DO@@ +%@@ +&@@ +'@@ +(@@ +)@@ +*@@ ++@@ +,@@ +-@@ +.@@ +/@@ +0@@ +1@@ +2@@ +3@@ +4@@ +5@@ +6@@ +7@@ +8@@ +9@@ +:@@ +;@@ +<@@ +=@@ +>@@ +?@@ +&At@@ +A@@ +B@@ +C@@ +D@@ +E@@ +F@@ +G@@ +H@@ +I@@ +J@@ +K@@ +L@@ +M@@ +N@@ +O@@ +P@@ +Q@@ +R@@ +S@@ +T@@ +U@@ +V@@ +W@@ +X@@ +Y@@ +Z@@ +&<(@@ +&//@@ +&)>@@ +&'>@@ +_@@ +&'!@@ +a@@ +b@@ +c@@ +d@@ +e@@ +f@@ +g@@ +h@@ +i@@ +j@@ +k@@ +l@@ +m@@ +n@@ +o@@ +p@@ +q@@ +r@@ +s@@ +t@@ +u@@ +v@@ +w@@ +x@@ +y@@ +z@@ +&(!@@ +&!!@@ +&!)@@ +&'?@@ +&A:@@ +&O:@@ +&U:@@ +&a:@@ +&o:@@ +&u:@@ +&ss@@ +0x0001 START OF HEADING (SOH) +&SH@@ +0x0002 START OF TEXT (STX) +&SX@@ +0x0003 END OF TEXT (ETX) +&EX@@ +0x0004 END OF TRANSMISSION (EOT) +&ET@@ +0x0005 ENQUIRY (ENQ) +&EQ@@ +0x0006 ACKNOWLEDGE (ACK) +&AK@@ +0x0007 BELL (BEL) +&BL@@ +0x0008 BACKSPACE (BS) +&BS@@ +0x0009 CHARACTER TABULATION (HT) +&HT@@ +0x000a LINE FEED (LF) +&LF@@ +0x000b LINE TABULATION (VT) +&VT@@ +0x000c FORM FEED (FF) +&FF@@ +0x000d CARRIAGE RETURN (CR) +&CR@@ +0x000e SHIFT OUT (SO) +&SO@@ +0x000f SHIFT IN (SI) +&SI@@ +0x0010 DATALINK ESCAPE (DLE) +&DL@@ +0x0011 DEVICE CONTROL ONE (DC1) +&D1@@ +0x0012 DEVICE CONTROL TWO (DC2) +&D2@@ +0x0013 DEVICE CONTROL THREE (DC3) +&D3@@ +0x0014 DEVICE CONTROL FOUR (DC4) +&D4@@ +0x0015 NEGATIVE ACKNOWLEDGE (NAK) +&NK@@ +0x0016 SYNCRONOUS IDLE (SYN) +&SY@@ +0x0017 END OF TRANSMISSION BLOCK (ETB) +&EB@@ +0x0018 CANCEL (CAN) +&CN@@ +0x0019 END OF MEDIUM (EM) +&EM@@ +0x001a SUBSTITUTE (SUB) +&SB@@ +0x001b ESCAPE (ESC) +&EC@@ +0x001c FILE SEPARATOR (IS4) +&FS@@ +0x001d GROUP SEPARATOR (IS3) +&GS@@ +0x001e RECORD SEPARATOR (IS2) +&RS@@ +0x001f UNIT SEPARATOR (IS1) +&US@@ +0x007f DELETE (DEL) +&DT@@ +0x0080 PADDING CHARACTER (PAD) +&PA@@ +0x0081 HIGH OCTET PRESET (HOP) +&HO@@ +0x0082 BREAK PERMITTED HERE (BPH) +&BH@@ +0x0083 NO BREAK HERE (NBH) +&NH@@ +0x0084 INDEX (IND) +&IN@@ +0x0085 NEXT LINE (NEL) +&NL@@ +0x0086 START OF SELECTED AREA (SSA) +&SA@@ +0x0087 END OF SELECTED AREA (ESA) +&ES@@ +0x0088 CHARACTER TABULATION SET (HTS) +&HS@@ +0x0089 CHARACTER TABULATION WITH JUSTIFICATION (HTJ) +&HJ@@ +0x008a LINE TABULATION SET (VTS) +&VS@@ +0x008b PARTIAL LINE FORWARD (PLD) +&PD@@ +0x008c PARTIAL LINE BACKWARD (PLU) +&PU@@ +0x008d REVERSE LINE FEED (RI) +&RI@@ +0x008e SINGLE-SHIFT TWO (SS2) +&S2@@ +0x008f SINGLE-SHIFT THREE (SS3) +&S3@@ +0x0090 DEVICE CONTROL STRING (DCS) +&DC@@ +0x0091 PRIVATE USE ONE (PU1) +&P1@@ +0x0092 PRIVATE USE TWO (PU2) +&P2@@ +0x0093 SET TRANSMIT STATE (STS) +&TS@@ +0x0094 CANCEL CHARACTER (CCH) +&CC@@ +0x0095 MESSAGE WAITING (MW) +&MW@@ +0x0096 START OF GUARDED AREA (SPA) +&SG@@ +0x0097 END OF GUARDED AREA (EPA) +&EG@@ +0x0098 START OF STRING (SOS) +&SS@@ +0x0099 SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI) +&GC@@ +0x009a SINGLE CHARACTER INTRODUCER (SCI) +&SC@@ +0x009b CONTROL SEQUENCE INTRODUCER (CSI) +&CI@@ +0x009c STRING TERMINATOR (ST) +&ST@@ +0x009d OPERATING SYSTEM COMMAND (OSC) +&OC@@ +0x009e PRIVACY MESSAGE (PM) +&PM@@ +0x009f APPLICATION PROGRAM COMMAND (APC) +&AC@@ +0x00a0 NO-BREAK SPACE +&NS@@ +0x00a1 INVERTED EXCLAMATION MARK +&!I@@ +0x00a2 CENT SIGN +&Ct@@ +0x00a3 POUND SIGN +&Pd@@ +0x00a4 CURRENCY SIGN +&Cu@@ +0x00a5 YEN SIGN +&Ye@@ +0x00a6 BROKEN BAR +&BB@@ +0x00a7 SECTION SIGN +&SE@@ +0x00a8 DIAERESIS +&':@@ +0x00a9 COPYRIGHT SIGN +&Co@@ +0x00aa FEMININE ORDINAL INDICATOR +&-a@@ +0x00ab LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +&<<@@ +0x00ac NOT SIGN +&NO@@ +0x00ad SOFT HYPHEN +&--@@ +0x00ae REGISTERED SIGN +&Rg@@ +0x00af MACRON +&'m@@ +0x00b0 DEGREE SIGN +&DG@@ +0x00b1 PLUS-MINUS SIGN +&+-@@ +0x00b2 SUPERSCRIPT TWO +&2S@@ +0x00b3 SUPERSCRIPT THREE +&3S@@ +0x00b4 ACUTE ACCENT +&''@@ +0x00b5 MICRO SIGN +&My@@ +0x00b6 PILCROW SIGN +&PI@@ +0x00b7 MIDDLE DOT +&.M@@ +0x00b8 CEDILLA +&',@@ +0x00b9 SUPERSCRIPT ONE +&1S@@ +0x00ba MASCULINE ORDINAL INDICATOR +&-o@@ +0x00bb RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +&>>@@ +0x00bc VULGAR FRACTION ONE QUARTER +&14@@ +0x00bd VULGAR FRACTION ONE HALF +&12@@ +0x00be VULGAR FRACTION THREE QUARTERS +&34@@ +0x00bf INVERTED QUESTION MARK +&?I@@ +0x00c0 LATIN CAPITAL LETTER A WITH GRAVE +&A!@@ +0x00c1 LATIN CAPITAL LETTER A WITH ACUTE +&A'@@ +0x00c2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +&A>@@ +0x00c3 LATIN CAPITAL LETTER A WITH TILDE +&A?@@ +0x00c4 LATIN CAPITAL LETTER A WITH DIAERESIS +&A:@@ +0x00c5 LATIN CAPITAL LETTER A WITH RING ABOVE +&AA@@ +0x00c6 LATIN CAPITAL LETTER AE +&AE@@ +0x00c7 LATIN CAPITAL LETTER C WITH CEDILLA +&C,@@ +0x00c8 LATIN CAPITAL LETTER E WITH GRAVE +&E!@@ +0x00c9 LATIN CAPITAL LETTER E WITH ACUTE +&E'@@ +0x00ca LATIN CAPITAL LETTER E WITH CIRCUMFLEX +&E>@@ +0x00cb LATIN CAPITAL LETTER E WITH DIAERESIS +&E:@@ +0x00cc LATIN CAPITAL LETTER I WITH GRAVE +&I!@@ +0x00cd LATIN CAPITAL LETTER I WITH ACUTE +&I'@@ +0x00ce LATIN CAPITAL LETTER I WITH CIRCUMFLEX +&I>@@ +0x00cf LATIN CAPITAL LETTER I WITH DIAERESIS +&I:@@ +0x00d0 LATIN CAPITAL LETTER ETH (Icelandic) +&D-@@ +0x00d1 LATIN CAPITAL LETTER N WITH TILDE +&N?@@ +0x00d2 LATIN CAPITAL LETTER O WITH GRAVE +&O!@@ +0x00d3 LATIN CAPITAL LETTER O WITH ACUTE +&O'@@ +0x00d4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX +&O>@@ +0x00d5 LATIN CAPITAL LETTER O WITH TILDE +&O?@@ +0x00d6 LATIN CAPITAL LETTER O WITH DIAERESIS +&O:@@ +0x00d7 MULTIPLICATION SIGN +&*X@@ +0x00d8 LATIN CAPITAL LETTER O WITH STROKE +&O/@@ +0x00d9 LATIN CAPITAL LETTER U WITH GRAVE +&U!@@ +0x00da LATIN CAPITAL LETTER U WITH ACUTE +&U'@@ +0x00db LATIN CAPITAL LETTER U WITH CIRCUMFLEX +&U>@@ +0x00dc LATIN CAPITAL LETTER U WITH DIAERESIS +&U:@@ +0x00dd LATIN CAPITAL LETTER Y WITH ACUTE +&Y'@@ +0x00de LATIN CAPITAL LETTER THORN (Icelandic) +&TH@@ +0x00df LATIN SMALL LETTER SHARP S (German) +&ss@@ +0x00e0 LATIN SMALL LETTER A WITH GRAVE +&a!@@ +0x00e1 LATIN SMALL LETTER A WITH ACUTE +&a'@@ +0x00e2 LATIN SMALL LETTER A WITH CIRCUMFLEX +&a>@@ +0x00e3 LATIN SMALL LETTER A WITH TILDE +&a?@@ +0x00e4 LATIN SMALL LETTER A WITH DIAERESIS +&a:@@ +0x00e5 LATIN SMALL LETTER A WITH RING ABOVE +&aa@@ +0x00e6 LATIN SMALL LETTER AE +&ae@@ +0x00e7 LATIN SMALL LETTER C WITH CEDILLA +&c,@@ +0x00e8 LATIN SMALL LETTER E WITH GRAVE +&e!@@ +0x00e9 LATIN SMALL LETTER E WITH ACUTE +&e'@@ +0x00ea LATIN SMALL LETTER E WITH CIRCUMFLEX +&e>@@ +0x00eb LATIN SMALL LETTER E WITH DIAERESIS +&e:@@ +0x00ec LATIN SMALL LETTER I WITH GRAVE +&i!@@ +0x00ed LATIN SMALL LETTER I WITH ACUTE +&i'@@ +0x00ee LATIN SMALL LETTER I WITH CIRCUMFLEX +&i>@@ +0x00ef LATIN SMALL LETTER I WITH DIAERESIS +&i:@@ +0x00f0 LATIN SMALL LETTER ETH (Icelandic) +&d-@@ +0x00f1 LATIN SMALL LETTER N WITH TILDE +&n?@@ +0x00f2 LATIN SMALL LETTER O WITH GRAVE +&o!@@ +0x00f3 LATIN SMALL LETTER O WITH ACUTE +&o'@@ +0x00f4 LATIN SMALL LETTER O WITH CIRCUMFLEX +&o>@@ +0x00f5 LATIN SMALL LETTER O WITH TILDE +&o?@@ +0x00f6 LATIN SMALL LETTER O WITH DIAERESIS +&o:@@ +0x00f7 DIVISION SIGN +&-:@@ +0x00f8 LATIN SMALL LETTER O WITH STROKE +&o/@@ +0x00f9 LATIN SMALL LETTER U WITH GRAVE +&u!@@ +0x00fa LATIN SMALL LETTER U WITH ACUTE +&u'@@ +0x00fb LATIN SMALL LETTER U WITH CIRCUMFLEX +&u>@@ +0x00fc LATIN SMALL LETTER U WITH DIAERESIS +&u:@@ +0x00fd LATIN SMALL LETTER Y WITH ACUTE +&y'@@ +0x00fe LATIN SMALL LETTER THORN (Icelandic) +&th@@ +0x00ff LATIN SMALL LETTER Y WITH DIAERESIS +&y:@@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON +&A-@@ +0x0101 LATIN SMALL LETTER A WITH MACRON +&a-@@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE +&A(@@ +0x0103 LATIN SMALL LETTER A WITH BREVE +&a(@@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK +&A;@@ +0x0105 LATIN SMALL LETTER A WITH OGONEK +&a;@@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE +&C'@@ +0x0107 LATIN SMALL LETTER C WITH ACUTE +&c'@@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX +&C>@@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX +&c>@@ +0x010a LATIN CAPITAL LETTER C WITH DOT ABOVE +&C.@@ +0x010b LATIN SMALL LETTER C WITH DOT ABOVE +&c.@@ +0x010c LATIN CAPITAL LETTER C WITH CARON +&C<@@ +0x010d LATIN SMALL LETTER C WITH CARON +&c<@@ +0x010e LATIN CAPITAL LETTER D WITH CARON +&D<@@ +0x010f LATIN SMALL LETTER D WITH CARON +&d<@@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE +&D/@@ +0x0111 LATIN SMALL LETTER D WITH STROKE +&d/@@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON +&E-@@ +0x0113 LATIN SMALL LETTER E WITH MACRON +&e-@@ +0x0114 LATIN CAPITAL LETTER E WITH BREVE +&E(@@ +0x0115 LATIN SMALL LETTER E WITH BREVE +&e(@@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE +&E.@@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE +&e.@@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK +&E;@@ +0x0119 LATIN SMALL LETTER E WITH OGONEK +&e;@@ +0x011a LATIN CAPITAL LETTER E WITH CARON +&E<@@ +0x011b LATIN SMALL LETTER E WITH CARON +&e<@@ +0x011c LATIN CAPITAL LETTER G WITH CIRCUMFLEX +&G>@@ +0x011d LATIN SMALL LETTER G WITH CIRCUMFLEX +&g>@@ +0x011e LATIN CAPITAL LETTER G WITH BREVE +&G(@@ +0x011f LATIN SMALL LETTER G WITH BREVE +&g(@@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE +&G.@@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE +&g.@@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA +&G,@@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA +&g,@@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX +&H>@@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX +&h>@@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE +&H/@@ +0x0127 LATIN SMALL LETTER H WITH STROKE +&h/@@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE +&I?@@ +0x0129 LATIN SMALL LETTER I WITH TILDE +&i?@@ +0x012a LATIN CAPITAL LETTER I WITH MACRON +&I-@@ +0x012b LATIN SMALL LETTER I WITH MACRON +&i-@@ +0x012c LATIN CAPITAL LETTER I WITH BREVE +&I(@@ +0x012d LATIN SMALL LETTER I WITH BREVE +&i(@@ +0x012e LATIN CAPITAL LETTER I WITH OGONEK +&I;@@ +0x012f LATIN SMALL LETTER I WITH OGONEK +&i;@@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE +&I.@@ +0x0131 LATIN SMALL LETTER I DOTLESS +&i.@@ +0x0132 LATIN CAPITAL LIGATURE IJ +&IJ@@ +0x0133 LATIN SMALL LIGATURE IJ +&ij@@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX +&J>@@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX +&j>@@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA +&K,@@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA +&k,@@ +0x0138 LATIN SMALL LETTER KRA (Greenlandic) +&kk@@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE +&L'@@ +0x013a LATIN SMALL LETTER L WITH ACUTE +&l'@@ +0x013b LATIN CAPITAL LETTER L WITH CEDILLA +&L,@@ +0x013c LATIN SMALL LETTER L WITH CEDILLA +&l,@@ +0x013d LATIN CAPITAL LETTER L WITH CARON +&L<@@ +0x013e LATIN SMALL LETTER L WITH CARON +&l<@@ +0x013f LATIN CAPITAL LETTER L WITH MIDDLE DOT +&L.@@ +0x0140 LATIN SMALL LETTER L WITH MIDDLE DOT +&l.@@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE +&L/@@ +0x0142 LATIN SMALL LETTER L WITH STROKE +&l/@@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE +&N'@@ +0x0144 LATIN SMALL LETTER N WITH ACUTE +&n'@@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA +&N,@@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA +&n,@@ +0x0147 LATIN CAPITAL LETTER N WITH CARON +&N<@@ +0x0148 LATIN SMALL LETTER N WITH CARON +&n<@@ +0x0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +&'n@@ +0x014a LATIN CAPITAL LETTER ENG (Lappish) +&NG@@ +0x014b LATIN SMALL LETTER ENG (Lappish) +&ng@@ +0x014c LATIN CAPITAL LETTER O WITH MACRON +&O-@@ +0x014d LATIN SMALL LETTER O WITH MACRON +&o-@@ +0x014e LATIN CAPITAL LETTER O WITH BREVE +&O(@@ +0x014f LATIN SMALL LETTER O WITH BREVE +&o(@@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +&O"@@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE +&o"@@ +0x0152 LATIN CAPITAL LIGATURE OE +&OE@@ +0x0153 LATIN SMALL LIGATURE OE +&oe@@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE +&R'@@ +0x0155 LATIN SMALL LETTER R WITH ACUTE +&r'@@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA +&R,@@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA +&r,@@ +0x0158 LATIN CAPITAL LETTER R WITH CARON +&R<@@ +0x0159 LATIN SMALL LETTER R WITH CARON +&r<@@ +0x015a LATIN CAPITAL LETTER S WITH ACUTE +&S'@@ +0x015b LATIN SMALL LETTER S WITH ACUTE +&s'@@ +0x015c LATIN CAPITAL LETTER S WITH CIRCUMFLEX +&S>@@ +0x015d LATIN SMALL LETTER S WITH CIRCUMFLEX +&s>@@ +0x015e LATIN CAPITAL LETTER S WITH CEDILLA +&S,@@ +0x015f LATIN SMALL LETTER S WITH CEDILLA +&s,@@ +0x0160 LATIN CAPITAL LETTER S WITH CARON +&S<@@ +0x0161 LATIN SMALL LETTER S WITH CARON +&s<@@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA +&T,@@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA +&t,@@ +0x0164 LATIN CAPITAL LETTER T WITH CARON +&T<@@ +0x0165 LATIN SMALL LETTER T WITH CARON +&t<@@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE +&T/@@ +0x0167 LATIN SMALL LETTER T WITH STROKE +&t/@@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE +&U?@@ +0x0169 LATIN SMALL LETTER U WITH TILDE +&u?@@ +0x016a LATIN CAPITAL LETTER U WITH MACRON +&U-@@ +0x016b LATIN SMALL LETTER U WITH MACRON +&u-@@ +0x016c LATIN CAPITAL LETTER U WITH BREVE +&U(@@ +0x016d LATIN SMALL LETTER U WITH BREVE +&u(@@ +0x016e LATIN CAPITAL LETTER U WITH RING ABOVE +&U0@@ +0x016f LATIN SMALL LETTER U WITH RING ABOVE +&u0@@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +&U"@@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE +&u"@@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK +&U;@@ +0x0173 LATIN SMALL LETTER U WITH OGONEK +&u;@@ +0x0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX +&W>@@ +0x0175 LATIN SMALL LETTER W WITH CIRCUMFLEX +&w>@@ +0x0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +&Y>@@ +0x0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX +&y>@@ +0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +&Y:@@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE +&Z'@@ +0x017a LATIN SMALL LETTER Z WITH ACUTE +&z'@@ +0x017b LATIN CAPITAL LETTER Z WITH DOT ABOVE +&Z.@@ +0x017c LATIN SMALL LETTER Z WITH DOT ABOVE +&z.@@ +0x017d LATIN CAPITAL LETTER Z WITH CARON +&Z<@@ +0x017e LATIN SMALL LETTER Z WITH CARON +&z<@@ +0x01a0 LATIN CAPITAL LETTER O WITH HORN +&O9@@ +0x01a1 LATIN SMALL LETTER O WITH HORN +&o9@@ +0x01a2 LATIN CAPITAL LETTER OI +&OI@@ +0x01a3 LATIN SMALL LETTER OI +&oi@@ +0x01a6 LATIN LETTER YR +&yr@@ +0x01af LATIN CAPITAL LETTER U WITH HORN +&U9@@ +0x01b0 LATIN SMALL LETTER U WITH HORN +&u9@@ +0x01b5 LATIN CAPITAL LETTER Z WITH STROKE +&Z/@@ +0x01b6 LATIN SMALL LETTER Z WITH STROKE +&z/@@ +0x01b7 LATIN CAPITAL LETTER EZH +&ED@@ +0x01cd LATIN CAPITAL LETTER A WITH CARON +&A<@@ +0x01ce LATIN SMALL LETTER A WITH CARON +&a<@@ +0x01cf LATIN CAPITAL LETTER I WITH CARON +&I<@@ +0x01d0 LATIN SMALL LETTER I WITH CARON +&i<@@ +0x01d1 LATIN CAPITAL LETTER O WITH CARON +&O<@@ +0x01d2 LATIN SMALL LETTER O WITH CARON +&o<@@ +0x01d3 LATIN CAPITAL LETTER U WITH CARON +&U<@@ +0x01d4 LATIN SMALL LETTER U WITH CARON +&u<@@ +0x01d5 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +&_U:-_@@ +0x01d6 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +&_u:-_@@ +0x01d7 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +&_U:'_@@ +0x01d8 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +&_u:'_@@ +0x01d9 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +&_U:<_@@ +0x01da LATIN SMALL LETTER U WITH DIAERESIS AND CARON +&_u:<_@@ +0x01db LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +&_U:!_@@ +0x01dc LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +&_u:!_@@ +0x01de LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +&A1@@ +0x01df LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +&a1@@ +0x01e0 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +&A7@@ +0x01e1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +&a7@@ +0x01e2 LATIN CAPITAL LETTER AE WITH MACRON +&A3@@ +0x01e3 LATIN SMALL LETTER AE WITH MACRON +&a3@@ +0x01e4 LATIN CAPITAL LETTER G WITH STROKE +&G/@@ +0x01e5 LATIN SMALL LETTER G WITH STROKE +&g/@@ +0x01e6 LATIN CAPITAL LETTER G WITH CARON +&G<@@ +0x01e7 LATIN SMALL LETTER G WITH CARON +&g<@@ +0x01e8 LATIN CAPITAL LETTER K WITH CARON +&K<@@ +0x01e9 LATIN SMALL LETTER K WITH CARON +&k<@@ +0x01ea LATIN CAPITAL LETTER O WITH OGONEK +&O;@@ +0x01eb LATIN SMALL LETTER O WITH OGONEK +&o;@@ +0x01ec LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +&O1@@ +0x01ed LATIN SMALL LETTER O WITH OGONEK AND MACRON +&o1@@ +0x01ee LATIN CAPITAL LETTER EZH WITH CARON +&EZ@@ +0x01ef LATIN SMALL LETTER EZH WITH CARON +&ez@@ +0x01f0 LATIN SMALL LETTER J WITH CARON +&j<@@ +0x01f4 LATIN CAPITAL LETTER G WITH ACUTE +&G'@@ +0x01f5 LATIN SMALL LETTER G WITH ACUTE +&g'@@ +0x01fa LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +&_AA'_@@ +0x01fb LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +&_aa'_@@ +0x01fc LATIN CAPITAL LETTER AE WITH ACUTE +&_AE'_@@ +0x01fd LATIN SMALL LETTER AE WITH ACUTE +&_ae'_@@ +0x01fe LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +&_O/'_@@ +0x01ff LATIN SMALL LETTER O WITH STROKE AND ACUTE +&_o/'_@@ +0x02bf MODIFIER LETTER LEFT HALF RING +&;S@@ +0x02c7 CARON +&'<@@ +0x02d8 BREVE +&'(@@ +0x02d9 DOT ABOVE +&'.@@ +0x02da RING ABOVE +&'0@@ +0x02db OGONEK +&';@@ +0x02dd DOUBLE ACUTE ACCENT +&'"@@ +0x0386 GREEK CAPITAL LETTER ALPHA WITH ACUTE +&A%@@ +0x0388 GREEK CAPITAL LETTER EPSILON WITH ACUTE +&E%@@ +0x0389 GREEK CAPITAL LETTER ETA WITH ACUTE +&Y%@@ +0x038a GREEK CAPITAL LETTER IOTA WITH ACUTE +&I%@@ +0x038c GREEK CAPITAL LETTER OMICRON WITH ACUTE +&O%@@ +0x038e GREEK CAPITAL LETTER UPSILON WITH ACUTE +&U%@@ +0x038f GREEK CAPITAL LETTER OMEGA WITH ACUTE +&W%@@ +0x0390 GREEK SMALL LETTER IOTA WITH ACUTE AND DIAERESIS +&i3@@ +0x0391 GREEK CAPITAL LETTER ALPHA +&A*@@ +0x0392 GREEK CAPITAL LETTER BETA +&B*@@ +0x0393 GREEK CAPITAL LETTER GAMMA +&G*@@ +0x0394 GREEK CAPITAL LETTER DELTA +&D*@@ +0x0395 GREEK CAPITAL LETTER EPSILON +&E*@@ +0x0396 GREEK CAPITAL LETTER ZETA +&Z*@@ +0x0397 GREEK CAPITAL LETTER ETA +&Y*@@ +0x0398 GREEK CAPITAL LETTER THETA +&H*@@ +0x0399 GREEK CAPITAL LETTER IOTA +&I*@@ +0x039a GREEK CAPITAL LETTER KAPPA +&K*@@ +0x039b GREEK CAPITAL LETTER LAMDA +&L*@@ +0x039c GREEK CAPITAL LETTER MU +&M*@@ +0x039d GREEK CAPITAL LETTER NU +&N*@@ +0x039e GREEK CAPITAL LETTER XI +&C*@@ +0x039f GREEK CAPITAL LETTER OMICRON +&O*@@ +0x03a0 GREEK CAPITAL LETTER PI +&P*@@ +0x03a1 GREEK CAPITAL LETTER RHO +&R*@@ +0x03a3 GREEK CAPITAL LETTER SIGMA +&S*@@ +0x03a4 GREEK CAPITAL LETTER TAU +&T*@@ +0x03a5 GREEK CAPITAL LETTER UPSILON +&U*@@ +0x03a6 GREEK CAPITAL LETTER PHI +&F*@@ +0x03a7 GREEK CAPITAL LETTER CHI +&X*@@ +0x03a8 GREEK CAPITAL LETTER PSI +&Q*@@ +0x03a9 GREEK CAPITAL LETTER OMEGA +&W*@@ +0x03aa GREEK CAPITAL LETTER IOTA WITH DIAERESIS +&J*@@ +0x03ab GREEK CAPITAL LETTER UPSILON WITH DIAERESIS +&V*@@ +0x03ac GREEK SMALL LETTER ALPHA WITH ACUTE +&a%@@ +0x03ad GREEK SMALL LETTER EPSILON WITH ACUTE +&e%@@ +0x03ae GREEK SMALL LETTER ETA WITH ACUTE +&y%@@ +0x03af GREEK SMALL LETTER IOTA WITH ACUTE +&i%@@ +0x03b0 GREEK SMALL LETTER UPSILON WITH ACUTE AND DIAERESIS +&u3@@ +0x03b1 GREEK SMALL LETTER ALPHA +&a*@@ +0x03b2 GREEK SMALL LETTER BETA +&b*@@ +0x03b3 GREEK SMALL LETTER GAMMA +&g*@@ +0x03b4 GREEK SMALL LETTER DELTA +&d*@@ +0x03b5 GREEK SMALL LETTER EPSILON +&e*@@ +0x03b6 GREEK SMALL LETTER ZETA +&z*@@ +0x03b7 GREEK SMALL LETTER ETA +&y*@@ +0x03b8 GREEK SMALL LETTER THETA +&h*@@ +0x03b9 GREEK SMALL LETTER IOTA +&i*@@ +0x03ba GREEK SMALL LETTER KAPPA +&k*@@ +0x03bb GREEK SMALL LETTER LAMDA +&l*@@ +0x03bc GREEK SMALL LETTER MU +&m*@@ +0x03bd GREEK SMALL LETTER NU +&n*@@ +0x03be GREEK SMALL LETTER XI +&c*@@ +0x03bf GREEK SMALL LETTER OMICRON +&o*@@ +0x03c0 GREEK SMALL LETTER PI +&p*@@ +0x03c1 GREEK SMALL LETTER RHO +&r*@@ +0x03c2 GREEK SMALL LETTER FINAL SIGMA +&*s@@ +0x03c3 GREEK SMALL LETTER SIGMA +&s*@@ +0x03c4 GREEK SMALL LETTER TAU +&t*@@ +0x03c5 GREEK SMALL LETTER UPSILON +&u*@@ +0x03c6 GREEK SMALL LETTER PHI +&f*@@ +0x03c7 GREEK SMALL LETTER CHI +&x*@@ +0x03c8 GREEK SMALL LETTER PSI +&q*@@ +0x03c9 GREEK SMALL LETTER OMEGA +&w*@@ +0x03ca GREEK SMALL LETTER IOTA WITH DIAERESIS +&j*@@ +0x03cb GREEK SMALL LETTER UPSILON WITH DIAERESIS +&v*@@ +0x03cc GREEK SMALL LETTER OMICRON WITH ACUTE +&o%@@ +0x03cd GREEK SMALL LETTER UPSILON WITH ACUTE +&u%@@ +0x03ce GREEK SMALL LETTER OMEGA WITH ACUTE +&w%@@ +0x03d8 GREEK NUMERAL SIGN +&'G@@ +0x03d9 GREEK LOWER NUMERAL SIGN +&,G@@ +0x03da GREEK CAPITAL LETTER STIGMA +&T3@@ +0x03db GREEK SMALL LETTER STIGMA +&t3@@ +0x03dc GREEK CAPITAL LETTER DIGAMMA +&M3@@ +0x03dd GREEK SMALL LETTER DIGAMMA +&m3@@ +0x03de GREEK CAPITAL LETTER KOPPA +&K3@@ +0x03df GREEK SMALL LETTER KOPPA +&k3@@ +0x03e0 GREEK CAPITAL LETTER SAMPI +&P3@@ +0x03e1 GREEK SMALL LETTER SAMPI +&p3@@ +0x03f4 ACUTE ACCENT AND DIAERESIS (Tonos and Dialytika) +&'%@@ +0x03f5 GREEK IOTA BELOW +&j3@@ +0x0401 CYRILLIC CAPITAL LETTER IO +&IO@@ +0x0402 CYRILLIC CAPITAL LETTER DJE (Serbocroatian) +&D%@@ +0x0403 CYRILLIC CAPITAL LETTER GJE (Macedonian) +&G%@@ +0x0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE +&IE@@ +0x0405 CYRILLIC CAPITAL LETTER DZE (Macedonian) +&DS@@ +0x0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +&II@@ +0x0407 CYRILLIC CAPITAL LETTER YI (Ukrainian) +&YI@@ +0x0408 CYRILLIC CAPITAL LETTER JE +&J%@@ +0x0409 CYRILLIC CAPITAL LETTER LJE +&LJ@@ +0x040a CYRILLIC CAPITAL LETTER NJE +&NJ@@ +0x040b CYRILLIC CAPITAL LETTER TSHE (Serbocroatian) +&Ts@@ +0x040c CYRILLIC CAPITAL LETTER KJE (Macedonian) +&KJ@@ +0x040e CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) +&V%@@ +0x040f CYRILLIC CAPITAL LETTER DZHE +&DZ@@ +0x0410 CYRILLIC CAPITAL LETTER A +&A=@@ +0x0411 CYRILLIC CAPITAL LETTER BE +&B=@@ +0x0412 CYRILLIC CAPITAL LETTER VE +&V=@@ +0x0413 CYRILLIC CAPITAL LETTER GHE +&G=@@ +0x0414 CYRILLIC CAPITAL LETTER DE +&D=@@ +0x0415 CYRILLIC CAPITAL LETTER IE +&E=@@ +0x0416 CYRILLIC CAPITAL LETTER ZHE +&Z%@@ +0x0417 CYRILLIC CAPITAL LETTER ZE +&Z=@@ +0x0418 CYRILLIC CAPITAL LETTER I +&I=@@ +0x0419 CYRILLIC CAPITAL LETTER SHORT I +&J=@@ +0x041a CYRILLIC CAPITAL LETTER KA +&K=@@ +0x041b CYRILLIC CAPITAL LETTER EL +&L=@@ +0x041c CYRILLIC CAPITAL LETTER EM +&M=@@ +0x041d CYRILLIC CAPITAL LETTER EN +&N=@@ +0x041e CYRILLIC CAPITAL LETTER O +&O=@@ +0x041f CYRILLIC CAPITAL LETTER PE +&P=@@ +0x0420 CYRILLIC CAPITAL LETTER ER +&R=@@ +0x0421 CYRILLIC CAPITAL LETTER ES +&S=@@ +0x0422 CYRILLIC CAPITAL LETTER TE +&T=@@ +0x0423 CYRILLIC CAPITAL LETTER U +&U=@@ +0x0424 CYRILLIC CAPITAL LETTER EF +&F=@@ +0x0425 CYRILLIC CAPITAL LETTER HA +&H=@@ +0x0426 CYRILLIC CAPITAL LETTER TSE +&C=@@ +0x0427 CYRILLIC CAPITAL LETTER CHE +&C%@@ +0x0428 CYRILLIC CAPITAL LETTER SHA +&S%@@ +0x0429 CYRILLIC CAPITAL LETTER SHCHA +&Sc@@ +0x042a CYRILLIC CAPITAL LETTER HARD SIGN +&="@@ +0x042b CYRILLIC CAPITAL LETTER YERU +&Y=@@ +0x042c CYRILLIC CAPITAL LETTER SOFT SIGN +&%"@@ +0x042d CYRILLIC CAPITAL LETTER E +&JE@@ +0x042e CYRILLIC CAPITAL LETTER YU +&JU@@ +0x042f CYRILLIC CAPITAL LETTER YA +&JA@@ +0x0430 CYRILLIC SMALL LETTER A +&a=@@ +0x0431 CYRILLIC SMALL LETTER BE +&b=@@ +0x0432 CYRILLIC SMALL LETTER VE +&v=@@ +0x0433 CYRILLIC SMALL LETTER GHE +&g=@@ +0x0434 CYRILLIC SMALL LETTER DE +&d=@@ +0x0435 CYRILLIC SMALL LETTER IE +&e=@@ +0x0436 CYRILLIC SMALL LETTER ZHE +&z%@@ +0x0437 CYRILLIC SMALL LETTER ZE +&z=@@ +0x0438 CYRILLIC SMALL LETTER I +&i=@@ +0x0439 CYRILLIC SMALL LETTER SHORT I +&j=@@ +0x043a CYRILLIC SMALL LETTER KA +&k=@@ +0x043b CYRILLIC SMALL LETTER EL +&l=@@ +0x043c CYRILLIC SMALL LETTER EM +&m=@@ +0x043d CYRILLIC SMALL LETTER EN +&n=@@ +0x043e CYRILLIC SMALL LETTER O +&o=@@ +0x043f CYRILLIC SMALL LETTER PE +&p=@@ +0x0440 CYRILLIC SMALL LETTER ER +&r=@@ +0x0441 CYRILLIC SMALL LETTER ES +&s=@@ +0x0442 CYRILLIC SMALL LETTER TE +&t=@@ +0x0443 CYRILLIC SMALL LETTER U +&u=@@ +0x0444 CYRILLIC SMALL LETTER EF +&f=@@ +0x0445 CYRILLIC SMALL LETTER HA +&h=@@ +0x0446 CYRILLIC SMALL LETTER TSE +&c=@@ +0x0447 CYRILLIC SMALL LETTER CHE +&c%@@ +0x0448 CYRILLIC SMALL LETTER SHA +&s%@@ +0x0449 CYRILLIC SMALL LETTER SHCHA +&sc@@ +0x044a CYRILLIC SMALL LETTER HARD SIGN +&='@@ +0x044b CYRILLIC SMALL LETTER YERU +&y=@@ +0x044c CYRILLIC SMALL LETTER SOFT SIGN +&%'@@ +0x044d CYRILLIC SMALL LETTER E +&je@@ +0x044e CYRILLIC SMALL LETTER YU +&ju@@ +0x044f CYRILLIC SMALL LETTER YA +&ja@@ +0x0451 CYRILLIC SMALL LETTER IO +&io@@ +0x0452 CYRILLIC SMALL LETTER DJE (Serbocroatian) +&d%@@ +0x0453 CYRILLIC SMALL LETTER GJE (Macedonian) +&g%@@ +0x0454 CYRILLIC SMALL LETTER UKRAINIAN IE +&ie@@ +0x0455 CYRILLIC SMALL LETTER DZE (Macedonian) +&ds@@ +0x0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +&ii@@ +0x0457 CYRILLIC SMALL LETTER YI (Ukrainian) +&yi@@ +0x0458 CYRILLIC SMALL LETTER JE +&j%@@ +0x0459 CYRILLIC SMALL LETTER LJE +&lj@@ +0x045a CYRILLIC SMALL LETTER NJE +&nj@@ +0x045b CYRILLIC SMALL LETTER TSHE (Serbocroatian) +&ts@@ +0x045c CYRILLIC SMALL LETTER KJE (Macedonian) +&kj@@ +0x045e CYRILLIC SMALL LETTER SHORT U (Byelorussian) +&v%@@ +0x045f CYRILLIC SMALL LETTER DZHE +&dz@@ +0x0462 CYRILLIC CAPITAL LETTER YAT +&Y3@@ +0x0463 CYRILLIC SMALL LETTER YAT +&y3@@ +0x046a CYRILLIC CAPITAL LETTER BIG YUS +&O3@@ +0x046b CYRILLIC SMALL LETTER BIG YUS +&o3@@ +0x0472 CYRILLIC CAPITAL LETTER FITA +&F3@@ +0x0473 CYRILLIC SMALL LETTER FITA +&f3@@ +0x0474 CYRILLIC CAPITAL LETTER IZHITSA +&V3@@ +0x0475 CYRILLIC SMALL LETTER IZHITSA +&v3@@ +0x0480 CYRILLIC CAPITAL LETTER KOPPA +&C3@@ +0x0481 CYRILLIC SMALL LETTER KOPPA +&c3@@ +0x0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN +&G3@@ +0x0491 CYRILLIC SMALL LETTER GHE WITH UPTURN +&g3@@ +0x05d0 HEBREW LETTER ALEF +&A+@@ +0x05d1 HEBREW LETTER BET +&B+@@ +0x05d2 HEBREW LETTER GIMEL +&G+@@ +0x05d3 HEBREW LETTER DALET +&D+@@ +0x05d4 HEBREW LETTER HE +&H+@@ +0x05d5 HEBREW LETTER VAV +&W+@@ +0x05d6 HEBREW LETTER ZAYIN +&Z+@@ +0x05d7 HEBREW LETTER HET +&X+@@ +0x05d8 HEBREW LETTER TET +&Tj@@ +0x05d9 HEBREW LETTER YOD +&J+@@ +0x05da HEBREW LETTER FINAL KAF +&K%@@ +0x05db HEBREW LETTER KAF +&K+@@ +0x05dc HEBREW LETTER LAMED +&L+@@ +0x05dd HEBREW LETTER FINAL MEM +&M%@@ +0x05de HEBREW LETTER MEM +&M+@@ +0x05df HEBREW LETTER FINAL NUN +&N%@@ +0x05e0 HEBREW LETTER NUN +&N+@@ +0x05e1 HEBREW LETTER SAMEKH +&S+@@ +0x05e2 HEBREW LETTER AYIN +&E+@@ +0x05e3 HEBREW LETTER FINAL PE +&P%@@ +0x05e4 HEBREW LETTER PE +&P+@@ +0x05e5 HEBREW LETTER FINAL TSADI +&Zj@@ +0x05e6 HEBREW LETTER TSADI +&ZJ@@ +0x05e7 HEBREW LETTER QOF +&Q+@@ +0x05e8 HEBREW LETTER RESH +&R+@@ +0x05e9 HEBREW LETTER SHIN +&Sh@@ +0x05ea HEBREW LETTER TAV +&T+@@ +0x060c ARABIC COMMA +&,+@@ +0x061b ARABIC SEMICOLON +&;+@@ +0x061f ARABIC QUESTION MARK +&?+@@ +0x0621 ARABIC LETTER HAMZA +&H'@@ +0x0622 ARABIC LETTER ALEF WITH MADDA ABOVE +&aM@@ +0x0623 ARABIC LETTER ALEF WITH HAMZA ABOVE +&aH@@ +0x0624 ARABIC LETTER WAW WITH HAMZA ABOVE +&wH@@ +0x0625 ARABIC LETTER ALEF WITH HAMZA BELOW +&ah@@ +0x0626 ARABIC LETTER YEH WITH HAMZA ABOVE +&yH@@ +0x0627 ARABIC LETTER ALEF +&a+@@ +0x0628 ARABIC LETTER BEH +&b+@@ +0x0629 ARABIC LETTER TEH MARBUTA +&tm@@ +0x062a ARABIC LETTER TEH +&t+@@ +0x062b ARABIC LETTER THEH +&tk@@ +0x062c ARABIC LETTER JEEM +&g+@@ +0x062d ARABIC LETTER HAH +&hk@@ +0x062e ARABIC LETTER KHAH +&x+@@ +0x062f ARABIC LETTER DAL +&d+@@ +0x0630 ARABIC LETTER THAL +&dk@@ +0x0631 ARABIC LETTER REH +&r+@@ +0x0632 ARABIC LETTER ZAIN +&z+@@ +0x0633 ARABIC LETTER SEEN +&s+@@ +0x0634 ARABIC LETTER SHEEN +&sn@@ +0x0635 ARABIC LETTER SAD +&c+@@ +0x0636 ARABIC LETTER DAD +&dd@@ +0x0637 ARABIC LETTER TAH +&tj@@ +0x0638 ARABIC LETTER ZAH +&zH@@ +0x0639 ARABIC LETTER AIN +&e+@@ +0x063a ARABIC LETTER GHAIN +&i+@@ +0x0640 ARABIC TATWEEL +&++@@ +0x0641 ARABIC LETTER FEH +&f+@@ +0x0642 ARABIC LETTER QAF +&q+@@ +0x0643 ARABIC LETTER KAF +&k+@@ +0x0644 ARABIC LETTER LAM +&l+@@ +0x0645 ARABIC LETTER MEEM +&m+@@ +0x0646 ARABIC LETTER NOON +&n+@@ +0x0647 ARABIC LETTER HEH +&h+@@ +0x0648 ARABIC LETTER WAW +&w+@@ +0x0649 ARABIC LETTER ALEF MAKSURA +&j+@@ +0x064a ARABIC LETTER YEH +&y+@@ +0x064b ARABIC FATHATAN +&:+@@ +0x064c ARABIC DAMMATAN +&"+@@ +0x064d ARABIC KASRATAN +&=+@@ +0x064e ARABIC FATHA +&/+@@ +0x064f ARABIC DAMMA +&'+@@ +0x0650 ARABIC KASRA +&1+@@ +0x0651 ARABIC SHADDA +&3+@@ +0x0652 ARABIC SUKUN +&0+@@ +0x0670 SUPERSCRIPT ARABIC LETTER ALEF +&aS@@ +0x067e ARABIC LETTER PEH +&p+@@ +0x06a4 ARABIC LETTER VEH +&v+@@ +0x06af ARABIC LETTER GAF +&gf@@ +0x06f0 EASTERN ARABIC-INDIC DIGIT ZERO +&0a@@ +0x06f1 EASTERN ARABIC-INDIC DIGIT ONE +&1a@@ +0x06f2 EASTERN ARABIC-INDIC DIGIT TWO +&2a@@ +0x06f3 EASTERN ARABIC-INDIC DIGIT THREE +&3a@@ +0x06f4 EASTERN ARABIC-INDIC DIGIT FOUR +&4a@@ +0x06f5 EASTERN ARABIC-INDIC DIGIT FIVE +&5a@@ +0x06f6 EASTERN ARABIC-INDIC DIGIT SIX +&6a@@ +0x06f7 EASTERN ARABIC-INDIC DIGIT SEVEN +&7a@@ +0x06f8 EASTERN ARABIC-INDIC DIGIT EIGHT +&8a@@ +0x06f9 EASTERN ARABIC-INDIC DIGIT NINE +&9a@@ +0x1e00 LATIN CAPITAL LETTER A WITH RING BELOW +&_A-0_@@ +0x1e01 LATIN SMALL LETTER A WITH RING BELOW +&_a-0_@@ +0x1e02 LATIN CAPITAL LETTER B WITH DOT ABOVE +&B.@@ +0x1e03 LATIN SMALL LETTER B WITH DOT ABOVE +&b.@@ +0x1e04 LATIN CAPITAL LETTER B WITH DOT BELOW +&_B-._@@ +0x1e05 LATIN SMALL LETTER B WITH DOT BELOW +&_b-._@@ +0x1e06 LATIN CAPITAL LETTER B WITH LINE BELOW +&B_@@ +0x1e07 LATIN SMALL LETTER B WITH LINE BELOW +&b_@@ +0x1e08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +&_C,'_@@ +0x1e09 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +&_c,'_@@ +0x1e0a LATIN CAPITAL LETTER D WITH DOT ABOVE +&D.@@ +0x1e0b LATIN SMALL LETTER D WITH DOT ABOVE +&d.@@ +0x1e0c LATIN CAPITAL LETTER D WITH DOT BELOW +&_D-._@@ +0x1e0d LATIN SMALL LETTER D WITH DOT BELOW +&_d-._@@ +0x1e0e LATIN CAPITAL LETTER D WITH LINE BELOW +&D_@@ +0x1e0f LATIN SMALL LETTER D WITH LINE BELOW +&d_@@ +0x1e10 LATIN CAPITAL LETTER D WITH CEDILLA +&D,@@ +0x1e11 LATIN SMALL LETTER D WITH CEDILLA +&d,@@ +0x1e12 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +&_D->_@@ +0x1e13 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +&_d->_@@ +0x1e14 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +&_E-!_@@ +0x1e15 LATIN SMALL LETTER E WITH MACRON AND GRAVE +&_e-!_@@ +0x1e16 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +&_E-'_@@ +0x1e17 LATIN SMALL LETTER E WITH MACRON AND ACUTE +&_e-'_@@ +0x1e18 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +&_E->_@@ +0x1e19 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +&_e->_@@ +0x1e1a LATIN CAPITAL LETTER E WITH TILDE BELOW +&_E-?_@@ +0x1e1b LATIN SMALL LETTER E WITH TILDE BELOW +&_e-?_@@ +0x1e1c LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +&_E,(_@@ +0x1e1d LATIN SMALL LETTER E WITH CEDILLA AND BREVE +&_e,(_@@ +0x1e1e LATIN CAPITAL LETTER F WITH DOT ABOVE +&F.@@ +0x1e1f LATIN SMALL LETTER F WITH DOT ABOVE +&f.@@ +0x1e20 LATIN CAPITAL LETTER G WITH MACRON +&G-@@ +0x1e21 LATIN SMALL LETTER G WITH MACRON +&g-@@ +0x1e22 LATIN CAPITAL LETTER H WITH DOT ABOVE +&H.@@ +0x1e23 LATIN SMALL LETTER H WITH DOT ABOVE +&h.@@ +0x1e24 LATIN CAPITAL LETTER H WITH DOT BELOW +&_H-._@@ +0x1e25 LATIN SMALL LETTER H WITH DOT BELOW +&_h-._@@ +0x1e26 LATIN CAPITAL LETTER H WITH DIAERESIS +&H:@@ +0x1e27 LATIN SMALL LETTER H WITH DIAERESIS +&h:@@ +0x1e28 LATIN CAPITAL LETTER H WITH CEDILLA +&H,@@ +0x1e29 LATIN SMALL LETTER H WITH CEDILLA +&h,@@ +0x1e2a LATIN CAPITAL LETTER H WITH BREVE BELOW +&_H-(_@@ +0x1e2b LATIN SMALL LETTER H WITH BREVE BELOW +&_h-(_@@ +0x1e2c LATIN CAPITAL LETTER I WITH TILDE BELOW +&_I-?_@@ +0x1e2d LATIN SMALL LETTER I WITH TILDE BELOW +&_i-?_@@ +0x1e2e LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +&_I:'_@@ +0x1e2f LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +&_i:'_@@ +0x1e30 LATIN CAPITAL LETTER K WITH ACUTE +&K'@@ +0x1e31 LATIN SMALL LETTER K WITH ACUTE +&k'@@ +0x1e32 LATIN CAPITAL LETTER K WITH DOT BELOW +&_K-._@@ +0x1e33 LATIN SMALL LETTER K WITH DOT BELOW +&_k-._@@ +0x1e34 LATIN CAPITAL LETTER K WITH LINE BELOW +&K_@@ +0x1e35 LATIN SMALL LETTER K WITH LINE BELOW +&k_@@ +0x1e36 LATIN CAPITAL LETTER L WITH DOT BELOW +&_L-._@@ +0x1e37 LATIN SMALL LETTER L WITH DOT BELOW +&_l-._@@ +0x1e38 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +&_L--._@@ +0x1e39 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +&_l--._@@ +0x1e3a LATIN CAPITAL LETTER L WITH LINE BELOW +&L_@@ +0x1e3b LATIN SMALL LETTER L WITH LINE BELOW +&l_@@ +0x1e3c LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +&_L->_@@ +0x1e3d LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +&_l->_@@ +0x1e3e LATIN CAPITAL LETTER M WITH ACUTE +&M'@@ +0x1e3f LATIN SMALL LETTER M WITH ACUTE +&m'@@ +0x1e40 LATIN CAPITAL LETTER M WITH DOT ABOVE +&M.@@ +0x1e41 LATIN SMALL LETTER M WITH DOT ABOVE +&m.@@ +0x1e42 LATIN CAPITAL LETTER M WITH DOT BELOW +&_M-._@@ +0x1e43 LATIN SMALL LETTER M WITH DOT BELOW +&_m-._@@ +0x1e44 LATIN CAPITAL LETTER N WITH DOT ABOVE +&N.@@ +0x1e45 LATIN SMALL LETTER N WITH DOT ABOVE +&n.@@ +0x1e46 LATIN CAPITAL LETTER N WITH DOT BELOW +&_N-._@@ +0x1e47 LATIN SMALL LETTER N WITH DOT BELOW +&_n-._@@ +0x1e48 LATIN CAPITAL LETTER N WITH LINE BELOW +&N_@@ +0x1e49 LATIN SMALL LETTER N WITH LINE BELOW +&n_@@ +0x1e4a LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +&_N->_@@ +0x1e4b LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +&_N->_@@ +0x1e4c LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +&_O?'_@@ +0x1e4d LATIN SMALL LETTER O WITH TILDE AND ACUTE +&_o?'_@@ +0x1e4e LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +&_O?:_@@ +0x1e4f LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +&_o?:_@@ +0x1e50 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +&_O-!_@@ +0x1e51 LATIN SMALL LETTER O WITH MACRON AND GRAVE +&_o-!_@@ +0x1e52 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +&_O-'_@@ +0x1e53 LATIN SMALL LETTER O WITH MACRON AND ACUTE +&_o-'_@@ +0x1e54 LATIN CAPITAL LETTER P WITH ACUTE +&P'@@ +0x1e55 LATIN SMALL LETTER P WITH ACUTE +&p'@@ +0x1e56 LATIN CAPITAL LETTER P WITH DOT ABOVE +&P.@@ +0x1e57 LATIN SMALL LETTER P WITH DOT ABOVE +&p.@@ +0x1e58 LATIN CAPITAL LETTER R WITH DOT ABOVE +&R.@@ +0x1e59 LATIN SMALL LETTER R WITH DOT ABOVE +&r.@@ +0x1e5a LATIN CAPITAL LETTER R WITH DOT BELOW +&_R-._@@ +0x1e5b LATIN SMALL LETTER R WITH DOT BELOW +&_r-._@@ +0x1e5c LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +&_R--._@@ +0x1e5d LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +&_r--._@@ +0x1e5e LATIN CAPITAL LETTER R WITH LINE BELOW +&R_@@ +0x1e5f LATIN SMALL LETTER R WITH LINE BELOW +&r_@@ +0x1e60 LATIN CAPITAL LETTER S WITH DOT ABOVE +&S.@@ +0x1e61 LATIN SMALL LETTER S WITH DOT ABOVE +&s.@@ +0x1e62 LATIN CAPITAL LETTER S WITH DOT BELOW +&_S-._@@ +0x1e63 LATIN SMALL LETTER S WITH DOT BELOW +&_s-._@@ +0x1e64 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +&_S'._@@ +0x1e65 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +&_s'._@@ +0x1e66 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +&_S<._@@ +0x1e67 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +&_s<._@@ +0x1e68 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +&_S.-._@@ +0x1e69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +&_S.-._@@ +0x1e6a LATIN CAPITAL LETTER T WITH DOT ABOVE +&T.@@ +0x1e6b LATIN SMALL LETTER T WITH DOT ABOVE +&t.@@ +0x1e6c LATIN CAPITAL LETTER T WITH DOT BELOW +&_T-._@@ +0x1e6d LATIN SMALL LETTER T WITH DOT BELOW +&_t-._@@ +0x1e6e LATIN CAPITAL LETTER T WITH LINE BELOW +&T_@@ +0x1e6f LATIN SMALL LETTER T WITH LINE BELOW +&t_@@ +0x1e70 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +&_T->_@@ +0x1e71 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +&_t->_@@ +0x1e72 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +&_U--:_@@ +0x1e73 LATIN SMALL LETTER U WITH DIAERESIS BELOW +&_u--:_@@ +0x1e74 LATIN CAPITAL LETTER U WITH TILDE BELOW +&_U-?_@@ +0x1e75 LATIN SMALL LETTER U WITH TILDE BELOW +&_u-?_@@ +0x1e76 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +&_U->_@@ +0x1e77 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +&_u->_@@ +0x1e78 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +&_U?'_@@ +0x1e79 LATIN SMALL LETTER U WITH TILDE AND ACUTE +&_u?'_@@ +0x1e7a LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +&_U-:_@@ +0x1e7b LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +&_u-:_@@ +0x1e7c LATIN CAPITAL LETTER V WITH TILDE +&V?@@ +0x1e7d LATIN SMALL LETTER V WITH TILDE +&v?@@ +0x1e7e LATIN CAPITAL LETTER V WITH DOT BELOW +&_V-._@@ +0x1e7f LATIN SMALL LETTER V WITH DOT BELOW +&_v-._@@ +0x1e80 LATIN CAPITAL LETTER W WITH GRAVE +&W!@@ +0x1e81 LATIN SMALL LETTER W WITH GRAVE +&w!@@ +0x1e82 LATIN CAPITAL LETTER W WITH ACUTE +&W'@@ +0x1e83 LATIN SMALL LETTER W WITH ACUTE +&w'@@ +0x1e84 LATIN CAPITAL LETTER W WITH DIAERESIS +&W:@@ +0x1e85 LATIN SMALL LETTER W WITH DIAERESIS +&w:@@ +0x1e86 LATIN CAPITAL LETTER W WITH DOT ABOVE +&W.@@ +0x1e87 LATIN SMALL LETTER W WITH DOT ABOVE +&w.@@ +0x1e88 LATIN CAPITAL LETTER W WITH DOT BELOW +&_W-._@@ +0x1e89 LATIN SMALL LETTER W WITH DOT BELOW +&_w-._@@ +0x1e8a LATIN CAPITAL LETTER X WITH DOT ABOVE +&X.@@ +0x1e8b LATIN SMALL LETTER X WITH DOT ABOVE +&x.@@ +0x1e8c LATIN CAPITAL LETTER X WITH DIAERESIS +&X:@@ +0x1e8d LATIN SMALL LETTER X WITH DIAERESIS +&x:@@ +0x1e8e LATIN CAPITAL LETTER Y WITH DOT ABOVE +&Y.@@ +0x1e8f LATIN SMALL LETTER Y WITH DOT ABOVE +&y.@@ +0x1e90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +&Z>@@ +0x1e91 LATIN SMALL LETTER Z WITH CIRCUMFLEX +&z>@@ +0x1e92 LATIN CAPITAL LETTER Z WITH DOT BELOW +&_Z-._@@ +0x1e93 LATIN SMALL LETTER Z WITH DOT BELOW +&_z-._@@ +0x1e94 LATIN CAPITAL LETTER Z WITH LINE BELOW +&Z_@@ +0x1e95 LATIN SMALL LETTER Z WITH LINE BELOW +&z_@@ +0x1e96 LATIN SMALL LETTER H WITH LINE BELOW +&h_@@ +0x1e97 LATIN SMALL LETTER T WITH DIAERESIS +&t:@@ +0x1e98 LATIN SMALL LETTER W WITH RING ABOVE +&w0@@ +0x1e99 LATIN SMALL LETTER Y WITH RING ABOVE +&y0@@ +0x1ea0 LATIN CAPITAL LETTER A WITH DOT BELOW +&_A-._@@ +0x1ea1 LATIN SMALL LETTER A WITH DOT BELOW +&_a-._@@ +0x1ea2 LATIN CAPITAL LETTER A WITH HOOK ABOVE +&A2@@ +0x1ea3 LATIN SMALL LETTER A WITH HOOK ABOVE +&a2@@ +0x1ea4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +&_A>'_@@ +0x1ea5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +&_a>'_@@ +0x1ea6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +&_A>!_@@ +0x1ea7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +&_a>!_@@ +0x1ea8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +&_A>2_@@ +0x1ea9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +&_a>2_@@ +0x1eaa LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +&_A>?_@@ +0x1eab LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +&_a>?_@@ +0x1eac LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +&_A>-._@@ +0x1ead LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +&_a>-._@@ +0x1eae LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +&_A('_@@ +0x1eaf LATIN SMALL LETTER A WITH BREVE AND ACUTE +&_a('_@@ +0x1eb0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +&_A(!_@@ +0x1eb1 LATIN SMALL LETTER A WITH BREVE AND GRAVE +&_a(!_@@ +0x1eb2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +&_A(2_@@ +0x1eb3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +&_a(2_@@ +0x1eb4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE +&_A(?_@@ +0x1eb5 LATIN SMALL LETTER A WITH BREVE AND TILDE +&_a(?_@@ +0x1eb6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +&_A(-._@@ +0x1eb7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +&_a(-._@@ +0x1eb8 LATIN CAPITAL LETTER E WITH DOT BELOW +&_E-._@@ +0x1eb9 LATIN SMALL LETTER E WITH DOT BELOW +&_e-._@@ +0x1eba LATIN CAPITAL LETTER E WITH HOOK ABOVE +&E2@@ +0x1ebb LATIN SMALL LETTER E WITH HOOK ABOVE +&e2@@ +0x1ebc LATIN CAPITAL LETTER E WITH TILDE +&E?@@ +0x1ebd LATIN SMALL LETTER E WITH TILDE +&e?@@ +0x1ebe LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +&_E>'_@@ +0x1ebf LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +&_e>'_@@ +0x1ec0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +&_E>!_@@ +0x1ec1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +&_e>!_@@ +0x1ec2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +&_E>2_@@ +0x1ec3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +&_e>2_@@ +0x1ec4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +&_E>?_@@ +0x1ec5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +&_e>?_@@ +0x1ec6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +&_E>-._@@ +0x1ec7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +&_e>-._@@ +0x1ec8 LATIN CAPITAL LETTER I WITH HOOK ABOVE +&I2@@ +0x1ec9 LATIN SMALL LETTER I WITH HOOK ABOVE +&i2@@ +0x1eca LATIN CAPITAL LETTER I WITH DOT BELOW +&_I-._@@ +0x1ecb LATIN SMALL LETTER I WITH DOT BELOW +&_i-._@@ +0x1ecc LATIN CAPITAL LETTER O WITH DOT BELOW +&_O-._@@ +0x1ecd LATIN SMALL LETTER O WITH DOT BELOW +&_o-._@@ +0x1ece LATIN CAPITAL LETTER O WITH HOOK ABOVE +&O2@@ +0x1ecf LATIN SMALL LETTER O WITH HOOK ABOVE +&o2@@ +0x1ed0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +&_O>'_@@ +0x1ed1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +&_o>'_@@ +0x1ed2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +&_O>!_@@ +0x1ed3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +&_o>!_@@ +0x1ed4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +&_O>2_@@ +0x1ed5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +&_o>2_@@ +0x1ed6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +&_O>?_@@ +0x1ed7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +&_o>?_@@ +0x1ed8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +&_O>-._@@ +0x1ed9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +&_o>-._@@ +0x1eda LATIN CAPITAL LETTER O WITH HORN AND ACUTE +&_O9'_@@ +0x1edb LATIN SMALL LETTER O WITH HORN AND ACUTE +&_o9'_@@ +0x1edc LATIN CAPITAL LETTER O WITH HORN AND GRAVE +&_O9!_@@ +0x1edd LATIN SMALL LETTER O WITH HORN AND GRAVE +&_o9!_@@ +0x1ede LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +&_O92_@@ +0x1edf LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +&_o92_@@ +0x1ee0 LATIN CAPITAL LETTER O WITH HORN AND TILDE +&_O9?_@@ +0x1ee1 LATIN SMALL LETTER O WITH HORN AND TILDE +&_o9?_@@ +0x1ee2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +&_O9-._@@ +0x1ee3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW +&_o9-._@@ +0x1ee4 LATIN CAPITAL LETTER U WITH DOT BELOW +&_U-._@@ +0x1ee5 LATIN SMALL LETTER U WITH DOT BELOW +&_u-._@@ +0x1ee6 LATIN CAPITAL LETTER U WITH HOOK ABOVE +&U2@@ +0x1ee7 LATIN SMALL LETTER U WITH HOOK ABOVE +&u2@@ +0x1ee8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE +&_U9'_@@ +0x1ee9 LATIN SMALL LETTER U WITH HORN AND ACUTE +&_u9'_@@ +0x1eea LATIN CAPITAL LETTER U WITH HORN AND GRAVE +&_U9!_@@ +0x1eeb LATIN SMALL LETTER U WITH HORN AND GRAVE +&_u9!_@@ +0x1eec LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +&_U92_@@ +0x1eed LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +&_u92_@@ +0x1eee LATIN CAPITAL LETTER U WITH HORN AND TILDE +&_U9?_@@ +0x1eef LATIN SMALL LETTER U WITH HORN AND TILDE +&_u9?_@@ +0x1ef0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +&_U9-._@@ +0x1ef1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW +&_u9-._@@ +0x1ef2 LATIN CAPITAL LETTER Y WITH GRAVE +&Y!@@ +0x1ef3 LATIN SMALL LETTER Y WITH GRAVE +&y!@@ +0x1ef4 LATIN CAPITAL LETTER Y WITH DOT BELOW +&_Y-._@@ +0x1ef5 LATIN SMALL LETTER Y WITH DOT BELOW +&_y-._@@ +0x1ef6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE +&Y2@@ +0x1ef7 LATIN SMALL LETTER Y WITH HOOK ABOVE +&y2@@ +0x1ef8 LATIN CAPITAL LETTER Y WITH TILDE +&Y?@@ +0x1ef9 LATIN SMALL LETTER Y WITH TILDE +&y?@@ +0x1f00 GREEK DASIA AND ACUTE ACCENT +&;'@@ +0x1f01 GREEK PSILI AND ACUTE ACCENT +&,'@@ +0x1f02 GREEK DASIA AND VARIA +&;!@@ +0x1f03 GREEK PSILI AND VARIA +&,!@@ +0x1f04 GREEK DASIA AND PERISPOMENI +&?;@@ +0x1f05 GREEK PSILI AND PERISPOMENI +&?,@@ +0x1f06 GREEK DIAERESIS AND VARIA +&!:@@ +0x1f07 GREEK DIAERESIS AND PERISPOMENI +&?:@@ +0x2002 EN SPACE +&1N@@ +0x2003 EM SPACE +&1M@@ +0x2004 THREE-PER-EM SPACE +&3M@@ +0x2005 FOUR-PER-EM SPACE +&4M@@ +0x2006 SIX-PER-EM SPACE +&6M@@ +0x2009 THIN SPACE +&1T@@ +0x200a HAIR SPACE +&1H@@ +0x2010 HYPHEN +&-1@@ +0x2013 EN DASH +&-N@@ +0x2014 EM DASH +&-M@@ +0x2015 HORIZONTAL BAR +&-3@@ +0x2016 DOUBLE VERTICAL LINE +&!2@@ +0x2017 DOUBLE LOW LINE +&=2@@ +0x2018 LEFT SINGLE QUOTATION MARK +&'6@@ +0x2019 RIGHT SINGLE QUOTATION MARK +&'9@@ +0x201a SINGLE LOW-9 QUOTATION MARK +&.9@@ +0x201b SINGLE HIGH-REVERSED-9 QUOTATION MARK +&9'@@ +0x201c LEFT DOUBLE QUOTATION MARK +&"6@@ +0x201d RIGHT DOUBLE QUOTATION MARK +&"9@@ +0x201e DOUBLE LOW-9 QUOTATION MARK +&:9@@ +0x201f DOUBLE HIGH-REVERSED-9 QUOTATION MARK +&9"@@ +0x2020 DAGGER +&/-@@ +0x2021 DOUBLE DAGGER +&/=@@ +0x2025 TWO DOT LEADER +&..@@ +0x2030 PER MILLE SIGN +&%0@@ +0x2032 PRIME +&1'@@ +0x2033 DOUBLE PRIME +&2'@@ +0x2034 TRIPLE PRIME +&3'@@ +0x2035 REVERSED PRIME +&1"@@ +0x2036 REVERSED DOUBLE PRIME +&2"@@ +0x2037 REVERSED TRIPLE PRIME +&3"@@ +0x2038 CARET +&Ca@@ +0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK +&<1@@ +0x203a SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +&>1@@ +0x203b REFERENCE MARK +&:X@@ +0x203c DOUBLE EXCLAMATION MARK +&_!*2_@@ +0x203e OVERLINE +&'-@@ +0x2044 FRACTION SLASH +&/f@@ +0x2070 SUPERSCRIPT DIGIT ZERO +&0S@@ +0x2074 SUPERSCRIPT DIGIT FOUR +&4S@@ +0x2075 SUPERSCRIPT DIGIT FIVE +&5S@@ +0x2076 SUPERSCRIPT DIGIT SIX +&6S@@ +0x2077 SUPERSCRIPT DIGIT SEVEN +&7S@@ +0x2078 SUPERSCRIPT DIGIT EIGHT +&8S@@ +0x2079 SUPERSCRIPT DIGIT NINE +&9S@@ +0x207a SUPERSCRIPT PLUS SIGN +&+S@@ +0x207b SUPERSCRIPT MINUS +&-S@@ +0x207c SUPERSCRIPT EQUALS SIGN +&=S@@ +0x207d SUPERSCRIPT LEFT PARENTHESIS +&(S@@ +0x207e SUPERSCRIPT RIGHT PARENTHESIS +&)S@@ +0x207f SUPERSCRIPT LATIN SMALL LETTER N +&nS@@ +0x2080 SUBSCRIPT DIGIT ZERO +&0s@@ +0x2081 SUBSCRIPT DIGIT ONE +&1s@@ +0x2082 SUBSCRIPT DIGIT TWO +&2s@@ +0x2083 SUBSCRIPT DIGIT THREE +&3s@@ +0x2084 SUBSCRIPT DIGIT FOUR +&4s@@ +0x2085 SUBSCRIPT DIGIT FIVE +&5s@@ +0x2086 SUBSCRIPT DIGIT SIX +&6s@@ +0x2087 SUBSCRIPT DIGIT SEVEN +&7s@@ +0x2088 SUBSCRIPT DIGIT EIGHT +&8s@@ +0x2089 SUBSCRIPT DIGIT NINE +&9s@@ +0x208a SUBSCRIPT PLUS SIGN +&+s@@ +0x208b SUBSCRIPT MINUS +&-s@@ +0x208c SUBSCRIPT EQUALS SIGN +&=s@@ +0x208d SUBSCRIPT LEFT PARENTHESIS +&(s@@ +0x208e SUBSCRIPT RIGHT PARENTHESIS +&)s@@ +0x20a4 LIRA SIGN +&Li@@ +0x20a7 PESETA SIGN +&Pt@@ +0x20a9 WON SIGN +&W=@@ +0x2103 DEGREE CENTIGRADE +&oC@@ +0x2105 CARE OF +&co@@ +0x2109 DEGREE FAHRENHEIT +&oF@@ +0x2116 NUMERO SIGN +&N0@@ +0x2117 SOUND RECORDING COPYRIGHT +&PO@@ +0x211e PRESCRIPTION TAKE +&Rx@@ +0x2120 SERVICE MARK +&SM@@ +0x2122 TRADE MARK SIGN +&TM@@ +0x2126 OHM SIGN +&Om@@ +0x212b ANGSTROEM SIGN +&AO@@ +0x2153 VULGAR FRACTION ONE THIRD +&13@@ +0x2154 VULGAR FRACTION TWO THIRDS +&23@@ +0x2155 VULGAR FRACTION ONE FIFTH +&15@@ +0x2156 VULGAR FRACTION TWO FIFTHS +&25@@ +0x2157 VULGAR FRACTION THREE FIFTHS +&35@@ +0x2158 VULGAR FRACTION FOUR FIFTHS +&45@@ +0x2159 VULGAR FRACTION ONE SIXTH +&16@@ +0x215a VULGAR FRACTION FIVE SIXTHS +&56@@ +0x215b VULGAR FRACTION ONE EIGHTH +&18@@ +0x215c VULGAR FRACTION THREE EIGHTHS +&38@@ +0x215d VULGAR FRACTION FIVE EIGHTHS +&58@@ +0x215e VULGAR FRACTION SEVEN EIGHTHS +&78@@ +0x2160 ROMAN NUMERAL ONE +&1R@@ +0x2161 ROMAN NUMERAL TWO +&2R@@ +0x2162 ROMAN NUMERAL THREE +&3R@@ +0x2163 ROMAN NUMERAL FOUR +&4R@@ +0x2164 ROMAN NUMERAL FIVE +&5R@@ +0x2165 ROMAN NUMERAL SIX +&6R@@ +0x2166 ROMAN NUMERAL SEVEN +&7R@@ +0x2167 ROMAN NUMERAL EIGHT +&8R@@ +0x2168 ROMAN NUMERAL NINE +&9R@@ +0x2169 ROMAN NUMERAL TEN +&aR@@ +0x216a ROMAN NUMERAL ELEVEN +&bR@@ +0x216b ROMAN NUMERAL TWELVE +&cR@@ +0x216c ROMAN NUMERAL FIFTY +&_50R_@@ +0x216d ROMAN NUMERAL ONE HUNDRED +&_100R_@@ +0x216e ROMAN NUMERAL FIVE HUNDRED +&_500R_@@ +0x216f ROMAN NUMERAL ONE THOUSAND +&_1000R_@@ +0x2170 SMALL ROMAN NUMERAL ONE +&1r@@ +0x2171 SMALL ROMAN NUMERAL TWO +&2r@@ +0x2172 SMALL ROMAN NUMERAL THREE +&3r@@ +0x2173 SMALL ROMAN NUMERAL FOUR +&4r@@ +0x2174 SMALL ROMAN NUMERAL FIVE +&5r@@ +0x2175 SMALL ROMAN NUMERAL SIX +&6r@@ +0x2176 SMALL ROMAN NUMERAL SEVEN +&7r@@ +0x2177 SMALL ROMAN NUMERAL EIGHT +&8r@@ +0x2178 SMALL ROMAN NUMERAL NINE +&9r@@ +0x2179 SMALL ROMAN NUMERAL TEN +&ar@@ +0x217a SMALL ROMAN NUMERAL ELEVEN +&br@@ +0x217b SMALL ROMAN NUMERAL TWELVE +&cr@@ +0x217c SMALL ROMAN NUMERAL FIFTY +&_50r_@@ +0x217d SMALL ROMAN NUMERAL ONE HUNDRED +&_100r_@@ +0x217e SMALL ROMAN NUMERAL FIVE HUNDRED +&_500r_@@ +0x217f SMALL ROMAN NUMERAL ONE THOUSAND +&_1000r_@@ +0x2180 ROMAN NUMERAL ONE THOUSAND C D +&_1000RCD_@@ +0x2181 ROMAN NUMERAL FIVE THOUSAND +&_5000R_@@ +0x2182 ROMAN NUMERAL TEN THOUSAND +&_10000R_@@ +0x2190 LEFTWARDS ARROW +&<-@@ +0x2191 UPWARDS ARROW +&-!@@ +0x2192 RIGHTWARDS ARROW +&->@@ +0x2193 DOWNWARDS ARROW +&-v@@ +0x2194 LEFT RIGHT ARROW +&<>@@ +0x2195 UP DOWN ARROW +&UD@@ +0x2196 NORTH WEST ARROW +&__@@ +0x2198 SOUTH EAST ARROW +&_!!>_@@ +0x2199 SOUTH WEST ARROW +&_@@ +0x21d4 LEFT RIGHT DOUBLE ARROW +&==@@ +0x2200 FOR ALL +&FA@@ +0x2202 PARTIAL DIFFERENTIAL +&dP@@ +0x2203 THERE EXISTS +&TE@@ +0x2205 EMPTY SET +&/0@@ +0x2206 INCREMENT +&DE@@ +0x2207 NABLA +&NB@@ +0x2208 ELEMENT OF +&(-@@ +0x220b CONTAINS AS MEMBER +&-)@@ +0x220f N-ARY PRODUCT +&*P@@ +0x2211 N-ARY SUMMATION +&+Z@@ +0x2212 MINUS SIGN +&-2@@ +0x2213 MINUS-OR-PLUS SIGN +&-+@@ +0x2217 ASTERISK OPERATOR +&*-@@ +0x2218 RING OPERATOR +&Ob@@ +0x2219 BULLET OPERATOR +&Sb@@ +0x221a SQUARE ROOT +&RT@@ +0x221d PROPORTIONAL TO +&0(@@ +0x221e INFINITY +&00@@ +0x221f RIGHT ANGLE +&-L@@ +0x2220 ANGLE +&-V@@ +0x2225 PARALLEL TO +&PP@@ +0x2227 LOGICAL AND +&AN@@ +0x2228 LOGICAL OR +&OR@@ +0x2229 INTERSECTION +&(U@@ +0x222a UNION +&)U@@ +0x222b INTEGRAL +&In@@ +0x222c DOUBLE INTEGRAL +&DI@@ +0x222e CONTOUR INTEGRAL +&Io@@ +0x2234 THEREFORE +&.:@@ +0x2235 BECAUSE +&:.@@ +0x2236 RATIO +&:R@@ +0x2237 PROPORTION +&::@@ +0x223c TILDE OPERATOR +&?1@@ +0x223e INVERTED LAZY S +&CG@@ +0x2243 ASYMPTOTICALLY EQUAL TO +&?-@@ +0x2245 APPROXIMATELY EQUAL TO +&?=@@ +0x2248 ALMOST EQUAL TO +&?2@@ +0x224c ALL EQUAL TO +&=?@@ +0x2253 IMAGE OF OR APPROXIMATELY EQUAL TO +&HI@@ +0x2260 NOT EQUAL TO +&!=@@ +0x2261 IDENTICAL TO +&=3@@ +0x2264 LESS-THAN OR EQUAL TO +&=<@@ +0x2265 GREATER-THAN OR EQUAL TO +&>=@@ +0x226a MUCH LESS-THAN +&<*@@ +0x226b MUCH GREATER-THAN +&*>@@ +0x226e NOT LESS-THAN +&!<@@ +0x226f NOT GREATER-THAN +&!>@@ +0x2282 SUBSET OF +&(C@@ +0x2283 SUPERSET OF +&)C@@ +0x2286 SUBSET OF OR EQUAL TO +&(_@@ +0x2287 SUPERSET OF OR EQUAL TO +&)_@@ +0x2299 CIRCLED DOT OPERATOR +&0.@@ +0x229a CIRCLED RING OPERATOR +&02@@ +0x22a5 UP TACK +&-T@@ +0x22c5 DOT OPERATOR +&.P@@ +0x22ee VERTICAL ELLIPSIS +&:3@@ +0x22ef MIDLINE HORIZONTAL ELLIPSIS +&.3@@ +0x2302 HOUSE +&Eh@@ +0x2308 LEFT CEILING +&<7@@ +0x2309 RIGHT CEILING +&>7@@ +0x230a LEFT FLOOR +&7<@@ +0x230b RIGHT FLOOR +&7>@@ +0x2310 REVERSED NOT SIGN +&NI@@ +0x2312 ARC +&(A@@ +0x2315 TELEPHONE RECORDER +&TR@@ +0x2320 TOP HALF INTEGRAL +&Iu@@ +0x2321 BOTTOM HALF INTEGRAL +&Il@@ +0x2329 LEFT-POINTING ANGLE BRACKET +&@@ +0x2423 OPEN BOX +&Vs@@ +0x2440 OCR HOOK +&1h@@ +0x2441 OCR CHAIR +&3h@@ +0x2442 OCR FORK +&2h@@ +0x2443 OCR INVERTED FORK +&4h@@ +0x2446 OCR BRANCH BANK IDENTIFICATION +&1j@@ +0x2447 OCR AMOUNT OF CHECK +&2j@@ +0x2448 OCR DASH +&3j@@ +0x2449 OCR CUSTOMER ACCOUNT NUMBER +&4j@@ +0x2460 CIRCLED DIGIT ONE +&_1-o_@@ +0x2461 CIRCLED DIGIT TWO +&_2-o_@@ +0x2462 CIRCLED DIGIT THREE +&_3-o_@@ +0x2463 CIRCLED DIGIT FOUR +&_4-o_@@ +0x2464 CIRCLED DIGIT FIVE +&_5-o_@@ +0x2465 CIRCLED DIGIT SIX +&_6-o_@@ +0x2466 CIRCLED DIGIT SEVEN +&_7-o_@@ +0x2467 CIRCLED DIGIT EIGHT +&_8-o_@@ +0x2468 CIRCLED DIGIT NINE +&_9-o_@@ +0x2469 CIRCLED NUMBER TEN +&_10-o_@@ +0x246a CIRCLED NUMBER ELEVEN +&_11-o_@@ +0x246b CIRCLED NUMBER TWELVE +&_12-o_@@ +0x246c CIRCLED NUMBER THIRTEEN +&_13-o_@@ +0x246d CIRCLED NUMBER FOURTEEN +&_14-o_@@ +0x246e CIRCLED NUMBER FIFTEEN +&_15-o_@@ +0x246f CIRCLED NUMBER SIXTEEN +&_16-o_@@ +0x2470 CIRCLED NUMBER SEVENTEEN +&_17-o_@@ +0x2471 CIRCLED NUMBER EIGHTEEN +&_18-o_@@ +0x2472 CIRCLED NUMBER NINETEEN +&_19-o_@@ +0x2473 CIRCLED NUMBER TWENTY +&_20-o_@@ +0x2474 PARENTHESIZED DIGIT ONE +&_(1)_@@ +0x2475 PARENTHESIZED DIGIT TWO +&_(2)_@@ +0x2476 PARENTHESIZED DIGIT THREE +&_(3)_@@ +0x2477 PARENTHESIZED DIGIT FOUR +&_(4)_@@ +0x2478 PARENTHESIZED DIGIT FIVE +&_(5)_@@ +0x2479 PARENTHESIZED DIGIT SIX +&_(6)_@@ +0x247a PARENTHESIZED DIGIT SEVEN +&_(7)_@@ +0x247b PARENTHESIZED DIGIT EIGHT +&_(8)_@@ +0x247c PARENTHESIZED DIGIT NINE +&_(9)_@@ +0x247d PARENTHESIZED NUMBER TEN +&_(10)_@@ +0x247e PARENTHESIZED NUMBER ELEVEN +&_(11)_@@ +0x247f PARENTHESIZED NUMBER TWELVE +&_(12)_@@ +0x2480 PARENTHESIZED NUMBER THIRTEEN +&_(13)_@@ +0x2481 PARENTHESIZED NUMBER FOURTEEN +&_(14)_@@ +0x2482 PARENTHESIZED NUMBER FIFTEEN +&_(15)_@@ +0x2483 PARENTHESIZED NUMBER SIXTEEN +&_(16)_@@ +0x2484 PARENTHESIZED NUMBER SEVENTEEN +&_(17)_@@ +0x2485 PARENTHESIZED NUMBER EIGHTEEN +&_(18)_@@ +0x2486 PARENTHESIZED NUMBER NINETEEN +&_(19)_@@ +0x2487 PARENTHESIZED NUMBER TWENTY +&_(20)_@@ +0x2488 DIGIT ONE FULL STOP +&1.@@ +0x2489 DIGIT TWO FULL STOP +&2.@@ +0x248a DIGIT THREE FULL STOP +&3.@@ +0x248b DIGIT FOUR FULL STOP +&4.@@ +0x248c DIGIT FIVE FULL STOP +&5.@@ +0x248d DIGIT SIX FULL STOP +&6.@@ +0x248e DIGIT SEVEN FULL STOP +&7.@@ +0x248f DIGIT EIGHT FULL STOP +&8.@@ +0x2490 DIGIT NINE FULL STOP +&9.@@ +0x2491 NUMBER TEN FULL STOP +&_10._@@ +0x2492 NUMBER ELEVEN FULL STOP +&_11._@@ +0x2493 NUMBER TWELVE FULL STOP +&_12._@@ +0x2494 NUMBER THIRTEEN FULL STOP +&_13._@@ +0x2495 NUMBER FOURTEEN FULL STOP +&_14._@@ +0x2496 NUMBER FIFTEEN FULL STOP +&_15._@@ +0x2497 NUMBER SIXTEEN FULL STOP +&_16._@@ +0x2498 NUMBER SEVENTEEN FULL STOP +&_17._@@ +0x2499 NUMBER EIGHTEEN FULL STOP +&_18._@@ +0x249a NUMBER NINETEEN FULL STOP +&_19._@@ +0x249b NUMBER TWENTY FULL STOP +&_20._@@ +0x249c PARENTHESIZED LATIN SMALL LETTER A +&_(a)_@@ +0x249d PARENTHESIZED LATIN SMALL LETTER B +&_(b)_@@ +0x249e PARENTHESIZED LATIN SMALL LETTER C +&_(c)_@@ +0x249f PARENTHESIZED LATIN SMALL LETTER D +&_(d)_@@ +0x24a0 PARENTHESIZED LATIN SMALL LETTER E +&_(e)_@@ +0x24a1 PARENTHESIZED LATIN SMALL LETTER F +&_(f)_@@ +0x24a2 PARENTHESIZED LATIN SMALL LETTER G +&_(g)_@@ +0x24a3 PARENTHESIZED LATIN SMALL LETTER H +&_(h)_@@ +0x24a4 PARENTHESIZED LATIN SMALL LETTER I +&_(i)_@@ +0x24a5 PARENTHESIZED LATIN SMALL LETTER J +&_(j)_@@ +0x24a6 PARENTHESIZED LATIN SMALL LETTER K +&_(k)_@@ +0x24a7 PARENTHESIZED LATIN SMALL LETTER L +&_(l)_@@ +0x24a8 PARENTHESIZED LATIN SMALL LETTER M +&_(m)_@@ +0x24a9 PARENTHESIZED LATIN SMALL LETTER N +&_(n)_@@ +0x24aa PARENTHESIZED LATIN SMALL LETTER O +&_(o)_@@ +0x24ab PARENTHESIZED LATIN SMALL LETTER P +&_(p)_@@ +0x24ac PARENTHESIZED LATIN SMALL LETTER Q +&_(q)_@@ +0x24ad PARENTHESIZED LATIN SMALL LETTER R +&_(r)_@@ +0x24ae PARENTHESIZED LATIN SMALL LETTER S +&_(s)_@@ +0x24af PARENTHESIZED LATIN SMALL LETTER T +&_(t)_@@ +0x24b0 PARENTHESIZED LATIN SMALL LETTER U +&_(u)_@@ +0x24b1 PARENTHESIZED LATIN SMALL LETTER V +&_(v)_@@ +0x24b2 PARENTHESIZED LATIN SMALL LETTER W +&_(w)_@@ +0x24b3 PARENTHESIZED LATIN SMALL LETTER X +&_(x)_@@ +0x24b4 PARENTHESIZED LATIN SMALL LETTER Y +&_(y)_@@ +0x24b5 PARENTHESIZED LATIN SMALL LETTER Z +&_(z)_@@ +0x24b6 CIRCLED LATIN CAPITAL LETTER A +&_A-o_@@ +0x24b7 CIRCLED LATIN CAPITAL LETTER B +&_B-o_@@ +0x24b8 CIRCLED LATIN CAPITAL LETTER C +&_C-o_@@ +0x24b9 CIRCLED LATIN CAPITAL LETTER D +&_D-o_@@ +0x24ba CIRCLED LATIN CAPITAL LETTER E +&_E-o_@@ +0x24bb CIRCLED LATIN CAPITAL LETTER F +&_F-o_@@ +0x24bc CIRCLED LATIN CAPITAL LETTER G +&_G-o_@@ +0x24bd CIRCLED LATIN CAPITAL LETTER H +&_H-o_@@ +0x24be CIRCLED LATIN CAPITAL LETTER I +&_I-o_@@ +0x24bf CIRCLED LATIN CAPITAL LETTER J +&_J-o_@@ +0x24c0 CIRCLED LATIN CAPITAL LETTER K +&_K-o_@@ +0x24c1 CIRCLED LATIN CAPITAL LETTER L +&_L-o_@@ +0x24c2 CIRCLED LATIN CAPITAL LETTER M +&_M-o_@@ +0x24c3 CIRCLED LATIN CAPITAL LETTER N +&_N-o_@@ +0x24c4 CIRCLED LATIN CAPITAL LETTER O +&_O-o_@@ +0x24c5 CIRCLED LATIN CAPITAL LETTER P +&_P-o_@@ +0x24c6 CIRCLED LATIN CAPITAL LETTER Q +&_Q-o_@@ +0x24c7 CIRCLED LATIN CAPITAL LETTER R +&_R-o_@@ +0x24c8 CIRCLED LATIN CAPITAL LETTER S +&_S-o_@@ +0x24c9 CIRCLED LATIN CAPITAL LETTER T +&_T-o_@@ +0x24ca CIRCLED LATIN CAPITAL LETTER U +&_U-o_@@ +0x24cb CIRCLED LATIN CAPITAL LETTER V +&_V-o_@@ +0x24cc CIRCLED LATIN CAPITAL LETTER W +&_W-o_@@ +0x24cd CIRCLED LATIN CAPITAL LETTER X +&_X-o_@@ +0x24ce CIRCLED LATIN CAPITAL LETTER Y +&_Y-o_@@ +0x24cf CIRCLED LATIN CAPITAL LETTER Z +&_Z-o_@@ +0x24d0 CIRCLED LATIN SMALL LETTER A +&_a-o_@@ +0x24d1 CIRCLED LATIN SMALL LETTER B +&_b-o_@@ +0x24d2 CIRCLED LATIN SMALL LETTER C +&_c-o_@@ +0x24d3 CIRCLED LATIN SMALL LETTER D +&_d-o_@@ +0x24d4 CIRCLED LATIN SMALL LETTER E +&_e-o_@@ +0x24d5 CIRCLED LATIN SMALL LETTER F +&_f-o_@@ +0x24d6 CIRCLED LATIN SMALL LETTER G +&_g-o_@@ +0x24d7 CIRCLED LATIN SMALL LETTER H +&_h-o_@@ +0x24d8 CIRCLED LATIN SMALL LETTER I +&_i-o_@@ +0x24d9 CIRCLED LATIN SMALL LETTER J +&_j-o_@@ +0x24da CIRCLED LATIN SMALL LETTER K +&_k-o_@@ +0x24db CIRCLED LATIN SMALL LETTER L +&_l-o_@@ +0x24dc CIRCLED LATIN SMALL LETTER M +&_m-o_@@ +0x24dd CIRCLED LATIN SMALL LETTER N +&_n-o_@@ +0x24de CIRCLED LATIN SMALL LETTER O +&_o-o_@@ +0x24df CIRCLED LATIN SMALL LETTER P +&_p-o_@@ +0x24e0 CIRCLED LATIN SMALL LETTER Q +&_q-o_@@ +0x24e1 CIRCLED LATIN SMALL LETTER R +&_r-o_@@ +0x24e2 CIRCLED LATIN SMALL LETTER S +&_s-o_@@ +0x24e3 CIRCLED LATIN SMALL LETTER T +&_t-o_@@ +0x24e4 CIRCLED LATIN SMALL LETTER U +&_u-o_@@ +0x24e5 CIRCLED LATIN SMALL LETTER V +&_v-o_@@ +0x24e6 CIRCLED LATIN SMALL LETTER W +&_w-o_@@ +0x24e7 CIRCLED LATIN SMALL LETTER X +&_x-o_@@ +0x24e8 CIRCLED LATIN SMALL LETTER Y +&_y-o_@@ +0x24e9 CIRCLED LATIN SMALL LETTER Z +&_z-o_@@ +0x24ea CIRCLED DIGIT ZERO +&_0-o_@@ +0x2500 BOX DRAWINGS LIGHT HORIZONTAL +&hh@@ +0x2501 BOX DRAWINGS HEAVY HORIZONTAL +&HH@@ +0x2502 BOX DRAWINGS LIGHT VERTICAL +&vv@@ +0x2503 BOX DRAWINGS HEAVY VERTICAL +&VV@@ +0x2504 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +&3-@@ +0x2505 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +&3_@@ +0x2506 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +&3!@@ +0x2507 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +&3/@@ +0x2508 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +&4-@@ +0x2509 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +&4_@@ +0x250a BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +&4!@@ +0x250b BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +&4/@@ +0x250c BOX DRAWINGS LIGHT DOWN AND RIGHT +&dr@@ +0x250d BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +&dR@@ +0x250e BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +&Dr@@ +0x250f BOX DRAWINGS HEAVY DOWN AND RIGHT +&DR@@ +0x2510 BOX DRAWINGS LIGHT DOWN AND LEFT +&dl@@ +0x2511 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +&dL@@ +0x2512 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +&Dl@@ +0x2513 BOX DRAWINGS HEAVY DOWN AND LEFT +&LD@@ +0x2514 BOX DRAWINGS LIGHT UP AND RIGHT +&ur@@ +0x2515 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +&uR@@ +0x2516 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +&Ur@@ +0x2517 BOX DRAWINGS HEAVY UP AND RIGHT +&UR@@ +0x2518 BOX DRAWINGS LIGHT UP AND LEFT +&ul@@ +0x2519 BOX DRAWINGS UP LIGHT AND LEFT HEAVY +&uL@@ +0x251a BOX DRAWINGS UP HEAVY AND LEFT LIGHT +&Ul@@ +0x251b BOX DRAWINGS HEAVY UP AND LEFT +&UL@@ +0x251c BOX DRAWINGS LIGHT VERTICAL AND RIGHT +&vr@@ +0x251d BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +&vR@@ +0x251e BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +&_Udr_@@ +0x251f BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +&_uDr_@@ +0x2520 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +&Vr@@ +0x2521 BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +&_UdR_@@ +0x2522 BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +&_uDR_@@ +0x2523 BOX DRAWINGS HEAVY VERTICAL AND RIGHT +&VR@@ +0x2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT +&vl@@ +0x2525 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +&vL@@ +0x2526 BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +&_Udl_@@ +0x2527 BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +&_uDl_@@ +0x2528 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +&Vl@@ +0x2529 BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +&_UdL_@@ +0x252a BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +&_uDL_@@ +0x252b BOX DRAWINGS HEAVY VERTICAL AND LEFT +&VL@@ +0x252c BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +&dh@@ +0x252d BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +&_dLr_@@ +0x252e BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +&_dlR_@@ +0x252f BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +&dH@@ +0x2530 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +&Dh@@ +0x2531 BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +&_DLr_@@ +0x2532 BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +&_DlR_@@ +0x2533 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +&DH@@ +0x2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL +&uh@@ +0x2535 BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +&_uLr_@@ +0x2536 BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +&_ulR_@@ +0x2537 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +&uH@@ +0x2538 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +&Uh@@ +0x2539 BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +&_ULr_@@ +0x253a BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +&_UlR_@@ +0x253b BOX DRAWINGS HEAVY UP AND HORIZONTAL +&UH@@ +0x253c BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +&vh@@ +0x253d BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +&_vLr_@@ +0x253e BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +&_vlR_@@ +0x253f BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +&vH@@ +0x2540 BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +&_Udh_@@ +0x2541 BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +&_uDh_@@ +0x2542 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +&Vh@@ +0x2543 BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +&_UdLr_@@ +0x2544 BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +&_UdlR_@@ +0x2545 BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +&_uDLr_@@ +0x2546 BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +&_uDlR_@@ +0x2547 BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +&_UdH_@@ +0x2548 BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +&_uDH_@@ +0x2549 BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +&_VLr_@@ +0x254a BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +&_VlR_@@ +0x254b BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +&VH@@ +0x2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +&FD@@ +0x2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +&BD@@ +0x2580 UPPER HALF BLOCK +&TB@@ +0x2584 LOWER HALF BLOCK +&LB@@ +0x2588 FULL BLOCK +&FB@@ +0x258c LEFT HALF BLOCK +&lB@@ +0x2590 RIGHT HALF BLOCK +&RB@@ +0x2591 LIGHT SHADE +&.S@@ +0x2592 MEDIUM SHADE +&:S@@ +0x2593 DARK SHADE +&?S@@ +0x25a0 BLACK SQUARE +&fS@@ +0x25a1 WHITE SQUARE +&OS@@ +0x25a2 WHITE SQUARE WITH ROUNDED CORNERS +&RO@@ +0x25a3 WHITE SQUARE CONTAINING BLACK SMALL SQUARE +&Rr@@ +0x25a4 SQUARE WITH HORIZONTAL FILL +&RF@@ +0x25a5 SQUARE WITH VERTICAL FILL +&RY@@ +0x25a6 SQUARE WITH ORTHOGONAL CROSSHATCH FILL +&RH@@ +0x25a7 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +&RZ@@ +0x25a8 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +&RK@@ +0x25a9 SQUARE WITH DIAGONAL CROSSHATCH FILL +&RX@@ +0x25aa BLACK SMALL SQUARE +&sB@@ +0x25ac BLACK RECTANGLE +&SR@@ +0x25ad WHITE RECTANGLE +&Or@@ +0x25b2 BLACK UP-POINTING TRIANGLE +&UT@@ +0x25b3 WHITE UP-POINTING TRIANGLE +&uT@@ +0x25b6 BLACK RIGHT-POINTING TRIANGLE +&PR@@ +0x25b7 WHITE RIGHT-POINTING TRIANGLE +&Tr@@ +0x25bc BLACK DOWN-POINTING TRIANGLE +&Dt@@ +0x25bd WHITE DOWN-POINTING TRIANGLE +&dT@@ +0x25c0 BLACK LEFT-POINTING TRIANGLE +&PL@@ +0x25c1 WHITE LEFT-POINTING TRIANGLE +&Tl@@ +0x25c6 BLACK DIAMOND +&Db@@ +0x25c7 WHITE DIAMOND +&Dw@@ +0x25ca LOZENGE +&LZ@@ +0x25cb WHITE CIRCLE +&0m@@ +0x25ce BULLSEYE +&0o@@ +0x25cf BLACK CIRCLE +&0M@@ +0x25d0 CIRCLE WITH LEFT HALF BLACK +&0L@@ +0x25d1 CIRCLE WITH RIGHT HALF BLACK +&0R@@ +0x25d8 INVERSE BULLET +&Sn@@ +0x25d9 INVERSE WHITE CIRCLE +&Ic@@ +0x25e2 BLACK LOWER RIGHT TRIANGLE +&Fd@@ +0x25e3 BLACK LOWER LEFT TRIANGLE +&Bd@@ +0x2605 BLACK STAR +&*2@@ +0x2606 WHITE STAR +&*1@@ +0x260e BLACK TELEPHONE +&_TEL_@@ +0x260f WHITE TELEPHONE +&_tel_@@ +0x261c WHITE LEFT POINTING INDEX +&H@@ +0x263a WHITE SMILING FACE +&0u@@ +0x263b BLACK SMILING FACE +&0U@@ +0x263c WHITE SUN WITH RAYS +&SU@@ +0x2640 FEMALE SIGN +&Fm@@ +0x2642 MALE SIGN +&Ml@@ +0x2660 BLACK SPADE SUIT +&cS@@ +0x2661 WHITE HEART SUIT +&cH@@ +0x2662 WHITE DIAMOND SUIT +&cD@@ +0x2663 BLACK CLUB SUIT +&cC@@ +0x2664 WHITE SPADE SUIT +&_cS-_@@ +0x2665 BLACK HEART SUIT +&_cH-_@@ +0x2666 BLACK DIAMOND SUIT +&_cD-_@@ +0x2667 WHITE CLUB SUIT +&_cC-_@@ +0x2669 QUARTER NOTE +&Md@@ +0x266a EIGHTH NOTE +&M8@@ +0x266b BARRED EIGHTH NOTES +&M2@@ +0x266c BARRED SIXTEENTH NOTES +&_M16_@@ +0x266d MUSIC FLAT SIGN +&Mb@@ +0x266e MUSIC NATURAL SIGN +&Mx@@ +0x266f MUSIC SHARP SIGN +&MX@@ +0x2713 CHECK MARK +&OK@@ +0x2717 BALLOT X +&XX@@ +0x2720 MALTESE CROSS +&-X@@ +0x3000 IDEOGRAPHIC SPACE +&IS@@ +0x3001 IDEOGRAPHIC COMMA +&,_@@ +0x3002 IDEOGRAPHIC PERIOD +&._@@ +0x3003 DITTO MARK +&+"@@ +0x3004 IDEOGRAPHIC DITTO MARK +&+_@@ +0x3005 IDEOGRAPHIC ITERATION MARK +&*_@@ +0x3006 IDEOGRAPHIC CLOSING MARK +&;_@@ +0x3007 IDEOGRAPHIC NUMBER ZERO +&0_@@ +0x300a LEFT DOUBLE ANGLE BRACKET +&<+@@ +0x300b RIGHT DOUBLE ANGLE BRACKET +&>+@@ +0x300c LEFT CORNER BRACKET +&<'@@ +0x300d RIGHT CORNER BRACKET +&>'@@ +0x300e LEFT WHITE CORNER BRACKET +&<"@@ +0x300f RIGHT WHITE CORNER BRACKET +&>"@@ +0x3010 LEFT BLACK LENTICULAR BRACKET +&("@@ +0x3011 RIGHT BLACK LENTICULAR BRACKET +&)"@@ +0x3012 POSTAL MARK +&=T@@ +0x3013 GETA MARK +&=_@@ +0x3014 LEFT TORTOISE SHELL BRACKET +&('@@ +0x3015 RIGHT TORTOISE SHELL BRACKET +&)'@@ +0x3016 LEFT WHITE LENTICULAR BRACKET +&(I@@ +0x3017 RIGHT WHITE LENTICULAR BRACKET +&)I@@ +0x301c WAVE DASH +&-?@@ +0x3020 POSTAL MARK FACE +&_=T:)_@@ +0x3041 HIRAGANA LETTER SMALL A +&A5@@ +0x3042 HIRAGANA LETTER A +&a5@@ +0x3043 HIRAGANA LETTER SMALL I +&I5@@ +0x3044 HIRAGANA LETTER I +&i5@@ +0x3045 HIRAGANA LETTER SMALL U +&U5@@ +0x3046 HIRAGANA LETTER U +&u5@@ +0x3047 HIRAGANA LETTER SMALL E +&E5@@ +0x3048 HIRAGANA LETTER E +&e5@@ +0x3049 HIRAGANA LETTER SMALL O +&O5@@ +0x304a HIRAGANA LETTER O +&o5@@ +0x304b HIRAGANA LETTER KA +&ka@@ +0x304c HIRAGANA LETTER GA +&ga@@ +0x304d HIRAGANA LETTER KI +&ki@@ +0x304e HIRAGANA LETTER GI +&gi@@ +0x304f HIRAGANA LETTER KU +&ku@@ +0x3050 HIRAGANA LETTER GU +&gu@@ +0x3051 HIRAGANA LETTER KE +&ke@@ +0x3052 HIRAGANA LETTER GE +&ge@@ +0x3053 HIRAGANA LETTER KO +&ko@@ +0x3054 HIRAGANA LETTER GO +&go@@ +0x3055 HIRAGANA LETTER SA +&sa@@ +0x3056 HIRAGANA LETTER ZA +&za@@ +0x3057 HIRAGANA LETTER SI +&si@@ +0x3058 HIRAGANA LETTER ZI +&zi@@ +0x3059 HIRAGANA LETTER SU +&su@@ +0x305a HIRAGANA LETTER ZU +&zu@@ +0x305b HIRAGANA LETTER SE +&se@@ +0x305c HIRAGANA LETTER ZE +&ze@@ +0x305d HIRAGANA LETTER SO +&so@@ +0x305e HIRAGANA LETTER ZO +&zo@@ +0x305f HIRAGANA LETTER TA +&ta@@ +0x3060 HIRAGANA LETTER DA +&da@@ +0x3061 HIRAGANA LETTER TI +&ti@@ +0x3062 HIRAGANA LETTER DI +&di@@ +0x3063 HIRAGANA LETTER SMALL TU +&tU@@ +0x3064 HIRAGANA LETTER TU +&tu@@ +0x3065 HIRAGANA LETTER DU +&du@@ +0x3066 HIRAGANA LETTER TE +&te@@ +0x3067 HIRAGANA LETTER DE +&de@@ +0x3068 HIRAGANA LETTER TO +&to@@ +0x3069 HIRAGANA LETTER DO +&do@@ +0x306a HIRAGANA LETTER NA +&na@@ +0x306b HIRAGANA LETTER NI +&ni@@ +0x306c HIRAGANA LETTER NU +&nu@@ +0x306d HIRAGANA LETTER NE +&ne@@ +0x306e HIRAGANA LETTER NO +&no@@ +0x306f HIRAGANA LETTER HA +&ha@@ +0x3070 HIRAGANA LETTER BA +&ba@@ +0x3071 HIRAGANA LETTER PA +&pa@@ +0x3072 HIRAGANA LETTER HI +&hi@@ +0x3073 HIRAGANA LETTER BI +&bi@@ +0x3074 HIRAGANA LETTER PI +&pi@@ +0x3075 HIRAGANA LETTER HU +&hu@@ +0x3076 HIRAGANA LETTER BU +&bu@@ +0x3077 HIRAGANA LETTER PU +&pu@@ +0x3078 HIRAGANA LETTER HE +&he@@ +0x3079 HIRAGANA LETTER BE +&be@@ +0x307a HIRAGANA LETTER PE +&pe@@ +0x307b HIRAGANA LETTER HO +&ho@@ +0x307c HIRAGANA LETTER BO +&bo@@ +0x307d HIRAGANA LETTER PO +&po@@ +0x307e HIRAGANA LETTER MA +&ma@@ +0x307f HIRAGANA LETTER MI +&mi@@ +0x3080 HIRAGANA LETTER MU +&mu@@ +0x3081 HIRAGANA LETTER ME +&me@@ +0x3082 HIRAGANA LETTER MO +&mo@@ +0x3083 HIRAGANA LETTER SMALL YA +&yA@@ +0x3084 HIRAGANA LETTER YA +&ya@@ +0x3085 HIRAGANA LETTER SMALL YU +&yU@@ +0x3086 HIRAGANA LETTER YU +&yu@@ +0x3087 HIRAGANA LETTER SMALL YO +&yO@@ +0x3088 HIRAGANA LETTER YO +&yo@@ +0x3089 HIRAGANA LETTER RA +&ra@@ +0x308a HIRAGANA LETTER RI +&ri@@ +0x308b HIRAGANA LETTER RU +&ru@@ +0x308c HIRAGANA LETTER RE +&re@@ +0x308d HIRAGANA LETTER RO +&ro@@ +0x308e HIRAGANA LETTER SMALL WA +&wA@@ +0x308f HIRAGANA LETTER WA +&wa@@ +0x3090 HIRAGANA LETTER WI +&wi@@ +0x3091 HIRAGANA LETTER WE +&we@@ +0x3092 HIRAGANA LETTER WO +&wo@@ +0x3093 HIRAGANA LETTER N +&n5@@ +0x3094 HIRAGANA LETTER VU +&vu@@ +0x309b KATAKANA-HIRAGANA VOICED SOUND MARK +&"5@@ +0x309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +&05@@ +0x309d HIRAGANA ITERATION MARK +&*5@@ +0x309e HIRAGANA VOICED ITERATION MARK +&+5@@ +0x30a1 KATAKANA LETTER SMALL A +&a6@@ +0x30a2 KATAKANA LETTER A +&A6@@ +0x30a3 KATAKANA LETTER SMALL I +&i6@@ +0x30a4 KATAKANA LETTER I +&I6@@ +0x30a5 KATAKANA LETTER SMALL U +&u6@@ +0x30a6 KATAKANA LETTER U +&U6@@ +0x30a7 KATAKANA LETTER SMALL E +&e6@@ +0x30a8 KATAKANA LETTER E +&E6@@ +0x30a9 KATAKANA LETTER SMALL O +&o6@@ +0x30aa KATAKANA LETTER O +&O6@@ +0x30ab KATAKANA LETTER KA +&Ka@@ +0x30ac KATAKANA LETTER GA +&Ga@@ +0x30ad KATAKANA LETTER KI +&Ki@@ +0x30ae KATAKANA LETTER GI +&Gi@@ +0x30af KATAKANA LETTER KU +&Ku@@ +0x30b0 KATAKANA LETTER GU +&Gu@@ +0x30b1 KATAKANA LETTER KE +&Ke@@ +0x30b2 KATAKANA LETTER GE +&Ge@@ +0x30b3 KATAKANA LETTER KO +&Ko@@ +0x30b4 KATAKANA LETTER GO +&Go@@ +0x30b5 KATAKANA LETTER SA +&Sa@@ +0x30b6 KATAKANA LETTER ZA +&Za@@ +0x30b7 KATAKANA LETTER SI +&Si@@ +0x30b8 KATAKANA LETTER ZI +&Zi@@ +0x30b9 KATAKANA LETTER SU +&Su@@ +0x30ba KATAKANA LETTER ZU +&Zu@@ +0x30bb KATAKANA LETTER SE +&Se@@ +0x30bc KATAKANA LETTER ZE +&Ze@@ +0x30bd KATAKANA LETTER SO +&So@@ +0x30be KATAKANA LETTER ZO +&Zo@@ +0x30bf KATAKANA LETTER TA +&Ta@@ +0x30c0 KATAKANA LETTER DA +&Da@@ +0x30c1 KATAKANA LETTER TI +&Ti@@ +0x30c2 KATAKANA LETTER DI +&Di@@ +0x30c3 KATAKANA LETTER SMALL TU +&TU@@ +0x30c4 KATAKANA LETTER TU +&Tu@@ +0x30c5 KATAKANA LETTER DU +&Du@@ +0x30c6 KATAKANA LETTER TE +&Te@@ +0x30c7 KATAKANA LETTER DE +&De@@ +0x30c8 KATAKANA LETTER TO +&To@@ +0x30c9 KATAKANA LETTER DO +&Do@@ +0x30ca KATAKANA LETTER NA +&Na@@ +0x30cb KATAKANA LETTER NI +&Ni@@ +0x30cc KATAKANA LETTER NU +&Nu@@ +0x30cd KATAKANA LETTER NE +&Ne@@ +0x30ce KATAKANA LETTER NO +&No@@ +0x30cf KATAKANA LETTER HA +&Ha@@ +0x30d0 KATAKANA LETTER BA +&Ba@@ +0x30d1 KATAKANA LETTER PA +&Pa@@ +0x30d2 KATAKANA LETTER HI +&Hi@@ +0x30d3 KATAKANA LETTER BI +&Bi@@ +0x30d4 KATAKANA LETTER PI +&Pi@@ +0x30d5 KATAKANA LETTER HU +&Hu@@ +0x30d6 KATAKANA LETTER BU +&Bu@@ +0x30d7 KATAKANA LETTER PU +&Pu@@ +0x30d8 KATAKANA LETTER HE +&He@@ +0x30d9 KATAKANA LETTER BE +&Be@@ +0x30da KATAKANA LETTER PE +&Pe@@ +0x30db KATAKANA LETTER HO +&Ho@@ +0x30dc KATAKANA LETTER BO +&Bo@@ +0x30dd KATAKANA LETTER PO +&Po@@ +0x30de KATAKANA LETTER MA +&Ma@@ +0x30df KATAKANA LETTER MI +&Mi@@ +0x30e0 KATAKANA LETTER MU +&Mu@@ +0x30e1 KATAKANA LETTER ME +&Me@@ +0x30e2 KATAKANA LETTER MO +&Mo@@ +0x30e3 KATAKANA LETTER SMALL YA +&YA@@ +0x30e4 KATAKANA LETTER YA +&Ya@@ +0x30e5 KATAKANA LETTER SMALL YU +&YU@@ +0x30e6 KATAKANA LETTER YU +&Yu@@ +0x30e7 KATAKANA LETTER SMALL YO +&YO@@ +0x30e8 KATAKANA LETTER YO +&Yo@@ +0x30e9 KATAKANA LETTER RA +&Ra@@ +0x30ea KATAKANA LETTER RI +&Ri@@ +0x30eb KATAKANA LETTER RU +&Ru@@ +0x30ec KATAKANA LETTER RE +&Re@@ +0x30ed KATAKANA LETTER RO +&Ro@@ +0x30ee KATAKANA LETTER SMALL WA +&WA@@ +0x30ef KATAKANA LETTER WA +&Wa@@ +0x30f0 KATAKANA LETTER WI +&Wi@@ +0x30f1 KATAKANA LETTER WE +&We@@ +0x30f2 KATAKANA LETTER WO +&Wo@@ +0x30f3 KATAKANA LETTER N +&N6@@ +0x30f4 KATAKANA LETTER VU +&Vu@@ +0x30f5 KATAKANA LETTER SMALL KA +&KA@@ +0x30f6 KATAKANA LETTER SMALL KE +&KE@@ +0x30f7 KATAKANA LETTER VA +&Va@@ +0x30f8 KATAKANA LETTER VI +&Vi@@ +0x30f9 KATAKANA LETTER VE +&Ve@@ +0x30fa KATAKANA LETTER VO +&Vo@@ +0x30fb KATAKANA MIDDLE DOT +&.6@@ +0x30fc KATAKANA-HIRAGANA PROLONGED SOUND MARK +&-6@@ +0x30fd KATAKANA ITERATION MARK +&*6@@ +0x30fe KATAKANA VOICED ITERATION MARK +&+6@@ +0x3105 BOPOMOFO LETTER B +&b4@@ +0x3106 BOPOMOFO LETTER P +&p4@@ +0x3107 BOPOMOFO LETTER M +&m4@@ +0x3108 BOPOMOFO LETTER F +&f4@@ +0x3109 BOPOMOFO LETTER D +&d4@@ +0x310a BOPOMOFO LETTER T +&t4@@ +0x310b BOPOMOFO LETTER N +&n4@@ +0x310c BOPOMOFO LETTER L +&l4@@ +0x310d BOPOMOFO LETTER G +&g4@@ +0x310e BOPOMOFO LETTER K +&k4@@ +0x310f BOPOMOFO LETTER H +&h4@@ +0x3110 BOPOMOFO LETTER J +&j4@@ +0x3111 BOPOMOFO LETTER Q +&q4@@ +0x3112 BOPOMOFO LETTER X +&x4@@ +0x3113 BOPOMOFO LETTER ZH +&zh@@ +0x3114 BOPOMOFO LETTER CH +&ch@@ +0x3115 BOPOMOFO LETTER SH +&sh@@ +0x3116 BOPOMOFO LETTER R +&r4@@ +0x3117 BOPOMOFO LETTER Z +&z4@@ +0x3118 BOPOMOFO LETTER C +&c4@@ +0x3119 BOPOMOFO LETTER S +&s4@@ +0x311a BOPOMOFO LETTER A +&a4@@ +0x311b BOPOMOFO LETTER O +&o4@@ +0x311c BOPOMOFO LETTER E +&e4@@ +0x311d BOPOMOFO LETTER EH +&_eh4_@@ +0x311e BOPOMOFO LETTER AI +&ai@@ +0x311f BOPOMOFO LETTER EI +&ei@@ +0x3120 BOPOMOFO LETTER AU +&au@@ +0x3121 BOPOMOFO LETTER OU +&ou@@ +0x3122 BOPOMOFO LETTER AN +&an@@ +0x3123 BOPOMOFO LETTER EN +&en@@ +0x3124 BOPOMOFO LETTER ANG +&aN@@ +0x3125 BOPOMOFO LETTER ENG +&eN@@ +0x3126 BOPOMOFO LETTER ER +&er@@ +0x3127 BOPOMOFO LETTER I +&i4@@ +0x3128 BOPOMOFO LETTER U +&u4@@ +0x3129 BOPOMOFO LETTER IU +&iu@@ +0x312a BOPOMOFO LETTER V +&v4@@ +0x312b BOPOMOFO LETTER NG +&nG@@ +0x312c BOPOMOFO LETTER GN +&gn@@ +0x321c PARENTHESIZED HANGUL JU +&_(JU)_@@ +0x3220 PARENTHESIZED IDEOGRAPH ONE +&1c@@ +0x3221 PARENTHESIZED IDEOGRAPH TWO +&2c@@ +0x3222 PARENTHESIZED IDEOGRAPH THREE +&3c@@ +0x3223 PARENTHESIZED IDEOGRAPH FOUR +&4c@@ +0x3224 PARENTHESIZED IDEOGRAPH FIVE +&5c@@ +0x3225 PARENTHESIZED IDEOGRAPH SIX +&6c@@ +0x3226 PARENTHESIZED IDEOGRAPH SEVEN +&7c@@ +0x3227 PARENTHESIZED IDEOGRAPH EIGHT +&8c@@ +0x3228 PARENTHESIZED IDEOGRAPH NINE +&9c@@ +0x3229 PARENTHESIZED IDEOGRAPH TEN +&_10c_@@ +0x327f KOREAN STANDARD SYMBOL +&_KSC_@@ +0xe001 JOIN THIS LINE WITH NEXT LINE (Mnemonic) +&/c@@ +0xe002 Unit space A (ISO-IR-8-1 064) +&UA@@ +0xe003 Unit space B (ISO-IR-8-1 096) +&UB@@ +0xe004 NON-SPACING UMLAUT (ISO-IR-38 201) (character part) +&"3@@ +0xe005 NON-SPACING DIAERESIS WITH ACCENT (ISO-IR-70 192) (character part) +&"1@@ +0xe006 NON-SPACING GRAVE ACCENT (ISO-IR-103 193) (character part) +&"!@@ +0xe007 NON-SPACING ACUTE ACCENT (ISO-IR-103 194) (character part) +&"'@@ +0xe008 NON-SPACING CIRCUMFLEX ACCENT (ISO-IR-103 195) (character part) +&">@@ +0xe009 NON-SPACING TILDE (ISO-IR-103 196) (character part) +&"?@@ +0xe00a NON-SPACING MACRON (ISO-IR-103 197) (character part) +&"-@@ +0xe00b NON-SPACING BREVE (ISO-IR-103 198) (character part) +&"(@@ +0xe00c NON-SPACING DOT ABOVE (ISO-IR-103 199) (character part) +&".@@ +0xe00d NON-SPACING DIAERESIS (ISO-IR-103 200) (character part) +&":@@ +0xe00e NON-SPACING RING ABOVE (ISO-IR-103 202) (character part) +&"0@@ +0xe00f NON-SPACING DOUBLE ACCUTE (ISO-IR-103 204) (character part) +&""@@ +0xe010 NON-SPACING CARON (ISO-IR-103 206) (character part) +&"<@@ +0xe011 NON-SPACING CEDILLA (ISO-IR-103 203) (character part) +&",@@ +0xe012 NON-SPACING OGONEK (ISO-IR-103 206) (character part) +&";@@ +0xe013 NON-SPACING LOW LINE (ISO-IR-103 204) (character part) +&"_@@ +0xe014 NON-SPACING DOUBLE LOW LINE (ISO-IR-38 217) (character part) +&"=@@ +0xe015 NON-SPACING LONG SOLIDUS (ISO-IR-128 201) (character part) +&"/@@ +0xe016 GREEK NON-SPACING IOTA BELOW (ISO-IR-55 39) (character part) +&"i@@ +0xe017 GREEK NON-SPACING DASIA PNEUMATA (ISO-IR-55 38) (character part) +&"d@@ +0xe018 GREEK NON-SPACING PSILI PNEUMATA (ISO-IR-55 37) (character part) +&"p@@ +0xe019 GREEK DASIA PNEUMATA (ISO-IR-18 92) +&;;@@ +0xe01a GREEK PSILI PNEUMATA (ISO-IR-18 124) +&,,@@ +0xe01b GREEK SMALL LETTER MIDDLE BETA (ISO-IR-18 99) +&b3@@ +0xe01c CIRCLE (ISO-IR-83 0294) +&Ci@@ +0xe01d FUNCTION SIGN (ISO-IR-143 221) +&f(@@ +0xe01e LATIN SMALL LETTER EZH (ISO-IR-158 142) +&ed@@ +0xe01f ANTE MERIDIAM SIGN (ISO-IR-149 0267) +&am@@ +0xe020 POST MERIDIAM SIGN (ISO-IR-149 0268) +&pm@@ +0xe021 TEL COMPATIBILITY SIGN (ISO-IR-149 0269) +&_Tel_@@ +0xe022 ARABIC LETTER ALEF FINAL FORM COMPATIBILITY (IBM868 144) +&_a+:_@@ +0xe023 DUTCH GUILDER SIGN (IBM437 159) +&Fl@@ +0xe024 GAMMA FUNCTION SIGN (ISO-10646-1DIS 032/032/037/122) +&GF@@ +0xe025 RIGHTWARDS VECTOR ABOVE (ISO-10646-1DIS 032/032/038/046) +&>V@@ +0xe026 GREEK VARIA (ISO-10646-1DIS 032/032/042/164) +&!*@@ +0xe027 GREEK PERISPOMENI (ISO-10646-1DIS 032/032/042/165) +&?*@@ +0xe028 LATIN CAPITAL LETTER J WITH CARON (lowercase: 000/000/001/240) +&J<@@ +0xfb00 LATIN SMALL LIGATURE FF +&ff@@ +0xfb01 LATIN SMALL LIGATURE FI +&fi@@ +0xfb02 LATIN SMALL LIGATURE FL +&fl@@ +0xfb03 LATIN SMALL LIGATURE FFI +&_ffi_@@ +0xfb04 LATIN SMALL LIGATURE FFL +&_ffl_@@ +0xfb05 LATIN SMALL LIGATURE FT +&ft@@ +0xfb06 LATIN SMALL LIGATURE ST +&st@@ +0xfe7d ARABIC SHADDA MEDIAL FORM +&_3+;_@@ +0xfe82 ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +&_aM._@@ +0xfe84 ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +&_aH._@@ +0xfe8d ARABIC LETTER ALEF ISOLATED FORM +&_a+-_@@ +0xfe8e ARABIC LETTER ALEF FINAL FORM +&_a+._@@ +0xfe8f ARABIC LETTER BEH ISOLATED FORM +&_b+-_@@ +0xfe90 ARABIC LETTER BEH INITIAL FORM +&_b+,_@@ +0xfe91 ARABIC LETTER BEH MEDIAL FORM +&_b+;_@@ +0xfe92 ARABIC LETTER BEH FINAL FORM +&_b+._@@ +0xfe93 ARABIC LETTER TEH MARBUTA ISOLATED FORM +&_tm-_@@ +0xfe94 ARABIC LETTER TEH MARBUTA FINAL FORM +&_tm._@@ +0xfe95 ARABIC LETTER TEH ISOLATED FORM +&_t+-_@@ +0xfe96 ARABIC LETTER TEH INITIAL FORM +&_t+,_@@ +0xfe97 ARABIC LETTER TEH MEDIAL FORM +&_t+;_@@ +0xfe98 ARABIC LETTER TEH FINAL FORM +&_t+._@@ +0xfe99 ARABIC LETTER THEH ISOLATED FORM +&_tk-_@@ +0xfe9a ARABIC LETTER THEH INITIAL FORM +&_tk,_@@ +0xfe9b ARABIC LETTER THEH MEDIAL FORM +&_tk;_@@ +0xfe9c ARABIC LETTER THEH FINAL FORM +&_tk._@@ +0xfe9d ARABIC LETTER JEEM ISOLATED FORM +&_g+-_@@ +0xfe9e ARABIC LETTER JEEM INITIAL FORM +&_g+,_@@ +0xfe9f ARABIC LETTER JEEM MEDIAL FORM +&_g+;_@@ +0xfea0 ARABIC LETTER JEEM FINAL FORM +&_g+._@@ +0xfea1 ARABIC LETTER HAH ISOLATED FORM +&_hk-_@@ +0xfea2 ARABIC LETTER HAH INITIAL FORM +&_hk,_@@ +0xfea3 ARABIC LETTER HAH MEDIAL FORM +&_hk;_@@ +0xfea4 ARABIC LETTER HAH FINAL FORM +&_hk._@@ +0xfea5 ARABIC LETTER KHAH ISOLATED FORM +&_x+-_@@ +0xfea6 ARABIC LETTER KHAH INITIAL FORM +&_x+,_@@ +0xfea7 ARABIC LETTER KHAH MEDIAL FORM +&_x+;_@@ +0xfea8 ARABIC LETTER KHAH FINAL FORM +&_x+._@@ +0xfea9 ARABIC LETTER DAL ISOLATED FORM +&_d+-_@@ +0xfeaa ARABIC LETTER DAL FINAL FORM +&_d+._@@ +0xfeab ARABIC LETTER THAL ISOLATED FORM +&_dk-_@@ +0xfeac ARABIC LETTER THAL FINAL FORM +&_dk._@@ +0xfead ARABIC LETTER REH ISOLATED FORM +&_r+-_@@ +0xfeae ARABIC LETTER REH FINAL FORM +&_r+._@@ +0xfeaf ARABIC LETTER ZAIN ISOLATED FORM +&_z+-_@@ +0xfeb0 ARABIC LETTER ZAIN FINAL FORM +&_z+._@@ +0xfeb1 ARABIC LETTER SEEN ISOLATED FORM +&_s+-_@@ +0xfeb2 ARABIC LETTER SEEN INITIAL FORM +&_s+,_@@ +0xfeb3 ARABIC LETTER SEEN MEDIAL FORM +&_s+;_@@ +0xfeb4 ARABIC LETTER SEEN FINAL FORM +&_s+._@@ +0xfeb5 ARABIC LETTER SHEEN ISOLATED FORM +&_sn-_@@ +0xfeb6 ARABIC LETTER SHEEN INITIAL FORM +&_sn,_@@ +0xfeb7 ARABIC LETTER SHEEN MEDIAL FORM +&_sn;_@@ +0xfeb8 ARABIC LETTER SHEEN FINAL FORM +&_sn._@@ +0xfeb9 ARABIC LETTER SAD ISOLATED FORM +&_c+-_@@ +0xfeba ARABIC LETTER SAD INITIAL FORM +&_c+,_@@ +0xfebb ARABIC LETTER SAD MEDIAL FORM +&_c+;_@@ +0xfebc ARABIC LETTER SAD FINAL FORM +&_c+._@@ +0xfebd ARABIC LETTER DAD ISOLATED FORM +&_dd-_@@ +0xfebe ARABIC LETTER DAD INITIAL FORM +&_dd,_@@ +0xfebf ARABIC LETTER DAD MEDIAL FORM +&_dd;_@@ +0xfec0 ARABIC LETTER DAD FINAL FORM +&_dd._@@ +0xfec1 ARABIC LETTER TAH ISOLATED FORM +&_tj-_@@ +0xfec2 ARABIC LETTER TAH INITIAL FORM +&_tj,_@@ +0xfec3 ARABIC LETTER TAH MEDIAL FORM +&_tj;_@@ +0xfec4 ARABIC LETTER TAH FINAL FORM +&_tj._@@ +0xfec5 ARABIC LETTER ZAH ISOLATED FORM +&_zH-_@@ +0xfec6 ARABIC LETTER ZAH INITIAL FORM +&_zH,_@@ +0xfec7 ARABIC LETTER ZAH MEDIAL FORM +&_zH;_@@ +0xfec8 ARABIC LETTER ZAH FINAL FORM +&_zH._@@ +0xfec9 ARABIC LETTER AIN ISOLATED FORM +&_e+-_@@ +0xfeca ARABIC LETTER AIN INITIAL FORM +&_e+,_@@ +0xfecb ARABIC LETTER AIN MEDIAL FORM +&_e+;_@@ +0xfecc ARABIC LETTER AIN FINAL FORM +&_e+._@@ +0xfecd ARABIC LETTER GHAIN ISOLATED FORM +&_i+-_@@ +0xfece ARABIC LETTER GHAIN INITIAL FORM +&_i+,_@@ +0xfecf ARABIC LETTER GHAIN MEDIAL FORM +&_i+;_@@ +0xfed0 ARABIC LETTER GHAIN FINAL FORM +&_i+._@@ +0xfed1 ARABIC LETTER FEH ISOLATED FORM +&_f+-_@@ +0xfed2 ARABIC LETTER FEH INITIAL FORM +&_f+,_@@ +0xfed3 ARABIC LETTER FEH MEDIAL FORM +&_f+;_@@ +0xfed4 ARABIC LETTER FEH FINAL FORM +&_f+._@@ +0xfed5 ARABIC LETTER QAF ISOLATED FORM +&_q+-_@@ +0xfed6 ARABIC LETTER QAF INITIAL FORM +&_q+,_@@ +0xfed7 ARABIC LETTER QAF MEDIAL FORM +&_q+;_@@ +0xfed8 ARABIC LETTER QAF FINAL FORM +&_q+._@@ +0xfed9 ARABIC LETTER KAF ISOLATED FORM +&_k+-_@@ +0xfeda ARABIC LETTER KAF INITIAL FORM +&_k+,_@@ +0xfedb ARABIC LETTER KAF MEDIAL FORM +&_k+;_@@ +0xfedc ARABIC LETTER KAF FINAL FORM +&_k+._@@ +0xfedd ARABIC LETTER LAM ISOLATED FORM +&_l+-_@@ +0xfede ARABIC LETTER LAM INITIAL FORM +&_l+,_@@ +0xfedf ARABIC LETTER LAM MEDIAL FORM +&_l+;_@@ +0xfee0 ARABIC LETTER LAM FINAL FORM +&_l+._@@ +0xfee1 ARABIC LETTER MEEM ISOLATED FORM +&_m+-_@@ +0xfee2 ARABIC LETTER MEEM INITIAL FORM +&_m+,_@@ +0xfee3 ARABIC LETTER MEEM MEDIAL FORM +&_m+;_@@ +0xfee4 ARABIC LETTER MEEM FINAL FORM +&_m+._@@ +0xfee5 ARABIC LETTER NOON ISOLATED FORM +&_n+-_@@ +0xfee6 ARABIC LETTER NOON INITIAL FORM +&_n+,_@@ +0xfee7 ARABIC LETTER NOON MEDIAL FORM +&_n+;_@@ +0xfee8 ARABIC LETTER NOON FINAL FORM +&_n+._@@ +0xfee9 ARABIC LETTER HEH ISOLATED FORM +&_h+-_@@ +0xfeea ARABIC LETTER HEH INITIAL FORM +&_h+,_@@ +0xfeeb ARABIC LETTER HEH MEDIAL FORM +&_h+;_@@ +0xfeec ARABIC LETTER HEH FINAL FORM +&_h+._@@ +0xfeed ARABIC LETTER WAW ISOLATED FORM +&_w+-_@@ +0xfeee ARABIC LETTER WAW FINAL FORM +&_w+._@@ +0xfeef ARABIC LETTER ALEF MAKSURA ISOLATED FORM +&_j+-_@@ +0xfef0 ARABIC LETTER ALEF MAKSURA FINAL FORM +&_j+._@@ +0xfef1 ARABIC LETTER YEH ISOLATED FORM +&_y+-_@@ +0xfef2 ARABIC LETTER YEH INITIAL FORM +&_y+,_@@ +0xfef3 ARABIC LETTER YEH MEDIAL FORM +&_y+;_@@ +0xfef4 ARABIC LETTER YEH FINAL FORM +&_y+._@@ +0xfef5 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +&_lM-_@@ +0xfef6 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +&_lM._@@ +0xfef7 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +&_lH-_@@ +0xfef8 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +&_lH._@@ +0xfef9 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM +&_lh-_@@ +0xfefa ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +&_lh._@@ +0xfefb ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +&_la-_@@ +0xfefc ARABIC LIGATURE LAM WITH ALEF FINAL FORM +&_la._@@ diff --git a/externals/figlet/fonts/moscow.flc b/externals/figlet/fonts/moscow.flc new file mode 100644 index 0000000000..86454f175c --- /dev/null +++ b/externals/figlet/fonts/moscow.flc @@ -0,0 +1,68 @@ +flc2a +# This controlfile maps the U.S. keyboard to Cyrillic +# in the style of the "moscow" font, but is meant for use +# with a FIGlet Unicode font with Cyrillic codes, such as "banner" +# +# "moscow" is an upper-case-only font, so for full compatibility +# use the "upper" controlfile as well and avoid "@" and "<". +t / \0x044c +t \0x5c \0x044a +t | \0x044b +t ~ \0x044d +t < \0x042d +t ` \0x0443 +t @ \0x042e +t > \0x0439 +t A \0x0410 +t a \0x0430 +t B \0x0411 +t b \0x0431 +t C \0x0427 +t c \0x0447 +t D \0x0414 +t d \0x0434 +t E \0x0415 +t e \0x0435 +t F \0x0424 +t f \0x0444 +t G \0x0413 +t g \0x0433 +t H \0x0425 +t h \0x0445 +t I \0x0418 +t i \0x0438 +t J \0x0416 +t j \0x0436 +t K \0x041a +t k \0x043a +t L \0x041b +t l \0x043b +t M \0x041c +t m \0x043c +t N \0x041d +t n \0x043d +t O \0x041e +t o \0x043e +t P \0x041f +t p \0x043f +t Q \0x0426 +t q \0x0446 +t R \0x0420 +t r \0x0440 +t S \0x0421 +t s \0x0441 +t T \0x0422 +t t \0x0442 +t U \0x0423 +t u \0x0443 +t V \0x0412 +t v \0x0432 +t W \0x0428 +t w \0x0448 +t X \0x0429 +t x \0x0449 +t Y \0x042f +t y \0x044f +t Z \0x0417 +t z \0x0437 +t = \-6 diff --git a/externals/figlet/fonts/script.flf b/externals/figlet/fonts/script.flf new file mode 100644 index 0000000000..8f2f048fab --- /dev/null +++ b/externals/figlet/fonts/script.flf @@ -0,0 +1,1493 @@ +flf2a$ 7 5 16 0 10 0 3904 96 +Script by Glenn Chappell 4/93 +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +$$@ +$$@ +$$@ +$$@ +$$@ +$$@ +$$@@ + @ + |@ + |@ + |@ + o@ + @ + @@ + oo@ + ||@ + $$@ + $$@ + $$@ + @ + @@ + @ + | | @ + --+--+--@ + --+--+--@ + | | @ + @ + @@ + @ + |_|_@ + (|_| @ + _|_|)@ + | | @ + @ + @@ + @ + () /@ + / @ + / @ + / ()@ + @ + @@ + @ + () @ + /\ @ + / \/@ + \__/\@ + @ + @@ + o@ + /@ + $@ + $@ + $@ + @ + @@ + @ + /@ + | @ + | @ + | @ + \@ + @@ + @ + \ @ + |@ + |@ + |@ + / @ + @@ + @ + @ + \|/ @ + --*--@ + /|\ @ + @ + @@ + @ + @ + | @ + --+--@ + | @ + @ + @@ + @ + @ + @ + @ + o@ + /@ + @@ + @ + @ + @ + -----@ + $ @ + @ + @@ + @ + @ + @ + @ + o@ + @ + @@ + @ + /@ + / @ + / @ + / @ + @ + @@ + __ @ + / \ @ + | |@ + | |@ + \__/ @ + @ + @@ + ,@ + /|@ + |@ + |@ + |@ + @ + @@ + __ @ + / )@ + $/ @ + / @ + /___@ + @ + @@ + ___ @ + / \@ + $__/@ + $ \@ + \___/@ + @ + @@ + @ + | | @ + |__|_@ + | @ + | @ + @ + @@ + ____@ + | @ + |___ @ + $ \@ + \___/@ + @ + @@ + __ @ + /$ @ + | __ @ + |/ \@ + \__/@ + @ + @@ + _____@ + $ /@ + $ / @ + $/ @ + / @ + @ + @@ + __ @ + / \@ + \__/@ + / \@ + \__/@ + @ + @@ + __ @ + / |@ + \_/|@ + |@ + |@ + @ + @@ + @ + o@ + $@ + $@ + o@ + @ + @@ + @ + o@ + $@ + $@ + o@ + /@ + @@ + @ + /@ + / @ + \ @ + \@ + @ + @@ + @ + @ + -----@ + -----@ + @ + @ + @@ + @ + \ @ + \@ + /@ + / @ + @ + @@ + __ @ + / \@ + $_/@ + | @ + o @ + @ + @@ + @ + ____ @ + / __,\ @ + | / | |@ + | \_/|/ @ + \____/ @ + @@ + ___, @ + / | @ + | | @ + | | @ + \__/\_/@ + @ + @@ + , __ @ + /|/ \@ + | __/@ + | \@ + |(__/@ + @ + @@ + ___$@ + / (_)@ + | $ @ + | $ @ + \___/@ + @ + @@ + $____ @ + (| \ @ + | |@ + $_| |@ + (/\___/ @ + @ + @@ + ___$@ + / (_)@ + \__$ @ + / $ @ + \___/@ + @ + @@ + $______@ + (_) |$ @ + _|_$@ + / | |@ + (_/ @ + @ + @@ + @ + () |@ + /\/|@ + / |@ + /(__/ @ + @ + @@ + , @ + /| | @ + |___| @ + | |\@ + | |/@ + @ + @@ + _ @ + | |@ + | |@ + _ |/ @ + \_/\/@ + @ + @@ + @ + /\ @ + | | @ + | | @ + \_|/@ + /| @ + \| @@ + , @ + /| / @ + |__/ @ + | \$ @ + | \_/@ + @ + @@ + $_$ @ + \_|_) @ + |$ @ + $_|$ @ + (/\___/@ + @ + @@ + ,__ __ @ + /| | | @ + | | | @ + | | | @ + | | |_/@ + @ + @@ + , _ @ + /|/ \ @ + | | @ + | | @ + | |_/@ + @ + @@ + __ @ + /\_\/@ + | |@ + | |@ + \__/ @ + @ + @@ + , __ @ + /|/ \@ + |___/@ + | $@ + | $@ + @ + @@ + __ @ + / \ @ + | __ | @ + |/ \| @ + \__/\_/@ + @ + @@ + , __ @ + /|/ \ @ + |___/ @ + | \$ @ + | \_/@ + @ + @@ + @ + () @ + /\ @ + / \@ + /(__/@ + @ + @@ + $______@ + (_) | @ + $ | @ + $_ | @ + (_/ @ + @ + @@ + $_ @ + (_| | @ + | | @ + | | @ + \__/\_/@ + @ + @@ + $_ @ + (_| |_/@ + | | @ + | | @ + \_/ @ + @ + @@ + $_ @ + (_| | |_/@ + | | | @ + | | | @ + \_/ \_/ @ + @ + @@ + $_ @ + (_\ / @ + $\/ @ + $/\ @ + _/ \_/@ + @ + @@ + $_ @ + (_| | @ + | | @ + | | @ + \_/|/@ + /| @ + \| @@ + $__ @ + (_ \ @ + $/ @ + / @ + /__/@ + /| @ + \| @@ + _@ + | @ + | @ + | @ + | @ + |_@ + @@ + @ + \ @ + \ @ + \ @ + \@ + @ + @@ + _ @ + |@ + |@ + |@ + |@ + _|@ + @@ + /\@ + $@ + $@ + $@ + $@ + @ + @@ + @ + @ + @ + @ + $ @ + $ @ + _____@@ + o@ + \@ + $@ + $@ + $@ + @ + @@ + @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ + $_$ @ + | | @ + | | @ + |/ \_@ + \_/ @ + @ + @@ + @ + @ + __ @ + /$ @ + \___/@ + @ + @@ + @ + | @ + __| @ + / | @ + \_/|_/@ + @ + @@ + @ + @ + _ @ + |/ @ + |__/@ + @ + @@ + $_$ @ + | | @ + | | @ + |/ @ + |__/@ + |\ @ + |/ @@ + @ + @ + __, @ + / | @ + \_/|/@ + /| @ + \| @@ + $_$ @ + | | @ + | | @ + |/ \ @ + | |_/@ + @ + @@ + @ + o @ + @ + | @ + |_/@ + @ + @@ + @ + o @ + @ + | @ + |/@ + /| @ + \| @@ + $_$ @ + | | @ + | | @ + |/_) @ + | \_/@ + @ + @@ + $_$ @ + | | @ + | | @ + |/ @ + |__/@ + @ + @@ + @ + @ + _ _ _ @ + / |/ |/ | @ + $ | | |_/@ + @ + @@ + @ + @ + _ _ @ + / |/ | @ + $ | |_/@ + @ + @@ + @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ + @ + @ + _ @ + |/ \_@ + |__/ @ + /| @ + \| @@ + @ + @ + __, @ + / | @ + \_/|_/@ + |\ @ + |/ @@ + @ + @ + ,_ @ + / | @ + $ |_/@ + @ + @@ + @ + @ + , @ + / \_@ + $\/ @ + @ + @@ + @ + @ + _|_ @ + | @ + |_/@ + @ + @@ + @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ + @ + @ + @ + | |_@ + $\/ @ + @ + @@ + @ + @ + @ + | | |_@ + $\/ \/ @ + @ + @@ + @ + @ + @ + /\/ @ + $/\_/@ + @ + @@ + @ + @ + @ + | | @ + $\_/|/@ + /| @ + \| @@ + @ + @ + __ @ + / / _@ + $/_/ @ + /| @ + \| @@ + @ + /@ + | @ + < @ + | @ + \@ + @@ + |@ + |@ + |@ + |@ + |@ + |@ + |@@ + @ + \ @ + | @ + >@ + | @ + / @ + @@ + /\/@ + $ @ + $ @ + $ @ + $ @ + @ + @@ + o o @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ + o o @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ + o o @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ + o o @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ + o o @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ + o o @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ + _ @ + / \@ + | /@ + | \@ + | _/@ + | @ + @@ +160 NO-BREAK SPACE + $$@ + $$@ + $$@ + $$@ + $$@ + $$@ + $$@@ +161 INVERTED EXCLAMATION MARK + @ + o@ + |@ + |@ + |@ + @ + @@ +162 CENT SIGN + @ + @ + _|_ @ + / | @ + \_|_/@ + | @ + @@ +163 POUND SIGN + _ @ + / \ @ + __|__ @ + _| $ @ + (/ \__/@ + @ + @@ +164 CURRENCY SIGN + @ + \ _ /@ + / \ @ + \_/ @ + / \@ + @ + @@ +165 YEN SIGN + @ + \ /@ + _\_/_@ + __|__@ + | @ + @ + @@ +166 BROKEN BAR + |@ + |@ + |@ + @ + |@ + |@ + |@@ +167 SECTION SIGN + _@ + ( @ + /\@ + \/@ + _)@ + @ + @@ +168 DIAERESIS + o o@ + $ $@ + $ $@ + $ $@ + $ $@ + @ + @@ +169 COPYRIGHT SIGN + ____ @ + / __ \ @ + / / () \ @ + | | |@ + \ \__/ / @ + \____/ @ + @@ +170 FEMININE ORDINAL INDICATOR + __, @ + / | @ + \_/|_@ + ---- @ + $ @ + @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + //@ + // @ + \\ @ + \\@ + @ + @@ +172 NOT SIGN + @ + ___ @ + |@ + $ @ + $ @ + @ + @@ +173 SOFT HYPHEN + @ + @ + @ + ----@ + $ @ + @ + @@ +174 REGISTERED SIGN + ____ @ + /, _ \ @ + //|/ \ \ @ + | |__/ |@ + \ | \_// @ + \____/ @ + @@ +175 MACRON + _____@ + $ @ + $ @ + $ @ + $ @ + @ + @@ +176 DEGREE SIGN + _ @ + / \@ + \_/@ + @ + $ @ + @ + @@ +177 PLUS-MINUS SIGN + @ + @ + | @ + --+--@ + __|__@ + @ + @@ +178 SUPERSCRIPT TWO + _ @ + )@ + /_@ + @ + $@ + @ + @@ +179 SUPERSCRIPT THREE + ___@ + _/@ + __)@ + @ + $ @ + @ + @@ +180 ACUTE ACCENT + /@ + $@ + $@ + $@ + $@ + @ + @@ +181 MICRO SIGN + @ + @ + @ + | | @ + |\_/|_/@ + | @ + | @@ +182 PILCROW SIGN + ____ @ + / | |@ + \_| |@ + | |@ + | |@ + @ + @@ +183 MIDDLE DOT + @ + @ + $O$@ + $ @ + $ @ + @ + @@ +184 CEDILLA + @ + @ + @ + @ + $ @ + _)@ + @@ +185 SUPERSCRIPT ONE + ,@ + /|@ + |@ + @ + $@ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + __ @ + / \_@ + \__/ @ + ---- @ + $ @ + @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + \\ @ + \\@ + //@ + // @ + @ + @@ +188 VULGAR FRACTION ONE QUARTER + , @ + /| / @ + |/ @ + /|_|_@ + / | @ + @ + @@ +189 VULGAR FRACTION ONE HALF + , @ + /| / @ + |/_ @ + / )@ + / /_@ + @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ @ + _/ / @ + __)/ @ + /|_|_@ + / | @ + @ + @@ +191 INVERTED QUESTION MARK + @ + o @ + _| @ + /$ @ + \__/@ + @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \ @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + / @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\ @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/ @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + o o @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + (_), @ + / | @ + | | @ + \__/\_/@ + @ + @@ +198 LATIN CAPITAL LETTER AE + ___,___$@ + / | (_)@ + | |__ @ + | | @ + \__/\___/@ + @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ___$@ + / (_)@ + | $ @ + | $ @ + \___/@ + _) @ + @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \ @ + ___$ @ + / (_) @ + >--$ @ + \____/@ + @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + / @ + ___$ @ + / (_) @ + >--$ @ + \____/@ + @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\ @ + ___$ @ + / (_) @ + >--$ @ + \____/@ + @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + o o @ + ___$ @ + / (_) @ + >--$ @ + \____/@ + @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \ @ + $_$ @ + | | @ + _ |/ @ + \_/\_/@ + @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + / @ + $_$ @ + | | @ + _ |/ @ + \_/\_/@ + @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\ @ + $_$ @ + | | @ + _ |/ @ + \_/\_/@ + @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + o o @ + $_$ @ + | | @ + _ |/ @ + \_/\_/@ + @ + @@ +208 LATIN CAPITAL LETTER ETH + $____ @ + (| \ @ + __|__ |@ + $_| |@ + (/\___/ @ + @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/ @ + , _ @ + /|/ \ @ + | | @ + | |_/@ + @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \ @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + / @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\ @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/ @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + o o @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +215 MULTIPLICATION SIGN + @ + @ + $\/$@ + $/\$@ + $ $@ + @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + __ /@ + /\_//@ + | / |@ + | / |@ + /__/ @ + / @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \ @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + / @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\ @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + o o @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + / @ + $_ @ + (_| | @ + | | @ + \_/|/@ + /| @ + \| @@ +222 LATIN CAPITAL LETTER THORN + , @ + | __ @ + /|/ \@ + |___/@ + | $@ + @ + @@ +223 LATIN SMALL LETTER SHARP S + _ @ + / \@ + | /@ + | \@ + | _/@ + | @ + @@ +224 LATIN SMALL LETTER A WITH GRAVE + \ @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + / @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\ @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/ @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + o o @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + @ + () @ + __, @ + / | @ + \_/|_/@ + @ + @@ +230 LATIN SMALL LETTER AE + @ + @ + __,_ @ + / |/ @ + \_/|__/@ + @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + @ + __ @ + / @ + \___/@ + _) @ + @@ +232 LATIN SMALL LETTER E WITH GRAVE + \ @ + @ + _ @ + |/ @ + |__/@ + @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + / @ + @ + _ @ + |/ @ + |__/@ + @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\ @ + @ + _ @ + |/ @ + |__/@ + @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + o o @ + @ + _ @ + |/ @ + |__/@ + @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \ @ + @ + @ + | @ + |_/@ + @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + / @ + @ + @ + | @ + |_/@ + @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\ @ + @ + @ + | @ + |_/@ + @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + o o @ + @ + @ + | @ + |__/@ + @ + @@ +240 LATIN SMALL LETTER ETH + @ + \/@ + _'|@ + / |@ + \_/ @ + @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/ @ + @ + _ _ @ + / |/ | @ + $ | |_/@ + @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \ @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + / @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\ @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/ @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + o o @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +247 DIVISION SIGN + @ + @ + O @ + -----@ + O @ + @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + @ + __/ @ + / /\_@ + \/_/ @ + / @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + \ @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + / @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\ @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + o o @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + / @ + @ + @ + | | @ + $\_/|/@ + /| @ + \| @@ +254 LATIN SMALL LETTER THORN + _ @ + | | @ + | | @ + |/ \_@ + |__/ @ + /| @ + \| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + o o @ + @ + @ + | | @ + $\_/|/@ + /| @ + \| @@ diff --git a/externals/figlet/fonts/shadow.flf b/externals/figlet/fonts/shadow.flf new file mode 100644 index 0000000000..2ec918211b --- /dev/null +++ b/externals/figlet/fonts/shadow.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 16 0 10 0 4992 96 +Shadow by Glenn Chappell 6/93 -- based on Standard & SmShadow +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $$@ + $$@ + $$@ + $$@ + $$@@ + $|$@ + $|$@ + _|$@ + _)$@ + @@ + $| )$@ + V V$ @ + $$ @ + $$ @ + @@ + $| |$ @ + _ |_ |_|$@ + _ |_ |_|$@ + _| _|$ @ + @@ + $|$ @ + $ __)$@ + \__ \$@ + ( /$@ + _|$ @@ + _) /$@ + $/$ @ + $/$ @ + _/ _)$@ + @@ + $ _ )$ @ + $_ \ \$@ + $( ` <$@ + \___/\/$@ + @@ + $)$@ + /$ @ + $$ @ + $$ @ + @@ + $/$@ + $|$ @ + $|$ @ + $|$ @ + \_\$@@ + \ \$ @ + $|$@ + $|$@ + $|$@ + _/$ @@ + $\$ @ + \ /$@ + $_ _\$@ + \/$ @ + @@ + @ + $|$ @ + _ _|$@ + _|$ @ + @@ + @ + @ + @ + $)$@ + /$ @@ + @ + @ + _____|$@ + $$ @ + @@ + @ + @ + @ + _)$@ + @@ + $/$@ + $/$ @ + $/$ @ + _/$ @ + @@ + $_ \$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ + _ |$@ + $|$@ + $|$@ + _|$@ + @@ + ___ \$ @ + ) |$@ + $__/$ @ + _____|$@ + @@ + ___ /$ @ + _ \$ @ + ) |$@ + ____/$ @ + @@ + $| |$ @ + $| |$ @ + ___ __|$@ + _|$ @ + @@ + $___|$ @ + $__ \$ @ + ) |$@ + ____/$ @ + @@ + $/$ @ + $ _ \$ @ + $( |$@ + \___/$ @ + @@ + ___ |$@ + $/$ @ + $/$ @ + _/$ @ + @@ + $ _ )$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ + $_ \$ @ + $( |$@ + \__ |$@ + __/$ @ + @@ + @ + _)$@ + $$ @ + _)$@ + @@ + @ + _)$@ + $$ @ + $)$@ + /$ @@ + $/$@ + $/$ @ + \ \$ @ + \_\$@ + @@ + @ + _____|$@ + _____|$@ + @ + @@ + \ \$ @ + \ \$@ + $/$@ + _/$ @ + @@ + __ \$@ + $/$@ + _|$ @ + _)$ @ + @@ + $__ \$ @ + $/ _` |$@ + $| ( |$@ + \ \__,_|$@ + \____/$ @@ + $\$ @ + $_ \$ @ + $___ \$ @ + _/ _\$@ + @@ + $__ )$ @ + $__ \$ @ + $| |$@ + ____/$ @ + @@ + $___|$@ + $|$ @ + $|$ @ + \____|$@ + @@ + $__ \$ @ + $| |$@ + $| |$@ + ____/$ @ + @@ + $____|$@ + $__|$ @ + $|$ @ + _____|$@ + @@ + $____|$@ + $|$ @ + $__|$ @ + _|$ @ + @@ + $___|$@ + $|$ @ + $| |$@ + \____|$@ + @@ + $| |$@ + $| |$@ + $___ |$@ + _| _|$@ + @@ + _ _|$@ + $|$ @ + $|$ @ + ___|$@ + @@ + $|$@ + $|$@ + $\ |$@ + \___/$ @ + @@ + $| /$@ + $' /$ @ + $. \$ @ + _|\_\$@ + @@ + $|$ @ + $|$ @ + $|$ @ + _____|$@ + @@ + $ \ |$@ + $|\/ |$@ + $| |$@ + _| _|$@ + @@ + $ \ |$@ + $ \ |$@ + $|\ |$@ + _| \_|$@ + @@ + $_ \$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ + $ _ \$ @ + $| |$@ + $___/$ @ + _|$ @ + @@ + $_ \$ @ + $| |$@ + $| |$@ + \__\_\$@ + @@ + $ _ \$ @ + $| |$@ + $__ <$ @ + _| \_\$@ + @@ + $___|$ @ + \___ \$ @ + $|$@ + _____/$ @ + @@ + __ __|$@ + $|$ @ + $|$ @ + _|$ @ + @@ + $| |$@ + $| |$@ + $| |$@ + \___/$ @ + @@ + \ \ /$@ + \ \ /$ @ + \ \ /$ @ + \_/$ @ + @@ + \ \ /$@ + \ \ \ /$ @ + \ \ \ /$ @ + \_/\_/$ @ + @@ + \ \ /$@ + \ /$ @ + $ \$ @ + _/\_\$@ + @@ + \ \ /$@ + \ /$ @ + $|$ @ + _|$ @ + @@ + __ /$@ + $/$ @ + $/$ @ + ____|$@ + @@ + $_|$@ + $|$ @ + $|$ @ + $|$ @ + __|$@@ + \ \$ @ + \ \$ @ + \ \$ @ + \_\$@ + @@ + _ |$@ + $|$@ + $|$@ + $|$@ + __|$@@ + /\\$@ + $$ @ + $$ @ + $$ @ + @@ + @ + @ + @ + $$ @ + _____|$@@ + $)$@ + \|$@ + $$ @ + $$ @ + @@ + @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ + $|$ @ + $__ \$ @ + $| |$@ + _.__/$ @ + @@ + @ + $__|$@ + $($ @ + \___|$@ + @@ + $|$@ + $_` |$@ + $( |$@ + \__,_|$@ + @@ + @ + $_ \$@ + $ __/$@ + \___|$@ + @@ + $_|$@ + $|$ @ + $__|$@ + _|$ @ + @@ + @ + $_` |$@ + $( |$@ + \__, |$@ + |___/$ @@ + $|$ @ + $__ \$ @ + $| | |$@ + _| |_|$@ + @@ + _)$@ + $|$@ + $|$@ + _|$@ + @@ + _)$@ + $|$@ + $|$@ + $|$@ + ___/$ @@ + $|$ @ + $| /$@ + $ <$ @ + _|\_\$@ + @@ + $|$@ + $|$@ + $|$@ + _|$@ + @@ + @ + $__ `__ \$ @ + $| | |$@ + _| _| _|$@ + @@ + @ + $__ \$ @ + $| |$@ + _| _|$@ + @@ + @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ + @ + $__ \$ @ + $| |$@ + $.__/$ @ + _|$ @@ + @ + $_` |$@ + $( |$@ + \__, |$@ + _|$@@ + @ + $ __|$@ + $|$ @ + _|$ @ + @@ + @ + $__|$@ + \__ \$@ + ____/$@ + @@ + $|$ @ + $__|$@ + $|$ @ + \__|$@ + @@ + @ + $| |$@ + $| |$@ + \__,_|$@ + @@ + @ + \ \ /$@ + \ \ /$ @ + \_/$ @ + @@ + @ + \ \ \ /$@ + \ \ \ /$ @ + \_/\_/$ @ + @@ + @ + \ \ /$@ + ` <$ @ + _/\_\$@ + @@ + @ + $| |$@ + $| |$@ + \__, |$@ + ____/$ @@ + @ + _ /$@ + $/$ @ + ___|$@ + @@ + $/$@ + $|$ @ + < <$ @ + $|$ @ + \_\$@@ + $|$@ + $|$@ + $|$@ + $|$@ + _|$@@ + \ \$ @ + $|$ @ + ` >$@ + $|$ @ + _/$ @@ + / _/$@ + $$ @ + $$ @ + $$ @ + @@ + _) \ _)$@ + $_ \$ @ + $___ \$ @ + _/ _\$@ + @@ + _) _)$@ + $_ \$ @ + $| |$@ + \___/$ @ + @@ + _) _)$@ + $| |$@ + $| |$@ + \___/$ @ + @@ + _) _)$@ + $_` |$@ + $( |$@ + \__,_|$@ + @@ + _) _)$@ + $_ \$ @ + $( |$@ + \___/$ @ + @@ + _) _)$@ + $| |$@ + $| |$@ + \__,_|$@ + @@ + $_ \$@ + $| /$@ + $|\ \$@ + $|__/$@ + _|$ @@ +160 NO-BREAK SPACE + $ $@ + $ $@ + $ $@ + $ $@ + $ $@@ +161 INVERTED EXCLAMATION MARK + _)$@ + $|$@ + $|$@ + _|$@ + @@ +162 CENT SIGN + $|$ @ + $__)$@ + $($ @ + \ )$@ + _|$ @@ +163 POUND SIGN + $,_\$ @ + _ |_$ @ + $|$ @ + _,____|$@ + @@ +164 CURRENCY SIGN + \ _ /$@ + $( |$@ + $___ \$@ + \/ /$@ + @@ +165 YEN SIGN + \ \ /$ @ + __ __|$@ + __ __|$@ + _|$ @ + @@ +166 BROKEN BAR + $|$@ + _|$@ + @ + $|$@ + _|$@@ +167 SECTION SIGN + $_)$@ + $\ \$ @ + \ \\ \$@ + \ \_/$@ + (__/$ @@ +168 DIAERESIS + _) _)$@ + $ $ @ + $ $ @ + $ $ @ + @@ +169 COPYRIGHT SIGN + $ \$ @ + $ __| \$ @ + $ ( |$@ + \ \___| /$ @ + \_____/$ @@ +170 FEMININE ORDINAL INDICATOR + $_` |$@ + \__,_|$@ + _____|$@ + $$ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + $/ /$@ + $/ /$ @ + \ \ \$ @ + \_\_\$@ + @@ +172 NOT SIGN + @ + _____ |$@ + _|$@ + $$ @ + @@ +173 SOFT HYPHEN + @ + @ + _____|$@ + $$ @ + @@ +174 REGISTERED SIGN + $ \$ @ + $ _ \ \$ @ + $ / |$@ + \ _|_\ /$ @ + \_____/$ @@ +175 MACRON + _____|$@ + $$ @ + $$ @ + $$ @ + @@ +176 DEGREE SIGN + $ \$ @ + $( |$@ + \__/$ @ + $$ @ + @@ +177 PLUS-MINUS SIGN + $|$ @ + _ _|$@ + _|$ @ + _____|$@ + @@ +178 SUPERSCRIPT TWO + _ )$@ + $/$ @ + ___|$@ + $$ @ + @@ +179 SUPERSCRIPT THREE + __ /$@ + _ \$@ + ___/$@ + $$ @ + @@ +180 ACUTE ACCENT + _/$@ + $$ @ + $$ @ + $$ @ + @@ +181 MICRO SIGN + @ + $| |$@ + $| |$@ + $._,_|$@ + _|$ @@ +182 PILCROW SIGN + $ |$@ + $( | |$@ + \__ | |$@ + _|_|$@ + @@ +183 MIDDLE DOT + @ + _)$@ + $$ @ + $$ @ + @@ +184 CEDILLA + @ + @ + @ + $$ @ + _)$@@ +185 SUPERSCRIPT ONE + _ |$@ + $|$@ + _|$@ + $$ @ + @@ +186 MASCULINE ORDINAL INDICATOR + $_ \$@ + \___/$@ + ____|$@ + $$ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + \ \ \$ @ + \ \ \$@ + $/ /$@ + _/_/$ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ | /$ @ + $| / | |$ @ + _| / __ _|$@ + _/ _|$ @ + @@ +189 VULGAR FRACTION ONE HALF + _ | /$ @ + $| /_ )$@ + _| / /$ @ + _/ ___|$@ + @@ +190 VULGAR FRACTION THREE QUARTERS + __ / /$ @ + _ \ / | |$ @ + ___/ / __ _|$@ + _/ _|$ @ + @@ +191 INVERTED QUESTION MARK + _)$ @ + $|$ @ + $/$ @ + \___|$@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \_\$ @ + $\$ @ + $_ \$ @ + _/ _\$@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _/$ @ + $\$ @ + $_ \$ @ + _/ _\$@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\\$ @ + $\$ @ + $_ \$ @ + _/ _\$@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + / _/$ @ + $\$ @ + $_ \$ @ + _/ _\$@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _) \ _)$@ + $_ \$ @ + $___ \$ @ + _/ _\$@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + ( )$ @ + $_ \$ @ + $___ \$ @ + _/ _\$@ + @@ +198 LATIN CAPITAL LETTER AE + $ ____|$@ + $/ __|$ @ + $__ |$ @ + _/ _____|$@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + $___|$@ + $|$ @ + $|$ @ + \____|$@ + _)$ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \_\$ @ + $____|$@ + $ _|$ @ + _____|$@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _/$ @ + $____|$@ + $ _|$ @ + _____|$@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\\$ @ + $____|$@ + $ _|_$ @ + _____|$@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _) _)$@ + $____|$@ + $ _|$ @ + _____|$@ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \_\$ @ + _ _|$@ + | |$ @ + ___|$@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _/$ @ + _ _|$@ + $|$ @ + ___|$@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\\$ @ + _ _|$@ + $|$ @ + ___|$@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _) _)$@ + _ _|$ @ + $|$ @ + ___|$ @ + @@ +208 LATIN CAPITAL LETTER ETH + __ \$ @ + | |$@ + __ __| |$@ + ____/$ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + / _/$@ + $ \ |$@ + $. |$@ + _|\_|$@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \_\$ @ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _/$ @ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\\$ @ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + / _/$ @ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _) _)$@ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +215 MULTIPLICATION SIGN + @ + \ \$@ + , '$@ + \/\/$@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + $_ /$ @ + $| / |$@ + $ / |$@ + _/__/$ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \_\$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _/$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\\$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _) _)$@ + $| |$@ + $| |$@ + \___/$ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _/$ @ + \ \ /$@ + \ /$ @ + _|$ @ + @@ +222 LATIN CAPITAL LETTER THORN + $|$ @ + $ __ \$@ + $ ___/$@ + _|$ @ + @@ +223 LATIN SMALL LETTER SHARP S + $_ \$@ + $| /$@ + $|\ \$@ + $|__/$@ + _|$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + \_\$ @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + _/_$ @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\\$ @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + / _/$ @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _) _)$@ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + ( )$ @ + $_ '|$@ + $( |$@ + \__,_|$@ + @@ +230 LATIN SMALL LETTER AE + @ + $_` _ \$@ + $( __/$@ + \__,____|$@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + $__|$@ + $($ @ + \___|$@ + _)$ @@ +232 LATIN SMALL LETTER E WITH GRAVE + \_\$ @ + $_ \$@ + $ __/$@ + \___|$@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + _/$ @ + $_ \$@ + $ __/$@ + \___|$@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\\$ @ + $_ \$@ + $ __/$@ + \___|$@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _) _)$@ + $_ \$ @ + $ __/$ @ + \___|$ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \_\$@ + $|$@ + $|$@ + _|$@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + _/$@ + $|$@ + $|$@ + _|$@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\\$@ + $|$ @ + $|$ @ + _|$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _) _)$@ + $|$ @ + $|$ @ + _|$ @ + @@ +240 LATIN SMALL LETTER ETH + ` <$ @ + \/\ |$@ + $__` |$@ + \____/$ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + / _/$ @ + $'_ \$ @ + $| |$@ + _| _|$@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \_\$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + _/$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\\$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + / _/$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _) _)$@ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +247 DIVISION SIGN + @ + _)$ @ + _____|$@ + _)$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + $_ /\$ @ + $( / |$@ + \_/__/$ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + \_\$ @ + $| |$@ + $| |$@ + \__,_|$@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + _/$ @ + $| |$@ + $| |$@ + \__,_|$@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\\$ @ + $| |$@ + $| |$@ + \__,_|$@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _) _)$@ + $| |$@ + $| |$@ + \__,_|$@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _/$ @ + $| |$@ + $| |$@ + \__, |$@ + ____/$ @@ +254 LATIN SMALL LETTER THORN + $|$ @ + $__ \$ @ + $| |$@ + $.__/$ @ + _|$ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _) _)$@ + $| |$@ + $| |$@ + \__, |$@ + ____/$ @@ diff --git a/externals/figlet/fonts/slant.flf b/externals/figlet/fonts/slant.flf new file mode 100644 index 0000000000..43fe3986e8 --- /dev/null +++ b/externals/figlet/fonts/slant.flf @@ -0,0 +1,1295 @@ +flf2a$ 6 5 16 15 10 0 18319 96 +Slant by Glenn Chappell 3/93 -- based on Standard +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ + __@ + / /@ + / / @ + /_/ @ +(_) @ + @@ + _ _ @ +( | )@ +|/|/ @ + $ @ +$ @ + @@ + __ __ @ + __/ // /_@ + /_ _ __/@ +/_ _ __/ @ + /_//_/ @ + @@ + __@ + _/ /@ + / __/@ + (_ ) @ +/ _/ @ +/_/ @@ + _ __@ + (_)_/_/@ + _/_/ @ + _/_/_ @ +/_/ (_) @ + @@ + ___ @ + ( _ ) @ + / __ \/|@ +/ /_/ < @ +\____/\/ @ + @@ + _ @ + ( )@ + |/ @ + $ @ +$ @ + @@ + __@ + _/_/@ + / / @ + / / @ +/ / @ +|_| @@ + _ @ + | |@ + / /@ + / / @ + _/_/ @ +/_/ @@ + @ + __/|_@ + | /@ +/_ __| @ + |/ @ + @@ + @ + __ @ + __/ /_@ +/_ __/@ + /_/ @ + @@ + @ + @ + @ + _ @ +( )@ +|/ @@ + @ + @ + ______@ +/_____/@ + $ @ + @@ + @ + @ + @ + _ @ +(_)@ + @@ + __@ + _/_/@ + _/_/ @ + _/_/ @ +/_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + ___@ + < /@ + / / @ + / / @ +/_/ @ + @@ + ___ @ + |__ \@ + __/ /@ + / __/ @ +/____/ @ + @@ + _____@ + |__ /@ + /_ < @ + ___/ / @ +/____/ @ + @@ + __ __@ + / // /@ + / // /_@ +/__ __/@ + /_/ @ + @@ + ______@ + / ____/@ + /___ \ @ + ____/ / @ +/_____/ @ + @@ + _____@ + / ___/@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _____@ +/__ /@ + / / @ + / / @ +/_/ @ + @@ + ____ @ + ( __ )@ + / __ |@ +/ /_/ / @ +\____/ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + \__, / @ +/____/ @ + @@ + @ + _ @ + (_)@ + _ @ +(_) @ + @@ + @ + _ @ + (_)@ + _ @ +( ) @ +|/ @@ + __@ + / /@ +/ / @ +\ \ @ + \_\@ + @@ + @ + _____@ + /____/@ +/____/ @ + $ @ + @@ +__ @ +\ \ @ + \ \@ + / /@ +/_/ @ + @@ + ___ @ + /__ \@ + / _/@ + /_/ @ +(_) @ + @@ + ______ @ + / ____ \@ + / / __ `/@ +/ / /_/ / @ +\ \__,_/ @ + \____/ @@ + ___ @ + / |@ + / /| |@ + / ___ |@ +/_/ |_|@ + @@ + ____ @ + / __ )@ + / __ |@ + / /_/ / @ +/_____/ @ + @@ + ______@ + / ____/@ + / / @ +/ /___ @ +\____/ @ + @@ + ____ @ + / __ \@ + / / / /@ + / /_/ / @ +/_____/ @ + @@ + ______@ + / ____/@ + / __/ @ + / /___ @ +/_____/ @ + @@ + ______@ + / ____/@ + / /_ @ + / __/ @ +/_/ @ + @@ + ______@ + / ____/@ + / / __ @ +/ /_/ / @ +\____/ @ + @@ + __ __@ + / / / /@ + / /_/ / @ + / __ / @ +/_/ /_/ @ + @@ + ____@ + / _/@ + / / @ + _/ / @ +/___/ @ + @@ + __@ + / /@ + __ / / @ +/ /_/ / @ +\____/ @ + @@ + __ __@ + / //_/@ + / ,< @ + / /| | @ +/_/ |_| @ + @@ + __ @ + / / @ + / / @ + / /___@ +/_____/@ + @@ + __ ___@ + / |/ /@ + / /|_/ / @ + / / / / @ +/_/ /_/ @ + @@ + _ __@ + / | / /@ + / |/ / @ + / /| / @ +/_/ |_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + / ____/ @ +/_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\___\_\ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + / _, _/ @ +/_/ |_| @ + @@ + _____@ + / ___/@ + \__ \ @ + ___/ / @ +/____/ @ + @@ + ______@ + /_ __/@ + / / @ + / / @ +/_/ @ + @@ + __ __@ + / / / /@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ + _ __@ +| | / /@ +| | / / @ +| |/ / @ +|___/ @ + @@ + _ __@ +| | / /@ +| | /| / / @ +| |/ |/ / @ +|__/|__/ @ + @@ + _ __@ + | |/ /@ + | / @ + / | @ +/_/|_| @ + @@ +__ __@ +\ \/ /@ + \ / @ + / / @ +/_/ @ + @@ + _____@ +/__ /@ + / / @ + / /__@ +/____/@ + @@ + ___@ + / _/@ + / / @ + / / @ + / / @ +/__/ @@ +__ @ +\ \ @ + \ \ @ + \ \ @ + \_\@ + @@ + ___@ + / /@ + / / @ + / / @ + _/ / @ +/__/ @@ + //|@ + |/||@ + $ @ + $ @ +$ @ + @@ + @ + @ + @ + @ + ______@ +/_____/@@ + _ @ + ( )@ + V @ + $ @ +$ @ + @@ + @ + ____ _@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ + __ @ + / /_ @ + / __ \@ + / /_/ /@ +/_.___/ @ + @@ + @ + _____@ + / ___/@ +/ /__ @ +\___/ @ + @@ + __@ + ____/ /@ + / __ / @ +/ /_/ / @ +\__,_/ @ + @@ + @ + ___ @ + / _ \@ +/ __/@ +\___/ @ + @@ + ____@ + / __/@ + / /_ @ + / __/ @ +/_/ @ + @@ + @ + ____ _@ + / __ `/@ + / /_/ / @ + \__, / @ +/____/ @@ + __ @ + / /_ @ + / __ \@ + / / / /@ +/_/ /_/ @ + @@ + _ @ + (_)@ + / / @ + / / @ +/_/ @ + @@ + _ @ + (_)@ + / / @ + / / @ + __/ / @ +/___/ @@ + __ @ + / /__@ + / //_/@ + / ,< @ +/_/|_| @ + @@ + __@ + / /@ + / / @ + / / @ +/_/ @ + @@ + @ + ____ ___ @ + / __ `__ \@ + / / / / / /@ +/_/ /_/ /_/ @ + @@ + @ + ____ @ + / __ \@ + / / / /@ +/_/ /_/ @ + @@ + @ + ____ @ + / __ \@ +/ /_/ /@ +\____/ @ + @@ + @ + ____ @ + / __ \@ + / /_/ /@ + / .___/ @ +/_/ @@ + @ + ____ _@ + / __ `/@ +/ /_/ / @ +\__, / @ + /_/ @@ + @ + _____@ + / ___/@ + / / @ +/_/ @ + @@ + @ + _____@ + / ___/@ + (__ ) @ +/____/ @ + @@ + __ @ + / /_@ + / __/@ +/ /_ @ +\__/ @ + @@ + @ + __ __@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ + @ + _ __@ +| | / /@ +| |/ / @ +|___/ @ + @@ + @ + _ __@ +| | /| / /@ +| |/ |/ / @ +|__/|__/ @ + @@ + @ + _ __@ + | |/_/@ + _> < @ +/_/|_| @ + @@ + @ + __ __@ + / / / /@ + / /_/ / @ + \__, / @ +/____/ @@ + @ + ____@ +/_ /@ + / /_@ +/___/@ + @@ + __@ + _/_/@ + _/_/ @ +< < @ +/ / @ +\_\ @@ + __@ + / /@ + / / @ + / / @ + / / @ +/_/ @@ + _ @ + | |@ + / /@ + _>_>@ + _/_/ @ +/_/ @@ + /\//@ + //\/ @ + $ @ + $ @ +$ @ + @@ + _ _ @ + (_)(_)@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_)_(_)@ + / __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\__,_/ @ + @@ + ____ @ + / __ \@ + / / / /@ + / /_| | @ + / //__/ @ +/_/ @@ +160 NO-BREAK SPACE + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + / / @ + / / @ +/_/ @ + @@ +162 CENT SIGN + __@ + __/ /@ + / ___/@ +/ /__ @ +\ _/ @ +/_/ @@ +163 POUND SIGN + ____ @ + / ,__\@ + __/ /_ @ + _/ /___ @ +(_,____/ @ + @@ +164 CURRENCY SIGN + /|___/|@ + | __ / @ + / /_/ / @ + /___ | @ +|/ |/ @ + @@ +165 YEN SIGN + ____@ + _| / /@ + /_ __/@ +/_ __/ @ + /_/ @ + @@ +166 BROKEN BAR + __@ + / /@ + /_/ @ + __ @ + / / @ +/_/ @@ +167 SECTION SIGN + __ @ + _/ _)@ + / | | @ + | || | @ + | |_/ @ +(__/ @@ +168 DIAERESIS + _ _ @ + (_) (_)@ + $ $ @ + $ $ @ +$ $ @ + @@ +169 COPYRIGHT SIGN + ______ @ + / _____\ @ + / / ___/ |@ + / / /__ / @ +| \___/ / @ + \______/ @@ +170 FEMININE ORDINAL INDICATOR + ___ _@ + / _ `/@ + _\_,_/ @ +/____/ @ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ +/ / / @ +\ \ \ @ + \_\_\@ + @@ +172 NOT SIGN + @ + ______@ +/___ /@ + /_/ @ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + _____@ +/____/@ + $ @ + @@ +174 REGISTERED SIGN + ______ @ + / ___ \ @ + / / _ \ |@ + / / , _/ / @ +| /_/|_| / @ + \______/ @@ +175 MACRON + ______@ +/_____/@ + $ @ + $ @ +$ @ + @@ +176 DEGREE SIGN + ___ @ + / _ \@ +/ // /@ +\___/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + __ @ + __/ /_@ + /_ __/@ + __/_/_ @ +/_____/ @ + @@ +178 SUPERSCRIPT TWO + ___ @ + |_ |@ + / __/ @ +/____/ @ + $ @ + @@ +179 SUPERSCRIPT THREE + ____@ + |_ /@ + _/_ < @ +/____/ @ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ +$ @ + @@ +181 MICRO SIGN + @ + __ __@ + / / / /@ + / /_/ / @ + / ._,_/ @ +/_/ @@ +182 PILCROW SIGN + _______@ + / _ /@ +/ (/ / / @ +\_ / / @ + /_/_/ @ + @@ +183 MIDDLE DOT + @ + _ @ +(_)@ + $ @ +$ @ + @@ +184 CEDILLA + @ + @ + @ + @ + _ @ +/_)@@ +185 SUPERSCRIPT ONE + ___@ + < /@ + / / @ +/_/ @ +$ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + _\___/@ +/____/ @ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +____ @ +\ \ \ @ + \ \ \@ + / / /@ +/_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + ___ __ @ + < / _/_/ @ + / /_/_/___@ +/_//_// / /@ + /_/ /_ _/@ + /_/ @@ +189 VULGAR FRACTION ONE HALF + ___ __ @ + < / _/_/__ @ + / /_/_/|_ |@ +/_//_/ / __/ @ + /_/ /____/ @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ____ __ @ + |_ / _/_/ @ + _/_ < _/_/___@ +/____//_// / /@ + /_/ /_ _/@ + /_/ @@ +191 INVERTED QUESTION MARK + _ @ + (_)@ + _/ / @ +/ _/_ @ +\___/ @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + _\_\@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __@ + _/_/@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //|@ + _|/||@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\//@ + _//\/ @ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + (())@ + / |@ + / /| |@ + / ___ |@ +/_/ |_|@ + @@ +198 LATIN CAPITAL LETTER AE + __________@ + / ____/@ + / /| __/ @ + / __ /___ @ +/_/ /_____/ @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ______@ + / ____/@ + / / @ +/ /___ @ +\____/ @ + /_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + _\_\@ + / __/@ + / _/ @ +/___/ @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + _/_/@ + / __/@ + / _/ @ +/___/ @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //|@ + _|/||@ + / __/ @ + / _/ @ +/___/ @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / __/ @ + / _/ @ +/___/ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + _\_\@ + / _/@ + _/ / @ +/___/ @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __@ + _/_/@ + / _/@ + _/ / @ +/___/ @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //|@ + _|/||@ + / _/ @ + _/ / @ +/___/ @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)(_)@ + / _/ @ + _/ / @ +/___/ @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + / __ \@ + __/ /_/ /@ +/_ __/ / @ + /_____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\//@ + _//\/ @ + / |/ / @ + / / @ +/_/|_/ @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + __\_\@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __@ + __/_/@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\//@ + _//\/ @ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +215 MULTIPLICATION SIGN + @ + @ + /|/|@ + > < @ +|/|/ @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _____ @ + / _// \@ + / //// /@ +/ //// / @ +\_//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + __\_\_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + __/_/_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //| @ + _|/||_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ +__/_/_@ +\ \/ /@ + \ / @ + /_/ @ + @@ +222 LATIN CAPITAL LETTER THORN + __ @ + / /_ @ + / __ \@ + / ____/@ +/_/ @ + @@ +223 LATIN SMALL LETTER SHARP S + ____ @ + / __ \@ + / / / /@ + / /_| | @ + / //__/ @ +/_/ @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + __\_\_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + __/_/_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //| @ + _|/||_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\//@ + _//\/_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + __(())@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +230 LATIN SMALL LETTER AE + @ + ____ ___ @ + / __ ` _ \@ +/ /_/ __/@ +\__,_____/ @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _____@ + / ___/@ +/ /__ @ +\___/ @ +/_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + _\_\@ + / _ \@ +/ __/@ +\___/ @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __@ + _/_/@ + / _ \@ +/ __/@ +\___/ @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //|@ + _|/||@ + / _ \ @ +/ __/ @ +\___/ @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / _ \ @ +/ __/ @ +\___/ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + / / @ + / / @ +/_/ @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + / / @ + / / @ +/_/ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //|@ + |/||@ + / / @ + / / @ +/_/ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + / / @ + / / @ +/_/ @ + @@ +240 LATIN SMALL LETTER ETH + || @ + =||=@ + ___ || @ +/ __` | @ +\____/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\//@ + _//\/ @ + / __ \ @ + / / / / @ +/_/ /_/ @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + __\_\@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __@ + __/_/@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\//@ + _//\/ @ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +247 DIVISION SIGN + @ + _ @ + __(_)_@ +/_____/@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + _____ @ + / _// \@ +/ //// /@ +\_//__/ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + __\_\_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + __/_/_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //| @ + _|/||_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\__,_/ @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + __/_/_@ + / / / /@ + / /_/ / @ + \__, / @ +/____/ @@ +254 LATIN SMALL LETTER THORN + __ @ + / /_ @ + / __ \@ + / /_/ /@ + / .___/ @ +/_/ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ + / /_/ / @ + \__, / @ +/____/ @@ diff --git a/externals/figlet/fonts/small.flf b/externals/figlet/fonts/small.flf new file mode 100644 index 0000000000..c6b5bfcdef --- /dev/null +++ b/externals/figlet/fonts/small.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 13 15 10 0 22415 96 +Small by Glenn Chappell 4/93 -- based on Standard +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $@ + $@ + $@ + $@ + $@@ + _ @ + | |@ + |_|@ + (_)@ + @@ + _ _ @ + ( | )@ + V V @ + $ @ + @@ + _ _ @ + _| | |_ @ + |_ . _|@ + |_ _|@ + |_|_| @@ + @ + ||_@ + (_-<@ + / _/@ + || @@ + _ __ @ + (_)/ / @ + / /_ @ + /_/(_)@ + @@ + __ @ + / _|___ @ + > _|_ _|@ + \_____| @ + @@ + _ @ + ( )@ + |/ @ + $ @ + @@ + __@ + / /@ + | | @ + | | @ + \_\@@ + __ @ + \ \ @ + | |@ + | |@ + /_/ @@ + @ + _/\_@ + > <@ + \/ @ + @@ + _ @ + _| |_ @ + |_ _|@ + |_| @ + @@ + @ + @ + _ @ + ( )@ + |/ @@ + @ + ___ @ + |___|@ + $ @ + @@ + @ + @ + _ @ + (_)@ + @@ + __@ + / /@ + / / @ + /_/ @ + @@ + __ @ + / \ @ + | () |@ + \__/ @ + @@ + _ @ + / |@ + | |@ + |_|@ + @@ + ___ @ + |_ )@ + / / @ + /___|@ + @@ + ____@ + |__ /@ + |_ \@ + |___/@ + @@ + _ _ @ + | | | @ + |_ _|@ + |_| @ + @@ + ___ @ + | __|@ + |__ \@ + |___/@ + @@ + __ @ + / / @ + / _ \@ + \___/@ + @@ + ____ @ + |__ |@ + / / @ + /_/ @ + @@ + ___ @ + ( _ )@ + / _ \@ + \___/@ + @@ + ___ @ + / _ \@ + \_, /@ + /_/ @ + @@ + _ @ + (_)@ + _ @ + (_)@ + @@ + _ @ + (_)@ + _ @ + ( )@ + |/ @@ + __@ + / /@ + < < @ + \_\@ + @@ + @ + ___ @ + |___|@ + |___|@ + @@ + __ @ + \ \ @ + > >@ + /_/ @ + @@ + ___ @ + |__ \@ + /_/@ + (_) @ + @@ + ____ @ + / __ \ @ + / / _` |@ + \ \__,_|@ + \____/ @@ + _ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ + ___ @ + | _ )@ + | _ \@ + |___/@ + @@ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ + ___ @ + | \ @ + | |) |@ + |___/ @ + @@ + ___ @ + | __|@ + | _| @ + |___|@ + @@ + ___ @ + | __|@ + | _| @ + |_| @ + @@ + ___ @ + / __|@ + | (_ |@ + \___|@ + @@ + _ _ @ + | || |@ + | __ |@ + |_||_|@ + @@ + ___ @ + |_ _|@ + | | @ + |___|@ + @@ + _ @ + _ | |@ + | || |@ + \__/ @ + @@ + _ __@ + | |/ /@ + | ' < @ + |_|\_\@ + @@ + _ @ + | | @ + | |__ @ + |____|@ + @@ + __ __ @ + | \/ |@ + | |\/| |@ + |_| |_|@ + @@ + _ _ @ + | \| |@ + | .` |@ + |_|\_|@ + @@ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + ___ @ + | _ \@ + | _/@ + |_| @ + @@ + ___ @ + / _ \ @ + | (_) |@ + \__\_\@ + @@ + ___ @ + | _ \@ + | /@ + |_|_\@ + @@ + ___ @ + / __|@ + \__ \@ + |___/@ + @@ + _____ @ + |_ _|@ + | | @ + |_| @ + @@ + _ _ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + __ __@ + \ \ / /@ + \ V / @ + \_/ @ + @@ + __ __@ + \ \ / /@ + \ \/\/ / @ + \_/\_/ @ + @@ + __ __@ + \ \/ /@ + > < @ + /_/\_\@ + @@ + __ __@ + \ \ / /@ + \ V / @ + |_| @ + @@ + ____@ + |_ /@ + / / @ + /___|@ + @@ + __ @ + | _|@ + | | @ + | | @ + |__|@@ + __ @ + \ \ @ + \ \ @ + \_\@ + @@ + __ @ + |_ |@ + | |@ + | |@ + |__|@@ + /\ @ + |/\|@ + $ @ + $ @ + @@ + @ + @ + @ + ___ @ + |___|@@ + _ @ + ( )@ + \|@ + $ @ + @@ + @ + __ _ @ + / _` |@ + \__,_|@ + @@ + _ @ + | |__ @ + | '_ \@ + |_.__/@ + @@ + @ + __ @ + / _|@ + \__|@ + @@ + _ @ + __| |@ + / _` |@ + \__,_|@ + @@ + @ + ___ @ + / -_)@ + \___|@ + @@ + __ @ + / _|@ + | _|@ + |_| @ + @@ + @ + __ _ @ + / _` |@ + \__, |@ + |___/ @@ + _ @ + | |_ @ + | ' \ @ + |_||_|@ + @@ + _ @ + (_)@ + | |@ + |_|@ + @@ + _ @ + (_)@ + | |@ + _/ |@ + |__/ @@ + _ @ + | |__@ + | / /@ + |_\_\@ + @@ + _ @ + | |@ + | |@ + |_|@ + @@ + @ + _ __ @ + | ' \ @ + |_|_|_|@ + @@ + @ + _ _ @ + | ' \ @ + |_||_|@ + @@ + @ + ___ @ + / _ \@ + \___/@ + @@ + @ + _ __ @ + | '_ \@ + | .__/@ + |_| @@ + @ + __ _ @ + / _` |@ + \__, |@ + |_|@@ + @ + _ _ @ + | '_|@ + |_| @ + @@ + @ + ___@ + (_-<@ + /__/@ + @@ + _ @ + | |_ @ + | _|@ + \__|@ + @@ + @ + _ _ @ + | || |@ + \_,_|@ + @@ + @ + __ __@ + \ V /@ + \_/ @ + @@ + @ + __ __ __@ + \ V V /@ + \_/\_/ @ + @@ + @ + __ __@ + \ \ /@ + /_\_\@ + @@ + @ + _ _ @ + | || |@ + \_, |@ + |__/ @@ + @ + ___@ + |_ /@ + /__|@ + @@ + __@ + / /@ + _| | @ + | | @ + \_\@@ + _ @ + | |@ + | |@ + | |@ + |_|@@ + __ @ + \ \ @ + | |_@ + | | @ + /_/ @@ + /\/|@ + |/\/ @ + $ @ + $ @ + @@ + _ _ @ + (_)(_)@ + /--\ @ + /_/\_\@ + @@ + _ _ @ + (_)(_)@ + / __ \@ + \____/@ + @@ + _ _ @ + (_) (_)@ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_)(_)@ + / _` |@ + \__,_|@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + \___/ @ + @@ + _ _ @ + (_)(_)@ + | || |@ + \_,_|@ + @@ + ___ @ + / _ \@ + | |< <@ + | ||_/@ + |_| @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + | |@ + |_|@ + @@ +162 CENT SIGN + @ + || @ + / _)@ + \ _)@ + || @@ +163 POUND SIGN + __ @ + _/ _\ @ + |_ _|_ @ + (_,___|@ + @@ +164 CURRENCY SIGN + /\_/\@ + \ . /@ + / _ \@ + \/ \/@ + @@ +165 YEN SIGN + __ __ @ + \ V / @ + |__ __|@ + |__ __|@ + |_| @@ +166 BROKEN BAR + _ @ + | |@ + |_|@ + | |@ + |_|@@ +167 SECTION SIGN + __ @ + / _)@ + /\ \ @ + \ \/ @ + (__/ @@ +168 DIAERESIS + _ _ @ + (_)(_)@ + $ $ @ + $ $ @ + @@ +169 COPYRIGHT SIGN + ____ @ + / __ \ @ + / / _| \@ + \ \__| /@ + \____/ @@ +170 FEMININE ORDINAL INDICATOR + __ _ @ + / _` |@ + \__,_|@ + |____|@ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ + < < < @ + \_\_\@ + @@ +172 NOT SIGN + ____ @ + |__ |@ + |_|@ + $ @ + @@ +173 SOFT HYPHEN + @ + __ @ + |__|@ + $ @ + @@ +174 REGISTERED SIGN + ____ @ + / __ \ @ + / | -) \@ + \ ||\\ /@ + \____/ @@ +175 MACRON + ___ @ + |___|@ + $ @ + $ @ + @@ +176 DEGREE SIGN + _ @ + /.\@ + \_/@ + $ @ + @@ +177 PLUS-MINUS SIGN + _ @ + _| |_ @ + |_ _|@ + _|_|_ @ + |_____|@@ +178 SUPERSCRIPT TWO + __ @ + |_ )@ + /__|@ + $ @ + @@ +179 SUPERSCRIPT THREE + ___@ + |_ /@ + |__)@ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ + @@ +181 MICRO SIGN + @ + _ _ @ + | || |@ + | .,_|@ + |_| @@ +182 PILCROW SIGN + ____ @ + / |@ + \_ | |@ + |_|_|@ + @@ +183 MIDDLE DOT + @ + _ @ + (_)@ + $ @ + @@ +184 CEDILLA + @ + @ + @ + _ @ + )_)@@ +185 SUPERSCRIPT ONE + _ @ + / |@ + |_|@ + $ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + \___/@ + |___|@ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + ____ @ + \ \ \ @ + > > >@ + /_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ __ @ + / |/ /__ @ + |_/ /_' |@ + /_/ |_|@ + @@ +189 VULGAR FRACTION ONE HALF + _ __ @ + / |/ /_ @ + |_/ /_ )@ + /_//__|@ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ __ @ + |_ // /__ @ + |__) /_' |@ + /_/ |_|@ + @@ +191 INVERTED QUESTION MARK + _ @ + (_) @ + / /_ @ + \___|@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + \_\ @ + /--\ @ + /_/\_\@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __ @ + /_/ @ + /--\ @ + /_/\_\@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\ @ + |/\| @ + /--\ @ + /_/\_\@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/|@ + |/\/ @ + /--\ @ + /_/\_\@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + /--\ @ + /_/\_\@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + __ @ + (()) @ + /--\ @ + /_/\_\@ + @@ +198 LATIN CAPITAL LETTER AE + ____ @ + /, __|@ + / _ _| @ + /_/|___|@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ___ @ + / __|@ + | (__ @ + \___|@ + )_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + \_\@ + | -<@ + |__<@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + /_/@ + | -<@ + |__<@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\ @ + |/\|@ + | -<@ + |__<@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + | -< @ + |__< @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + \_\ @ + |_ _|@ + |___|@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __ @ + /_/ @ + |_ _|@ + |___|@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + |_ _|@ + |___|@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + |_ _| @ + |___| @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + | __ \ @ + |_ _|) |@ + |____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/|@ + |/\/ @ + | \| |@ + |_|\_|@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + \_\_ @ + / __ \@ + \____/@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __ @ + _/_/ @ + / __ \@ + \____/@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\ @ + |/\| @ + / __ \@ + \____/@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/|@ + |/\/ @ + / __ \@ + \____/@ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)(_)@ + / __ \@ + \____/@ + @@ +215 MULTIPLICATION SIGN + @ + /\/\@ + > <@ + \/\/@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + ____ @ + / _//\ @ + | (//) |@ + \//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | |_| |@ + \___/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | |_| |@ + \___/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | |_| |@ + \___/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | |_| |@ + \___/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ + _/_/_@ + \ V /@ + |_| @ + @@ +222 LATIN CAPITAL LETTER THORN + _ @ + | |_ @ + | -_)@ + |_| @ + @@ +223 LATIN SMALL LETTER SHARP S + ___ @ + / _ \@ + | |< <@ + | ||_/@ + |_| @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + \_\_ @ + / _` |@ + \__,_|@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + _/_/ @ + / _` |@ + \__,_|@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\ @ + |/\| @ + / _` |@ + \__,_|@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/|@ + |/\/ @ + / _` |@ + \__,_|@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / _` |@ + \__,_|@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + (()) @ + / _` |@ + \__,_|@ + @@ +230 LATIN SMALL LETTER AE + @ + __ ___ @ + / _` -_)@ + \__,___|@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + __ @ + / _|@ + \__|@ + )_)@@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + \_\ @ + / -_)@ + \___|@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __ @ + /_/ @ + / -_)@ + \___|@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\|@ + / -_)@ + \___|@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + / -_) @ + \___| @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + | |@ + |_|@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + | |@ + |_|@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + | | @ + |_| @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + | | @ + |_| @ + @@ +240 LATIN SMALL LETTER ETH + \\/\ @ + \/\\ @ + / _` |@ + \___/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/| @ + |/\/ @ + | ' \ @ + |_||_|@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \@ + \___/@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \@ + \___/@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\|@ + / _ \@ + \___/@ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/|@ + |/\/ @ + / _ \@ + \___/@ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + \___/ @ + @@ +247 DIVISION SIGN + _ @ + (_) @ + |___|@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + ___ @ + / //\@ + \//_/@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + \_\_ @ + | || |@ + \_,_|@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + _/_/ @ + | || |@ + \_,_|@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\ @ + |/\| @ + | || |@ + \_,_|@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_)(_)@ + | || |@ + \_,_|@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + _/_/ @ + | || |@ + \_, |@ + |__/ @@ +254 LATIN SMALL LETTER THORN + _ @ + | |__ @ + | '_ \@ + | .__/@ + |_| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_)(_)@ + | || |@ + \_, |@ + |__/ @@ diff --git a/externals/figlet/fonts/smscript.flf b/externals/figlet/fonts/smscript.flf new file mode 100644 index 0000000000..32a8a39da5 --- /dev/null +++ b/externals/figlet/fonts/smscript.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 13 0 10 0 3904 96 +SmScript by Glenn Chappell 4/93 -- based on Script +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +$ $@ +$ $@ +$ $@ +$ $@ +$ $@@ + @ + |@ + |@ + o@ + @@ + oo@ + ||@ + $@ + $@ + @@ + @ + _|_|_@ + _|_|_@ + | | @ + @@ + @ + |_|_@ + (|_| @ + _|_|)@ + | | @@ + @ + () / @ + / @ + / ()@ + @@ + @ + () @ + /\/@ + \/\@ + @@ + o@ + /@ + $@ + $@ + @@ + @ + /@ + | @ + | @ + \@@ + @ + \ @ + |@ + |@ + / @@ + @ + \|/ @ + --*--@ + /|\ @ + @@ + @ + | @ + --+--@ + | @ + @@ + @ + @ + @ + o@ + /@@ + @ + @ + ----@ + $ @ + @@ + @ + @ + @ + o@ + @@ + @ + /@ + / @ + / @ + @@ + _ @ + / \ @ + | |@ + \_/ @ + @@ + ,@ + /|@ + |@ + |@ + @@ + _ @ + / )@ + / @ + /__@ + @@ + ____@ + __/@ + $ \@ + \__/@ + @@ + @ + | | @ + |__|_@ + | @ + @@ + ___@ + |__ @ + $ \@ + \__/@ + @@ + _ @ + /_ @ + |/ \@ + \_/@ + @@ + ____@ + $/@ + / @ + / @ + @@ + __ @ + (__)@ + / \@ + \__/@ + @@ + __ @ + / |@ + \_/|@ + |@ + @@ + @ + o@ + $@ + o@ + @@ + @ + o@ + $@ + o@ + /@@ + @ + /@ + < @ + \@ + @@ + @ + ____@ + ____@ + $ @ + @@ + @ + \ @ + >@ + / @ + @@ + __ @ + )@ + | @ + o @ + @@ + ____ @ + / __,\ @ + | / | |@ + | \_/|/ @ + \____/ @@ + __, @ + / | @ + | | @ + \_/\_/@ + @@ + , _ @ + /|/_)@ + | \@ + |(_/@ + @@ + __$ @ + / () @ + | $ @ + \___/@ + @@ + $___ @ + (| \ @ + | |@ + (\__/ @ + @@ + __$ @ + / () @ + >-$ @ + \___/@ + @@ + $_____@ + () |_$@ + /| |@ + (/ @ + @@ + @ + () |@ + /\/|@ + /(_/ @ + @@ + , @ + /| | @ + |--| @ + | |)@ + @@ + @ + |\ @ + _ |/ @ + \_/\/@ + @@ + @ + /| @ + | | @ + \|/@ + (| @@ + , , @ + /|_/ @ + |\ @ + | \_/@ + @@ + $ @ + \_|) @ + | @ + (\__/@ + @@ + ,_ _ @ + /| | | @ + | | | @ + | | |_/@ + @@ + , @ + /|/\ @ + | | @ + | |_/@ + @@ + __ @ + /\_\/@ + | |@ + \__/ @ + @@ + , _ @ + /|/ \@ + |__/@ + | $@ + @@ + __ @ + /__\ @ + |/ \| @ + \__/\_/@ + @@ + , _ @ + /|/ \ @ + |__/ @ + | \_/@ + @@ + @ + () @ + /\ @ + /(_)@ + @@ + $_____@ + () | @ + $| @ + (/ @ + @@ + @ + (| | @ + | | @ + \_/\_/@ + @@ + @ + (| |_/@ + | | @ + \/ @ + @@ + @ + (| | |_/@ + | | | @ + \/ \/ @ + @@ + @ + (\ / @ + >< @ + _/ \_/@ + @@ + @ + (| | @ + | | @ + \/|/@ + (| @@ + _ @ + / ) @ + / @ + /__/@ + (| @@ + _@ + | @ + | @ + | @ + |_@@ + @ + \ @ + \ @ + \@ + @@ + _ @ + |@ + |@ + |@ + _|@@ + /\@ + $@ + $@ + $@ + @@ + @ + @ + @ + $ @ + ____@@ + o@ + \@ + $@ + $@ + @@ + @ + _, @ + / | @ + \/|_/@ + @@ + @ + |) @ + |/\_@ + \/ @ + @@ + @ + _ @ + / @ + \__/@ + @@ + @ + _| @ + / | @ + \/|_/@ + @@ + @ + _ @ + |/ @ + |_/@ + @@ + @ + |\ @ + |/ @ + |_/@ + |) @@ + @ + _, @ + / | @ + \/|/@ + (| @@ + @ + |) @ + |/\ @ + | |/@ + @@ + @ + o @ + | @ + |/@ + @@ + @ + o @ + | @ + |/@ + (| @@ + @ + |) @ + |/) @ + | \/@ + @@ + @ + |\ @ + |/ @ + |_/@ + @@ + @ + @ + /|/|/| @ + $| | |_/@ + @@ + @ + @ + /|/| @ + $| |_/@ + @@ + @ + _ @ + / \_@ + \_/ @ + @@ + @ + @ + |/\_@ + |_/ @ + (| @@ + @ + _, @ + / | @ + \/|_/@ + |) @@ + @ + ,_ @ + / | @ + $ |/@ + @@ + @ + , @ + / \_@ + $\/ @ + @@ + @ + _|_ @ + | @ + |_/@ + @@ + @ + @ + | | @ + $\/|_/@ + @@ + @ + @ + | |_@ + $\/ @ + @@ + @ + @ + | | |_@ + $\/ \/ @ + @@ + @ + @ + /\/ @ + $/\/@ + @@ + @ + @ + | | @ + $\/|/@ + (| @@ + @ + __ @ + / / _@ + $/_/ @ + (| @@ + @ + /@ + _| @ + | @ + \@@ + |@ + |@ + |@ + |@ + |@@ + @ + \ @ + |_@ + | @ + / @@ + /\/@ + $ @ + $ @ + $ @ + @@ + o o @ + __, @ + / | @ + \_/\_/@ + @@ + o o @ + __ @ + /\_\/@ + \__/ @ + @@ + /\/ @ + @ + (| | @ + \_/\_/@ + @@ + o o @ + _, @ + / | @ + \/|_/@ + @@ + o o @ + _ @ + / \_@ + \_/ @ + @@ + o o @ + @ + | | @ + $\/|_/@ + @@ + _ @ + | \@ + | <@ + |_/@ + | @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + @ + o@ + |@ + |@ + @@ +162 CENT SIGN + @ + _|_ @ + / | @ + \_|_/@ + | @@ +163 POUND SIGN + _ @ + _|_` @ + | @ + (\__/@ + @@ +164 CURRENCY SIGN + \ _ /@ + / \ @ + \_/ @ + / \@ + @@ +165 YEN SIGN + \ /@ + _\_/_@ + __|__@ + | @ + @@ +166 BROKEN BAR + |@ + |@ + @ + |@ + |@@ +167 SECTION SIGN + _@ + ( @ + ()@ + _)@ + @@ +168 DIAERESIS + o o@ + $ $@ + $ $@ + $ $@ + @@ +169 COPYRIGHT SIGN + ____ @ + / __ \ @ + | / () |@ + | \__/ |@ + \____/ @@ +170 FEMININE ORDINAL INDICATOR + _, @ + (_|_@ + --- @ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + //@ + << @ + \\@ + @@ +172 NOT SIGN + @ + __ @ + |@ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + ---@ + $ @ + @@ +174 REGISTERED SIGN + ____ @ + / ,_ \ @ + | /|_) |@ + | |\/ |@ + \____/ @@ +175 MACRON + ____@ + $ @ + $ @ + $ @ + @@ +176 DEGREE SIGN + ()@ + $@ + $@ + $@ + @@ +177 PLUS-MINUS SIGN + @ + | @ + --+--@ + __|__@ + @@ +178 SUPERSCRIPT TWO + _ @ + )@ + /_@ + $@ + @@ +179 SUPERSCRIPT THREE + ___@ + _/@ + __)@ + $ @ + @@ +180 ACUTE ACCENT + /@ + $@ + $@ + $@ + @@ +181 MICRO SIGN + @ + @ + | | @ + |\/|_/@ + | @@ +182 PILCROW SIGN + ___ @ + / | |@ + \_| |@ + | |@ + @@ +183 MIDDLE DOT + @ + @ + $O$@ + $ @ + @@ +184 CEDILLA + @ + @ + @ + $ @ + _)@@ +185 SUPERSCRIPT ONE + ,@ + /|@ + |@ + $@ + @@ +186 MASCULINE ORDINAL INDICATOR + __@ + (_)@ + ---@ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + \\ @ + >>@ + // @ + @@ +188 VULGAR FRACTION ONE QUARTER + , @ + /| / @ + |/|_|_@ + / | @ + @@ +189 VULGAR FRACTION ONE HALF + , @ + /| /_ @ + |/ )@ + / /_@ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ @ + _/ / @ + __)/|_|_@ + / | @ + @@ +191 INVERTED QUESTION MARK + @ + o @ + | @ + (__@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \ @ + __, @ + / | @ + \_/\_/@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + / @ + __, @ + / | @ + \_/\_/@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\ @ + __, @ + / | @ + \_/\_/@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/ @ + __, @ + / | @ + \_/\_/@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + o o @ + __, @ + / | @ + \_/\_/@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + (_) @ + / | @ + \_/\_/@ + @@ +198 LATIN CAPITAL LETTER AE + __,__$ @ + / | () @ + | |-$ @ + \_/\___/@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + __$ @ + / () @ + | $ @ + \___/@ + _) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \ @ + __$ @ + <_() @ + <___/@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + / @ + __$ @ + <_() @ + <___/@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\ @ + __$ @ + <_() @ + <___/@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + o o @ + __$ @ + <_() @ + <___/@ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \ @ + |\ @ + _ |/ @ + \_/\/@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + / @ + |\ @ + _ |/ @ + \_/\/@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\ @ + |\ @ + _ |/ @ + \_/\/@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + o o @ + |\ @ + _ |/ @ + \_/\/@ + @@ +208 LATIN CAPITAL LETTER ETH + ___ @ + (| \ @ + -|- |@ + (\__/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + ,/\/ @ + /|/\ @ + | | @ + | |_/@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \ @ + __ @ + /\_\/@ + \__/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + / @ + __ @ + /\_\/@ + \__/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\ @ + __ @ + /\_\/@ + \__/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/ @ + __ @ + /\_\/@ + \__/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + o o @ + __ @ + /\_\/@ + \__/ @ + @@ +215 MULTIPLICATION SIGN + @ + $\/$@ + $/\$@ + $ $@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + __/ @ + /\/\/@ + | / |@ + /__/ @ + / @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \ @ + @ + (| | @ + \_/\_/@ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + / @ + @ + (| | @ + \_/\_/@ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\ @ + @ + (| | @ + \_/\_/@ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + /\/ @ + @ + (| | @ + \_/\_/@ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + / @ + @ + (| | @ + \/|/@ + (| @@ +222 LATIN CAPITAL LETTER THORN + , @ + /|__ @ + |__)@ + | $@ + @@ +223 LATIN SMALL LETTER SHARP S + _ @ + | \@ + | <@ + |_/@ + | @@ +224 LATIN SMALL LETTER A WITH GRAVE + \ @ + _, @ + / | @ + \/|_/@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + / @ + _, @ + / | @ + \/|_/@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\ @ + _, @ + / | @ + \/|_/@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/ @ + _, @ + / | @ + \/|_/@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + o o @ + _, @ + / | @ + \/|_/@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + () @ + _, @ + / | @ + \/|_/@ + @@ +230 LATIN SMALL LETTER AE + @ + _,_ @ + / |/ @ + \/|_/@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _ @ + / @ + \__/@ + _) @@ +232 LATIN SMALL LETTER E WITH GRAVE + \ @ + _ @ + |/ @ + |_/@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + / @ + _ @ + |/ @ + |_/@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\ @ + _ @ + |/ @ + |_/@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + o o @ + _ @ + |/ @ + |__/@ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \ @ + @ + | @ + |/@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + / @ + @ + | @ + |/@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\@ + @ + | @ + |/@ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + o o @ + @ + | @ + |__/@ + @@ +240 LATIN SMALL LETTER ETH + \, @ + '\ @ + / |@ + \/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/ @ + @ + /|/| @ + $| |_/@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \ @ + _ @ + / \_@ + \_/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + / @ + _ @ + / \_@ + \_/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\ @ + _ @ + / \_@ + \_/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/ @ + _ @ + / \_@ + \_/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + o o @ + _ @ + / \_@ + \_/ @ + @@ +247 DIVISION SIGN + @ + O @ + ---@ + O @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + __/ @ + / /\_@ + \/_/ @ + / @@ +249 LATIN SMALL LETTER U WITH GRAVE + \ @ + @ + | | @ + $\/|_/@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + / @ + @ + | | @ + $\/|_/@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\ @ + @ + | | @ + $\/|_/@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + o o @ + @ + | | @ + $\/|_/@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + / @ + @ + | | @ + $\/|/@ + (| @@ +254 LATIN SMALL LETTER THORN + @ + |) @ + |/\_@ + |_/ @ + (| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + o o @ + @ + | | @ + $\/|/@ + (| @@ diff --git a/externals/figlet/fonts/smshadow.flf b/externals/figlet/fonts/smshadow.flf new file mode 100644 index 0000000000..7e1329f4c2 --- /dev/null +++ b/externals/figlet/fonts/smshadow.flf @@ -0,0 +1,899 @@ +flf2a$ 4 3 14 0 10 0 1920 96 +SmShadow by Glenn Chappell 4/93 -- based on Small +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $$@ + $$@ + $$@ + $$@@ + |$@ + _|$@ + _)$@ + @@ + | )$@ + V V$ @ + @ + @@ + | |$ @ + _ |_ |_|$@ + _ |_ |_|$@ + _| _|$ @@ + |$ @ + (_-<$@ + _ _/$@ + _|$ @@ + _) /$ @ + /$ @ + _/ _)$@ + @@ + _|$ @ + _| _|$@ + \____|$ @ + @@ + )$@ + /$ @ + @ + @@ + /$@ + |$ @ + |$ @ + \_\$@@ + \ \$ @ + |$@ + |$@ + _/$ @@ + \ \ /$ @ + _ _|$@ + _/ _\$ @ + @@ + |$ @ + __ __|$@ + _|$ @ + @@ + @ + @ + )$@ + /$ @@ + @ + ____|$@ + @ + @@ + @ + @ + _)$@ + @@ + /$@ + /$ @ + _/$ @ + @@ + \$ @ + ( |$@ + \__/$ @ + @@ + _ |$@ + |$@ + _|$@ + @@ + _ )$@ + /$ @ + ___|$@ + @@ + __ /$@ + _ \$@ + ___/$@ + @@ + | |$ @ + __ _|$@ + _|$ @ + @@ + __|$@ + __ \$@ + ___/$@ + @@ + /$ @ + _ \$@ + \___/$@ + @@ + __ /$@ + /$ @ + _/$ @ + @@ + _ )$@ + _ \$@ + \___/$@ + @@ + _ \$@ + \_ /$@ + _/$ @ + @@ + _)$@ + @ + _)$@ + @@ + _)$@ + @ + )$@ + /$ @@ + /$@ + < <$ @ + \_\$@ + @@ + @ + ____|$@ + ____|$@ + @@ + \ \$ @ + > >$@ + _/$ @ + @@ + __ \$@ + _/$@ + _)$ @ + @@ + __ \$ @ + / _` |$@ + \__,_|$@ + \____/$ @@ + \$ @ + _ \$ @ + _/ _\$@ + @@ + _ )$@ + _ \$@ + ___/$@ + @@ + __|$@ + ($ @ + \___|$@ + @@ + _ \$ @ + | |$@ + ___/$ @ + @@ + __|$@ + _|$ @ + ___|$@ + @@ + __|$@ + _|$ @ + _|$ @ + @@ + __|$@ + (_ |$@ + \___|$@ + @@ + | |$@ + __ |$@ + _| _|$@ + @@ + _ _|$@ + |$ @ + ___|$@ + @@ + |$@ + \ |$@ + \__/$ @ + @@ + | /$@ + . <$ @ + _|\_\$@ + @@ + |$ @ + |$ @ + ____|$@ + @@ + \ |$@ + |\/ |$@ + _| _|$@ + @@ + \ |$@ + . |$@ + _|\_|$@ + @@ + _ \$ @ + ( |$@ + \___/$ @ + @@ + _ \$@ + __/$@ + _|$ @ + @@ + _ \$ @ + ( |$@ + \__\_\$@ + @@ + _ \$@ + /$@ + _|_\$@ + @@ + __|$@ + \__ \$@ + ____/$@ + @@ + __ __|$@ + |$ @ + _|$ @ + @@ + | |$@ + | |$@ + \__/$ @ + @@ + \ \ /$@ + \ \ /$ @ + \_/$ @ + @@ + \ \ /$@ + \ \ \ /$ @ + \_/\_/$ @ + @@ + \ \ /$@ + > <$ @ + _/\_\$@ + @@ + \ \ /$@ + \ /$ @ + _|$ @ + @@ + __ /$@ + /$ @ + ____|$@ + @@ + _|$@ + |$ @ + |$ @ + __|$@@ + \ \$ @ + \ \$ @ + \_\$@ + @@ + _ |$@ + |$@ + |$@ + __|$@@ + \$ @ + /\|$@ + @ + @@ + @ + @ + @ + ____|$@@ + )$@ + \|$@ + @ + @@ + @ + _` |$@ + \__,_|$@ + @@ + |$ @ + _ \$@ + _.__/$@ + @@ + @ + _|$@ + \__|$@ + @@ + |$@ + _` |$@ + \__,_|$@ + @@ + @ + -_)$@ + \___|$@ + @@ + _|$@ + _|$@ + _|$ @ + @@ + @ + _` |$@ + \__, |$@ + ____/$ @@ + |$ @ + \$ @ + _| _|$@ + @@ + _)$@ + |$@ + _|$@ + @@ + _)$@ + |$@ + |$@ + __/$ @@ + |$ @ + | /$@ + _\_\$@ + @@ + |$@ + |$@ + _|$@ + @@ + @ + ` \$ @ + _|_|_|$@ + @@ + @ + \$ @ + _| _|$@ + @@ + @ + _ \$@ + \___/$@ + @@ + @ + _ \$@ + .__/$@ + _|$ @@ + @ + _` |$@ + \__, |$@ + _|$@@ + @ + _|$@ + _|$ @ + @@ + @ + (_-<$@ + ___/$@ + @@ + |$ @ + _|$@ + \__|$@ + @@ + @ + | |$@ + \_,_|$@ + @@ + @ + \ \ /$@ + \_/$ @ + @@ + @ + \ \ \ /$@ + \_/\_/$ @ + @@ + @ + \ \ /$@ + _\_\$@ + @@ + @ + | |$@ + \_, |$@ + ___/$ @@ + @ + _ /$@ + ___|$@ + @@ + /$@ + _ |$ @ + |$ @ + \_\$@@ + |$@ + |$@ + |$@ + _|$@@ + \ \$ @ + |_$@ + |$ @ + _/$ @@ + \ |$@ + /\/$ @ + @ + @@ + _) \_)$@ + _ \$ @ + / _\$@ + @@ + _) _)$@ + __ \$@ + \____/$@ + @@ + _) _)$@ + | |$@ + \__/$ @ + @@ + _) _)$@ + _` |$@ + \__,_|$@ + @@ + _) _)$@ + _ \$@ + \___/$@ + @@ + _) _)$@ + | |$@ + \_,_|$@ + @@ + _ \$@ + |< <$@ + |__/$@ + _|$ @@ +160 NO-BREAK SPACE + $$@ + $$@ + $$@ + $$@@ +161 INVERTED EXCLAMATION MARK + _)$@ + |$@ + _|$@ + @@ +162 CENT SIGN + |$ @ + _)$@ + \ _)$@ + |$ @@ +163 POUND SIGN + _\$ @ + _ _|$ @ + _,___|$@ + @@ +164 CURRENCY SIGN + \ . /$@ + _ \$@ + \/ /$@ + @@ +165 YEN SIGN + \ \ /$ @ + __ __|$@ + __ __|$@ + _|$ @@ +166 BROKEN BAR + |$@ + _|$@ + |$@ + _|$@@ +167 SECTION SIGN + _)$@ + \ \$ @ + \ \/$ @ + __/$ @@ +168 DIAERESIS + _) _)$@ + @ + @ + @@ +169 COPYRIGHT SIGN + \$ @ + _| \$@ + \ \__| /$@ + \____/$ @@ +170 FEMININE ORDINAL INDICATOR + _` |$@ + \__,_|$@ + _____|$@ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + / /$@ + < < <$ @ + \_\_\$@ + @@ +172 NOT SIGN + ____ |$@ + _|$@ + @ + @@ +173 SOFT HYPHEN + @ + ___|$@ + @ + @@ +174 REGISTERED SIGN + \$ @ + -) \$@ + \ |\\ /$@ + \____/$ @@ +175 MACRON + ___|$@ + @ + @ + @@ +176 DEGREE SIGN + .\$@ + \_/$@ + @ + @@ +177 PLUS-MINUS SIGN + |$ @ + _ _|$@ + _|$ @ + _____|$@@ +178 SUPERSCRIPT TWO + _ )$@ + __|$@ + @ + @@ +179 SUPERSCRIPT THREE + _ /$@ + __)$@ + @ + @@ +180 ACUTE ACCENT + _/$@ + @ + @ + @@ +181 MICRO SIGN + @ + | |$@ + .,_|$@ + _|$ @@ +182 PILCROW SIGN + |$@ + \_ | |$@ + _|_|$@ + @@ +183 MIDDLE DOT + @ + _)$@ + @ + @@ +184 CEDILLA + @ + @ + @ + _)$@@ +185 SUPERSCRIPT ONE + _ |$@ + _|$@ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + _ \$@ + \___/$@ + ____|$@ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + \ \ \$ @ + > > >$@ + _/_/$ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ | /$ @ + _| /_' |$@ + _/ _|$@ + @@ +189 VULGAR FRACTION ONE HALF + _ | /$ @ + _| /_ )$@ + _/ __|$@ + @@ +190 VULGAR FRACTION THREE QUARTERS + _ / /$ @ + __) /_' |$@ + _/ _|$@ + @@ +191 INVERTED QUESTION MARK + _)$ @ + /$ @ + \___|$@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \_\$ @ + --\$ @ + _/\_\$@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _/$ @ + --\$ @ + _/\_\$@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\\$ @ + --\$ @ + _/\_\$@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + / _/$ @ + --\$ @ + _/\_\$@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _) \_)$@ + _ \$ @ + / _\$@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + ( )$ @ + _ \$ @ + _/ _\$@ + @@ +198 LATIN CAPITAL LETTER AE + , __|$@ + _ _|$ @ + _/ ___|$@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + |$@ + ($ @ + \___|$@ + _)$ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \_\$@ + -<$@ + __<$@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _/$@ + -<$@ + __<$@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\\$@ + -<$@ + __<$@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _) _)$@ + -<$ @ + __<$ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \_\$ @ + _ _|$@ + ___|$@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _/$ @ + _ _|$@ + ___|$@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\\$ @ + _ _|$@ + ___|$@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _) _)$@ + _ _|$ @ + ___|$ @ + @@ +208 LATIN CAPITAL LETTER ETH + _ \$ @ + _ _| |$@ + ___/$ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + / _/$@ + \ |$@ + _|\_|$@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \_\$ @ + __ \$@ + \____/$@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _/$ @ + __ \$@ + \____/$@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\\$ @ + __ \$@ + \____/$@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + / _/$ @ + __ \$@ + \____/$@ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _) _)$@ + __ \$@ + \____/$@ + @@ +215 MULTIPLICATION SIGN + \ \$@ + , '$@ + \/\/$@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _ /\$ @ + ( / |$@ + \_/__/$ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \_\$ @ + | |$@ + \__/$ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _/$ @ + | |$@ + \__/$ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\\$ @ + | |$@ + \__/$ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _) _)$@ + | |$@ + \__/$ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _/$ @ + \ \ /$@ + _|$ @ + @@ +222 LATIN CAPITAL LETTER THORN + |$ @ + -_)$@ + _|$ @ + @@ +223 LATIN SMALL LETTER SHARP S + _ \$@ + |< <$@ + |__/$@ + _|$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + \_\$ @ + _` |$@ + \__,_|$@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + _/$ @ + _` |$@ + \__,_|$@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\\$ @ + _` |$@ + \__,_|$@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + / _/$ @ + _` |$@ + \__,_|$@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _) _)$@ + _` |$@ + \__,_|$@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + ( )$ @ + _` |$@ + \__,_|$@ + @@ +230 LATIN SMALL LETTER AE + @ + _` -_)$@ + \__,___|$@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _|$@ + \__|$@ + _)$@@ +232 LATIN SMALL LETTER E WITH GRAVE + \_\$ @ + -_)$@ + \___|$@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + _/$ @ + -_)$@ + \___|$@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\\$ @ + -_)$@ + \___|$@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _) _)$@ + -_)$ @ + \___|$ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \_\$@ + |$@ + _|$@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + _/$@ + |$@ + _|$@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\\$@ + |$ @ + _|$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _) _)$@ + |$ @ + _|$ @ + @@ +240 LATIN SMALL LETTER ETH + , \'$@ + _` |$@ + \___/$ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + / _/$ @ + ' \$ @ + _| _|$@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \_\$ @ + _ \$@ + \___/$@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + _/$ @ + _ \$@ + \___/$@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\\$ @ + _ \$@ + \___/$@ + @@ +245 LATIN SMALL LETTER O WITH TILDE + / _/$@ + _ \$@ + \___/$@ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _) _)$@ + _ \$@ + \___/$@ + @@ +247 DIVISION SIGN + _)$ @ + ___|$@ + _)$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + /\$@ + \_/_/$@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + \_\$ @ + | |$@ + \_,_|$@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + _/$ @ + | |$@ + \_,_|$@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\\$ @ + | |$@ + \_,_|$@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _) _)$@ + | |$@ + \_,_|$@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _/$ @ + | |$@ + \_, |$@ + ___/$ @@ +254 LATIN SMALL LETTER THORN + |$ @ + '_ \$@ + .__/$@ + _|$ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _) _)$@ + | |$@ + \_, |$@ + ___/$ @@ diff --git a/externals/figlet/fonts/smslant.flf b/externals/figlet/fonts/smslant.flf new file mode 100644 index 0000000000..24284b8465 --- /dev/null +++ b/externals/figlet/fonts/smslant.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 14 15 10 0 22415 96 +SmSlant by Glenn Chappell 6/93 - based on Small & Slant +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $@ + $ @ + $ @ + $ @ +$ @@ + __@ + / /@ + /_/ @ +(_) @ + @@ + _ _ @ +( | )@ +|/|/ @ +$ @ + @@ + ____ @ + __/ / /_@ + /_ . __/@ +/_ __/ @ + /_/_/ @@ + @ + _//@ + (_-<@ +/ __/@ +// @@ + _ __@ +(_)_/_/@ + _/_/_ @ +/_/ (_)@ + @@ + ____ @ + / __/___@ + > _/_ _/@ +|_____/ @ + @@ + _ @ +( )@ +|/ @ +$ @ + @@ + __@ + _/_/@ + / / @ +/ / @ +|_| @@ + _ @ + | |@ + / /@ + _/_/ @ +/_/ @@ + @ + _/|@ +> _<@ +|/ @ + @@ + __ @ + __/ /_@ +/_ __/@ + /_/ @ + @@ + @ + @ + _ @ +( )@ +|/ @@ + @ + ____@ +/___/@ + $ @ + @@ + @ + @ + _ @ +(_)@ + @@ + __@ + _/_/@ + _/_/ @ +/_/ @ + @@ + ___ @ + / _ \@ +/ // /@ +\___/ @ + @@ + ___@ + < /@ + / / @ +/_/ @ + @@ + ___ @ + |_ |@ + / __/ @ +/____/ @ + @@ + ____@ + |_ /@ + _/_ < @ +/____/ @ + @@ + ____@ + / / /@ +/_ _/@ + /_/ @ + @@ + ____@ + / __/@ + /__ \ @ +/____/ @ + @@ + ____@ + / __/@ +/ _ \ @ +\___/ @ + @@ + ____@ +/_ /@ + / / @ +/_/ @ + @@ + ___ @ + ( _ )@ +/ _ |@ +\___/ @ + @@ + ___ @ + / _ \@ + \_, /@ +/___/ @ + @@ + _ @ + (_)@ + _ @ +(_) @ + @@ + _ @ + (_)@ + _ @ +( ) @ +|/ @@ + __@ + / /@ +< < @ + \_\@ + @@ + @ + ____@ + /___/@ +/___/ @ + @@ +__ @ +\ \ @ + > >@ +/_/ @ + @@ + ___ @ +/__ \@ + /__/@ +(_) @ + @@ + _____ @ + / ___ \@ +/ / _ `/@ +\ \_,_/ @ + \___/ @@ + ___ @ + / _ |@ + / __ |@ +/_/ |_|@ + @@ + ___ @ + / _ )@ + / _ |@ +/____/ @ + @@ + _____@ + / ___/@ +/ /__ @ +\___/ @ + @@ + ___ @ + / _ \@ + / // /@ +/____/ @ + @@ + ____@ + / __/@ + / _/ @ +/___/ @ + @@ + ____@ + / __/@ + / _/ @ +/_/ @ + @@ + _____@ + / ___/@ +/ (_ / @ +\___/ @ + @@ + __ __@ + / // /@ + / _ / @ +/_//_/ @ + @@ + ____@ + / _/@ + _/ / @ +/___/ @ + @@ + __@ + __ / /@ +/ // / @ +\___/ @ + @@ + __ __@ + / //_/@ + / ,< @ +/_/|_| @ + @@ + __ @ + / / @ + / /__@ +/____/@ + @@ + __ ___@ + / |/ /@ + / /|_/ / @ +/_/ /_/ @ + @@ + _ __@ + / |/ /@ + / / @ +/_/|_/ @ + @@ + ____ @ + / __ \@ +/ /_/ /@ +\____/ @ + @@ + ___ @ + / _ \@ + / ___/@ +/_/ @ + @@ + ____ @ + / __ \@ +/ /_/ /@ +\___\_\@ + @@ + ___ @ + / _ \@ + / , _/@ +/_/|_| @ + @@ + ____@ + / __/@ + _\ \ @ +/___/ @ + @@ + ______@ +/_ __/@ + / / @ +/_/ @ + @@ + __ __@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + _ __@ + | | / /@ + | |/ / @ + |___/ @ + @@ + _ __@ + | | /| / /@ + | |/ |/ / @ + |__/|__/ @ + @@ + _ __@ + | |/_/@ + _> < @ +/_/|_| @ + @@ + __ __@ + \ \/ /@ + \ / @ + /_/ @ + @@ + ____@ + /_ /@ + / /_@ + /___/@ + @@ + ___@ + / _/@ + / / @ + / / @ +/__/ @@ +__ @ +\ \ @ + \ \ @ + \_\@ + @@ + ___@ + / /@ + / / @ + _/ / @ +/__/ @@ + //|@ +|/||@ + $ @ +$ @ + @@ + @ + @ + @ + ____@ +/___/@@ + _ @ +( )@ + V @ +$ @ + @@ + @ + ___ _@ +/ _ `/@ +\_,_/ @ + @@ + __ @ + / / @ + / _ \@ +/_.__/@ + @@ + @ + ____@ +/ __/@ +\__/ @ + @@ + __@ + ___/ /@ +/ _ / @ +\_,_/ @ + @@ + @ + ___ @ +/ -_)@ +\__/ @ + @@ + ___@ + / _/@ + / _/ @ +/_/ @ + @@ + @ + ___ _@ + / _ `/@ + \_, / @ +/___/ @@ + __ @ + / / @ + / _ \@ +/_//_/@ + @@ + _ @ + (_)@ + / / @ +/_/ @ + @@ + _ @ + (_)@ + / / @ + __/ / @ +|___/ @@ + __ @ + / /__@ + / '_/@ +/_/\_\ @ + @@ + __@ + / /@ + / / @ +/_/ @ + @@ + @ + __ _ @ + / ' \@ +/_/_/_/@ + @@ + @ + ___ @ + / _ \@ +/_//_/@ + @@ + @ + ___ @ +/ _ \@ +\___/@ + @@ + @ + ___ @ + / _ \@ + / .__/@ +/_/ @@ + @ + ___ _@ +/ _ `/@ +\_, / @ + /_/ @@ + @ + ____@ + / __/@ +/_/ @ + @@ + @ + ___@ + (_-<@ +/___/@ + @@ + __ @ + / /_@ +/ __/@ +\__/ @ + @@ + @ + __ __@ +/ // /@ +\_,_/ @ + @@ + @ + _ __@ +| |/ /@ +|___/ @ + @@ + @ + _ __@ +| |/|/ /@ +|__,__/ @ + @@ + @ + __ __@ + \ \ /@ +/_\_\ @ + @@ + @ + __ __@ + / // /@ + \_, / @ +/___/ @@ + @ + ___@ +/_ /@ +/__/@ + @@ + __@ + _/_/@ +_/ / @ +/ / @ +\_\ @@ + __@ + / /@ + / / @ + / / @ +/_/ @@ + __ @ + \ \ @ + / /_@ + _/_/ @ +/_/ @@ + /\//@ +//\/ @ + $ @ +$ @ + @@ + _ _ @ + (_)(_)@ + / - | @ +/_/|_| @ + @@ + _ _ @ + (_)_(_)@ +/ __ \ @ +\____/ @ + @@ + _ _ @ + (_) (_)@ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_)(_)@ +/ _ `/ @ +\_,_/ @ + @@ + _ _ @ + (_)(_)@ +/ _ \ @ +\___/ @ + @@ + _ _ @ + (_)(_)@ +/ // / @ +\_,_/ @ + @@ + ____ @ + / _ )@ + / /< < @ + / //__/ @ +/_/ @@ +160 NO-BREAK SPACE + $@ + $ @ + $ @ + $ @ +$ @@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + / / @ +/_/ @ + @@ +162 CENT SIGN + @ + __//@ +/ __/@ +\ _/ @ +// @@ +163 POUND SIGN + __ @ + __/__|@ + /_ _/_ @ +(_,___/ @ + @@ +164 CURRENCY SIGN + /|_/|@ + | . / @ + /_ | @ +|/ |/ @ + @@ +165 YEN SIGN + ____@ + _| / /@ + /_ __/@ +/_ __/ @ + /_/ @@ +166 BROKEN BAR + __@ + / /@ + /_/ @ + / / @ +/_/ @@ +167 SECTION SIGN + __ @ + _/ _)@ + / | | @ + | |_/ @ +(__/ @@ +168 DIAERESIS + _ _ @ +(_) (_)@ + $ $ @ +$ $ @ + @@ +169 COPYRIGHT SIGN + ____ @ + / ___\ @ + / / _/ |@ +| |__/ / @ + \____/ @@ +170 FEMININE ORDINAL INDICATOR + ___ _@ + / _ `/@ + _\_,_/ @ +/____/ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ +< < < @ + \_\_\@ + @@ +172 NOT SIGN + @ + ____@ +/_ /@ + /_/ @ + @@ +173 SOFT HYPHEN + @ + ___@ +/__/@ + $ @ + @@ +174 REGISTERED SIGN + ____ @ + / __ \ @ + / / -) |@ +| //\\ / @ + \____/ @@ +175 MACRON + ____@ +/___/@ + $ @ +$ @ + @@ +176 DEGREE SIGN + __ @ + /. |@ +|__/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + __ @ + __/ /_@ + /_ __/@ + __/_/_ @ +/_____/ @@ +178 SUPERSCRIPT TWO + __ @ + |_ )@ +/__| @ + $ @ + @@ +179 SUPERSCRIPT THREE + ___@ + |_ /@ +/__) @ + $ @ + @@ +180 ACUTE ACCENT + __@ +/_/@ + $ @ +$ @ + @@ +181 MICRO SIGN + @ + __ __@ + / // /@ + / .,_/ @ +/_/ @@ +182 PILCROW SIGN + _____@ + / /@ +|_ / / @ +/_/_/ @ + @@ +183 MIDDLE DOT + @ + _ @ +(_)@ +$ @ + @@ +184 CEDILLA + @ + @ + @ + _ @ +/_)@@ +185 SUPERSCRIPT ONE + __@ + < /@ +/_/ @ +$ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + _\___/@ +/____/ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +____ @ +\ \ \ @ + > > >@ +/_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + __ __ @ + < /_/_/___@ +/_//_//_' /@ + /_/ /_/ @ + @@ +189 VULGAR FRACTION ONE HALF + __ __ @ + < /_/_/_ @ +/_//_/|_ )@ + /_/ /__| @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ __ @ + |_ /_/_/___@ +/__)/_//_' /@ + /_/ /_/ @ + @@ +191 INVERTED QUESTION MARK + _ @ + _(_)@ +/ _/_@ +\___/@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + _\_\@ + / - |@ +/_/|_|@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __@ + _/_/@ + / - |@ +/_/|_|@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //|@ + _|/||@ + / - | @ +/_/|_| @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\//@ + _//\/ @ + / - | @ +/_/|_| @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / - | @ +/_/|_| @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + (())@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +198 LATIN CAPITAL LETTER AE + _______@ + / _ __/@ + / _ _/ @ +/_//___/ @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + _____@ + / ___/@ +/ /__ @ +\___/ @ +/_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + \_\@ + / -<@ +/__< @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + _/_/@ + / -< @ +/__< @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //|@ + |/||@ + / -< @ +/__< @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / -< @ +/__< @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + _\_\ @ + /_ __/@ +/____/ @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __@ + __/_/@ + /_ __/@ +/____/ @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //|@ + _|/||@ + /_ __/@ +/____/ @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)(_)@ + /_ __/ @ +/____/ @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + _/ __ \@ +/_ _// /@ +/_____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\//@ + __//\/ @ + / |/ / @ +/_/|__/ @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + _\_\ @ +/ __ \@ +\____/@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __@ + __/_/@ +/ __ \@ +\____/@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ +/ __ \@ +\____/@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\//@ + _//\/ @ +/ __ \ @ +\____/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ +/ __ \ @ +\____/ @ + @@ +215 MULTIPLICATION SIGN + @ + /|/|@ + > < @ +|/|/ @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _____ @ + / _// \@ +/ //// /@ +\_//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + __\_\ @ +/ /_/ /@ +\____/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __@ + __ /_/@ +/ /_/ /@ +\____/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //|@ + __|/||@ +/ /_/ /@ +\____/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ +/ /_/ / @ +\____/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __@ +__/_/@ +\ V /@ + /_/ @ + @@ +222 LATIN CAPITAL LETTER THORN + __ @ + / / @ + / -_)@ +/_/ @ + @@ +223 LATIN SMALL LETTER SHARP S + ____ @ + / _ )@ + / /< < @ + / //__/ @ +/_/ @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + _\_\_@ +/ _ `/@ +\_,_/ @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __@ + __/_/@ +/ _ `/@ +\_,_/ @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //|@ + _|/||@ +/ _ `/@ +\_,_/ @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\//@ + _//\/ @ +/ _ `/ @ +\_,_/ @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ +/ _ `/ @ +\_,_/ @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + _(())@ +/ _ `/@ +\_,_/ @ + @@ +230 LATIN SMALL LETTER AE + @ + ___ ___ @ +/ _ ` -_)@ +\_,____/ @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + ____@ +/ __/@ +\__/ @ +/_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + _\_\@ +/ -_)@ +\__/ @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __@ + _/_/@ +/ -_)@ +\__/ @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //|@ + |/||@ +/ -_)@ +\__/ @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ +(_)(_)@ +/ -_) @ +\__/ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + / / @ +/_/ @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + / / @ +/_/ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //|@ + |/||@ + / / @ +/_/ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ +(_)_(_)@ + / / @ +/_/ @ + @@ +240 LATIN SMALL LETTER ETH + _||_@ + __ || @ +/ _` | @ +\___/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\//@ + _//\/ @ + / _ \ @ +/_//_/ @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + _\_\@ +/ _ \@ +\___/@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __@ + _/_/@ +/ _ \@ +\___/@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ +/ _ \ @ +\___/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\//@ + _//\/ @ +/ _ \ @ +\___/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)(_)@ +/ _ \ @ +\___/ @ + @@ +247 DIVISION SIGN + _ @ + _(_)@ +/___/@ +(_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + ___ @ +/ //\@ +\//_/@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + __\_\@ +/ // /@ +\_,_/ @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __@ + __/_/@ +/ // /@ +\_,_/ @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //|@ + _|/||@ +/ // /@ +\_,_/ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_)(_)@ +/ // / @ +\_,_/ @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __@ + __/_/@ + / // /@ + \_, / @ +/___/ @@ +254 LATIN SMALL LETTER THORN + __ @ + / / @ + / _ \@ + / .__/@ +/_/ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_)(_)@ + / // / @ + \_, / @ +/___/ @@ diff --git a/externals/figlet/fonts/standard.flf b/externals/figlet/fonts/standard.flf new file mode 100644 index 0000000000..bb15241b0a --- /dev/null +++ b/externals/figlet/fonts/standard.flf @@ -0,0 +1,2238 @@ +flf2a$ 6 5 16 15 15 0 24463 229 +Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Modified for figlet 2.2 by John Cowan + to add Latin-{2,3,4,5} support (Unicode U+0100-017F). +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +--- + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +Modified 2012-05 by Patrick Gillespie (patorjk@gmail.com) to add the 0xCA0 character. + $@ + $@ + $@ + $@ + $@ + $@@ + _ @ + | |@ + | |@ + |_|@ + (_)@ + @@ + _ _ @ + ( | )@ + V V @ + $ @ + $ @ + @@ + _ _ @ + _| || |_ @ + |_ .. _|@ + |_ _|@ + |_||_| @ + @@ + _ @ + | | @ + / __)@ + \__ \@ + ( /@ + |_| @@ + _ __@ + (_)/ /@ + / / @ + / /_ @ + /_/(_)@ + @@ + ___ @ + ( _ ) @ + / _ \/\@ + | (_> <@ + \___/\/@ + @@ + _ @ + ( )@ + |/ @ + $ @ + $ @ + @@ + __@ + / /@ + | | @ + | | @ + | | @ + \_\@@ + __ @ + \ \ @ + | |@ + | |@ + | |@ + /_/ @@ + @ + __/\__@ + \ /@ + /_ _\@ + \/ @ + @@ + @ + _ @ + _| |_ @ + |_ _|@ + |_| @ + @@ + @ + @ + @ + _ @ + ( )@ + |/ @@ + @ + @ + _____ @ + |_____|@ + $ @ + @@ + @ + @ + @ + _ @ + (_)@ + @@ + __@ + / /@ + / / @ + / / @ + /_/ @ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + _ @ + / |@ + | |@ + | |@ + |_|@ + @@ + ____ @ + |___ \ @ + __) |@ + / __/ @ + |_____|@ + @@ + _____ @ + |___ / @ + |_ \ @ + ___) |@ + |____/ @ + @@ + _ _ @ + | || | @ + | || |_ @ + |__ _|@ + |_| @ + @@ + ____ @ + | ___| @ + |___ \ @ + ___) |@ + |____/ @ + @@ + __ @ + / /_ @ + | '_ \ @ + | (_) |@ + \___/ @ + @@ + _____ @ + |___ |@ + / / @ + / / @ + /_/ @ + @@ + ___ @ + ( _ ) @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + ___ @ + / _ \ @ + | (_) |@ + \__, |@ + /_/ @ + @@ + @ + _ @ + (_)@ + _ @ + (_)@ + @@ + @ + _ @ + (_)@ + _ @ + ( )@ + |/ @@ + __@ + / /@ + / / @ + \ \ @ + \_\@ + @@ + @ + _____ @ + |_____|@ + |_____|@ + $ @ + @@ + __ @ + \ \ @ + \ \@ + / /@ + /_/ @ + @@ + ___ @ + |__ \@ + / /@ + |_| @ + (_) @ + @@ + ____ @ + / __ \ @ + / / _` |@ + | | (_| |@ + \ \__,_|@ + \____/ @@ + _ @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @@ + ____ @ + | __ ) @ + | _ \ @ + | |_) |@ + |____/ @ + @@ + ____ @ + / ___|@ + | | @ + | |___ @ + \____|@ + @@ + ____ @ + | _ \ @ + | | | |@ + | |_| |@ + |____/ @ + @@ + _____ @ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @@ + _____ @ + | ___|@ + | |_ @ + | _| @ + |_| @ + @@ + ____ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ + _ _ @ + | | | |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ + ___ @ + |_ _|@ + | | @ + | | @ + |___|@ + @@ + _ @ + | |@ + _ | |@ + | |_| |@ + \___/ @ + @@ + _ __@ + | |/ /@ + | ' / @ + | . \ @ + |_|\_\@ + @@ + _ @ + | | @ + | | @ + | |___ @ + |_____|@ + @@ + __ __ @ + | \/ |@ + | |\/| |@ + | | | |@ + |_| |_|@ + @@ + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + ____ @ + | _ \ @ + | |_) |@ + | __/ @ + |_| @ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \__\_\@ + @@ + ____ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ + ____ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + @@ + _ _ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @@ + __ __@ + \ \ / /@ + \ \ / / @ + \ V / @ + \_/ @ + @@ + __ __@ + \ \ / /@ + \ \ /\ / / @ + \ V V / @ + \_/\_/ @ + @@ + __ __@ + \ \/ /@ + \ / @ + / \ @ + /_/\_\@ + @@ + __ __@ + \ \ / /@ + \ V / @ + | | @ + |_| @ + @@ + _____@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ + __ @ + | _|@ + | | @ + | | @ + | | @ + |__|@@ + __ @ + \ \ @ + \ \ @ + \ \ @ + \_\@ + @@ + __ @ + |_ |@ + | |@ + | |@ + | |@ + |__|@@ + /\ @ + |/\|@ + $ @ + $ @ + $ @ + @@ + @ + @ + @ + @ + _____ @ + |_____|@@ + _ @ + ( )@ + \|@ + $ @ + $ @ + @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ + _ @ + | |__ @ + | '_ \ @ + | |_) |@ + |_.__/ @ + @@ + @ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ + _ @ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ + @ + ___ @ + / _ \@ + | __/@ + \___|@ + @@ + __ @ + / _|@ + | |_ @ + | _|@ + |_| @ + @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ + _ @ + | |__ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ + _ @ + (_)@ + | |@ + | |@ + |_|@ + @@ + _ @ + (_)@ + | |@ + | |@ + _/ |@ + |__/ @@ + _ @ + | | __@ + | |/ /@ + | < @ + |_|\_\@ + @@ + _ @ + | |@ + | |@ + | |@ + |_|@ + @@ + @ + _ __ ___ @ + | '_ ` _ \ @ + | | | | | |@ + |_| |_| |_|@ + @@ + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ + @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + @ + _ __ @ + | '_ \ @ + | |_) |@ + | .__/ @ + |_| @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |_|@@ + @ + _ __ @ + | '__|@ + | | @ + |_| @ + @@ + @ + ___ @ + / __|@ + \__ \@ + |___/@ + @@ + _ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + @@ + @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ + @ + __ __@ + \ \ / /@ + \ V / @ + \_/ @ + @@ + @ + __ __@ + \ \ /\ / /@ + \ V V / @ + \_/\_/ @ + @@ + @ + __ __@ + \ \/ /@ + > < @ + /_/\_\@ + @@ + @ + _ _ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ + @ + ____@ + |_ /@ + / / @ + /___|@ + @@ + __@ + / /@ + | | @ + < < @ + | | @ + \_\@@ + _ @ + | |@ + | |@ + | |@ + | |@ + |_|@@ + __ @ + \ \ @ + | | @ + > >@ + | | @ + /_/ @@ + /\/|@ + |/\/ @ + $ @ + $ @ + $ @ + @@ + _ _ @ + (_)_(_)@ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_)_(_)@ + / _` |@ + | (_| |@ + \__,_|@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + | (_) |@ + \___/ @ + @@ + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__,_|@ + @@ + ___ @ + / _ \@ + | |/ /@ + | |\ \@ + | ||_/@ + |_| @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + | |@ + | |@ + |_|@ + @@ +162 CENT SIGN + _ @ + | | @ + / __)@ + | (__ @ + \ )@ + |_| @@ +163 POUND SIGN + ___ @ + / ,_\ @ + _| |_ @ + | |___ @ + (_,____|@ + @@ +164 CURRENCY SIGN + /\___/\@ + \ _ /@ + | (_) |@ + / ___ \@ + \/ \/@ + @@ +165 YEN SIGN + __ __ @ + \ V / @ + |__ __|@ + |__ __|@ + |_| @ + @@ +166 BROKEN BAR + _ @ + | |@ + |_|@ + _ @ + | |@ + |_|@@ +167 SECTION SIGN + __ @ + _/ _)@ + / \ \ @ + \ \\ \@ + \ \_/@ + (__/ @@ +168 DIAERESIS + _ _ @ + (_) (_)@ + $ $ @ + $ $ @ + $ $ @ + @@ +169 COPYRIGHT SIGN + _____ @ + / ___ \ @ + / / __| \ @ + | | (__ |@ + \ \___| / @ + \_____/ @@ +170 FEMININE ORDINAL INDICATOR + __ _ @ + / _` |@ + \__,_|@ + |____|@ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ + / / / @ + \ \ \ @ + \_\_\@ + @@ +172 NOT SIGN + @ + _____ @ + |___ |@ + |_|@ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + ____ @ + |____|@ + $ @ + @@ +174 REGISTERED SIGN + _____ @ + / ___ \ @ + / | _ \ \ @ + | | / |@ + \ |_|_\ / @ + \_____/ @@ +175 MACRON + _____ @ + |_____|@ + $ @ + $ @ + $ @ + @@ +176 DEGREE SIGN + __ @ + / \ @ + | () |@ + \__/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + _ @ + _| |_ @ + |_ _|@ + _|_|_ @ + |_____|@ + @@ +178 SUPERSCRIPT TWO + ___ @ + |_ )@ + / / @ + /___|@ + $ @ + @@ +179 SUPERSCRIPT THREE + ____@ + |__ /@ + |_ \@ + |___/@ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ + $ @ + @@ +181 MICRO SIGN + @ + _ _ @ + | | | |@ + | |_| |@ + | ._,_|@ + |_| @@ +182 PILCROW SIGN + _____ @ + / |@ + | (| | |@ + \__ | |@ + |_|_|@ + @@ +183 MIDDLE DOT + @ + _ @ + (_)@ + $ @ + $ @ + @@ +184 CEDILLA + @ + @ + @ + @ + _ @ + )_)@@ +185 SUPERSCRIPT ONE + _ @ + / |@ + | |@ + |_|@ + $ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + \___/@ + |___|@ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + ____ @ + \ \ \ @ + \ \ \@ + / / /@ + /_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ __ @ + / | / / _ @ + | |/ / | | @ + |_/ /|_ _|@ + /_/ |_| @ + @@ +189 VULGAR FRACTION ONE HALF + _ __ @ + / | / /__ @ + | |/ /_ )@ + |_/ / / / @ + /_/ /___|@ + @@ +190 VULGAR FRACTION THREE QUARTERS + ____ __ @ + |__ / / / _ @ + |_ \/ / | | @ + |___/ /|_ _|@ + /_/ |_| @ + @@ +191 INVERTED QUESTION MARK + _ @ + (_) @ + | | @ + / /_ @ + \___|@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + \_\ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __ @ + /_/ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //\ @ + |/_\| @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/| @ + |/\/ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + (o) @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +198 LATIN CAPITAL LETTER AE + ______ @ + / ____|@ + / _ _| @ + / __ |___ @ + /_/ |_____|@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ____ @ + / ___|@ + | | @ + | |___ @ + \____|@ + )_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + _\_\_ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __ @ + _/_/_ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\| @ + | ____|@ + | _|_ @ + |_____|@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + | ____|@ + | _|_ @ + |_____|@ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + \_\ @ + |_ _|@ + | | @ + |___|@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __ @ + /_/ @ + |_ _|@ + | | @ + |___|@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + |_ _|@ + | | @ + |___|@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + |_ _| @ + | | @ + |___| @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + | _ \ @ + _| |_| |@ + |__ __| |@ + |____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/|@ + |/\/ @ + | \| |@ + | .` |@ + |_|\_|@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/| @ + |/\/ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +215 MULTIPLICATION SIGN + @ + @ + /\/\@ + > <@ + \/\/@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + ____ @ + / _// @ + | |// |@ + | //| |@ + //__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | | | |@ + | |_| |@ + \___/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \___/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ + __/_/__@ + \ \ / /@ + \ V / @ + |_| @ + @@ +222 LATIN CAPITAL LETTER THORN + _ @ + | |___ @ + | __ \@ + | ___/@ + |_| @ + @@ +223 LATIN SMALL LETTER SHARP S + ___ @ + / _ \@ + | |/ /@ + | |\ \@ + | ||_/@ + |_| @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + \_\_ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + /_/_ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/| @ + |/\/_ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + (()) @ + / _ '|@ + | (_| |@ + \__,_|@ + @@ +230 LATIN SMALL LETTER AE + @ + __ ____ @ + / _` _ \@ + | (_| __/@ + \__,____|@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + ___ @ + / __|@ + | (__ @ + \___|@ + )_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + \_\ @ + / _ \@ + | __/@ + \___|@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __ @ + /_/ @ + / _ \@ + | __/@ + \___|@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\|@ + / _ \@ + | __/@ + \___|@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | __/ @ + \___| @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + | |@ + | |@ + |_|@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + | |@ + | |@ + |_|@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + | | @ + | | @ + |_| @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + | | @ + | | @ + |_| @ + @@ +240 LATIN SMALL LETTER ETH + /\/\ @ + > < @ + _\/\ |@ + / __` |@ + \____/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/| @ + |/\/ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/| @ + |/\/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | (_) |@ + \___/ @ + @@ +247 DIVISION SIGN + @ + _ @ + _(_)_ @ + |_____|@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + ____ @ + / _//\ @ + | (//) |@ + \//__/ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ +254 LATIN SMALL LETTER THORN + _ @ + | |__ @ + | '_ \ @ + | |_) |@ + | .__/ @ + |_| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON + ____ @ + /___/ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +0x0101 LATIN SMALL LETTER A WITH MACRON + ___ @ + /_ _/@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE + _ _ @ + \\_// @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +0x0103 LATIN SMALL LETTER A WITH BREVE + \_/ @ + ___ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK + @ + _ @ + /_\ @ + / _ \ @ + /_/ \_\@ + (_(@@ +0x0105 LATIN SMALL LETTER A WITH OGONEK + @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + (_(@@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE + __ @ + _/_/ @ + / ___|@ + | |___ @ + \____|@ + @@ +0x0107 LATIN SMALL LETTER C WITH ACUTE + __ @ + /__/@ + / __|@ + | (__ @ + \___|@ + @@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX + /\ @ + _//\\@ + / ___|@ + | |___ @ + \____|@ + @@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX + /\ @ + /_\ @ + / __|@ + | (__ @ + \___|@ + @@ +0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE + [] @ + ____ @ + / ___|@ + | |___ @ + \____|@ + @@ +0x010B LATIN SMALL LETTER C WITH DOT ABOVE + [] @ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ +0x010C LATIN CAPITAL LETTER C WITH CARON + \\// @ + _\/_ @ + / ___|@ + | |___ @ + \____|@ + @@ +0x010D LATIN SMALL LETTER C WITH CARON + \\//@ + _\/ @ + / __|@ + | (__ @ + \___|@ + @@ +0x010E LATIN CAPITAL LETTER D WITH CARON + \\// @ + __\/ @ + | _ \ @ + | |_| |@ + |____/ @ + @@ +0x010F LATIN SMALL LETTER D WITH CARON + \/ _ @ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE + ____ @ + |_ __ \ @ + /| |/ | |@ + /|_|/_| |@ + |_____/ @ + @@ +0x0111 LATIN SMALL LETTER D WITH STROKE + ---|@ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON + ____ @ + /___/ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x0113 LATIN SMALL LETTER E WITH MACRON + ____@ + /_ _/@ + / _ \ @ + | __/ @ + \___| @ + @@ +0x0114 LATIN CAPITAL LETTER E WITH BREVE + _ _ @ + \\_// @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x0115 LATIN SMALL LETTER E WITH BREVE + \\ //@ + -- @ + / _ \ @ + | __/ @ + \___| @ + @@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE + [] @ + _____ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE + [] @ + __ @ + / _ \@ + | __/@ + \___|@ + @@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK + @ + _____ @ + | ____|@ + | _|_ @ + |_____|@ + (__(@@ +0x0119 LATIN SMALL LETTER E WITH OGONEK + @ + ___ @ + / _ \@ + | __/@ + \___|@ + (_(@@ +0x011A LATIN CAPITAL LETTER E WITH CARON + \\// @ + __\/_ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x011B LATIN SMALL LETTER E WITH CARON + \\//@ + \/ @ + / _ \@ + | __/@ + \___|@ + @@ +0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX + _/\_ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ +0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX + /\ @ + _/_ \@ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ +0x011E LATIN CAPITAL LETTER G WITH BREVE + _\/_ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ +0x011F LATIN SMALL LETTER G WITH BREVE + \___/ @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE + _[]_ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE + [] @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA + ____ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + )__) @@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |_))))@@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX + _/ \_ @ + | / \ |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX + _ /\ @ + | |//\ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE + _ _ @ + | |=| |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ +0x0127 LATIN SMALL LETTER H WITH STROKE + _ @ + |=|__ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE + /\//@ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x0129 LATIN SMALL LETTER I WITH TILDE + @ + /\/@ + | |@ + | |@ + |_|@ + @@ +0x012A LATIN CAPITAL LETTER I WITH MACRON + /___/@ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x012B LATIN SMALL LETTER I WITH MACRON + ____@ + /___/@ + | | @ + | | @ + |_| @ + @@ +0x012C LATIN CAPITAL LETTER I WITH BREVE + \__/@ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x012D LATIN SMALL LETTER I WITH BREVE + @ + \_/@ + | |@ + | |@ + |_|@ + @@ +0x012E LATIN CAPITAL LETTER I WITH OGONEK + ___ @ + |_ _|@ + | | @ + | | @ + |___|@ + (__(@@ +0x012F LATIN SMALL LETTER I WITH OGONEK + _ @ + (_) @ + | | @ + | | @ + |_|_@ + (_(@@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE + _[] @ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x0131 LATIN SMALL LETTER DOTLESS I + @ + _ @ + | |@ + | |@ + |_|@ + @@ +0x0132 LATIN CAPITAL LIGATURE IJ + ___ _ @ + |_ _|| |@ + | | | |@ + | |_| |@ + |__|__/ @ + @@ +0x0133 LATIN SMALL LIGATURE IJ + _ _ @ + (_) (_)@ + | | | |@ + | | | |@ + |_|_/ |@ + |__/ @@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX + /\ @ + /_\|@ + _ | | @ + | |_| | @ + \___/ @ + @@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX + /\@ + /_\@ + | |@ + | |@ + _/ |@ + |__/ @@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA + _ _ @ + | |/ / @ + | ' / @ + | . \ @ + |_|\_\ @ + )__)@@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA + _ @ + | | __@ + | |/ /@ + | < @ + |_|\_\@ + )_)@@ +0x0138 LATIN SMALL LETTER KRA + @ + _ __ @ + | |/ \@ + | < @ + |_|\_\@ + @@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE + _ //@ + | | // @ + | | @ + | |___ @ + |_____|@ + @@ +0x013A LATIN SMALL LETTER L WITH ACUTE + //@ + | |@ + | |@ + | |@ + |_|@ + @@ +0x013B LATIN CAPITAL LETTER L WITH CEDILLA + _ @ + | | @ + | | @ + | |___ @ + |_____|@ + )__)@@ +0x013C LATIN SMALL LETTER L WITH CEDILLA + _ @ + | | @ + | | @ + | | @ + |_| @ + )_)@@ +0x013D LATIN CAPITAL LETTER L WITH CARON + _ \\//@ + | | \/ @ + | | @ + | |___ @ + |_____|@ + @@ +0x013E LATIN SMALL LETTER L WITH CARON + _ \\//@ + | | \/ @ + | | @ + | | @ + |_| @ + @@ +0x013F LATIN CAPITAL LETTER L WITH MIDDLE DOT + _ @ + | | @ + | | [] @ + | |___ @ + |_____|@ + @@ +0x0140 LATIN SMALL LETTER L WITH MIDDLE DOT + _ @ + | | @ + | | []@ + | | @ + |_| @ + @@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE + __ @ + | // @ + |//| @ + // |__ @ + |_____|@ + @@ +0x0142 LATIN SMALL LETTER L WITH STROKE + _ @ + | |@ + |//@ + //|@ + |_|@ + @@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE + _/ /_ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ +0x0144 LATIN SMALL LETTER N WITH ACUTE + _ @ + _ /_/ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + )_) @@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + )_) @@ +0x0147 LATIN CAPITAL LETTER N WITH CARON + _\/ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ +0x0148 LATIN SMALL LETTER N WITH CARON + \\// @ + _\/_ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + @ + _ __ @ + ( )| '_\ @ + |/| | | |@ + |_| |_|@ + @@ +0x014A LATIN CAPITAL LETTER ENG + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \ |@ + )_)@@ +0x014B LATIN SMALL LETTER ENG + _ __ @ + | '_ \ @ + | | | |@ + |_| | |@ + | |@ + |__ @@ +0x014C LATIN CAPITAL LETTER O WITH MACRON + ____ @ + /_ _/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +0x014D LATIN SMALL LETTER O WITH MACRON + ____ @ + /_ _/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +0x014E LATIN CAPITAL LETTER O WITH BREVE + \ / @ + _-_ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x014F LATIN SMALL LETTER O WITH BREVE + \ / @ + _-_ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + ___ @ + /_/_/@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE + ___ @ + /_/_/@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x0152 LATIN CAPITAL LIGATURE OE + ___ ___ @ + / _ \| __|@ + | | | | | @ + | |_| | |__@ + \___/|____@ + @@ +0x0153 LATIN SMALL LIGATURE OE + @ + ___ ___ @ + / _ \ / _ \@ + | (_) | __/@ + \___/ \___|@ + @@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE + _/_/ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ +0x0155 LATIN SMALL LETTER R WITH ACUTE + __@ + _ /_/@ + | '__|@ + | | @ + |_| @ + @@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA + ____ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + )_) @@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA + @ + _ __ @ + | '__|@ + | | @ + |_| @ + )_) @@ +0x0158 LATIN CAPITAL LETTER R WITH CARON + _\_/ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ +0x0159 LATIN SMALL LETTER R WITH CARON + \\// @ + _\/_ @ + | '__|@ + | | @ + |_| @ + @@ +0x015A LATIN CAPITAL LETTER S WITH ACUTE + _/_/ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ +0x015B LATIN SMALL LETTER S WITH ACUTE + __@ + _/_/@ + / __|@ + \__ \@ + |___/@ + @@ +0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX + _/\_ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ +0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX + @ + /_\_@ + / __|@ + \__ \@ + |___/@ + @@ +0x015E LATIN CAPITAL LETTER S WITH CEDILLA + ____ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + )__)@@ +0x015F LATIN SMALL LETTER S WITH CEDILLA + @ + ___ @ + / __|@ + \__ \@ + |___/@ + )_)@@ +0x0160 LATIN CAPITAL LETTER S WITH CARON + _\_/ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ +0x0161 LATIN SMALL LETTER S WITH CARON + \\//@ + _\/ @ + / __|@ + \__ \@ + |___/@ + @@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + )__)@@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA + _ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + )_)@@ +0x0164 LATIN CAPITAL LETTER T WITH CARON + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + @@ +0x0165 LATIN SMALL LETTER T WITH CARON + \/ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + @@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE + _____ @ + |_ _|@ + | | @ + -|-|- @ + |_| @ + @@ +0x0167 LATIN SMALL LETTER T WITH STROKE + _ @ + | |_ @ + | __|@ + |-|_ @ + \__|@ + @@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE + @ + _/\/_ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x0169 LATIN SMALL LETTER U WITH TILDE + @ + _/\/_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x016A LATIN CAPITAL LETTER U WITH MACRON + ____ @ + /__ _/@ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x016B LATIN SMALL LETTER U WITH MACRON + ____ @ + / _ /@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x016C LATIN CAPITAL LETTER U WITH BREVE + @ + \_/_ @ + | | | |@ + | |_| |@ + \____|@ + @@ +0x016D LATIN SMALL LETTER U WITH BREVE + @ + \_/_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x016E LATIN CAPITAL LETTER U WITH RING ABOVE + O @ + __ _ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x016F LATIN SMALL LETTER U WITH RING ABOVE + O @ + __ __ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + -- --@ + /_//_/@ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE + ____@ + _/_/_/@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK + _ _ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + (__(@@ +0x0173 LATIN SMALL LETTER U WITH OGONEK + @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + (_(@@ +0x0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX + __ /\ __@ + \ \ //\\/ /@ + \ \ /\ / / @ + \ V V / @ + \_/\_/ @ + @@ +0x0175 LATIN SMALL LETTER W WITH CIRCUMFLEX + /\ @ + __ //\\__@ + \ \ /\ / /@ + \ V V / @ + \_/\_/ @ + @@ +0x0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + /\ @ + __//\\ @ + \ \ / /@ + \ V / @ + |_| @ + @@ +0x0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX + /\ @ + //\\ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ +0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS + [] []@ + __ _@ + \ \ / /@ + \ V / @ + |_| @ + @@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE + __/_/@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ +0x017A LATIN SMALL LETTER Z WITH ACUTE + _ @ + _/_/@ + |_ /@ + / / @ + /___|@ + @@ +0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE + __[]_@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ +0x017C LATIN SMALL LETTER Z WITH DOT ABOVE + [] @ + ____@ + |_ /@ + / / @ + /___|@ + @@ +0x017D LATIN CAPITAL LETTER Z WITH CARON + _\_/_@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ +0x017E LATIN SMALL LETTER Z WITH CARON + \\//@ + _\/_@ + |_ /@ + / / @ + /___|@ + @@ +0x017F LATIN SMALL LETTER LONG S + __ @ + / _|@ + |-| | @ + |-| | @ + |_| @ + @@ +0x02C7 CARON + \\//@ + \/ @ + $@ + $@ + $@ + $@@ +0x02D8 BREVE + \\_//@ + \_/ @ + $@ + $@ + $@ + $@@ +0x02D9 DOT ABOVE + []@ + $@ + $@ + $@ + $@ + $@@ +0x02DB OGONEK + $@ + $@ + $@ + $@ + $@ + )_) @@ +0x02DD DOUBLE ACUTE ACCENT + _ _ @ + /_/_/@ + $@ + $@ + $@ + $@@ +0xCA0 KANNADA LETTER TTHA + _____)@ + /_ ___/@ + / _ \ @ + | (_) | @ + $\___/$ @ + @@ diff --git a/externals/figlet/fonts/term.flf b/externals/figlet/fonts/term.flf new file mode 100644 index 0000000000..e27d01eeec --- /dev/null +++ b/externals/figlet/fonts/term.flf @@ -0,0 +1,600 @@ +flf2a 1 1 2 -1 13 0 0 242 +Terminal by Glenn Chappell 4/93 +Includes characters 128-255 +Enhanced for Latin-2,3,4 by John Cowan +Latin character sets supported only if your screen font does +figlet release 2.2 -- November 1996 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Double-checked by Paul Burton 12/96. Added the new +parameter supported by FIGlet and FIGWin. Unlike all other FIGfonts, this one +is intended to produce output exactly the same as the input unless a control +file is used. Therefore it produces the SAME output for smush, kern or fit. + +@ +!@ +"@ +#@ +$@ +%@ +&@ +'@ +(@ +)@ +*@ ++@ +,@ +-@ +.@ +/@ +0@ +1@ +2@ +3@ +4@ +5@ +6@ +7@ +8@ +9@ +:@ +;@ +<@ +=@ +>@ +?@ +@# +A@ +B@ +C@ +D@ +E@ +F@ +G@ +H@ +I@ +J@ +K@ +L@ +M@ +N@ +O@ +P@ +Q@ +R@ +S@ +T@ +U@ +V@ +W@ +X@ +Y@ +Z@ +[@ +\@ +]@ +^@ +_@ +`@ +a@ +b@ +c@ +d@ +e@ +f@ +g@ +h@ +i@ +j@ +k@ +l@ +m@ +n@ +o@ +p@ +q@ +r@ +s@ +t@ +u@ +v@ +w@ +x@ +y@ +z@ +{@ +|@ +}@ +~@ +�@ +�@ +�@ +�@ +�@ +�@ +�@ +128 +�@ +129 +�@ +130 +�@ +131 +�@ +132 +�@ +133 +�@ +134 +�@ +135 +�@ +136 +�@ +137 +�@ +138 +�@ +139 +�@ +140 +�@ +141 +�@ +142 +�@ +143 +�@ +144 +�@ +145 +�@ +146 +�@ +147 +�@ +148 +�@ +149 +�@ +150 +�@ +151 +�@ +152 +�@ +153 +�@ +154 +�@ +155 +�@ +156 +�@ +157 +�@ +158 +�@ +159 +�@ +160 NO-BREAK SPACE +�@ +161 INVERTED EXCLAMATION MARK +�@ +162 CENT SIGN +�@ +163 POUND SIGN +�@ +164 CURRENCY SIGN +�@ +165 YEN SIGN +�@ +166 BROKEN BAR +�@ +167 SECTION SIGN +�@ +168 DIAERESIS +�@ +169 COPYRIGHT SIGN +�@ +170 FEMININE ORDINAL INDICATOR +�@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +�@ +172 NOT SIGN +�@ +173 SOFT HYPHEN +�@ +174 REGISTERED SIGN +�@ +175 MACRON +�@ +176 DEGREE SIGN +�@ +177 PLUS-MINUS SIGN +�@ +178 SUPERSCRIPT TWO +�@ +179 SUPERSCRIPT THREE +�@ +180 ACUTE ACCENT +�@ +181 MICRO SIGN +�@ +182 PILCROW SIGN +�@ +183 MIDDLE DOT +�@ +184 CEDILLA +�@ +185 SUPERSCRIPT ONE +�@ +186 MASCULINE ORDINAL INDICATOR +�@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +�@ +188 VULGAR FRACTION ONE QUARTER +�@ +189 VULGAR FRACTION ONE HALF +�@ +190 VULGAR FRACTION THREE QUARTERS +�@ +191 INVERTED QUESTION MARK +�@ +192 LATIN CAPITAL LETTER A WITH GRAVE +�@ +193 LATIN CAPITAL LETTER A WITH ACUTE +�@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +�@ +195 LATIN CAPITAL LETTER A WITH TILDE +�@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS +�@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE +�@ +198 LATIN CAPITAL LETTER AE +�@ +199 LATIN CAPITAL LETTER C WITH CEDILLA +�@ +200 LATIN CAPITAL LETTER E WITH GRAVE +�@ +201 LATIN CAPITAL LETTER E WITH ACUTE +�@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX +�@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS +�@ +204 LATIN CAPITAL LETTER I WITH GRAVE +�@ +205 LATIN CAPITAL LETTER I WITH ACUTE +�@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX +�@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS +�@ +208 LATIN CAPITAL LETTER ETH +�@ +209 LATIN CAPITAL LETTER N WITH TILDE +�@ +210 LATIN CAPITAL LETTER O WITH GRAVE +�@ +211 LATIN CAPITAL LETTER O WITH ACUTE +�@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX +�@ +213 LATIN CAPITAL LETTER O WITH TILDE +�@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS +�@ +215 MULTIPLICATION SIGN +�@ +216 LATIN CAPITAL LETTER O WITH STROKE +�@ +217 LATIN CAPITAL LETTER U WITH GRAVE +�@ +218 LATIN CAPITAL LETTER U WITH ACUTE +�@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX +�@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS +�@ +221 LATIN CAPITAL LETTER Y WITH ACUTE +�@ +222 LATIN CAPITAL LETTER THORN +�@ +223 LATIN SMALL LETTER SHARP S +�@ +224 LATIN SMALL LETTER A WITH GRAVE +�@ +225 LATIN SMALL LETTER A WITH ACUTE +�@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX +�@ +227 LATIN SMALL LETTER A WITH TILDE +�@ +228 LATIN SMALL LETTER A WITH DIAERESIS +�@ +229 LATIN SMALL LETTER A WITH RING ABOVE +�@ +230 LATIN SMALL LETTER AE +�@ +231 LATIN SMALL LETTER C WITH CEDILLA +�@ +232 LATIN SMALL LETTER E WITH GRAVE +�@ +233 LATIN SMALL LETTER E WITH ACUTE +�@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX +�@ +235 LATIN SMALL LETTER E WITH DIAERESIS +�@ +236 LATIN SMALL LETTER I WITH GRAVE +�@ +237 LATIN SMALL LETTER I WITH ACUTE +�@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX +�@ +239 LATIN SMALL LETTER I WITH DIAERESIS +�@ +240 LATIN SMALL LETTER ETH +�@ +241 LATIN SMALL LETTER N WITH TILDE +�@ +242 LATIN SMALL LETTER O WITH GRAVE +�@ +243 LATIN SMALL LETTER O WITH ACUTE +�@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX +�@ +245 LATIN SMALL LETTER O WITH TILDE +�@ +246 LATIN SMALL LETTER O WITH DIAERESIS +�@ +247 DIVISION SIGN +�@ +248 LATIN SMALL LETTER O WITH STROKE +�@ +249 LATIN SMALL LETTER U WITH GRAVE +�@ +250 LATIN SMALL LETTER U WITH ACUTE +�@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX +�@ +252 LATIN SMALL LETTER U WITH DIAERESIS +�@ +253 LATIN SMALL LETTER Y WITH ACUTE +�@ +254 LATIN SMALL LETTER THORN +�@ +255 LATIN SMALL LETTER Y WITH DIAERESIS +�@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON +�@ +0x0101 LATIN SMALL LETTER A WITH MACRON +�@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE +�@ +0x0103 LATIN SMALL LETTER A WITH BREVE +�@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK +�@ +0x0105 LATIN SMALL LETTER A WITH OGONEK +�@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE +�@ +0x0107 LATIN SMALL LETTER C WITH ACUTE +�@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX +�@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX +�@ +0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE +�@ +0x010B LATIN SMALL LETTER C WITH DOT ABOVE +�@ +0x010C LATIN CAPITAL LETTER C WITH CARON +�@ +0x010D LATIN SMALL LETTER C WITH CARON +�@ +0x010E LATIN CAPITAL LETTER D WITH CARON +�@ +0x010F LATIN SMALL LETTER D WITH CARON +�@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE +�@ +0x0111 LATIN SMALL LETTER D WITH STROKE +�@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON +�@ +0x0113 LATIN SMALL LETTER E WITH MACRON +�@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE +�@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE +�@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK +�@ +0x0119 LATIN SMALL LETTER E WITH OGONEK +�@ +0x011A LATIN CAPITAL LETTER E WITH CARON +�@ +0x011B LATIN SMALL LETTER E WITH CARON +�@ +0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX +�@ +0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX +�@ +0x011E LATIN CAPITAL LETTER G WITH BREVE +�@ +0x011F LATIN SMALL LETTER G WITH BREVE +�@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE +�@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE +�@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA +�@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA +�@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX +�@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX +�@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE +�@ +0x0127 LATIN SMALL LETTER H WITH STROKE +�@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE +�@ +0x0129 LATIN SMALL LETTER I WITH TILDE +�@ +0x012A LATIN CAPITAL LETTER I WITH MACRON +�@ +0x012B LATIN SMALL LETTER I WITH MACRON +�@ +0x012E LATIN CAPITAL LETTER I WITH OGONEK +�@ +0x012F LATIN SMALL LETTER I WITH OGONEK +�@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE +�@ +0x0131 LATIN SMALL LETTER DOTLESS I +�@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX +�@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX +�@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA +�@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA +�@ +0x0138 LATIN SMALL LETTER KRA +�@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE +�@ +0x013A LATIN SMALL LETTER L WITH ACUTE +�@ +0x013B LATIN CAPITAL LETTER L WITH CEDILLA +�@ +0x013C LATIN SMALL LETTER L WITH CEDILLA +�@ +0x013D LATIN CAPITAL LETTER L WITH CARON +�@ +0x013E LATIN SMALL LETTER L WITH CARON +�@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE +�@ +0x0142 LATIN SMALL LETTER L WITH STROKE +�@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE +�@ +0x0144 LATIN SMALL LETTER N WITH ACUTE +�@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA +�@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA +�@ +0x0147 LATIN CAPITAL LETTER N WITH CARON +�@ +0x0148 LATIN SMALL LETTER N WITH CARON +�@ +0x014A LATIN CAPITAL LETTER ENG +�@ +0x014B LATIN SMALL LETTER ENG +�@ +0x014C LATIN CAPITAL LETTER O WITH MACRON +�@ +0x014D LATIN SMALL LETTER O WITH MACRON +�@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +�@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE +�@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE +�@ +0x0155 LATIN SMALL LETTER R WITH ACUTE +�@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA +�@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA +�@ +0x0158 LATIN CAPITAL LETTER R WITH CARON +�@ +0x0159 LATIN SMALL LETTER R WITH CARON +�@ +0x015A LATIN CAPITAL LETTER S WITH ACUTE +�@ +0x015B LATIN SMALL LETTER S WITH ACUTE +�@ +0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX +�@ +0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX +�@ +0x015E LATIN CAPITAL LETTER S WITH CEDILLA +�@ +0x015F LATIN SMALL LETTER S WITH CEDILLA +�@ +0x0160 LATIN CAPITAL LETTER S WITH CARON +�@ +0x0161 LATIN SMALL LETTER S WITH CARON +�@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA +�@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA +�@ +0x0164 LATIN CAPITAL LETTER T WITH CARON +�@ +0x0165 LATIN SMALL LETTER T WITH CARON +�@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE +�@ +0x0167 LATIN SMALL LETTER T WITH STROKE +�@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE +�@ +0x0169 LATIN SMALL LETTER U WITH TILDE +�@ +0x016A LATIN CAPITAL LETTER U WITH MACRON +�@ +0x016B LATIN SMALL LETTER U WITH MACRON +�@ +0x016C LATIN CAPITAL LETTER U WITH BREVE +�@ +0x016D LATIN SMALL LETTER U WITH BREVE +�@ +0x016E LATIN CAPITAL LETTER U WITH RING ABOVE +�@ +0x016F LATIN SMALL LETTER U WITH RING ABOVE +�@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +�@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE +�@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK +�@ +0x0173 LATIN SMALL LETTER U WITH OGONEK +�@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE +�@ +0x017A LATIN SMALL LETTER Z WITH ACUTE +�@ +0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE +�@ +0x017C LATIN SMALL LETTER Z WITH DOT ABOVE +�@ +0x017D LATIN CAPITAL LETTER Z WITH CARON +�@ +0x017E LATIN SMALL LETTER Z WITH CARON +�@ +0x02C7 CARON +�@ +0x02D8 BREVE +�@ +0x02D9 DOT ABOVE +�@ +0x02DB OGONEK +�@ +0x02DD DOUBLE ACUTE ACCENT +�@ diff --git a/externals/figlet/fonts/upper.flc b/externals/figlet/fonts/upper.flc new file mode 100644 index 0000000000..f383471764 --- /dev/null +++ b/externals/figlet/fonts/upper.flc @@ -0,0 +1,193 @@ +flc2a +# Upper by Glenn Chappell 1/94 +# Converts lower-case to upper-case. +# Modified to support all of Unicode by John Cowan 10/96 +# figlet release 2.2 -- November 1996 +# +# This is a figlet controlfile. +# +# Explanation of first line: +# flc2 - "magic number" for file identification +# a - should always be `a', for now +# +# File body: +# The first character of any line is the "command" for that line. +# Possible figlet 2.1 commands are as follows: +# `#' - comment, continues until end-of-line +# `t' - translate, a not-so-fancy version of the Unix "tr" command +# `f' - freeze, treat further lines as if they were in a new file +# +# The following lines convert lower-case to upper-case. +# +# Standard letters: +t a-z A-Z +# +# figlet Deutsch characters (obsolete in 2.2 and later): +t \-252-\-250 \-255-\-253 +# +# ISO Latin-1 accented letters: +t \224-\246 \192-\214 +t \248-\254 \216-\222 +# Note: Latin-1 has no upper-case Y umlaut, so map to "Y". +# But remove the following line for Unicode fonts. +t \255 Y +# This is the proper Unicode mapping, and does no harm for non-Unicode fonts. +t \255 \0x0178 +# Latin Extended A (Latin-2,3,4,5) accented letters: +t \0x01\0x01 \0x0100 +t \0x0103 \0x0102 +t \0x0105 \0x0104 +t \0x0107 \0x0106 +t \0x0109 \0x0108 +t \0x010B \0x010A +t \0x010D \0x010C +t \0x010F \0x010E +t \0x01\0x01 \0x0100 +t \0x0103 \0x0102 +t \0x0105 \0x0104 +t \0x0117 \0x0116 +t \0x0119 \0x0118 +t \0x011B \0x011A +t \0x011D \0x011C +t \0x011F \0x011E +t \0x01\0x01 \0x0100 +t \0x0103 \0x0102 +t \0x0105 \0x0104 +t \0x0127 \0x0126 +t \0x0129 \0x0128 +t \0x012B \0x012A +t \0x012D \0x012C +t \0x012F \0x012E +t \0x0131 I +t \0x0133 \0x0132 +t \0x0135 \0x0134 +t \0x0137 \0x0136 +t \0x0138 K +t \0x013A \0x0139 +t \0x013C \0x013B +t \0x013E \0x013D +t \0x0140 \0x013F +t \0x0142 \0x0141 +t \0x0144 \0x0143 +t \0x0146 \0x0145 +t \0x0148 \0x0147 +t \0x0149 N +t \0x014B \0x014A +t \0x014D \0x014C +t \0x014F \0x014E +t \0x0151 \0x0150 +t \0x0153 \0x0152 +t \0x0155 \0x0154 +t \0x0157 \0x0156 +t \0x0159 \0x0158 +t \0x015B \0x015A +t \0x015D \0x015C +t \0x015F \0x015E +t \0x0161 \0x0160 +t \0x0163 \0x0162 +t \0x0165 \0x0164 +t \0x0167 \0x0166 +t \0x0169 \0x0168 +t \0x016B \0x016A +t \0x016D \0x016C +t \0x016F \0x016E +t \0x0171 \0x0170 +t \0x0173 \0x0172 +t \0x0175 \0x0174 +t \0x0177 \0x0176 +t \0x017A \0x0179 +t \0x017C \0x017B +t \0x017E \0x017D +t \0x017F S +# Greek letters: +\0x037A \0x0399 +\0x0390 \0x0399 +\0x03AC \0x0386 +\0x03AD \0x0388 +\0x03AE \0x0389 +\0x03AF \0x038A +\0x03B0 \0x03AB +\0x03B1-\0x03C1 \0x0391-\0x03A1 +\0x03C2 \0x03A3 +\0x03C3-\0x03CB \0x03A3-\0x03AB +\0x03CC \0x038C +\0x03CD \0x038E +\0x03CE \0x038F +\0x03E3 \0x03E2 +\0x03E5 \0x03E4 +\0x03E7 \0x03E6 +\0x03E9 \0x03E8 +\0x03EB \0x03EA +\0x03ED \0x03EC +\0x03EF \0x03ED +# Cyrillic letters: +\0x0430-\0x044F \0x0410-\0x042F +\0x0451-\0x045F \0x0401-\0x040F +\0x0461 \0x0460 +\0x0463 \0x0461 +\0x0465 \0x0464 +\0x0467 \0x0466 +\0x0469 \0x0468 +\0x046B \0x046A +\0x046D \0x046C +\0x046F \0x046E +\0x0471 \0x0470 +\0x0473 \0x0471 +\0x0475 \0x0474 +\0x0477 \0x0476 +\0x0479 \0x0478 +\0x047B \0x047A +\0x047D \0x047C +\0x047F \0x047E +\0x0481 \0x0480 +\0x0491 \0x0490 +\0x0493 \0x0491 +\0x0495 \0x0494 +\0x0497 \0x0496 +\0x0499 \0x0498 +\0x049B \0x049A +\0x049D \0x049C +\0x049F \0x049E +\0x04A1 \0x04A0 +\0x04A3 \0x04A1 +\0x04A5 \0x04A4 +\0x04A7 \0x04A6 +\0x04A9 \0x04A8 +\0x04AB \0x04AA +\0x04AD \0x04AC +\0x04AF \0x04AE +\0x04B1 \0x04B0 +\0x04B3 \0x04B1 +\0x04B5 \0x04B4 +\0x04B7 \0x04B6 +\0x04B9 \0x04B8 +\0x04BB \0x04BA +\0x04BD \0x04BC +\0x04BF \0x04BE +\0x04C2 \0x04C1 +\0x04C4 \0x04C3 +\0x04C8 \0x04C7 +\0x04CC \0x04CB +\0x04D1 \0x04D0 +\0x04D3 \0x04D2 +\0x04D5 \0x04D4 +\0x04D7 \0x04D6 +\0x04D9 \0x04D8 +\0x04DB \0x04DA +\0x04DD \0x04DC +\0x04DF \0x04DE +\0x04E1 \0x04E0 +\0x04E3 \0x04E2 +\0x04E5 \0x04E4 +\0x04E7 \0x04E6 +\0x04E9 \0x04E8 +\0x04EB \0x04EA +\0x04ED \0x04EC +\0x04EF \0x04EE +\0x04F1 \0x04F0 +\0x04F3 \0x04F2 +\0x04F5 \0x04F4 +\0x04F7 \0x04F6 +\0x04F9 \0x04F8 +# Armenian letters: +\0x0561-\0x0586 \0x0531-\0x0556 diff --git a/externals/figlet/fonts/ushebrew.flc b/externals/figlet/fonts/ushebrew.flc new file mode 100644 index 0000000000..313af84b5b --- /dev/null +++ b/externals/figlet/fonts/ushebrew.flc @@ -0,0 +1,33 @@ +flc2a +# implements a natural mapping from the U.S. keyboard +# to Hebrew characters in the Ivrit font. +# Note that capital letters remain unchanged. + +t a \0x05d0 +t b \0x05d1 +t g \0x05d2 +t d \0x05d3 +t h \0x05d4 +t v \0x05d5 +t z \0x05d6 +t c \0x05d7 +t t \0x05d8 +t y \0x05d9 +t k \0x05db +t f \0x05da +t l \0x05dc +t m \0x05de +t o \0x05dd +t n \0x05e0 +t i \0x05df +t e \0x05e1 +t _ \0x05e2 +t p \0x05e4 +t u \0x05e3 +t j \0x05e6 +t w \0x05e5 +t q \0x05e7 +t r \0x05e8 +t s \0x05e9 +t x \0x05ea +t ~ \-3 diff --git a/externals/figlet/fonts/uskata.flc b/externals/figlet/fonts/uskata.flc new file mode 100644 index 0000000000..62e559f4be --- /dev/null +++ b/externals/figlet/fonts/uskata.flc @@ -0,0 +1,53 @@ +flc2a +# Maps the upper and lower case alphabet (A-Z and a-v) into the +# 48 basic katakana Unicodes. Can be used with any Unicode katakana +# font, such as Banner. +t A \0x30A2 +t B \0x30A4 +t C \0x30A6 +t D \0x30A8 +t E \0x30AA +t F \0x30AB +t G \0x30AD +t H \0x30AF +t I \0x30B1 +t J \0x30B3 +t K \0x30B5 +t L \0x30B7 +t M \0x30B9 +t N \0x30BB +t O \0x30BD +t P \0x30BF +t Q \0x30C1 +t R \0x30C4 +t S \0x30C6 +t T \0x30C8 +t U \0x30CA +t V \0x30CB +t W \0x30CC +t X \0x30CD +t Y \0x30CE +t Z \0x30CF +t a \0x30D2 +t b \0x30D5 +t c \0x30D8 +t d \0x30DB +t e \0x30DE +t f \0x30DF +t g \0x30E0 +t h \0x30E1 +t i \0x30E2 +t j \0x30E4 +t k \0x30E6 +t l \0x30E8 +t m \0x30F1 +t n \0x30E9 +t o \0x30EA +t p \0x30EB +t q \0x30EC +t r \0x30ED +t s \0x30EF +t t \0x30F0 +t u \0x30F2 +t v \0x30F3 +t ~ \-4 diff --git a/externals/figlet/fonts/utf8.flc b/externals/figlet/fonts/utf8.flc new file mode 100644 index 0000000000..532986d7c6 --- /dev/null +++ b/externals/figlet/fonts/utf8.flc @@ -0,0 +1,4 @@ +flc2a +# Set UTF-8 input mode (an 8-bit encoding of Unicode that preserves ASCII) +# Meaningful only to FIGlet 2.2 beta 4 or better +u diff --git a/externals/figlet/getopt.c b/externals/figlet/getopt.c new file mode 100644 index 0000000000..421899152c --- /dev/null +++ b/externals/figlet/getopt.c @@ -0,0 +1,104 @@ +/* + * * @(#)getopt.c 2.3 (smail) 5/30/87 + */ + +/* + * Here's something you've all been waiting for: the AT&T public domain + * source for getopt(3). It is the code which was given out at the 1985 + * UNIFORUM conference in Dallas. I obtained it by electronic mail directly + * from AT&T. The people there assure me that it is indeed in the public + * domain. + * + * There is no manual page. That is because the one they gave out at UNIFORUM + * was slightly different from the current System V Release 2 manual page. + * The difference apparently involved a note about the famous rules 5 and 6, + * recommending using white space between an option and its first argument, + * and not grouping options that have arguments. Getopt itself is currently + * lenient about both of these things White space is allowed, but not + * mandatory, and the last option in a group can have an argument. That + * particular version of the man page evidently has no official existence, + * and my source at AT&T did not send a copy. The current SVR2 man page + * reflects the actual behavior of this getopt. However, I am not about to + * post a copy of anything licensed by AT&T. + */ + +#ifdef BSD + #include +#else + #define index strchr + #include +#endif + +/* LINTLIBRARY */ +#ifndef NULL +#define NULL 0 +#endif + +#define EOF (-1) +#define ERR(s, c) if(opterr){\ + extern int write(int, void *, unsigned);\ + char errbuf[2];\ + errbuf[0] = (char)c; errbuf[1] = '\n';\ + (void) write(2, strlwr(argv[0]), (unsigned)strlen(argv[0]));\ + (void) write(2, s, (unsigned)strlen(s));\ + (void) write(2, errbuf, 2);} + +extern char *index(); + +int opterr = 1; +int optind = 1; +int optopt; +char *optarg; + +int getopt(int argc, char *argv[], char *opts) +{ + static int sp = 1; + register int c; + register char *cp; + + if (sp == 1) + { + if (optind >= argc || argv[optind][0] != '-' || + argv[optind][1] == '\0') + return (EOF); + else if (strcmp(argv[optind], "--") == 0) + { + optind++; + return (EOF); + } + } + optopt = c = argv[optind][sp]; + if (c == ':' || (cp = index(opts, c)) == NULL) + { + ERR(": illegal option -- ", c); + if (argv[optind][++sp] == '\0') + { + optind++; + sp = 1; + } + return ('?'); + } + if (*++cp == ':') + { + if (argv[optind][sp + 1] != '\0') + optarg = &argv[optind++][sp + 1]; + else if (++optind >= argc) + { + ERR(": option requires an argument -- ", c); + sp = 1; + return ('?'); + } + else optarg = argv[optind++]; + sp = 1; + } + else + { + if (argv[optind][++sp] == '\0') + { + sp = 1; + optind++; + } + optarg = NULL; + } + return (c); +} diff --git a/externals/figlet/inflate.c b/externals/figlet/inflate.c new file mode 100644 index 0000000000..06cef443b6 --- /dev/null +++ b/externals/figlet/inflate.c @@ -0,0 +1,1321 @@ +/* + * inflate.c - inflate decompression routine + * + * Version 1.1.2 + */ + +/* + * Copyright (C) 1995, Edward B. Hamrick + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of the copyright holders + * not be used in advertising or publicity pertaining to distribution of + * the software without specific, written prior permission. The copyright + * holders makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, + * IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT + * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * Changes from 1.1 to 1.1.2: + * Relicensed under the MIT license, with consent of the copyright holders. + * Claudio Matsuoka (Jan 11 2011) + */ + +/* + * inflate.c is based on the public-domain (non-copyrighted) version + * written by Mark Adler, version c14o, 23 August 1994. It has been + * modified to be reentrant, more portable, and to be data driven. + */ + +/* + * 1) All file i/o is done externally to these routines + * 2) Routines are symmetrical so inflate can feed into deflate + * 3) Routines can be easily integrated into wide range of applications + * 4) Routines are very portable, and use only ANSI C + * 5) No #defines in inflate.h to conflict with external #defines + * 6) No external routines need be called by these routines + * 7) Buffers are owned by the calling routine + * 8) No static non-constant variables are allowed + */ + +/* + * Note that for each call to InflatePutBuffer, there will be + * 0 or more calls to (*putbuffer_ptr). Before InflatePutBuffer + * returns, it will have output as much uncompressed data as + * is possible. + */ + +#ifdef MEMCPY +#include +#endif + +#include "inflate.h" + +/* + * Macros for constants + */ + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef WINDOWSIZE +#define WINDOWSIZE 0x8000 +#endif + +#ifndef WINDOWMASK +#define WINDOWMASK 0x7fff +#endif + +#ifndef BUFFERSIZE +#define BUFFERSIZE 0x4000 +#endif + +#ifndef BUFFERMASK +#define BUFFERMASK 0x3fff +#endif + +#ifndef INFLATESTATETYPE +#define INFLATESTATETYPE 0xabcdabcdL +#endif + +/* + * typedefs + */ + +typedef unsigned long ulg; +typedef unsigned short ush; +typedef unsigned char uch; + +/* Structure to hold state for inflating zip files */ +struct InflateState { + + unsigned long runtimetypeid1; /* to detect run-time errors */ + int errorencountered; /* error encountered flag */ + + /* Decoding state */ + int state; /* -1 -> need block type */ + /* 0 -> need stored setup */ + /* 1 -> need fixed setup */ + /* 2 -> need dynamic setup */ + /* 10 -> need stored data */ + /* 11 -> need fixed data */ + /* 12 -> need dynamic data */ + +/* State for decoding fixed & dynamic data */ + struct huft *tl; /* literal/length decoder tbl */ + struct huft *td; /* distance decoder table */ + int bl; /* bits decoded by tl */ + int bd; /* bits decoded by td */ + + /* State for decoding stored data */ + unsigned int storelength; + + /* State to keep track that last block has been encountered */ + int lastblock; /* current block is last */ + + /* Input buffer state (circular) */ + ulg bb; /* input buffer bits */ + unsigned int bk; /* input buffer count of bits */ + unsigned int bp; /* input buffer pointer */ + unsigned int bs; /* input buffer size */ + unsigned char buffer[BUFFERSIZE]; /* input buffer data */ + + /* Storage for try/catch */ + ulg catch_bb; /* bit buffer */ + unsigned int catch_bk; /* bits in bit buffer */ + unsigned int catch_bp; /* buffer pointer */ + unsigned int catch_bs; /* buffer size */ + + /* Output window state (circular) */ + unsigned int wp; /* output window pointer */ + unsigned int wf; /* output window flush-from */ + unsigned char window[WINDOWSIZE]; /* output window data */ + + /* Application state */ + void *AppState; /* opaque ptr for callout */ + + /* pointers to call-outs */ + int (*putbuffer_ptr)( /* returns 0 on success */ + void *AppState, /* opaque ptr from Initialize */ + unsigned char *buffer, /* buffer to put */ + long length /* length of buffer */ + ); + + void *(*malloc_ptr)(long length); /* utility routine */ + + void (*free_ptr)(void *buffer); /* utility routine */ + + unsigned long runtimetypeid2; /* to detect run-time errors */ +}; + +/* + * Error handling macro + */ + +#define ERROREXIT(is) {(is)->errorencountered = TRUE; return TRUE;} + +/* + * Macros for handling data in the input buffer + * + * Note that the NEEDBITS and DUMPBITS macros + * need to be bracketed by the TRY/CATCH macros + * + * The usage is: + * + * TRY + * { + * NEEDBITS(j) + * x = b & mask_bits[j]; + * DUMPBITS(j) + * } + * CATCH_BEGIN + * cleanup code + * CATCH_END + * + * Note that there can only be one TRY/CATCH pair per routine + * because of the use of goto in the implementation of the macros. + * + * NEEDBITS makes sure that b has at least j bits in it, and + * DUMPBITS removes the bits from b. The macros use the variable k + * for the number of bits in b. Normally, b and k are register + * variables for speed, and are initialized at the beginning of a + * routine that uses these macros from a global bit buffer and count. + * + * In order to not ask for more bits than there are in the compressed + * stream, the Huffman tables are constructed to only ask for just + * enough bits to make up the end-of-block code (value 256). Then no + * bytes need to be "returned" to the buffer at the end of the last + * block. See the huft_build() routine. + */ + +#define TRY \ + is->catch_bb = b; \ + is->catch_bk = k; \ + is->catch_bp = is->bp; \ + is->catch_bs = is->bs; + +#define CATCH_BEGIN \ + goto cleanup_done; \ + cleanup: \ + b = is->catch_bb; \ + k = is->catch_bk; \ + is->bb = b; \ + is->bk = k; \ + is->bp = is->catch_bp; \ + is->bs = is->catch_bs; + +#define CATCH_END \ + cleanup_done: ; + +#define NEEDBITS(n) \ +{ \ + while (k < (n)) \ + { \ + if (is->bs <= 0) \ + { \ + goto cleanup; \ + } \ + b |= ((ulg) (is->buffer[is->bp & BUFFERMASK])) << k; \ + is->bs--; \ + is->bp++; \ + k += 8; \ + } \ +} + +#define DUMPBITS(n) \ +{ \ + b >>= (n); \ + k -= (n); \ +} + +/* + * Macro for flushing the output window to the putbuffer callout. + * + * Note that the window is always flushed when it fills to 32K, + * and before returning to the application. + */ + +#define FLUSHWINDOW(w, now) \ +if ((now && (is->wp > is->wf)) || ((w) >= WINDOWSIZE)) \ +{ \ + is->wp = (w); \ + if ((*(is->putbuffer_ptr)) \ + (is->AppState, is->window+is->wf, is->wp-is->wf)) \ + ERROREXIT(is); \ + is->wp &= WINDOWMASK; \ + is->wf = is->wp; \ + (w) = is->wp; \ +} + +/* + * Inflate deflated (PKZIP's method 8 compressed) data. The compression + * method searches for as much of the current string of bytes (up to a + * length of 258) in the previous 32K bytes. If it doesn't find any + * matches (of at least length 3), it codes the next byte. Otherwise, it + * codes the length of the matched string and its distance backwards from + * the current position. There is a single Huffman code that codes both + * single bytes (called "literals") and match lengths. A second Huffman + * code codes the distance information, which follows a length code. Each + * length or distance code actually represents a base value and a number + * of "extra" (sometimes zero) bits to get to add to the base value. At + * the end of each deflated block is a special end-of-block (EOB) literal/ + * length code. The decoding process is basically: get a literal/length + * code; if EOB then done; if a literal, emit the decoded byte; if a + * length then get the distance and emit the referred-to bytes from the + * sliding window of previously emitted data. + * + * There are (currently) three kinds of inflate blocks: stored, fixed, and + * dynamic. The compressor outputs a chunk of data at a time and decides + * which method to use on a chunk-by-chunk basis. A chunk might typically + * be 32K to 64K, uncompressed. If the chunk is uncompressible, then the + * "stored" method is used. In this case, the bytes are simply stored as + * is, eight bits per byte, with none of the above coding. The bytes are + * preceded by a count, since there is no longer an EOB code. + * + * If the data is compressible, then either the fixed or dynamic methods + * are used. In the dynamic method, the compressed data is preceded by + * an encoding of the literal/length and distance Huffman codes that are + * to be used to decode this block. The representation is itself Huffman + * coded, and so is preceded by a description of that code. These code + * descriptions take up a little space, and so for small blocks, there is + * a predefined set of codes, called the fixed codes. The fixed method is + * used if the block ends up smaller that way (usually for quite small + * chunks); otherwise the dynamic method is used. In the latter case, the + * codes are customized to the probabilities in the current block and so + * can code it much better than the pre-determined fixed codes can. + * + * The Huffman codes themselves are decoded using a mutli-level table + * lookup, in order to maximize the speed of decoding plus the speed of + * building the decoding tables. See the comments below that precede the + * lbits and dbits tuning parameters. + */ + +/* + * Notes beyond the 1.93a appnote.txt: + * + * 1. Distance pointers never point before the beginning of the output + * stream. + * 2. Distance pointers can point back across blocks, up to 32k away. + * 3. There is an implied maximum of 7 bits for the bit length table and + * 15 bits for the actual data. + * 4. If only one code exists, then it is encoded using one bit. (Zero + * would be more efficient, but perhaps a little confusing.) If two + * codes exist, they are coded using one bit each (0 and 1). + * 5. There is no way of sending zero distance codes--a dummy must be + * sent if there are none. (History: a pre 2.0 version of PKZIP would + * store blocks with no distance codes, but this was discovered to be + * too harsh a criterion.) Valid only for 1.93a. 2.04c does allow + * zero distance codes, which is sent as one code of zero bits in + * length. + * 6. There are up to 286 literal/length codes. Code 256 represents the + * end-of-block. Note however that the static length tree defines + * 288 codes just to fill out the Huffman codes. Codes 286 and 287 + * cannot be used though, since there is no length base or extra bits + * defined for them. Similarly, there are up to 30 distance codes. + * However, static trees define 32 codes (all 5 bits) to fill out the + * Huffman codes, but the last two had better not show up in the data. + * 7. Unzip can check dynamic Huffman blocks for complete code sets. + * The exception is that a single code would not be complete (see #4). + * 8. The five bits following the block type is really the number of + * literal codes sent minus 257. + * 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits + * (1+6+6). Therefore, to output three times the length, you output + * three codes (1+1+1), whereas to output four times the same length, + * you only need two codes (1+3). Hmm. + *10. In the tree reconstruction algorithm, Code = Code + Increment + * only if BitLength(i) is not zero. (Pretty obvious.) + *11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) + *12. Note: length code 284 can represent 227-258, but length code 285 + * really is 258. The last length deserves its own, short code + * since it gets used a lot in very redundant files. The length + * 258 is special since 258 - 3 (the min match length) is 255. + *13. The literal/length and distance code bit lengths are read as a + * single stream of lengths. It is possible (and advantageous) for + * a repeat code (16, 17, or 18) to go across the boundary between + * the two sets of lengths. + */ + +/* + * Huffman code lookup table entry--this entry is four bytes for machines + * that have 16-bit pointers (e.g. PC's in the small or medium model). + * Valid extra bits are 0..13. e == 15 is EOB (end of block), e == 16 + * means that v is a literal, 16 < e < 32 means that v is a pointer to + * the next table, which codes e - 16 bits, and lastly e == 99 indicates + * an unused code. If a code with e == 99 is looked up, this implies an + * error in the data. + */ + +struct huft { + uch e; /* number of extra bits or operation */ + uch b; /* number of bits in this code or subcode */ + union { + ush n; /* literal, length base, or distance base */ + struct huft *t; /* pointer to next level of table */ + } v; +}; + +/* + * Tables for deflate from PKZIP's appnote.txt. + */ + +static const unsigned border[] = { /* Order of the bit length code lengths */ + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + +static const ush cplens[] = { /* Copy lengths for literal codes 257..285 */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + /* note: see note #13 above about the 258 in this list. */ + +static const ush cplext[] = { /* Extra bits for literal codes 257..285 */ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99}; /* 99==invalid */ + +static const ush cpdist[] = { /* Copy offsets for distance codes 0..29 */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577}; + +static const ush cpdext[] = { /* Extra bits for distance codes */ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 13, 13}; + +/* + * Constants for run-time computation of mask + */ + +static const ush mask_bits[] = { + 0x0000, + 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, + 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff +}; + +/* + * Huffman code decoding is performed using a multi-level table lookup. + * The fastest way to decode is to simply build a lookup table whose + * size is determined by the longest code. However, the time it takes + * to build this table can also be a factor if the data being decoded + * is not very long. The most common codes are necessarily the + * shortest codes, so those codes dominate the decoding time, and hence + * the speed. The idea is you can have a shorter table that decodes the + * shorter, more probable codes, and then point to subsidiary tables for + * the longer codes. The time it costs to decode the longer codes is + * then traded against the time it takes to make longer tables. + * + * This results of this trade are in the variables lbits and dbits + * below. lbits is the number of bits the first level table for literal/ + * length codes can decode in one step, and dbits is the same thing for + * the distance codes. Subsequent tables are also less than or equal to + * those sizes. These values may be adjusted either when all of the + * codes are shorter than that, in which case the longest code length in + * bits is used, or when the shortest code is *longer* than the requested + * table size, in which case the length of the shortest code in bits is + * used. + * + * There are two different values for the two tables, since they code a + * different number of possibilities each. The literal/length table + * codes 286 possible values, or in a flat code, a little over eight + * bits. The distance table codes 30 possible values, or a little less + * than five bits, flat. The optimum values for speed end up being + * about one bit more than those, so lbits is 8+1 and dbits is 5+1. + * The optimum values may differ though from machine to machine, and + * possibly even between compilers. Your mileage may vary. + */ + +static const int lbits = 9; /* bits in base literal/length lookup table */ +static const int dbits = 6; /* bits in base distance lookup table */ + +/* If BMAX needs to be larger than 16, then h and x[] should be ulg. */ +#define BMAX 16 /* maximum bit length of any code (16 for explode) */ +#define N_MAX 288 /* maximum number of codes in any set */ + +/* + * Free the malloc'ed tables built by huft_build(), which makes a linked + * list of the tables it made, with the links in a dummy first entry of + * each table. + */ + +static int huft_free( + struct InflateState *is, /* Inflate state */ + struct huft *t /* table to free */ +) +{ + struct huft *p, *q; + + /* Go through linked list, freeing from the malloced (t[-1]) address. */ + p = t; + while (p != (struct huft *)NULL) + { + q = (--p)->v.t; + (*is->free_ptr)((char*)p); + p = q; + } + return 0; +} + +/* + * Given a list of code lengths and a maximum table size, make a set of + * tables to decode that set of codes. Return zero on success, one if + * the given code set is incomplete (the tables are still built in this + * case), two if the input is invalid (all zero length codes or an + * oversubscribed set of lengths), and three if not enough memory. + * The code with value 256 is special, and the tables are constructed + * so that no bits beyond that code are fetched when that code is + * decoded. + */ + +static int huft_build( + struct InflateState *is, /* Inflate state */ + unsigned *b, /* code lengths in bits (all assumed <= BMAX) */ + unsigned n, /* number of codes (assumed <= N_MAX) */ + unsigned s, /* number of simple-valued codes (0..s-1) */ + const ush *d, /* list of base values for non-simple codes */ + const ush *e, /* list of extra bits for non-simple codes */ + struct huft **t, /* result: starting table */ + int *m /* maximum lookup bits, returns actual */ +) +{ + unsigned a; /* counter for codes of length k */ + unsigned c[BMAX+1]; /* bit length count table */ + unsigned el; /* length of EOB code (value 256) */ + unsigned f; /* i repeats in table every f entries */ + int g; /* maximum code length */ + int h; /* table level */ + unsigned i; /* counter, current code */ + unsigned j; /* counter */ + int k; /* number of bits in current code */ + int lx[BMAX+1]; /* memory for l[-1..BMAX-1] */ + int *l = lx+1; /* stack of bits per table */ + unsigned *p; /* pointer into c[], b[], or v[] */ + struct huft *q; /* points to current table */ + struct huft r; /* table entry for structure assignment */ + struct huft *u[BMAX]; /* table stack */ + unsigned v[N_MAX]; /* values in order of bit length */ + int w; /* bits before this table == (l * h) */ + unsigned x[BMAX+1]; /* bit offsets, then code stack */ + unsigned *xp; /* pointer into x */ + int y; /* number of dummy codes added */ + unsigned z; /* number of entries in current table */ + + /* clear the bit length count table */ + for (i=0; i<(BMAX+1); i++) + { + c[i] = 0; + } + + /* Generate counts for each bit length */ + el = n > 256 ? b[256] : BMAX; /* set length of EOB code, if any */ + p = b; i = n; + do { + c[*p]++; p++; /* assume all entries <= BMAX */ + } while (--i); + if (c[0] == n) /* null input--all zero length codes */ + { + *t = (struct huft *)NULL; + *m = 0; + return 0; + } + + /* Find minimum and maximum length, bound *m by those */ + for (j = 1; j <= BMAX; j++) + if (c[j]) + break; + k = j; /* minimum code length */ + if ((unsigned)*m < j) + *m = j; + for (i = BMAX; i; i--) + if (c[i]) + break; + g = i; /* maximum code length */ + if ((unsigned)*m > i) + *m = i; + + /* Adjust last length count to fill out codes, if needed */ + for (y = 1 << j; j < i; j++, y <<= 1) + if ((y -= c[j]) < 0) + return 2; /* bad input: more codes than bits */ + if ((y -= c[i]) < 0) + return 2; + c[i] += y; + + /* Generate starting offsets into the value table for each length */ + x[1] = j = 0; + p = c + 1; xp = x + 2; + while (--i) { /* note that i == g from above */ + *xp++ = (j += *p++); + } + + /* Make a table of values in order of bit lengths */ + p = b; i = 0; + do { + if ((j = *p++) != 0) + v[x[j]++] = i; + } while (++i < n); + + /* Generate the Huffman codes and for each, make the table entries */ + x[0] = i = 0; /* first Huffman code is zero */ + p = v; /* grab values in bit order */ + h = -1; /* no tables yet--level -1 */ + w = l[-1] = 0; /* no bits decoded yet */ + u[0] = (struct huft *)NULL; /* just to keep compilers happy */ + q = (struct huft *)NULL; /* ditto */ + z = 0; /* ditto */ + + /* go through the bit lengths (k already is bits in shortest code) */ + for (; k <= g; k++) + { + a = c[k]; + while (a--) + { + /* here i is the Huffman code of length k bits for value *p */ + /* make tables up to required level */ + while (k > w + l[h]) + { + w += l[h++]; /* add bits already decoded */ + + /* compute minimum size table less than or equal to *m bits */ + z = (z = g - w) > (unsigned)*m ? *m : z; /* upper limit */ + if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ + { /* too few codes for k-w bit table */ + f -= a + 1; /* deduct codes from patterns left */ + xp = c + k; + while (++j < z) /* try smaller tables up to z bits */ + { + if ((f <<= 1) <= *++xp) + break; /* enough codes to use up j bits */ + f -= *xp; /* else deduct codes from patterns */ + } + } + if ((unsigned)w + j > el && (unsigned)w < el) + j = el - w; /* make EOB code end at table */ + z = 1 << j; /* table entries for j-bit table */ + l[h] = j; /* set table size in stack */ + + /* allocate and link in new table */ + if ((q = (struct huft *) + ((*is->malloc_ptr)((z + 1)*sizeof(struct huft)))) == + (struct huft *)NULL) + { + if (h) + huft_free(is, u[0]); + return 3; /* not enough memory */ + } + *t = q + 1; /* link to list for huft_free() */ + *(t = &(q->v.t)) = (struct huft *)NULL; + u[h] = ++q; /* table starts after link */ + + /* connect to last table, if there is one */ + if (h) + { + x[h] = i; /* save pattern for backing up */ + r.b = (uch)l[h-1]; /* bits to dump before this table */ + r.e = (uch)(16 + j); /* bits in this table */ + r.v.t = q; /* pointer to this table */ + j = (i & ((1 << w) - 1)) >> (w - l[h-1]); + u[h-1][j] = r; /* connect to last table */ + } + } + + /* set up table entry in r */ + r.b = (uch)(k - w); + if (p >= v + n) + r.e = 99; /* out of values--invalid code */ + else if (*p < s) + { + r.e = (uch)(*p < 256 ? 16 : 15); /* 256 is end-of-block code */ + r.v.n = (ush) *p++; /* simple code is just the value */ + } + else + { + r.e = (uch)e[*p - s]; /* non-simple--look up in lists */ + r.v.n = d[*p++ - s]; + } + + /* fill code-like entries with r */ + f = 1 << (k - w); + for (j = i >> w; j < z; j += f) + q[j] = r; + + /* backwards increment the k-bit code i */ + for (j = 1 << (k - 1); i & j; j >>= 1) + i ^= j; + i ^= j; + + /* backup over finished tables */ + while ((i & ((1 << w) - 1)) != x[h]) + w -= l[--h]; /* don't need to update q */ + } + } + + /* return actual size of base table */ + *m = l[0]; + + /* Return true (1) if we were given an incomplete table */ + return y != 0 && g != 1; +} + +/* + * inflate (decompress) the codes in a stored (uncompressed) block. + * Return an error code or zero if it all goes ok. + */ + +static int inflate_stored( + struct InflateState *is /* Inflate state */ +) +{ + ulg b; /* bit buffer */ + unsigned k; /* number of bits in bit buffer */ + unsigned w; /* current window position */ + + /* make local copies of state */ + b = is->bb; /* initialize bit buffer */ + k = is->bk; /* initialize bit count */ + w = is->wp; /* initialize window position */ + + /* + * Note that this code knows that NEEDBITS jumps to cleanup + */ + + while (is->storelength > 0) /* do until end of block */ + { + NEEDBITS(8) + is->window[w++] = (uch) b; + DUMPBITS(8) + FLUSHWINDOW(w, FALSE); + is->storelength--; + } + + cleanup: + + /* restore the state from the locals */ + is->bb = b; /* restore bit buffer */ + is->bk = k; /* restore bit count */ + is->wp = w; /* restore window pointer */ + + if (is->storelength > 0) + return -1; + else + return 0; +} + +static int inflate_codes( + struct InflateState *is, /* Inflate state */ + struct huft *tl, /* literal/length decoder table */ + struct huft *td, /* distance decoder table */ + int bl, /* number of bits decoded by tl[] */ + int bd /* number of bits decoded by td[] */ +) +{ + unsigned e; /* table entry flag/number of extra bits */ + unsigned n, d; /* length and index for copy */ + unsigned w; /* current window position */ + struct huft *t; /* pointer to table entry */ + unsigned ml, md; /* masks for bl and bd bits */ + ulg b; /* bit buffer */ + unsigned k; /* number of bits in bit buffer */ + + /* make local copies of state */ + b = is->bb; /* initialize bit buffer */ + k = is->bk; /* initialize bit count */ + w = is->wp; /* initialize window position */ + + /* inflate the coded data */ + ml = mask_bits[bl]; /* precompute masks for speed */ + md = mask_bits[bd]; + for (;;) /* do until end of block */ + { + TRY + { + NEEDBITS((unsigned)bl) + if ((e = (t = tl + ((unsigned)b & ml))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + + if (e == 16) /* it's a literal */ + { + is->window[w++] = (uch)t->v.n; + FLUSHWINDOW(w, FALSE); + } + else if (e == 15) /* it's an EOB */ + { + break; + } + else /* it's a length */ + { + /* get length of block to copy */ + NEEDBITS(e) + n = t->v.n + ((unsigned)b & mask_bits[e]); + DUMPBITS(e); + + /* decode distance of block to copy */ + NEEDBITS((unsigned)bd) + if ((e = (t = td + ((unsigned)b & md))->e) > 16) + do { + if (e == 99) + return 1; + DUMPBITS(t->b) + e -= 16; + NEEDBITS(e) + } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16); + DUMPBITS(t->b) + NEEDBITS(e) + d = w - t->v.n - ((unsigned)b & mask_bits[e]); + DUMPBITS(e) + + /* do the copy */ + do { + n -= (e = ((e = WINDOWSIZE - ((d &= WINDOWMASK) > w ? d : w)) > n) + ? n : e + ); +#if defined(MEMCPY) + if (w - d >= e) /* (this test assumes unsigned comparison) */ + { + memcpy(is->window + w, is->window + d, e); + w += e; + d += e; + } + else /* do it slow to avoid memcpy() overlap */ +#endif /* MEMCPY */ + do { + is->window[w++] = is->window[d++]; + } while (--e); + FLUSHWINDOW(w, FALSE); + } while (n); + } + } + CATCH_BEGIN + is->wp = w; /* restore window pointer */ + return -1; + CATCH_END + } + + /* restore the state from the locals */ + is->bb = b; /* restore bit buffer */ + is->bk = k; /* restore bit count */ + is->wp = w; /* restore window pointer */ + + /* done */ + return 0; +} + +/* + * "decompress" an inflated type 0 (stored) block. + */ + +static int inflate_stored_setup( + struct InflateState *is /* Inflate state */ +) +{ + unsigned n; /* number of bytes in block */ + ulg b; /* bit buffer */ + unsigned k; /* number of bits in bit buffer */ + + /* make local copies of state */ + b = is->bb; /* initialize bit buffer */ + k = is->bk; /* initialize bit count */ + + TRY + { + /* go to byte boundary */ + n = k & 7; + DUMPBITS(n); + + /* get the length and its complement */ + NEEDBITS(16) + n = ((unsigned)b & 0xffff); + DUMPBITS(16) + NEEDBITS(16) + if (n != (unsigned)((~b) & 0xffff)) + return 1; /* error in compressed data */ + DUMPBITS(16) + } + CATCH_BEGIN + return -1; + CATCH_END + + /* Save store state for this block */ + is->storelength = n; + + /* restore the state from the locals */ + is->bb = b; /* restore bit buffer */ + is->bk = k; /* restore bit count */ + + return 0; +} + +/* + * decompress an inflated type 1 (fixed Huffman codes) block. We should + * either replace this with a custom decoder, or at least precompute the + * Huffman tables. + */ + +static int inflate_fixed_setup( + struct InflateState *is /* Inflate state */ +) +{ + int i; /* temporary variable */ + struct huft *tl; /* literal/length code table */ + struct huft *td; /* distance code table */ + int bl; /* lookup bits for tl */ + int bd; /* lookup bits for td */ + unsigned l[288]; /* length list for huft_build */ + + /* set up literal table */ + for (i = 0; i < 144; i++) + l[i] = 8; + for (; i < 256; i++) + l[i] = 9; + for (; i < 280; i++) + l[i] = 7; + for (; i < 288; i++) /* make a complete, but wrong code set */ + l[i] = 8; + bl = 7; + if ((i = huft_build(is, l, 288, 257, cplens, cplext, &tl, &bl)) != 0) + return i; + + /* set up distance table */ + for (i = 0; i < 30; i++) /* make an incomplete code set */ + l[i] = 5; + bd = 5; + if ((i = huft_build(is, l, 30, 0, cpdist, cpdext, &td, &bd)) > 1) + { + huft_free(is, tl); + return i; + } + + /* Save inflate state for this block */ + is->tl = tl; + is->td = td; + is->bl = bl; + is->bd = bd; + + return 0; +} + +/* + * decompress an inflated type 2 (dynamic Huffman codes) block. + */ + +#define PKZIP_BUG_WORKAROUND + +static int inflate_dynamic_setup( + struct InflateState *is /* Inflate state */ +) +{ + int i; /* temporary variables */ + unsigned j; + unsigned l; /* last length */ + unsigned m; /* mask for bit lengths table */ + unsigned n; /* number of lengths to get */ + struct huft *tl; /* literal/length code table */ + struct huft *td; /* distance code table */ + int bl; /* lookup bits for tl */ + int bd; /* lookup bits for td */ + unsigned nb; /* number of bit length codes */ + unsigned nl; /* number of literal/length codes */ + unsigned nd; /* number of distance codes */ +#ifdef PKZIP_BUG_WORKAROUND + unsigned ll[288+32]; /* literal/length and distance code lengths */ +#else + unsigned ll[286+30]; /* literal/length and distance code lengths */ +#endif + ulg b; /* bit buffer */ + unsigned k; /* number of bits in bit buffer */ + + /* make local copies of state */ + b = is->bb; /* initialize bit buffer */ + k = is->bk; /* initialize bit count */ + + /* initialize tl for cleanup */ + tl = NULL; + + TRY + { + /* read in table lengths */ + NEEDBITS(5) + nl = 257 + ((unsigned)b & 0x1f); /* number of literal/length codes */ + DUMPBITS(5) + NEEDBITS(5) + nd = 1 + ((unsigned)b & 0x1f); /* number of distance codes */ + DUMPBITS(5) + NEEDBITS(4) + nb = 4 + ((unsigned)b & 0xf); /* number of bit length codes */ + DUMPBITS(4) +#ifdef PKZIP_BUG_WORKAROUND + if (nl > 288 || nd > 32) +#else + if (nl > 286 || nd > 30) +#endif + return 1; /* bad lengths */ + + /* read in bit-length-code lengths */ + for (j = 0; j < 19; j++) ll[j] = 0; + for (j = 0; j < nb; j++) + { + NEEDBITS(3) + ll[border[j]] = (unsigned)b & 7; + DUMPBITS(3) + } + + /* build decoding table for trees--single level, 7 bit lookup */ + bl = 7; + if ((i = huft_build(is, ll, 19, 19, NULL, NULL, &tl, &bl)) != 0) + { + if (i == 1) + huft_free(is, tl); + return i; /* incomplete code set */ + } + + /* read in literal and distance code lengths */ + n = nl + nd; + m = mask_bits[bl]; + i = l = 0; + while ((unsigned)i < n) + { + NEEDBITS((unsigned)bl) + j = (td = tl + ((unsigned)b & m))->b; + DUMPBITS(j) + j = td->v.n; + if (j < 16) /* length of code in bits (0..15) */ + ll[i++] = l = j; /* save last length in l */ + else if (j == 16) /* repeat last length 3 to 6 times */ + { + NEEDBITS(2) + j = 3 + ((unsigned)b & 3); + DUMPBITS(2) + if ((unsigned)i + j > n) + return 1; + while (j--) + ll[i++] = l; + } + else if (j == 17) /* 3 to 10 zero length codes */ + { + NEEDBITS(3) + j = 3 + ((unsigned)b & 7); + DUMPBITS(3) + if ((unsigned)i + j > n) + return 1; + while (j--) + ll[i++] = 0; + l = 0; + } + else /* j == 18: 11 to 138 zero length codes */ + { + NEEDBITS(7) + j = 11 + ((unsigned)b & 0x7f); + DUMPBITS(7) + if ((unsigned)i + j > n) + return 1; + while (j--) + ll[i++] = 0; + l = 0; + } + } + + /* free decoding table for trees */ + huft_free(is, tl); + } + CATCH_BEGIN + if (tl) huft_free(is, tl); + return -1; + CATCH_END + + /* restore the state from the locals */ + is->bb = b; /* restore bit buffer */ + is->bk = k; /* restore bit count */ + + /* build the decoding tables for literal/length and distance codes */ + bl = lbits; + if ((i = huft_build(is, ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) + { + if (i == 1) { + /* incomplete literal tree */ + huft_free(is, tl); + } + return i; /* incomplete code set */ + } + bd = dbits; + if ((i = huft_build(is, ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) + { + if (i == 1) { + /* incomplete distance tree */ +#ifdef PKZIP_BUG_WORKAROUND + } +#else + huft_free(is, td); + } + huft_free(is, tl); + return i; /* incomplete code set */ +#endif + } + + /* Save inflate state for this block */ + is->tl = tl; + is->td = td; + is->bl = bl; + is->bd = bd; + + return 0; +} + +/* Routine to initialize inflate decompression */ +void *InflateInitialize( /* returns InflateState */ + void *AppState, /* for passing to putbuffer */ + int (*putbuffer_ptr)( /* returns 0 on success */ + void *AppState, /* opaque ptr from Initialize */ + unsigned char *buffer, /* buffer to put */ + long length /* length of buffer */ + ), + void *(*malloc_ptr)(long length), /* utility routine */ + void (*free_ptr)(void *buffer) /* utility routine */ +) +{ + struct InflateState *is; + + /* Do some argument checking */ + if ((!putbuffer_ptr) || (!malloc_ptr) || (!free_ptr)) return NULL; + + /* Allocate the InflateState memory area */ + is = (struct InflateState *) (*malloc_ptr)(sizeof(struct InflateState)); + if (!is) return NULL; + + /* Set up the initial values of the inflate state */ + is->runtimetypeid1 = INFLATESTATETYPE; + is->errorencountered = FALSE; + + is->bb = 0; + is->bk = 0; + is->bp = 0; + is->bs = 0; + + is->wp = 0; + is->wf = 0; + + is->state = -1; + is->lastblock = FALSE; + + is->AppState = AppState; + + is->putbuffer_ptr = putbuffer_ptr; + is->malloc_ptr = malloc_ptr; + is->free_ptr = free_ptr; + + is->runtimetypeid2 = INFLATESTATETYPE; + + /* Return this state info to the caller */ + return is; +} + +/* Call-in routine to put a buffer into inflate decompression */ +int InflatePutBuffer( /* returns 0 on success */ + void *InflateState, /* opaque ptr from Initialize */ + unsigned char *buffer, /* buffer to put */ + long length /* length of buffer */ +) +{ + struct InflateState *is; + + int beginstate; + + /* Get (and check) the InflateState structure */ + is = (struct InflateState *) InflateState; + if (!is || (is->runtimetypeid1 != INFLATESTATETYPE) + || (is->runtimetypeid2 != INFLATESTATETYPE)) return TRUE; + if (is->errorencountered) return TRUE; + + do + { + int size, i; + + + if ((is->state == -1) && (is->lastblock)) break; + + /* Save the beginning state */ + beginstate = is->state; + + /* Push as much as possible into input buffer */ + size = BUFFERSIZE - is->bs; + if (size > length) size = (int) length; + i = is->bp + is->bs; + + while (size-- > 0) + { + is->buffer[i++ & BUFFERMASK] = *buffer; + is->bs++; + buffer++; + length--; + } + + /* Process some more data */ + if (is->state == -1) + { + int e; /* last block flag */ + unsigned t; /* block type */ + + ulg b; /* bit buffer */ + unsigned k; /* number of bits in bit buffer */ + + /* make local copies of state */ + b = is->bb; /* initialize bit buffer */ + k = is->bk; /* initialize bit count */ + + TRY + { + /* read in last block bit */ + NEEDBITS(1) + e = (int)b & 1; + DUMPBITS(1) + + /* read in block type */ + NEEDBITS(2) + t = (unsigned)b & 3; + DUMPBITS(2) + + if (t <= 2) + { + is->state = t; + is->lastblock = e; + } + else + { + ERROREXIT(is); + } + } + CATCH_BEGIN + CATCH_END + + /* restore the state from the locals */ + is->bb = b; /* restore bit buffer */ + is->bk = k; /* restore bit count */ + } + else if (is->state == 0) + { + int ret; + + ret = inflate_stored_setup(is); + + if (ret > 0) + ERROREXIT(is); + + if (ret == 0) is->state += 10; + } + else if (is->state == 1) + { + int ret; + + ret = inflate_fixed_setup(is); + + if (ret > 0) + ERROREXIT(is); + + if (ret == 0) is->state += 10; + } + else if (is->state == 2) + { + int ret; + + ret = inflate_dynamic_setup(is); + + if (ret > 0) + ERROREXIT(is); + + if (ret == 0) is->state += 10; + } + else if (is->state == 10) + { + int ret; + + ret = inflate_stored(is); + + if (ret > 0) + ERROREXIT(is); + + if (ret == 0) + { + is->state = -1; + } + } + else if ((is->state == 11) || + (is->state == 12) ) + { + int ret; + + ret = inflate_codes(is, is->tl, is->td, is->bl, is->bd); + + if (ret > 0) + ERROREXIT(is); + + if (ret == 0) + { + /* free the decoding tables */ + huft_free(is, is->tl); + huft_free(is, is->td); + is->state = -1; + } + } + else + { + ERROREXIT(is); + } + } + while (length || (is->state != beginstate)); + + FLUSHWINDOW(is->wp, TRUE); + + return is->errorencountered; +} + +/* Routine to terminate inflate decompression */ +int InflateTerminate( /* returns 0 on success */ + void *InflateState /* opaque ptr from Initialize */ +) +{ + int err; + void (*free_ptr)(void *buffer); + + struct InflateState *is; + + /* Get (and check) the InflateState structure */ + is = (struct InflateState *) InflateState; + if (!is || (is->runtimetypeid1 != INFLATESTATETYPE) + || (is->runtimetypeid2 != INFLATESTATETYPE)) return TRUE; + + /* save the error return */ + err = is->errorencountered || (is->bs > 0) + || (is->state != -1) + || (!is->lastblock); + + /* save the address of the free routine */ + free_ptr = is->free_ptr; + + /* Deallocate everything */ + (*free_ptr)(is); + + return err; +} diff --git a/externals/figlet/inflate.h b/externals/figlet/inflate.h new file mode 100644 index 0000000000..4fc7454820 --- /dev/null +++ b/externals/figlet/inflate.h @@ -0,0 +1,90 @@ +/* + * inflate.h - inflate decompression routine + * + * Version 1.1.2 + */ + +/* + * Copyright (C) 1995, Edward B. Hamrick + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of the copyright holders + * not be used in advertising or publicity pertaining to distribution of + * the software without specific, written prior permission. The copyright + * holders makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, + * IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT + * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * Changes from 1.1 to 1.1.2: + * Relicensed under the MIT license, with consent of the copyright holders. + * Claudio Matsuoka (Jan 11 2011) + */ + +/* + * 1) All file i/o is done externally to these routines + * 2) Routines are symmetrical so inflate can feed into deflate + * 3) Routines can be easily integrated into wide range of applications + * 4) Routines are very portable, and use only ANSI C + * 5) No #defines in inflate.h to conflict with external #defines + * 6) No external routines need be called by these routines + * 7) Buffers are owned by the calling routine + * 8) No static non-constant variables are allowed + */ + +/* + * Note that for each call to InflatePutBuffer, there will be + * 0 or more calls to (*putbuffer_ptr). All except the last + * call to (*putbuffer_ptr) will be with 32768 bytes, although + * this behaviour may change in the future. Before InflatePutBuffer + * returns, it will have output as much uncompressed data as + * is possible. + */ + +#ifndef __INFLATE_H +#define __INFLATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Routine to initialize inflate decompression */ +void *InflateInitialize( /* returns InflateState */ + void *AppState, /* for passing to putbuffer */ + int (*putbuffer_ptr)( /* returns 0 on success */ + void *AppState, /* opaque ptr from Initialize */ + unsigned char *buffer, /* buffer to put */ + long length /* length of buffer */ + ), + void *(*malloc_ptr)(long length), /* utility routine */ + void (*free_ptr)(void *buffer) /* utility routine */ +); + +/* Call-in routine to put a buffer into inflate decompression */ +int InflatePutBuffer( /* returns 0 on success */ + void *InflateState, /* opaque ptr from Initialize */ + unsigned char *buffer, /* buffer to put */ + long length /* length of buffer */ +); + +/* Routine to terminate inflate decompression */ +int InflateTerminate( /* returns 0 on success */ + void *InflateState /* opaque ptr from Initialize */ +); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/externals/figlet/run-tests.sh b/externals/figlet/run-tests.sh new file mode 100755 index 0000000000..4c373ec8d0 --- /dev/null +++ b/externals/figlet/run-tests.sh @@ -0,0 +1,92 @@ +#!/bin/sh + +LC_ALL=POSIX +export LC_ALL + +TESTDIR=tests +OUTPUT=.test-output.txt +LOGFILE=tests.log +CMD="./figlet" +FONTDIR="$1" + +run_test() { + test_dsc=$1 + test_cmd=$2 + + total=`expr $total + 1` + test_num=`printf %03d $total` + + echo >> $LOGFILE + printf "Run test $test_num: ${test_dsc}... " | tee -a $LOGFILE + echo >> $LOGFILE + echo "Command: $test_cmd" >> $LOGFILE + eval "$test_cmd" > "$OUTPUT" 2>> $LOGFILE + cmp "$OUTPUT" "tests/res${test_num}.txt" >> $LOGFILE 2>&1 + if [ $? -eq 0 ]; then + echo "pass" | tee -a $LOGFILE + else + echo "**fail**" | tee -a $LOGFILE + result=1 + fail=`expr $fail + 1` + fi +} + +result=0 +fail=0 +$CMD -v > $LOGFILE + +file="$TESTDIR/input.txt" +cmd="cat $file|$CMD" + +printf "Default font dir: "; $CMD -I2 +if [ -n "$FONTDIR" ]; then + FIGLET_FONTDIR="$FONTDIR" + export FIGLET_FONTDIR +fi +printf "Current font dir: "; $CMD -I2 +printf "Default font: "; $CMD -I3 +$CMD -f small "Test results" | tee -a $LOGFILE + +total=0 + +run_test "showfigfonts output" "./showfigfonts" +run_test "text rendering in all fonts" \ + "for i in fonts/*.flf; do $cmd -f \$i; done" +run_test "long text rendering" "cat tests/longtext.txt|$CMD" +run_test "left-to-right text" "$cmd -L" +run_test "right-to-left text" "$cmd -R" +run_test "flush-left justification" "$cmd -l" +run_test "flush-right justification" "$cmd -r" +run_test "center justification" "$cmd -c" +run_test "kerning mode" "$cmd -k" +run_test "full width mode" "$cmd -W" +run_test "overlap mode" "$cmd -o" +run_test "tlf2 font rendering" "$cmd -f tests/emboss" +run_test "kerning flush-left right-to-left mode" "$cmd -klR" +run_test "kerning centered right-to-left mode (slant)" "$cmd -kcR -f slant" +run_test "full-width flush-right right-to-left mode" "$cmd -WrR" +run_test "overlap flush-right mode (big)" "$cmd -or -f big" +run_test "tlf2 kerning flush-right mode" "$cmd -kr -f tests/emboss" +run_test "tlf2 overlap centered mode" "$cmd -oc -f tests/emboss" +run_test "tlf2 full-width flush-left right-to-left mode" \ + "$cmd -WRl -f tests/emboss" +run_test "specify font directory" \ + "X=.t;mkdir \$X;cp fonts/script.flf \$X/foo.flf;$cmd -d\$X -ffoo;rm -Rf \$X" +run_test "paragraph mode long line output" "$cmd -p -w250" +run_test "short line output" "$cmd -w5" +run_test "kerning paragraph centered mode (small)" "$cmd -kpc -fsmall" +run_test "list of control files" "ls fonts/*flc" +run_test "uskata control file" "printf 'ABCDE'|$CMD -fbanner -Cuskata" +run_test "jis0201 control file" "printf '\261\262\263\264\265'|$CMD -fbanner -Cjis0201" +run_test "right-to-left smushing with JavE font" "$cmd -f tests/flowerpower -R" + +rm -f "$OUTPUT" + +echo +if [ $result -ne 0 ]; then + echo " $fail tests failed. See $LOGFILE for result details" +else + echo " All tests passed." +fi + +exit $result diff --git a/externals/figlet/showfigfonts b/externals/figlet/showfigfonts new file mode 100755 index 0000000000..90c4d0afed --- /dev/null +++ b/externals/figlet/showfigfonts @@ -0,0 +1,55 @@ +#!/bin/sh - +# showfigfonts by Glenn Chappell +# figlet release 2.1.1 -- 25 Aug 1994 +# Based on showfigfonts by Greg Galperin , Nov 1993. +# +# Prints a list of available figlet fonts, along with a sample of each +# font. If directory is given, lists fonts in that directory; otherwise +# uses the default font directory. If word is given, prints that word +# in each font; otherwise prints the font name. +# +# Usage: showfigfonts [ -d directory ] [ word ] + +DIR=`dirname $0` +FIGLET=$DIR/figlet + +# Get figlet version +FIGLETVERSION=`$FIGLET -I1 2>/dev/null` +if [ -z "$FIGLETVERSION" ]; then + FIGLETVERSION=20000 +fi + +USAGE="Usage: `basename $0` [ -d directory ] [ word ]" + +if [ "$1" = '-d' ]; then + FONTDIR="$2" + WORD="$3" + if [ $# -gt 3 ] || [ $# -lt 2 ]; then + echo "$USAGE" + exit 1 + fi +else + WORD="$1" + if [ $# -gt 1 ]; then + echo "$USAGE" + exit 1 + fi + if [ "$FIGLETVERSION" -lt 20100 ]; then + # figlet 2.0 + FONTDIR="`$FIGLET -F | sed -e '1d' -e '3,$d' -e 's/Font directory: //'`" + else + # figlet 2.1 or later + FONTDIR="`$FIGLET -I2`" + fi +fi + +FONTLIST=`ls "$FONTDIR"/*.flf | sed 's!.*/\(.*\)\.flf$!\1!'` +for F in $FONTLIST ; do + echo "$F :" + if [ -n "$WORD" ]; then + echo "$WORD" | $FIGLET -d "$FONTDIR" -f "$F" + else + echo "$F" | $FIGLET -d "$FONTDIR" -f "$F" + fi + echo "" ; echo "" +done diff --git a/externals/figlet/showfigfonts.6 b/externals/figlet/showfigfonts.6 new file mode 100644 index 0000000000..0ec5783dff --- /dev/null +++ b/externals/figlet/showfigfonts.6 @@ -0,0 +1,67 @@ +.\" showfigfonts by Glenn Chappell +.\" figlet release 2.1.1 -- 25 Aug 1994 +.\" Based on showfigfonts by Greg Galperin , Nov 1993. +.\" +.\" Prints a list of available figlet fonts, along with a sample of each +.\" font. If directory is given, lists fonts in that directory; otherwise +.\" uses the default font directory. If word is given, prints that word +.\" in each font; otherwise prints the font name. +.\" +.\" Usage: showfigfonts [ -d directory ] [ word ] +.\" +.\" Manual page by Jonathon Abbott, for the Debian Project +.\" slightly modified by Francesco Tapparo, for the Debian Project +.TH SHOWFIGFONTS 6 "31 May 2012" "v2.2.5" + +.SH NAME +showfigfonts \- prints a list of available figlet fonts + +.SH SYNOPSIS +.B showfigfonts +[ +.B \-d +.I directory +] +[ +.I word +] + +.SH "DESCRIPTION" +Prints a list of available figlet fonts, along with a sample of each +font. If directory is given, lists fonts in that directory; otherwise +uses the default font directory. If word is given, prints that word +in each font; otherwise prints the font name. + +.SH EXAMPLES +To use +.B showfigfonts +with its default settings, simply type +.RS + +.B example% showfigfonts + +.RE + +To print all the fonts in /usr/share/fonts/figlet +.RS + +.B example% showfigfonts -d /usr/share/fonts/figlet + +.RE + +To print the word foo using all available fonts +.RS + +.B example% showfigfonts foo + +.RE + +.SH "AUTHORS" +showfigfonts was written by Glenn Chappell + +This manual page was written by Jonathon Abbott for the Debian Project. + +.SH "SEE ALSO" +.BR figlet (6), +.BR chkfont (6), +.BR figlist (6) diff --git a/externals/figlet/tests/emboss.tlf b/externals/figlet/tests/emboss.tlf new file mode 100644 index 0000000000..eff0852d4f --- /dev/null +++ b/externals/figlet/tests/emboss.tlf @@ -0,0 +1,325 @@ +tlf2a 3 3 8 -1 18 0 0 0 +=============================================================================== + This is emboss.tlf, or “Emboss”, by Sam Hocevar . It was +created on September 30th, 2006. + + This font is free software. It comes without any warranty, to the extent +permitted by applicable law. You can redistribute it and/or modify it under +the terms of the Do What The Fuck You Want To Public License, Version 2, +as published by Sam Hocevar. See http://sam.zoy.org/wtfpl/COPYING for more +details. + + Missing characters: # $ % , ; < > + + To create emboss2.tlf, use the following command: + $ sed '/@@/,$y/━┃┏┓┗┛/═║╔╗╚╝/' < emboss.tlf > emboss2.tlf + + This font is part of TOIlet’s official distribution. More information +on the TOIlet website at http://caca.zoy.org/wiki/toilet +=============================================================================== + @ + @ + @@ +┃! +┛! +┛!! +┛┛" + " + "" + @ + @ +#@@ + @ + @ +$@@ + @ + @ +%@@ +┏┛┃ & +┃━┏┛& +━━┛ && +┛' + ' + '' + ┛( +┃ ( + ┛(( +━ ) + ┃) +━ )) +┛ ┛* +━┏┛* +┛ ┛** + ┃ + +━┏┛+ + ┛ ++ + @ + @ +,@@ + - +━┛- + -- + . + . +┛.. + ┛/ + ┛ / +┛ // +┏━┃0 +┃┛┃0 +━━┛00 +━┃ 1 + ┃ 1 +━━┛11 +━━┃2 +┏━┛2 +━━┛22 +━━┃3 +━━┃3 +━━┛33 +┃ ┃4 +━━┃4 + ┛44 +┏━┛5 +━━┃5 +━━┛55 +┏━┛6 +┏━┃6 +━━┛66 +┏━┃7 + ┃7 + ┛77 +┏━┃8 +┏━┃8 +━━┛88 +┏━┃9 +━━┃9 +━━┛99 + : +┛: +┛:: + @ + @ +;@@ + @ + @ +<@@ + = +━━┛= +━━┛== + @ + @ +>@@ +┏━┃? + ┛? + ┛ ?? +┏━┃@ +┃┛┛@ +━━┛@@ +┏━┃A +┏━┃A +┛ ┛AA +┏━ B +┏━┃B +━━ BB +┏━┛C +┃ C +━━┛CC +┏━ D +┃ ┃D +━━ DD +┏━┛E +┏━┛E +━━┛EE +┏━┛F +┏━┛F +┛ FF +┏━┛G +┃ ┃G +━━┛GG +┃ ┃H +┏━┃H +┛ ┛HH +┛I +┃I +┛II + ┛J + ┃J +━┛JJ +┃ ┃K +┏┛ K +┛ ┛KK +┃ L +┃ L +━━┛LL +┏┏ M +┃┃┃M +┛┛┛MM +┏━ N +┃ ┃N +┛ ┛NN +┏━┃O +┃ ┃O +━━┛OO +┏━┃p +┏━┛P +┛ PP +┏━┃ Q +┃ ┃ Q +━━━┛QQ +┏━┃R +┏┏┛R +┛ ┛RR +┏━┛S +━━┃S +━━┛SS +━┏┛T + ┃ T + ┛ TT +┃ ┃U +┃ ┃U +━━┛UU +┃ ┃V +┃ ┃V + ┛ VV +┃┃┃W +┃┃┃W +━━┛WW +┃ ┃X + ┛ X +┛ ┛XX +┃ ┃Y +━┏┛Y + ┛ YY +━━┃Z +┏┛ Z +━━┛ZZ +┏┛[ +┃ [ +━┛[[ +┛ \ + ┛ \ + ┛\\ +━┃] + ┃] +━┛]] + ┛ ^ +┛ ┛^ + ^^ + _ + _ +━━┛__ +┛ ` + ┛` + `` +┏━┃a +┏━┃a +┛ ┛aa +┏━ b +┏━┃b +━━ bb +┏━┛c +┃ c +━━┛cc +┏━ d +┃ ┃d +━━ dd +┏━┛e +┏━┛e +━━┛ee +┏━┛f +┏━┛f +┛ ff +┏━┛g +┃ ┃g +━━┛gg +┃ ┃h +┏━┃h +┛ ┛hh +┛i +┃i +┛ii + ┛j + ┃j +━┛jj +┃ ┃k +┏┛ k +┛ ┛kk +┃ l +┃ l +━━┛ll +┏┏ m +┃┃┃m +┛┛┛mm +┏━ n +┃ ┃n +┛ ┛nn +┏━┃o +┃ ┃o +━━┛oo +┏━┃p +┏━┛p +┛ pp +┏━┃ q +┃ ┃ q +━━━┛qq +┏━┃r +┏┏┛r +┛ ┛rr +┏━┛s +━━┃s +━━┛ss +━┏┛t + ┃ t + ┛ tt +┃ ┃u +┃ ┃u +━━┛uu +┃ ┃v +┃ ┃v + ┛ vv +┃┃┃w +┃┃┃w +━━┛ww +┃ ┃x + ┛ x +┛ ┛xx +┃ ┃y +━┏┛y + ┛ yy +━━┃z +┏┛ z +━━┛zz + ┏┛{ +━┃ { + ━┛{{ +┃| +┃| +┛|| +━┃ } + ┏┛} +━┛ }} + ┛ ┛~ +┛ ┛ ~ + ~~ +┏━┃┏━┛Ä +┏━┃┏━┛Ä +┛ ┛━━┛ÄÄ +┏━┃┏━┛Ö +┃ ┃┏━┛Ö +━━┛━━┛ÖÖ +┃ ┃┏━┛Ü +┃ ┃┏━┛Ü +━━┛━━┛ÜÜ +┏━┃┏━┛ä +┏━┃┏━┛ä +┛ ┛━━┛ää +┏━┃┏━┛ö +┃ ┃┏━┛ö +━━┛━━┛öö +┃ ┃┏━┛ü +┃ ┃┏━┛ü +━━┛━━┛üü +┏━┛┏━┛ß +━━┃━━┃ß +━━┛━━┛ßß diff --git a/externals/figlet/tests/flowerpower.flf b/externals/figlet/tests/flowerpower.flf new file mode 100644 index 0000000000..3f294fb374 Binary files /dev/null and b/externals/figlet/tests/flowerpower.flf differ diff --git a/externals/figlet/tests/input.txt b/externals/figlet/tests/input.txt new file mode 100644 index 0000000000..8826520227 --- /dev/null +++ b/externals/figlet/tests/input.txt @@ -0,0 +1,7 @@ + joshk@influx:/etc/logrotate.d> sh -n * + apache: line 14: syntax error near unexpected token `}' + apache: line 14: `}' + the plot thickens + those aren't shell scripts + this wasn't chicken. + -- in #debian-devel diff --git a/externals/figlet/tests/longtext.txt b/externals/figlet/tests/longtext.txt new file mode 100644 index 0000000000..72e3a18209 --- /dev/null +++ b/externals/figlet/tests/longtext.txt @@ -0,0 +1,14 @@ + What is involved in such [close] relationships is a form of emotional +chemistry, so far unexplained by any school of psychiatry I am aware of, that +conditions nothing so simple as a choice between the poles of attraction and +repulsion. You can meet some people thirty, forty times down the years, and +they remain amiable bystanders, like the shore lights of towns that a sailor +passes at stated times but never calls at on the regular run. Conversely, +all considerations of sex aside, you can meet some other people once or twice +and they remain permanent influences on your life. + Everyone is aware of this discrepancy between the acquaintance seen +as familiar wallpaper or instant friend. The chemical action it entails is +less worth analyzing than enjoying. At any rate, these six pieces are about +men with whom I felt an immediate sympat - to use a coining of Max Beerbohm's +more satisfactory to me than the opaque vogue word "empathy". + -- Alistair Cooke, "Six Men" diff --git a/externals/figlet/tests/res001.txt b/externals/figlet/tests/res001.txt new file mode 100644 index 0000000000..a85fa59528 --- /dev/null +++ b/externals/figlet/tests/res001.txt @@ -0,0 +1,148 @@ +banner : + +##### ## # # # # ###### ##### +# # # # ## # ## # # # # +##### # # # # # # # # ##### # # +# # ###### # # # # # # # ##### +# # # # # ## # ## # # # +##### # # # # # # ###### # # + + + +big : + _ _ +| | (_) +| |__ _ __ _ +| '_ \| |/ _` | +| |_) | | (_| | +|_.__/|_|\__, | + __/ | + |___/ + + +block : + +_| _| _| +_|_|_| _| _|_| _|_|_| _| _| +_| _| _| _| _| _| _|_| +_| _| _| _| _| _| _| _| +_|_|_| _| _|_| _|_|_| _| _| + + + + +bubble : + _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ +( b | u | b | b | l | e ) + \_/ \_/ \_/ \_/ \_/ \_/ + + +digital : ++-+-+-+-+-+-+-+ +|d|i|g|i|t|a|l| ++-+-+-+-+-+-+-+ + + +ivrit : + _ _ _ + | |_(_)_ ____ _(_) + | __| | '__\ \ / / | + | |_| | | \ V /| | + \__|_|_| \_/ |_| + + + +lean : + + _/ + _/ _/_/ _/_/_/ _/_/_/ + _/ _/_/_/_/ _/ _/ _/ _/ + _/ _/ _/ _/ _/ _/ +_/ _/_/_/ _/_/_/ _/ _/ + + + + +mini : + +._ _ o._ o +| | ||| || + + + +mnemonic : +mnemonic + + +script : + + o + , __ ,_ _ _|_ +/ \_/ / | | |/ \_| + \/ \___/ |_/|_/|__/ |_/ + /| + \| + + +shadow : + | | + __| __ \ _` | _` | _ \\ \ \ / +\__ \ | | | ( | ( | ( |\ \ \ / +____/_| |_|\__,_|\__,_|\___/ \_/\_/ + + + +slant : + __ __ + _____/ /___ _____ / /_ + / ___/ / __ `/ __ \/ __/ + (__ ) / /_/ / / / / /_ +/____/_/\__,_/_/ /_/\__/ + + + +small : + _ _ + ____ __ __ _| | | +(_-< ' \/ _` | | | +/__/_|_|_\__,_|_|_| + + + +smscript : + + , , _ ,_ o _|_ +/ \_/|/|/| / \_/ / | | |/\_| + \/ | | |_/ \/ \__/ |/|/|_/ |_/ + (| + + +smshadow : + | | +(_-< ` \ (_-< \ _` | _` | _ \\ \ \ / +___/_|_|_|___/_| _|\__,_|\__,_|\___/ \_/\_/ + + + +smslant : + __ __ + ___ __ _ ___ / /__ ____ / /_ + (_- > + \ \| | (_) \__ \ | | | < / / + \_\ |\___/|___/_| |_|_|\_\/_/ + _/ | + |__/ + _ _ _ _ __ _ __ _ + (_) | | | | ____ (_) / _| | _ / / | | + _ ___ ___| |__ | | __/ __ \ _ _ __ | |_| |_ ___ _(_) / /__| |_ ___ + | |/ _ \/ __| '_ \| |/ / / _` | | '_ \| _| | | | \ \/ / / / _ \ __/ __| + | | (_) \__ \ | | | < | (_| | | | | | | | | |_| |> < _ / / __/ || (__ + | |\___/|___/_| |_|_|\_\ \__,_|_|_| |_|_| |_|\__,_/_/\_(_)_/ \___|\__\___| + _/ | \____/ +|__/ + ___ _ _ ___ _ + / / | | | | | | \ \ | | + / /| | ___ __ _ _ __ ___ | |_ __ _| |_ ___ __| |\ \ ___| |__ + / / | |/ _ \ / _` | '__/ _ \| __/ _` | __/ _ \ / _` | > > / __| '_ \ + / / | | (_) | (_| | | | (_) | || (_| | || __/| (_| |/ / \__ \ | | | +/_/ |_|\___/ \__, |_| \___/ \__\__,_|\__\___(_)__,_/_/ |___/_| |_| + __/ | + |___/ + _ + /\| |/\ + ______ _ __ \ ` ' / +|______| '_ \ |_ _| + | | | | / , . \ + |_| |_| \/|_|\/ + + + ___ _ _ __ _ + / (_) | | | | \ \ | | _ + / / _ ___ ___| |__ | | __ \ \ __ _ _ __ __ _ ___| |__ ___(_) +< < | |/ _ \/ __| '_ \| |/ / > > / _` | '_ \ / _` |/ __| '_ \ / _ \ + \ \| | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ + \_\ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + _/ | | | + |__/ |_| + _ _ __ _ _ _ +| (_) /_ | || | _ | | +| |_ _ __ ___ | | || |_(_) ___ _ _ _ __ | |_ __ ___ __ +| | | '_ \ / _ \ | |__ _| / __| | | | '_ \| __/ _` \ \/ / +| | | | | | __/ | | | | _ \__ \ |_| | | | | || (_| |> < +|_|_|_| |_|\___| |_| |_| (_) |___/\__, |_| |_|\__\__,_/_/\_\ + __/ | + |___/ + + + ___ _ __ _ __ ___ _ __ _ __ ___ __ _ _ __ + / _ \ '__| '__/ _ \| '__| | '_ \ / _ \/ _` | '__| +| __/ | | | | (_) | | | | | | __/ (_| | | + \___|_| |_| \___/|_| |_| |_|\___|\__,_|_| + + + _ _ _ _ + | | | | | | | | + _ _ _ __ _____ ___ __ ___ ___| |_ ___ __| | | |_ ___ | | _____ _ __ +| | | | '_ \ / _ \ \/ / '_ \ / _ \/ __| __/ _ \/ _` | | __/ _ \| |/ / _ \ '_ \ +| |_| | | | | __/> <| |_) | __/ (__| || __/ (_| | | || (_) | < __/ | | | + \__,_|_| |_|\___/_/\_\ .__/ \___|\___|\__\___|\__,_| \__\___/|_|\_\___|_| |_| + | | + |_| + ___ _ +( ) \ ( ) + \|| ||/ + \ \ + / / + | | + /_/ + + ___ _ _ __ _ + / (_) | | | | \ \ | | _ + / / _ ___ ___| |__ | | __ \ \ __ _ _ __ __ _ ___| |__ ___(_) +< < | |/ _ \/ __| '_ \| |/ / > > / _` | '_ \ / _` |/ __| '_ \ / _ \ + \ \| | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ + \_\ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + _/ | | | + |__/ |_| + _ _ __ _ _ ___ _ +| (_) /_ | || | _ ( ) \ ( ) +| |_ _ __ ___ | | || |_(_) \|| ||/ +| | | '_ \ / _ \ | |__ _| \ \ +| | | | | | __/ | | | | _ / / +|_|_|_| |_|\___| |_| |_| (_) | | + /_/ + + ___ _ _ __ _ _ _ _ + / (_) | | | | \ \ | | | | | | | | + / / _ ___ ___| |__ | | __ \ \ | |_| |__ ___ _ __ | | ___ | |_ +< < | |/ _ \/ __| '_ \| |/ / > > | __| '_ \ / _ \ | '_ \| |/ _ \| __| + \ \| | (_) \__ \ | | | < / / | |_| | | | __/ | |_) | | (_) | |_ + \_\ |\___/|___/_| |_|_|\_\/_/ \__|_| |_|\___| | .__/|_|\___/ \__| + _/ | | | + |__/ |_| + _ _ _ _ +| | | | (_) | | +| |_| |__ _ ___| | _____ _ __ ___ +| __| '_ \| |/ __| |/ / _ \ '_ \/ __| +| |_| | | | | (__| < __/ | | \__ \ + \__|_| |_|_|\___|_|\_\___|_| |_|___/ + + + __ __ __ _ _ ___ _ _ + / / / _|/ _(_) | | | \ \ | | | | + / / __ _ ___ _ _| |_| |_ _ ___| | __| |\ \ | |_| |__ ___ ___ ___ +< < / _` / __| | | | _| _| |/ _ \ |/ _` | > > | __| '_ \ / _ \/ __|/ _ \ + \ \ (_| \__ \ |_| | | | | | | __/ | (_| |/ / | |_| | | | (_) \__ \ __/ + \_\__,_|___/\__,_|_| |_| |_|\___|_|\__,_/_/ \__|_| |_|\___/|___/\___| + + + _ _ _ _ _ + ( ) | | | | | | + __ _ _ __ ___ _ __ |/| |_ ___| |__ ___| | | + / _` | '__/ _ \ '_ \ | __| / __| '_ \ / _ \ | | +| (_| | | | __/ | | | | |_ \__ \ | | | __/ | | + \__,_|_| \___|_| |_| \__| |___/_| |_|\___|_|_| + + + _ _ + (_) | | + ___ ___ _ __ _ _ __ | |_ ___ +/ __|/ __| '__| | '_ \| __/ __| +\__ \ (__| | | | |_) | |_\__ \ +|___/\___|_| |_| .__/ \__|___/ + | | + |_| + __ _ _ __ _ _ _ + / / (_) | | \ \ | | | | (_) + / / ___ _ __ _ ___| |__ \ \ | |_| |__ _ ___ +< < / _ \ '__| |/ __| '_ \ > > | __| '_ \| / __| + \ \ __/ | | | (__| | | |/ / | |_| | | | \__ \ + \_\___|_| |_|\___|_| |_/_/ \__|_| |_|_|___/ + + + _ _ _ _ _ + ( ) | | | (_) | | +__ ____ _ ___ _ __ |/| |_ ___| |__ _ ___| | _____ _ __ +\ \ /\ / / _` / __| '_ \ | __| / __| '_ \| |/ __| |/ / _ \ '_ \ + \ V V / (_| \__ \ | | | | |_ | (__| | | | | (__| < __/ | | |_ + \_/\_/ \__,_|___/_| |_| \__| \___|_| |_|_|\___|_|\_\___|_| |_(_) + + + _ + (_) + ______ ______ _ _ __ + |______|______| | | '_ \ + | | | | | + |_|_| |_| + + + _ _ _ _ _ _ _ + _| || |_ | | | | (_) | | | | +|_ __ _| __| | ___| |__ _ __ _ _ __ ______ __| | _____ _____| | + _| || |_ / _` |/ _ \ '_ \| |/ _` | '_ \______/ _` |/ _ \ \ / / _ \ | +|_ __ _| (_| | __/ |_) | | (_| | | | | | (_| | __/\ V / __/ | + |_||_| \__,_|\___|_.__/|_|\__,_|_| |_| \__,_|\___| \_/ \___|_| + + + + _| _| _| _| _| + _| _|_| _|_|_| _|_|_| _| _| _| +_| _| _| _| _|_| _| _| _|_| _| + _| _| _| _| _|_| _| _| _| _| _| + _| _| _|_| _|_|_| _| _| _| _| _| + _| + _| + + _| _| _| _|_|_|_|_| _| + _|_| _|_|_| _|_|_| _| _| _| _| _|_|_| + _| _| _| _|_| _| _| _|_| _| _|_|_| _| _| _| _| + _| _| _| _|_| _| _| _| _| _| _| _| _| _| _| _| + _| _|_| _|_|_| _| _| _| _| _| _|_|_|_| _| _| _| + _| _| +_| _|_|_|_|_|_| + + _|_| _| _| _| + _| _| _| _| _| _| _| _| _|_| _|_|_|_| _|_|_| +_|_|_|_| _| _| _| _|_| _| _|_|_|_| _| _| + _| _| _| _| _| _| _| _| _| _| + _| _| _|_|_| _| _| _| _| _|_|_| _|_| _|_|_| + + + + _| _| _| + _| _| _|_| _|_|_| _| _|_| _|_| _|_|_|_| _|_|_| + _| _| _| _| _| _| _|_| _| _| _| _| _| + _| _| _| _| _| _| _| _| _| _| _| _| +_| _| _|_| _|_|_| _| _|_| _|_| _|_|_| + _| + _|_| + + _| _| _| _| +_|_|_|_| _|_| _|_|_| _| _|_|_| _|_|_| + _| _|_|_|_| _| _| _| _|_| _| _| + _| _| _| _| _| _|_| _| _| + _|_| _|_|_| _| _|_|_| _| _|_|_| _| _| + + + + _| _| _| + _|_|_| _|_|_| +_|_|_|_|_| _| _| _|_|_|_|_| + _| _| _|_|_| + _| _| _| _| _| + + + + _| _| _| _| _| + _| _|_| _|_|_| _|_|_| _| _| _| +_| _| _| _| _|_| _| _| _|_| _| + _| _| _| _| _|_| _| _| _| _| _| + _| _| _|_| _|_|_| _| _| _| _| _| + _| + _| + + _| + _|_|_| _|_|_| _|_|_| _|_|_| _|_|_| _|_| _| +_| _| _| _| _| _| _| _| _| _|_|_|_| +_| _| _| _| _| _| _| _| _| _| + _|_|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| + _| + _| + +_| _| _| _| _| +_| _|_|_| _|_| _|_| _| _| _| +_| _| _| _| _|_|_|_| _| _|_|_|_| +_| _| _| _| _| _| _| +_| _| _| _| _|_|_| _| _| _| + + + + _| + _|_|_| _| _| _|_|_| _|_|_|_| _|_|_| _| _| +_|_| _| _| _| _| _| _| _| _|_| + _|_| _| _| _| _| _| _| _| _| _| +_|_|_| _|_|_| _| _| _|_| _|_|_| _| _| + _| + _|_| + + + _|_| _| _|_| _| _|_| _|_| _| _|_| +_|_|_|_| _|_| _|_| _| _| _|_| +_| _| _| _| _| _| + _|_|_| _| _| _|_| _| + + + + +_|_|_| _|_| _|_|_| _| _|_| +_| _| _|_|_|_| _| _| _|_| +_| _| _| _| _| _| +_| _| _|_|_| _|_|_| _| + + + + +_| _| _|_|_| _|_| _| _| _|_|_| _|_| _|_|_| +_| _| _| _| _|_|_|_| _|_| _| _| _|_|_|_| _| +_| _| _| _| _| _| _| _| _| _| _| + _|_|_| _| _| _|_|_| _| _| _|_|_| _|_|_| _|_|_| + _| + _| + + _| _| +_|_|_|_| _|_| _|_|_| + _| _|_|_|_| _| _| + _| _| _| _| + _|_| _|_|_| _|_|_| + + + _| _| _| + _| _| _| _| _| +_|_|_|_| _|_| _| _| _|_| _|_|_| _| + _| _| _| _|_| _|_|_|_| _| _| _| + _| _| _| _| _| _| _| _| _| + _|_| _|_| _| _| _|_|_| _| _| _| + _| + + + _| _| _| _| _| + _| _|_| _|_|_| _|_|_| _| _| _| +_| _| _| _| _|_| _| _| _|_| _| + _| _| _| _| _|_| _| _| _| _| _| + _| _| _|_| _|_|_| _| _| _| _| _| + _| + _| + + _| + _|_|_| _|_|_| _|_|_| _|_|_| _|_|_| _|_| _| +_| _| _| _| _| _| _| _| _| _|_|_|_| +_| _| _| _| _| _| _| _| _| _| + _|_|_| _|_|_| _|_|_| _|_|_| _| _| _|_|_| _| + _| + _| + _| _| _| +_| _| _| _| _| _| _| _| +_| _|_|_| _|_| _|_| _| _| _| _| +_| _| _| _| _|_|_|_| _| _|_|_|_| _| +_| _| _| _| _| _| _| _| +_| _| _| _| _|_|_| _| _| _| _| + _| + + + _| _| _| _| _| + _| _|_| _|_|_| _|_|_| _| _| _| +_| _| _| _| _|_| _| _| _|_| _| + _| _| _| _| _|_| _| _| _| _| _| + _| _| _|_| _|_|_| _| _| _| _| _| + _| + _| + + _| _| _| _| +_|_|_|_| _|_|_| _|_| _|_|_| _| _|_| _|_|_|_| + _| _| _| _|_|_|_| _| _| _| _| _| _| + _| _| _| _| _| _| _| _| _| _| + _|_| _| _| _|_|_| _|_|_| _| _|_| _|_| + _| + _| + + _| _| _| _| +_|_|_|_| _|_|_| _|_|_| _| _| _|_| _|_|_| _|_|_| + _| _| _| _| _| _|_| _|_|_|_| _| _| _|_| + _| _| _| _| _| _| _| _| _| _| _|_| + _|_| _| _| _| _|_|_| _| _| _|_|_| _| _| _|_|_| + + + + _| _|_| _|_| _| _| + _| _|_|_| _|_|_| _| _| _| _| _|_| _| +_| _| _| _|_| _| _| _|_|_|_| _|_|_|_| _| _|_|_|_| _| + _| _| _| _|_| _| _| _| _| _| _| _| + _| _|_|_| _|_|_| _|_|_| _| _| _| _|_|_| _| + + + + _| _| _| _| + _|_|_| _| _|_|_|_| _|_|_| _|_| _|_|_| _|_| +_| _| _| _| _| _| _| _| _|_| _|_|_|_| +_| _| _| _| _| _| _| _| _|_| _| + _|_|_| _| _|_| _| _| _|_| _|_|_| _|_|_| + + + _| + _| _| + _|_|_| _| _|_| _|_| _|_|_| _|_|_|_| +_| _| _|_| _|_|_|_| _| _| _| +_| _| _| _| _| _| _| + _|_|_| _| _|_|_| _| _| _|_| + + + + _| _| _| + _|_|_| _|_|_| _|_| _| _| +_|_| _| _| _|_|_|_| _| _| + _|_| _| _| _| _| _| +_|_|_| _| _| _|_|_| _| _| + + + + _| _| + _|_|_| _|_|_| _| _|_| _|_|_| _|_|_|_| _|_|_| +_|_| _| _|_| _| _| _| _| _|_| + _|_| _| _| _| _| _| _| _|_| +_|_|_| _|_|_| _| _| _|_|_| _|_| _|_|_| + _| + _| + + _| _| _| _| + _| _|_| _| _|_| _|_|_| _|_|_| _| +_| _|_|_|_| _|_| _| _| _| _| _| + _| _| _| _| _| _| _| _| + _| _|_|_| _| _| _|_|_| _| _| _| + + + + _| _| _| +_|_|_|_| _|_|_| _|_|_| + _| _| _| _| _|_| + _| _| _| _| _|_| + _|_| _| _| _| _|_|_| + + + _| + _| _| +_| _| _| _|_|_| _|_|_| _|_|_| _|_|_|_| +_| _| _| _| _| _|_| _| _| _| + _| _| _| _| _| _| _|_| _| _| _| + _| _| _|_|_| _|_|_| _| _| _|_| + + + + _| _| _| + _|_|_| _|_|_| _|_|_| _| _| _|_| _|_|_| +_| _| _| _| _| _|_| _|_|_|_| _| _| +_| _| _| _| _| _| _| _| _| _| + _|_|_| _| _| _| _|_|_| _| _| _|_|_| _| _| _| + + + + + + _|_|_|_|_| + + + + + + _| + _|_|_| +_|_|_|_|_| _| _| _| + _| _| _| + _| _| _| + + + + _| _| _| _| _| +_|_|_|_|_| _|_|_| _|_| _|_|_| _|_|_| _|_|_| + _| _| _| _| _|_|_|_| _| _| _| _| _| _| _| _|_|_|_|_| +_|_|_|_|_| _| _| _| _| _| _| _| _| _| _| + _| _| _|_|_| _|_|_| _|_|_| _| _|_|_| _| _| + + + + _| _| + _|_|_| _|_| _| _| _|_| _| +_| _| _|_|_|_| _| _| _|_|_|_| _| +_| _| _| _| _| _| _| + _|_|_| _|_|_| _| _|_|_| _| + + + _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ +( < | j | o | s | h | k | > ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +( j | o | s | h | k | @ | i | n | f | l | u | x | : | / | e | t | c | / | l ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +( o | g | r | o | t | a | t | e | . | d | > ) ( s | h ) ( - | n ) ( * ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +( < | j | o | s | h | k | > ) ( a | p | a | c | h | e | : ) ( l | i | n | e ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +( 1 | 4 | : ) ( s | y | n | t | a | x ) ( e | r | r | o | r ) ( n | e | a | r ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +( u | n | e | x | p | e | c | t | e | d ) ( t | o | k | e | n ) ( ` | } | ' ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +( < | j | o | s | h | k | > ) ( a | p | a | c | h | e | : ) ( l | i | n | e ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ +( 1 | 4 | : ) ( ` | } | ' ) + \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +( < | j | o | s | h | k | > ) ( t | h | e ) ( p | l | o | t ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ +( t | h | i | c | k | e | n | s ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +( < | a | s | u | f | f | i | e | l | d | > ) ( t | h | o | s | e ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +( a | r | e | n | ' | t ) ( s | h | e | l | l ) ( s | c | r | i | p | t | s ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +( < | e | r | i | c | h | > ) ( t | h | i | s ) ( w | a | s | n | ' | t ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ +( c | h | i | c | k | e | n | . ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ + _ _ _ _ + / \ / \ / \ / \ + ( - | - ) ( i | n ) + \_/ \_/ \_/ \_/ + _ _ _ _ _ _ _ _ _ _ _ _ _ + / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +( # | d | e | b | i | a | n | - | d | e | v | e | l ) + \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ ++-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|<|j|o|s|h|k|>| |j|o|s|h|k|@|i|n|f|l|u|x|:|/|e|t|c|/|l|o|g|r|o|t|a|t|e|.|d|>| ++-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++-+-+ +-+-+ +-+ +|s|h| |-|n| |*| ++-+-+ +-+-+ +-+ ++-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+ +-+-+-+-+ +-+-+-+ +-+-+-+-+-+-+ +-+-+-+-+-+ +|<|j|o|s|h|k|>| |a|p|a|c|h|e|:| |l|i|n|e| |1|4|:| |s|y|n|t|a|x| |e|r|r|o|r| ++-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+ +-+-+-+-+ +-+-+-+ +-+-+-+-+-+-+ +-+-+-+-+-+ ++-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+ +|n|e|a|r| |u|n|e|x|p|e|c|t|e|d| |t|o|k|e|n| |`|}|'| ++-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+ ++-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+ +-+-+-+-+ +-+-+-+ +-+-+-+ +|<|j|o|s|h|k|>| |a|p|a|c|h|e|:| |l|i|n|e| |1|4|:| |`|}|'| ++-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+ +-+-+-+-+ +-+-+-+ +-+-+-+ ++-+-+-+-+-+-+-+ +-+-+-+ +-+-+-+-+ +-+-+-+-+-+-+-+-+ +|<|j|o|s|h|k|>| |t|h|e| |p|l|o|t| |t|h|i|c|k|e|n|s| ++-+-+-+-+-+-+-+ +-+-+-+ +-+-+-+-+ +-+-+-+-+-+-+-+-+ ++-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+-+ +|<|a|s|u|f|f|i|e|l|d|>| |t|h|o|s|e| |a|r|e|n|'|t| |s|h|e|l|l| |s|c|r|i|p|t|s| ++-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+ +-+-+-+-+-+ +-+-+-+-+-+-+-+ ++-+-+-+-+-+-+-+ +-+-+-+-+ +-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +|<|e|r|i|c|h|>| |t|h|i|s| |w|a|s|n|'|t| |c|h|i|c|k|e|n|.| ++-+-+-+-+-+-+-+ +-+-+-+-+ +-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ + +-+-+ +-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+ + |-|-| |i|n| |#|d|e|b|i|a|n|-|d|e|v|e|l| + +-+-+ +-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+ + __ _ _ _ __ + \ \| | _| |__ ___ ___ (_)/ / + \ \ |/ / '_ \/ __|/ _ \| / / + / / <| | | \__ \ (_) | \ \ + /_/|_|\_\_| |_|___/\___// |\_\ + |__/ + _ __ _ __ _ ____ _ _ _ + ___| |_ ___ / /__ ___ _| |/ _|_ __ (_) / __ \| | _| |__ ___ ___ (_) + / __| __/ _ \ / (_) \/ / | | | | |_| '_ \| |/ / _` | |/ / '_ \/ __|/ _ \| | + | (__| || __// / _ > <| |_| | | _| | | | | | (_| | <| | | \__ \ (_) | | + \___|\__\___/_/ (_)_/\_\\__,_|_|_| |_| |_|_|\ \__,_|_|\_\_| |_|___/\___// | + \____/ |__/ + _ __ _ _ _ _ __ + | |__ ___ \ \ __| | ___| |_ __ _| |_ ___ _ __ __ _ ___ | | / / + | '_ \/ __| \ \/ _` | / _ \ __/ _` | __/ _ \| '__/ _` |/ _ \| | / / + | | | \__ \ / / (_| || __/ || (_| | || (_) | | | (_| | (_) | |/ / + |_| |_|___/ /_/ \__,_(_)___|\__\__,_|\__\___/|_| \__, |\___/|_/_/ + |___/ + + __/\__ _ __ + \ / | '_ \ _____ + /_ _\ | | | |_____| + \/ |_| |_| + + _ __ _ _ _ __ + _ ___| |__ ___ __ _ _ __ __ _ \ \| | _| |__ ___ ___ (_)/ / + (_) _ \ '_ \ / __/ _` | '_ \ / _` | \ \ |/ / '_ \/ __|/ _ \| / / + | __/ | | | (_| (_| | |_) | (_| | / / <| | | \__ \ (_) | \ \ + (_)___|_| |_|\___\__,_| .__/ \__,_| /_/|_|\_\_| |_|___/\___// |\_\ + |_| |__/ + _ _ _ _ _ _ + __ ____ _| |_ _ __ _ _ ___ _| || | / | ___ _ __ (_) | + \ \/ / _` | __| '_ \| | | / __| (_) || |_| | / _ \ '_ \| | | + > < (_| | |_| | | | |_| \__ \ _|__ _| | | __/ | | | | | + /_/\_\__,_|\__|_| |_|\__, |___/ (_) |_| |_| \___|_| |_|_|_| + |___/ + + _ __ __ _ ___ _ __ _ __ ___ _ __ _ __ ___ + | '__/ _` |/ _ \ '_ \ | '__/ _ \| '__| '__/ _ \ + | | | (_| | __/ | | | | | | (_) | | | | | __/ + |_| \__,_|\___|_| |_| |_| \___/|_| |_| \___| + + _ _ _ _ + _ __ ___| | _____ | |_ __| | ___| |_ ___ ___ _ ____ _____ _ __ _ _ + | '_ \ / _ \ |/ / _ \| __| / _` |/ _ \ __/ __/ _ \ '_ \ \/ / _ \ '_ \| | | | + | | | | __/ < (_) | |_ | (_| | __/ || (_| __/ |_) > < __/ | | | |_| | + |_| |_|\___|_|\_\___/ \__| \__,_|\___|\__\___\___| .__/_/\_\___|_| |_|\__,_| + |_| + ___ _ + ( ) \ ( ) + |/ | | \| + > > + | | + /_/ + _ __ _ _ _ __ + _ ___| |__ ___ __ _ _ __ __ _ \ \| | _| |__ ___ ___ (_)/ / + (_) _ \ '_ \ / __/ _` | '_ \ / _` | \ \ |/ / '_ \/ __|/ _ \| / / + | __/ | | | (_| (_| | |_) | (_| | / / <| | | \__ \ (_) | \ \ + (_)___|_| |_|\___\__,_| .__/ \__,_| /_/|_|\_\_| |_|___/\___// |\_\ + |_| |__/ + ___ _ _ _ _ _ _ + ( ) \ ( ) _| || | / | ___ _ __ (_) | + |/ | | \| (_) || |_| | / _ \ '_ \| | | + > > _|__ _| | | __/ | | | | | + | | (_) |_| |_| \___|_| |_|_|_| + /_/ + _ _ _ _ __ _ _ _ __ + | |_ ___ | |_ __ ___| |__ | |_ \ \| | _| |__ ___ ___ (_)/ / + | __/ _ \| | '_ \ / _ \ '_ \| __| \ \ |/ / '_ \/ __|/ _ \| / / + | || (_) | | |_) | | __/ | | | |_ / / <| | | \__ \ (_) | \ \ + \__\___/|_| .__/ \___|_| |_|\__| /_/|_|\_\_| |_|___/\___// |\_\ + |_| |__/ + _ _ _ _ + ___ _ __ ___| | _____(_) |__ | |_ + / __| '_ \ / _ \ |/ / __| | '_ \| __| + \__ \ | | | __/ < (__| | | | | |_ + |___/_| |_|\___|_|\_\___|_|_| |_|\__| + + _ _ __ _ _ _ __ __ __ + ___ ___ ___ | |__ | |_ \ \ __| | | ___(_)/ _|/ _|_ _ ___ __ _ / / + / _ \/ __|/ _ \| '_ \| __| \ \/ _` | |/ _ \ | |_| |_| | | / __|/ _` / / + | __/\__ \ (_) | | | | |_ / / (_| | | __/ | _| _| |_| \__ \ (_| \ \ + \___||___/\___/|_| |_|\__| /_/ \__,_|_|\___|_|_| |_| \__,_|___/\__,_|\_\ + + _ _ _ _ _ + | | | ___| |__ ___ | |_( )_ __ ___ _ __ __ _ + | | |/ _ \ '_ \/ __| | __|/| '_ \ / _ \ '__/ _` | + | | | __/ | | \__ \ | |_ | | | | __/ | | (_| | + |_|_|\___|_| |_|___/ \__| |_| |_|\___|_| \__,_| + + _ _ + ___| |_ _ __ (_)_ __ ___ ___ + / __| __| '_ \| | '__/ __/ __| + \__ \ |_| |_) | | | | (__\__ \ + |___/\__| .__/|_|_| \___|___/ + |_| + _ _ _ __ _ _ __ + ___(_) |__ | |_ \ \| |__ ___(_)_ __ ___ / / + / __| | '_ \| __| \ \ '_ \ / __| | '__/ _ \/ / + \__ \ | | | | |_ / / | | | (__| | | | __/\ \ + |___/_|_| |_|\__| /_/|_| |_|\___|_|_| \___| \_\ + + _ _ _ _ _ + _ __ ___| | _____(_) |__ ___ | |_( )_ __ ___ __ ___ __ + | '_ \ / _ \ |/ / __| | '_ \ / __| | __|/| '_ \/ __|/ _` \ \ /\ / / + _| | | | __/ < (__| | | | | (__ | |_ | | | \__ \ (_| |\ V V / + (_)_| |_|\___|_|\_\___|_|_| |_|\___| \__| |_| |_|___/\__,_| \_/\_/ + + _ + _ __ (_) + | '_ \| | _____ _____ + | | | | | |_____|_____| + |_| |_|_| + + _ _ _ _ _ _ _ + | | _____ _____ __| | _ __ __ _(_) |__ ___ __| |_| || |_ + | |/ _ \ \ / / _ \/ _` |_____| '_ \ / _` | | '_ \ / _ \/ _` |_ .. _| + | | __/\ V / __/ (_| |_____| | | | (_| | | |_) | __/ (_| |_ _| + |_|\___| \_/ \___|\__,_| |_| |_|\__,_|_|_.__/ \___|\__,_| |_||_| + + + _/ _/ _/ _/ _/ + _/ _/_/ _/_/_/ _/_/_/ _/ _/ _/ +_/ _/ _/ _/ _/_/ _/ _/ _/_/ _/ + _/ _/ _/ _/ _/_/ _/ _/ _/ _/ _/ + _/ _/ _/_/ _/_/_/ _/ _/ _/ _/ _/ + _/ + _/ + + _/ _/ _/ _/_/_/_/_/ _/ + _/_/ _/_/_/ _/_/_/ _/ _/ _/ _/ + _/ _/ _/ _/_/ _/ _/ _/_/ _/ _/_/_/ _/ _/ + _/ _/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ + _/ _/_/ _/_/_/ _/ _/ _/ _/ _/ _/_/_/_/ _/ + _/ _/ +_/ _/_/_/_/_/_/ + + _/_/ _/ _/ + _/_/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/_/ + _/ _/ _/_/_/_/ _/ _/ _/ _/_/ _/ _/_/_/_/ + _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ +_/ _/ _/ _/ _/_/_/ _/ _/ _/ _/ _/_/_/ + + + + _/ _/ _/ +_/_/_/_/ _/_/_/ _/ _/ _/_/ _/_/_/ _/ _/_/ _/_/ + _/ _/ _/ _/ _/ _/ _/ _/ _/_/ _/ _/ +_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ + _/_/ _/_/_/ _/ _/ _/_/ _/_/_/ _/ _/_/ + _/ + _/_/ + + _/ _/ _/ _/ +_/_/_/_/ _/_/_/ _/_/_/_/ _/_/ _/_/_/ _/ + _/ _/ _/ _/ _/_/_/_/ _/ _/ _/ +_/ _/ _/ _/ _/ _/ _/ _/ + _/_/ _/_/_/ _/_/ _/_/_/ _/ _/_/_/ _/ + + + + _/ _/ _/ _/ + _/_/_/ _/_/_/ _/_/_/ _/_/_/ + _/_/ _/ _/ _/_/_/_/_/ _/ _/ _/_/_/_/_/ + _/_/ _/ _/ _/ _/ _/_/_/ +_/_/_/ _/ _/ _/ _/ _/ _/ _/ + + + + _/ _/ _/ _/ _/ + _/ _/_/ _/_/_/ _/_/_/ _/ _/ _/ +_/ _/ _/ _/ _/_/ _/ _/ _/_/ _/ + _/ _/ _/ _/ _/_/ _/ _/ _/ _/ _/ + _/ _/ _/_/ _/_/_/ _/ _/ _/ _/ _/ + _/ + _/ + + _/ + _/_/_/ _/_/_/ _/_/_/ _/_/_/ _/_/_/ _/_/ _/ + _/ _/ _/ _/ _/ _/ _/ _/ _/ _/_/_/_/ +_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ + _/_/_/ _/_/_/ _/_/_/ _/_/_/ _/ _/ _/_/_/ _/ + _/ + _/ + + _/ _/ _/ _/ _/ + _/ _/_/_/ _/_/ _/_/ _/ _/ _/ + _/ _/ _/ _/ _/_/_/_/ _/ _/_/_/_/ + _/ _/ _/ _/ _/ _/ _/ +_/ _/ _/ _/ _/_/_/ _/ _/ _/ + + + + _/ + _/_/_/ _/ _/ _/_/_/ _/_/_/_/ _/_/_/ _/ _/ + _/_/ _/ _/ _/ _/ _/ _/ _/ _/_/ + _/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ +_/_/_/ _/_/_/ _/ _/ _/_/ _/_/_/ _/ _/ + _/ + _/_/ + + + _/_/ _/ _/_/ _/ _/_/ _/_/ _/ _/_/ + _/_/_/_/ _/_/ _/_/ _/ _/ _/_/ +_/ _/ _/ _/ _/ _/ + _/_/_/ _/ _/ _/_/ _/ + + + + + _/_/_/ _/_/ _/_/_/ _/ _/_/ + _/ _/ _/_/_/_/ _/ _/ _/_/ + _/ _/ _/ _/ _/ _/ +_/ _/ _/_/_/ _/_/_/ _/ + + + + + _/ _/ _/_/_/ _/_/ _/ _/ _/_/_/ _/_/ _/_/_/ + _/ _/ _/ _/ _/_/_/_/ _/_/ _/ _/ _/_/_/_/ _/ +_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ + _/_/_/ _/ _/ _/_/_/ _/ _/ _/_/_/ _/_/_/ _/_/_/ + _/ + _/ + + _/ _/ +_/_/_/_/ _/_/ _/_/_/ + _/ _/_/_/_/ _/ _/ +_/ _/ _/ _/ + _/_/ _/_/_/ _/_/_/ + + + _/ _/ _/ + _/ _/ _/ _/ _/ +_/_/_/_/ _/_/ _/ _/ _/_/ _/_/_/ _/ + _/ _/ _/ _/_/ _/_/_/_/ _/ _/ _/ +_/ _/ _/ _/ _/ _/ _/ _/ _/ + _/_/ _/_/ _/ _/ _/_/_/ _/ _/ _/ + _/ + + + _/ _/ _/ _/ _/ + _/ _/_/ _/_/_/ _/_/_/ _/ _/ _/ +_/ _/ _/ _/ _/_/ _/ _/ _/_/ _/ + _/ _/ _/ _/ _/_/ _/ _/ _/ _/ _/ + _/ _/ _/_/ _/_/_/ _/ _/ _/ _/ _/ + _/ + _/ + + _/ + _/_/_/ _/_/_/ _/_/_/ _/_/_/ _/_/_/ _/_/ _/ + _/ _/ _/ _/ _/ _/ _/ _/ _/ _/_/_/_/ +_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ + _/_/_/ _/_/_/ _/_/_/ _/_/_/ _/ _/ _/_/_/ _/ + _/ + _/ + + _/ _/ _/ _/ _/ + _/ _/_/_/ _/_/ _/_/ _/ _/ _/ + _/ _/ _/ _/ _/_/_/_/ _/ _/_/_/_/ + _/ _/ _/ _/ _/ _/ _/ +_/ _/ _/ _/ _/_/_/ _/ _/ _/ + + + _/ _/ _/ + _/ _/ _/ + _/ + _/ + _/ + _/ + _/ + + + _/ _/ _/ _/ _/ + _/ _/_/ _/_/_/ _/_/_/ _/ _/ _/ +_/ _/ _/ _/ _/_/ _/ _/ _/_/ _/ + _/ _/ _/ _/ _/_/ _/ _/ _/ _/ _/ + _/ _/ _/_/ _/_/_/ _/ _/ _/ _/ _/ + _/ + _/ + + _/ _/ _/ _/ +_/_/_/_/ _/_/_/ _/_/ _/_/_/ _/ _/_/ _/_/_/_/ + _/ _/ _/ _/_/_/_/ _/ _/ _/ _/ _/ _/ +_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ + _/_/ _/ _/ _/_/_/ _/_/_/ _/ _/_/ _/_/ + _/ + _/ + + _/ _/ _/ _/ +_/_/_/_/ _/_/_/ _/_/_/ _/ _/ _/_/ _/_/_/ _/_/_/ + _/ _/ _/ _/ _/ _/_/ _/_/_/_/ _/ _/ _/_/ +_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/_/ + _/_/ _/ _/ _/ _/_/_/ _/ _/ _/_/_/ _/ _/ _/_/_/ + + + + _/ _/_/ _/_/ _/ _/ + _/ _/_/_/ _/_/_/ _/ _/ _/ _/ _/_/ _/ +_/ _/ _/ _/_/ _/ _/ _/_/_/_/_/_/_/_/ _/ _/_/_/_/ _/ + _/ _/ _/ _/_/ _/ _/ _/ _/ _/ _/ _/ + _/ _/_/_/ _/_/_/ _/_/_/ _/ _/ _/ _/_/_/ _/ + + + + _/ _/ _/ _/ + _/_/_/ _/ _/_/_/_/ _/_/_/ _/_/ _/_/_/ _/_/ + _/ _/ _/ _/ _/ _/ _/ _/ _/_/ _/_/_/_/ +_/ _/ _/ _/ _/ _/ _/ _/ _/_/ _/ + _/_/_/ _/ _/_/ _/ _/ _/_/ _/_/_/ _/_/_/ + + + _/ + _/ _/ + _/_/_/ _/ _/_/ _/_/ _/_/_/ _/_/_/_/ + _/ _/ _/_/ _/_/_/_/ _/ _/ _/ +_/ _/ _/ _/ _/ _/ _/ + _/_/_/ _/ _/_/_/ _/ _/ _/_/ + + + + _/ _/ _/ + _/_/_/ _/_/_/ _/_/ _/ _/ + _/_/ _/ _/ _/_/_/_/ _/ _/ + _/_/ _/ _/ _/ _/ _/ +_/_/_/ _/ _/ _/_/_/ _/ _/ + + + + _/ _/ + _/_/_/ _/_/_/ _/ _/_/ _/_/_/ _/_/_/_/ _/_/_/ + _/_/ _/ _/_/ _/ _/ _/ _/ _/_/ + _/_/ _/ _/ _/ _/ _/ _/ _/_/ +_/_/_/ _/_/_/ _/ _/ _/_/_/ _/_/ _/_/_/ + _/ + _/ + + _/ _/ _/ _/ + _/ _/_/ _/ _/_/ _/_/_/ _/_/_/ _/ +_/ _/_/_/_/ _/_/ _/ _/ _/ _/ _/ + _/ _/ _/ _/ _/ _/ _/ _/ + _/ _/_/_/ _/ _/ _/_/_/ _/ _/ _/ + + + + _/ _/ _/ +_/_/_/_/ _/_/_/ _/_/_/ + _/ _/ _/ _/ _/_/ +_/ _/ _/ _/ _/_/ + _/_/ _/ _/ _/ _/_/_/ + + + _/ + _/ _/ + _/ _/ _/ _/_/_/ _/_/_/ _/_/_/ _/_/_/_/ +_/ _/ _/ _/ _/ _/_/ _/ _/ _/ + _/ _/ _/ _/ _/ _/ _/_/ _/ _/ _/ + _/ _/ _/_/_/ _/_/_/ _/ _/ _/_/ + + + + _/ _/ _/ + _/_/_/ _/_/_/ _/_/_/ _/ _/ _/_/ _/_/_/ + _/ _/ _/ _/ _/ _/_/ _/_/_/_/ _/ _/ +_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ + _/_/_/ _/ _/ _/ _/_/_/ _/ _/ _/_/_/ _/ _/ _/ + + + + + + + + + + + + _/ + _/_/_/ +_/_/_/_/_/ _/_/_/_/_/ _/ _/ _/ + _/ _/ _/ + _/ _/ _/ + + + + _/ _/ _/ _/ _/ + _/_/_/_/_/ _/_/_/ _/_/ _/_/_/ _/_/_/ _/_/_/ + _/ _/ _/ _/ _/_/_/_/ _/ _/ _/ _/ _/ _/ _/ +_/_/_/_/_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ + _/ _/ _/_/_/ _/_/_/ _/_/_/ _/ _/_/_/ _/ _/ + + + + _/ _/ + _/_/_/ _/_/ _/ _/ _/_/ _/ +_/_/_/_/_/ _/ _/ _/_/_/_/ _/ _/ _/_/_/_/ _/ + _/ _/ _/ _/ _/ _/ _/ + _/_/_/ _/_/_/ _/ _/_/_/ _/ + + + +/o _ _|_ | \ +\|(_)_>| ||| ||<| (|/|| || ||_|>| | +_| \__ _| + +__._ \|/ + | | /|\ + + +/o _ _|_ | \ _.._ _. _|_ _ o |o._ _ /||_|_o _ .__|_ _. _ ._.__ ._ +\|(_)_>| ||\/| ||_(_|>< (/_| |(_)| +_| | / + -. +._ _ _.._ ._ _ ._ _ __|_ _ _| _|_ _ | _ ._ \|_/ +| |(/_(_|| |_|| |(/_><|_)(/_(_ |_(/_(_| |_(_)|<(/_| | | + | -' + -. +/o _ _|_ | \ _.._ _. _|_ _ o |o._ _ /||_|_o \|_/ +\|(_)_>| ||| || +_| | + _ _ +/ _. _ _|__|_o _ | _|\ _|_|_ _ _ _ _..__ ._/_|_ _|_ _ || _ _._o.__|_ _ +\(_|_>|_|| | |(/_|(_|/ |_| |(_)_>(/_ (_||(/_| | |_ _>| |(/_|| _>(_| ||_)|__> + | + +/ _ ._o _|_ \ _|_|_ o _ _. _._/_|_ _|_ o _| _ ._ +\(/_| |(_| |/ |_| ||_> \/\/(_|_>| | |_ (_| ||(_|<(/_| |o + + + ____ o._ -|-|- _| _ |_ o _..____| _ _ | + || | -|-|-(_|(/_|_)|(_|| |(_|(/_\/(/_| + +&SPjoshk&Atinflux:/etc/logrotate.d>&SPsh&SP-n&SP* +&SPapache:&SPline&SP14:&SPsyntax&SPerror&SPnear&SPunexpected&SPtoken +&'!&!)' +&SPapache:&SPline&SP14:&SP&'!&!)' +&SPthe&SPplot&SPthickens +&SPthose&SParen't&SPshell&SPscripts +&SPthis&SPwasn't&SPchicken. +&SP&SP&SP&SP&SP&SP&SP&SP&SP&SP&SP&SP&SP&SP&SP&SP--&SPin&SP&Nbdebian-devel + _ _ + /o | | | | \ +/ __ , | | | | \ +\ | / \_/ \_|/ \ |/_) / + \|/\__/ \/ | |_/| \_// + /| + \| + _ _ _ _ + o | | | | ____ o | | | | o / + __ , | | | | / __,\ _ _ | | | | /_ _|_ __ + | / \_/ \_|/ \ |/_) | / | || / |/ | |/ |/ | | /\/ /|/ | / + |/\__/ \/ | |_/| \_/| \_/|/ |_/ | |_/|__/|__/ \_/|_/ /\_/o/ |__/|_/\___/ +/| \____/ |\ +\| |/ + _ _ + /| | | \ | | + / | | __ __, ,_ __ _|_ __, _|_ _ __| \ , | | + / |/ / \_/ | / | / \_| / | | |/ / | / / \_|/ \ +/ |__/\__/ \_/|/ |_/\__/ |_/\_/|_/|_/|__/o\_/|_// \/ | |_/ + /| + \| + + + _ _ \|/ +-----/ |/ | --*-- + | |_/ /|\ + + + _ _ _ + /o | | | | \ | | o +/ __ , | | | | \ __, _ __, __ | | _ +\ | / \_/ \_|/ \ |/_) / / | |/ \_/ | / |/ \ |/ + \|/\__/ \/ | |_/| \_// \_/|_/|__/ \_/|_/\___/| |_/|__/o + /| /| + \| \| + _ , +| | o /|| | o +| | _ _ _ ||__|_ , _ _ _|_ __, +|/ | / |/ | |/ | | / \_| | / |/ | | / | /\/ +|__/|_/ | |_/|__/ | | o \/ \_/|/ | |_/|_/\_/|_/ /\_/ + /| + \| + + + _ ,_ ,_ __ ,_ _ _ _ __, ,_ +|/ / | / | / \_/ | / |/ | |/ / | / | +|__/ |_/ |_/\__/ |_/ | |_/|__/\_/|_/ |_/ + + + _ + | | | + _ _ _ _ _ __ _|_ _ __| _|_ __ | | _ _ _ +| | / |/ | |/ /\/ |/ \_|/ / | |/ / | | / \_|/_) |/ / |/ | + \_/|_/ | |_/|__/ /\_/|__/ |__/\___/|_/|__/\_/|_/ |_/\__/ | \_/|__/ | |_/ + /| + \| +o o +\\ / + | + > + | + / + + _ _ _ + /o | | | | \ | | o +/ __ , | | | | \ __, _ __, __ | | _ +\ | / \_/ \_|/ \ |/_) / / | |/ \_/ | / |/ \ |/ + \|/\__/ \/ | |_/| \_// \_/|_/|__/ \_/|_/\___/| |_/|__/o + /| /| + \| \| + _ , o o +| | o /|| | o \\ / +| | _ _ _ ||__|_ | +|/ | / |/ | |/ | | > +|__/|_/ | |_/|__/ | | o | + / + + _ _ _ _ + /o | | | | \ | | | | +/ __ , | | | | \ _|_ | | _ _ | | __ _|_ +\ | / \_/ \_|/ \ |/_) / | |/ \ |/ |/ \_|/ / \_| + \|/\__/ \/ | |_/| \_// |_/| |_/|__/ |__/ |__/\__/ |_/ + /| /| + \| \| + _ _ + | | o | | +_|_ | | __ | | _ _ _ , + | |/ \ | / |/_) |/ / |/ | / \_ + |_/| |_/|_/\___/| \_/|__/ | |_/ \/ + + + _ _ _ _ + / | | | | o | | | \ | | +/ __, , | | | | _ | | __| \ _|_ | | __ , _ +\ / | / \_| | |/ |/ | |/ |/ / | / | |/ \ / \_/ \_|/ + \\_/|_/ \/ \_/|_/|__/|__/|_/|__/|__/\_/|_// |_/| |_/\__/ \/ |__/ + |\ |\ + |/ |/ + o _ _ _ + / | | | | | | + __, ,_ _ _ _ _|_ , | | _ | | | | +/ | / | |/ / |/ | | / \_|/ \ |/ |/ |/ +\_/|_/ |_/|__/ | |_/ |_/ \/ | |_/|__/|__/|__/ + + + + o + , __ ,_ _ _|_ , +/ \_/ / | | |/ \_| / \_ + \/ \___/ |_/|_/|__/ |_/ \/ + /| + \| + _ _ + / o | | \ | | o +/ _ ,_ __ | | \ _|_ | | , +\ |/ / | | / |/ \ / | |/ \ | / \_ + \|__/ |_/|_/\___/| |_// |_/| |_/|_/ \/ + + + o _ _ + / | | o | | + __, , _ _ _|_ __ | | __ | | _ _ _ +| | |_/ | / \_/ |/ | | / |/ \ | / |/_) |/ / |/ | + \/ \/ \_/|_/ \/ | |_/ |_/ \___/| |_/|_/\___/| \_/|__/ | |_/o + + + + o + _ _ + ---------- | / |/ | + |_/ | |_/ + + + _ _ + | | | | | o | | | +--+--+-- __| _ | | __, _ _ __| _ _ | | +--+--+--/ | |/ |/ \_| / | / |/ |-----/ | |/ | |_|/ |/ + | | \_/|_/|__/\_/ |_/\_/|_/ | |_/ \_/|_/|__/ \/ |__/|__/ + + + /_) | | \ \ + / | _ \ __| __ \ | /\ \ +\ \ | ( |\__ \ | | | < / + \_\ |\___/ ____/_| |_|_|\_\_/ + ___/ + _) | | __ \ _) _| | / | + | _ \ __| __ \ | / / _` | | __ \ | | | |\ \ /_) / _ \ __| + | ( |\__ \ | | | < | ( | | | | __| | | | ` < / __/ | + |\___/ ____/_| |_|_|\_\\ \__,_|_|_| _|_| _|\__,_| _/\_\_)_/ \___|\__| +___/ \____/ + / | | | |\ \ | + __| / | _ \ _` | __| _ \ __| _` | __| _ \ _` | \ \ __| __ \ + ( / | ( | ( | | ( | | ( | | __/ ( | / \__ \ | | | +\___|_/ _|\___/ \__, |_| \___/ \__|\__,_|\__|\___|_)\__,_| _/ ____/_| |_| + |___/ + \ + __ \ \ / +_____| | | _ _\ + _| _| \/ + + /_) | | \ \ | + / | _ \ __| __ \ | /\ \ _` | __ \ _` | __| __ \ _ \_) +\ \ | ( |\__ \ | | | < / ( | | | ( | ( | | | __/ + \_\ |\___/ ____/_| |_|_|\_\_/ \__,_| .__/ \__,_|\___|_| |_|\___|_) + ___/ _| + |_) _ | | | | + | | __ \ _ \ | | | _) __| | | __ \ __| _` |\ \ / + | | | | __/ |___ __| \__ \ | | | | | ( | ` < +_|_|_| _|\___| _| _| _) ____/\__, |_| _|\__|\__,_| _/\_\ + ____/ + + _ \ __| __| _ \ __| __ \ _ \ _` | __| + __/ | | ( | | | | __/ ( | | +\___|_| _| \___/ _| _| _|\___|\__,_|_| + + | | + | | __ \ _ \\ \ / __ \ _ \ __| __| _ \ _` | + | | | | __/ ` < | | __/ ( | __/ ( | +\__,_|_| _|\___| _/\_\ .__/ \___|\___|\__|\___|\__,_| + _| + | | )\ \ ) + __| _ \ | / _ \ __ \ \| | / + | ( | < __/ | | ` > +\__|\___/ _|\_\\___|_| _| | + _/ + /_) | | \ \ | + / | _ \ __| __ \ | /\ \ _` | __ \ _` | __| __ \ _ \_) +\ \ | ( |\__ \ | | | < / ( | | | ( | ( | | | __/ + \_\ |\___/ ____/_| |_|_|\_\_/ \__,_| .__/ \__,_|\___|_| |_|\___|_) + ___/ _| + |_) _ | | | )\ \ ) + | | __ \ _ \ | | | _) \| | / + | | | | __/ |___ __| ` > +_|_|_| _|\___| _| _| _) | + _/ + /_) | | \ \ | | | | + / | _ \ __| __ \ | /\ \ __| __ \ _ \ __ \ | _ \ __| +\ \ | ( |\__ \ | | | < / | | | | __/ | | | ( | | + \_\ |\___/ ____/_| |_|_|\_\_/ \__|_| |_|\___| .__/ _|\___/ \__| + ___/ _| + | | _) | + __| __ \ | __| | / _ \ __ \ __| + | | | | | ( < __/ | |\__ \ +\__|_| |_|_|\___|_|\_\\___|_| _|____/ + + / _| _|_) | |\ \ | | + / _` | __| | | | | | _ \ | _` | \ \ __| __ \ _ \ __| _ \ +\ \ ( |\__ \ | | __| __| | __/ | ( | / | | | | ( |\__ \ __/ + \_\\__,_|____/\__,_|_| _| _|\___|_|\__,_| _/ \__|_| |_|\___/ ____/\___| + + ) | | | | + _` | __| _ \ __ \ / __| __| __ \ _ \ | | + ( | | __/ | | | \__ \ | | | __/ | | +\__,_|_| \___|_| _| \__| ____/_| |_|\___|_|_| + + _) | + __| __| __| | __ \ __| __| +\__ \ ( | | | | | \__ \ +____/\___|_| _| .__/ \__|____/ + _| + / _) | \ \ | | _) + / _ \ __| | __| __ \ \ \ __| __ \ | __| +\ \ __/ | | ( | | | / | | | | |\__ \ + \_\\___|_| _|\___|_| |_|_/ \__|_| |_|_|____/ + + ) | | _) | +\ \ \ / _` | __| __ \ / __| __| __ \ | __| | / _ \ __ \ + \ \ \ / ( |\__ \ | | | ( | | | | ( < __/ | | + \_/\_/ \__,_|____/_| _| \__| \___|_| |_|_|\___|_|\_\\___|_| _|_) + + _) + | __ \ + _____|_____| | | | + _|_| _| + + | | | | _) | | +_ |_ |_| _` | _ \ __ \ | _` | __ \ _` | _ \\ \ / _ \ | +_ |_ |_| ( | __/ | | | ( | | |_____| ( | __/ \ \ / __/ | + _| _| \__,_|\___|_.__/ _|\__,_|_| _| \__,_|\___| \_/ \___|_| + + __ _ __ __ __ + / / (_)___ _____/ /_ / /_\ \ +/ / / / __ \/ ___/ __ \/ //_/\ \ +\ \ / / /_/ (__ ) / / / ,< / / + \_\_/ /\____/____/_/ /_/_/|_| /_/ + /___/ + _ __ __ ______ _ ______ __ __ + (_)___ _____/ /_ / /__/ ____ \(_)___ / __/ /_ ___ ___ _/_/__ / /_ + / / __ \/ ___/ __ \/ //_/ / __ `/ / __ \/ /_/ / / / / |/_(_)_/_// _ \/ __/ + / / /_/ (__ ) / / / ,< / / /_/ / / / / / __/ / /_/ /> <_ _/_/ / __/ /_ + __/ /\____/____/_/ /_/_/|_|\ \__,_/_/_/ /_/_/ /_/\__,_/_/|_(_)_/ \___/\__/ +/___/ \____/ + ____ __ __ ____ + _____ _/_/ /___ ____ __________ / /_____ _/ /____ ____/ /\ \ + / ___/_/_// / __ \/ __ `/ ___/ __ \/ __/ __ `/ __/ _ \ / __ / \ \ +/ /___/_/ / / /_/ / /_/ / / / /_/ / /_/ /_/ / /_/ __// /_/ / / / +\___/_/ /_/\____/\__, /_/ \____/\__/\__,_/\__/\___(_)__,_/ /_/ + /____/ + __ + _____/ /_ ____ __/|_ + / ___/ __ \ ______/ __ \ | / + (__ ) / / / /_____/ / / / /_ __| +/____/_/ /_/ /_/ /_/ |/ + + __ _ __ __ __ __ + / / (_)___ _____/ /_ / /_\ \ ____ _____ ____ ______/ /_ ___ _ +/ / / / __ \/ ___/ __ \/ //_/\ \ / __ `/ __ \/ __ `/ ___/ __ \/ _ \(_) +\ \ / / /_/ (__ ) / / / ,< / / / /_/ / /_/ / /_/ / /__/ / / / __/ + \_\_/ /\____/____/_/ /_/_/|_| /_/ \__,_/ .___/\__,_/\___/_/ /_/\___(_) + /___/ /_/ + ___ _____ __ __ + / (_)___ ___ < / // / _ _______ ______ / /_____ __ __ + / / / __ \/ _ \ / / // /_(_) / ___/ / / / __ \/ __/ __ `/ |/_/ + / / / / / / __/ / /__ __/ (__ ) /_/ / / / / /_/ /_/ /> < +/_/_/_/ /_/\___/ /_/ /_/ (_) /____/\__, /_/ /_/\__/\__,_/_/|_| + /____/ + + ___ ______________ _____ ____ ___ ____ ______ + / _ \/ ___/ ___/ __ \/ ___/ / __ \/ _ \/ __ `/ ___/ +/ __/ / / / / /_/ / / / / / / __/ /_/ / / +\___/_/ /_/ \____/_/ /_/ /_/\___/\__,_/_/ + + __ __ + __ ______ ___ _ ______ ___ _____/ /____ ____/ / + / / / / __ \/ _ \| |/_/ __ \/ _ \/ ___/ __/ _ \/ __ / +/ /_/ / / / / __/> _> +\__/\____/_/|_|\___/_/ /_/ _/_/ + /_/ + __ _ __ __ __ __ + / / (_)___ _____/ /_ / /_\ \ ____ _____ ____ ______/ /_ ___ _ +/ / / / __ \/ ___/ __ \/ //_/\ \ / __ `/ __ \/ __ `/ ___/ __ \/ _ \(_) +\ \ / / /_/ (__ ) / / / ,< / / / /_/ / /_/ / /_/ / /__/ / / / __/ + \_\_/ /\____/____/_/ /_/_/|_| /_/ \__,_/ .___/\__,_/\___/_/ /_/\___(_) + /___/ /_/ + ___ _____ __ _ _ _ + / (_)___ ___ < / // / _ ( )| |( ) + / / / __ \/ _ \ / / // /_(_) V / /|/ + / / / / / / __/ / /__ __/ _>_> +/_/_/_/ /_/\___/ /_/ /_/ (_) _/_/ + /_/ + __ _ __ __ __ __ __ __ __ + / / (_)___ _____/ /_ / /_\ \ / /_/ /_ ___ ____ / /___ / /_ +/ / / / __ \/ ___/ __ \/ //_/\ \ / __/ __ \/ _ \ / __ \/ / __ \/ __/ +\ \ / / /_/ (__ ) / / / ,< / / / /_/ / / / __/ / /_/ / / /_/ / /_ + \_\_/ /\____/____/_/ /_/_/|_| /_/ \__/_/ /_/\___/ / .___/_/\____/\__/ + /___/ /_/ + __ __ _ __ + / /_/ /_ (_)____/ /_____ ____ _____ + / __/ __ \/ / ___/ //_/ _ \/ __ \/ ___/ +/ /_/ / / / / /__/ ,< / __/ / / (__ ) +\__/_/ /_/_/\___/_/|_|\___/_/ /_/____/ + + __ _________ __ ____ __ __ + / / ____ ________ __/ __/ __(_)__ / /___/ /\ \ / /_/ /_ ____ ________ +/ / / __ `/ ___/ / / / /_/ /_/ / _ \/ / __ / \ \ / __/ __ \/ __ \/ ___/ _ \ +\ \/ /_/ (__ ) /_/ / __/ __/ / __/ / /_/ / / / / /_/ / / / /_/ (__ ) __/ + \_\__,_/____/\__,_/_/ /_/ /_/\___/_/\__,_/ /_/ \__/_/ /_/\____/____/\___/ + + _ __ __ ____ + ____ _________ ____ ( )/ /_ _____/ /_ ___ / / / + / __ `/ ___/ _ \/ __ \|// __/ / ___/ __ \/ _ \/ / / +/ /_/ / / / __/ / / / / /_ (__ ) / / / __/ / / +\__,_/_/ \___/_/ /_/ \__/ /____/_/ /_/\___/_/_/ + + _ __ + _______________(_)___ / /______ + / ___/ ___/ ___/ / __ \/ __/ ___/ + (__ ) /__/ / / / /_/ / /_(__ ) +/____/\___/_/ /_/ .___/\__/____/ + /_/ + __ _ ____ __ __ _ + / / ___ _____(_)____/ /\ \ / /_/ /_ (_)____ +/ / / _ \/ ___/ / ___/ __ \ \ / __/ __ \/ / ___/ +\ \/ __/ / / / /__/ / / / / / /_/ / / / (__ ) + \_\___/_/ /_/\___/_/ /_/_/ \__/_/ /_/_/____/ + + _ __ __ _ __ + _ ______ __________ ( )/ /_ _____/ /_ (_)____/ /_____ ____ +| | /| / / __ `/ ___/ __ \|// __/ / ___/ __ \/ / ___/ //_/ _ \/ __ \ +| |/ |/ / /_/ (__ ) / / / / /_ / /__/ / / / / /__/ ,< / __/ / / / +|__/|__/\__,_/____/_/ /_/ \__/ \___/_/ /_/_/\___/_/|_|\___/_/ /_(_) + + _ + (_)___ + ____________ / / __ \ + /_____/_____/ / / / / / + /_/_/ /_/ + + __ __ __ __ _ __ __ + __/ // /_____/ /__ / /_ (_)___ _____ ____/ /__ _ _____ / / + /_ _ __/ __ / _ \/ __ \/ / __ `/ __ \______/ __ / _ \ | / / _ \/ / +/_ _ __/ /_/ / __/ /_/ / / /_/ / / / /_____/ /_/ / __/ |/ / __/ / + /_//_/ \__,_/\___/_.___/_/\__,_/_/ /_/ \__,_/\___/|___/\___/_/ + + __ _ _ _ __ + / /(_)___ __| |_ | |__\ \ +< < | / _ (_-< ' \| / / > > + \_\/ \___/__/_||_|_\_\/_/ + |__/ + _ _ _ ____ _ __ _ _ __ _ ___ + (_)___ __| |_ | |__/ __ \(_)_ _ / _| |_ ___ _(_) / /__| |_ __ / / |___ + | / _ (_-< ' \| / / / _` | | ' \| _| | || \ \ /_ / / -_) _/ _|/ /| / _ \ + _/ \___/__/_||_|_\_\ \__,_|_|_||_|_| |_|\_,_/_\_(_)_/\___|\__\__/_/ |_\___/ +|__/ \____/ + _ _ ___ _ + __ _ _ _ ___| |_ __ _| |_ ___ __| \ \ __| |_ ___ _ _ _/\_ +/ _` | '_/ _ \ _/ _` | _/ -_)_/ _` |> > (_-< ' \ |___| ' \ > < +\__, |_| \___/\__\__,_|\__\___(_)__,_/_/ /__/_||_| |_||_| \/ +|___/ + __ _ _ _ __ _ _ _ _ + / /(_)___ __| |_ | |__\ \ __ _ _ __ __ _ __| |_ ___(_) | (_)_ _ ___ +< < | / _ (_-< ' \| / / > > / _` | '_ \/ _` / _| ' \/ -_)_ | | | ' \/ -_) + \_\/ \___/__/_||_|_\_\/_/ \__,_| .__/\__,_\__|_||_\___(_) |_|_|_||_\___| + |__/ |_| + _ _ _ _ _ +/ | | (_) ____ _ _ _| |_ __ ___ __ ___ _ _ _ _ ___ _ _ _ _ ___ __ _ _ _ +| |_ _| (_-< || | ' \ _/ _` \ \ / / -_) '_| '_/ _ \ '_| | ' \/ -_) _` | '_| +|_| |_(_) /__/\_, |_||_\__\__,_/_\_\ \___|_| |_| \___/_| |_||_\___\__,_|_| + |__/ + _ _ _ _ ___ _ + _ _ _ _ _____ ___ __ ___ __| |_ ___ __| | | |_ ___| |_____ _ _ ( ) \ ( ) +| || | ' \/ -_) \ / '_ \/ -_) _| _/ -_) _` | | _/ _ \ / / -_) ' \ \|| ||/ + \_,_|_||_\___/_\_\ .__/\___\__|\__\___\__,_| \__\___/_\_\___|_||_| | | + |_| /_/ + __ _ _ _ __ _ _ _ _ + / /(_)___ __| |_ | |__\ \ __ _ _ __ __ _ __| |_ ___(_) | (_)_ _ ___ +< < | / _ (_-< ' \| / / > > / _` | '_ \/ _` / _| ' \/ -_)_ | | | ' \/ -_) + \_\/ \___/__/_||_|_\_\/_/ \__,_| .__/\__,_\__|_||_\___(_) |_|_|_||_\___| + |__/ |_| + _ _ _ _ ___ _ +/ | | (_) ( ) \ ( ) +| |_ _| \|| ||/ +|_| |_(_) | | + /_/ + __ _ _ _ __ _ _ _ _ + / /(_)___ __| |_ | |__\ \ | |_| |_ ___ _ __| |___| |_ +< < | / _ (_-< ' \| / / > > | _| ' \/ -_) | '_ \ / _ \ _| + \_\/ \___/__/_||_|_\_\/_/ \__|_||_\___| | .__/_\___/\__| + |__/ |_| + _ _ _ _ +| |_| |_ (_)__| |_____ _ _ ___ +| _| ' \| / _| / / -_) ' \(_-< + \__|_||_|_\__|_\_\___|_||_/__/ + + __ __ __ _ _ ___ _ _ + / /__ _ ____ _ / _|/ _(_)___| |__| \ \ | |_| |_ ___ ___ ___ +< > | _| ' \/ _ (_- > | _| ' \| (_-< \ V V / _` (_-< ' \|/| _| + \_\___|_| |_\__|_||_/_/ \__|_||_|_/__/ \_/\_/\__,_/__/_||_| \__| + + _ _ _ + __| |_ (_)__| |_____ _ _ +/ _| ' \| / _| / / -_) ' \ _ +\__|_||_|_\__|_\_\___|_||_(_) + + _ + ___ ___ (_)_ _ + |___|___| | | ' \ + |_|_||_| + + _ _ _ _ _ _ _ + _| | |_ __| |___| |__(_)__ _ _ _ ___ __| |_____ _____| | +|_ . _/ _` / -_) '_ \ / _` | ' \___/ _` / -_) V / -_) | +|_ _\__,_\___|_.__/_\__,_|_||_| \__,_\___|\_/\___|_| + |_|_| + + /o _ , |) |) \ +< | / \_/ \_|/\ |/) > + \|/\_/ \/ | |/| \// + (| + ____ + o _ , |) |) / __,\ o |\ |\ o /__|_ _ /|\ _ _, + | / \_/ \_|/\ |/) | / | || /|/| |/ |/ | | /\/ /|/ | / / |/ / \_/ | + |/\_/ \/ | |/| \/| \_/|/ |/ | |_/|_/|_/ \/|_/ /\/o/ |_/|_/\__// |_/\_/ \/|/ +(| \____/ |) (| + + ,_ _ _|_ _, _|_ _ _| \ , |) \|/ +/ | / \_| / | | |/ / | > / \_|/\ ----/|/| --*-- + |/\_/ |_/\/|_/|_/|_/o\/|_// \/ | |/ | |_/ /|\ + + + /o _ , |) |) \ _, _, _ |) _ o |\ o _ +< | / \_/ \_|/\ |/) > / | |/\_/ | / |/\ |/ |/ | /|/| |/ + \|/\_/ \/ | |/| \// \/|_/|_/ \/|_/\__/| |/|_/o |_/|/ | |_/|_/ + (| (| + , +/|| | o , _|_ _, _ ,_ ,_ _ ,_ + ||__|_ / \_| | /|/| | / | /\/ |/ / | / | / \_/ | + | | o \/ \/|/ | |_/|_/\/|_/ /\/ |_/ |/ |/\_/ |/ + (| + + _ _, ,_ _ _ _ _|_ _ _| +/|/| |/ / | / | | | /|/| |/ /\/ |/\_|/ / | |/ / | + | |_/|_/\/|_/ |/ \/|_/ | |_/|_/ /\/|_/ |_/\__/|_/|_/\/|_/ + (| + o o +_|_ _ |) _ \\ / + | / \_|/) |/ /|/| |_ + |_/\_/ | \/|_/ | |_/ | + / + + /o _ , |) |) \ _, _, _ |) _ o |\ o _ +< | / \_/ \_|/\ |/) > / | |/\_/ | / |/\ |/ |/ | /|/| |/ + \|/\_/ \/ | |/| \// \/|_/|_/ \/|_/\__/| |/|_/o |_/|/ | |_/|_/ + (| (| + , o o +/|| | o \\ / + ||__|_ |_ + | | o | + / + + /o _ , |) |) \ _|_ |) _ |\ _ _|_ +< | / \_/ \_|/\ |/) > | |/\ |/ |/\_|/ / \_| + \|/\_/ \/ | |/| \// |_/| |/|_/ |_/ |_/\_/ |_/ + (| (| + +_|_ |) o _ |) _ , + | |/\ | / |/) |/ /|/| / \_ + |_/| |/|/\__/| \/|_/ | |_/ \/ + + + / _, , |\ |\ o _ |\ _| \ _|_ |) _ , _ +< / | / \_| | |/ |/ | |/ |/ / | > | |/\ / \_/ \_|/ + \\/|_/ \/ \/|_/|_/|_/|/|_/|_/\/|_// |_/| |/\_/ \/ |_/ + |) |) + o + _, ,_ _ /_|_ , |) _ |\ |\ , _ ,_ o _|_ , +/ | / | |/ /|/| | / \_|/\ |/ |/ |/ / \_/ / | | |/\_| / \_ +\/|_/ |/|_/ | |_/ |_/ \/ | |/|_/|_/|_/ \/ \__/ |/|/|_/ |_/ \/ + (| + o + / _ ,_ o _ |) \ _|_ |) o , _, , /_|_ +< |/ / | | / |/\ > | |/\ | / \_ | | |_/ | / \_/|/| | + \|_/ |/|/\__/| |// |_/| |/|/ \/ \/ \/ \/|_/ \/ | |_/ |_/ + + + _ |) o _ |) _ +/ |/\ | / |/) |/ /|/| +\__/| |/|/\__/| \/|_/ | |_/o + + + o + -------- | /|/| + |/ | |_/ + + +_|_|_ _| _|) o _, _| _ _ |\ +_|_|_/ | |/|/\_| / | /|/|----/ | |/ | |_|/ |/ + | | \/|_/|_/\/ |/\/|_/ | |_/ \/|_/|_/ \/ |_/|_/ + + /_) | | \ \ +< < | _ \(_-< \ | /> > + \_\ |\___/___/_| _|_\_\_/ + __/ + _) | | __ \ _) _|| _) / | /| + | _ \(_-< \ | // _` | | \ _|| | |\ \ / / -_) _| _| / | _ \ + |\___/___/_| _|_\_\\__,_|_|_| _|_| _|\_,_| _\_\_)_/\___|\__|\__|_/ _|\___/ +__/ \____/ + | | |\ \ | \ \ / + _` | _|_ \ _| _` | _| -_) _` | > > (_-< \ ____|\ _ _| +\__, |_|\___/\__|\__,_|\__|\___|_)\__,_| _/ ___/_| _| _| _| _/ _\ +____/ + /_) | | \ \ | _) |_) +< < | _ \(_-< \ | /> > _` | _ \ _` | _| \ -_) | | \ -_) + \_\ |\___/___/_| _|_\_\_/ \__,_|.__/\__,_|\__|_| _|\___|_) _|_|_| _|\___| + __/ _| +_ | | |_) | + |__ _| (_-< | | \ _| _` |\ \ / -_) _|_|_ \ _| + _| _|_) ___/\_, |_| _|\__|\__,_| _\_\ \___|_|_|\___/_| + ___/ + | | + \ -_) _` | _| | | \ -_)\ \ / _ \ -_) _| _| -_) _` | +_| _|\___|\__,_|_| \_,_|_| _|\___| _\_\.__/\___|\__|\__|\___|\__,_| + _| + | | )\ \ ) + _| _ \ | / -_) \ \| |_/ +\__|\___/_\_\\___|_| _| | + _/ + /_) | | \ \ | _) |_) +< < | _ \(_-< \ | /> > _` | _ \ _` | _| \ -_) | | \ -_) + \_\ |\___/___/_| _|_\_\_/ \__,_|.__/\__,_|\__|_| _|\___|_) _|_|_| _|\___| + __/ _| +_ | | |_) )\ \ ) + |__ _| \| |_/ + _| _|_) | + _/ + /_) | | \ \ | | | | +< < | _ \(_-< \ | /> > _| \ -_) _ \ | _ \ _| + \_\ |\___/___/_| _|_\_\_/ \__|_| _|\___| .__/_|\___/\__| + __/ _| + | | _) | + _| \ | _| | / -_) \ (_-< +\__|_| _|_|\__|_\_\\___|_| _|___/ + + / _|_|_) | |\ \ | | +< < _` |(_-< | | _|_| | -_) | _` | > > _| \ _ \(_-< -_) + \_\\__,_|___/\_,_|_|_| _|\___|_|\__,_| _/ \__|_| _|\___/___/\___| + + )| | | | _) | + _` | _|-_) \/ _| (_-< \ -_) | | (_-< _| _|| _ \ _|(_-< +\__,_|_|\___|_| _|\__| ___/_| _|\___|_|_| ___/\__|_| _|.__/\__|___/ + _| + / _) | \ \ | | _) )| +< < -_) _|| _| \ > > _| \ |(_-< \ \ \ / _` |(_-< \/ _| + \_\\___|_| _|\__|_| _|_/ \__|_| _|_|___/ \_/\_/\__,_|___/_| _|\__| + + | _) | + _| \ | _| | / -_) \ +\__|_| _|_|\__|_\_\\___|_| _|_) + + _) + ____|____| | \ + _|_| _| + + | | | | _) | | +_ |_ |_| _` | -_) _ \ | _` | \____|_` | -_)\ \ / -_) | +_ |_ |_|\__,_|\___|_.__/_|\__,_|_| _| \__,_|\___| \_/\___|_| + _| _| + __ _ __ __ __ + / / (_)__ ___ / / / /_\ \ +< < / / _ \(_- > + \_\_/ /\___/___/_//_/_/\_\/_/ + |___/ + _ __ __ _____ _ _____ _ __ __ __ + (_)__ ___ / / / /__/ ___ \(_)__ / _/ /_ ____ __(_)_/_/__ / /_____ _/_/ + / / _ \(_- > (_- _< +/_/\___/\_, /_/ \___/\__/\_,_/\__/\__(_)_,_/ /_/ /___/_//_/ /_//_/ |/ + /___/ + __ _ __ __ __ __ _ ___ + / / (_)__ ___ / / / /_\ \ ___ ____ ___ _____/ / ___ (_) / (_)__ ___ +< < / / _ \(_- > / _ `/ _ \/ _ `/ __/ _ \/ -_) / / / _ \/ -_) + \_\_/ /\___/___/_//_/_/\_\/_/ \_,_/ .__/\_,_/\__/_//_/\__(_) /_/_/_//_/\__/ + |___/ /_/ + _______ _ __ + < / / /(_) ___ __ _____ / /____ ___ __ ___ ___________ ____ + / /_ _/ (_- > / _ `/ _ \/ _ `/ __/ _ \/ -_) / / / _ \/ -_) + \_\_/ /\___/___/_//_/_/\_\/_/ \_,_/ .__/\_,_/\__/_//_/\__(_) /_/_/_//_/\__/ + |___/ /_/ + _______ _ _ __ _ + < / / /(_) ( )\ \( ) + / /_ _/ V / /|/ +/_/ /_/(_) _/_/ + /_/ + __ _ __ __ __ __ __ __ __ + / / (_)__ ___ / / / /_\ \ / /_/ / ___ ___ / /__ / /_ +< < / / _ \(_- > / __/ _ \/ -_) / _ \/ / _ \/ __/ + \_\_/ /\___/___/_//_/_/\_\/_/ \__/_//_/\__/ / .__/_/\___/\__/ + |___/ /_/ + __ __ _ __ + / /_/ / (_)___/ /_____ ___ ___ +/ __/ _ \/ / __/ '_/ -_) _ \(_-< +\__/_//_/_/\__/_/\_\\__/_//_/___/ + + __ _______ __ ____ __ __ + / /___ ____ __ __/ _/ _(_)__ / /__/ /\ \ / /_/ / ___ ___ ___ +< > / __/ _ \/ _ \(_- > / __/ _ \/ (_-< | |/|/ / _ `(_- < _ / / __/ || (__ + _/ |\___/|___/_| |_|_|\_\ \__,_|_|_| |_|_| |_|\__,_/_/\_(_)_/ \___|\__\___| +|__/ \____/ + ___ _ _ ___ _ + / / | ___ __ _ _ __ ___ | |_ __ _| |_ ___ __| \ \ ___| |__ + / /| |/ _ \ / _` | '__/ _ \| __/ _` | __/ _ \ / _` |\ \ / __| '_ \ + / / | | (_) | (_| | | | (_) | || (_| | || __/| (_| |/ / \__ \ | | | +/_/ |_|\___/ \__, |_| \___/ \__\__,_|\__\___(_)__,_/_/ |___/_| |_| + |___/ + + _ __ __/\__ + _____| '_ \ \ / +|_____| | | | /_ _\ + |_| |_| \/ + + __ _ _ _ __ _ + / /(_) ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___ _ +/ / | |/ _ \/ __| '_ \| |/ / \ \ / _` | '_ \ / _` |/ __| '_ \ / _ (_) +\ \ | | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + |__/ |_| + _ _ _ _ _ _ +| (_)_ __ ___ / | || | _ ___ _ _ _ __ | |_ __ ___ __ +| | | '_ \ / _ \ | | || |(_) / __| | | | '_ \| __/ _` \ \/ / +| | | | | | __/ | |__ _| \__ \ |_| | | | | || (_| |> < +|_|_|_| |_|\___| |_| |_|(_) |___/\__, |_| |_|\__\__,_/_/\_\ + |___/ + + ___ _ __ _ __ ___ _ __ _ __ ___ __ _ _ __ + / _ \ '__| '__/ _ \| '__| | '_ \ / _ \/ _` | '__| +| __/ | | | | (_) | | | | | | __/ (_| | | + \___|_| |_| \___/|_| |_| |_|\___|\__,_|_| + + _ _ _ _ + _ _ _ __ _____ ___ __ ___ ___| |_ ___ __| | | |_ ___ | | _____ _ __ +| | | | '_ \ / _ \ \/ / '_ \ / _ \/ __| __/ _ \/ _` | | __/ _ \| |/ / _ \ '_ \ +| |_| | | | | __/> <| |_) | __/ (__| || __/ (_| | | || (_) | < __/ | | | + \__,_|_| |_|\___/_/\_\ .__/ \___|\___|\__\___|\__,_| \__\___/|_|\_\___|_| |_| + |_| + ___ _ +( ) \ ( ) + \|| ||/ + > > + | | + /_/ + __ _ _ _ __ _ + / /(_) ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___ _ +/ / | |/ _ \/ __| '_ \| |/ / \ \ / _` | '_ \ / _` |/ __| '_ \ / _ (_) +\ \ | | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + |__/ |_| + _ _ _ _ _ ___ _ +| (_)_ __ ___ / | || | _ ( ) \ ( ) +| | | '_ \ / _ \ | | || |(_) \|| ||/ +| | | | | | __/ | |__ _| > > +|_|_|_| |_|\___| |_| |_|(_) | | + /_/ + __ _ _ _ __ _ _ _ _ + / /(_) ___ ___| |__ | | __\ \ | |_| |__ ___ _ __ | | ___ | |_ +/ / | |/ _ \/ __| '_ \| |/ / \ \ | __| '_ \ / _ \ | '_ \| |/ _ \| __| +\ \ | | (_) \__ \ | | | < / / | |_| | | | __/ | |_) | | (_) | |_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__|_| |_|\___| | .__/|_|\___/ \__| + |__/ |_| + _ _ _ _ +| |_| |__ (_) ___| | _____ _ __ ___ +| __| '_ \| |/ __| |/ / _ \ '_ \/ __| +| |_| | | | | (__| < __/ | | \__ \ + \__|_| |_|_|\___|_|\_\___|_| |_|___/ + + __ __ __ _ _ ___ _ _ + / /__ _ ___ _ _ / _|/ _(_) ___| | __| \ \ | |_| |__ ___ ___ ___ +/ // _` / __| | | | |_| |_| |/ _ \ |/ _` |\ \ | __| '_ \ / _ \/ __|/ _ \ +\ \ (_| \__ \ |_| | _| _| | __/ | (_| |/ / | |_| | | | (_) \__ \ __/ + \_\__,_|___/\__,_|_| |_| |_|\___|_|\__,_/_/ \__|_| |_|\___/|___/\___| + + _ _ _ _ _ + __ _ _ __ ___ _ __ ( ) |_ ___| |__ ___| | | + / _` | '__/ _ \ '_ \|/| __| / __| '_ \ / _ \ | | +| (_| | | | __/ | | | | |_ \__ \ | | | __/ | | + \__,_|_| \___|_| |_| \__| |___/_| |_|\___|_|_| + + _ _ + ___ ___ _ __(_)_ __ | |_ ___ +/ __|/ __| '__| | '_ \| __/ __| +\__ \ (__| | | | |_) | |_\__ \ +|___/\___|_| |_| .__/ \__|___/ + |_| + __ _ _ __ _ _ _ _ _ + / /___ _ __(_) ___| |__ \ \ | |_| |__ (_)___ __ ____ _ ___ _ __ ( ) |_ +/ // _ \ '__| |/ __| '_ \ \ \ | __| '_ \| / __| \ \ /\ / / _` / __| '_ \|/| __| +\ \ __/ | | | (__| | | |/ / | |_| | | | \__ \ \ V V / (_| \__ \ | | | | |_ + \_\___|_| |_|\___|_| |_/_/ \__|_| |_|_|___/ \_/\_/ \__,_|___/_| |_| \__| + + _ _ _ + ___| |__ (_) ___| | _____ _ __ + / __| '_ \| |/ __| |/ / _ \ '_ \ +| (__| | | | | (__| < __/ | | |_ + \___|_| |_|_|\___|_|\_\___|_| |_(_) + + _ + (_)_ __ + _____ _____ | | '_ \ + |_____|_____| | | | | | + |_|_| |_| + + _ _ _ _ _ _ _ + _| || |_ __| | ___| |__ (_) __ _ _ __ __| | _____ _____| | +|_ .. _|/ _` |/ _ \ '_ \| |/ _` | '_ \ _____ / _` |/ _ \ \ / / _ \ | +|_ _| (_| | __/ |_) | | (_| | | | |_____| (_| | __/\ V / __/ | + |_||_| \__,_|\___|_.__/|_|\__,_|_| |_| \__,_|\___| \_/ \___|_| + + joshk@influx:/etc/logrotate.d> sh -n * + apache: line 14: syntax error near unexpected token `}' + apache: line 14: `}' + the plot thickens + those aren't shell scripts + this wasn't chicken. + -- in #debian-devel diff --git a/externals/figlet/tests/res003.txt b/externals/figlet/tests/res003.txt new file mode 100644 index 0000000000..31770d6c96 --- /dev/null +++ b/externals/figlet/tests/res003.txt @@ -0,0 +1,432 @@ + __ ___ _ _ + \ \ / / |__ __ _| |_ (_)___ + \ \ /\ / /| '_ \ / _` | __| | / __| + \ V V / | | | | (_| | |_ | \__ \ + \_/\_/ |_| |_|\__,_|\__| |_|___/ + + _ _ _ _ _ +(_)_ ____ _____ | |_ _____ __| | (_)_ __ ___ _ _ ___| |__ +| | '_ \ \ / / _ \| \ \ / / _ \/ _` | | | '_ \ / __| | | |/ __| '_ \ +| | | | \ V / (_) | |\ V / __/ (_| | | | | | | \__ \ |_| | (__| | | | +|_|_| |_|\_/ \___/|_| \_/ \___|\__,_| |_|_| |_| |___/\__,_|\___|_| |_| + + __ _ __ +| _|___| | ___ ___ __|_ | +| |/ __| |/ _ \/ __|/ _ \ | +| | (__| | (_) \__ \ __/ | +| |\___|_|\___/|___/\___| | +|__| |__| + _ _ _ _ _ _ + _ __ ___| | __ _| |_(_) ___ _ __ ___| |__ (_)_ __ ___ (_)___ __ _ +| '__/ _ \ |/ _` | __| |/ _ \| '_ \/ __| '_ \| | '_ \/ __| | / __| / _` | +| | | __/ | (_| | |_| | (_) | | | \__ \ | | | | |_) \__ \ | \__ \ | (_| | +|_| \___|_|\__,_|\__|_|\___/|_| |_|___/_| |_|_| .__/|___/ |_|___/ \__,_| + |_| + __ __ + / _| ___ _ __ _ __ ___ ___ / _| +| |_ / _ \| '__| '_ ` _ \ / _ \| |_ +| _| (_) | | | | | | | | | (_) | _| +|_| \___/|_| |_| |_| |_| \___/|_| + + _ _ _ + ___ _ __ ___ ___ | |_(_) ___ _ __ __ _| | + / _ \ '_ ` _ \ / _ \| __| |/ _ \| '_ \ / _` | | +| __/ | | | | | (_) | |_| | (_) | | | | (_| | | + \___|_| |_| |_|\___/ \__|_|\___/|_| |_|\__,_|_| + + _ _ _ __ + ___| |__ ___ _ __ ___ (_)___| |_ _ __ _ _ ___ ___ / _| __ _ _ __ + / __| '_ \ / _ \ '_ ` _ \| / __| __| '__| | | | / __|/ _ \ | |_ / _` | '__| +| (__| | | | __/ | | | | | \__ \ |_| | | |_| |_ \__ \ (_) | | _| (_| | | + \___|_| |_|\___|_| |_| |_|_|___/\__|_| \__, ( ) |___/\___/ |_| \__,_|_| + |___/|/ + _ _ _ _ + _ _ _ __ _____ ___ __ | | __ _(_)_ __ ___ __| | | |__ _ _ +| | | | '_ \ / _ \ \/ / '_ \| |/ _` | | '_ \ / _ \/ _` | | '_ \| | | | +| |_| | | | | __/> <| |_) | | (_| | | | | | __/ (_| | | |_) | |_| | + \__,_|_| |_|\___/_/\_\ .__/|_|\__,_|_|_| |_|\___|\__,_| |_.__/ \__, | + |_| |___/ + _ _ __ + __ _ _ __ _ _ ___ ___| |__ ___ ___ | | ___ / _| + / _` | '_ \| | | | / __|/ __| '_ \ / _ \ / _ \| | / _ \| |_ +| (_| | | | | |_| | \__ \ (__| | | | (_) | (_) | | | (_) | _| + \__,_|_| |_|\__, | |___/\___|_| |_|\___/ \___/|_| \___/|_| + |___/ + _ _ _ ___ + _ __ ___ _ _ ___| |__ (_) __ _| |_ _ __ _ _ |_ _| __ _ _ __ ___ +| '_ \/ __| | | |/ __| '_ \| |/ _` | __| '__| | | | | | / _` | '_ ` _ \ +| |_) \__ \ |_| | (__| | | | | (_| | |_| | | |_| | | | | (_| | | | | | | +| .__/|___/\__, |\___|_| |_|_|\__,_|\__|_| \__, | |___| \__,_|_| |_| |_| +|_| |___/ |___/ + __ _ _ _ + __ ___ ____ _ _ __ ___ ___ / _| | |_| |__ __ _| |_ + / _` \ \ /\ / / _` | '__/ _ \ / _ \| |_ | __| '_ \ / _` | __| +| (_| |\ V V / (_| | | | __/ | (_) | _| | |_| | | | (_| | |_ + \__,_| \_/\_/ \__,_|_| \___| \___/|_|( ) \__|_| |_|\__,_|\__| + |/ + _ _ _ _ + ___ ___ _ __ __| (_) |_(_) ___ _ __ ___ + / __/ _ \| '_ \ / _` | | __| |/ _ \| '_ \/ __| +| (_| (_) | | | | (_| | | |_| | (_) | | | \__ \ + \___\___/|_| |_|\__,_|_|\__|_|\___/|_| |_|___/ + + _ _ _ + _ __ ___ | |_| |__ (_)_ __ __ _ ___ ___ +| '_ \ / _ \| __| '_ \| | '_ \ / _` | / __|/ _ \ +| | | | (_) | |_| | | | | | | | (_| | \__ \ (_) | +|_| |_|\___/ \__|_| |_|_|_| |_|\__, | |___/\___/ + |___/ + _ _ + ___(_)_ __ ___ _ __ | | ___ __ _ ___ __ _ +/ __| | '_ ` _ \| '_ \| |/ _ \ / _` / __| / _` | +\__ \ | | | | | | |_) | | __/ | (_| \__ \ | (_| | +|___/_|_| |_| |_| .__/|_|\___| \__,_|___/ \__,_| + |_| + _ _ _ _ + ___| |__ ___ (_) ___ ___ | |__ ___| |___ _____ ___ _ __ + / __| '_ \ / _ \| |/ __/ _ \ | '_ \ / _ \ __\ \ /\ / / _ \/ _ \ '_ \ +| (__| | | | (_) | | (_| __/ | |_) | __/ |_ \ V V / __/ __/ | | | + \___|_| |_|\___/|_|\___\___| |_.__/ \___|\__| \_/\_/ \___|\___|_| |_| + + _ _ _ __ +| |_| |__ ___ _ __ ___ | | ___ ___ ___ / _| +| __| '_ \ / _ \ | '_ \ / _ \| |/ _ \/ __| / _ \| |_ +| |_| | | | __/ | |_) | (_) | | __/\__ \ | (_) | _| + \__|_| |_|\___| | .__/ \___/|_|\___||___/ \___/|_| + |_| + _ _ _ _ _ + __ _| |_| |_ _ __ __ _ ___| |_(_) ___ _ __ __ _ _ __ __| | + / _` | __| __| '__/ _` |/ __| __| |/ _ \| '_ \ / _` | '_ \ / _` | +| (_| | |_| |_| | | (_| | (__| |_| | (_) | | | | | (_| | | | | (_| | + \__,_|\__|\__|_| \__,_|\___|\__|_|\___/|_| |_| \__,_|_| |_|\__,_| + + _ _ __ __ + _ __ ___ _ __ _ _| |___(_) ___ _ __ \ \ / /__ _ _ +| '__/ _ \ '_ \| | | | / __| |/ _ \| '_ \ \ V / _ \| | | | +| | | __/ |_) | |_| | \__ \ | (_) | | | |_ | | (_) | |_| | +|_| \___| .__/ \__,_|_|___/_|\___/|_| |_(_) |_|\___/ \__,_| + |_| + _ + ___ __ _ _ __ _ __ ___ ___ ___| |_ ___ ___ _ __ ___ ___ + / __/ _` | '_ \ | '_ ` _ \ / _ \/ _ \ __| / __|/ _ \| '_ ` _ \ / _ \ +| (_| (_| | | | | | | | | | | __/ __/ |_ \__ \ (_) | | | | | | __/ + \___\__,_|_| |_| |_| |_| |_|\___|\___|\__| |___/\___/|_| |_| |_|\___| + + _ _ _ _ _ + _ __ ___ ___ _ __ | | ___ | |_| |__ (_)_ __| |_ _ _ +| '_ \ / _ \/ _ \| '_ \| |/ _ \ | __| '_ \| | '__| __| | | | +| |_) | __/ (_) | |_) | | __/ | |_| | | | | | | |_| |_| |_ +| .__/ \___|\___/| .__/|_|\___| \__|_| |_|_|_| \__|\__, ( ) +|_| |_| |___/|/ + __ _ _ _ + / _| ___ _ __| |_ _ _ | |_(_)_ __ ___ ___ ___ +| |_ / _ \| '__| __| | | | | __| | '_ ` _ \ / _ \/ __| +| _| (_) | | | |_| |_| | | |_| | | | | | | __/\__ \ +|_| \___/|_| \__|\__, | \__|_|_| |_| |_|\___||___/ + |___/ + _ _ _ + __| | _____ ___ __ | |_| |__ ___ _ _ ___ __ _ _ __ ___ + / _` |/ _ \ \ /\ / / '_ \ | __| '_ \ / _ \ | | | |/ _ \/ _` | '__/ __| +| (_| | (_) \ V V /| | | | | |_| | | | __/ | |_| | __/ (_| | | \__ \_ + \__,_|\___/ \_/\_/ |_| |_| \__|_| |_|\___| \__, |\___|\__,_|_| |___( ) + |___/ |/ + _ + __ _ _ __ __| | + / _` | '_ \ / _` | +| (_| | | | | (_| | + \__,_|_| |_|\__,_| + + _ _ _ +| |_| |__ ___ _ _ _ __ ___ _ __ ___ __ _(_)_ __ +| __| '_ \ / _ \ | | | | '__/ _ \ '_ ` _ \ / _` | | '_ \ +| |_| | | | __/ |_| | | | | __/ | | | | | (_| | | | | | + \__|_| |_|\___|\__, | |_| \___|_| |_| |_|\__,_|_|_| |_| + |___/ + _ _ _ + __ _ _ __ ___ (_) __ _| |__ | | ___ + / _` | '_ ` _ \| |/ _` | '_ \| |/ _ \ +| (_| | | | | | | | (_| | |_) | | __/ + \__,_|_| |_| |_|_|\__,_|_.__/|_|\___| + + _ _ _ _ _ _ +| |__ _ _ ___| |_ __ _ _ __ __| | ___ _ __ ___ | (_) | _____ +| '_ \| | | / __| __/ _` | '_ \ / _` |/ _ \ '__/ __| | | | |/ / _ \ +| |_) | |_| \__ \ || (_| | | | | (_| | __/ | \__ \_ | | | < __/ +|_.__/ \__, |___/\__\__,_|_| |_|\__,_|\___|_| |___( ) |_|_|_|\_\___| + |___/ |/ + _ _ _ _ _ _ _ +| |_| |__ ___ ___| |__ ___ _ __ ___ | (_) __ _| |__ | |_ ___ +| __| '_ \ / _ \ / __| '_ \ / _ \| '__/ _ \ | | |/ _` | '_ \| __/ __| +| |_| | | | __/ \__ \ | | | (_) | | | __/ | | | (_| | | | | |_\__ \ + \__|_| |_|\___| |___/_| |_|\___/|_| \___| |_|_|\__, |_| |_|\__|___/ + |___/ + __ _ _ _ _ + ___ / _| | |_ _____ ___ __ ___ | |_| |__ __ _| |_ __ _ + / _ \| |_ | __/ _ \ \ /\ / / '_ \/ __| | __| '_ \ / _` | __| / _` | +| (_) | _| | || (_) \ V V /| | | \__ \ | |_| | | | (_| | |_ | (_| | + \___/|_| \__\___/ \_/\_/ |_| |_|___/ \__|_| |_|\__,_|\__| \__,_| + + _ _ + ___ __ _(_) | ___ _ __ +/ __|/ _` | | |/ _ \| '__| +\__ \ (_| | | | (_) | | +|___/\__,_|_|_|\___/|_| + + _ _ _ _ + _ __ __ _ ___ ___ ___ ___ __ _| |_ ___| |_ __ _| |_ ___ __| | +| '_ \ / _` / __/ __|/ _ \/ __| / _` | __| / __| __/ _` | __/ _ \/ _` | +| |_) | (_| \__ \__ \ __/\__ \ | (_| | |_ \__ \ || (_| | || __/ (_| | +| .__/ \__,_|___/___/\___||___/ \__,_|\__| |___/\__\__,_|\__\___|\__,_| +|_| + _ _ _ _ +| |_(_)_ __ ___ ___ ___ | |__ _ _| |_ _ __ _____ _____ _ __ +| __| | '_ ` _ \ / _ \/ __| | '_ \| | | | __| | '_ \ / _ \ \ / / _ \ '__| +| |_| | | | | | | __/\__ \ | |_) | |_| | |_ | | | | __/\ V / __/ | + \__|_|_| |_| |_|\___||___/ |_.__/ \__,_|\__| |_| |_|\___| \_/ \___|_| + + _ _ _ _ _ + ___ __ _| | |___ __ _| |_ ___ _ __ | |_| |__ ___ + / __/ _` | | / __| / _` | __| / _ \| '_ \ | __| '_ \ / _ \ +| (_| (_| | | \__ \ | (_| | |_ | (_) | | | | | |_| | | | __/ + \___\__,_|_|_|___/ \__,_|\__| \___/|_| |_| \__|_| |_|\___| + + _ + _ __ ___ __ _ _ _| | __ _ _ __ _ __ _ _ _ __ +| '__/ _ \/ _` | | | | |/ _` | '__| | '__| | | | '_ \ +| | | __/ (_| | |_| | | (_| | | | | | |_| | | | |_ +|_| \___|\__, |\__,_|_|\__,_|_| |_| \__,_|_| |_(_) + |___/ + ____ _ + / ___|___ _ ____ _____ _ __ ___ ___| |_ _ +| | / _ \| '_ \ \ / / _ \ '__/ __|/ _ \ | | | | +| |__| (_) | | | \ V / __/ | \__ \ __/ | |_| |_ + \____\___/|_| |_|\_/ \___|_| |___/\___|_|\__, ( ) + |___/|/ + _ _ _ _ _ _ + __ _| | | ___ ___ _ __ ___(_) __| | ___ _ __ __ _| |_(_) ___ _ __ ___ + / _` | | | / __/ _ \| '_ \/ __| |/ _` |/ _ \ '__/ _` | __| |/ _ \| '_ \/ __| +| (_| | | | | (_| (_) | | | \__ \ | (_| | __/ | | (_| | |_| | (_) | | | \__ \ + \__,_|_|_| \___\___/|_| |_|___/_|\__,_|\___|_| \__,_|\__|_|\___/|_| |_|___/ + + __ _ _ + ___ / _| ___ _____ __ __ _ ___(_) __| | ___ _ _ ___ _ _ + / _ \| |_ / __|/ _ \ \/ / / _` / __| |/ _` |/ _ \ | | | |/ _ \| | | | +| (_) | _| \__ \ __/> < | (_| \__ \ | (_| | __/_ | |_| | (_) | |_| | + \___/|_| |___/\___/_/\_\ \__,_|___/_|\__,_|\___( ) \__, |\___/ \__,_| + |/ |___/ + _ + ___ __ _ _ __ _ __ ___ ___ ___| |_ ___ ___ _ __ ___ ___ + / __/ _` | '_ \ | '_ ` _ \ / _ \/ _ \ __| / __|/ _ \| '_ ` _ \ / _ \ +| (_| (_| | | | | | | | | | | __/ __/ |_ \__ \ (_) | | | | | | __/ + \___\__,_|_| |_| |_| |_| |_|\___|\___|\__| |___/\___/|_| |_| |_|\___| + + _ _ _ + ___ | |_| |__ ___ _ __ _ __ ___ ___ _ __ | | ___ + / _ \| __| '_ \ / _ \ '__| | '_ \ / _ \/ _ \| '_ \| |/ _ \ +| (_) | |_| | | | __/ | | |_) | __/ (_) | |_) | | __/ + \___/ \__|_| |_|\___|_| | .__/ \___|\___/| .__/|_|\___| + |_| |_| + _ _ + ___ _ __ ___ ___ ___ _ __ | |___ _(_) ___ ___ + / _ \| '_ \ / __/ _ \ / _ \| '__| | __\ \ /\ / / |/ __/ _ \ +| (_) | | | | (_| __/ | (_) | | | |_ \ V V /| | (_| __/ + \___/|_| |_|\___\___| \___/|_| \__| \_/\_/ |_|\___\___| + + _ _ _ _ + __ _ _ __ __| | | |_| |__ ___ _ _ _ __ ___ _ __ ___ __ _(_)_ __ + / _` | '_ \ / _` | | __| '_ \ / _ \ | | | | '__/ _ \ '_ ` _ \ / _` | | '_ \ +| (_| | | | | (_| | | |_| | | | __/ |_| | | | | __/ | | | | | (_| | | | | | + \__,_|_| |_|\__,_| \__|_| |_|\___|\__, | |_| \___|_| |_| |_|\__,_|_|_| |_| + |___/ + _ + _ __ ___ _ __ _ __ ___ __ _ _ __ ___ _ __ | |_ +| '_ \ / _ \ '__| '_ ` _ \ / _` | '_ \ / _ \ '_ \| __| +| |_) | __/ | | | | | | | (_| | | | | __/ | | | |_ +| .__/ \___|_| |_| |_| |_|\__,_|_| |_|\___|_| |_|\__| +|_| + _ __ _ +(_)_ __ / _| |_ _ ___ _ __ ___ ___ ___ ___ _ __ +| | '_ \| |_| | | | |/ _ \ '_ \ / __/ _ \/ __| / _ \| '_ \ +| | | | | _| | |_| | __/ | | | (_| __/\__ \ | (_) | | | | +|_|_| |_|_| |_|\__,_|\___|_| |_|\___\___||___/ \___/|_| |_| + + _ _ __ + _ _ ___ _ _ _ __ | (_)/ _| ___ +| | | |/ _ \| | | | '__| | | | |_ / _ \ +| |_| | (_) | |_| | | | | | _| __/_ + \__, |\___/ \__,_|_| |_|_|_| \___(_) + |___/ + _____ _ + | ____|_ _____ _ __ _ _ ___ _ __ ___ (_)___ + | _| \ \ / / _ \ '__| | | |/ _ \| '_ \ / _ \ | / __| + | |___ \ V / __/ | | |_| | (_) | | | | __/ | \__ \ + |_____| \_/ \___|_| \__, |\___/|_| |_|\___| |_|___/ + |___/ + __ _ _ _ + __ ___ ____ _ _ __ ___ ___ / _| | |_| |__ (_)___ + / _` \ \ /\ / / _` | '__/ _ \ / _ \| |_ | __| '_ \| / __| +| (_| |\ V V / (_| | | | __/ | (_) | _| | |_| | | | \__ \ + \__,_| \_/\_/ \__,_|_| \___| \___/|_| \__|_| |_|_|___/ + + _ _ + __| (_)___ ___ _ __ ___ _ __ __ _ _ __ ___ _ _ + / _` | / __|/ __| '__/ _ \ '_ \ / _` | '_ \ / __| | | | +| (_| | \__ \ (__| | | __/ |_) | (_| | | | | (__| |_| | + \__,_|_|___/\___|_| \___| .__/ \__,_|_| |_|\___|\__, | + |_| |___/ + _ _ _ _ +| |__ ___| |___ _____ ___ _ __ | |_| |__ ___ +| '_ \ / _ \ __\ \ /\ / / _ \/ _ \ '_ \ | __| '_ \ / _ \ +| |_) | __/ |_ \ V V / __/ __/ | | | | |_| | | | __/ +|_.__/ \___|\__| \_/\_/ \___|\___|_| |_| \__|_| |_|\___| + + _ _ + __ _ ___ __ _ _ _ __ _(_)_ __ | |_ __ _ _ __ ___ ___ + / _` |/ __/ _` | | | |/ _` | | '_ \| __/ _` | '_ \ / __/ _ \ +| (_| | (_| (_| | |_| | (_| | | | | | || (_| | | | | (_| __/ + \__,_|\___\__, |\__,_|\__,_|_|_| |_|\__\__,_|_| |_|\___\___| + |_| + + ___ ___ ___ _ __ +/ __|/ _ \/ _ \ '_ \ +\__ \ __/ __/ | | | +|___/\___|\___|_| |_| + + __ _ _ _ + __ _ ___ / _| __ _ _ __ ___ (_) (_) __ _ _ __ + / _` / __| | |_ / _` | '_ ` _ \| | | |/ _` | '__| +| (_| \__ \ | _| (_| | | | | | | | | | (_| | | + \__,_|___/ |_| \__,_|_| |_| |_|_|_|_|\__,_|_| + + _ _ +__ ____ _| | |_ __ __ _ _ __ ___ _ __ ___ _ __ +\ \ /\ / / _` | | | '_ \ / _` | '_ \ / _ \ '__| / _ \| '__| + \ V V / (_| | | | |_) | (_| | |_) | __/ | | (_) | | + \_/\_/ \__,_|_|_| .__/ \__,_| .__/ \___|_| \___/|_| + |_| |_| + _ _ _ __ _ _ +(_)_ __ ___| |_ __ _ _ __ | |_ / _|_ __(_) ___ _ __ __| | +| | '_ \/ __| __/ _` | '_ \| __| | |_| '__| |/ _ \ '_ \ / _` | +| | | | \__ \ || (_| | | | | |_ | _| | | | __/ | | | (_| |_ +|_|_| |_|___/\__\__,_|_| |_|\__| |_| |_| |_|\___|_| |_|\__,_(_) + + _____ _ _ _ _ +|_ _| |__ ___ ___| |__ ___ _ __ ___ (_) ___ __ _| | + | | | '_ \ / _ \ / __| '_ \ / _ \ '_ ` _ \| |/ __/ _` | | + | | | | | | __/ | (__| | | | __/ | | | | | | (_| (_| | | + |_| |_| |_|\___| \___|_| |_|\___|_| |_| |_|_|\___\__,_|_| + + _ _ _ _ _ _ _ _ + __ _ ___| |_(_) ___ _ __ (_) |_ ___ _ __ | |_ __ _(_) |___ (_)___ + / _` |/ __| __| |/ _ \| '_ \ | | __| / _ \ '_ \| __/ _` | | / __| | / __| +| (_| | (__| |_| | (_) | | | | | | |_ | __/ | | | || (_| | | \__ \ | \__ \ + \__,_|\___|\__|_|\___/|_| |_| |_|\__| \___|_| |_|\__\__,_|_|_|___/ |_|___/ + + _ _ _ +| | ___ ___ ___ __ _____ _ __| |_| |__ +| |/ _ \/ __/ __| \ \ /\ / / _ \| '__| __| '_ \ +| | __/\__ \__ \ \ V V / (_) | | | |_| | | | +|_|\___||___/___/ \_/\_/ \___/|_| \__|_| |_| + + _ _ _ _ + __ _ _ __ __ _| |_ _ ___(_)_ __ __ _ | |_| |__ __ _ _ __ + / _` | '_ \ / _` | | | | |_ / | '_ \ / _` | | __| '_ \ / _` | '_ \ +| (_| | | | | (_| | | |_| |/ /| | | | | (_| | | |_| | | | (_| | | | | + \__,_|_| |_|\__,_|_|\__, /___|_|_| |_|\__, | \__|_| |_|\__,_|_| |_| + |___/ |___/ + _ _ _ _ + ___ _ __ (_) ___ _ _(_)_ __ __ _ / \ | |_ __ _ _ __ _ _ + / _ \ '_ \ | |/ _ \| | | | | '_ \ / _` | / _ \| __| / _` | '_ \| | | | +| __/ | | || | (_) | |_| | | | | | (_| |_ / ___ \ |_ | (_| | | | | |_| | + \___|_| |_|/ |\___/ \__, |_|_| |_|\__, (_) /_/ \_\__| \__,_|_| |_|\__, | + |__/ |___/ |___/ |___/ + _ _ _ _ + _ __ __ _| |_ ___ | |_| |__ ___ ___ ___ ___(_)_ __ +| '__/ _` | __/ _ \ | __| '_ \ / _ \/ __|/ _ \ / __| \ \/ / +| | | (_| | || __/_ | |_| | | | __/\__ \ __/ \__ \ |> < +|_| \__,_|\__\___( ) \__|_| |_|\___||___/\___| |___/_/_/\_\ + |/ + _ _ _ + _ __ (_) ___ ___ ___ ___ __ _ _ __ ___ __ _| |__ ___ _ _| |_ +| '_ \| |/ _ \/ __/ _ \/ __| / _` | '__/ _ \ / _` | '_ \ / _ \| | | | __| +| |_) | | __/ (_| __/\__ \ | (_| | | | __/ | (_| | |_) | (_) | |_| | |_ +| .__/|_|\___|\___\___||___/ \__,_|_| \___| \__,_|_.__/ \___/ \__,_|\__| +|_| + _ _ _ _ + _ __ ___ ___ _ __ __ _(_) |_| |__ __ _| |__ ___ _ __ ___ +| '_ ` _ \ / _ \ '_ \ \ \ /\ / / | __| '_ \ \ \ /\ / / '_ \ / _ \| '_ ` _ \ +| | | | | | __/ | | | \ V V /| | |_| | | | \ V V /| | | | (_) | | | | | | +|_| |_| |_|\___|_| |_| \_/\_/ |_|\__|_| |_| \_/\_/ |_| |_|\___/|_| |_| |_| + + ___ __ _ _ +|_ _| / _| ___| | |_ __ _ _ __ + | | | |_ / _ \ | __| / _` | '_ \ + | | | _| __/ | |_ | (_| | | | | +|___| |_| \___|_|\__| \__,_|_| |_| + + _ _ _ _ +(_)_ __ ___ _ __ ___ ___ __| (_) __ _| |_ ___ +| | '_ ` _ \| '_ ` _ \ / _ \/ _` | |/ _` | __/ _ \ +| | | | | | | | | | | | __/ (_| | | (_| | || __/ +|_|_| |_| |_|_| |_| |_|\___|\__,_|_|\__,_|\__\___| + + _ _ + ___ _ _ _ __ ___ _ __ __ _| |_ | |_ ___ _ _ ___ ___ +/ __| | | | '_ ` _ \| '_ \ / _` | __| _____ | __/ _ \ | | | / __|/ _ \ +\__ \ |_| | | | | | | |_) | (_| | |_ |_____| | || (_) | | |_| \__ \ __/ +|___/\__, |_| |_| |_| .__/ \__,_|\__| \__\___/ \__,_|___/\___| + |___/ |_| + _ _ __ __ __ + __ _ ___ ___ (_)_ __ (_)_ __ __ _ ___ / _| | \/ | __ ___ __ + / _` | / __/ _ \| | '_ \| | '_ \ / _` | / _ \| |_ | |\/| |/ _` \ \/ / +| (_| | | (_| (_) | | | | | | | | | (_| | | (_) | _| | | | | (_| |> < + \__,_| \___\___/|_|_| |_|_|_| |_|\__, | \___/|_| |_| |_|\__,_/_/\_\ + |___/ + ____ _ _ _ +| __ ) ___ ___ _ __| |__ ___ | |__ _ __ ___ ( )___ +| _ \ / _ \/ _ \ '__| '_ \ / _ \| '_ \| '_ ` _ \|// __| +| |_) | __/ __/ | | |_) | (_) | | | | | | | | | \__ \ +|____/ \___|\___|_| |_.__/ \___/|_| |_|_| |_| |_| |___/ + + + _ __ ___ ___ _ __ ___ +| '_ ` _ \ / _ \| '__/ _ \ +| | | | | | (_) | | | __/ +|_| |_| |_|\___/|_| \___| + + _ _ __ _ _ + ___ __ _| |_(_)___ / _| __ _ ___| |_ ___ _ __ _ _ | |_ ___ +/ __|/ _` | __| / __| |_ / _` |/ __| __/ _ \| '__| | | | | __/ _ \ +\__ \ (_| | |_| \__ \ _| (_| | (__| || (_) | | | |_| | | || (_) | +|___/\__,_|\__|_|___/_| \__,_|\___|\__\___/|_| \__, | \__\___/ + |___/ + _ _ _ _ + _ __ ___ ___ | |_| |__ __ _ _ __ | |_| |__ ___ +| '_ ` _ \ / _ \ | __| '_ \ / _` | '_ \ | __| '_ \ / _ \ +| | | | | | __/ | |_| | | | (_| | | | | | |_| | | | __/ +|_| |_| |_|\___| \__|_| |_|\__,_|_| |_| \__|_| |_|\___| + + + ___ _ __ __ _ __ _ _ _ ___ __ _____ __ _ _ _ ___ + / _ \| '_ \ / _` |/ _` | | | |/ _ \ \ \ / / _ \ / _` | | | |/ _ \ +| (_) | |_) | (_| | (_| | |_| | __/ \ V / (_) | (_| | |_| | __/ + \___/| .__/ \__,_|\__, |\__,_|\___| \_/ \___/ \__, |\__,_|\___| + |_| |_| |___/ + _ _ _ _ _ _ _ +__ _____ _ __ __| | ( | )___ _ __ ___ _ __ __ _| |_| |__ _ _( | ) +\ \ /\ / / _ \| '__/ _` | V V/ _ \ '_ ` _ \| '_ \ / _` | __| '_ \| | | |V V + \ V V / (_) | | | (_| | | __/ | | | | | |_) | (_| | |_| | | | |_| | _ + \_/\_/ \___/|_| \__,_| \___|_| |_| |_| .__/ \__,_|\__|_| |_|\__, | (_) + |_| |___/ + _ _ _ _ _ + / \ | (_)___| |_ __ _(_)_ __ + _____ _____ / _ \ | | / __| __/ _` | | '__| + |_____|_____| / ___ \| | \__ \ || (_| | | | + /_/ \_\_|_|___/\__\__,_|_|_| + + ____ _ _ _ ____ _ __ __ _ _ + / ___|___ ___ | | _____ ( | ) ___|(_)_ __ | \/ | ___ _ __( | ) +| | / _ \ / _ \| |/ / _ \ V V\___ \| \ \/ / | |\/| |/ _ \ '_ \V V +| |__| (_) | (_) | < __/_ ___) | |> < | | | | __/ | | | + \____\___/ \___/|_|\_\___( ) |____/|_/_/\_\ |_| |_|\___|_| |_| + |/ diff --git a/externals/figlet/tests/res004.txt b/externals/figlet/tests/res004.txt new file mode 100644 index 0000000000..8ece9309ac --- /dev/null +++ b/externals/figlet/tests/res004.txt @@ -0,0 +1,120 @@ + __ _ _ _ __ + / /(_) ___ ___| |__ | | __\ \ +/ / | |/ _ \/ __| '_ \| |/ / \ \ +\ \ | | (_) \__ \ | | | < / / + \_\/ |\___/|___/_| |_|_|\_\/_/ + |__/ + _ _ _ ____ _ __ _ __ _ + (_) ___ ___| |__ | | __/ __ \(_)_ __ / _| |_ ___ ___ / /__| |_ ___ + | |/ _ \/ __| '_ \| |/ / / _` | | '_ \| |_| | | | \ \/ (_) / / _ \ __/ __| + | | (_) \__ \ | | | < | (_| | | | | | _| | |_| |> < _ / / __/ || (__ + _/ |\___/|___/_| |_|_|\_\ \__,_|_|_| |_|_| |_|\__,_/_/\_(_)_/ \___|\__\___| +|__/ \____/ + ___ _ _ ___ _ + / / | ___ __ _ _ __ ___ | |_ __ _| |_ ___ __| \ \ ___| |__ + / /| |/ _ \ / _` | '__/ _ \| __/ _` | __/ _ \ / _` |\ \ / __| '_ \ + / / | | (_) | (_| | | | (_) | || (_| | || __/| (_| |/ / \__ \ | | | +/_/ |_|\___/ \__, |_| \___/ \__\__,_|\__\___(_)__,_/_/ |___/_| |_| + |___/ + + _ __ __/\__ + _____| '_ \ \ / +|_____| | | | /_ _\ + |_| |_| \/ + + __ _ _ _ __ _ + / /(_) ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___ _ +/ / | |/ _ \/ __| '_ \| |/ / \ \ / _` | '_ \ / _` |/ __| '_ \ / _ (_) +\ \ | | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + |__/ |_| + _ _ _ _ _ _ +| (_)_ __ ___ / | || | _ ___ _ _ _ __ | |_ __ ___ __ +| | | '_ \ / _ \ | | || |(_) / __| | | | '_ \| __/ _` \ \/ / +| | | | | | __/ | |__ _| \__ \ |_| | | | | || (_| |> < +|_|_|_| |_|\___| |_| |_|(_) |___/\__, |_| |_|\__\__,_/_/\_\ + |___/ + + ___ _ __ _ __ ___ _ __ _ __ ___ __ _ _ __ + / _ \ '__| '__/ _ \| '__| | '_ \ / _ \/ _` | '__| +| __/ | | | | (_) | | | | | | __/ (_| | | + \___|_| |_| \___/|_| |_| |_|\___|\__,_|_| + + _ _ _ _ + _ _ _ __ _____ ___ __ ___ ___| |_ ___ __| | | |_ ___ | | _____ _ __ +| | | | '_ \ / _ \ \/ / '_ \ / _ \/ __| __/ _ \/ _` | | __/ _ \| |/ / _ \ '_ \ +| |_| | | | | __/> <| |_) | __/ (__| || __/ (_| | | || (_) | < __/ | | | + \__,_|_| |_|\___/_/\_\ .__/ \___|\___|\__\___|\__,_| \__\___/|_|\_\___|_| |_| + |_| + ___ _ +( ) \ ( ) + \|| ||/ + > > + | | + /_/ + __ _ _ _ __ _ + / /(_) ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___ _ +/ / | |/ _ \/ __| '_ \| |/ / \ \ / _` | '_ \ / _` |/ __| '_ \ / _ (_) +\ \ | | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + |__/ |_| + _ _ _ _ _ ___ _ +| (_)_ __ ___ / | || | _ ( ) \ ( ) +| | | '_ \ / _ \ | | || |(_) \|| ||/ +| | | | | | __/ | |__ _| > > +|_|_|_| |_|\___| |_| |_|(_) | | + /_/ + __ _ _ _ __ _ _ _ _ + / /(_) ___ ___| |__ | | __\ \ | |_| |__ ___ _ __ | | ___ | |_ +/ / | |/ _ \/ __| '_ \| |/ / \ \ | __| '_ \ / _ \ | '_ \| |/ _ \| __| +\ \ | | (_) \__ \ | | | < / / | |_| | | | __/ | |_) | | (_) | |_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__|_| |_|\___| | .__/|_|\___/ \__| + |__/ |_| + _ _ _ _ +| |_| |__ (_) ___| | _____ _ __ ___ +| __| '_ \| |/ __| |/ / _ \ '_ \/ __| +| |_| | | | | (__| < __/ | | \__ \ + \__|_| |_|_|\___|_|\_\___|_| |_|___/ + + __ __ __ _ _ ___ _ _ + / /__ _ ___ _ _ / _|/ _(_) ___| | __| \ \ | |_| |__ ___ ___ ___ +/ // _` / __| | | | |_| |_| |/ _ \ |/ _` |\ \ | __| '_ \ / _ \/ __|/ _ \ +\ \ (_| \__ \ |_| | _| _| | __/ | (_| |/ / | |_| | | | (_) \__ \ __/ + \_\__,_|___/\__,_|_| |_| |_|\___|_|\__,_/_/ \__|_| |_|\___/|___/\___| + + _ _ _ _ _ + __ _ _ __ ___ _ __ ( ) |_ ___| |__ ___| | | + / _` | '__/ _ \ '_ \|/| __| / __| '_ \ / _ \ | | +| (_| | | | __/ | | | | |_ \__ \ | | | __/ | | + \__,_|_| \___|_| |_| \__| |___/_| |_|\___|_|_| + + _ _ + ___ ___ _ __(_)_ __ | |_ ___ +/ __|/ __| '__| | '_ \| __/ __| +\__ \ (__| | | | |_) | |_\__ \ +|___/\___|_| |_| .__/ \__|___/ + |_| + __ _ _ __ _ _ _ _ _ + / /___ _ __(_) ___| |__ \ \ | |_| |__ (_)___ __ ____ _ ___ _ __ ( ) |_ +/ // _ \ '__| |/ __| '_ \ \ \ | __| '_ \| / __| \ \ /\ / / _` / __| '_ \|/| __| +\ \ __/ | | | (__| | | |/ / | |_| | | | \__ \ \ V V / (_| \__ \ | | | | |_ + \_\___|_| |_|\___|_| |_/_/ \__|_| |_|_|___/ \_/\_/ \__,_|___/_| |_| \__| + + _ _ _ + ___| |__ (_) ___| | _____ _ __ + / __| '_ \| |/ __| |/ / _ \ '_ \ +| (__| | | | | (__| < __/ | | |_ + \___|_| |_|_|\___|_|\_\___|_| |_(_) + + _ + (_)_ __ + _____ _____ | | '_ \ + |_____|_____| | | | | | + |_|_| |_| + + _ _ _ _ _ _ _ + _| || |_ __| | ___| |__ (_) __ _ _ __ __| | _____ _____| | +|_ .. _|/ _` |/ _ \ '_ \| |/ _` | '_ \ _____ / _` |/ _ \ \ / / _ \ | +|_ _| (_| | __/ |_) | | (_| | | | |_____| (_| | __/\ V / __/ | + |_||_| \__,_|\___|_.__/|_|\__,_|_| |_| \__,_|\___| \_/ \___|_| + diff --git a/externals/figlet/tests/res005.txt b/externals/figlet/tests/res005.txt new file mode 100644 index 0000000000..0e0921ef31 --- /dev/null +++ b/externals/figlet/tests/res005.txt @@ -0,0 +1,120 @@ + __ _ _ _ __ + \ \| | _| |__ ___ ___ (_)/ / + \ \ |/ / '_ \/ __|/ _ \| / / + / / <| | | \__ \ (_) | \ \ + /_/|_|\_\_| |_|___/\___// |\_\ + |__/ + _ __ _ __ _ ____ _ _ _ + ___| |_ ___ / /__ ___ _| |/ _|_ __ (_) / __ \| | _| |__ ___ ___ (_) + / __| __/ _ \ / (_) \/ / | | | | |_| '_ \| |/ / _` | |/ / '_ \/ __|/ _ \| | + | (__| || __// / _ > <| |_| | | _| | | | | | (_| | <| | | \__ \ (_) | | + \___|\__\___/_/ (_)_/\_\\__,_|_|_| |_| |_|_|\ \__,_|_|\_\_| |_|___/\___// | + \____/ |__/ + _ __ _ _ _ _ __ + | |__ ___ \ \ __| | ___| |_ __ _| |_ ___ _ __ __ _ ___ | | / / + | '_ \/ __| \ \/ _` | / _ \ __/ _` | __/ _ \| '__/ _` |/ _ \| | / / + | | | \__ \ / / (_| || __/ || (_| | || (_) | | | (_| | (_) | |/ / + |_| |_|___/ /_/ \__,_(_)___|\__\__,_|\__\___/|_| \__, |\___/|_/_/ + |___/ + + __/\__ _ __ + \ / | '_ \ _____ + /_ _\ | | | |_____| + \/ |_| |_| + + _ __ _ _ _ __ + _ ___| |__ ___ __ _ _ __ __ _ \ \| | _| |__ ___ ___ (_)/ / + (_) _ \ '_ \ / __/ _` | '_ \ / _` | \ \ |/ / '_ \/ __|/ _ \| / / + | __/ | | | (_| (_| | |_) | (_| | / / <| | | \__ \ (_) | \ \ + (_)___|_| |_|\___\__,_| .__/ \__,_| /_/|_|\_\_| |_|___/\___// |\_\ + |_| |__/ + _ _ _ _ _ _ + __ ____ _| |_ _ __ _ _ ___ _| || | / | ___ _ __ (_) | + \ \/ / _` | __| '_ \| | | / __| (_) || |_| | / _ \ '_ \| | | + > < (_| | |_| | | | |_| \__ \ _|__ _| | | __/ | | | | | + /_/\_\__,_|\__|_| |_|\__, |___/ (_) |_| |_| \___|_| |_|_|_| + |___/ + + _ __ __ _ ___ _ __ _ __ ___ _ __ _ __ ___ + | '__/ _` |/ _ \ '_ \ | '__/ _ \| '__| '__/ _ \ + | | | (_| | __/ | | | | | | (_) | | | | | __/ + |_| \__,_|\___|_| |_| |_| \___/|_| |_| \___| + + _ _ _ _ + _ __ ___| | _____ | |_ __| | ___| |_ ___ ___ _ ____ _____ _ __ _ _ + | '_ \ / _ \ |/ / _ \| __| / _` |/ _ \ __/ __/ _ \ '_ \ \/ / _ \ '_ \| | | | + | | | | __/ < (_) | |_ | (_| | __/ || (_| __/ |_) > < __/ | | | |_| | + |_| |_|\___|_|\_\___/ \__| \__,_|\___|\__\___\___| .__/_/\_\___|_| |_|\__,_| + |_| + ___ _ + ( ) \ ( ) + |/ | | \| + > > + | | + /_/ + _ __ _ _ _ __ + _ ___| |__ ___ __ _ _ __ __ _ \ \| | _| |__ ___ ___ (_)/ / + (_) _ \ '_ \ / __/ _` | '_ \ / _` | \ \ |/ / '_ \/ __|/ _ \| / / + | __/ | | | (_| (_| | |_) | (_| | / / <| | | \__ \ (_) | \ \ + (_)___|_| |_|\___\__,_| .__/ \__,_| /_/|_|\_\_| |_|___/\___// |\_\ + |_| |__/ + ___ _ _ _ _ _ _ + ( ) \ ( ) _| || | / | ___ _ __ (_) | + |/ | | \| (_) || |_| | / _ \ '_ \| | | + > > _|__ _| | | __/ | | | | | + | | (_) |_| |_| \___|_| |_|_|_| + /_/ + _ _ _ _ __ _ _ _ __ + | |_ ___ | |_ __ ___| |__ | |_ \ \| | _| |__ ___ ___ (_)/ / + | __/ _ \| | '_ \ / _ \ '_ \| __| \ \ |/ / '_ \/ __|/ _ \| / / + | || (_) | | |_) | | __/ | | | |_ / / <| | | \__ \ (_) | \ \ + \__\___/|_| .__/ \___|_| |_|\__| /_/|_|\_\_| |_|___/\___// |\_\ + |_| |__/ + _ _ _ _ + ___ _ __ ___| | _____(_) |__ | |_ + / __| '_ \ / _ \ |/ / __| | '_ \| __| + \__ \ | | | __/ < (__| | | | | |_ + |___/_| |_|\___|_|\_\___|_|_| |_|\__| + + _ _ __ _ _ _ __ __ __ + ___ ___ ___ | |__ | |_ \ \ __| | | ___(_)/ _|/ _|_ _ ___ __ _ / / + / _ \/ __|/ _ \| '_ \| __| \ \/ _` | |/ _ \ | |_| |_| | | / __|/ _` / / + | __/\__ \ (_) | | | | |_ / / (_| | | __/ | _| _| |_| \__ \ (_| \ \ + \___||___/\___/|_| |_|\__| /_/ \__,_|_|\___|_|_| |_| \__,_|___/\__,_|\_\ + + _ _ _ _ _ + | | | ___| |__ ___ | |_( )_ __ ___ _ __ __ _ + | | |/ _ \ '_ \/ __| | __|/| '_ \ / _ \ '__/ _` | + | | | __/ | | \__ \ | |_ | | | | __/ | | (_| | + |_|_|\___|_| |_|___/ \__| |_| |_|\___|_| \__,_| + + _ _ + ___| |_ _ __ (_)_ __ ___ ___ + / __| __| '_ \| | '__/ __/ __| + \__ \ |_| |_) | | | | (__\__ \ + |___/\__| .__/|_|_| \___|___/ + |_| + _ _ _ __ _ _ __ + ___(_) |__ | |_ \ \| |__ ___(_)_ __ ___ / / + / __| | '_ \| __| \ \ '_ \ / __| | '__/ _ \/ / + \__ \ | | | | |_ / / | | | (__| | | | __/\ \ + |___/_|_| |_|\__| /_/|_| |_|\___|_|_| \___| \_\ + + _ _ _ _ _ + _ __ ___| | _____(_) |__ ___ | |_( )_ __ ___ __ ___ __ + | '_ \ / _ \ |/ / __| | '_ \ / __| | __|/| '_ \/ __|/ _` \ \ /\ / / + _| | | | __/ < (__| | | | | (__ | |_ | | | \__ \ (_| |\ V V / + (_)_| |_|\___|_|\_\___|_|_| |_|\___| \__| |_| |_|___/\__,_| \_/\_/ + + _ + _ __ (_) + | '_ \| | _____ _____ + | | | | | |_____|_____| + |_| |_|_| + + _ _ _ _ _ _ _ + | | _____ _____ __| | _ __ __ _(_) |__ ___ __| |_| || |_ + | |/ _ \ \ / / _ \/ _` |_____| '_ \ / _` | | '_ \ / _ \/ _` |_ .. _| + | | __/\ V / __/ (_| |_____| | | | (_| | | |_) | __/ (_| |_ _| + |_|\___| \_/ \___|\__,_| |_| |_|\__,_|_|_.__/ \___|\__,_| |_||_| + diff --git a/externals/figlet/tests/res006.txt b/externals/figlet/tests/res006.txt new file mode 100644 index 0000000000..8ece9309ac --- /dev/null +++ b/externals/figlet/tests/res006.txt @@ -0,0 +1,120 @@ + __ _ _ _ __ + / /(_) ___ ___| |__ | | __\ \ +/ / | |/ _ \/ __| '_ \| |/ / \ \ +\ \ | | (_) \__ \ | | | < / / + \_\/ |\___/|___/_| |_|_|\_\/_/ + |__/ + _ _ _ ____ _ __ _ __ _ + (_) ___ ___| |__ | | __/ __ \(_)_ __ / _| |_ ___ ___ / /__| |_ ___ + | |/ _ \/ __| '_ \| |/ / / _` | | '_ \| |_| | | | \ \/ (_) / / _ \ __/ __| + | | (_) \__ \ | | | < | (_| | | | | | _| | |_| |> < _ / / __/ || (__ + _/ |\___/|___/_| |_|_|\_\ \__,_|_|_| |_|_| |_|\__,_/_/\_(_)_/ \___|\__\___| +|__/ \____/ + ___ _ _ ___ _ + / / | ___ __ _ _ __ ___ | |_ __ _| |_ ___ __| \ \ ___| |__ + / /| |/ _ \ / _` | '__/ _ \| __/ _` | __/ _ \ / _` |\ \ / __| '_ \ + / / | | (_) | (_| | | | (_) | || (_| | || __/| (_| |/ / \__ \ | | | +/_/ |_|\___/ \__, |_| \___/ \__\__,_|\__\___(_)__,_/_/ |___/_| |_| + |___/ + + _ __ __/\__ + _____| '_ \ \ / +|_____| | | | /_ _\ + |_| |_| \/ + + __ _ _ _ __ _ + / /(_) ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___ _ +/ / | |/ _ \/ __| '_ \| |/ / \ \ / _` | '_ \ / _` |/ __| '_ \ / _ (_) +\ \ | | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + |__/ |_| + _ _ _ _ _ _ +| (_)_ __ ___ / | || | _ ___ _ _ _ __ | |_ __ ___ __ +| | | '_ \ / _ \ | | || |(_) / __| | | | '_ \| __/ _` \ \/ / +| | | | | | __/ | |__ _| \__ \ |_| | | | | || (_| |> < +|_|_|_| |_|\___| |_| |_|(_) |___/\__, |_| |_|\__\__,_/_/\_\ + |___/ + + ___ _ __ _ __ ___ _ __ _ __ ___ __ _ _ __ + / _ \ '__| '__/ _ \| '__| | '_ \ / _ \/ _` | '__| +| __/ | | | | (_) | | | | | | __/ (_| | | + \___|_| |_| \___/|_| |_| |_|\___|\__,_|_| + + _ _ _ _ + _ _ _ __ _____ ___ __ ___ ___| |_ ___ __| | | |_ ___ | | _____ _ __ +| | | | '_ \ / _ \ \/ / '_ \ / _ \/ __| __/ _ \/ _` | | __/ _ \| |/ / _ \ '_ \ +| |_| | | | | __/> <| |_) | __/ (__| || __/ (_| | | || (_) | < __/ | | | + \__,_|_| |_|\___/_/\_\ .__/ \___|\___|\__\___|\__,_| \__\___/|_|\_\___|_| |_| + |_| + ___ _ +( ) \ ( ) + \|| ||/ + > > + | | + /_/ + __ _ _ _ __ _ + / /(_) ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___ _ +/ / | |/ _ \/ __| '_ \| |/ / \ \ / _` | '_ \ / _` |/ __| '_ \ / _ (_) +\ \ | | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + |__/ |_| + _ _ _ _ _ ___ _ +| (_)_ __ ___ / | || | _ ( ) \ ( ) +| | | '_ \ / _ \ | | || |(_) \|| ||/ +| | | | | | __/ | |__ _| > > +|_|_|_| |_|\___| |_| |_|(_) | | + /_/ + __ _ _ _ __ _ _ _ _ + / /(_) ___ ___| |__ | | __\ \ | |_| |__ ___ _ __ | | ___ | |_ +/ / | |/ _ \/ __| '_ \| |/ / \ \ | __| '_ \ / _ \ | '_ \| |/ _ \| __| +\ \ | | (_) \__ \ | | | < / / | |_| | | | __/ | |_) | | (_) | |_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__|_| |_|\___| | .__/|_|\___/ \__| + |__/ |_| + _ _ _ _ +| |_| |__ (_) ___| | _____ _ __ ___ +| __| '_ \| |/ __| |/ / _ \ '_ \/ __| +| |_| | | | | (__| < __/ | | \__ \ + \__|_| |_|_|\___|_|\_\___|_| |_|___/ + + __ __ __ _ _ ___ _ _ + / /__ _ ___ _ _ / _|/ _(_) ___| | __| \ \ | |_| |__ ___ ___ ___ +/ // _` / __| | | | |_| |_| |/ _ \ |/ _` |\ \ | __| '_ \ / _ \/ __|/ _ \ +\ \ (_| \__ \ |_| | _| _| | __/ | (_| |/ / | |_| | | | (_) \__ \ __/ + \_\__,_|___/\__,_|_| |_| |_|\___|_|\__,_/_/ \__|_| |_|\___/|___/\___| + + _ _ _ _ _ + __ _ _ __ ___ _ __ ( ) |_ ___| |__ ___| | | + / _` | '__/ _ \ '_ \|/| __| / __| '_ \ / _ \ | | +| (_| | | | __/ | | | | |_ \__ \ | | | __/ | | + \__,_|_| \___|_| |_| \__| |___/_| |_|\___|_|_| + + _ _ + ___ ___ _ __(_)_ __ | |_ ___ +/ __|/ __| '__| | '_ \| __/ __| +\__ \ (__| | | | |_) | |_\__ \ +|___/\___|_| |_| .__/ \__|___/ + |_| + __ _ _ __ _ _ _ _ _ + / /___ _ __(_) ___| |__ \ \ | |_| |__ (_)___ __ ____ _ ___ _ __ ( ) |_ +/ // _ \ '__| |/ __| '_ \ \ \ | __| '_ \| / __| \ \ /\ / / _` / __| '_ \|/| __| +\ \ __/ | | | (__| | | |/ / | |_| | | | \__ \ \ V V / (_| \__ \ | | | | |_ + \_\___|_| |_|\___|_| |_/_/ \__|_| |_|_|___/ \_/\_/ \__,_|___/_| |_| \__| + + _ _ _ + ___| |__ (_) ___| | _____ _ __ + / __| '_ \| |/ __| |/ / _ \ '_ \ +| (__| | | | | (__| < __/ | | |_ + \___|_| |_|_|\___|_|\_\___|_| |_(_) + + _ + (_)_ __ + _____ _____ | | '_ \ + |_____|_____| | | | | | + |_|_| |_| + + _ _ _ _ _ _ _ + _| || |_ __| | ___| |__ (_) __ _ _ __ __| | _____ _____| | +|_ .. _|/ _` |/ _ \ '_ \| |/ _` | '_ \ _____ / _` |/ _ \ \ / / _ \ | +|_ _| (_| | __/ |_) | | (_| | | | |_____| (_| | __/\ V / __/ | + |_||_| \__,_|\___|_.__/|_|\__,_|_| |_| \__,_|\___| \_/ \___|_| + diff --git a/externals/figlet/tests/res007.txt b/externals/figlet/tests/res007.txt new file mode 100644 index 0000000000..3f467dc2fd --- /dev/null +++ b/externals/figlet/tests/res007.txt @@ -0,0 +1,120 @@ + __ _ _ _ __ + / /(_) ___ ___| |__ | | __\ \ + / / | |/ _ \/ __| '_ \| |/ / \ \ + \ \ | | (_) \__ \ | | | < / / + \_\/ |\___/|___/_| |_|_|\_\/_/ + |__/ + _ _ _ ____ _ __ _ __ _ + (_) ___ ___| |__ | | __/ __ \(_)_ __ / _| |_ ___ ___ / /__| |_ ___ + | |/ _ \/ __| '_ \| |/ / / _` | | '_ \| |_| | | | \ \/ (_) / / _ \ __/ __| + | | (_) \__ \ | | | < | (_| | | | | | _| | |_| |> < _ / / __/ || (__ + _/ |\___/|___/_| |_|_|\_\ \__,_|_|_| |_|_| |_|\__,_/_/\_(_)_/ \___|\__\___| + |__/ \____/ + ___ _ _ ___ _ + / / | ___ __ _ _ __ ___ | |_ __ _| |_ ___ __| \ \ ___| |__ + / /| |/ _ \ / _` | '__/ _ \| __/ _` | __/ _ \ / _` |\ \ / __| '_ \ + / / | | (_) | (_| | | | (_) | || (_| | || __/| (_| |/ / \__ \ | | | + /_/ |_|\___/ \__, |_| \___/ \__\__,_|\__\___(_)__,_/_/ |___/_| |_| + |___/ + + _ __ __/\__ + _____| '_ \ \ / + |_____| | | | /_ _\ + |_| |_| \/ + + __ _ _ _ __ _ + / /(_) ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___ _ + / / | |/ _ \/ __| '_ \| |/ / \ \ / _` | '_ \ / _` |/ __| '_ \ / _ (_) + \ \ | | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + |__/ |_| + _ _ _ _ _ _ + | (_)_ __ ___ / | || | _ ___ _ _ _ __ | |_ __ ___ __ + | | | '_ \ / _ \ | | || |(_) / __| | | | '_ \| __/ _` \ \/ / + | | | | | | __/ | |__ _| \__ \ |_| | | | | || (_| |> < + |_|_|_| |_|\___| |_| |_|(_) |___/\__, |_| |_|\__\__,_/_/\_\ + |___/ + + ___ _ __ _ __ ___ _ __ _ __ ___ __ _ _ __ + / _ \ '__| '__/ _ \| '__| | '_ \ / _ \/ _` | '__| + | __/ | | | | (_) | | | | | | __/ (_| | | + \___|_| |_| \___/|_| |_| |_|\___|\__,_|_| + + _ _ _ _ + _ _ _ __ _____ ___ __ ___ ___| |_ ___ __| | | |_ ___ | | _____ _ __ +| | | | '_ \ / _ \ \/ / '_ \ / _ \/ __| __/ _ \/ _` | | __/ _ \| |/ / _ \ '_ \ +| |_| | | | | __/> <| |_) | __/ (__| || __/ (_| | | || (_) | < __/ | | | + \__,_|_| |_|\___/_/\_\ .__/ \___|\___|\__\___|\__,_| \__\___/|_|\_\___|_| |_| + |_| + ___ _ + ( ) \ ( ) + \|| ||/ + > > + | | + /_/ + __ _ _ _ __ _ + / /(_) ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___ _ + / / | |/ _ \/ __| '_ \| |/ / \ \ / _` | '_ \ / _` |/ __| '_ \ / _ (_) + \ \ | | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + |__/ |_| + _ _ _ _ _ ___ _ + | (_)_ __ ___ / | || | _ ( ) \ ( ) + | | | '_ \ / _ \ | | || |(_) \|| ||/ + | | | | | | __/ | |__ _| > > + |_|_|_| |_|\___| |_| |_|(_) | | + /_/ + __ _ _ _ __ _ _ _ _ + / /(_) ___ ___| |__ | | __\ \ | |_| |__ ___ _ __ | | ___ | |_ + / / | |/ _ \/ __| '_ \| |/ / \ \ | __| '_ \ / _ \ | '_ \| |/ _ \| __| + \ \ | | (_) \__ \ | | | < / / | |_| | | | __/ | |_) | | (_) | |_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__|_| |_|\___| | .__/|_|\___/ \__| + |__/ |_| + _ _ _ _ + | |_| |__ (_) ___| | _____ _ __ ___ + | __| '_ \| |/ __| |/ / _ \ '_ \/ __| + | |_| | | | | (__| < __/ | | \__ \ + \__|_| |_|_|\___|_|\_\___|_| |_|___/ + + __ __ __ _ _ ___ _ _ + / /__ _ ___ _ _ / _|/ _(_) ___| | __| \ \ | |_| |__ ___ ___ ___ + / // _` / __| | | | |_| |_| |/ _ \ |/ _` |\ \ | __| '_ \ / _ \/ __|/ _ \ + \ \ (_| \__ \ |_| | _| _| | __/ | (_| |/ / | |_| | | | (_) \__ \ __/ + \_\__,_|___/\__,_|_| |_| |_|\___|_|\__,_/_/ \__|_| |_|\___/|___/\___| + + _ _ _ _ _ + __ _ _ __ ___ _ __ ( ) |_ ___| |__ ___| | | + / _` | '__/ _ \ '_ \|/| __| / __| '_ \ / _ \ | | + | (_| | | | __/ | | | | |_ \__ \ | | | __/ | | + \__,_|_| \___|_| |_| \__| |___/_| |_|\___|_|_| + + _ _ + ___ ___ _ __(_)_ __ | |_ ___ + / __|/ __| '__| | '_ \| __/ __| + \__ \ (__| | | | |_) | |_\__ \ + |___/\___|_| |_| .__/ \__|___/ + |_| + __ _ _ __ _ _ _ _ _ + / /___ _ __(_) ___| |__ \ \ | |_| |__ (_)___ __ ____ _ ___ _ __ ( ) |_ +/ // _ \ '__| |/ __| '_ \ \ \ | __| '_ \| / __| \ \ /\ / / _` / __| '_ \|/| __| +\ \ __/ | | | (__| | | |/ / | |_| | | | \__ \ \ V V / (_| \__ \ | | | | |_ + \_\___|_| |_|\___|_| |_/_/ \__|_| |_|_|___/ \_/\_/ \__,_|___/_| |_| \__| + + _ _ _ + ___| |__ (_) ___| | _____ _ __ + / __| '_ \| |/ __| |/ / _ \ '_ \ + | (__| | | | | (__| < __/ | | |_ + \___|_| |_|_|\___|_|\_\___|_| |_(_) + + _ + (_)_ __ + _____ _____ | | '_ \ + |_____|_____| | | | | | + |_|_| |_| + + _ _ _ _ _ _ _ + _| || |_ __| | ___| |__ (_) __ _ _ __ __| | _____ _____| | + |_ .. _|/ _` |/ _ \ '_ \| |/ _` | '_ \ _____ / _` |/ _ \ \ / / _ \ | + |_ _| (_| | __/ |_) | | (_| | | | |_____| (_| | __/\ V / __/ | + |_||_| \__,_|\___|_.__/|_|\__,_|_| |_| \__,_|\___| \_/ \___|_| + diff --git a/externals/figlet/tests/res008.txt b/externals/figlet/tests/res008.txt new file mode 100644 index 0000000000..3048a10cfa --- /dev/null +++ b/externals/figlet/tests/res008.txt @@ -0,0 +1,120 @@ + __ _ _ _ __ + / /(_) ___ ___| |__ | | __\ \ + / / | |/ _ \/ __| '_ \| |/ / \ \ + \ \ | | (_) \__ \ | | | < / / + \_\/ |\___/|___/_| |_|_|\_\/_/ + |__/ + _ _ _ ____ _ __ _ __ _ + (_) ___ ___| |__ | | __/ __ \(_)_ __ / _| |_ ___ ___ / /__| |_ ___ + | |/ _ \/ __| '_ \| |/ / / _` | | '_ \| |_| | | | \ \/ (_) / / _ \ __/ __| + | | (_) \__ \ | | | < | (_| | | | | | _| | |_| |> < _ / / __/ || (__ + _/ |\___/|___/_| |_|_|\_\ \__,_|_|_| |_|_| |_|\__,_/_/\_(_)_/ \___|\__\___| + |__/ \____/ + ___ _ _ ___ _ + / / | ___ __ _ _ __ ___ | |_ __ _| |_ ___ __| \ \ ___| |__ + / /| |/ _ \ / _` | '__/ _ \| __/ _` | __/ _ \ / _` |\ \ / __| '_ \ + / / | | (_) | (_| | | | (_) | || (_| | || __/| (_| |/ / \__ \ | | | + /_/ |_|\___/ \__, |_| \___/ \__\__,_|\__\___(_)__,_/_/ |___/_| |_| + |___/ + + _ __ __/\__ + _____| '_ \ \ / + |_____| | | | /_ _\ + |_| |_| \/ + + __ _ _ _ __ _ + / /(_) ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___ _ + / / | |/ _ \/ __| '_ \| |/ / \ \ / _` | '_ \ / _` |/ __| '_ \ / _ (_) + \ \ | | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + |__/ |_| + _ _ _ _ _ _ + | (_)_ __ ___ / | || | _ ___ _ _ _ __ | |_ __ ___ __ + | | | '_ \ / _ \ | | || |(_) / __| | | | '_ \| __/ _` \ \/ / + | | | | | | __/ | |__ _| \__ \ |_| | | | | || (_| |> < + |_|_|_| |_|\___| |_| |_|(_) |___/\__, |_| |_|\__\__,_/_/\_\ + |___/ + + ___ _ __ _ __ ___ _ __ _ __ ___ __ _ _ __ + / _ \ '__| '__/ _ \| '__| | '_ \ / _ \/ _` | '__| + | __/ | | | | (_) | | | | | | __/ (_| | | + \___|_| |_| \___/|_| |_| |_|\___|\__,_|_| + + _ _ _ _ + _ _ _ __ _____ ___ __ ___ ___| |_ ___ __| | | |_ ___ | | _____ _ __ +| | | | '_ \ / _ \ \/ / '_ \ / _ \/ __| __/ _ \/ _` | | __/ _ \| |/ / _ \ '_ \ +| |_| | | | | __/> <| |_) | __/ (__| || __/ (_| | | || (_) | < __/ | | | + \__,_|_| |_|\___/_/\_\ .__/ \___|\___|\__\___|\__,_| \__\___/|_|\_\___|_| |_| + |_| + ___ _ + ( ) \ ( ) + \|| ||/ + > > + | | + /_/ + __ _ _ _ __ _ + / /(_) ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___ _ + / / | |/ _ \/ __| '_ \| |/ / \ \ / _` | '_ \ / _` |/ __| '_ \ / _ (_) + \ \ | | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + |__/ |_| + _ _ _ _ _ ___ _ + | (_)_ __ ___ / | || | _ ( ) \ ( ) + | | | '_ \ / _ \ | | || |(_) \|| ||/ + | | | | | | __/ | |__ _| > > + |_|_|_| |_|\___| |_| |_|(_) | | + /_/ + __ _ _ _ __ _ _ _ _ + / /(_) ___ ___| |__ | | __\ \ | |_| |__ ___ _ __ | | ___ | |_ + / / | |/ _ \/ __| '_ \| |/ / \ \ | __| '_ \ / _ \ | '_ \| |/ _ \| __| + \ \ | | (_) \__ \ | | | < / / | |_| | | | __/ | |_) | | (_) | |_ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__|_| |_|\___| | .__/|_|\___/ \__| + |__/ |_| + _ _ _ _ + | |_| |__ (_) ___| | _____ _ __ ___ + | __| '_ \| |/ __| |/ / _ \ '_ \/ __| + | |_| | | | | (__| < __/ | | \__ \ + \__|_| |_|_|\___|_|\_\___|_| |_|___/ + + __ __ __ _ _ ___ _ _ + / /__ _ ___ _ _ / _|/ _(_) ___| | __| \ \ | |_| |__ ___ ___ ___ + / // _` / __| | | | |_| |_| |/ _ \ |/ _` |\ \ | __| '_ \ / _ \/ __|/ _ \ + \ \ (_| \__ \ |_| | _| _| | __/ | (_| |/ / | |_| | | | (_) \__ \ __/ + \_\__,_|___/\__,_|_| |_| |_|\___|_|\__,_/_/ \__|_| |_|\___/|___/\___| + + _ _ _ _ _ + __ _ _ __ ___ _ __ ( ) |_ ___| |__ ___| | | + / _` | '__/ _ \ '_ \|/| __| / __| '_ \ / _ \ | | + | (_| | | | __/ | | | | |_ \__ \ | | | __/ | | + \__,_|_| \___|_| |_| \__| |___/_| |_|\___|_|_| + + _ _ + ___ ___ _ __(_)_ __ | |_ ___ + / __|/ __| '__| | '_ \| __/ __| + \__ \ (__| | | | |_) | |_\__ \ + |___/\___|_| |_| .__/ \__|___/ + |_| + __ _ _ __ _ _ _ _ _ + / /___ _ __(_) ___| |__ \ \ | |_| |__ (_)___ __ ____ _ ___ _ __ ( ) |_ +/ // _ \ '__| |/ __| '_ \ \ \ | __| '_ \| / __| \ \ /\ / / _` / __| '_ \|/| __| +\ \ __/ | | | (__| | | |/ / | |_| | | | \__ \ \ V V / (_| \__ \ | | | | |_ + \_\___|_| |_|\___|_| |_/_/ \__|_| |_|_|___/ \_/\_/ \__,_|___/_| |_| \__| + + _ _ _ + ___| |__ (_) ___| | _____ _ __ + / __| '_ \| |/ __| |/ / _ \ '_ \ + | (__| | | | | (__| < __/ | | |_ + \___|_| |_|_|\___|_|\_\___|_| |_(_) + + _ + (_)_ __ + _____ _____ | | '_ \ + |_____|_____| | | | | | + |_|_| |_| + + _ _ _ _ _ _ _ + _| || |_ __| | ___| |__ (_) __ _ _ __ __| | _____ _____| | + |_ .. _|/ _` |/ _ \ '_ \| |/ _` | '_ \ _____ / _` |/ _ \ \ / / _ \ | + |_ _| (_| | __/ |_) | | (_| | | | |_____| (_| | __/\ V / __/ | + |_||_| \__,_|\___|_.__/|_|\__,_|_| |_| \__,_|\___| \_/ \___|_| + diff --git a/externals/figlet/tests/res009.txt b/externals/figlet/tests/res009.txt new file mode 100644 index 0000000000..57f8690c8c --- /dev/null +++ b/externals/figlet/tests/res009.txt @@ -0,0 +1,138 @@ + __ _ _ _ __ + / / (_) ___ ___ | |__ | | __\ \ +/ / | | / _ \ / __|| '_ \ | |/ / \ \ +\ \ | || (_) |\__ \| | | || < / / + \_\_/ | \___/ |___/|_| |_||_|\_\/_/ + |__/ + _ _ _ ____ _ __ _ __ + (_) ___ ___ | |__ | | __ / __ \ (_) _ __ / _|| | _ _ __ __ _ / / + | | / _ \ / __|| '_ \ | |/ // / _` || || '_ \ | |_ | || | | |\ \/ /(_) / / + | || (_) |\__ \| | | || <| | (_| || || | | || _|| || |_| | > < _ / / + _/ | \___/ |___/|_| |_||_|\_\\ \__,_||_||_| |_||_| |_| \__,_|/_/\_\(_)/_/ +|__/ \____/ + _ __ _ _ _ + ___ | |_ ___ / /| | ___ __ _ _ __ ___ | |_ __ _ | |_ ___ + / _ \| __|/ __| / / | | / _ \ / _` || '__|/ _ \ | __|/ _` || __|/ _ \ +| __/| |_| (__ / / | || (_) || (_| || | | (_) || |_| (_| || |_| __/ _ + \___| \__|\___|/_/ |_| \___/ \__, ||_| \___/ \__|\__,_| \__|\___|(_) + |___/ + _ __ _ + __| |\ \ ___ | |__ _ __ __/\__ + / _` | \ \ / __|| '_ \ _____ | '_ \ \ / +| (_| | / / \__ \| | | | |_____|| | | | /_ _\ + \__,_|/_/ |___/|_| |_| |_| |_| \/ + + __ _ _ _ __ + / / (_) ___ ___ | |__ | | __\ \ +/ / | | / _ \ / __|| '_ \ | |/ / \ \ +\ \ | || (_) |\__ \| | | || < / / + \_\_/ | \___/ |___/|_| |_||_|\_\/_/ + |__/ + _ _ _ _ _ _ + __ _ _ __ __ _ ___ | |__ ___ _ | |(_) _ __ ___ / || || | _ + / _` || '_ \ / _` | / __|| '_ \ / _ \(_) | || || '_ \ / _ \ | || || |_(_) +| (_| || |_) || (_| || (__ | | | || __/ _ | || || | | || __/ | ||__ _|_ + \__,_|| .__/ \__,_| \___||_| |_| \___|(_) |_||_||_| |_| \___| |_| |_| (_) + |_| + _ + ___ _ _ _ __ | |_ __ _ __ __ ___ _ __ _ __ ___ _ __ +/ __|| | | || '_ \ | __|/ _` |\ \/ / / _ \| '__|| '__|/ _ \ | '__| +\__ \| |_| || | | || |_| (_| | > < | __/| | | | | (_) || | +|___/ \__, ||_| |_| \__|\__,_|/_/\_\ \___||_| |_| \___/ |_| + |___/ + + _ __ ___ __ _ _ __ +| '_ \ / _ \ / _` || '__| +| | | || __/| (_| || | +|_| |_| \___| \__,_||_| + + _ _ + _ _ _ __ ___ __ __ _ __ ___ ___ | |_ ___ __| | +| | | || '_ \ / _ \\ \/ /| '_ \ / _ \ / __|| __|/ _ \ / _` | +| |_| || | | || __/ > < | |_) || __/| (__ | |_| __/| (_| | + \__,_||_| |_| \___|/_/\_\| .__/ \___| \___| \__|\___| \__,_| + |_| + _ _ _ __ _ +| |_ ___ | | __ ___ _ __ ( )\ \ ( ) +| __|/ _ \ | |/ // _ \| '_ \ \| | ||/ +| |_| (_) || <| __/| | | | > > + \__|\___/ |_|\_\\___||_| |_| | | + /_/ + __ _ _ _ __ + / / (_) ___ ___ | |__ | | __\ \ +/ / | | / _ \ / __|| '_ \ | |/ / \ \ +\ \ | || (_) |\__ \| | | || < / / + \_\_/ | \___/ |___/|_| |_||_|\_\/_/ + |__/ + _ _ _ _ _ _ + __ _ _ __ __ _ ___ | |__ ___ _ | |(_) _ __ ___ / || || | _ + / _` || '_ \ / _` | / __|| '_ \ / _ \(_) | || || '_ \ / _ \ | || || |_(_) +| (_| || |_) || (_| || (__ | | | || __/ _ | || || | | || __/ | ||__ _|_ + \__,_|| .__/ \__,_| \___||_| |_| \___|(_) |_||_||_| |_| \___| |_| |_| (_) + |_| + _ __ _ +( )\ \ ( ) + \| | ||/ + > > + | | + /_/ + __ _ _ _ __ _ _ _ _ + / / (_) ___ ___ | |__ | | __\ \ | |_ | |__ ___ _ __ | | ___ | |_ +/ / | | / _ \ / __|| '_ \ | |/ / \ \ | __|| '_ \ / _ \ | '_ \ | | / _ \ | __| +\ \ | || (_) |\__ \| | | || < / / | |_ | | | || __/ | |_) || || (_) || |_ + \_\_/ | \___/ |___/|_| |_||_|\_\/_/ \__||_| |_| \___| | .__/ |_| \___/ \__| + |__/ |_| + _ _ _ _ +| |_ | |__ (_) ___ | | __ ___ _ __ ___ +| __|| '_ \ | | / __|| |/ // _ \| '_ \ / __| +| |_ | | | || || (__ | <| __/| | | |\__ \ + \__||_| |_||_| \___||_|\_\\___||_| |_||___/ + + __ __ __ _ _ _ __ + / / __ _ ___ _ _ / _| / _|(_) ___ | | __| |\ \ +/ / / _` |/ __|| | | || |_ | |_ | | / _ \| | / _` | \ \ +\ \| (_| |\__ \| |_| || _|| _|| || __/| || (_| | / / + \_\\__,_||___/ \__,_||_| |_| |_| \___||_| \__,_|/_/ + + _ _ _ _ +| |_ | |__ ___ ___ ___ __ _ _ __ ___ _ __ ( )| |_ +| __|| '_ \ / _ \ / __| / _ \ / _` || '__|/ _ \| '_ \|/ | __| +| |_ | | | || (_) |\__ \| __/ | (_| || | | __/| | | | | |_ + \__||_| |_| \___/ |___/ \___| \__,_||_| \___||_| |_| \__| + + _ _ _ _ _ + ___ | |__ ___ | || | ___ ___ _ __ (_) _ __ | |_ ___ +/ __|| '_ \ / _ \| || | / __| / __|| '__|| || '_ \ | __|/ __| +\__ \| | | || __/| || | \__ \| (__ | | | || |_) || |_ \__ \ +|___/|_| |_| \___||_||_| |___/ \___||_| |_|| .__/ \__||___/ + |_| + __ _ _ __ _ _ _ + / / ___ _ __ (_) ___ | |__ \ \ | |_ | |__ (_) ___ +/ / / _ \| '__|| | / __|| '_ \ \ \ | __|| '_ \ | |/ __| +\ \| __/| | | || (__ | | | | / / | |_ | | | || |\__ \ + \_\\___||_| |_| \___||_| |_|/_/ \__||_| |_||_||___/ + + _ _ _ _ _ +__ __ __ _ ___ _ __ ( )| |_ ___ | |__ (_) ___ | | __ ___ _ __ +\ \ /\ / // _` |/ __|| '_ \|/ | __| / __|| '_ \ | | / __|| |/ // _ \| '_ \ + \ V V /| (_| |\__ \| | | | | |_ | (__ | | | || || (__ | <| __/| | | | _ + \_/\_/ \__,_||___/|_| |_| \__| \___||_| |_||_| \___||_|\_\\___||_| |_|(_) + + _ + (_) _ __ + _____ _____ | || '_ \ + |_____||_____| | || | | | + |_||_| |_| + + _ _ _ _ _ _ + _| || |_ __| | ___ | |__ (_) __ _ _ __ __| | ___ __ __ ___ +|_ .. _| / _` | / _ \| '_ \ | | / _` || '_ \ _____ / _` | / _ \\ \ / // _ \ +|_ _|| (_| || __/| |_) || || (_| || | | ||_____|| (_| || __/ \ V /| __/ + |_||_| \__,_| \___||_.__/ |_| \__,_||_| |_| \__,_| \___| \_/ \___| + + _ +| | +| | +| | +|_| + diff --git a/externals/figlet/tests/res010.txt b/externals/figlet/tests/res010.txt new file mode 100644 index 0000000000..43a2523636 --- /dev/null +++ b/externals/figlet/tests/res010.txt @@ -0,0 +1,156 @@ + __ _ _ _ __ + / / (_) ___ ___ | |__ | | __ \ \ + / / | | / _ \ / __| | '_ \ | |/ / \ \ + \ \ | | | (_) | \__ \ | | | | | < / / + \_\ _/ | \___/ |___/ |_| |_| |_|\_\ /_/ + |__/ + _ _ _ ____ _ __ _ + (_) ___ ___ | |__ | | __ / __ \ (_) _ __ / _| | | _ _ + | | / _ \ / __| | '_ \ | |/ / / / _` | | | | '_ \ | |_ | | | | | | + | | | (_) | \__ \ | | | | | < | | (_| | | | | | | | | _| | | | |_| | + _/ | \___/ |___/ |_| |_| |_|\_\ \ \__,_| |_| |_| |_| |_| |_| \__,_| + |__/ \____/ + __ _ __ _ + __ __ _ / / ___ | |_ ___ / / | | ___ __ _ _ __ + \ \/ / (_) / / / _ \ | __| / __| / / | | / _ \ / _` | | '__| + > < _ / / | __/ | |_ | (__ / / | | | (_) | | (_| | | | + /_/\_\ (_) /_/ \___| \__| \___| /_/ |_| \___/ \__, | |_| + |___/ + _ _ _ __ _ + ___ | |_ __ _ | |_ ___ __| | \ \ ___ | |__ + / _ \ | __| / _` | | __| / _ \ / _` | \ \ / __| | '_ \ + | (_) | | |_ | (_| | | |_ | __/ _ | (_| | / / \__ \ | | | | + \___/ \__| \__,_| \__| \___| (_) \__,_| /_/ |___/ |_| |_| + + + _ __ __/\__ + _____ | '_ \ \ / + |_____| | | | | /_ _\ + |_| |_| \/ + + __ _ _ _ __ + / / (_) ___ ___ | |__ | | __ \ \ + / / | | / _ \ / __| | '_ \ | |/ / \ \ + \ \ | | | (_) | \__ \ | | | | | < / / + \_\ _/ | \___/ |___/ |_| |_| |_|\_\ /_/ + |__/ + _ _ _ + __ _ _ __ __ _ ___ | |__ ___ _ | | (_) _ __ ___ + / _` | | '_ \ / _` | / __| | '_ \ / _ \ (_) | | | | | '_ \ / _ \ + | (_| | | |_) | | (_| | | (__ | | | | | __/ _ | | | | | | | | | __/ + \__,_| | .__/ \__,_| \___| |_| |_| \___| (_) |_| |_| |_| |_| \___| + |_| + _ _ _ _ + / | | || | _ ___ _ _ _ __ | |_ __ _ __ __ + | | | || |_ (_) / __| | | | | | '_ \ | __| / _` | \ \/ / + | | |__ _| _ \__ \ | |_| | | | | | | |_ | (_| | > < + |_| |_| (_) |___/ \__, | |_| |_| \__| \__,_| /_/\_\ + |___/ + + ___ _ __ _ __ ___ _ __ _ __ ___ __ _ _ __ + / _ \ | '__| | '__| / _ \ | '__| | '_ \ / _ \ / _` | | '__| + | __/ | | | | | (_) | | | | | | | | __/ | (_| | | | + \___| |_| |_| \___/ |_| |_| |_| \___| \__,_| |_| + + _ _ + _ _ _ __ ___ __ __ _ __ ___ ___ | |_ ___ __| | + | | | | | '_ \ / _ \ \ \/ / | '_ \ / _ \ / __| | __| / _ \ / _` | + | |_| | | | | | | __/ > < | |_) | | __/ | (__ | |_ | __/ | (_| | + \__,_| |_| |_| \___| /_/\_\ | .__/ \___| \___| \__| \___| \__,_| + |_| + _ _ _ __ _ + | |_ ___ | | __ ___ _ __ ( ) \ \ ( ) + | __| / _ \ | |/ / / _ \ | '_ \ \| | | |/ + | |_ | (_) | | < | __/ | | | | > > + \__| \___/ |_|\_\ \___| |_| |_| | | + /_/ + __ _ _ _ __ + / / (_) ___ ___ | |__ | | __ \ \ + / / | | / _ \ / __| | '_ \ | |/ / \ \ + \ \ | | | (_) | \__ \ | | | | | < / / + \_\ _/ | \___/ |___/ |_| |_| |_|\_\ /_/ + |__/ + _ _ _ + __ _ _ __ __ _ ___ | |__ ___ _ | | (_) _ __ ___ + / _` | | '_ \ / _` | / __| | '_ \ / _ \ (_) | | | | | '_ \ / _ \ + | (_| | | |_) | | (_| | | (__ | | | | | __/ _ | | | | | | | | | __/ + \__,_| | .__/ \__,_| \___| |_| |_| \___| (_) |_| |_| |_| |_| \___| + |_| + _ _ _ _ __ _ + / | | || | _ ( ) \ \ ( ) + | | | || |_ (_) \| | | |/ + | | |__ _| _ > > + |_| |_| (_) | | + /_/ + __ _ _ _ __ _ _ + / / (_) ___ ___ | |__ | | __ \ \ | |_ | |__ ___ + / / | | / _ \ / __| | '_ \ | |/ / \ \ | __| | '_ \ / _ \ + \ \ | | | (_) | \__ \ | | | | | < / / | |_ | | | | | __/ + \_\ _/ | \___/ |___/ |_| |_| |_|\_\ /_/ \__| |_| |_| \___| + |__/ + _ _ + _ __ | | ___ | |_ + | '_ \ | | / _ \ | __| + | |_) | | | | (_) | | |_ + | .__/ |_| \___/ \__| + |_| + _ _ _ _ + | |_ | |__ (_) ___ | | __ ___ _ __ ___ + | __| | '_ \ | | / __| | |/ / / _ \ | '_ \ / __| + | |_ | | | | | | | (__ | < | __/ | | | | \__ \ + \__| |_| |_| |_| \___| |_|\_\ \___| |_| |_| |___/ + + __ __ __ _ _ _ __ + / / __ _ ___ _ _ / _| / _| (_) ___ | | __| | \ \ + / / / _` | / __| | | | | | |_ | |_ | | / _ \ | | / _` | \ \ + \ \ | (_| | \__ \ | |_| | | _| | _| | | | __/ | | | (_| | / / + \_\ \__,_| |___/ \__,_| |_| |_| |_| \___| |_| \__,_| /_/ + + _ _ _ _ + | |_ | |__ ___ ___ ___ __ _ _ __ ___ _ __ ( ) | |_ + | __| | '_ \ / _ \ / __| / _ \ / _` | | '__| / _ \ | '_ \ |/ | __| + | |_ | | | | | (_) | \__ \ | __/ | (_| | | | | __/ | | | | | |_ + \__| |_| |_| \___/ |___/ \___| \__,_| |_| \___| |_| |_| \__| + + _ _ _ _ _ + ___ | |__ ___ | | | | ___ ___ _ __ (_) _ __ | |_ ___ + / __| | '_ \ / _ \ | | | | / __| / __| | '__| | | | '_ \ | __| / __| + \__ \ | | | | | __/ | | | | \__ \ | (__ | | | | | |_) | | |_ \__ \ + |___/ |_| |_| \___| |_| |_| |___/ \___| |_| |_| | .__/ \__| |___/ + |_| + __ _ _ __ _ _ _ + / / ___ _ __ (_) ___ | |__ \ \ | |_ | |__ (_) ___ + / / / _ \ | '__| | | / __| | '_ \ \ \ | __| | '_ \ | | / __| + \ \ | __/ | | | | | (__ | | | | / / | |_ | | | | | | \__ \ + \_\ \___| |_| |_| \___| |_| |_| /_/ \__| |_| |_| |_| |___/ + + _ _ + __ __ __ _ ___ _ __ ( ) | |_ + \ \ /\ / / / _` | / __| | '_ \ |/ | __| + \ V V / | (_| | \__ \ | | | | | |_ + \_/\_/ \__,_| |___/ |_| |_| \__| + + _ _ _ + ___ | |__ (_) ___ | | __ ___ _ __ + / __| | '_ \ | | / __| | |/ / / _ \ | '_ \ + | (__ | | | | | | | (__ | < | __/ | | | | _ + \___| |_| |_| |_| \___| |_|\_\ \___| |_| |_| (_) + + _ + (_) _ __ + _____ _____ | | | '_ \ + |_____| |_____| | | | | | | + |_| |_| |_| + + _ _ _ _ _ _ + _| || |_ __| | ___ | |__ (_) __ _ _ __ __| | ___ + |_ .. _| / _` | / _ \ | '_ \ | | / _` | | '_ \ _____ / _` | / _ \ + |_ _| | (_| | | __/ | |_) | | | | (_| | | | | | |_____| | (_| | | __/ + |_||_| \__,_| \___| |_.__/ |_| \__,_| |_| |_| \__,_| \___| + + _ + __ __ ___ | | + \ \ / / / _ \ | | + \ V / | __/ | | + \_/ \___| |_| + diff --git a/externals/figlet/tests/res011.txt b/externals/figlet/tests/res011.txt new file mode 100644 index 0000000000..3b669a139d --- /dev/null +++ b/externals/figlet/tests/res011.txt @@ -0,0 +1,114 @@ + __ _ _ _ __ + / /(_) ___ ___| |__ | | _\ \ +/ / | |/ _ \/ __| '_ \| |/ /\ \ +\ \ | | (_) \__ | | | | < / / + \__/ |\___/|___|_| |_|_|\_/_/ + |__/ + _ _ _ ____ _ __ _ __ _ + (_) ___ ___| |__ | | __/ __ \(_)_ __ / _| |_ ___ ___ / ___| |_ ___ + | |/ _ \/ __| '_ \| |/ / / _` | | '_ \| |_| | | | \ \/ (_) / / _ | __/ __| + | | (_) \__ | | | | | | (_| | | | | | _| | |_| |> < _ / | __| || (__ + _/ |\___/|___|_| |_|_|\_\ \__,_|_|_| |_|_| |_|\__,_/_/\_(_/_/ \___|\__\___| +|__/ \____/ + ___ _ _ ___ _ + / | | ___ __ _ _ __ ___ | |_ __ _| |_ ___ __| \ \ ___| |__ _ __ + / /| |/ _ \ / _` | '__/ _ \| __/ _` | __/ _ \ / _` |\ / __| '_ \ _____| '_ \ + / / | | (_) | (_| | | | (_) | || (_| | || __/| (_| |/ \__ | | | |_____| | | | +/_/ |_|\___/ \__, |_| \___/ \__\__,_|\__\___(_\__,_/_/|___|_| |_| |_| |_| + |___/ + +__/\__ +\ / +/_ _\ + \/ + + __ _ _ _ __ _ + / /(_) ___ ___| |__ | | _\ \ __ _ _ __ __ _ ___| |__ ___ _ +/ / | |/ _ \/ __| '_ \| |/ /\ \/ _` | '_ \ / _` |/ __| '_ \ / _ (_) +\ \ | | (_) \__ | | | | < / | (_| | |_) | (_| | (__| | | | __/_ + \__/ |\___/|___|_| |_|_|\_/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + |__/ |_| + _ _ _ _ _ _ +| (_)_ __ ___/ | || | _ ___ _ _ _ __ | |_ __ ___ __ +| | | '_ \ / _ | | || |(_/ __| | | | '_ \| __/ _` \ \/ / +| | | | | | __| |__ __\__ | |_| | | | | || (_| |> < +|_|_|_| |_|\___|_| |_|(_|___/\__, |_| |_|\__\__,_/_/\_\ + |___/ + + ___ _ __ _ __ ___ _ __ _ __ ___ __ _ _ __ + / _ | '__| '__/ _ \| '__| '_ \ / _ \/ _` | '__| +| __| | | | | (_) | | | | | | __| (_| | | + \___|_| |_| \___/|_| |_| |_|\___|\__,_|_| + + _ _ _ _ + _ _ _ __ _____ ___ __ ___ ___| |_ ___ __| | |_ ___ | | _____ _ __ +| | | | '_ \ / _ \ \/ | '_ \ / _ \/ __| __/ _ \/ _` | __/ _ \| |/ / _ | '_ \ +| |_| | | | | __/> <| |_) | __| (__| || __| (_| | || (_) | | __| | | | + \__,_|_| |_|\___/_/\_| .__/ \___|\___|\__\___|\__,_|\__\___/|_|\_\___|_| |_| + |_| + ___ _ +( \ \( ) + \|| |/ + > > + | | + /_/ + __ _ _ _ __ _ + / /(_) ___ ___| |__ | | _\ \ __ _ _ __ __ _ ___| |__ ___ _ +/ / | |/ _ \/ __| '_ \| |/ /\ \/ _` | '_ \ / _` |/ __| '_ \ / _ (_) +\ \ | | (_) \__ | | | | < / | (_| | |_) | (_| | (__| | | | __/_ + \__/ |\___/|___|_| |_|_|\_/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + |__/ |_| + _ _ _ _ _ ___ _ +| (_)_ __ ___/ | || | _( \ \( ) +| | | '_ \ / _ | | || |(_)\|| |/ +| | | | | | __| |__ __ > > +|_|_|_| |_|\___|_| |_|(_) | | + /_/ + __ _ _ _ __ _ _ _ _ + / /(_) ___ ___| |__ | | _\ \| |_| |__ ___ _ __ | | ___ | |_ +/ / | |/ _ \/ __| '_ \| |/ /\ | __| '_ \ / _ | '_ \| |/ _ \| __| +\ \ | | (_) \__ | | | | < / | |_| | | | __| |_) | | (_) | |_ + \__/ |\___/|___|_| |_|_|\_/_/ \__|_| |_|\___| .__/|_|\___/ \__| + |__/ |_| + _ _ _ _ +| |_| |__ (_) ___| | _____ _ __ ___ +| __| '_ \| |/ __| |/ / _ | '_ \/ __| +| |_| | | | | (__| | __| | | \__ \ + \__|_| |_|_|\___|_|\_\___|_| |_|___/ + + __ __ __ _ _ ___ _ _ + / /__ _ ___ _ _ / _|/ _(_) ___| | __| \ \| |_| |__ ___ ___ ___ +/ // _` / __| | | | |_| |_| |/ _ | |/ _` |\ | __| '_ \ / _ \/ __|/ _ \ +\ | (_| \__ | |_| | _| _| | __| | (_| |/ | |_| | | | (_) \__ | __/ + \_\__,_|___/\__,_|_| |_| |_|\___|_|\__,_/_/ \__|_| |_|\___/|___/\___| + + _ _ _ _ _ _ _ + __ _ _ __ ___ _ __( | |_ ___| |__ ___| | |___ ___ _ __(_)_ __ | |_ ___ + / _` | '__/ _ | '_ |/| __/ __| '_ \ / _ | | / __|/ __| '__| | '_ \| __/ __| +| (_| | | | __| | | || |_\__ | | | | __| | \__ | (__| | | | |_) | |_\__ \ + \__,_|_| \___|_| |_| \__|___|_| |_|\___|_|_|___/\___|_| |_| .__/ \__|___/ + |_| + __ _ _ __ _ _ _ _ _ + / /___ _ __(_) ___| |__ \ \| |_| |__ (_)_____ ____ _ ___ _ __( | |_ +/ // _ | '__| |/ __| '_ \ \ | __| '_ \| / __\ \ /\ / / _` / __| '_ |/| __| +\ | __| | | | (__| | | |/ | |_| | | | \__ \\ V V | (_| \__ | | | || |_ + \_\___|_| |_|\___|_| |_/_/ \__|_| |_|_|___/ \_/\_/ \__,_|___|_| |_| \__| + + _ _ _ + ___| |__ (_) ___| | _____ _ __ + / __| '_ \| |/ __| |/ / _ | '_ \ +| (__| | | | | (__| | __| | | |_ + \___|_| |_|_|\___|_|\_\___|_| |_(_) + + _ + (_)_ __ + _____ _____| | '_ \ +|_____|_____| | | | | + |_|_| |_| + + _ _ _ _ _ _ _ + _| || |_ __| | ___| |__ (_) __ _ _ __ __| | _____ _____| | +|_ .. _|/ _` |/ _ | '_ \| |/ _` | '_ \ _____ / _` |/ _ \ \ / / _ | | +|_ _| (_| | __| |_) | | (_| | | | |_____| (_| | __/\ V | __| | + |_||_| \__,_|\___|_.__/|_|\__,_|_| |_| \__,_|\___| \_/ \___|_| + diff --git a/externals/figlet/tests/res012.txt b/externals/figlet/tests/res012.txt new file mode 100644 index 0000000000..3a25e26453 --- /dev/null +++ b/externals/figlet/tests/res012.txt @@ -0,0 +1,36 @@ + ┛┏━┃┏━┛┃ ┃┃ ┃ + ┃┃ ┃━━┃┏━┃┏┛ +<━┛━━┛━━┛┛ ┛┛ ┛> + ┛┏━┃┏━┛┃ ┃┃ ┃┏━┃┛┏━ ┏━┛┃ ┃ ┃┃ ┃ ┛┏━┛━┏┛┏━┛ ┛┃ ┏━┃┏━┛┏━┃┏━┃━┏┛┏━┃━┏┛┏━┛ + ┃┃ ┃━━┃┏━┃┏┛ ┃┛┛┃┃ ┃┏━┛┃ ┃ ┃ ┛ ┛ ┛ ┏━┛ ┃ ┃ ┛ ┃ ┃ ┃┃ ┃┏┏┛┃ ┃ ┃ ┏━┃ ┃ ┏━┛ +━┛━━┛━━┛┛ ┛┛ ┛━━┛┛┛ ┛┛ ━━┛━━┛┛ ┛┛┛ ━━┛ ┛ ━━┛┛ ━━┛━━┛━━┛┛ ┛━━┛ ┛ ┛ ┛ ┛ ━━┛┛ +┏━ ┏━┛┃ ┃ ┏━ ┛ ┛ +┃ ┃ ━━┃┏━┃ ━┛┃ ┃ ━┏┛ +━━ > ━━┛┛ ┛ ┛ ┛ ┛ ┛ + ┛┏━┃┏━┛┃ ┃┃ ┃ ┏━┃┏━┃┏━┃┏━┛┃ ┃┏━┛ ┃ ┛┏━ ┏━┛ ━┃ ┃ ┃ ┏━┛┃ ┃┏━ ━┏┛┏━┃┃ ┃ + ┃┃ ┃━━┃┏━┃┏┛ ┏━┃┏━┛┏━┃┃ ┏━┃┏━┛┛ ┃ ┃┃ ┃┏━┛ ┃ ━━┃┛ ━━┃━┏┛┃ ┃ ┃ ┏━┃ ┛ +<━┛━━┛━━┛┛ ┛┛ ┛> ┛ ┛┛ ┛ ┛━━┛┛ ┛━━┛┛ ━━┛┛┛ ┛━━┛ ━━┛ ┛┛ ━━┛ ┛ ┛ ┛ ┛ ┛ ┛┛ ┛ +┏━┛┏━┃┏━┃┏━┃┏━┃ ┏━ ┏━┛┏━┃┏━┃ ┃ ┃┏━ ┏━┛┃ ┃┏━┃┏━┛┏━┛━┏┛┏━┛┏━ ━┏┛┏━┃┃ ┃┏━┛┏━ +┏━┛┏┏┛┏┏┛┃ ┃┏┏┛ ┃ ┃┏━┛┏━┃┏┏┛ ┃ ┃┃ ┃┏━┛ ┛ ┏━┛┏━┛┃ ┃ ┏━┛┃ ┃ ┃ ┃ ┃┏┛ ┏━┛┃ ┃ +━━┛┛ ┛┛ ┛━━┛┛ ┛ ┛ ┛━━┛┛ ┛┛ ┛ ━━┛┛ ┛━━┛┛ ┛┛ ━━┛━━┛ ┛ ━━┛━━ ┛ ━━┛┛ ┛━━┛┛ ┛ +┛ ━┃ ┛ + ┛ ┏┛ + ━┛ + ┛┏━┃┏━┛┃ ┃┃ ┃ ┏━┃┏━┃┏━┃┏━┛┃ ┃┏━┛ ┃ ┛┏━ ┏━┛ ━┃ ┃ ┃ ┛ ━┃ ┛ + ┃┃ ┃━━┃┏━┃┏┛ ┏━┃┏━┛┏━┃┃ ┏━┃┏━┛┛ ┃ ┃┃ ┃┏━┛ ┃ ━━┃┛ ┛ ┏┛ +<━┛━━┛━━┛┛ ┛┛ ┛> ┛ ┛┛ ┛ ┛━━┛┛ ┛━━┛┛ ━━┛┛┛ ┛━━┛ ━━┛ ┛┛ ━┛ + ┛┏━┃┏━┛┃ ┃┃ ┃ ━┏┛┃ ┃┏━┛ ┏━┃┃ ┏━┃━┏┛ ━┏┛┃ ┃┛┏━┛┃ ┃┏━┛┏━ ┏━┛ + ┃┃ ┃━━┃┏━┃┏┛ ┃ ┏━┃┏━┛ ┏━┛┃ ┃ ┃ ┃ ┃ ┏━┃┃┃ ┏┛ ┏━┛┃ ┃━━┃ +<━┛━━┛━━┛┛ ┛┛ ┛> ┛ ┛ ┛━━┛ ┛ ━━┛━━┛ ┛ ┛ ┛ ┛┛━━┛┛ ┛━━┛┛ ┛━━┛ + ┏━┃┏━┛┃ ┃┏━┛┏━┛┛┏━┛┃ ┏━ ━┏┛┃ ┃┏━┃┏━┛┏━┛ ┏━┃┏━┃┏━┛┏━ ┛━┏┛ ┏━┛┃ ┃┏━┛┃ ┃ + ┏━┃━━┃┃ ┃┏━┛┏━┛┃┏━┛┃ ┃ ┃ ┃ ┏━┃┃ ┃━━┃┏━┛ ┏━┃┏┏┛┏━┛┃ ┃ ┃ ━━┃┏━┃┏━┛┃ ┃ +<┛ ┛━━┛━━┛┛ ┛ ┛━━┛━━┛━━ > ┛ ┛ ┛━━┛━━┛━━┛ ┛ ┛┛ ┛━━┛┛ ┛ ┛ ━━┛┛ ┛━━┛━━┛━━┛ +┏━┛┏━┛┏━┃┛┏━┃━┏┛┏━┛ +━━┃┃ ┏┏┛┃┏━┛ ┃ ━━┃ +━━┛━━┛┛ ┛┛┛ ┛ ━━┛ + ┏━┛┏━┃┛┏━┛┃ ┃ ━┏┛┃ ┃┛┏━┛ ┃┃┃┏━┃┏━┛┏━ ┛━┏┛ ┏━┛┃ ┃┛┏━┛┃ ┃┏━┛┏━ + ┏━┛┏┏┛┃┃ ┏━┃ ┃ ┏━┃┃━━┃ ┃┃┃┏━┃━━┃┃ ┃ ┃ ┃ ┏━┃┃┃ ┏┛ ┏━┛┃ ┃ +<━━┛┛ ┛┛━━┛┛ ┛> ┛ ┛ ┛┛━━┛ ━━┛┛ ┛━━┛┛ ┛ ┛ ━━┛┛ ┛┛━━┛┛ ┛━━┛┛ ┛┛ + ┛┏━ ┏━ ┏━┛┏━ ┛┏━┃┏━ ┏━ ┏━┛┃ ┃┏━┛┃ + ━┛━┛ ┃┃ ┃ ┃ ┃┏━┛┏━┃┃┏━┃┃ ┃━┛┃ ┃┏━┛┃ ┃┏━┛┃ + ┛┛ ┛ #━━ ━━┛━━ ┛┛ ┛┛ ┛ ━━ ━━┛ ┛ ━━┛━━┛ diff --git a/externals/figlet/tests/res013.txt b/externals/figlet/tests/res013.txt new file mode 100644 index 0000000000..6983f2faa4 --- /dev/null +++ b/externals/figlet/tests/res013.txt @@ -0,0 +1,132 @@ + __ _ _ _ __ + \ \ | | __| |__ ___ ___ (_) / / + \ \| |/ /| '_ \ / __| / _ \ | |/ / + / /| < | | | |\__ \| (_) || |\ \ + /_/ |_|\_\|_| |_||___/ \___/_/ | \_\ + |__/ + __ _ __ _ ____ _ _ _ + / /_ __ __ _ _ | | / _| _ __ (_) / __ \ | | __| |__ ___ ___ (_) + / /(_)\ \/ /| | | || || |_ | '_ \ | | / / _` || |/ /| '_ \ / __| / _ \ | | + / / _ > < | |_| || || _|| | | || || | (_| || < | | | |\__ \| (_) || | + /_/ (_)/_/\_\ \__,_||_||_| |_| |_||_| \ \__,_||_|\_\|_| |_||___/ \___/_/ | + \____/ |__/ + _ _ _ __ _ + ___ | |_ __ _ | |_ ___ _ __ __ _ ___ | | / /___ | |_ ___ + / _ \| __|/ _` || __|/ _ \ | '__|/ _` | / _ \ | | / // __|| __|/ _ \ + _| __/| |_| (_| || |_| (_) || | | (_| || (_) || | / /| (__ | |_| __/ + (_)\___| \__|\__,_| \__|\___/ |_| \__, | \___/ |_|/_/ \___| \__|\___| + |___/ + _ __ _ + __/\__ _ __ | |__ ___ \ \ __| | + \ / | '_ \ _____ | '_ \ / __| \ \ / _` | + /_ _\ | | | ||_____| | | | |\__ \ / /| (_| | + \/ |_| |_| |_| |_||___/ /_/ \__,_| + + _ __ _ _ _ __ + _ ___ | |__ ___ __ _ _ __ __ _ \ \ | | __| |__ ___ ___ (_) / / + (_)/ _ \| '_ \ / __|/ _` || '_ \ / _` | \ \| |/ /| '_ \ / __| / _ \ | |/ / + _| __/| | | || (__| (_| || |_) || (_| | / /| < | | | |\__ \| (_) || |\ \ + (_)\___||_| |_| \___|\__,_|| .__/ \__,_| /_/ |_|\_\|_| |_||___/ \___/_/ | \_\ + |_| |__/ + _ _ _ _ _ _ + __ __ __ _ | |_ _ __ _ _ ___ _ | || | / | ___ _ __ (_)| | + \ \/ // _` || __|| '_ \ | | | |/ __| (_)| || |_ | | / _ \| '_ \ | || | + > <| (_| || |_ | | | || |_| |\__ \ _ |__ _|| | | __/| | | || || | + /_/\_\\__,_| \__||_| |_| \__, ||___/ (_) |_| |_| \___||_| |_||_||_| + |___/ + + _ __ __ _ ___ _ __ _ __ ___ _ __ _ __ ___ + | '__|/ _` | / _ \| '_ \ | '__|/ _ \ | '__|| '__|/ _ \ + | | | (_| || __/| | | | | | | (_) || | | | | __/ + |_| \__,_| \___||_| |_| |_| \___/ |_| |_| \___| + + _ _ + __| | ___ | |_ ___ ___ _ __ __ __ ___ _ __ _ _ + / _` | / _ \| __|/ __|/ _ \| '_ \\ \/ // _ \| '_ \ | | | | + | (_| || __/| |_| (__| __/| |_) |> <| __/| | | || |_| | + \__,_| \___| \__|\___|\___|| .__//_/\_\\___||_| |_| \__,_| + |_| + _ __ _ _ _ + ( )\ \ ( ) _ __ ___ | | __ ___ | |_ + |/ | | \| | '_ \ / _ \| |/ // _ \ | __| + > > | | | || __/| <| (_) || |_ + | | |_| |_| \___||_|\_\\___/ \__| + /_/ + _ __ _ _ _ __ + _ ___ | |__ ___ __ _ _ __ __ _ \ \ | | __| |__ ___ ___ (_) / / + (_)/ _ \| '_ \ / __|/ _` || '_ \ / _` | \ \| |/ /| '_ \ / __| / _ \ | |/ / + _| __/| | | || (__| (_| || |_) || (_| | / /| < | | | |\__ \| (_) || |\ \ + (_)\___||_| |_| \___|\__,_|| .__/ \__,_| /_/ |_|\_\|_| |_||___/ \___/_/ | \_\ + |_| |__/ + _ __ _ _ _ _ _ _ + ( )\ \ ( ) _ | || | / | ___ _ __ (_)| | + |/ | | \| (_)| || |_ | | / _ \| '_ \ | || | + > > _ |__ _|| | | __/| | | || || | + | | (_) |_| |_| \___||_| |_||_||_| + /_/ + _ _ _ _ __ _ _ _ __ + | |_ ___ | | _ __ ___ | |__ | |_ \ \ | | __| |__ ___ ___ (_) / / + | __|/ _ \ | || '_ \ / _ \| '_ \ | __| \ \| |/ /| '_ \ / __| / _ \ | |/ / + | |_| (_) || || |_) | | __/| | | || |_ / /| < | | | |\__ \| (_) || |\ \ + \__|\___/ |_|| .__/ \___||_| |_| \__| /_/ |_|\_\|_| |_||___/ \___/_/ | \_\ + |_| |__/ + _ _ _ _ + ___ _ __ ___ | | __ ___ (_)| |__ | |_ + / __|| '_ \ / _ \| |/ // __|| || '_ \ | __| + \__ \| | | || __/| <| (__ | || | | || |_ + |___/|_| |_| \___||_|\_\\___||_||_| |_| \__| + + __ _ _ _ __ __ __ + \ \ __| || | ___ (_) / _| / _| _ _ ___ __ _ / / + \ \ / _` || | / _ \| || |_ | |_ | | | |/ __| / _` |/ / + / /| (_| || || __/| || _|| _|| |_| |\__ \| (_| |\ \ + /_/ \__,_||_| \___||_||_| |_| \__,_||___/ \__,_| \_\ + + _ _ _ _ + | |_ ( )_ __ ___ _ __ __ _ ___ ___ ___ | |__ | |_ + | __||/| '_ \ / _ \| '__|/ _` | / _ \/ __| / _ \ | '_ \ | __| + | |_ | | | || __/| | | (_| | | __/\__ \| (_) || | | || |_ + \__| |_| |_| \___||_| \__,_| \___||___/ \___/ |_| |_| \__| + + _ _ _ _ _ + ___ | |_ _ __ (_) _ __ ___ ___ | || | ___ | |__ ___ + / __|| __|| '_ \ | || '__|/ __|/ __| | || | / _ \| '_ \ / __| + \__ \| |_ | |_) || || | | (__ \__ \ | || || __/| | | |\__ \ + |___/ \__|| .__/ |_||_| \___||___/ |_||_| \___||_| |_||___/ + |_| + _ _ _ __ _ _ __ + ___ (_)| |__ | |_ \ \ | |__ ___ (_) _ __ ___ / / + / __|| || '_ \ | __| \ \| '_ \ / __|| || '__|/ _ \/ / + \__ \| || | | || |_ / /| | | || (__ | || | | __/\ \ + |___/|_||_| |_| \__| /_/ |_| |_| \___||_||_| \___| \_\ + + _ _ + | |_ ( )_ __ ___ __ _ __ __ + | __||/| '_ \ / __| / _` |\ \ /\ / / + | |_ | | | |\__ \| (_| | \ V V / + \__| |_| |_||___/ \__,_| \_/\_/ + + _ _ _ + _ __ ___ | | __ ___ (_)| |__ ___ + | '_ \ / _ \| |/ // __|| || '_ \ / __| + _ | | | || __/| <| (__ | || | | || (__ + (_)|_| |_| \___||_|\_\\___||_||_| |_| \___| + + _ + _ __ (_) + | '_ \ | | _____ _____ + | | | || | |_____||_____| + |_| |_||_| + + _ _ _ _ _ _ + __ __ ___ __| | _ __ __ _ (_)| |__ ___ __| | _| || |_ + \ \ / // _ \ / _` | _____ | '_ \ / _` || || '_ \ / _ \ / _` ||_ .. _| + \ V /| __/| (_| ||_____|| | | || (_| || || |_) || __/| (_| ||_ _| + \_/ \___| \__,_| |_| |_| \__,_||_||_.__/ \___| \__,_| |_||_| + + _ + | | ___ + | | / _ \ + | || __/ + |_| \___| + diff --git a/externals/figlet/tests/res014.txt b/externals/figlet/tests/res014.txt new file mode 100644 index 0000000000..545bbce996 --- /dev/null +++ b/externals/figlet/tests/res014.txt @@ -0,0 +1,144 @@ + __ __ __ _ __ + \ \ / /__ / /_ _____ ____ (_)/ / + \ \ / //_// __ \ / ___// __ \ / // / + / // ,< / / / /(__ )/ /_/ / / / \ \ + /_//_/|_|/_/ /_//____/ \____/__/ / \_\ + /___/ + __ ____ _ ______ __ __ _ + _ _ __ __ __ / // __/____ (_)/ ____ \ / /__ / /_ _____ ____ (_) + (_)| |/_// / / // // /_ / __ \ / // / __ `// //_// __ \ / ___// __ \ / / + _ _> < / /_/ // // __// / / // // / /_/ // ,< / / / /(__ )/ /_/ / / / + (_)/_/|_| \__,_//_//_/ /_/ /_//_/ \ \__,_//_/|_|/_/ /_//____/ \____/__/ / + \____/ /___/ + __ __ __ __ __ __ + / /_ ____ _ / /_ ____ _____ ____ _ ____ / / _/_/_____ / /_ ___ _/_/ + / __// __ `// __// __ \ / ___// __ `// __ \ / / _/_/ / ___// __// _ \ _/_/ + / /_ / /_/ // /_ / /_/ // / / /_/ // /_/ // /_/_/ / /__ / /_ / __/_/_/ + \__/ \__,_/ \__/ \____//_/ \__, / \____//_//_/ \___/ \__/ \___//_/ + /____/ + __ __ __ + __/|_ ____ / /_ _____ \ \ ____/ / ___ + | / / __ \ ______ / __ \ / ___/ \ \ / __ / / _ \ + /_ __| / / / //_____/ / / / /(__ ) / // /_/ /_ / __/ + |/ /_/ /_/ /_/ /_//____/ /_/ \__,_/(_)\___/ + + __ __ __ _ __ + \ \ / /__ / /_ _____ ____ (_)/ / + \ \ / //_// __ \ / ___// __ \ / // / + / // ,< / / / /(__ )/ /_/ / / / \ \ + /_//_/|_|/_/ /_//____/ \____/__/ / \_\ + /___/ + _ __ __ + ___ ____ (_)/ / _ ___ / /_ _____ ____ _ ____ ____ _ + / _ \ / __ \ / // / (_)/ _ \ / __ \ / ___// __ `// __ \ / __ `/ + / __// / / // // / _ / __// / / // /__ / /_/ // /_/ // /_/ / + \___//_/ /_//_//_/ (_) \___//_/ /_/ \___/ \__,_// .___/ \__,_/ + /_/ + __ __ __ ___ + _ __ ____ _ / /_ ____ __ __ _____ _ / // / < / + | |/_// __ `// __// __ \ / / / // ___/ (_)/ // /_ / / + _> < / /_/ // /_ / / / // /_/ /(__ ) _ /__ __// / + /_/|_| \__,_/ \__//_/ /_/ \__, //____/ (_) /_/ /_/ + /____/ + + _____ ____ _ ___ ____ _____ ____ _____ _____ ___ + / ___// __ `// _ \ / __ \ / ___// __ \ / ___// ___// _ \ + / / / /_/ // __// / / / / / / /_/ // / / / / __/ + /_/ \__,_/ \___//_/ /_/ /_/ \____//_/ /_/ \___/ + + __ __ + ____/ /___ / /_ _____ ___ ____ _ __ ___ ____ __ __ + / __ // _ \ / __// ___// _ \ / __ \ | |/_// _ \ / __ \ / / / / + / /_/ // __// /_ / /__ / __// /_/ /_> < / __// / / // /_/ / + \__,_/ \___/ \__/ \___/ \___// .___//_/|_| \___//_/ /_/ \__,_/ + /_/ + _ _ _ __ __ + ( )| |( ) ____ ___ / /__ ____ / /_ + |/ / / V / __ \ / _ \ / //_// __ \ / __/ + _>_> / / / // __// ,< / /_/ // /_ + _/_/ /_/ /_/ \___//_/|_| \____/ \__/ + /_/ + __ __ __ _ __ + \ \ / /__ / /_ _____ ____ (_)/ / + \ \ / //_// __ \ / ___// __ \ / // / + / // ,< / / / /(__ )/ /_/ / / / \ \ + /_//_/|_|/_/ /_//____/ \____/__/ / \_\ + /___/ + _ __ __ + ___ ____ (_)/ / _ ___ / /_ _____ ____ _ ____ ____ _ + / _ \ / __ \ / // / (_)/ _ \ / __ \ / ___// __ `// __ \ / __ `/ + / __// / / // // / _ / __// / / // /__ / /_/ // /_/ // /_/ / + \___//_/ /_//_//_/ (_) \___//_/ /_/ \___/ \__,_// .___/ \__,_/ + /_/ + _ _ _ __ __ ___ + ( )| |( ) _ / // / < / + |/ / / V (_)/ // /_ / / + _>_> _ /__ __// / + _/_/ (_) /_/ /_/ + /_/ + __ __ __ __ __ _ __ + ___ / /_ / /_ \ \ / /__ / /_ _____ ____ (_)/ / + / _ \ / __ \ / __/ \ \ / //_// __ \ / ___// __ \ / // / + / __// / / // /_ / // ,< / / / /(__ )/ /_/ / / / \ \ + \___//_/ /_/ \__/ /_//_/|_|/_/ /_//____/ \____/__/ / \_\ + /___/ + __ _ __ __ __ __ + _____ ____ ___ / /__ _____ (_)/ /_ / /_ / /_ ____ / /____ + / ___// __ \ / _ \ / //_// ___// // __ \ / __/ / __// __ \ / // __ \ + (__ )/ / / // __// ,< / /__ / // / / // /_ / /_ / /_/ // // /_/ / + /____//_/ /_/ \___//_/|_| \___//_//_/ /_/ \__/ \__/ \____//_// .___/ + /_/ + __ __ __ _ ____ ____ __ + \ \ ____/ // /___ (_)/ __// __/__ __ _____ ____ _ / / + \ \ / __ // // _ \ / // /_ / /_ / / / // ___// __ `// / + / // /_/ // // __// // __// __// /_/ /(__ )/ /_/ / \ \ + /_/ \__,_//_/ \___//_//_/ /_/ \__,_//____/ \__,_/ \_\ + + __ _ __ __ + / /_( )____ ___ _____ ____ _ ___ _____ ____ / /_ / /_ + / __/|// __ \ / _ \ / ___// __ `/ / _ \ / ___// __ \ / __ \ / __/ + / /_ / / / // __// / / /_/ / / __/(__ )/ /_/ // / / // /_ + \__/ /_/ /_/ \___//_/ \__,_/ \___//____/ \____//_/ /_/ \__/ + + __ _ __ __ __ + _____ / /_ ____ (_)_____ _____ _____ / // /___ / /_ _____ + / ___// __// __ \ / // ___// ___// ___/ / // // _ \ / __ \ / ___/ + (__ )/ /_ / /_/ // // / / /__ (__ ) / // // __// / / /(__ ) + /____/ \__// .___//_//_/ \___//____/ /_//_/ \___//_/ /_//____/ + /_/ + _ __ __ __ __ _ __ + _____ (_)/ /_ / /_ \ \ / /_ _____ (_)_____ ___ / / + / ___// // __ \ / __/ \ \ / __ \ / ___// // ___// _ \/ / + (__ )/ // / / // /_ / // / / // /__ / // / / __/\ \ + /____//_//_/ /_/ \__/ /_//_/ /_/ \___//_//_/ \___/ \_\ + + __ _ + / /_( )____ _____ ____ _ _ __ + / __/|// __ \ / ___// __ `/| | /| / / + / /_ / / / /(__ )/ /_/ / | |/ |/ / + \__/ /_/ /_//____/ \__,_/ |__/|__/ + + __ _ __ + ____ ___ / /__ _____ (_)/ /_ _____ + / __ \ / _ \ / //_// ___// // __ \ / ___/ + _ / / / // __// ,< / /__ / // / / // /__ + (_)/_/ /_/ \___//_/|_| \___//_//_/ /_/ \___/ + + _ + ____ (_) + / __ \ / / ______ ______ + / / / // / /_____//_____/ + /_/ /_//_/ + + __ _ __ __ __ __ + _ __ ___ ____/ / ____ ____ _ (_)/ /_ ___ ____/ /__/ // /_ + | | / // _ \ / __ /______ / __ \ / __ `// // __ \ / _ \ / __ //_ _ __/ + | |/ // __// /_/ //_____// / / // /_/ // // /_/ // __// /_/ //_ _ __/ + |___/ \___/ \__,_/ /_/ /_/ \__,_//_//_.___/ \___/ \__,_/ /_//_/ + + __ + / /___ + / // _ \ + / // __/ + /_/ \___/ + diff --git a/externals/figlet/tests/res015.txt b/externals/figlet/tests/res015.txt new file mode 100644 index 0000000000..de7bcd4570 --- /dev/null +++ b/externals/figlet/tests/res015.txt @@ -0,0 +1,156 @@ + __ _ _ _ __ + \ \ | | __ | |__ ___ ___ (_) / / + \ \ | |/ / | '_ \ / __| / _ \ | | / / + / / | < | | | | \__ \ | (_) | | | \ \ + /_/ |_|\_\ |_| |_| |___/ \___/ _/ | \_\ + |__/ + _ __ _ ____ _ _ _ + _ _ | | / _| _ __ (_) / __ \ | | __ | |__ ___ ___ (_) + | | | | | | | |_ | '_ \ | | / / _` | | |/ / | '_ \ / __| / _ \ | | + | |_| | | | | _| | | | | | | | | (_| | | < | | | | \__ \ | (_) | | | + \__,_| |_| |_| |_| |_| |_| \ \__,_| |_|\_\ |_| |_| |___/ \___/ _/ | + \____/ |__/ + _ __ _ __ + _ __ __ _ ___ | | / / ___ | |_ ___ / / _ __ __ + | '__| / _` | / _ \ | | / / / __| | __| / _ \ / / (_) \ \/ / + | | | (_| | | (_) | | | / / | (__ | |_ | __/ / / _ > < + |_| \__, | \___/ |_| /_/ \___| \__| \___| /_/ (_) /_/\_\ + |___/ + _ __ _ _ _ + | |__ ___ \ \ __| | ___ | |_ __ _ | |_ ___ + | '_ \ / __| \ \ / _` | / _ \ | __| / _` | | __| / _ \ + | | | | \__ \ / / | (_| | _ | __/ | |_ | (_| | | |_ | (_) | + |_| |_| |___/ /_/ \__,_| (_) \___| \__| \__,_| \__| \___/ + + + __/\__ _ __ + \ / | '_ \ _____ + /_ _\ | | | | |_____| + \/ |_| |_| + + __ _ _ _ __ + \ \ | | __ | |__ ___ ___ (_) / / + \ \ | |/ / | '_ \ / __| / _ \ | | / / + / / | < | | | | \__ \ | (_) | | | \ \ + /_/ |_|\_\ |_| |_| |___/ \___/ _/ | \_\ + |__/ + _ _ _ + ___ _ __ (_) | | _ ___ | |__ ___ __ _ _ __ __ _ + / _ \ | '_ \ | | | | (_) / _ \ | '_ \ / __| / _` | | '_ \ / _` | + | __/ | | | | | | | | _ | __/ | | | | | (__ | (_| | | |_) | | (_| | + \___| |_| |_| |_| |_| (_) \___| |_| |_| \___| \__,_| | .__/ \__,_| + |_| + _ _ _ _ + __ __ __ _ | |_ _ __ _ _ ___ _ | || | / | + \ \/ / / _` | | __| | '_ \ | | | | / __| (_) | || |_ | | + > < | (_| | | |_ | | | | | |_| | \__ \ _ |__ _| | | + /_/\_\ \__,_| \__| |_| |_| \__, | |___/ (_) |_| |_| + |___/ + + _ __ __ _ ___ _ __ _ __ ___ _ __ _ __ ___ + | '__| / _` | / _ \ | '_ \ | '__| / _ \ | '__| | '__| / _ \ + | | | (_| | | __/ | | | | | | | (_) | | | | | | __/ + |_| \__,_| \___| |_| |_| |_| \___/ |_| |_| \___| + + _ _ + __| | ___ | |_ ___ ___ _ __ __ __ ___ _ __ _ _ + / _` | / _ \ | __| / __| / _ \ | '_ \ \ \/ / / _ \ | '_ \ | | | | + | (_| | | __/ | |_ | (__ | __/ | |_) | > < | __/ | | | | | |_| | + \__,_| \___| \__| \___| \___| | .__/ /_/\_\ \___| |_| |_| \__,_| + |_| + _ __ _ _ _ + ( ) \ \ ( ) _ __ ___ | | __ ___ | |_ + |/ | | \| | '_ \ / _ \ | |/ / / _ \ | __| + > > | | | | | __/ | < | (_) | | |_ + | | |_| |_| \___| |_|\_\ \___/ \__| + /_/ + __ _ _ _ __ + \ \ | | __ | |__ ___ ___ (_) / / + \ \ | |/ / | '_ \ / __| / _ \ | | / / + / / | < | | | | \__ \ | (_) | | | \ \ + /_/ |_|\_\ |_| |_| |___/ \___/ _/ | \_\ + |__/ + _ _ _ + ___ _ __ (_) | | _ ___ | |__ ___ __ _ _ __ __ _ + / _ \ | '_ \ | | | | (_) / _ \ | '_ \ / __| / _` | | '_ \ / _` | + | __/ | | | | | | | | _ | __/ | | | | | (__ | (_| | | |_) | | (_| | + \___| |_| |_| |_| |_| (_) \___| |_| |_| \___| \__,_| | .__/ \__,_| + |_| + _ __ _ _ _ _ + ( ) \ \ ( ) _ | || | / | + |/ | | \| (_) | || |_ | | + > > _ |__ _| | | + | | (_) |_| |_| + /_/ + _ _ __ _ _ _ __ + ___ | |__ | |_ \ \ | | __ | |__ ___ ___ (_) / / + / _ \ | '_ \ | __| \ \ | |/ / | '_ \ / __| / _ \ | | / / + | __/ | | | | | |_ / / | < | | | | \__ \ | (_) | | | \ \ + \___| |_| |_| \__| /_/ |_|\_\ |_| |_| |___/ \___/ _/ | \_\ + |__/ + _ _ + | |_ ___ | | _ __ + | __| / _ \ | | | '_ \ + | |_ | (_) | | | | |_) | + \__| \___/ |_| | .__/ + |_| + _ _ _ _ + ___ _ __ ___ | | __ ___ (_) | |__ | |_ + / __| | '_ \ / _ \ | |/ / / __| | | | '_ \ | __| + \__ \ | | | | | __/ | < | (__ | | | | | | | |_ + |___/ |_| |_| \___| |_|\_\ \___| |_| |_| |_| \__| + + __ _ _ _ __ __ __ + \ \ __| | | | ___ (_) / _| / _| _ _ ___ __ _ / / + \ \ / _` | | | / _ \ | | | |_ | |_ | | | | / __| / _` | / / + / / | (_| | | | | __/ | | | _| | _| | |_| | \__ \ | (_| | \ \ + /_/ \__,_| |_| \___| |_| |_| |_| \__,_| |___/ \__,_| \_\ + + _ _ _ _ + | |_ ( ) _ __ ___ _ __ __ _ ___ ___ ___ | |__ | |_ + | __| |/ | '_ \ / _ \ | '__| / _` | / _ \ / __| / _ \ | '_ \ | __| + | |_ | | | | | __/ | | | (_| | | __/ \__ \ | (_) | | | | | | |_ + \__| |_| |_| \___| |_| \__,_| \___| |___/ \___/ |_| |_| \__| + + _ _ _ _ _ + ___ | |_ _ __ (_) _ __ ___ ___ | | | | ___ | |__ ___ + / __| | __| | '_ \ | | | '__| / __| / __| | | | | / _ \ | '_ \ / __| + \__ \ | |_ | |_) | | | | | | (__ \__ \ | | | | | __/ | | | | \__ \ + |___/ \__| | .__/ |_| |_| \___| |___/ |_| |_| \___| |_| |_| |___/ + |_| + _ _ _ __ _ _ __ + ___ (_) | |__ | |_ \ \ | |__ ___ (_) _ __ ___ / / + / __| | | | '_ \ | __| \ \ | '_ \ / __| | | | '__| / _ \ / / + \__ \ | | | | | | | |_ / / | | | | | (__ | | | | | __/ \ \ + |___/ |_| |_| |_| \__| /_/ |_| |_| \___| |_| |_| \___| \_\ + + _ _ + | |_ ( ) _ __ ___ __ _ __ __ + | __| |/ | '_ \ / __| / _` | \ \ /\ / / + | |_ | | | | \__ \ | (_| | \ V V / + \__| |_| |_| |___/ \__,_| \_/\_/ + + _ _ _ + _ __ ___ | | __ ___ (_) | |__ ___ + | '_ \ / _ \ | |/ / / __| | | | '_ \ / __| + _ | | | | | __/ | < | (__ | | | | | | | (__ + (_) |_| |_| \___| |_|\_\ \___| |_| |_| |_| \___| + + _ + _ __ (_) + | '_ \ | | _____ _____ + | | | | | | |_____| |_____| + |_| |_| |_| + + _ _ _ _ _ _ + ___ __| | _ __ __ _ (_) | |__ ___ __| | _| || |_ + / _ \ / _` | _____ | '_ \ / _` | | | | '_ \ / _ \ / _` | |_ .. _| + | __/ | (_| | |_____| | | | | | (_| | | | | |_) | | __/ | (_| | |_ _| + \___| \__,_| |_| |_| \__,_| |_| |_.__/ \___| \__,_| |_||_| + + _ + | | ___ __ __ + | | / _ \ \ \ / / + | | | __/ \ V / + |_| \___| \_/ + diff --git a/externals/figlet/tests/res016.txt b/externals/figlet/tests/res016.txt new file mode 100644 index 0000000000..cf70546d5f --- /dev/null +++ b/externals/figlet/tests/res016.txt @@ -0,0 +1,152 @@ + ___ _ _ __ + / (_) | | | | \ \ + / / _ ___ ___| |__ | | __\ \ + < < | |/ _ \/ __| '_ \| |/ / > > + \ \| | (_) \__ | | | | < / / + \_| |\___/|___|_| |_|_|\_/_/ + _/ | + |__/ + _ _ _ _ __ _ __ _ + (_) | | | | ____ (_) / _| | _ / / | | + _ ___ ___| |__ | | __/ __ \ _ _ __ | |_| |_ ___ _(_) / ___| |_ ___ + | |/ _ \/ __| '_ \| |/ / / _` | | '_ \| _| | | | \ \/ / / / _ | __/ __| + | | (_) \__ | | | | | | (_| | | | | | | | | |_| |> < _ / | __| || (__ + | |\___/|___|_| |_|_|\_\ \__,_|_|_| |_|_| |_|\__,_/_/\_(_/_/ \___|\__\___| + _/ | \____/ + |__/ + ___ _ _ ___ _ + / | | | | | | | \ \ | | + / /| | ___ __ _ _ __ ___ | |_ __ _| |_ ___ __| |\ \ ___| |__ + / / | |/ _ \ / _` | '__/ _ \| __/ _` | __/ _ \ / _` | > / __| '_ \ + / / | | (_) | (_| | | | (_) | || (_| | || __/| (_| |/ /\__ | | | | + /_/ |_|\___/ \__, |_| \___/ \__\__,_|\__\___(_\__,_/_/ |___|_| |_| + __/ | + |___/ + _ + /\| |/\ + ______ _ __ \ ` ' / + |______| '_ \|_ _| + | | | |/ , . \ + |_| |_|\/|_|\/ + + + ___ _ _ __ _ + / (_) | | | | \ \ | | _ + / / _ ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___(_) + < < | |/ _ \/ __| '_ \| |/ / > >/ _` | '_ \ / _` |/ __| '_ \ / _ \ + \ \| | (_) \__ | | | | < / /| (_| | |_) | (_| | (__| | | | __/_ + \_| |\___/|___|_| |_|_|\_/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + _/ | | | + |__/ |_| + _ _ __ _ _ _ + | (_) /_ | || | _ | | + | |_ _ __ ___ | | || |(_)___ _ _ _ __ | |_ __ ___ __ + | | | '_ \ / _ \| |__ _|/ __| | | | '_ \| __/ _` \ \/ / + | | | | | | __/| | | | _\__ | |_| | | | | || (_| |> < + |_|_|_| |_|\___||_| |_|(_|___/\__, |_| |_|\__\__,_/_/\_\ + __/ | + |___/ + + + ___ _ __ _ __ ___ _ __ _ __ ___ __ _ _ __ + / _ | '__| '__/ _ \| '__| '_ \ / _ \/ _` | '__| + | __| | | | | (_) | | | | | | __| (_| | | + \___|_| |_| \___/|_| |_| |_|\___|\__,_|_| + + + _ _ _ _ + | | | | | | | + _ _ _ __ _____ ___ __ ___ ___| |_ ___ __| | |_ ___ | | _____ _ __ + | | | | '_ \ / _ \ \/ | '_ \ / _ \/ __| __/ _ \/ _` | __/ _ \| |/ / _ | '_ \ + | |_| | | | | __/> <| |_) | __| (__| || __| (_| | || (_) | | __| | | | + \__,_|_| |_|\___/_/\_| .__/ \___|\___|\__\___|\__,_|\__\___/|_|\_\___|_| |_| + | | + |_| + ___ _ + ( \ \( ) + \|| |/ + \ \ + / / + | | + /_/ + + ___ _ _ __ _ + / (_) | | | | \ \ | | _ + / / _ ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___(_) + < < | |/ _ \/ __| '_ \| |/ / > >/ _` | '_ \ / _` |/ __| '_ \ / _ \ + \ \| | (_) \__ | | | | < / /| (_| | |_) | (_| | (__| | | | __/_ + \_| |\___/|___|_| |_|_|\_/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) + _/ | | | + |__/ |_| + _ _ __ _ _ ___ _ + | (_) /_ | || | _( \ \( ) + | |_ _ __ ___ | | || |(_)\|| |/ + | | | '_ \ / _ \| |__ _| \ \ + | | | | | | __/| | | | _ / / + |_|_|_| |_|\___||_| |_|(_) | | + /_/ + + ___ _ _ __ _ _ _ _ + / (_) | | | | \ \ | | | | | | | | + / / _ ___ ___| |__ | | __\ \| |_| |__ ___ _ __ | | ___ | |_ + < < | |/ _ \/ __| '_ \| |/ / > | __| '_ \ / _ | '_ \| |/ _ \| __| + \ \| | (_) \__ | | | | < / /| |_| | | | __| |_) | | (_) | |_ + \_| |\___/|___|_| |_|_|\_/_/ \__|_| |_|\___| .__/|_|\___/ \__| + _/ | | | + |__/ |_| + _ _ _ _ + | | | | (_) | | + | |_| |__ _ ___| | _____ _ __ ___ + | __| '_ \| |/ __| |/ / _ | '_ \/ __| + | |_| | | | | (__| | __| | | \__ \ + \__|_| |_|_|\___|_|\_\___|_| |_|___/ + + + __ __ __ _ _ ___ _ _ + / / / _|/ _(_) | | | \ \ | | | | + / / __ _ ___ _ _| |_| |_ _ ___| | __| |\ \| |_| |__ ___ ___ ___ + < < / _` / __| | | | _| _| |/ _ | |/ _` | > | __| '_ \ / _ \/ __|/ _ \ + \ | (_| \__ | |_| | | | | | | __| | (_| |/ /| |_| | | | (_) \__ | __/ + \_\__,_|___/\__,_|_| |_| |_|\___|_|\__,_/_/ \__|_| |_|\___/|___/\___| + + + _ _ _ _ _ _ _ + ( | | | | | | | (_) | | + __ _ _ __ ___ _ __|/| |_ ___| |__ ___| | |___ ___ _ __ _ _ __ | |_ ___ + / _` | '__/ _ | '_ \ | __/ __| '_ \ / _ | | / __|/ __| '__| | '_ \| __/ __| + | (_| | | | __| | | || |_\__ | | | | __| | \__ | (__| | | | |_) | |_\__ \ + \__,_|_| \___|_| |_| \__|___|_| |_|\___|_|_|___/\___|_| |_| .__/ \__|___/ + | | + |_| + __ _ _ __ _ _ _ _ _ + / / (_) | | \ \ | | | | (_) ( | | + / / ___ _ __ _ ___| |__ \ \| |_| |__ _ _____ ____ _ ___ _ __|/| |_ + < < / _ | '__| |/ __| '_ \ > | __| '_ \| / __\ \ /\ / / _` / __| '_ \ | __| + \ | __| | | | (__| | | |/ /| |_| | | | \__ \\ V V | (_| \__ | | | || |_ + \_\___|_| |_|\___|_| |_/_/ \__|_| |_|_|___/ \_/\_/ \__,_|___|_| |_| \__| + + + _ _ _ + | | (_) | | + ___| |__ _ ___| | _____ _ __ + / __| '_ \| |/ __| |/ / _ | '_ \ + | (__| | | | | (__| | __| | | |_ + \___|_| |_|_|\___|_|\_\___|_| |_(_) + + + _ + (_) + ______ ______ _ _ __ + |______|______| | '_ \ + | | | | | + |_|_| |_| + + + _ _ _ _ _ _ _ + _| || |_ | | | | (_) | | | | + |_ __ _| __| | ___| |__ _ __ _ _ __ ______ __| | _____ _____| | + _| || |_ / _` |/ _ | '_ \| |/ _` | '_ |______/ _` |/ _ \ \ / / _ | | + |_ __ _| (_| | __| |_) | | (_| | | | | | (_| | __/\ V | __| | + |_||_| \__,_|\___|_.__/|_|\__,_|_| |_| \__,_|\___| \_/ \___|_| + + diff --git a/externals/figlet/tests/res017.txt b/externals/figlet/tests/res017.txt new file mode 100644 index 0000000000..3296f8c60b --- /dev/null +++ b/externals/figlet/tests/res017.txt @@ -0,0 +1,36 @@ + ┛┏━┃┏━┛┃ ┃┃ ┃ + ┃┃ ┃━━┃┏━┃┏┛ + <━┛━━┛━━┛┛ ┛┛ ┛> + ┛┏━┃┏━┛┃ ┃┃ ┃┏━┃┛┏━ ┏━┛┃ ┃ ┃┃ ┃ ┛┏━┛━┏┛┏━┛ ┛┃ ┏━┃┏━┛┏━┃┏━┃━┏┛┏━┃━┏┛┏━┛ + ┃┃ ┃━━┃┏━┃┏┛ ┃┛┛┃┃ ┃┏━┛┃ ┃ ┃ ┛ ┛ ┛ ┏━┛ ┃ ┃ ┛ ┃ ┃ ┃┃ ┃┏┏┛┃ ┃ ┃ ┏━┃ ┃ ┏━┛ + ━┛━━┛━━┛┛ ┛┛ ┛━━┛┛┛ ┛┛ ━━┛━━┛┛ ┛┛┛ ━━┛ ┛ ━━┛┛ ━━┛━━┛━━┛┛ ┛━━┛ ┛ ┛ ┛ ┛ ━━┛┛ + ┏━ ┏━┛┃ ┃ ┏━ ┛ ┛ + ┃ ┃ ━━┃┏━┃ ━┛┃ ┃ ━┏┛ + ━━> ━━┛┛ ┛ ┛ ┛ ┛ ┛ + ┛┏━┃┏━┛┃ ┃┃ ┃ ┏━┃┏━┃┏━┃┏━┛┃ ┃┏━┛ ┃ ┛┏━ ┏━┛ ━┃┃ ┃ ┏━┛┃ ┃┏━━┏┛┏━┃┃ ┃ + ┃┃ ┃━━┃┏━┃┏┛ ┏━┃┏━┛┏━┃┃ ┏━┃┏━┛┛ ┃ ┃┃ ┃┏━┛ ┃━━┃┛ ━━┃━┏┛┃ ┃┃ ┏━┃ ┛ + <━┛━━┛━━┛┛ ┛┛ ┛> ┛ ┛┛ ┛ ┛━━┛┛ ┛━━┛┛ ━━┛┛┛ ┛━━┛ ━━┛ ┛┛ ━━┛ ┛ ┛ ┛┛ ┛ ┛┛ ┛ + ┏━┛┏━┃┏━┃┏━┃┏━┃ ┏━ ┏━┛┏━┃┏━┃ ┃ ┃┏━ ┏━┛┃ ┃┏━┃┏━┛┏━┛━┏┛┏━┛┏━ ━┏┛┏━┃┃ ┃┏━┛┏━ + ┏━┛┏┏┛┏┏┛┃ ┃┏┏┛ ┃ ┃┏━┛┏━┃┏┏┛ ┃ ┃┃ ┃┏━┛ ┛ ┏━┛┏━┛┃ ┃ ┏━┛┃ ┃ ┃ ┃ ┃┏┛ ┏━┛┃ ┃ + ━━┛┛ ┛┛ ┛━━┛┛ ┛ ┛ ┛━━┛┛ ┛┛ ┛ ━━┛┛ ┛━━┛┛ ┛┛ ━━┛━━┛ ┛ ━━┛━━ ┛ ━━┛┛ ┛━━┛┛ ┛ + ┛━┃┛ + ┛┏┛ + ━┛ + ┛┏━┃┏━┛┃ ┃┃ ┃ ┏━┃┏━┃┏━┃┏━┛┃ ┃┏━┛ ┃ ┛┏━ ┏━┛ ━┃┃ ┃ ┛━┃┛ + ┃┃ ┃━━┃┏━┃┏┛ ┏━┃┏━┛┏━┃┃ ┏━┃┏━┛┛ ┃ ┃┃ ┃┏━┛ ┃━━┃┛ ┛┏┛ + <━┛━━┛━━┛┛ ┛┛ ┛> ┛ ┛┛ ┛ ┛━━┛┛ ┛━━┛┛ ━━┛┛┛ ┛━━┛ ━━┛ ┛┛ ━┛ + ┛┏━┃┏━┛┃ ┃┃ ┃ ━┏┛┃ ┃┏━┛ ┏━┃┃ ┏━┃━┏┛ ━┏┛┃ ┃┛┏━┛┃ ┃┏━┛┏━ ┏━┛ + ┃┃ ┃━━┃┏━┃┏┛ ┃ ┏━┃┏━┛ ┏━┛┃ ┃ ┃ ┃ ┃ ┏━┃┃┃ ┏┛ ┏━┛┃ ┃━━┃ + <━┛━━┛━━┛┛ ┛┛ ┛> ┛ ┛ ┛━━┛ ┛ ━━┛━━┛ ┛ ┛ ┛ ┛┛━━┛┛ ┛━━┛┛ ┛━━┛ + ┏━┃┏━┛┃ ┃┏━┛┏━┛┛┏━┛┃ ┏━ ━┏┛┃ ┃┏━┃┏━┛┏━┛ ┏━┃┏━┃┏━┛┏━┛━┏┛ ┏━┛┃ ┃┏━┛┃ ┃ + ┏━┃━━┃┃ ┃┏━┛┏━┛┃┏━┛┃ ┃ ┃ ┃ ┏━┃┃ ┃━━┃┏━┛ ┏━┃┏┏┛┏━┛┃ ┃ ┃ ━━┃┏━┃┏━┛┃ ┃ + <┛ ┛━━┛━━┛┛ ┛ ┛━━┛━━┛━━> ┛ ┛ ┛━━┛━━┛━━┛ ┛ ┛┛ ┛━━┛┛ ┛ ┛ ━━┛┛ ┛━━┛━━┛━━┛ + ┏━┛┏━┛┏━┃┛┏━┃━┏┛┏━┛ + ━━┃┃ ┏┏┛┃┏━┛ ┃ ━━┃ + ━━┛━━┛┛ ┛┛┛ ┛ ━━┛ + ┏━┛┏━┃┛┏━┛┃ ┃ ━┏┛┃ ┃┛┏━┛ ┃┃┃┏━┃┏━┛┏━┛━┏┛ ┏━┛┃ ┃┛┏━┛┃ ┃┏━┛┏━ + ┏━┛┏┏┛┃┃ ┏━┃ ┃ ┏━┃┃━━┃ ┃┃┃┏━┃━━┃┃ ┃ ┃ ┃ ┏━┃┃┃ ┏┛ ┏━┛┃ ┃ + <━━┛┛ ┛┛━━┛┛ ┛> ┛ ┛ ┛┛━━┛ ━━┛┛ ┛━━┛┛ ┛ ┛ ━━┛┛ ┛┛━━┛┛ ┛━━┛┛ ┛┛ + ┛┏━ ┏━ ┏━┛┏━ ┛┏━┃┏━ ┏━ ┏━┛┃ ┃┏━┛┃ + ━┛━┛ ┃┃ ┃ ┃ ┃┏━┛┏━┃┃┏━┃┃ ┃━┛┃ ┃┏━┛┃ ┃┏━┛┃ + ┛┛ ┛ #━━ ━━┛━━ ┛┛ ┛┛ ┛ ━━ ━━┛ ┛ ━━┛━━┛ diff --git a/externals/figlet/tests/res018.txt b/externals/figlet/tests/res018.txt new file mode 100644 index 0000000000..7551e081ed --- /dev/null +++ b/externals/figlet/tests/res018.txt @@ -0,0 +1,27 @@ + ┏━┏━┃ ┃ ┃ ┏━┏━┃ ┃ ┏━┃┛┏━┏━┃ ┃ ┃ ┃ ┏━━┏┏━┛ ┃ ┏━┏━┏━┏━━┏┏━━┏┏━┛ ┏━ ┏━┃ ┃┏━ + ┃ ━━┏━┏┛ ┃ ━━┏━┏┛┃┛┛┃┃ ┏━┃ ┃ ┃┛ ┛ ┛┏━┛┃┃ ┛┃ ┃ ┃ ┏┏┃ ┃┃┏━┃┃┏━┛ ┃ ┃━━┏━━┃ ┃ + <━━━━━┛ ┛ ┛>━━━━━┛ ┛ ━━┛┛┛ ┛ ━━━━┛ ┛┛┛ ━━┛┛━━┛ ━━━━━━┛ ━━┛┛┛ ┛┛━━┛┛━━>━━┛ ┛┛ ┛ + ┛ ┛ + ━┏┛ + ┛ ┛ + ┏━┏━┃ ┃ ┃ ┏━┏━┏━┏━┃ ┏━┛ ┃ ┛┏━┏━━┃ ┃ ┏━┃ ┏━┏┏━┃ ┏━┏━┏━┏━┏━┏━┏━┏━┏━┃ + ┃ ━━┏━┏┛ ┏━┏━┏━┃ ┏━┏━┛┛┃ ┃┃ ┏━┛━━┃┛━━━┏┃ ┃┏━┃┛┏━┏┏┏┏┃ ┏┏┃ ┏━┏━┏┏┛ + <━━━━━┛ ┛ ┛>┛ ┛ ┛ ━━┛ ━━┛┛━━┛┛┛ ━━━━┛┛┛━━┛┛┛ ┛┛ ┛ ━━┛ ┛ ━━┛ ┛ ━━┛ ┛ ┛ + ┃ ┏━┏━┃ ┏━┏━┏━━┏┏━┏━━┏┏━┃ ┏━┏━━┃┛ + ┃ ┃ ┏━┛┛┏━┏━┃ ┃┏━┃ ┃┃┃ ┏┛┏━┃ ┃┏┛ + ━━┛ ━━┛ ┛ ━━━━┛┛━━━━ ┛━━┛ ━━┛ ━┛ + ┏━┏━┃ ┃ ┃ ┏━┏━┏━┏━┃ ┏━┛ ┃ ┛┏━┏━━┃ ┃ ━┃┛ + ┃ ━━┏━┏┛ ┏━┏━┏━┃ ┏━┏━┛┛┃ ┃┃ ┏━┛━━┃┛ ┏┛ + <━━━━━┛ ┛ ┛>┛ ┛ ┛ ━━┛ ━━┛┛━━┛┛┛ ━━━━┛┛┛━┛ + ┏━┏━┃ ┃ ┃ ━┏┃ ┏━┏━┃ ┏━━┏━┏┃ ┃┛┏━┃ ┏━┏━┏━┛ + ┃ ━━┏━┏┛ ┃┏━┏━┏━┃ ┃ ┃┃ ┃┏━┃┃┃ ┏┛┏━┃ ━━┃ + <━━━━━┛ ┛ ┛> ┛┛ ━━┛ ━━━━┛┛ ┛┛ ┛┛━━┛ ━━┛ ━━┛ + ┏━┏━┃ ┏━┏━┛┛┏━┃ ┏━ ━┏┃ ┏━┏━┏━┏━┏━┏━┏━┛━┏┏━┃ ┏━┃ ┃ ┏━┏━┏━┃┛┏━━┏┏━┛ + ┏━━━┃ ┏━┏━┛┃┏━┃ ┃ ┃ ┃┏━┃ ━━┏━┏━┏┏┏━┃ ┃ ┃━━┏━┏━┃ ┃ ━━┃ ┏┏┛┃┏━┛┃━━┃ + <┛ ━━━━┛ ┛ ┛━━━━━━> ┛┛ ━━━━━━┛ ┛ ━━┛ ┛ ┛━━┛ ━━━━━━━━━━┛ ┛┛┛ ┛━━┛ + ┏━┏━┃┛┏━┃ ┃ ━┏┃ ┃┛┏━┃┃┏━┏━┏━┛━┏┏━┃ ┃┛┏━┃ ┏━┏━ + ┏━┏┏┛┃┃ ┏━┃ ┃┏━┃┃━━┃┃┏━━━┃ ┃ ┃┃ ┏━┃┃┃ ┏┛┏━┃ ┃ + <━━┛ ┛┛━━┛ ┛> ┛┛ ┛┛━━━━┛ ━━┛ ┛ ┛━━┛ ┛┛━━┛ ━━┛ ┛┛ + ┛┏━ ┏━┏━┏━ ┛┏━┏━ ┏━┏━┃ ┏━┃ + ━━┛┃┃ ┃ ┃ ┏━┏━┃┃┏━┃ ━┃ ┏━┃ ┏━┃ + ┛┛ ┛#━━━━━━ ┛┛ ┛ ┛━━━━┛┛━━━━┛ diff --git a/externals/figlet/tests/res019.txt b/externals/figlet/tests/res019.txt new file mode 100644 index 0000000000..b1c4ee3688 --- /dev/null +++ b/externals/figlet/tests/res019.txt @@ -0,0 +1,36 @@ + ┃ ┃┃ ┃┏━┛┏━┃ ┛ + ┏┛ ┏━┃━━┃┃ ┃ ┃ +>┛ ┛┛ ┛━━┛━━┛━┛< + ┏━┛━┏┛┏━┃━┏┛┏━┃┏━┃┏━┛┏━┃┃ ┛┏━┛━┏┛┏━┛ ┛ ┃ ┃┃ ┃┃ ┏━┛┏━ ┛┏━┃┃ ┃┃ ┃┏━┛┏━┃ ┛ + ┏━┛ ┃ ┏━┃ ┃ ┃ ┃┏┏┛┃ ┃┃ ┃┃ ┛ ┃ ┃ ┏━┛ ┛ ┛ ┛ ┃ ┃┃ ┏━┛┃ ┃┃┃┛┛┏┛ ┏━┃━━┃┃ ┃ ┃ +┛━━┛ ┛ ┛ ┛ ┛ ━━┛┛ ┛━━┛━━┛━━┛┛ ━━┛ ┛ ━━┛┛ ┛┛ ┛━━┛━━┛┛ ┛ ┛┛━━┛┛ ┛┛ ┛━━┛━━┛━┛ +┛ ┛ ┏━ ┃ ┃┏━┛ ┏━ +━┏┛ ┃ ┃━┛ ┏━┃━━┃ ┃ ┃ +┛ ┛ ┛ ┛ ┛ ┛━━┛ >━━ +┃ ┃┏━┃━┏┛┏━ ┃ ┃┏━┛ ┃ ┃━┃ ┏━┛┏━ ┛┃ ┏━┛┃ ┃┏━┛┏━┃┏━┃┏━┃ ┃ ┃┃ ┃┏━┛┏━┃ ┛ + ┛ ┏━┃ ┃ ┃ ┃━┏┛━━┃ ┛━━┃ ┃ ┏━┛┃ ┃┃┃ ┛┏━┛┏━┃┃ ┏━┃┏━┛┏━┃ ┏┛ ┏━┃━━┃┃ ┃ ┃ +┛ ┛┛ ┛ ┛ ┛ ┛ ┛ ━━┛ ┛ ┛━━┛ ━━┛┛ ┛┛━━┛ ┛━━┛┛ ┛━━┛┛ ┛┛ ┛ ┛ >┛ ┛┛ ┛━━┛━━┛━┛< +┏━ ┏━┛┃ ┃┏━┃━┏┛ ┏━ ┏━┛━┏┛┏━┛┏━┛┏━┃┃ ┃┏━┛┏━ ┃ ┃ ┏━┃┏━┃┏━┛┏━ ┏━┃┏━┃┏━┃┏━┃┏━┛ +┃ ┃┏━┛┏┛ ┃ ┃ ┃ ┃ ┃┏━┛ ┃ ┃ ┏━┛┏━┛ ┛ ┏━┛┃ ┃┃ ┃ ┏┏┛┏━┃┏━┛┃ ┃ ┏┏┛┃ ┃┏┏┛┏┏┛┏━┛ +┛ ┛━━┛┛ ┛━━┛ ┛ ━━ ━━┛ ┛ ━━┛━━┛┛ ┛ ┛━━┛┛ ┛━━┛ ┛ ┛┛ ┛━━┛┛ ┛ ┛ ┛━━┛┛ ┛┛ ┛━━┛ +┛━┃ ┛ + ┏┛ ┛ + ━┛ +┛━┃ ┛ ┃ ┃━┃ ┏━┛┏━ ┛┃ ┏━┛┃ ┃┏━┛┏━┃┏━┃┏━┃ ┃ ┃┃ ┃┏━┛┏━┃ ┛ + ┏┛ ┛ ┛━━┃ ┃ ┏━┛┃ ┃┃┃ ┛┏━┛┏━┃┃ ┏━┃┏━┛┏━┃ ┏┛ ┏━┃━━┃┃ ┃ ┃ + ━┛ ┛ ┛━━┛ ━━┛┛ ┛┛━━┛ ┛━━┛┛ ┛━━┛┛ ┛┛ ┛ ┛ >┛ ┛┛ ┛━━┛━━┛━┛< +┏━┛┏━ ┏━┛┃ ┃┏━┛┛┃ ┃━┏┛ ━┏┛┏━┃┃ ┏━┃ ┏━┛┃ ┃━┏┛ ┃ ┃┃ ┃┏━┛┏━┃ ┛ +━━┃┃ ┃┏━┛┏┛ ┃ ┃┏━┃ ┃ ┃ ┃ ┃┃ ┏━┛ ┏━┛┏━┃ ┃ ┏┛ ┏━┃━━┃┃ ┃ ┃ +━━┛┛ ┛━━┛┛ ┛━━┛┛┛ ┛ ┛ ┛ ━━┛━━┛┛ ━━┛┛ ┛ ┛ >┛ ┛┛ ┛━━┛━━┛━┛< +┃ ┃ ┏━┛┃ ┃┏━┛ ━┏┛┛┏━ ┏━┛┏━┃┏━┃ ┏━┛┏━┛┏━┃┃ ┃━┏┛ ┏━ ┃ ┏━┛┛┏━┛┏━┛┃ ┃┏━┛┏━┃ +┃ ┃ ┏━┛┏━┃━━┃ ┃ ┃ ┃┏━┛┏┏┛┏━┃ ┏━┛━━┃┃ ┃┏━┃ ┃ ┃ ┃┃ ┏━┛┃┏━┛┏━┛┃ ┃━━┃┏━┃ +━━┛━━┛━━┛┛ ┛━━┛ ┛ ┛ ┛━━┛┛ ┛┛ ┛ ━━┛━━┛━━┛┛ ┛ ┛ >━━ ━━┛━━┛┛┛ ┛ ━━┛━━┛┛ ┛< +┏━┛━┏┛┏━┃┛┏━┃┏━┛┏━┛ +━━┃ ┃ ┏━┛┃┏┏┛┃ ━━┃ +━━┛ ┛ ┛ ┛┛ ┛━━┛━━┛ + ┏━ ┏━┛┃ ┃┏━┛┛┃ ┃┏━┛ ━┏┛┛┏━ ┏━┛┏━┃┃┃┃ ┏━┛┛┃ ┃━┏┛ ┃ ┃┏━┛┛┏━┃┏━┛ + ┃ ┃┏━┛┏┛ ┃ ┃┏━┃┃ ┃ ┃ ┃━━┃┏━┃┃┃┃ ━━┃┃┏━┃ ┃ ┏━┃┃ ┃┏┏┛┏━┛ +┛┛ ┛━━┛┛ ┛━━┛┛┛ ┛━━┛ ┛ ┛ ┛━━┛┛ ┛━━┛ ━━┛┛┛ ┛ ┛ >┛ ┛━━┛┛┛ ┛━━┛< +┃ ┏━┛┃ ┃┏━┛┏━ ┏━ ┏━┃┛┏━ ┏━┛┏━ ┏━ ┛ +┃ ┏━┛┃ ┃┏━┛┃ ┃━┛┃ ┃┏━┃┃┏━┃┏━┛┃ ┃ ┃ ┃┃ ━┛━┛ +━━┛━━┛ ┛ ━━┛━━ ┛ ┛┛ ┛┛━━ ━━┛━━ # ┛ ┛┛ diff --git a/externals/figlet/tests/res020.txt b/externals/figlet/tests/res020.txt new file mode 100644 index 0000000000..4de016c0e1 --- /dev/null +++ b/externals/figlet/tests/res020.txt @@ -0,0 +1,140 @@ + _ _ + /o | | | | \ +/ __ , | | | | \ +\ | / \_/ \_|/ \ |/_) / + \|/\__/ \/ | |_/| \_// + /| + \| + _ _ _ _ + o | | | | ____ o | | | | o / + __ , | | | | / __,\ _ _ | | | | /_ _|_ __ + | / \_/ \_|/ \ |/_) | / | || / |/ | |/ |/ | | /\/ /|/ | / + |/\__/ \/ | |_/| \_/| \_/|/ |_/ | |_/|__/|__/ \_/|_/ /\_/o/ |__/|_/\___/ +/| \____/ |\ +\| |/ + _ _ + /| | | \ | | + / | | __ __, ,_ __ _|_ __, _|_ _ __| \ , | | + / |/ / \_/ | / | / \_| / | | |/ / | / / \_|/ \ +/ |__/\__/ \_/|/ |_/\__/ |_/\_/|_/|_/|__/o\_/|_// \/ | |_/ + /| + \| + + + _ _ \|/ +-----/ |/ | --*-- + | |_/ /|\ + + + _ _ _ + /o | | | | \ | | o +/ __ , | | | | \ __, _ __, __ | | _ +\ | / \_/ \_|/ \ |/_) / / | |/ \_/ | / |/ \ |/ + \|/\__/ \/ | |_/| \_// \_/|_/|__/ \_/|_/\___/| |_/|__/o + /| /| + \| \| + _ , +| | o /|| | o +| | _ _ _ ||__|_ , _ _ _|_ __, +|/ | / |/ | |/ | | / \_| | / |/ | | / | /\/ +|__/|_/ | |_/|__/ | | o \/ \_/|/ | |_/|_/\_/|_/ /\_/ + /| + \| + + + _ ,_ ,_ __ ,_ _ _ _ __, ,_ +|/ / | / | / \_/ | / |/ | |/ / | / | +|__/ |_/ |_/\__/ |_/ | |_/|__/\_/|_/ |_/ + + + _ + | | | + _ _ _ _ _ __ _|_ _ __| _|_ __ | | _ _ _ +| | / |/ | |/ /\/ |/ \_|/ / | |/ / | | / \_|/_) |/ / |/ | + \_/|_/ | |_/|__/ /\_/|__/ |__/\___/|_/|__/\_/|_/ |_/\__/ | \_/|__/ | |_/ + /| + \| +o o +\\ / + | + > + | + / + + _ _ _ + /o | | | | \ | | o +/ __ , | | | | \ __, _ __, __ | | _ +\ | / \_/ \_|/ \ |/_) / / | |/ \_/ | / |/ \ |/ + \|/\__/ \/ | |_/| \_// \_/|_/|__/ \_/|_/\___/| |_/|__/o + /| /| + \| \| + _ , o o +| | o /|| | o \\ / +| | _ _ _ ||__|_ | +|/ | / |/ | |/ | | > +|__/|_/ | |_/|__/ | | o | + / + + _ _ _ _ + /o | | | | \ | | | | +/ __ , | | | | \ _|_ | | _ _ | | __ _|_ +\ | / \_/ \_|/ \ |/_) / | |/ \ |/ |/ \_|/ / \_| + \|/\__/ \/ | |_/| \_// |_/| |_/|__/ |__/ |__/\__/ |_/ + /| /| + \| \| + _ _ + | | o | | +_|_ | | __ | | _ _ _ , + | |/ \ | / |/_) |/ / |/ | / \_ + |_/| |_/|_/\___/| \_/|__/ | |_/ \/ + + + _ _ _ _ + / | | | | o | | | \ | | +/ __, , | | | | _ | | __| \ _|_ | | __ , _ +\ / | / \_| | |/ |/ | |/ |/ / | / | |/ \ / \_/ \_|/ + \\_/|_/ \/ \_/|_/|__/|__/|_/|__/|__/\_/|_// |_/| |_/\__/ \/ |__/ + |\ |\ + |/ |/ + o _ _ _ + / | | | | | | + __, ,_ _ _ _ _|_ , | | _ | | | | +/ | / | |/ / |/ | | / \_|/ \ |/ |/ |/ +\_/|_/ |_/|__/ | |_/ |_/ \/ | |_/|__/|__/|__/ + + + + o + , __ ,_ _ _|_ , +/ \_/ / | | |/ \_| / \_ + \/ \___/ |_/|_/|__/ |_/ \/ + /| + \| + _ _ + / o | | \ | | o +/ _ ,_ __ | | \ _|_ | | , +\ |/ / | | / |/ \ / | |/ \ | / \_ + \|__/ |_/|_/\___/| |_// |_/| |_/|_/ \/ + + + o _ _ + / | | o | | + __, , _ _ _|_ __ | | __ | | _ _ _ +| | |_/ | / \_/ |/ | | / |/ \ | / |/_) |/ / |/ | + \/ \/ \_/|_/ \/ | |_/ |_/ \___/| |_/|_/\___/| \_/|__/ | |_/o + + + + o + _ _ + ---------- | / |/ | + |_/ | |_/ + + + _ _ + | | | | | o | | | +--+--+-- __| _ | | __, _ _ __| _ _ | | +--+--+--/ | |/ |/ \_| / | / |/ |-----/ | |/ | |_|/ |/ + | | \_/|_/|__/\_/ |_/\_/|_/ | |_/ \_/|_/|__/ \/ |__/|__/ + + diff --git a/externals/figlet/tests/res021.txt b/externals/figlet/tests/res021.txt new file mode 100644 index 0000000000..b083225dbe --- /dev/null +++ b/externals/figlet/tests/res021.txt @@ -0,0 +1,36 @@ + __ _ _ _ __ _ _ _ ____ _ __ _ __ _ ___ _ _ ___ _ __ _ _ _ __ + / /(_) ___ ___| |__ | | __\ \ (_) ___ ___| |__ | | __/ __ \(_)_ __ / _| |_ ___ ___ / /__| |_ ___ / / | ___ __ _ _ __ ___ | |_ __ _| |_ ___ __| \ \ ___| |__ _ __ __/\__ / /(_) ___ ___| |__ | | __\ \ +/ / | |/ _ \/ __| '_ \| |/ / \ \ | |/ _ \/ __| '_ \| |/ / / _` | | '_ \| |_| | | | \ \/ (_) / / _ \ __/ __| / /| |/ _ \ / _` | '__/ _ \| __/ _` | __/ _ \ / _` |\ \ / __| '_ \ _____| '_ \ \ / / / | |/ _ \/ __| '_ \| |/ / \ \ +\ \ | | (_) \__ \ | | | < / / | | (_) \__ \ | | | < | (_| | | | | | _| | |_| |> < _ / / __/ || (__ / / | | (_) | (_| | | | (_) | || (_| | || __/| (_| |/ / \__ \ | | | |_____| | | | /_ _\ \ \ | | (_) \__ \ | | | < / / + \_\/ |\___/|___/_| |_|_|\_\/_/ _/ |\___/|___/_| |_|_|\_\ \__,_|_|_| |_|_| |_|\__,_/_/\_(_)_/ \___|\__\___/_/ |_|\___/ \__, |_| \___/ \__\__,_|\__\___(_)__,_/_/ |___/_| |_| |_| |_| \/ \_\/ |\___/|___/_| |_|_|\_\/_/ + |__/ |__/ \____/ |___/ |__/ + _ _ _ _ _ _ _ _ _ _ _ ___ _ + __ _ _ __ __ _ ___| |__ ___ _ | (_)_ __ ___ / | || | _ ___ _ _ _ __ | |_ __ ___ __ ___ _ __ _ __ ___ _ __ _ __ ___ __ _ _ __ _ _ _ __ _____ ___ __ ___ ___| |_ ___ __| | | |_ ___ | | _____ _ __ ( ) \ ( ) + / _` | '_ \ / _` |/ __| '_ \ / _ (_) | | | '_ \ / _ \ | | || |(_) / __| | | | '_ \| __/ _` \ \/ / / _ \ '__| '__/ _ \| '__| | '_ \ / _ \/ _` | '__| | | | | '_ \ / _ \ \/ / '_ \ / _ \/ __| __/ _ \/ _` | | __/ _ \| |/ / _ \ '_ \ \|| ||/ +| (_| | |_) | (_| | (__| | | | __/_ | | | | | | __/ | |__ _| \__ \ |_| | | | | || (_| |> < | __/ | | | | (_) | | | | | | __/ (_| | | | |_| | | | | __/> <| |_) | __/ (__| || __/ (_| | | || (_) | < __/ | | | > > + \__,_| .__/ \__,_|\___|_| |_|\___(_) |_|_|_| |_|\___| |_| |_|(_) |___/\__, |_| |_|\__\__,_/_/\_\ \___|_| |_| \___/|_| |_| |_|\___|\__,_|_| \__,_|_| |_|\___/_/\_\ .__/ \___|\___|\__\___|\__,_| \__\___/|_|\_\___|_| |_| | | + |_| |___/ |_| /_/ + __ _ _ _ __ _ _ _ _ _ _ ___ _ __ _ _ _ __ _ _ _ _ _ _ _ _ + / /(_) ___ ___| |__ | | __\ \ __ _ _ __ __ _ ___| |__ ___ _ | (_)_ __ ___ / | || | _ ( ) \ ( ) / /(_) ___ ___| |__ | | __\ \ | |_| |__ ___ _ __ | | ___ | |_ | |_| |__ (_) ___| | _____ _ __ ___ +/ / | |/ _ \/ __| '_ \| |/ / \ \ / _` | '_ \ / _` |/ __| '_ \ / _ (_) | | | '_ \ / _ \ | | || |(_) \|| ||/ / / | |/ _ \/ __| '_ \| |/ / \ \ | __| '_ \ / _ \ | '_ \| |/ _ \| __| | __| '_ \| |/ __| |/ / _ \ '_ \/ __| +\ \ | | (_) \__ \ | | | < / / | (_| | |_) | (_| | (__| | | | __/_ | | | | | | __/ | |__ _| > > \ \ | | (_) \__ \ | | | < / / | |_| | | | __/ | |_) | | (_) | |_ | |_| | | | | (__| < __/ | | \__ \ + \_\/ |\___/|___/_| |_|_|\_\/_/ \__,_| .__/ \__,_|\___|_| |_|\___(_) |_|_|_| |_|\___| |_| |_|(_) | | \_\/ |\___/|___/_| |_|_|\_\/_/ \__|_| |_|\___| | .__/|_|\___/ \__| \__|_| |_|_|\___|_|\_\___|_| |_|___/ + |__/ |_| /_/ |__/ |_| + __ __ __ _ _ ___ _ _ _ _ _ _ _ _ _ __ _ _ __ _ _ _ _ _ + / /__ _ ___ _ _ / _|/ _(_) ___| | __| \ \ | |_| |__ ___ ___ ___ __ _ _ __ ___ _ __ ( ) |_ ___| |__ ___| | | ___ ___ _ __(_)_ __ | |_ ___ / /___ _ __(_) ___| |__ \ \ | |_| |__ (_)___ __ ____ _ ___ _ __ ( ) |_ +/ // _` / __| | | | |_| |_| |/ _ \ |/ _` |\ \ | __| '_ \ / _ \/ __|/ _ \ / _` | '__/ _ \ '_ \|/| __| / __| '_ \ / _ \ | | / __|/ __| '__| | '_ \| __/ __| / // _ \ '__| |/ __| '_ \ \ \ | __| '_ \| / __| \ \ /\ / / _` / __| '_ \|/| __| +\ \ (_| \__ \ |_| | _| _| | __/ | (_| |/ / | |_| | | | (_) \__ \ __/ | (_| | | | __/ | | | | |_ \__ \ | | | __/ | | \__ \ (__| | | | |_) | |_\__ \ \ \ __/ | | | (__| | | |/ / | |_| | | | \__ \ \ V V / (_| \__ \ | | | | |_ + \_\__,_|___/\__,_|_| |_| |_|\___|_|\__,_/_/ \__|_| |_|\___/|___/\___| \__,_|_| \___|_| |_| \__| |___/_| |_|\___|_|_| |___/\___|_| |_| .__/ \__|___/ \_\___|_| |_|\___|_| |_/_/ \__|_| |_|_|___/ \_/\_/ \__,_|___/_| |_| \__| + |_| + _ _ _ + ___| |__ (_) ___| | _____ _ __ + / __| '_ \| |/ __| |/ / _ \ '_ \ +| (__| | | | | (__| < __/ | | |_ + \___|_| |_|_|\___|_|\_\___|_| |_(_) + + _ _ _ _ _ _ _ _ + (_)_ __ _| || |_ __| | ___| |__ (_) __ _ _ __ __| | _____ _____| | + _____ _____ | | '_ \ |_ .. _|/ _` |/ _ \ '_ \| |/ _` | '_ \ _____ / _` |/ _ \ \ / / _ \ | + |_____|_____| | | | | | |_ _| (_| | __/ |_) | | (_| | | | |_____| (_| | __/\ V / __/ | + |_|_| |_| |_||_| \__,_|\___|_.__/|_|\__,_|_| |_| \__,_|\___| \_/ \___|_| + diff --git a/externals/figlet/tests/res022.txt b/externals/figlet/tests/res022.txt new file mode 100644 index 0000000000..fb6147b2d9 --- /dev/null +++ b/externals/figlet/tests/res022.txt @@ -0,0 +1,1314 @@ + __ + / / +/ / +\ \ + \_\ + + + ( + | + | + _/ + |__ + + _ + / + | ( + \_ + + + __ + / _ + \__ + |__ + + _ + | | + | ' + | | + |_| + + _ + | | + | | + | + |_| + +__ +\ \ + \ \ + / / +/_/ + + + ( + | + | + _/ + |__ + + _ + / + | ( + \_ + + + __ + / _ + \__ + |__ + + _ + | | + | ' + | | + |_| + + _ + | | + | | + | + |_| + + + / + / + | | + \ + \ + _ +(_) +| | +| | +|_| + + + _ + | ' + | | + |_| + + _ + / + | | + | + |_| + + _ +| | +| | +| | +|_| + + + _ + | | + | | + \_ + + + __ + \ \ + > + /_/ + + + _ +(_) + _ +(_) + + + + / + / + /_/ + + + _ + / + | + \_ + + _ + | | + | _ + | | + \_ + + + _ + / + | ( + \_ + + + + / + / + /_/ + + _ +| | +| | +| | +|_| + + + _ + / + | ( + \_ + + + _ + / + | ( + \_ + |_ + + _ + | ' + | | + |_| + + + _ + / + | ( + \_ + + _ + | | + | _ + | | + \_ + + + _ + / + | ( + \_ + + _ + | | + | _ + | | + \_ + + + _ + / + | + \_ + + + + + _ +(_) + + + _ + / + | ( + \_ + +__ +\ \ + \ \ + / / +/_/ + + + __ + / _ + \__ + |__ + + _ + | | + | ' + | | + |_| + + + + __ + |__ + + + + _ + | ' + | | + |_| + + + __/ + \ + /_ + \ + + __ + / / +/ / +\ \ + \_\ + + + ( + | + | + _/ + |__ + + _ + / + | ( + \_ + + + __ + / _ + \__ + |__ + + _ + | | + | ' + | | + |_| + + _ + | | + | | + | + |_| + +__ +\ \ + \ \ + / / +/_/ + + + _ + / + | ( + \_ + + + _ + | ' + | | + | . + |_| + + _ + / + | ( + \_ + + + _ + / + | ( + \_ + + _ + | | + | ' + | | + |_| + + + _ + / + | + \_ + + + _ +(_) + _ +(_) + + _ +| | +| | +| | +|_| + + _ +(_) +| | +| | +|_| + + + _ + | ' + | | + |_| + + + _ + / + | + \_ + + _ +/ | +| | +| | +|_| + + _ + | | + | | + |__ + + + + _ +(_) + _ +(_) + + + __ + / _ + \__ + |__ + + + _ + | | + | | + \_ + |_ + + _ + | ' + | | + |_| + + _ + | | + | _ + | | + \_ + + + _ + / + | ( + \_ + + + __ + \ \ + > + /_/ + + + _ + / + | + \_ + + + _ + | ' + | | + |_| + + + _ + | ' + | | + |_| + + + _ + / + | ( + \_ + + + _ + | ' + | | + |_| + + + _ + | ' + | | + |_| + + + _ + / + | + \_ + + + _ + / + | ( + \_ + + + _ + | ' + | | + |_| + + + _ + | | + | | + \_ + + + _ + | ' + | | + |_| + + + _ + / + | + \_ + + + __ + \ \ + > + /_/ + + + _ + | ' + | | + | . + |_| + + _ + / + | + \_ + + + _ + / + | ( + \_ + + _ + | | + | _ + | | + \_ + + + _ + / + | + \_ + + + _ + / + | ( + \_ + + _ + | | + | _ + | | + \_ + + + _ + / + | ( + \_ + + _ + | | + | | + | + |_| + + + _ + / + | + \_ + + + _ + | ' + | | + |_| + + _ +( ) + \| + + + + __ + \ \ + | + > + | + /_/ + _ +( ) +|/ + + + + __ + / / +/ / +\ \ + \_\ + + + ( + | + | + _/ + |__ + + _ + / + | ( + \_ + + + __ + / _ + \__ + |__ + + _ + | | + | ' + | | + |_| + + _ + | | + | | + | + |_| + +__ +\ \ + \ \ + / / +/_/ + + + _ + / + | ( + \_ + + + _ + | ' + | | + | . + |_| + + _ + / + | ( + \_ + + + _ + / + | ( + \_ + + _ + | | + | ' + | | + |_| + + + _ + / + | + \_ + + + _ +(_) + _ +(_) + + _ +| | +| | +| | +|_| + + _ +(_) +| | +| | +|_| + + + _ + | ' + | | + |_| + + + _ + / + | + \_ + + _ +/ | +| | +| | +|_| + + _ + | | + | | + |__ + + + + _ +(_) + _ +(_) + + _ +( ) + \| + + + + __ + \ \ + | + > + | + /_/ + _ +( ) +|/ + + + + __ + / / +/ / +\ \ + \_\ + + + ( + | + | + _/ + |__ + + _ + / + | ( + \_ + + + __ + / _ + \__ + |__ + + _ + | | + | ' + | | + |_| + + _ + | | + | | + | + |_| + +__ +\ \ + \ \ + / / +/_/ + + _ + | | + | _ + | | + \_ + + _ + | | + | ' + | | + |_| + + + _ + / + | + \_ + + + _ + | ' + | | + | . + |_| + _ +| | +| | +| | +|_| + + + _ + / + | ( + \_ + + _ + | | + | _ + | | + \_ + + _ + | | + | _ + | | + \_ + + _ + | | + | ' + | | + |_| + + _ +(_) +| | +| | +|_| + + + _ + / + | ( + \_ + + _ + | | + | | + | + |_| + + + _ + / + | + \_ + + + _ + | ' + | | + |_| + + + __ + / _ + \__ + |__ + + __ + / / +/ / +\ \ + \_\ + + + _ + / + | ( + \_ + + + __ + / _ + \__ + |__ + + + _ + | | + | | + \_ + + _ + / + | | + | + |_| + + _ + / + | | + | + |_| + + _ +(_) +| | +| | +|_| + + + _ + / + | + \_ + + _ +| | +| | +| | +|_| + + + _ + / + | ( + \_ + +__ +\ \ + \ \ + / / +/_/ + + _ + | | + | _ + | | + \_ + + _ + | | + | ' + | | + |_| + + + _ + / + | ( + \_ + + + __ + / _ + \__ + |__ + + + _ + / + | + \_ + + + _ + / + | ( + \_ + + + _ + | ' + | | + |_| + + + _ + / + | + \_ + + + _ + | ' + | | + |_| + + _ +( ) +|/ + + + + _ + | | + | _ + | | + \_ + + + __ + / _ + \__ + |__ + + _ + | | + | ' + | | + |_| + + + _ + / + | + \_ + + _ +| | +| | +| | +|_| + + _ +| | +| | +| | +|_| + + + __ + / _ + \__ + |__ + + + _ + / + | ( + \_ + + + _ + | ' + | | + |_| + + _ +(_) +| | +| | +|_| + + + _ + | ' + | | + | . + |_| + _ + | | + | _ + | | + \_ + + + __ + / _ + \__ + |__ + + __ + / / +/ / +\ \ + \_\ + + + _ + / + | + \_ + + + _ + | ' + | | + |_| + + _ +(_) +| | +| | +|_| + + + _ + / + | ( + \_ + + _ + | | + | ' + | | + |_| + +__ +\ \ + \ \ + / / +/_/ + + _ + | | + | _ + | | + \_ + + _ + | | + | ' + | | + |_| + + _ +(_) +| | +| | +|_| + + + __ + / _ + \__ + |__ + + + __ + \ \ + \ + \ + + + _ + / + | ( + \_ + + + __ + / _ + \__ + |__ + + + _ + | ' + | | + |_| + + _ +( ) +|/ + + + + _ + | | + | _ + | | + \_ + + + _ + / + | ( + \_ + + _ + | | + | ' + | | + |_| + + _ +(_) +| | +| | +|_| + + + _ + / + | ( + \_ + + _ + | | + | | + | + |_| + + + _ + / + | + \_ + + + _ + | ' + | | + |_| + + + + + _ +(_) + + + + + + + + + + __ + |__ + + + + + __ + |__ + + + _ +(_) +| | +| | +|_| + + + _ + | ' + | | + |_| + + + _| + |_ + |_ + | + + + _ + / + | ( + \_ + + + _ + / + | + \_ + + _ + | | + | ' + | | + |_. + + _ +(_) +| | +| | +|_| + + + _ + / + | ( + \_ + + + _ + | ' + | | + |_| + + + + __ + |__ + + + + _ + / + | ( + \_ + + + _ + / + | + \_ + + + __ + \ \ + \ + \ + + + _ + / + | + \_ + + _ +| | +| | +| | +|_| + diff --git a/externals/figlet/tests/res023.txt b/externals/figlet/tests/res023.txt new file mode 100644 index 0000000000..d4d7a719dd --- /dev/null +++ b/externals/figlet/tests/res023.txt @@ -0,0 +1,90 @@ + __ _ _ _ __ + / / (_) ___ ___| |_ | |__\ \ + < < | |/ _ \(_-<| ' \ | / / > > + \_\_/ |\___//__/|_||_||_\_\/_/ + |__/ + _ _ _ ____ _ __ _ _ __ _ + (_) ___ ___| |_ | |__ / __ \ (_) _ _ / _|| | _ _ __ __(_) / /___ | |_ + | |/ _ \(_-<| ' \ | / // / _` || || ' \ | _|| || || |\ \ / _ / // -_)| _| + _/ |\___//__/|_||_||_\_\\ \__,_||_||_||_||_| |_| \_,_|/_\_\(_)/_/ \___| \__| + |__/ \____/ + __ _ _ _ _ __ _ + __ / /| | ___ __ _ _ _ ___ | |_ __ _ | |_ ___ __| |\ \ ___| |_ + / _| / / | |/ _ \/ _` || '_|/ _ \| _|/ _` || _|/ -_) _ / _` | > > (_-<| ' \ + \__|/_/ |_|\___/\__, ||_| \___/ \__|\__,_| \__|\___|(_)\__,_|/_/ /__/|_||_| + |___/ + __ _ _ _ __ + ___ _ _ _/\_ / / (_) ___ ___| |_ | |__\ \ + |___|| ' \ > < < < | |/ _ \(_-<| ' \ | / / > > + |_||_| \/ \_\_/ |\___//__/|_||_||_\_\/_/ + |__/ + _ _ _ _ _ _ _ _ + __ _ _ __ __ _ __ | |_ ___ (_) | |(_) _ _ ___ / || | |(_) + / _` || '_ \/ _` |/ _|| ' \ / -_) _ | || || ' \ / -_) | ||_ _|_ + \__,_|| .__/\__,_|\__||_||_|\___|(_) |_||_||_||_|\___| |_| |_|(_) + |_| + _ + ___ _ _ _ _ | |_ __ _ __ __ ___ _ _ _ _ ___ _ _ + (_-<| || || ' \| _|/ _` |\ \ / / -_)| '_|| '_|/ _ \| '_| + /__/ \_, ||_||_|\__|\__,_|/_\_\ \___||_| |_| \___/|_| + |__/ + _ _ + _ _ ___ __ _ _ _ _ _ _ _ ___ __ __ _ __ ___ __ | |_ ___ __| | + | ' \ / -_)/ _` || '_| | || || ' \ / -_)\ \ /| '_ \/ -_)/ _|| _|/ -_)/ _` | + |_||_|\___|\__,_||_| \_,_||_||_|\___|/_\_\| .__/\___|\__| \__|\___|\__,_| + |_| + _ _ _ __ _ __ _ _ _ __ + | |_ ___ | |__ ___ _ _ ( )\ \ ( ) / / (_) ___ ___| |_ | |__\ \ + | _|/ _ \| / // -_)| ' \ \| | |_|/ < < | |/ _ \(_-<| ' \ | / / > > + \__|\___/|_\_\\___||_||_| | | \_\_/ |\___//__/|_||_||_\_\/_/ + /_/ |__/ + _ _ _ _ _ _ _ _ _ __ _ + __ _ _ __ __ _ __ | |_ ___ (_) | |(_) _ _ ___ / || | |(_) ( )\ \ ( ) + / _` || '_ \/ _` |/ _|| ' \ / -_) _ | || || ' \ / -_) | ||_ _|_ \| | |_|/ + \__,_|| .__/\__,_|\__||_||_|\___|(_) |_||_||_||_|\___| |_| |_|(_) | | + |_| /_/ + __ _ _ _ __ _ _ _ _ + / / (_) ___ ___| |_ | |__\ \ | |_ | |_ ___ _ __ | | ___ | |_ + < < | |/ _ \(_-<| ' \ | / / > > | _|| ' \ / -_) | '_ \| |/ _ \| _| + \_\_/ |\___//__/|_||_||_\_\/_/ \__||_||_|\___| | .__/|_|\___/ \__| + |__/ |_| + _ _ _ _ + | |_ | |_ (_) __ | |__ ___ _ _ ___ + | _|| ' \ | |/ _|| / // -_)| ' \ (_-< + \__||_||_||_|\__||_\_\\___||_||_|/__/ + + __ __ __ _ _ _ __ _ _ + / / __ _ ___ _ _ / _| / _|(_) ___ | | __| |\ \ | |_ | |_ ___ ___ ___ + < < / _` |(_-<| || || _|| _|| |/ -_)| |/ _` | > > | _|| ' \ / _ \(_- > + /__/\__||_| |_|| .__/ \__|/__/ \_\\___||_| |_|\__||_||_|/_/ + |_| + _ _ _ _ _ + | |_ | |_ (_) ___ __ __ __ __ _ ___ _ _ ( )| |_ + | _|| ' \ | |(_-< \ V V // _` |(_-<| ' \|/ | _| + \__||_||_||_|/__/ \_/\_/ \__,_|/__/|_||_| \__| + + _ _ _ + __ | |_ (_) __ | |__ ___ _ _ + / _|| ' \ | |/ _|| / // -_)| ' \ _ + \__||_||_||_|\__||_\_\\___||_||_|(_) + + _ + ___ ___ (_) _ _ + |___||___| | || ' \ + |_||_||_| + + _ _ _ _ _ _ _ + _| | |_ __| | ___ | |__ (_) __ _ _ _ ___ __| | ___ __ __ ___ | | + |_ . _|/ _` |/ -_)| '_ \| |/ _` || ' \|___|/ _` |/ -_)\ V // -_)| | + |_ _|\__,_|\___||_.__/|_|\__,_||_||_| \__,_|\___| \_/ \___||_| + |_|_| diff --git a/externals/figlet/tests/res024.txt b/externals/figlet/tests/res024.txt new file mode 100644 index 0000000000..8f1923cef1 --- /dev/null +++ b/externals/figlet/tests/res024.txt @@ -0,0 +1,39 @@ +fonts/646-ca.flc +fonts/646-ca2.flc +fonts/646-cn.flc +fonts/646-cu.flc +fonts/646-de.flc +fonts/646-dk.flc +fonts/646-es.flc +fonts/646-es2.flc +fonts/646-fr.flc +fonts/646-gb.flc +fonts/646-hu.flc +fonts/646-irv.flc +fonts/646-it.flc +fonts/646-jp.flc +fonts/646-kr.flc +fonts/646-no.flc +fonts/646-no2.flc +fonts/646-pt.flc +fonts/646-pt2.flc +fonts/646-se.flc +fonts/646-se2.flc +fonts/646-yu.flc +fonts/8859-2.flc +fonts/8859-3.flc +fonts/8859-4.flc +fonts/8859-5.flc +fonts/8859-7.flc +fonts/8859-8.flc +fonts/8859-9.flc +fonts/frango.flc +fonts/hz.flc +fonts/ilhebrew.flc +fonts/jis0201.flc +fonts/koi8r.flc +fonts/moscow.flc +fonts/upper.flc +fonts/ushebrew.flc +fonts/uskata.flc +fonts/utf8.flc diff --git a/externals/figlet/tests/res025.txt b/externals/figlet/tests/res025.txt new file mode 100644 index 0000000000..12b3f95496 --- /dev/null +++ b/externals/figlet/tests/res025.txt @@ -0,0 +1,8 @@ +########## ## # # + ### ## ########## ####### ########## + # ## # # # # ## + # ## # ## # ## # + # # ## # ## # + # # ## # ## ## + # # ## ########## # + diff --git a/externals/figlet/tests/res026.txt b/externals/figlet/tests/res026.txt new file mode 100644 index 0000000000..12b3f95496 --- /dev/null +++ b/externals/figlet/tests/res026.txt @@ -0,0 +1,8 @@ +########## ## # # + ### ## ########## ####### ########## + # ## # # # # ## + # ## # ## # ## # + # # ## # ## # + # # ## # ## ## + # # ## ########## # + diff --git a/externals/figlet/tests/res027.txt b/externals/figlet/tests/res027.txt new file mode 100644 index 0000000000..7f6545f865 --- /dev/null +++ b/externals/figlet/tests/res027.txt @@ -0,0 +1,430 @@ + .--. .--. .---. .---. .-'''-. ,-----. .-./`) + | | _/ / | | |_ _| / _ \ .' .-, '. \ '_ .') _.--``) + | (`' ) / | | ( ' ) (`' )/`--' / ,-.| \ _ \ (_ (_) _)/_ _.-` + |(_ ()_) | '-(_{;}_)(_ o _). ; \ '_ / | : / . \/( ' ) + | (_,_) __ | (_,_) (_,_). '. | _`,/ \ _/ | ___ |-'`|((_{;}_) + | |\ \ | || _ _--. | .---. \ :: ( '\_/ \ ;| | | ' \(_,_) + | | \ `' /|( ' ) | | \ `-' | \ `"/ \ ) / | `-' / \ `-. + | | \ / (_{;}_)| | \ / '. \_/``".' \ / `---._) + `--' `'-' '(_,_) '---' `-...-' '-----' `-..-' + + + (``--._ + `-._ _\ + ( ` )\ + (_{;}_)) + (_,_)/ + .-' / + (_.---' + + + _-_'''-. .--. .--. .---. .---. .-'''-. ,-----. .-./`) + ( ' ) \ | | _/ / | | |_ _| / _ \ .' .-, '. \ '_ .') + (_{;}_) '| (`' ) / | | ( ' ) (`' )/`--' / ,-.| \ _ \ (_ (_) _) + .(_,_)--. ||(_ ()_) | '-(_{;}_)(_ o _). ; \ '_ / | : / . \ + | | / || (_,_) __ | (_,_) (_,_). '. | _`,/ \ _/ | ___ |-'`| + ' | /| |\ \ | || _ _--. | .---. \ :: ( '\_/ \ ;| | | ' + \ \____/ | | \ `' /|( ' ) | | \ `-' | \ `"/ \ ) / | `-' / + \ / | | \ / (_{;}_)| | \ / '. \_/``".' \ / + `'-...-' `--' `'-' '(_,_) '---' `-...-' '-----' `-..-' + + _ _ _____ __ ___ _ .---. ________ ,---. .--..-./`) + ( ` ) \ _\ / /.' | | | | ,_| | || \ | |\ .-.') + (_{;}_).-./ ). / ' | .' | |,-./ ) | .----'| , \ | |/ `-' \ + (_,_) \ '_ .') .' .' '_ | |\ '_ '`) | _|____ | |\_ \| | `-'`"` + (_ (_) _) ' ' ( \.-.| > (_) ) |_( )_ || _( )_\ | .---. + _ / \ \ ' (`. _` /|( . .-' (_ o._)__|| (_ o _) | | | + _( )_ `-'`-' \ | (_ (_) _) `-'`-'|___ |(_,_) | (_,_)\ | | | + (_ o _)/ / \ \ \ / . \ / | \| | | | | | | | + (_,_)'--' '----' ``-'`-'' `--------`'---' '--' '--' '---' + + .---. _ _ _______ ,---------. .-''-. _ _ + | ,_| ( ' ) / __ \\ \ .'_ _ \ ( ' ) + ,-./ ) (_{;}_) | ,_/ \__)`--. ,---'/ ( ` ) ' (_{;}_) + \ '_ '`) (_,_),-./ ) | \ . (_ o _) | (_,_) + > (_) ) // \ '_ '`) :_ _: | (_,_)___| // + ( . .-' // > (_) ) __ (_I_) ' \ .---. // + `-'`-'|___ ,-'/ ( . .-'_/ ) (_(=)_) \ `-' /,-'/ + | \) ( `-'`-' / (_I_) \ /) ( + `--------``---' `._____.' '---' `'-..-' `---' + + ____ ,---------. ,-----. .-------. .-_'''-. ,-----. + .' __ `.\ \ .' .-, '. | _ _ \ '_( )_ \ .' .-, '. + / ' \ \`--. ,---'/ ,-.| \ _ \ | ( ' ) | |(_ o _)| ' / ,-.| \ _ \ + |___| / | | \ ; \ '_ / | :|(_ o _) / . (_,_)/___| ; \ '_ / | : + _.-` | :_ _: | _`,/ \ _/ || (_,_).' __ | | .-----.| _`,/ \ _/ | + .' _ | (_I_) : ( '\_/ \ ;| |\ \ | |' \ '- .': ( '\_/ \ ; + | _( )_ | (_(=)_) \ `"/ \ ) / | | \ `' / \ `-'` | \ `"/ \ ) / + \ (_ o _) / (_I_) '. \_/``".' | | \ / \ / '. \_/``".' + '.(_,_).' '---' '-----' ''-' `'-' `'-...-' '-----' + + .---. .---. .-'''-. ______ .-''-. ,---------. + | | |_ _| / _ \ (``--._ | _ `''. .'_ _ \\ \ + | | ( ' ) (`' )/`--' `-._ _\ | _ | ) _ \ / ( ` ) '`--. ,---' + | '-(_{;}_)(_ o _). ( ` )\ |( ''_' ) | . (_ o _) | | \ + | (_,_) (_,_). '. (_{;}_))| . (_) `. | | (_,_)___| :_ _: + | _ _--. | .---. \ : (_,_)/ |(_ ._) '_ _' \ .---. (_I_) + |( ' ) | | \ `-' | .-' / | (_.\.' /( ` )\ `-' / (_(=)_) + (_{;}_)| | \ / (_.---' | .'(_{;}_)\ / (_I_) + '(_,_) '---' `-...-' '-----'` (_,_) `'-..-' '---' + + ,---. .--. + .-, | \ | | + ,-.| \ _ | , \ | | + \ '_ / | | |\_ \| | _ _ _ _ + _`,/ \ _/ | _( )_\ | ( ' )--( ' ) + ( '\_/ \ | (_ o _) |(_{;}_)(_{;}_) + `"/ \ ) | (_,_)\ | (_,_)--(_,_) + \_/``" | | | | + '--' '--' + + .--. .--. .---. .---. .-'''-. ,-----. .-./`) + | | _/ / | | |_ _| / _ \ .' .-, '. \ '_ .') _.--``) + | (`' ) / | | ( ' ) (`' )/`--' / ,-.| \ _ \ (_ (_) _)/_ _.-` + |(_ ()_) | '-(_{;}_)(_ o _). ; \ '_ / | : / . \/( ' ) + | (_,_) __ | (_,_) (_,_). '. | _`,/ \ _/ | ___ |-'`|((_{;}_) + | |\ \ | || _ _--. | .---. \ :: ( '\_/ \ ;| | | ' \(_,_) + | | \ `' /|( ' ) | | \ `-' | \ `"/ \ ) / | `-' / \ `-. + | | \ / (_{;}_)| | \ / '. \_/``".' \ / `---._) + `--' `'-' '(_,_) '---' `-...-' '-----' `-..-' + + + (``--._ + `-._ _\ + ( ` )\ + (_{;}_)) + (_,_)/ + .-' / + (_.---' + + + _ _ .-''-. .---. .---. _______ ____ .-------. ____ + ( ` ) .'_ _ \ | | |_ _| / __ \ .' __ `. \ _(`)_ \ .' __ `. + (_{;}_)/ ( ` ) '| | ( ' ) | ,_/ \__) / ' \ \| (_ o._)|/ ' \ \ + (_,_). (_ o _) || '-(_{;}_),-./ ) |___| / || (_,_) /|___| / | + | (_,_)___|| (_,_) \ '_ '`) _.-` || '-.-' _.-` | + _ ' \ .---.| _ _--. | > (_) ) __ .' _ || | .' _ | + _( )_ \ `-' /|( ' ) | | ( . .-'_/ )| _( )_ || | | _( )_ | + (_ o _) \ / (_{;}_)| | `-'`-' / \ (_ o _) // ) \ (_ o _) / + (_,_) `'-..-' '(_,_) '---' `._____.' '.(_,_).' `---' '.(_,_).' + + _ _ ,---. ,---. .-''-. ,---. .--..-./`) .---. + ( ` ) /,--.| /_ | .'_ _ \ | \ | |\ .-.') | ,_| + (_{;}_) //_ || ,_ | / ( ` ) '| , \ | |/ `-' \,-./ ) + (_,_) /_( )_|| ,-./ )| . (_ o _) || |\_ \| | `-'`"`\ '_ '`) + /(_ o _)| \ '_ '`) | (_,_)___|| _( )_\ | .---. > (_) ) + _ / /(_,_)||_ > (_) ) ' \ .---.| (_ o _) | | | ( . .-' + _( )_ / `-----' ||( . .-' \ `-' /| (_,_)\ | | | `-'`-'|___ + (_ o _)`-------|||-' `-'`-'| \ / | | | | | | | \ + (_,_) '-' '---' `'-..-' '--' '--' '---' `--------` + + _____ __ ____ ,---------. ,---. .--. ____ __ .-'''-. + \ _\ / / .' __ `.\ \| \ | | \ \ / // _ \ + .-./ ). / ' / ' \ \`--. ,---'| , \ | | \ _. / '(`' )/`--' + \ '_ .') .' |___| / | | \ | |\_ \| | _( )_ .'(_ o _). + (_ (_) _) ' _.-` | :_ _: | _( )_\ | ___(_ o _)' (_,_). '. + / \ \ .' _ | (_I_) | (_ o _) || |(_,_)' .---. \ : + `-'`-' \ | _( )_ | (_(=)_) | (_,_)\ || `-' / \ `-' | + / / \ \\ (_ o _) / (_I_) | | | | \ / \ / + '--' '----''.(_,_).' '---' '--' '--' `-..-' `-...-' + + .-------. ,-----. .-------. .-------. .-''-. + | _ _ \ .' .-, '. | _ _ \ | _ _ \ .'_ _ \ + | ( ' ) | / ,-.| \ _ \ | ( ' ) | | ( ' ) | / ( ` ) ' + |(_ o _) / ; \ '_ / | :|(_ o _) / |(_ o _) / . (_ o _) | + | (_,_).' __ | _`,/ \ _/ || (_,_).' __ | (_,_).' __ | (_,_)___| + | |\ \ | |: ( '\_/ \ ;| |\ \ | || |\ \ | |' \ .---. + | | \ `' / \ `"/ \ ) / | | \ `' /| | \ `' / \ `-' / + | | \ / '. \_/``".' | | \ / | | \ / \ / + ''-' `'-' '-----' ''-' `'-' ''-' `'-' `'-..-' + + .-------. ____ .-''-. ,---. .--. + | _ _ \ .' __ `. .'_ _ \ | \ | | + | ( ' ) | / ' \ \ / ( ` ) '| , \ | | + |(_ o _) / |___| / |. (_ o _) || |\_ \| | + | (_,_).' __ _.-` || (_,_)___|| _( )_\ | + | |\ \ | |.' _ |' \ .---.| (_ o _) | + | | \ `' /| _( )_ | \ `-' /| (_,_)\ | + | | \ / \ (_ o _) / \ / | | | | + ''-' `'-' '.(_,_).' `'-..-' '--' '--' + + .-''-. .-------. _____ __ .-''-. ,---. .--. ___ _ + .'_ _ \ \ _(`)_ \\ _\ / /.'_ _ \ | \ | |.' | | | + / ( ` ) '| (_ o._)|.-./ ). / '/ ( ` ) '| , \ | || .' | | + . (_ o _) || (_,_) /\ '_ .') .'. (_ o _) || |\_ \| |.' '_ | | + | (_,_)___|| '-.-'(_ (_) _) ' | (_,_)___|| _( )_\ |' ( \.-.| + ' \ .---.| | / \ \' \ .---.| (_ o _) |' (`. _` /| + \ `-' /| | `-'`-' \\ `-' /| (_,_)\ || (_ (_) _) + \ / / ) / / \ \\ / | | | | \ / . \ / + `'-..-' `---' '--' '----'`'-..-' '--' '--' ``-'`-'' + + ______ .-''-. ,---------. _______ + | _ `''. .'_ _ \\ \ / __ \ + | _ | ) _ \ / ( ` ) '`--. ,---'| ,_/ \__) + |( ''_' ) |. (_ o _) | | \ ,-./ ) + | . (_) `. || (_,_)___| :_ _: \ '_ '`) + |(_ ._) '' \ .---. (_I_) > (_) ) __ + | (_.\.' / \ `-' / (_(=)_)( . .-'_/ ) + | .' \ / (_I_) `-'`-' / + '-----'` `'-..-' '---' `._____.' + + ,---. .--. .-''-. .--. .--. ,-----. ,---------. + | \ | | .'_ _ \ | | _/ / .' .-, '.\ \ + | , \ | | / ( ` ) '| (`' ) / / ,-.| \ _ \`--. ,---' + | |\_ \| |. (_ o _) ||(_ ()_) ; \ '_ / | : | \ + | _( )_\ || (_,_)___|| (_,_) __ | _`,/ \ _/ | :_ _: + | (_ o _) |' \ .---.| |\ \ | |: ( '\_/ \ ; (_I_) + | (_,_)\ | \ `-' /| | \ `' / \ `"/ \ ) / (_(=)_) + | | | | \ / | | \ / '. \_/``".' (_I_) + '--' '--' `'-..-' `--' `'-' '-----' '---' + + _ _ .----, _ _ + ( ' )`-, ( (_I_) + (_{;}_) _\_ \(_(=)_) + (_,_) ( ' ) \(_I_) + (_{;}_) ( )/ + (_,_) / + / / + .-` ( + '----` + + .--. .--. .---. .---. .-'''-. ,-----. .-./`) + | | _/ / | | |_ _| / _ \ .' .-, '. \ '_ .') _.--``) + | (`' ) / | | ( ' ) (`' )/`--' / ,-.| \ _ \ (_ (_) _)/_ _.-` + |(_ ()_) | '-(_{;}_)(_ o _). ; \ '_ / | : / . \/( ' ) + | (_,_) __ | (_,_) (_,_). '. | _`,/ \ _/ | ___ |-'`|((_{;}_) + | |\ \ | || _ _--. | .---. \ :: ( '\_/ \ ;| | | ' \(_,_) + | | \ `' /|( ' ) | | \ `-' | \ `"/ \ ) / | `-' / \ `-. + | | \ / (_{;}_)| | \ / '. \_/``".' \ / `---._) + `--' `'-' '(_,_) '---' `-...-' '-----' `-..-' + + + (``--._ + `-._ _\ + ( ` )\ + (_{;}_)) + (_,_)/ + .-' / + (_.---' + + + _ _ .-''-. .---. .---. _______ ____ .-------. ____ + ( ` ) .'_ _ \ | | |_ _| / __ \ .' __ `. \ _(`)_ \ .' __ `. + (_{;}_)/ ( ` ) '| | ( ' ) | ,_/ \__) / ' \ \| (_ o._)|/ ' \ \ + (_,_). (_ o _) || '-(_{;}_),-./ ) |___| / || (_,_) /|___| / | + | (_,_)___|| (_,_) \ '_ '`) _.-` || '-.-' _.-` | + _ ' \ .---.| _ _--. | > (_) ) __ .' _ || | .' _ | + _( )_ \ `-' /|( ' ) | | ( . .-'_/ )| _( )_ || | | _( )_ | + (_ o _) \ / (_{;}_)| | `-'`-' / \ (_ o _) // ) \ (_ o _) / + (_,_) `'-..-' '(_,_) '---' `._____.' '.(_,_).' `---' '.(_,_).' + + _ _ ,---. ,---. .-''-. ,---. .--..-./`) .---. + ( ` ) /,--.| /_ | .'_ _ \ | \ | |\ .-.') | ,_| + (_{;}_) //_ || ,_ | / ( ` ) '| , \ | |/ `-' \,-./ ) + (_,_) /_( )_|| ,-./ )| . (_ o _) || |\_ \| | `-'`"`\ '_ '`) + /(_ o _)| \ '_ '`) | (_,_)___|| _( )_\ | .---. > (_) ) + _ / /(_,_)||_ > (_) ) ' \ .---.| (_ o _) | | | ( . .-' + _( )_ / `-----' ||( . .-' \ `-' /| (_,_)\ | | | `-'`-'|___ + (_ o _)`-------|||-' `-'`-'| \ / | | | | | | | \ + (_,_) '-' '---' `'-..-' '--' '--' '---' `--------` + + _ _ .----, _ _ + ( ' )`-, ( (_I_) + (_{;}_) _\_ \(_(=)_) + (_,_) ( ' ) \(_I_) + (_{;}_) ( )/ + (_,_) / + / / + .-` ( + '----` + + .--. .--. .---. .---. .-'''-. ,-----. .-./`) + | | _/ / | | |_ _| / _ \ .' .-, '. \ '_ .') _.--``) + | (`' ) / | | ( ' ) (`' )/`--' / ,-.| \ _ \ (_ (_) _)/_ _.-` + |(_ ()_) | '-(_{;}_)(_ o _). ; \ '_ / | : / . \/( ' ) + | (_,_) __ | (_,_) (_,_). '. | _`,/ \ _/ | ___ |-'`|((_{;}_) + | |\ \ | || _ _--. | .---. \ :: ( '\_/ \ ;| | | ' \(_,_) + | | \ `' /|( ' ) | | \ `-' | \ `"/ \ ) / | `-' / \ `-. + | | \ / (_{;}_)| | \ / '. \_/``".' \ / `---._) + `--' `'-' '(_,_) '---' `-...-' '-----' `-..-' + + .-''-. .---. .---.,---------. + .'_ _ \ | | |_ _|\ \ (``--._ + / ( ` ) '| | ( ' ) `--. ,---' `-._ _\ + . (_ o _) || '-(_{;}_) | \ ( ` )\ + | (_,_)___|| (_,_) :_ _: (_{;}_)) + ' \ .---.| _ _--. | (_I_) (_,_)/ + \ `-' /|( ' ) | | (_(=)_) .-' / + \ / (_{;}_)| | (_I_) (_.---' + `'-..-' '(_,_) '---' '---' + + ,---------. ,-----. .---. .-------. + \ \ .' .-, '. | ,_| \ _(`)_ \ + `--. ,---'/ ,-.| \ _ \ ,-./ ) | (_ o._)| + | \ ; \ '_ / | :\ '_ '`) | (_,_) / + :_ _: | _`,/ \ _/ | > (_) ) | '-.-' + (_I_) : ( '\_/ \ ;( . .-' | | + (_(=)_) \ `"/ \ ) / `-'`-'|___ | | + (_I_) '. \_/``".' | \/ ) + '---' '-----' `--------``---' + + .-''-. .--. .--. _______ .-./`) .---. .---.,---------. + .'_ _ \ | | _/ / / __ \ \ .-.')| | |_ _|\ \ + / ( ` ) '| (`' ) / | ,_/ \__)/ `-' \| | ( ' ) `--. ,---' + . (_ o _) ||(_ ()_) ,-./ ) `-'`"`| '-(_{;}_) | \ + | (_,_)___|| (_,_) __ \ '_ '`) .---. | (_,_) :_ _: + ' \ .---.| |\ \ | | > (_) ) __ | | | _ _--. | (_I_) + \ `-' /| | \ `' /( . .-'_/ )| | |( ' ) | | (_(=)_) + \ / | | \ / `-'`-' / | | (_{;}_)| | (_I_) + `'-..-' `--' `'-' `._____.' '---' '(_,_) '---' '---' + + .-'''-. ,---. .--. + / _ \| \ | | + (`' )/`--'| , \ | | + (_ o _). | |\_ \| | + (_,_). '. | _( )_\ | + .---. \ :| (_ o _) | + \ `-' || (_,_)\ | + \ / | | | | + `-...-' '--' '--' + + .-./`) ________ ________ ___ _ .-'''-. ____ + \ .-.')| || |.' | | | / _ \ .' __ `. _.--``) + / `-' \| .----'| .----'| .' | | (`' )/`--'/ ' \ \ /_ _.-` + `-'`"`| _|____ | _|____ .' '_ | |(_ o _). |___| / | /( ' ) + .---. |_( )_ ||_( )_ |' ( \.-.| (_,_). '. _.-` |((_{;}_) + | | (_ o._)__|(_ o._)__|' (`. _` /|.---. \ :.' _ | \(_,_) + | | |(_,_) |(_,_) | (_ (_) _)\ `-' || _( )_ | \ `-. + | | | | | | \ / . \ / \ / \ (_ o _) / `---._) + '---' '---' '---' ``-'`-'' `-...-' '.(_,_).' + + ______ .---. .-''-. + (``--._ | _ `''. | ,_| .'_ _ \ + `-._ _\ | _ | ) _ \,-./ ) / ( ` ) ' + ( ` )\ |( ''_' ) |\ '_ '`) . (_ o _) | + (_{;}_))| . (_) `. | > (_) ) | (_,_)___| + (_,_)/ |(_ ._) '( . .-' ' \ .---. + .-' / | (_.\.' / `-'`-'|___\ `-' / + (_.---' | .' | \\ / + '-----'` `--------` `'-..-' + + .-''-. .-'''-. ,-----. .---. .---.,---------. + .'_ _ \ / _ \ .' .-, '. | | |_ _|\ \ + / ( ` ) ' (`' )/`--' / ,-.| \ _ \ | | ( ' ) `--. ,---' + . (_ o _) |(_ o _). ; \ '_ / | :| '-(_{;}_) | \ + | (_,_)___| (_,_). '. | _`,/ \ _/ || (_,_) :_ _: + ' \ .---..---. \ :: ( '\_/ \ ;| _ _--. | (_I_) + \ `-' /\ `-' | \ `"/ \ ) / |( ' ) | | (_(=)_) + \ / \ / '. \_/``".' (_{;}_)| | (_I_) + `'-..-' `-...-' '-----' '(_,_) '---' '---' + + ,---------. _ _ ,---. .--. .-''-. .-------. ____ + \ \ ( ' ) | \ | | .'_ _ \ | _ _ \ .' __ `. + `--. ,---'(_{;}_)| , \ | | / ( ` ) '| ( ' ) | / ' \ \ + | \ (_,_) | |\_ \| |. (_ o _) ||(_ o _) / |___| / | + :_ _: | _( )_\ || (_,_)___|| (_,_).' __ _.-` | + (_I_) | (_ o _) |' \ .---.| |\ \ | |.' _ | + (_(=)_) | (_,_)\ | \ `-' /| | \ `' /| _( )_ | + (_I_) | | | | \ / | | \ / \ (_ o _) / + '---' '--' '--' `'-..-' ''-' `'-' '.(_,_).' + + .---. .---. .-''-. .---. .---. .-'''-. + | ,_| | ,_| .'_ _ \ | | |_ _| / _ \ + ,-./ ) ,-./ ) / ( ` ) '| | ( ' ) (`' )/`--' + \ '_ '`) \ '_ '`) . (_ o _) || '-(_{;}_)(_ o _). + > (_) ) > (_) ) | (_,_)___|| (_,_) (_,_). '. + ( . .-' ( . .-' ' \ .---.| _ _--. | .---. \ : + `-'`-'|___`-'`-'|___\ `-' /|( ' ) | | \ `-' | + | \| \\ / (_{;}_)| | \ / + `--------``--------` `'-..-' '(_,_) '---' `-...-' + + .-'''-. ,---------. .-------. .-./`) .-------. _______ .-'''-. + / _ \\ \\ _(`)_ \\ .-.')| _ _ \ / __ \ / _ \ + (`' )/`--' `--. ,---'| (_ o._)|/ `-' \| ( ' ) | | ,_/ \__) (`' )/`--' +(_ o _). | \ | (_,_) / `-'`"`|(_ o _) / ,-./ ) (_ o _). + (_,_). '. :_ _: | '-.-' .---. | (_,_).' __ \ '_ '`) (_,_). '. +.---. \ : (_I_) | | | | | |\ \ | | > (_) ) __ .---. \ : +\ `-' | (_(=)_) | | | | | | \ `' /( . .-'_/ )\ `-' | + \ / (_I_) / ) | | | | \ / `-'`-' / \ / + `-...-' '---' `---' '---' ''-' `'-' `._____.' `-...-' + + .---. .---. _______ .-./`) .-------. .-''-. +(``--._ | | |_ _| / __ \ \ .-.')| _ _ \ .'_ _ \ _.--``) + `-._ _\ | | ( ' ) | ,_/ \__)/ `-' \| ( ' ) | / ( ` ) ' /_ _.-` + ( ` )\ | '-(_{;}_),-./ ) `-'`"`|(_ o _) / . (_ o _) | /( ' ) + (_{;}_))| (_,_) \ '_ '`) .---. | (_,_).' __ | (_,_)___|((_{;}_) + (_,_)/ | _ _--. | > (_) ) __ | | | |\ \ | |' \ .---. \(_,_) + .-' / |( ' ) | | ( . .-'_/ )| | | | \ `' / \ `-' / \ `-. +(_.---' (_{;}_)| | `-'`-' / | | | | \ / \ / `---._) + '(_,_) '---' `._____.' '---' ''-' `'-' `'-..-' + + .-'''-. .-./`) .---. .---.,---------. + / _ \\ .-.')| | |_ _|\ \ + (`' )/`--'/ `-' \| | ( ' ) `--. ,---' + (_ o _). `-'`"`| '-(_{;}_) | \ + (_,_). '. .---. | (_,_) :_ _: + .---. \ : | | | _ _--. | (_I_) + \ `-' | | | |( ' ) | | (_(=)_) + \ / | | (_{;}_)| | (_I_) + `-...-' '---' '(_,_) '---' '---' + + ,---------. _ _ ,---. .--. .-'''-. ____ .--. .--. + \ \ ( ' ) | \ | | / _ \ .' __ `. | |_ | | + `--. ,---'(_{;}_)| , \ | | (`' )/`--'/ ' \ \| _( )_ | | + | \ (_,_) | |\_ \| |(_ o _). |___| / ||(_ o _) | | + :_ _: | _( )_\ | (_,_). '. _.-` || (_,_) \ | | + (_I_) | (_ o _) |.---. \ :.' _ || |/ \| | + (_(=)_) | (_,_)\ |\ `-' || _( )_ || ' /\ ` | + (_I_) | | | | \ / \ (_ o _) /| / \ | + '---' '--' '--' `-...-' '.(_,_).' `---' `---` + + .-''-. .--. .--. _______ .-./`) .---. .---. _______ + .'_ _ \ | | _/ / / __ \ \ .-.')| | |_ _| / __ \ + / ( ` ) '| (`' ) / | ,_/ \__)/ `-' \| | ( ' ) | ,_/ \__) + . (_ o _) ||(_ ()_) ,-./ ) `-'`"`| '-(_{;}_),-./ ) + | (_,_)___|| (_,_) __ \ '_ '`) .---. | (_,_) \ '_ '`) + ' \ .---.| |\ \ | | > (_) ) __ | | | _ _--. | > (_) ) __ + \ `-' /| | \ `' /( . .-'_/ )| | |( ' ) | | ( . .-'_/ ) + \ / | | \ / `-'`-' / | | (_{;}_)| | `-'`-' / + `'-..-' `--' `'-' `._____.' '---' '(_,_) '---' `._____.' + + ,---. .--. + | \ | | + | , \ | | + | |\_ \| | + | _( )_\ | + _ _ | (_ o _) | + ( ` ) | (_,_)\ | + (_{;}_)| | | | + (_,_) '--' '--' + + ,---. .--..-./`) + | \ | |\ .-.') + | , \ | |/ `-' \ + | |\_ \| | `-'`"` _ _ _ _ _ _ _ _ + | _( )_\ | .---. ( ' )--( ' ) ( ' )--( ' ) + | (_ o _) | | | (_{;}_)(_{;}_)(_{;}_)(_{;}_) + | (_,_)\ | | | (_,_)--(_,_) (_,_)--(_,_) + | | | | | | + '--' '--' '---' + + ,---. .--. ____ .-./`) _______ .-''-. ______ + | \ | | .' __ `. \ .-.')\ ____ \ .'_ _ \ | _ `''. + | , \ | |/ ' \ \/ `-' \| | \ | / ( ` ) '| _ | ) _ \ + | |\_ \| ||___| / | `-'`"`| |____/ / . (_ o _) ||( ''_' ) | + | _( )_\ | _.-` | .---. | _ _ '. | (_,_)___|| . (_) `. | + | (_ o _) |.' _ | | | | ( ' ) \' \ .---.|(_ ._) ' + | (_,_)\ || _( )_ | | | | (_{;}_) | \ `-' /| (_.\.' / + | | | |\ (_ o _) / | | | (_,_) / \ / | .' + '--' '--' '.(_,_).' '---' /_______.' `'-..-' '-----'` + + .---. .-''-. ,---. ,---. .-''-. ______ + | ,_| .'_ _ \ | / | | .'_ _ \ | _ `''. + ,-./ ) / ( ` ) '| | | .'/ ( ` ) '| _ | ) _ \ + \ '_ '`) . (_ o _) || | _ | |. (_ o _) ||( ''_' ) | _ _ _ _ + > (_) ) | (_,_)___|| _( )_ || (_,_)___|| . (_) `. | ( ' )--( ' ) + ( . .-' ' \ .---.\ (_ o._) /' \ .---.|(_ ._) '(_{;}_)(_{;}_) + `-'`-'|___\ `-' / \ (_,_) / \ `-' /| (_.\.' / (_,_)--(_,_) + | \\ / \ / \ / | .' + `--------` `'-..-' `---` `'-..-' '-----'` + diff --git a/externals/figlet/utf8.c b/externals/figlet/utf8.c new file mode 100644 index 0000000000..b8338c1ea8 --- /dev/null +++ b/externals/figlet/utf8.c @@ -0,0 +1,326 @@ +#ifdef TLF_FONTS +/* + * Copyright (c) 2007 Alexey Vatchenko + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +#include + +#include +#include /* for htonl() */ + +#include "utf8.h" + +#define _NXT 0x80 +#define _SEQ2 0xc0 +#define _SEQ3 0xe0 +#define _SEQ4 0xf0 +#define _SEQ5 0xf8 +#define _SEQ6 0xfc + +#define _BOM 0xfeff + +static int __wchar_forbitten(wchar_t sym); +static int __utf8_forbitten(u_char octet); + +static int +__wchar_forbitten(wchar_t sym) +{ + + /* Surrogate pairs */ + if (sym >= 0xd800 && sym <= 0xdfff) + return (-1); + + return (0); +} + +static int +__utf8_forbitten(u_char octet) +{ + + switch (octet) { + case 0xc0: + case 0xc1: + case 0xf5: + case 0xff: + return (-1); + } + + return (0); +} + +/* + * DESCRIPTION + * This function translates UTF-8 string into UCS-4 string (all symbols + * will be in local machine byte order). + * + * It takes the following arguments: + * in - input UTF-8 string. It can be null-terminated. + * insize - size of input string in bytes. + * out - result buffer for UCS-4 string. If out is NULL, + * function returns size of result buffer. + * outsize - size of out buffer in wide characters. + * + * RETURN VALUES + * The function returns size of result buffer (in wide characters). + * Zero is returned in case of error. + * + * CAVEATS + * 1. If UTF-8 string contains zero symbols, they will be translated + * as regular symbols. + * 2. If UTF8_IGNORE_ERROR or UTF8_SKIP_BOM flag is set, sizes may vary + * when `out' is NULL and not NULL. It's because of special UTF-8 + * sequences which may result in forbitten (by RFC3629) UNICODE + * characters. So, the caller must check return value every time and + * not prepare buffer in advance (\0 terminate) but after calling this + * function. + */ +size_t +utf8_to_wchar(const char *in, size_t insize, wchar_t *out, size_t outsize, + int flags) +{ + u_char *p, *lim; + wchar_t *wlim, high; + size_t n, total, i, n_bits; + + if (in == NULL || insize == 0 || (outsize == 0 && out != NULL)) + return (0); + + total = 0; + p = (u_char *)in; + lim = p + insize; + wlim = out + outsize; + + for (; p < lim; p += n) { + if (__utf8_forbitten(*p) != 0 && + (flags & UTF8_IGNORE_ERROR) == 0) + return (0); + + /* + * Get number of bytes for one wide character. + */ + n = 1; /* default: 1 byte. Used when skipping bytes. */ + if ((*p & 0x80) == 0) + high = (wchar_t)*p; + else if ((*p & 0xe0) == _SEQ2) { + n = 2; + high = (wchar_t)(*p & 0x1f); + } else if ((*p & 0xf0) == _SEQ3) { + n = 3; + high = (wchar_t)(*p & 0x0f); + } else if ((*p & 0xf8) == _SEQ4) { + n = 4; + high = (wchar_t)(*p & 0x07); + } else if ((*p & 0xfc) == _SEQ5) { + n = 5; + high = (wchar_t)(*p & 0x03); + } else if ((*p & 0xfe) == _SEQ6) { + n = 6; + high = (wchar_t)(*p & 0x01); + } else { + if ((flags & UTF8_IGNORE_ERROR) == 0) + return (0); + continue; + } + + /* does the sequence header tell us truth about length? */ + if (lim - p <= n - 1) { + if ((flags & UTF8_IGNORE_ERROR) == 0) + return (0); + n = 1; + continue; /* skip */ + } + + /* + * Validate sequence. + * All symbols must have higher bits set to 10xxxxxx + */ + if (n > 1) { + for (i = 1; i < n; i++) { + if ((p[i] & 0xc0) != _NXT) + break; + } + if (i != n) { + if ((flags & UTF8_IGNORE_ERROR) == 0) + return (0); + n = 1; + continue; /* skip */ + } + } + + total++; + + if (out == NULL) + continue; + + if (out >= wlim) + return (0); /* no space left */ + + *out = 0; + n_bits = 0; + for (i = 1; i < n; i++) { + *out |= (wchar_t)(p[n - i] & 0x3f) << n_bits; + n_bits += 6; /* 6 low bits in every byte */ + } + *out |= high << n_bits; + + if (*out == 0) /* return at end of string */ + break; + + if (__wchar_forbitten(*out) != 0) { + if ((flags & UTF8_IGNORE_ERROR) == 0) + return (0); /* forbitten character */ + else { + total--; + out--; + } + } else if (*out == _BOM && (flags & UTF8_SKIP_BOM) != 0) { + total--; + out--; + } + + out++; + } + + return (total); +} + +/* + * DESCRIPTION + * This function translates UCS-4 symbols (given in local machine + * byte order) into UTF-8 string. + * + * It takes the following arguments: + * in - input unicode string. It can be null-terminated. + * insize - size of input string in wide characters. + * out - result buffer for utf8 string. If out is NULL, + * function returns size of result buffer. + * outsize - size of result buffer. + * + * RETURN VALUES + * The function returns size of result buffer (in bytes). Zero is returned + * in case of error. + * + * CAVEATS + * If UCS-4 string contains zero symbols, they will be translated + * as regular symbols. + */ +size_t +wchar_to_utf8(const wchar_t *in, size_t insize, char *out, size_t outsize, + int flags) +{ + wchar_t *w, *wlim, ch; + u_char *p, *lim, *oc; + size_t total, n; + + if (in == NULL || insize == 0 || (outsize == 0 && out != NULL)) + return (0); + + w = (wchar_t *)in; + wlim = w + insize; + p = (u_char *)out; + lim = p + outsize; + total = 0; + for (; w < wlim; w++) { + if (__wchar_forbitten(*w) != 0) { + if ((flags & UTF8_IGNORE_ERROR) == 0) + return (0); + else + continue; + } + + if (*w == _BOM && (flags & UTF8_SKIP_BOM) != 0) + continue; + + if (*w < 0) { + if ((flags & UTF8_IGNORE_ERROR) == 0) + return (0); + continue; + } else if (*w <= 0x0000007f) + n = 1; + else if (*w <= 0x000007ff) + n = 2; + else if (*w <= 0x0000ffff) + n = 3; + else if (*w <= 0x001fffff) + n = 4; + else if (*w <= 0x03ffffff) + n = 5; + else /* if (*w <= 0x7fffffff) */ + n = 6; + + total += n; + + if (out == NULL) + continue; + + if (lim - p <= n - 1) + return (0); /* no space left */ + + /* make it work under different endians */ + ch = htonl(*w); + oc = (u_char *)&ch; + switch (n) { + case 1: + *p = oc[3]; + break; + + case 2: + p[1] = _NXT | (oc[3] & 0x3f); + p[0] = _SEQ2 | (oc[3] >> 6) | ((oc[2] & 0x07) << 2); + break; + + case 3: + p[2] = _NXT | (oc[3] & 0x3f); + p[1] = _NXT | (oc[3] >> 6) | ((oc[2] & 0x0f) << 2); + p[0] = _SEQ3 | ((oc[2] & 0xf0) >> 4); + break; + + case 4: + p[3] = _NXT | (oc[3] & 0x3f); + p[2] = _NXT | (oc[3] >> 6) | ((oc[2] & 0x0f) << 2); + p[1] = _NXT | ((oc[2] & 0xf0) >> 4) | + ((oc[1] & 0x03) << 4); + p[0] = _SEQ4 | ((oc[1] & 0x1f) >> 2); + break; + + case 5: + p[4] = _NXT | (oc[3] & 0x3f); + p[3] = _NXT | (oc[3] >> 6) | ((oc[2] & 0x0f) << 2); + p[2] = _NXT | ((oc[2] & 0xf0) >> 4) | + ((oc[1] & 0x03) << 4); + p[1] = _NXT | (oc[1] >> 2); + p[0] = _SEQ5 | (oc[0] & 0x03); + break; + + case 6: + p[5] = _NXT | (oc[3] & 0x3f); + p[4] = _NXT | (oc[3] >> 6) | ((oc[2] & 0x0f) << 2); + p[3] = _NXT | (oc[2] >> 4) | ((oc[1] & 0x03) << 4); + p[2] = _NXT | (oc[1] >> 2); + p[1] = _NXT | (oc[0] & 0x3f); + p[0] = _SEQ6 | ((oc[0] & 0x40) >> 6); + break; + } + + /* + * NOTE: do not check here for forbitten UTF-8 characters. + * They cannot appear here because we do proper convertion. + */ + + p += n; + } + + return (total); +} +#endif /* TLF_FONTS */ diff --git a/externals/figlet/utf8.h b/externals/figlet/utf8.h new file mode 100644 index 0000000000..a3e09bdee8 --- /dev/null +++ b/externals/figlet/utf8.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2007 Alexey Vatchenko + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * utf8: implementation of UTF-8 charset encoding (RFC3629). + */ +#ifndef _UTF8_H_ +#define _UTF8_H_ + +#include + +#include + +#define UTF8_IGNORE_ERROR 0x01 +#define UTF8_SKIP_BOM 0x02 + +#ifdef __cplusplus +extern "C" { +#endif + +size_t utf8_to_wchar(const char *in, size_t insize, wchar_t *out, + size_t outsize, int flags); +size_t wchar_to_utf8(const wchar_t *in, size_t insize, char *out, + size_t outsize, int flags); + +#ifdef __cplusplus +} +#endif + +#endif /* !_UTF8_H_ */ diff --git a/externals/figlet/zipio.c b/externals/figlet/zipio.c new file mode 100644 index 0000000000..f7406d952a --- /dev/null +++ b/externals/figlet/zipio.c @@ -0,0 +1,818 @@ +/* + * zipio.c - stdio emulation library for reading zip files + * + * Version 1.1.2 + */ + +/* + * Copyright (C) 1995, Edward B. Hamrick + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of the copyright holders + * not be used in advertising or publicity pertaining to distribution of + * the software without specific, written prior permission. The copyright + * holders makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, + * IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT + * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * Changes from 1.1 to 1.1.1: + * Changed "z*" functions to "Z*" to avoid namespace pollution. + * Added "zungetc" macro. + * Added definitions of SEEK_SET, SEEK_CUR, SEEK_END for the Posixly challenged + * John Cowan + * + * Changes from 1.1.1 to 1.1.2: + * Relicensed under the MIT license, with consent of the copyright holders. + * Avoid usage of unitialized "length" variable in _Zgetc + * Claudio Matsuoka (Jan 11 2011) + */ + +/* + * Refer to zipio.h for a description of this package. + */ + +/* + * The .zip file header is described below. It consists of + * 30 fixed bytes, followed by two variable length fields + * whose length is contained in the first 30 bytes. After this + * header, the data is stored (in deflate format if the compression + * method is 8). + * + * The crc-32 field is the crc on the uncompressed data. + * + * .zip file header: + * + * local file header signature 4 bytes (0x04034b50) + * version needed to extract 2 bytes + * general purpose bit flag 2 bytes + * compression method 2 bytes + * last mod file time 2 bytes + * last mod file date 2 bytes + * crc-32 4 bytes + * compressed size 4 bytes + * uncompressed size 4 bytes + * filename length 2 bytes + * extra field length 2 bytes + * + * filename (variable size) + * extra field (variable size) + * + * These fields are described in more detail in appnote.txt + * in the pkzip 1.93 distribution. + */ + +#include +#ifdef MEMCPY +#include +#endif + +#include "zipio.h" +#include "inflate.h" +#include "crc.h" + +/* + * Macros for constants + */ + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef ZIPSIGNATURE +#define ZIPSIGNATURE 0x04034b50L +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + + +/* + * Buffer size macros + * + * The following constants are optimized for large-model + * (but not flat model) Windows with virtual memory. It + * will work fine on unix and flat model Windows as well. + * + * The constant BUFFERTHRESHOLD determines when memory + * buffering changes to file buffering. + * + * Assumptions: + * + * 1) INPBUFSIZE + OUTBUFSIZE + sizeof(void *) * PTRBUFSIZE + delta < 64K + * + * 2) OUTBUFSIZE = 32K * N (related to inflate's 32K window size) + * + * 2) Max in-memory file size is OUTBUFSIZE * PTRBUFSIZE + * which is 64 MBytes by default (32K * 2K). + * + */ + +#ifndef BUFFERTHRESHOLD +#define BUFFERTHRESHOLD (256 * 1024L) +#endif + +#ifndef INPBUFSIZE +#define INPBUFSIZE ( 8 * 1024 ) +#endif + +#ifndef PTRBUFSIZE +#define PTRBUFSIZE ( 2 * 1024 ) +#endif + +#ifndef OUTBUFSIZE +#define OUTBUFSIZE ((unsigned int) ( 32 * 1024L)) +#endif + +#define MAXFILESIZE (OUTBUFSIZE * (long) PTRBUFSIZE) + +/* + * Macro for short-hand reference to ZipioState (from ZFILE *) + */ + +#define ZS ((struct ZipioState *) stream) + +/* + * Macro to manipulate Zgetc() cache + */ + +#define CACHEINIT \ + zs->ptr = NULL; \ + zs->len = 0; + +#define CACHEUPDATE \ + if (ZS->ptr) \ + { \ + ZS->fileposition &= ~((long) (OUTBUFSIZE-1)); \ + ZS->fileposition += ZS->ptr - ZS->getbuf; \ + ZS->ptr = NULL; \ + } \ + ZS->len = 0; + +/* + * Macros for run-time type identification + */ + +#ifndef RUNTIMEENABLE +#define RUNTIMEENABLE 0 +#endif + +#if RUNTIMEENABLE +#define ZIPIOSTATETYPE 0x0110f00fL +#define RUNTIMEINIT \ + zs->runtimetypeid1 = ZIPIOSTATETYPE; \ + zs->runtimetypeid2 = ZIPIOSTATETYPE; + +#define RUNTIMECHECK \ + if (!ZS || (ZS->runtimetypeid1 != ZIPIOSTATETYPE) \ + || (ZS->runtimetypeid2 != ZIPIOSTATETYPE)) return -1; +#else +#define RUNTIMEINIT +#define RUNTIMECHECK +#endif + +/* + * Macros for converting bytes to unsigned integers + */ + +#define GETUINT4(ptr, i4) \ + { \ + i4 = (((unsigned long) *(((unsigned char *) (ptr)) + 0)) ) | \ + (((unsigned long) *(((unsigned char *) (ptr)) + 1)) << 8) | \ + (((unsigned long) *(((unsigned char *) (ptr)) + 2)) << 16) | \ + (((unsigned long) *(((unsigned char *) (ptr)) + 3)) << 24) ; \ + } + +#define GETUINT2(ptr, i2) \ + { \ + i2 = (((unsigned int) *(((unsigned char *) (ptr)) + 0)) ) | \ + (((unsigned int) *(((unsigned char *) (ptr)) + 1)) << 8) ; \ + } + +/* Structure to hold state for decoding zip files */ +struct ZipioState { + + /* Fields overlaid with ZFILE structure */ + int len; /* length of Zgetc cache */ + unsigned char *ptr; /* pointer to Zgetc cache */ + + /* Fields invisible to users of ZFILE structure */ + + unsigned long runtimetypeid1; /* to detect run-time errors */ + int errorencountered; /* error encountered flag */ + + /* Buffering state */ + unsigned char inpbuf[INPBUFSIZE]; /* inp buffer from zip file */ + unsigned char *ptrbuf[PTRBUFSIZE]; /* pointers to in-memory bufs */ + + unsigned char getbuf[OUTBUFSIZE]; /* buffer for use by Zgetc */ + long getoff; /* starting offset of getbuf */ + + FILE *tmpfil; /* file ptr to temp file */ + + /* Amount of input data inflated */ + unsigned long inpinf; + unsigned long outinf; + + /* Zip file header */ + unsigned long sign; /* local file header signature (0x04034b50) */ + unsigned int vers; /* version needed to extract 2 bytes */ + unsigned int flag; /* general purpose bit flag 2 bytes */ + unsigned int comp; /* compression method 2 bytes */ + unsigned int mtim; /* last mod file time 2 bytes */ + unsigned int mdat; /* last mod file date 2 bytes */ + unsigned long crc3; /* crc-32 4 bytes */ + unsigned long csiz; /* compressed size 4 bytes */ + unsigned long usiz; /* uncompressed size 4 bytes */ + unsigned int flen; /* filename length 2 bytes */ + unsigned int elen; /* extra field length 2 bytes */ + + /* Application state */ + FILE *OpenFile; /* currently open file */ + + void *inflatestate; /* current state for inflate */ + + unsigned long fileposition; /* current file position */ + + unsigned long filecrc; /* current crc */ + + unsigned long runtimetypeid2; /* to detect run-time errors */ +}; + +/* + * Utility routines to handle uncompressed file buffers + */ + +/* Initialize buffering */ +static void BufferInitialize( + struct ZipioState *zs, + int doinflate +) +{ + zs->getoff = -1; + zs->tmpfil = NULL; + + /* + * If not inflating, use the input file + */ + + if (!doinflate) + { + zs->tmpfil = zs->OpenFile; + + /* Get the uncompressed file size */ + fseek(zs->tmpfil, 0, SEEK_END); + zs->usiz = ftell(zs->tmpfil); + zs->outinf = zs->usiz; + + /* Start at the beginning */ + fseek(zs->tmpfil, 0, SEEK_SET); + } + + /* If there's no file open, see if it's big enough for temp file */ + if (!zs->tmpfil) + { + if (zs->usiz >= BUFFERTHRESHOLD) + zs->tmpfil = tmpfile(); + } + + /* If there's no file open, then use memory buffering */ + if (!zs->tmpfil) + { + int i; + + for (i=0; iptrbuf[i] = NULL; + } +} + +/* pump data till length bytes of file are inflated or error encountered */ +static int BufferPump(struct ZipioState *zs, long length) +{ + size_t inplen, ret; + + /* Check to see if the length is valid */ + if (length > zs->usiz) return TRUE; + + /* Loop till enough data is pumped */ + while (!zs->errorencountered && (zs->outinf < length)) + { + /* Compute how much data to read */ + if ((zs->csiz - zs->inpinf) < INPBUFSIZE) + inplen = (size_t) (zs->csiz - zs->inpinf); + else + inplen = INPBUFSIZE; + + if (inplen <= 0) return TRUE; + + /* Read some data from the file */ + ret = fread(zs->inpbuf, 1, inplen, zs->OpenFile); + if (ret != inplen) return TRUE; + + /* Update how much data has been read from the file */ + zs->inpinf += inplen; + + /* Pump this data into the decompressor */ + if (InflatePutBuffer(zs->inflatestate, zs->inpbuf, inplen)) return TRUE; + } + + return FALSE; +} + +/* Read from the buffer */ +static int BufferRead( + struct ZipioState *zs, + long offset, + unsigned char *buffer, + long length +) +{ + /* + * Make sure enough bytes have been inflated + * Note that the correction for reading past EOF has to + * be done before calling this routine + */ + + if (BufferPump(zs, offset+length)) return TRUE; + + /* If using file buffering, just get the data from the file */ + if (zs->tmpfil) + { + if (fseek(zs->tmpfil, offset, SEEK_SET)) return TRUE; + if (fread(buffer, 1, (size_t) length, zs->tmpfil) != length) return TRUE; + } + /* If no temp file, use memory buffering */ + else + { + unsigned int i; + unsigned int off, len; + unsigned char *ptr; + + long tmpoff; + unsigned char *tmpbuf; + long tmplen; + + /* Save copies of offset, buffer and length for the loop */ + tmpoff = offset; + tmpbuf = buffer; + tmplen = length; + + /* Validate the transfer */ + if (tmpoff+tmplen > MAXFILESIZE) return TRUE; + + /* Loop till done */ + while (tmplen) + { + /* Get a pointer to the next block */ + i = (unsigned int) (tmpoff / OUTBUFSIZE); + ptr = zs->ptrbuf[i]; + if (!ptr) return TRUE; + + /* Get the offset,length for this block */ + off = (unsigned int) (tmpoff & (OUTBUFSIZE-1)); + len = OUTBUFSIZE - off; + if (len > tmplen) len = (unsigned int) tmplen; + + /* Get the starting pointer for the transfer */ + ptr += off; + + /* Copy the data for this block */ +#ifdef MEMCPY + memcpy(tmpbuf, ptr, len); +#else + for (i=0; itmpfil) + { + if (fseek(zs->tmpfil, zs->outinf, SEEK_SET)) return TRUE; + if (fwrite(buffer, 1, (size_t) length, zs->tmpfil) != length) return TRUE; + } + /* If no temp file, use memory buffering */ + else + { + unsigned int i; + unsigned int off, len; + unsigned char *ptr; + + long tmpoff; + unsigned char *tmpbuf; + long tmplen; + + /* Save copies of outinf, buffer and length for the loop */ + tmpoff = zs->outinf; + tmpbuf = buffer; + tmplen = length; + + /* Validate the transfer */ + if (tmpoff+tmplen > MAXFILESIZE) return TRUE; + + /* Loop till done */ + while (tmplen) + { + /* Get a pointer to the next block */ + i = (unsigned int) (tmpoff / OUTBUFSIZE); + ptr = zs->ptrbuf[i]; + if (!ptr) + { + ptr = (unsigned char *) malloc(OUTBUFSIZE); + if (!ptr) return TRUE; + zs->ptrbuf[i] = ptr; + } + + /* Get the offset,length for this block */ + off = (unsigned int) (tmpoff & (OUTBUFSIZE-1)); + len = OUTBUFSIZE - off; + if (len > tmplen) len = (unsigned int) tmplen; + + /* Get the starting pointer for the transfer */ + ptr += off; + + /* Copy the data for this block */ +#ifdef MEMCPY + memcpy(ptr, tmpbuf, len); +#else + for (i=0; ioutinf += length; + + /* return success */ + return FALSE; +} + +/* Terminate buffering */ +static void BufferTerminate( + struct ZipioState *zs +) +{ + /* If reading directly from the uncompressed file, just mark with NULL */ + if (zs->tmpfil == zs->OpenFile) + { + zs->tmpfil = NULL; + } + /* If using the a temporary file, close it */ + else if (zs->tmpfil) + { + fclose(zs->tmpfil); + zs->tmpfil = NULL; + } + /* If doing memory buffering, free the buffers */ + else + { + int i; + + for (i=0; iptrbuf[i]) free(zs->ptrbuf[i]); + } +} + +/* + * callout routines for InflateInitialize + */ + +static int inflate_putbuffer( /* returns 0 on success */ + void *stream, /* opaque ptr from Initialize */ + unsigned char *buffer, /* buffer to put */ + long length /* length of buffer */ +) +{ + RUNTIMECHECK; + + /* If the write will go past the end of file, return an error */ + if (ZS->outinf + length > ZS->usiz) return TRUE; + + /* Update the CRC */ + ZS->filecrc = CrcUpdate(ZS->filecrc, buffer, length); + + /* Append to the buffer */ + if (BufferAppend(ZS, buffer, length)) return TRUE; + + /* Return success */ + return FALSE; +} + +static void *inflate_malloc(long length) +{ + return malloc((size_t) length); +} + +static void inflate_free(void *buffer) +{ + free(buffer); +} + +ZFILE *Zopen(const char *path, const char *mode) +{ + struct ZipioState *zs; + + long inplen; + + /* Allocate the ZipioState memory area */ + zs = (struct ZipioState *) malloc(sizeof(struct ZipioState)); + if (!zs) return NULL; + + /* Set up the initial values of the inflate state */ + + CACHEINIT; + + RUNTIMEINIT; + + zs->errorencountered = FALSE; + + zs->inpinf = 0; + zs->outinf = 0; + + zs->fileposition = 0; + + zs->filecrc = 0xffffffffL; + + /* Open the real file */ + zs->OpenFile = fopen(path, mode); + if (!zs->OpenFile) + { + free(zs); + return NULL; + } + + /* Read the first input buffer */ + if ((inplen = (long) fread(zs->inpbuf, 1, INPBUFSIZE, zs->OpenFile)) >= 30) + { + GETUINT4(zs->inpbuf+ 0, zs->sign); + GETUINT2(zs->inpbuf+ 4, zs->vers); + GETUINT2(zs->inpbuf+ 6, zs->flag); + GETUINT2(zs->inpbuf+ 8, zs->comp); + GETUINT2(zs->inpbuf+10, zs->mtim); + GETUINT2(zs->inpbuf+12, zs->mdat); + GETUINT4(zs->inpbuf+14, zs->crc3); + GETUINT4(zs->inpbuf+18, zs->csiz); + GETUINT4(zs->inpbuf+22, zs->usiz); + GETUINT2(zs->inpbuf+26, zs->flen); + GETUINT2(zs->inpbuf+28, zs->elen); + +#ifdef PRINTZIPHEADER + fprintf(stderr, "local file header signature hex %8lx\n", zs->sign); + fprintf(stderr, "version needed to extract %8d\n" , zs->vers); + fprintf(stderr, "general purpose bit flag hex %8x\n" , zs->flag); + fprintf(stderr, "compression method %8d\n" , zs->comp); + fprintf(stderr, "last mod file time %8d\n" , zs->mtim); + fprintf(stderr, "last mod file date %8d\n" , zs->mdat); + fprintf(stderr, "crc-32 hex %8lx\n", zs->crc3); + fprintf(stderr, "compressed size %8ld\n", zs->csiz); + fprintf(stderr, "uncompressed size %8ld\n", zs->usiz); + fprintf(stderr, "filename length %8d\n" , zs->flen); + fprintf(stderr, "extra field length %8d\n" , zs->elen); +#endif + } + else + { + zs->sign = 0; + } + + /* + * If the file isn't a zip file, set up to read it normally + */ + if ((zs->sign != ZIPSIGNATURE) || + (zs->flag & 1) || + (zs->comp != 8) || + (inplen <= 30 + zs->flen + zs->elen) ) + { + /* Initialize buffering */ + BufferInitialize(zs, FALSE); + + zs->inflatestate = NULL; + } + else + { + /* Initialize buffering */ + BufferInitialize(zs, TRUE); + + zs->inflatestate = InflateInitialize( + (void *) zs, + inflate_putbuffer, + inflate_malloc, + inflate_free + ); + + if (InflatePutBuffer(zs->inflatestate, + zs->inpbuf+30+zs->flen+zs->elen, + inplen-30-zs->flen-zs->elen + ) + ) + zs->errorencountered = TRUE; + + zs->inpinf += inplen-30-zs->flen-zs->elen; + } + + /* Return this state info to the caller */ + return (ZFILE *) zs; +} + +int _Zgetc(ZFILE *stream) +{ + long offset, length; + + int off; + + RUNTIMECHECK; + + if (ZS->errorencountered) return -1; + + CACHEUPDATE; + + /* If already at EOF, return */ + if (ZS->fileposition >= ZS->usiz) return -1; + + /* If data isn't in current outbuf, get it */ + offset = ZS->fileposition & ~((long) (OUTBUFSIZE-1)); + length = ZS->usiz - offset; + if (length > OUTBUFSIZE) length = OUTBUFSIZE; + + if (ZS->getoff != offset) + { + if (BufferRead(ZS, offset, ZS->getbuf, length)) return -1; + + ZS->getoff = offset; + } + + /* Set up the cache */ + off = (int) (ZS->fileposition & (OUTBUFSIZE-1)); + ZS->len = (int) (length - off); + ZS->ptr = ZS->getbuf + off; + + /* Return the character */ + ZS->len--; + return *(ZS->ptr++); +} + +size_t Zread(void *ptr, size_t size, size_t n, ZFILE *stream) +{ + long length; + + RUNTIMECHECK; + + if (ZS->errorencountered) return 0; + + CACHEUPDATE; + + /* Compute the length requested */ + length = size * (long) n; + + /* Adjust the length to account for premature EOF */ + if (ZS->fileposition+length > ZS->usiz) + length = ZS->usiz - ZS->fileposition; + + /* If the length is zero, then just return an EOF error */ + if (length <= 0) return 0; + + /* Make the length a multiple of size */ + length /= size; + length *= size; + + /* If the length is zero, then just return an EOF error */ + if (length <= 0) return 0; + + /* Read from the buffer */ + if (BufferRead(ZS, ZS->fileposition, (unsigned char *) ptr, length)) + return 0; + + /* Update the file position */ + ZS->fileposition += length; + + /* Return the number of items transferred */ + return (size_t) (length / size); +} + +int Zseek(ZFILE *stream, long offset, int whence) +{ + long newoffset; + + RUNTIMECHECK; + + if (ZS->errorencountered) return -1; + + CACHEUPDATE; + + if (whence == SEEK_SET) + { + newoffset = offset; + } + else if (whence == SEEK_CUR) + { + newoffset = ZS->fileposition + offset; + } + else if (whence == SEEK_END) + { + newoffset = ZS->fileposition + ZS->usiz; + } + else + { + return -1; + } + + if ((newoffset < 0) || (newoffset > ZS->usiz)) return -1; + + ZS->fileposition = newoffset; + + return 0; +} + +long Ztell(ZFILE *stream) +{ + RUNTIMECHECK; + + if (ZS->errorencountered) return -1; + + CACHEUPDATE; + + return ZS->fileposition; +} + +int Zclose(ZFILE *stream) +{ + int ret; + + RUNTIMECHECK; + + CACHEUPDATE; + + /* terminate the inflate routines, and check for errors */ + if (ZS->inflatestate) + { + if (InflateTerminate(ZS->inflatestate)) + ZS->errorencountered = TRUE; + + /* Check that the CRC is OK */ + if (ZS->filecrc != (ZS->crc3 ^ 0xffffffffL)) + ZS->errorencountered = TRUE; + } + + /* save the final error status */ + ret = ZS->errorencountered; + + /* terminate the buffering */ + BufferTerminate(ZS); + + /* free the ZipioState structure */ + free(ZS); + + /* return the final error status */ + return ret; +} diff --git a/externals/figlet/zipio.h b/externals/figlet/zipio.h new file mode 100644 index 0000000000..12289d6581 --- /dev/null +++ b/externals/figlet/zipio.h @@ -0,0 +1,104 @@ +/* + * zipio.h - stdio emulation library for reading zip files + * + * Version 1.1.2 + */ + +/* + * Copyright (C) 1995, Edward B. Hamrick + * + * Permission to use, copy, modify, and distribute this software and + * its documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of the copyright holders + * not be used in advertising or publicity pertaining to distribution of + * the software without specific, written prior permission. The copyright + * holders makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, + * IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT + * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * Changes from 1.1 to 1.1.1: + * Changed "z*" functions to "Z*" to avoid namespace pollution. + * Added "zungetc" macro. + * John Cowan + * + * Changes from 1.1.1 to 1.1.2: + * Relicensed under the MIT license, with consent of the copyright holders. + * Claudio Matsuoka (Jan 11 2011) + */ + +/* + * This library of routines has the same calling sequence as + * the stdio.h routines for reading files. If these routines + * detect that they are reading from a zip file, they transparently + * unzip the file and make the application think they're reading + * from the uncompressed file. + * + * Note that this library is designed to work for zip files that + * use the deflate compression method, and to read the first file + * within the zip archive. + * + * There are a number of tunable parameters in the reference + * implementation relating to in-memory decompression and the + * use of temporary files. + * + * Particular care was taken to make the Zgetc() macro work + * as efficiently as possible. When reading an uncompressed + * file with Zgetc(), it has exactly the same performance as + * when using getc(). WHen reading a compressed file with + * Zgetc(), it has the same performance as fread(). The total + * CPU overhead for decompression is about 50 cycles per byte. + * + * The Zungetc() macro is quite limited. It ignores the character + * specified for pushback, and essentially just forces the last + * character read to be re-read. This is essential when parsing + * numbers and such. (1.1.1) + * + * There are a few stdio routines that aren't represented here, but + * they can be layered on top of these routines if needed. + */ + +#ifndef __ZIPIO_H +#define __ZIPIO_H + +#include + +typedef struct { + int len; + unsigned char *ptr; +} ZFILE; + +#define Zgetc(f) \ + ((--((f)->len) >= 0) \ + ? (unsigned char)(*(f)->ptr++) \ + : _Zgetc (f)) + +#define Zungetc(c,f) \ + ((f)->ptr--, (f)->len++, (c)) + +#ifdef __cplusplus +extern "C" { +#endif + +ZFILE *Zopen(const char *path, const char *mode); +int _Zgetc(ZFILE *stream); +size_t Zread(void *ptr, size_t size, size_t n, ZFILE *stream); +int Zseek(ZFILE *stream, long offset, int whence); +long Ztell(ZFILE *stream); +int Zclose(ZFILE *stream); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/externals/httpful/.gitignore b/externals/httpful/.gitignore deleted file mode 100644 index d1584ef4bc..0000000000 --- a/externals/httpful/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.DS_Store -composer.lock -vendor -downloads diff --git a/externals/httpful/.travis.yml b/externals/httpful/.travis.yml deleted file mode 100644 index ba03761e94..0000000000 --- a/externals/httpful/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: php -before_script: cd tests -php: - - 5.3 - - 5.4 \ No newline at end of file diff --git a/externals/httpful/LICENSE.txt b/externals/httpful/LICENSE.txt deleted file mode 100644 index 908927064f..0000000000 --- a/externals/httpful/LICENSE.txt +++ /dev/null @@ -1,7 +0,0 @@ -Copyright (c) 2012 Nate Good - -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. \ No newline at end of file diff --git a/externals/httpful/README.md b/externals/httpful/README.md deleted file mode 100644 index 4b43e3d765..0000000000 --- a/externals/httpful/README.md +++ /dev/null @@ -1,137 +0,0 @@ -# Httpful - -[![Build Status](https://secure.travis-ci.org/nategood/httpful.png?branch=master)](http://travis-ci.org/nategood/httpful) - -[Httpful](http://phphttpclient.com) is a simple Http Client library for PHP 5.3+. There is an emphasis of readability, simplicity, and flexibility – basically provide the features and flexibility to get the job done and make those features really easy to use. - -Features - - - Readable HTTP Method Support (GET, PUT, POST, DELETE, HEAD, PATCH and OPTIONS) - - Custom Headers - - Automatic "Smart" Parsing - - Automatic Payload Serialization - - Basic Auth - - Client Side Certificate Auth - - Request "Templates" - -# Sneak Peak - -Here's something to whet your appetite. Search the twitter API for tweets containing "#PHP". Include a trivial header for the heck of it. Notice that the library automatically interprets the response as JSON (can override this if desired) and parses it as an array of objects. - - $url = "http://search.twitter.com/search.json?q=" . urlencode('#PHP'); - $response = Request::get($url) - ->withXTrivialHeader('Just as a demo') - ->send(); - - foreach ($response->body->results as $tweet) { - echo "@{$tweet->from_user} tweets \"{$tweet->text}\"\n"; - } - -# Installation - -## Phar - -A [PHP Archive](http://php.net/manual/en/book.phar.php) (or .phar) file is available for [downloading](https://github.com/nategood/httpful/downloads). Simply [download](https://github.com/nategood/httpful/downloads) the .phar, drop it into your project, and include it like you would any other php file. _This method is ideal smaller projects, one off scripts, and quick API hacking_. - - sendIt(); - ... - -## Composer - -Httpful is PSR-0 compliant and can be installed using [composer](http://getcomposer.org/). Simply add `nategood/httpful` to your composer.json file. _Composer is the sane alternative to PEAR. It is excellent for managing dependancies in larger projects_. - - { - "require": { - "nategood/httpful": "*" - } - } - -## Install from Source - -Because Httpful is PSR-0 compliant, you can also just clone the Httpful repository and use a PSR-0 compatible autoloader to load the library, like [Symfony's](http://symfony.com/doc/current/components/class_loader.html). Alternatively you can use the PSR-0 compliant autoloader included with the Httpful (simply `require("bootstrap.php")`). - -# Show Me More! - -You can checkout the [Httpful Landing Page](http://phphttpclient.com) for more info including many examples and [documentation](http:://phphttpclient.com/docs). - -# Contributing - -Httpful highly encourages sending in pull requests. When submitting a pull request please: - - - All pull requests should target the `dev` branch (not `master`) - - Make sure your code follows the [coding conventions](http://pear.php.net/manual/en/standards.php) - - Please use soft tabs (four spaces) instead of hard tabs - - Make sure you add appropriate test coverage for your changes - - Run all unit tests in the test directory via `phpunit ./tests` - - Include commenting where appropriate and add a descriptive pull request message - -# Changelog - -## 0.2.3 - - - FIX Overriding default Mime Handlers - - FIX [PR #73](https://github.com/nategood/httpful/pull/73) Parsing http status codes - -## 0.2.2 - - - FEATURE Add support for parsing JSON responses as associative arrays instead of objects - - FEATURE Better support for setting constructor arguments on Mime Handlers - -## 0.2.1 - - - FEATURE [PR #72](https://github.com/nategood/httpful/pull/72) Allow support for custom Accept header - -## 0.2.0 - - - REFACTOR [PR #49](https://github.com/nategood/httpful/pull/49) Broke headers out into their own class - - REFACTOR [PR #54](https://github.com/nategood/httpful/pull/54) Added more specific Exceptions - - FIX [PR #58](https://github.com/nategood/httpful/pull/58) Fixes throwing an error on an empty xml response - - FEATURE [PR #57](https://github.com/nategood/httpful/pull/57) Adds support for digest authentication - -## 0.1.6 - - - Ability to set the number of max redirects via overloading `followRedirects(int max_redirects)` - - Standards Compliant fix to `Accepts` header - - Bug fix for bootstrap process when installed via Composer - -## 0.1.5 - - - Use `DIRECTORY_SEPARATOR` constant [PR #33](https://github.com/nategood/httpful/pull/32) - - [PR #35](https://github.com/nategood/httpful/pull/35) - - Added the raw\_headers property reference to response. - - Compose request header and added raw\_header to Request object. - - Fixed response has errors and added more comments for clarity. - - Fixed header parsing to allow the minimum (status line only) and also cater for the actual CRLF ended headers as per RFC2616. - - Added the perfect test Accept: header for all Acceptable scenarios see @b78e9e82cd9614fbe137c01bde9439c4e16ca323 for details. - - Added default User-Agent header - - `User-Agent: Httpful/0.1.5` + curl version + server software + PHP version - - To bypass this "default" operation simply add a User-Agent to the request headers even a blank User-Agent is sufficient and more than simple enough to produce me thinks. - - Completed test units for additions. - - Added phpunit coverage reporting and helped phpunit auto locate the tests a bit easier. - -## 0.1.4 - - - Add support for CSV Handling [PR #32](https://github.com/nategood/httpful/pull/32) - -## 0.1.3 - - - Handle empty responses in JsonParser and XmlParser - -## 0.1.2 - - - Added support for setting XMLHandler configuration options - - Added examples for overriding XmlHandler and registering a custom parser - - Removed the httpful.php download (deprecated in favor of httpful.phar) - -## 0.1.1 - - - Bug fix serialization default case and phpunit tests - -## 0.1.0 - - - Added Support for Registering Mime Handlers - - Created AbstractMimeHandler type that all Mime Handlers must extend - - Pulled out the parsing/serializing logic from the Request/Response classes into their own MimeHandler classes - - Added ability to register new mime handlers for mime types diff --git a/externals/httpful/bootstrap.php b/externals/httpful/bootstrap.php deleted file mode 100644 index 10f2a7cfb6..0000000000 --- a/externals/httpful/bootstrap.php +++ /dev/null @@ -1,4 +0,0 @@ -setStub($stub); -} catch(Exception $e) { - $phar = false; -} -exit_unless($phar, "Unable to create a phar. Make certain you have phar.readonly=0 set in your ini file."); -$phar->buildFromDirectory(dirname($source_dir)); -echo "[ OK ]\n"; - - - -// Add it to git! -echo "Adding httpful.phar to the repo... "; -$return_code = 0; -passthru("git add $phar_path", $return_code); -exit_unless($return_code === 0, "Unable to add download files to git."); -echo "[ OK ]\n"; -echo "\nBuild completed sucessfully.\n\n"; diff --git a/externals/httpful/composer.json b/externals/httpful/composer.json deleted file mode 100644 index bb02d48eaa..0000000000 --- a/externals/httpful/composer.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "nategood/httpful", - "description": "A Readable, Chainable, REST friendly, PHP HTTP Client", - "homepage": "http://github.com/nategood/httpful", - "license": "MIT", - "keywords": ["http", "curl", "rest", "restful", "api", "requests"], - "version": "0.2.3", - "authors": [ - { - "name": "Nate Good", - "email": "me@nategood.com", - "homepage": "http://nategood.com/" - } - ], - "require": { - "php": ">=5.3", - "ext-curl": "*" - }, - "autoload": { - "psr-0": { - "Httpful": "src/" - } - } -} diff --git a/externals/httpful/examples/freebase.php b/externals/httpful/examples/freebase.php deleted file mode 100644 index bb3b528fc1..0000000000 --- a/externals/httpful/examples/freebase.php +++ /dev/null @@ -1,12 +0,0 @@ -expectsJson() - ->sendIt(); - -echo 'The Dead Weather has ' . count($response->body->result->album) . " albums.\n"; \ No newline at end of file diff --git a/externals/httpful/examples/github.php b/externals/httpful/examples/github.php deleted file mode 100644 index 8eb3f3ba73..0000000000 --- a/externals/httpful/examples/github.php +++ /dev/null @@ -1,9 +0,0 @@ -send(); - -echo "{$request->body->name} joined GitHub on " . date('M jS', strtotime($request->body->{'created-at'})) ."\n"; \ No newline at end of file diff --git a/externals/httpful/examples/override.php b/externals/httpful/examples/override.php deleted file mode 100644 index 2c3bdd5c9e..0000000000 --- a/externals/httpful/examples/override.php +++ /dev/null @@ -1,44 +0,0 @@ - 'http://example.com/'); -\Httpful\Httpful::register(\Httpful\Mime::XML, new \Httpful\Handlers\XmlHandler($conf)); - -// We can also add the parsers with our own... -class SimpleCsvHandler extends \Httpful\Handlers\MimeHandlerAdapter -{ - /** - * Takes a response body, and turns it into - * a two dimensional array. - * - * @param string $body - * @return mixed - */ - public function parse($body) - { - return str_getcsv($body); - } - - /** - * Takes a two dimensional array and turns it - * into a serialized string to include as the - * body of a request - * - * @param mixed $payload - * @return string - */ - public function serialize($payload) - { - $serialized = ''; - foreach ($payload as $line) { - $serialized .= '"' . implode('","', $line) . '"' . "\n"; - } - return $serialized; - } -} - -\Httpful\Httpful::register('text/csv', new SimpleCsvHandler()); \ No newline at end of file diff --git a/externals/httpful/examples/showclix.php b/externals/httpful/examples/showclix.php deleted file mode 100644 index 9c50bf5ff6..0000000000 --- a/externals/httpful/examples/showclix.php +++ /dev/null @@ -1,24 +0,0 @@ -expectsType('json') - ->sendIt(); - -// Print out the event details -echo "The event {$response->body->event} will take place on {$response->body->event_start}\n"; - -// Example overriding the default JSON handler with one that encodes the response as an array -\Httpful\Httpful::register(\Httpful\Mime::JSON, new \Httpful\Handlers\JsonHandler(array('decode_as_array' => true))); - -$response = Request::get($uri) - ->expectsType('json') - ->sendIt(); - -// Print out the event details -echo "The event {$response->body['event']} will take place on {$response->body['event_start']}\n"; \ No newline at end of file diff --git a/externals/httpful/examples/twitter.php b/externals/httpful/examples/twitter.php deleted file mode 100644 index fa491ef77c..0000000000 --- a/externals/httpful/examples/twitter.php +++ /dev/null @@ -1,13 +0,0 @@ -send(); - -if (!$response->hasErrors()) { - foreach ($response->body->results as $tweet) { - echo "@{$tweet->from_user} tweets \"{$tweet->text}\"\n"; - } -} else { - echo "Uh oh. Twitter gave us the old {$response->code} status.\n"; -} diff --git a/externals/httpful/src/Httpful/Bootstrap.php b/externals/httpful/src/Httpful/Bootstrap.php deleted file mode 100644 index 3bf62ae683..0000000000 --- a/externals/httpful/src/Httpful/Bootstrap.php +++ /dev/null @@ -1,97 +0,0 @@ - - */ -class Bootstrap -{ - - const DIR_GLUE = DIRECTORY_SEPARATOR; - const NS_GLUE = '\\'; - - public static $registered = false; - - /** - * Register the autoloader and any other setup needed - */ - public static function init() - { - spl_autoload_register(array('\Httpful\Bootstrap', 'autoload')); - self::registerHandlers(); - } - - /** - * The autoload magic (PSR-0 style) - * - * @param string $classname - */ - public static function autoload($classname) - { - self::_autoload(dirname(dirname(__FILE__)), $classname); - } - - /** - * Register the autoloader and any other setup needed - */ - public static function pharInit() - { - spl_autoload_register(array('\Httpful\Bootstrap', 'pharAutoload')); - self::registerHandlers(); - } - - /** - * Phar specific autoloader - * - * @param string $classname - */ - public static function pharAutoload($classname) - { - self::_autoload('phar://httpful.phar', $classname); - } - - /** - * @param string base - * @param string classname - */ - private static function _autoload($base, $classname) - { - $parts = explode(self::NS_GLUE, $classname); - $path = $base . self::DIR_GLUE . implode(self::DIR_GLUE, $parts) . '.php'; - - if (file_exists($path)) { - require_once($path); - } - } - /** - * Register default mime handlers. Is idempotent. - */ - public static function registerHandlers() - { - if (self::$registered === true) { - return; - } - - // @todo check a conf file to load from that instead of - // hardcoding into the library? - $handlers = array( - \Httpful\Mime::JSON => new \Httpful\Handlers\JsonHandler(), - \Httpful\Mime::XML => new \Httpful\Handlers\XmlHandler(), - \Httpful\Mime::FORM => new \Httpful\Handlers\FormHandler(), - \Httpful\Mime::CSV => new \Httpful\Handlers\CsvHandler(), - ); - - foreach ($handlers as $mime => $handler) { - // Don't overwrite if the handler has already been registered - if (Httpful::hasParserRegistered($mime)) - continue; - Httpful::register($mime, $handler); - } - - self::$registered = true; - } -} diff --git a/externals/httpful/src/Httpful/Exception/ConnectionErrorException.php b/externals/httpful/src/Httpful/Exception/ConnectionErrorException.php deleted file mode 100644 index bba73a6939..0000000000 --- a/externals/httpful/src/Httpful/Exception/ConnectionErrorException.php +++ /dev/null @@ -1,7 +0,0 @@ - - */ - -namespace Httpful\Handlers; - -class CsvHandler extends MimeHandlerAdapter -{ - /** - * @param string $body - * @return mixed - */ - public function parse($body) - { - if (empty($body)) - return null; - - $parsed = array(); - $fp = fopen('data://text/plain;base64,' . base64_encode($body), 'r'); - while (($r = fgetcsv($fp)) !== FALSE) { - $parsed[] = $r; - } - - if (empty($parsed)) - throw new \Exception("Unable to parse response as CSV"); - return $parsed; - } - - /** - * @param mixed $payload - * @return string - */ - public function serialize($payload) - { - $fp = fopen('php://temp/maxmemory:'. (6*1024*1024), 'r+'); - $i = 0; - foreach ($payload as $fields) { - if($i++ == 0) { - fputcsv($fp, array_keys($fields)); - } - fputcsv($fp, $fields); - } - rewind($fp); - $data = stream_get_contents($fp); - fclose($fp); - return $data; - } -} diff --git a/externals/httpful/src/Httpful/Handlers/FormHandler.php b/externals/httpful/src/Httpful/Handlers/FormHandler.php deleted file mode 100644 index fea1c37ced..0000000000 --- a/externals/httpful/src/Httpful/Handlers/FormHandler.php +++ /dev/null @@ -1,30 +0,0 @@ - - */ - -namespace Httpful\Handlers; - -class FormHandler extends MimeHandlerAdapter -{ - /** - * @param string $body - * @return mixed - */ - public function parse($body) - { - $parsed = array(); - parse_str($body, $parsed); - return $parsed; - } - - /** - * @param mixed $payload - * @return string - */ - public function serialize($payload) - { - return http_build_query($payload, null, '&'); - } -} \ No newline at end of file diff --git a/externals/httpful/src/Httpful/Handlers/JsonHandler.php b/externals/httpful/src/Httpful/Handlers/JsonHandler.php deleted file mode 100644 index 6520d933fe..0000000000 --- a/externals/httpful/src/Httpful/Handlers/JsonHandler.php +++ /dev/null @@ -1,40 +0,0 @@ - - */ - -namespace Httpful\Handlers; - -class JsonHandler extends MimeHandlerAdapter -{ - private $decode_as_array = false; - - public function init(array $args) - { - $this->decode_as_array = !!(array_key_exists('decode_as_array', $args) ? $args['decode_as_array'] : false); - } - - /** - * @param string $body - * @return mixed - */ - public function parse($body) - { - if (empty($body)) - return null; - $parsed = json_decode($body, $this->decode_as_array); - if (is_null($parsed)) - throw new \Exception("Unable to parse response as JSON"); - return $parsed; - } - - /** - * @param mixed $payload - * @return string - */ - public function serialize($payload) - { - return json_encode($payload); - } -} \ No newline at end of file diff --git a/externals/httpful/src/Httpful/Handlers/MimeHandlerAdapter.php b/externals/httpful/src/Httpful/Handlers/MimeHandlerAdapter.php deleted file mode 100644 index dd15c04cba..0000000000 --- a/externals/httpful/src/Httpful/Handlers/MimeHandlerAdapter.php +++ /dev/null @@ -1,43 +0,0 @@ -init($args); - } - - /** - * Initial setup of - * @param array $args - */ - public function init(array $args) - { - } - - /** - * @param string $body - * @return mixed - */ - public function parse($body) - { - return $body; - } - - /** - * @param mixed $payload - * @return string - */ - function serialize($payload) - { - return (string) $payload; - } -} \ No newline at end of file diff --git a/externals/httpful/src/Httpful/Handlers/README.md b/externals/httpful/src/Httpful/Handlers/README.md deleted file mode 100644 index 5542d406b2..0000000000 --- a/externals/httpful/src/Httpful/Handlers/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Handlers - -Handlers are simple classes that are used to parse response bodies and serialize request payloads. All Handlers must extend the `MimeHandlerAdapter` class and implement two methods: `serialize($payload)` and `parse($response)`. Let's build a very basic Handler to register for the `text/csv` mime type. - - - */ - -namespace Httpful\Handlers; - -class XHtmlHandler extends MimeHandlerAdapter -{ - // @todo add html specific parsing - // see DomDocument::load http://docs.php.net/manual/en/domdocument.loadhtml.php -} \ No newline at end of file diff --git a/externals/httpful/src/Httpful/Handlers/XmlHandler.php b/externals/httpful/src/Httpful/Handlers/XmlHandler.php deleted file mode 100644 index 4b11659bfd..0000000000 --- a/externals/httpful/src/Httpful/Handlers/XmlHandler.php +++ /dev/null @@ -1,120 +0,0 @@ - - * @author Nathan Good - */ - -namespace Httpful\Handlers; - -class XmlHandler extends MimeHandlerAdapter -{ - /** - * @var string $namespace xml namespace to use with simple_load_string - */ - private $namespace; - - /** - * @var int $libxml_opts see http://www.php.net/manual/en/libxml.constants.php - */ - private $libxml_opts; - - /** - * @param array $conf sets configuration options - */ - public function __construct(array $conf = array()) - { - $this->namespace = isset($conf['namespace']) ? $conf['namespace'] : ''; - $this->libxml_opts = isset($conf['libxml_opts']) ? $conf['libxml_opts'] : 0; - } - - /** - * @param string $body - * @return mixed - * @throws Exception if unable to parse - */ - public function parse($body) - { - if (empty($body)) - return null; - $parsed = simplexml_load_string($body, null, $this->libxml_opts, $this->namespace); - if ($parsed === false) - throw new \Exception("Unable to parse response as XML"); - return $parsed; - } - - /** - * @param mixed $payload - * @return string - * @throws Exception if unable to serialize - */ - public function serialize($payload) - { - list($_, $dom) = $this->_future_serializeAsXml($payload); - return $dom->saveXml(); - } - - /** - * @author Zack Douglas - */ - private function _future_serializeAsXml($value, $node = null, $dom = null) - { - if (!$dom) { - $dom = new \DOMDocument; - } - if (!$node) { - if (!is_object($value)) { - $node = $dom->createElement('response'); - $dom->appendChild($node); - } else { - $node = $dom; - } - } - if (is_object($value)) { - $objNode = $dom->createElement(get_class($value)); - $node->appendChild($objNode); - $this->_future_serializeObjectAsXml($value, $objNode, $dom); - } else if (is_array($value)) { - $arrNode = $dom->createElement('array'); - $node->appendChild($arrNode); - $this->_future_serializeArrayAsXml($value, $arrNode, $dom); - } else if (is_bool($value)) { - $node->appendChild($dom->createTextNode($value?'TRUE':'FALSE')); - } else { - $node->appendChild($dom->createTextNode($value)); - } - return array($node, $dom); - } - /** - * @author Zack Douglas - */ - private function _future_serializeArrayAsXml($value, &$parent, &$dom) - { - foreach ($value as $k => &$v) { - $n = $k; - if (is_numeric($k)) { - $n = "child-{$n}"; - } - $el = $dom->createElement($n); - $parent->appendChild($el); - $this->_future_serializeAsXml($v, $el, $dom); - } - return array($parent, $dom); - } - /** - * @author Zack Douglas - */ - private function _future_serializeObjectAsXml($value, &$parent, &$dom) - { - $refl = new \ReflectionObject($value); - foreach ($refl->getProperties() as $pr) { - if (!$pr->isPrivate()) { - $el = $dom->createElement($pr->getName()); - $parent->appendChild($el); - $this->_future_serializeAsXml($pr->getValue($value), $el, $dom); - } - } - return array($parent, $dom); - } -} \ No newline at end of file diff --git a/externals/httpful/src/Httpful/Http.php b/externals/httpful/src/Httpful/Http.php deleted file mode 100644 index 59374e9346..0000000000 --- a/externals/httpful/src/Httpful/Http.php +++ /dev/null @@ -1,86 +0,0 @@ - - */ -class Http -{ - const HEAD = 'HEAD'; - const GET = 'GET'; - const POST = 'POST'; - const PUT = 'PUT'; - const DELETE = 'DELETE'; - const PATCH = 'PATCH'; - const OPTIONS = 'OPTIONS'; - const TRACE = 'TRACE'; - - /** - * @return array of HTTP method strings - */ - public static function safeMethods() - { - return array(self::HEAD, self::GET, self::OPTIONS, self::TRACE); - } - - /** - * @return bool - * @param string HTTP method - */ - public static function isSafeMethod($method) - { - return in_array($method, self::safeMethods()); - } - - /** - * @return bool - * @param string HTTP method - */ - public static function isUnsafeMethod($method) - { - return !in_array($method, self::safeMethods()); - } - - /** - * @return array list of (always) idempotent HTTP methods - */ - public static function idempotentMethods() - { - // Though it is possible to be idempotent, POST - // is not guarunteed to be, and more often than - // not, it is not. - return array(self::HEAD, self::GET, self::PUT, self::DELETE, self::OPTIONS, self::TRACE, self::PATCH); - } - - /** - * @return bool - * @param string HTTP method - */ - public static function isIdempotent($method) - { - return in_array($method, self::safeidempotentMethodsMethods()); - } - - /** - * @return bool - * @param string HTTP method - */ - public static function isNotIdempotent($method) - { - return !in_array($method, self::idempotentMethods()); - } - - /** - * @deprecated Technically anything *can* have a body, - * they just don't have semantic meaning. So say's Roy - * http://tech.groups.yahoo.com/group/rest-discuss/message/9962 - * - * @return array of HTTP method strings - */ - public static function canHaveBody() - { - return array(self::POST, self::PUT, self::PATCH, self::OPTIONS); - } - -} \ No newline at end of file diff --git a/externals/httpful/src/Httpful/Httpful.php b/externals/httpful/src/Httpful/Httpful.php deleted file mode 100644 index 65d9d66754..0000000000 --- a/externals/httpful/src/Httpful/Httpful.php +++ /dev/null @@ -1,46 +0,0 @@ - - */ -class Mime -{ - const JSON = 'application/json'; - const XML = 'application/xml'; - const XHTML = 'application/html+xml'; - const FORM = 'application/x-www-form-urlencoded'; - const PLAIN = 'text/plain'; - const JS = 'text/javascript'; - const HTML = 'text/html'; - const YAML = 'application/x-yaml'; - const CSV = 'text/csv'; - - /** - * Map short name for a mime type - * to a full proper mime type - */ - public static $mimes = array( - 'json' => self::JSON, - 'xml' => self::XML, - 'form' => self::FORM, - 'plain' => self::PLAIN, - 'text' => self::PLAIN, - 'html' => self::HTML, - 'xhtml' => self::XHTML, - 'js' => self::JS, - 'javascript'=> self::JS, - 'yaml' => self::YAML, - 'csv' => self::CSV, - ); - - /** - * Get the full Mime Type name from a "short name". - * Returns the short if no mapping was found. - * @return string full mime type (e.g. application/json) - * @param string common name for mime type (e.g. json) - */ - public static function getFullMime($short_name) - { - return array_key_exists($short_name, self::$mimes) ? self::$mimes[$short_name] : $short_name; - } - - /** - * @return bool - * @param string $short_name - */ - public static function supportsMimeType($short_name) - { - return array_key_exists($short_name, self::$mimes); - } -} diff --git a/externals/httpful/src/Httpful/Request.php b/externals/httpful/src/Httpful/Request.php deleted file mode 100644 index 444c57b6b2..0000000000 --- a/externals/httpful/src/Httpful/Request.php +++ /dev/null @@ -1,984 +0,0 @@ - - */ -class Request -{ - - // Option constants - const SERIALIZE_PAYLOAD_NEVER = 0; - const SERIALIZE_PAYLOAD_ALWAYS = 1; - const SERIALIZE_PAYLOAD_SMART = 2; - - const MAX_REDIRECTS_DEFAULT = 25; - - public $uri, - $method = Http::GET, - $headers = array(), - $raw_headers = '', - $strict_ssl = false, - $content_type, - $expected_type, - $additional_curl_opts = array(), - $auto_parse = true, - $serialize_payload_method = self::SERIALIZE_PAYLOAD_SMART, - $username, - $password, - $serialized_payload, - $payload, - $parse_callback, - $error_callback, - $follow_redirects = false, - $max_redirects = self::MAX_REDIRECTS_DEFAULT, - $payload_serializers = array(); - - // Options - // private $_options = array( - // 'serialize_payload_method' => self::SERIALIZE_PAYLOAD_SMART - // 'auto_parse' => true - // ); - - // Curl Handle - public $_ch, - $_debug; - - // Template Request object - private static $_template; - - /** - * We made the constructor private to force the factory style. This was - * done to keep the syntax cleaner and better the support the idea of - * "default templates". Very basic and flexible as it is only intended - * for internal use. - * @param array $attrs hash of initial attribute values - */ - private function __construct($attrs = null) - { - if (!is_array($attrs)) return; - foreach ($attrs as $attr => $value) { - $this->$attr = $value; - } - } - - // Defaults Management - - /** - * Let's you configure default settings for this - * class from a template Request object. Simply construct a - * Request object as much as you want to and then pass it to - * this method. It will then lock in those settings from - * that template object. - * The most common of which may be default mime - * settings or strict ssl settings. - * Again some slight memory overhead incurred here but in the grand - * scheme of things as it typically only occurs once - * @param Request $template - */ - public static function ini(Request $template) - { - self::$_template = clone $template; - } - - /** - * Reset the default template back to the - * library defaults. - */ - public static function resetIni() - { - self::_initializeDefaults(); - } - - /** - * Get default for a value based on the template object - * @return mixed default value - * @param string|null $attr Name of attribute (e.g. mime, headers) - * if null just return the whole template object; - */ - public static function d($attr) - { - return isset($attr) ? self::$_template->$attr : self::$_template; - } - - // Accessors - - /** - * @return bool does the request have a timeout? - */ - public function hasTimeout() - { - return isset($this->timeout); - } - - /** - * @return bool has the internal curl request been initialized? - */ - public function hasBeenInitialized() - { - return isset($this->_ch); - } - - /** - * @return bool Is this request setup for basic auth? - */ - public function hasBasicAuth() - { - return isset($this->password) && isset($this->username); - } - - /** - * @return bool Is this request setup for digest auth? - */ - public function hasDigestAuth() - { - return isset($this->password) && isset($this->username) && $this->additional_curl_opts['CURLOPT_HTTPAUTH'] = CURLAUTH_DIGEST; - } - - /** - * Specify a HTTP timeout - * @return Request $this - * @param |int $timeout seconds to timeout the HTTP call - */ - public function timeout($timeout) - { - $this->timeout = $timeout; - return $this; - } - - /** - * If the response is a 301 or 302 redirect, automatically - * send off another request to that location - * @return Request $this - * @param bool|int $follow follow or not to follow or maximal number of redirects - */ - public function followRedirects($follow = true) - { - $this->max_redirects = $follow === true ? self::MAX_REDIRECTS_DEFAULT : max(0, $follow); - $this->follow_redirects = (bool) $follow; - return $this; - } - - /** - * @return Request $this - * @see Request::followRedirects() - */ - public function doNotFollowRedirects() - { - return $this->followRedirects(false); - } - - /** - * Actually send off the request, and parse the response - * @return string|associative array of parsed results - * @throws ConnectionErrorException when unable to parse or communicate w server - */ - public function send() - { - if (!$this->hasBeenInitialized()) - $this->_curlPrep(); - - $result = curl_exec($this->_ch); - - if ($result === false) { - $this->_error(curl_error($this->_ch)); - throw new ConnectionErrorException('Unable to connect.'); - } - - $info = curl_getinfo($this->_ch); - $response = explode("\r\n\r\n", $result, 2 + $info['redirect_count']); - - $body = array_pop($response); - $headers = array_pop($response); - - return new Response($body, $headers, $this); - } - public function sendIt() - { - return $this->send(); - } - - // Setters - - /** - * @return Request this - * @param string $uri - */ - public function uri($uri) - { - $this->uri = $uri; - return $this; - } - - /** - * User Basic Auth. - * Only use when over SSL/TSL/HTTPS. - * @return Request this - * @param string $username - * @param string $password - */ - public function basicAuth($username, $password) - { - $this->username = $username; - $this->password = $password; - return $this; - } - // @alias of basicAuth - public function authenticateWith($username, $password) - { - return $this->basicAuth($username, $password); - } - // @alias of basicAuth - public function authenticateWithBasic($username, $password) - { - return $this->basicAuth($username, $password); - } - - /** - * User Digest Auth. - * @return Request this - * @param string $username - * @param string $password - */ - public function digestAuth($username, $password) - { - $this->addOnCurlOption(CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); - return $this->basicAuth($username, $password); - } - - // @alias of digestAuth - public function authenticateWithDigest($username, $password) - { - return $this->digestAuth($username, $password); - } - - /** - * @return is this request setup for client side cert? - */ - public function hasClientSideCert() { - return isset($this->client_cert) && isset($this->client_key); - } - - /** - * Use Client Side Cert Authentication - * @return Response $this - * @param string $key file path to client key - * @param string $cert file path to client cert - * @param string $passphrase for client key - * @param string $encoding default PEM - */ - public function clientSideCert($cert, $key, $passphrase = null, $encoding = 'PEM') - { - $this->client_cert = $cert; - $this->client_key = $key; - $this->client_passphrase = $passphrase; - $this->client_encoding = $encoding; - - return $this; - } - // @alias of basicAuth - public function authenticateWithCert($cert, $key, $passphrase = null, $encoding = 'PEM') - { - return $this->clientSideCert($cert, $key, $passphrase, $encoding); - } - - /** - * Set the body of the request - * @return Request this - * @param mixed $payload - * @param string $mimeType - */ - public function body($payload, $mimeType = null) - { - $this->mime($mimeType); - $this->payload = $payload; - // Iserntentially don't call _serializePayload yet. Wait until - // we actually send off the request to convert payload to string. - // At that time, the `serialized_payload` is set accordingly. - return $this; - } - - /** - * Helper function to set the Content type and Expected as same in - * one swoop - * @return Request this - * @param string $mime mime type to use for content type and expected return type - */ - public function mime($mime) - { - if (empty($mime)) return $this; - $this->content_type = $this->expected_type = Mime::getFullMime($mime); - return $this; - } - // @alias of mime - public function sendsAndExpectsType($mime) - { - return $this->mime($mime); - } - // @alias of mime - public function sendsAndExpects($mime) - { - return $this->mime($mime); - } - - /** - * Set the method. Shouldn't be called often as the preferred syntax - * for instantiation is the method specific factory methods. - * @return Request this - * @param string $method - */ - public function method($method) - { - if (empty($method)) return $this; - $this->method = $method; - return $this; - } - - /** - * @return Request this - * @param string $mime - */ - public function expects($mime) - { - if (empty($mime)) return $this; - $this->expected_type = Mime::getFullMime($mime); - return $this; - } - // @alias of expects - public function expectsType($mime) - { - return $this->expects($mime); - } - - /** - * @return Request this - * @param string $mime - */ - public function contentType($mime) - { - if (empty($mime)) return $this; - $this->content_type = Mime::getFullMime($mime); - return $this; - } - // @alias of contentType - public function sends($mime) - { - return $this->contentType($mime); - } - // @alias of contentType - public function sendsType($mime) - { - return $this->contentType($mime); - } - - /** - * Do we strictly enforce SSL verification? - * @return Request this - * @param bool $strict - */ - public function strictSSL($strict) - { - $this->strict_ssl = $strict; - return $this; - } - public function withoutStrictSSL() - { - return $this->strictSSL(false); - } - public function withStrictSSL() - { - return $this->strictSSL(true); - } - - /** - * Determine how/if we use the built in serialization by - * setting the serialize_payload_method - * The default (SERIALIZE_PAYLOAD_SMART) is... - * - if payload is not a scalar (object/array) - * use the appropriate serialize method according to - * the Content-Type of this request. - * - if the payload IS a scalar (int, float, string, bool) - * than just return it as is. - * When this option is set SERIALIZE_PAYLOAD_ALWAYS, - * it will always use the appropriate - * serialize option regardless of whether payload is scalar or not - * When this option is set SERIALIZE_PAYLOAD_NEVER, - * it will never use any of the serialization methods. - * Really the only use for this is if you want the serialize methods - * to handle strings or not (e.g. Blah is not valid JSON, but "Blah" - * is). Forcing the serialization helps prevent that kind of error from - * happening. - * @return Request $this - * @param int $mode - */ - public function serializePayload($mode) - { - $this->serialize_payload_method = $mode; - return $this; - } - - /** - * @see Request::serializePayload() - * @return Request - */ - public function neverSerializePayload() - { - return $this->serializePayload(self::SERIALIZE_PAYLOAD_NEVER); - } - - /** - * This method is the default behavior - * @see Request::serializePayload() - * @return Request - */ - public function smartSerializePayload() - { - return $this->serializePayload(self::SERIALIZE_PAYLOAD_SMART); - } - - /** - * @see Request::serializePayload() - * @return Request - */ - public function alwaysSerializePayload() - { - return $this->serializePayload(self::SERIALIZE_PAYLOAD_ALWAYS); - } - - /** - * Add an additional header to the request - * Can also use the cleaner syntax of - * $Request->withMyHeaderName($my_value); - * @see Request::__call() - * - * @return Request this - * @param string $header_name - * @param string $value - */ - public function addHeader($header_name, $value) - { - $this->headers[$header_name] = $value; - return $this; - } - - /** - * Add group of headers all at once. Note: This is - * here just as a convenience in very specific cases. - * The preferred "readable" way would be to leverage - * the support for custom header methods. - * @return Response $this - * @param array $headers - */ - public function addHeaders(array $headers) - { - foreach ($headers as $header => $value) { - $this->addHeader($header, $value); - } - return $this; - } - - /** - * @return Request - * @param bool $auto_parse perform automatic "smart" - * parsing based on Content-Type or "expectedType" - * If not auto parsing, Response->body returns the body - * as a string. - */ - public function autoParse($auto_parse = true) - { - $this->auto_parse = $auto_parse; - return $this; - } - - /** - * @see Request::autoParse() - * @return Request - */ - public function withoutAutoParsing() - { - return $this->autoParse(false); - } - - /** - * @see Request::autoParse() - * @return Request - */ - public function withAutoParsing() - { - return $this->autoParse(true); - } - - /** - * Use a custom function to parse the response. - * @return Request this - * @param \Closure $callback Takes the raw body of - * the http response and returns a mixed - */ - public function parseWith(\Closure $callback) - { - $this->parse_callback = $callback; - return $this; - } - - /** - * @see Request::parseResponsesWith() - * @return Request $this - * @param \Closure $callback - */ - public function parseResponsesWith(\Closure $callback) - { - return $this->parseWith($callback); - } - - /** - * Register a callback that will be used to serialize the payload - * for a particular mime type. When using "*" for the mime - * type, it will use that parser for all responses regardless of the mime - * type. If a custom '*' and 'application/json' exist, the custom - * 'application/json' would take precedence over the '*' callback. - * - * @return Request $this - * @param string $mime mime type we're registering - * @param Closure $callback takes one argument, $payload, - * which is the payload that we'll be - */ - public function registerPayloadSerializer($mime, \Closure $callback) - { - $this->payload_serializers[Mime::getFullMime($mime)] = $callback; - return $this; - } - - /** - * @see Request::registerPayloadSerializer() - * @return Request $this - * @param Closure $callback - */ - public function serializePayloadWith(\Closure $callback) - { - return $this->regregisterPayloadSerializer('*', $callback); - } - - /** - * Magic method allows for neatly setting other headers in a - * similar syntax as the other setters. This method also allows - * for the sends* syntax. - * @return Request this - * @param string $method "missing" method name called - * the method name called should be the name of the header that you - * are trying to set in camel case without dashes e.g. to set a - * header for Content-Type you would use contentType() or more commonly - * to add a custom header like X-My-Header, you would use xMyHeader(). - * To promote readability, you can optionally prefix these methods with - * "with" (e.g. withXMyHeader("blah") instead of xMyHeader("blah")). - * @param array $args in this case, there should only ever be 1 argument provided - * and that argument should be a string value of the header we're setting - */ - public function __call($method, $args) - { - // This method supports the sends* methods - // like sendsJSON, sendsForm - //!method_exists($this, $method) && - if (substr($method, 0, 5) === 'sends') { - $mime = strtolower(substr($method, 5)); - if (Mime::supportsMimeType($mime)) { - $this->sends(Mime::getFullMime($mime)); - return $this; - } - // else { - // throw new \Exception("Unsupported Content-Type $mime"); - // } - } - if (substr($method, 0, 7) === 'expects') { - $mime = strtolower(substr($method, 7)); - if (Mime::supportsMimeType($mime)) { - $this->expects(Mime::getFullMime($mime)); - return $this; - } - // else { - // throw new \Exception("Unsupported Content-Type $mime"); - // } - } - - // This method also adds the custom header support as described in the - // method comments - if (count($args) === 0) - return; - - // Strip the sugar. If it leads with "with", strip. - // This is okay because: No defined HTTP headers begin with with, - // and if you are defining a custom header, the standard is to prefix it - // with an "X-", so that should take care of any collisions. - if (substr($method, 0, 4) === 'with') - $method = substr($method, 4); - - // Precede upper case letters with dashes, uppercase the first letter of method - $header = ucwords(implode('-', preg_split('/([A-Z][^A-Z]*)/', $method, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY))); - $this->addHeader($header, $args[0]); - return $this; - } - - // Internal Functions - - /** - * This is the default template to use if no - * template has been provided. The template - * tells the class which default values to use. - * While there is a slight overhead for object - * creation once per execution (not once per - * Request instantiation), it promotes readability - * and flexibility within the class. - */ - private static function _initializeDefaults() - { - // This is the only place you will - // see this constructor syntax. It - // is only done here to prevent infinite - // recusion. Do not use this syntax elsewhere. - // It goes against the whole readability - // and transparency idea. - self::$_template = new Request(array('method' => Http::GET)); - - // This is more like it... - self::$_template - ->withoutStrictSSL(); - } - - /** - * Set the defaults on a newly instantiated object - * Doesn't copy variables prefixed with _ - * @return Request this - */ - private function _setDefaults() - { - if (!isset(self::$_template)) - self::_initializeDefaults(); - foreach (self::$_template as $k=>$v) { - if ($k[0] != '_') - $this->$k = $v; - } - return $this; - } - - private function _error($error) - { - // Default actions write to error log - // TODO add in support for various Loggers - error_log($error); - } - - /** - * Factory style constructor works nicer for chaining. This - * should also really only be used internally. The Request::get, - * Request::post syntax is preferred as it is more readable. - * @return Request - * @param string $method Http Method - * @param string $mime Mime Type to Use - */ - public static function init($method = null, $mime = null) - { - // Setup our handlers, can call it here as it's idempotent - Bootstrap::init(); - - // Setup the default template if need be - if (!isset(self::$_template)) - self::_initializeDefaults(); - - $request = new Request(); - return $request - ->_setDefaults() - ->method($method) - ->sendsType($mime) - ->expectsType($mime); - } - - /** - * Does the heavy lifting. Uses de facto HTTP - * library cURL to set up the HTTP request. - * Note: It does NOT actually send the request - * @return Request $this; - */ - public function _curlPrep() - { - // Check for required stuff - if (!isset($this->uri)) - throw new \Exception('Attempting to send a request before defining a URI endpoint.'); - - $ch = curl_init($this->uri); - - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->method); - - if ($this->hasBasicAuth()) { - curl_setopt($ch, CURLOPT_USERPWD, $this->username . ':' . $this->password); - } - - if ($this->hasClientSideCert()) { - - if (!file_exists($this->client_key)) - throw new \Exception('Could not read Client Key'); - - if (!file_exists($this->client_cert)) - throw new \Exception('Could not read Client Certificate'); - - curl_setopt($ch, CURLOPT_SSLCERTTYPE, $this->client_encoding); - curl_setopt($ch, CURLOPT_SSLKEYTYPE, $this->client_encoding); - curl_setopt($ch, CURLOPT_SSLCERT, $this->client_cert); - curl_setopt($ch, CURLOPT_SSLKEY, $this->client_key); - curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $this->client_passphrase); - // curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $this->client_cert_passphrase); - } - - if ($this->hasTimeout()) { - curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout); - } - - if ($this->follow_redirects) { - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch, CURLOPT_MAXREDIRS, $this->max_redirects); - } - - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $this->strict_ssl); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - - $headers = array(); - // https://github.com/nategood/httpful/issues/37 - // Except header removes any HTTP 1.1 Continue from response headers - $headers[] = 'Expect:'; - - if (!isset($this->headers['User-Agent'])) { - $headers[] = $this->buildUserAgent(); - } - - $headers[] = "Content-Type: {$this->content_type}"; - - // allow custom Accept header if set - if (!isset($this->headers['Accept'])) { - // http://pretty-rfc.herokuapp.com/RFC2616#header.accept - $accept = 'Accept: */*; q=0.5, text/plain; q=0.8, text/html;level=3;'; - - if (!empty($this->expected_type)) { - $accept .= "q=0.9, {$this->expected_type}"; - } - - $headers[] = $accept; - } - - foreach ($this->headers as $header => $value) { - $headers[] = "$header: $value"; - } - - $url = \parse_url(http://github.com/$this-%3Euri); - $path = (isset($url['path']) ? $url['path'] : '/').(isset($url['query']) ? '?'.$url['query'] : ''); - $this->raw_headers = "{$this->method} $path HTTP/1.1\r\n"; - $host = (isset($url['host']) ? $url['host'] : 'localhost').(isset($url['port']) ? ':'.$url['port'] : ''); - $this->raw_headers .= "Host: $host\r\n"; - $this->raw_headers .= \implode("\r\n", $headers); - $this->raw_headers .= "\r\n"; - - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - - if (isset($this->payload)) { - $this->serialized_payload = $this->_serializePayload($this->payload); - curl_setopt($ch, CURLOPT_POSTFIELDS, $this->serialized_payload); - } - - if ($this->_debug) { - curl_setopt($ch, CURLOPT_VERBOSE, true); - } - - curl_setopt($ch, CURLOPT_HEADER, 1); - - // If there are some additional curl opts that the user wants - // to set, we can tack them in here - foreach ($this->additional_curl_opts as $curlopt => $curlval) { - curl_setopt($ch, $curlopt, $curlval); - } - - $this->_ch = $ch; - - return $this; - } - - public function buildUserAgent() { - $user_agent = 'User-Agent: Httpful/' . Httpful::VERSION . ' (cURL/'; - $curl = \curl_version(); - - if (isset($curl['version'])) { - $user_agent .= $curl['version']; - } else { - $user_agent .= '?.?.?'; - } - - $user_agent .= ' PHP/'. PHP_VERSION . ' (' . PHP_OS . ')'; - - if (isset($_SERVER['SERVER_SOFTWARE'])) { - $user_agent .= ' ' . \preg_replace('~PHP/[\d\.]+~U', '', - $_SERVER['SERVER_SOFTWARE']); - } else { - if (isset($_SERVER['TERM_PROGRAM'])) { - $user_agent .= " {$_SERVER['TERM_PROGRAM']}"; - } - - if (isset($_SERVER['TERM_PROGRAM_VERSION'])) { - $user_agent .= "/{$_SERVER['TERM_PROGRAM_VERSION']}"; - } - } - - if (isset($_SERVER['HTTP_USER_AGENT'])) { - $user_agent .= " {$_SERVER['HTTP_USER_AGENT']}"; - } - - $user_agent .= ')'; - - return $user_agent; - } - - /** - * Semi-reluctantly added this as a way to add in curl opts - * that are not otherwise accessible from the rest of the API. - * @return Request $this - * @param string $curlopt - * @param mixed $curloptval - */ - public function addOnCurlOption($curlopt, $curloptval) - { - $this->additional_curl_opts[$curlopt] = $curloptval; - return $this; - } - - /** - * Turn payload from structured data into - * a string based on the current Mime type. - * This uses the auto_serialize option to determine - * it's course of action. See serialize method for more. - * Renamed from _detectPayload to _serializePayload as of - * 2012-02-15. - * - * Added in support for custom payload serializers. - * The serialize_payload_method stuff still holds true though. - * @see Request::registerPayloadSerializer() - * - * @return string - * @param mixed $payload - */ - private function _serializePayload($payload) - { - if (empty($payload) || $this->serialize_payload_method === self::SERIALIZE_PAYLOAD_NEVER) - return $payload; - - // When we are in "smart" mode, don't serialize strings/scalars, assume they are already serialized - if ($this->serialize_payload_method === self::SERIALIZE_PAYLOAD_SMART && is_scalar($payload)) - return $payload; - - // Use a custom serializer if one is registered for this mime type - if (isset($this->payload_serializers['*']) || isset($this->payload_serializers[$this->content_type])) { - $key = isset($this->payload_serializers[$this->content_type]) ? $this->content_type : '*'; - return call_user_func($this->payload_serializers[$key], $payload); - } - - return Httpful::get($this->content_type)->serialize($payload); - } - - /** - * HTTP Method Get - * @return Request - * @param string $uri optional uri to use - * @param string $mime expected - */ - public static function get($uri, $mime = null) - { - return self::init(Http::GET)->uri($uri)->mime($mime); - } - - - /** - * Like Request:::get, except that it sends off the request as well - * returning a response - * @return Response - * @param string $uri optional uri to use - * @param string $mime expected - */ - public static function getQuick($uri, $mime = null) - { - return self::get($uri, $mime)->send(); - } - - /** - * HTTP Method Post - * @return Request - * @param string $uri optional uri to use - * @param string $payload data to send in body of request - * @param string $mime MIME to use for Content-Type - */ - public static function post($uri, $payload = null, $mime = null) - { - return self::init(Http::POST)->uri($uri)->body($payload, $mime); - } - - /** - * HTTP Method Put - * @return Request - * @param string $uri optional uri to use - * @param string $payload data to send in body of request - * @param string $mime MIME to use for Content-Type - */ - public static function put($uri, $payload = null, $mime = null) - { - return self::init(Http::PUT)->uri($uri)->body($payload, $mime); - } - - /** - * HTTP Method Patch - * @return Request - * @param string $uri optional uri to use - * @param string $payload data to send in body of request - * @param string $mime MIME to use for Content-Type - */ - public static function patch($uri, $payload = null, $mime = null) - { - return self::init(Http::PATCH)->uri($uri)->body($payload, $mime); - } - - /** - * HTTP Method Delete - * @return Request - * @param string $uri optional uri to use - */ - public static function delete($uri, $mime = null) - { - return self::init(Http::DELETE)->uri($uri)->mime($mime); - } - - /** - * HTTP Method Head - * @return Request - * @param string $uri optional uri to use - */ - public static function head($uri) - { - return self::init(Http::HEAD)->uri($uri); - } - - /** - * HTTP Method Options - * @return Request - * @param string $uri optional uri to use - */ - public static function options($uri) - { - return self::init(Http::OPTIONS)->uri($uri); - } -} diff --git a/externals/httpful/src/Httpful/Response.php b/externals/httpful/src/Httpful/Response.php deleted file mode 100644 index c5199d3e95..0000000000 --- a/externals/httpful/src/Httpful/Response.php +++ /dev/null @@ -1,189 +0,0 @@ - - */ -class Response -{ - - public $body, - $raw_body, - $headers, - $raw_headers, - $request, - $code = 0, - $content_type, - $parent_type, - $charset, - $is_mime_vendor_specific = false, - $is_mime_personal = false; - - private $parsers; - /** - * @param string $body - * @param string $headers - * @param Request $request - */ - public function __construct($body, $headers, Request $request) - { - $this->request = $request; - $this->raw_headers = $headers; - $this->raw_body = $body; - - $this->code = $this->_parseCode($headers); - $this->headers = Response\Headers::fromString($headers); - - $this->_interpretHeaders(); - - $this->body = $this->_parse($body); - } - - /** - * Status Code Definitions - * - * Informational 1xx - * Successful 2xx - * Redirection 3xx - * Client Error 4xx - * Server Error 5xx - * - * http://pretty-rfc.herokuapp.com/RFC2616#status.codes - * - * @return bool Did we receive a 4xx or 5xx? - */ - public function hasErrors() - { - return $this->code >= 400; - } - - /** - * @return return bool - */ - public function hasBody() - { - return !empty($this->body); - } - - /** - * Parse the response into a clean data structure - * (most often an associative array) based on the expected - * Mime type. - * @return array|string|object the response parse accordingly - * @param string Http response body - */ - public function _parse($body) - { - // If the user decided to forgo the automatic - // smart parsing, short circuit. - if (!$this->request->auto_parse) { - return $body; - } - - // If provided, use custom parsing callback - if (isset($this->request->parse_callback)) { - return call_user_func($this->request->parse_callback, $body); - } - - // Decide how to parse the body of the response in the following order - // 1. If provided, use the mime type specifically set as part of the `Request` - // 2. If a MimeHandler is registered for the content type, use it - // 3. If provided, use the "parent type" of the mime type from the response - // 4. Default to the content-type provided in the response - $parse_with = $this->request->expected_type; - if (empty($this->request->expected_type)) { - $parse_with = Httpful::hasParserRegistered($this->content_type) - ? $this->content_type - : $this->parent_type; - } - - return Httpful::get($parse_with)->parse($body); - } - - /** - * Parse text headers from response into - * array of key value pairs - * @return array parse headers - * @param string $headers raw headers - */ - public function _parseHeaders($headers) - { - $headers = preg_split("/(\r|\n)+/", $headers, -1, \PREG_SPLIT_NO_EMPTY); - $parse_headers = array(); - for ($i = 1; $i < count($headers); $i++) { - list($key, $raw_value) = explode(':', $headers[$i], 2); - $key = trim($key); - $value = trim($raw_value); - if (array_key_exists($key, $parse_headers)) { - // See HTTP RFC Sec 4.2 Paragraph 5 - // http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 - // If a header appears more than once, it must also be able to - // be represented as a single header with a comma-separated - // list of values. We transform accordingly. - $parse_headers[$key] .= ',' . $value; - } else { - $parse_headers[$key] = $value; - } - } - return $parse_headers; - } - - public function _parseCode($headers) - { - $parts = explode(' ', substr($headers, 0, strpos($headers, "\r\n"))); - if (count($parts) < 2 || !is_numeric($parts[1])) { - throw new \Exception("Unable to parse response code from HTTP response due to malformed response"); - } - return intval($parts[1]); - } - - /** - * After we've parse the headers, let's clean things - * up a bit and treat some headers specially - */ - public function _interpretHeaders() - { - // Parse the Content-Type and charset - $content_type = isset($this->headers['Content-Type']) ? $this->headers['Content-Type'] : ''; - $content_type = explode(';', $content_type); - - $this->content_type = $content_type[0]; - if (count($content_type) == 2 && strpos($content_type[1], '=') !== false) { - list($nill, $this->charset) = explode('=', $content_type[1]); - } - - // RFC 2616 states "text/*" Content-Types should have a default - // charset of ISO-8859-1. "application/*" and other Content-Types - // are assumed to have UTF-8 unless otherwise specified. - // http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1 - // http://www.w3.org/International/O-HTTP-charset.en.php - if (!isset($this->charset)) { - $this->charset = substr($this->content_type, 5) === 'text/' ? 'iso-8859-1' : 'utf-8'; - } - - // Is vendor type? Is personal type? - if (strpos($this->content_type, '/') !== false) { - list($type, $sub_type) = explode('/', $this->content_type); - $this->is_mime_vendor_specific = substr($sub_type, 0, 4) === 'vnd.'; - $this->is_mime_personal = substr($sub_type, 0, 4) === 'prs.'; - } - - // Parent type (e.g. xml for application/vnd.github.message+xml) - $this->parent_type = $this->content_type; - if (strpos($this->content_type, '+') !== false) { - list($vendor, $this->parent_type) = explode('+', $this->content_type, 2); - $this->parent_type = Mime::getFullMime($this->parent_type); - } - } - - /** - * @return string - */ - public function __toString() - { - return $this->raw_body; - } -} diff --git a/externals/httpful/src/Httpful/Response/Headers.php b/externals/httpful/src/Httpful/Response/Headers.php deleted file mode 100644 index 7abc57dd45..0000000000 --- a/externals/httpful/src/Httpful/Response/Headers.php +++ /dev/null @@ -1,58 +0,0 @@ -headers = $headers; - } - - public static function fromString($string) - { - $lines = preg_split("/(\r|\n)+/", $string, -1, PREG_SPLIT_NO_EMPTY); - array_shift($lines); // HTTP HEADER - $headers = array(); - foreach ($lines as $line) { - list($name, $value) = explode(':', $line, 2); - $headers[strtolower(trim($name))] = trim($value); - } - return new self($headers); - } - - public function offsetExists($offset) - { - return isset($this->headers[strtolower($offset)]); - } - - public function offsetGet($offset) - { - if (isset($this->headers[$name = strtolower($offset)])) { - return $this->headers[$name]; - } - } - - public function offsetSet($offset, $value) - { - throw new \Exception("Headers are read-only."); - } - - public function offsetUnset($offset) - { - throw new \Exception("Headers are read-only."); - } - - public function count() - { - return count($this->headers); - } - - public function toArray() - { - return $this->headers; - } - -} \ No newline at end of file diff --git a/externals/httpful/tests/Httpful/HttpfulTest.php b/externals/httpful/tests/Httpful/HttpfulTest.php deleted file mode 100644 index ac2ab546ce..0000000000 --- a/externals/httpful/tests/Httpful/HttpfulTest.php +++ /dev/null @@ -1,458 +0,0 @@ - - */ -namespace Httpful\Test; - -require(dirname(dirname(dirname(__FILE__))) . '/bootstrap.php'); -\Httpful\Bootstrap::init(); - -use Httpful\Httpful; -use Httpful\Request; -use Httpful\Mime; -use Httpful\Http; -use Httpful\Response; - -class HttpfulTest extends \PHPUnit_Framework_TestCase -{ - const TEST_SERVER = '127.0.0.1:8008'; - const TEST_URL = 'http://127.0.0.1:8008/'; - const TEST_URL_400 = 'http://127.0.0.1:8008/400'; - - const SAMPLE_JSON_HEADER = -"HTTP/1.1 200 OK -Content-Type: application/json -Connection: keep-alive -Transfer-Encoding: chunked\r\n"; - const SAMPLE_JSON_RESPONSE = '{"key":"value","object":{"key":"value"},"array":[1,2,3,4]}'; - const SAMPLE_CSV_HEADER = -"HTTP/1.1 200 OK -Content-Type: text/csv -Connection: keep-alive -Transfer-Encoding: chunked\r\n"; - const SAMPLE_CSV_RESPONSE = -"Key1,Key2 -Value1,Value2 -\"40.0\",\"Forty\""; - const SAMPLE_XML_RESPONSE = '2a stringTRUE'; - const SAMPLE_XML_HEADER = -"HTTP/1.1 200 OK -Content-Type: application/xml -Connection: keep-alive -Transfer-Encoding: chunked\r\n"; - const SAMPLE_VENDOR_HEADER = -"HTTP/1.1 200 OK -Content-Type: application/vnd.nategood.message+xml -Connection: keep-alive -Transfer-Encoding: chunked\r\n"; - const SAMPLE_VENDOR_TYPE = "application/vnd.nategood.message+xml"; - const SAMPLE_MULTI_HEADER = -"HTTP/1.1 200 OK -Content-Type: application/json -Connection: keep-alive -Transfer-Encoding: chunked -X-My-Header:Value1 -X-My-Header:Value2\r\n"; - function testInit() - { - $r = Request::init(); - // Did we get a 'Request' object? - $this->assertEquals('Httpful\Request', get_class($r)); - } - - function testMethods() - { - $valid_methods = array('get', 'post', 'delete', 'put', 'options', 'head'); - $url = 'http://example.com/'; - foreach ($valid_methods as $method) { - $r = call_user_func(array('Httpful\Request', $method), $url); - $this->assertEquals('Httpful\Request', get_class($r)); - $this->assertEquals(strtoupper($method), $r->method); - } - } - - function testDefaults() - { - // Our current defaults are as follows - $r = Request::init(); - $this->assertEquals(Http::GET, $r->method); - $this->assertFalse($r->strict_ssl); - } - - function testShortMime() - { - // Valid short ones - $this->assertEquals(Mime::JSON, Mime::getFullMime('json')); - $this->assertEquals(Mime::XML, Mime::getFullMime('xml')); - $this->assertEquals(Mime::HTML, Mime::getFullMime('html')); - $this->assertEquals(Mime::CSV, Mime::getFullMime('csv')); - - // Valid long ones - $this->assertEquals(Mime::JSON, Mime::getFullMime(Mime::JSON)); - $this->assertEquals(Mime::XML, Mime::getFullMime(Mime::XML)); - $this->assertEquals(Mime::HTML, Mime::getFullMime(Mime::HTML)); - $this->assertEquals(Mime::CSV, Mime::getFullMime(Mime::CSV)); - - // No false positives - $this->assertNotEquals(Mime::XML, Mime::getFullMime(Mime::HTML)); - $this->assertNotEquals(Mime::JSON, Mime::getFullMime(Mime::XML)); - $this->assertNotEquals(Mime::HTML, Mime::getFullMime(Mime::JSON)); - $this->assertNotEquals(Mime::XML, Mime::getFullMime(Mime::CSV)); - } - - function testSettingStrictSsl() - { - $r = Request::init() - ->withStrictSsl(); - - $this->assertTrue($r->strict_ssl); - - $r = Request::init() - ->withoutStrictSsl(); - - $this->assertFalse($r->strict_ssl); - } - - function testSendsAndExpectsType() - { - $r = Request::init() - ->sendsAndExpectsType(Mime::JSON); - $this->assertEquals(Mime::JSON, $r->expected_type); - $this->assertEquals(Mime::JSON, $r->content_type); - - $r = Request::init() - ->sendsAndExpectsType('html'); - $this->assertEquals(Mime::HTML, $r->expected_type); - $this->assertEquals(Mime::HTML, $r->content_type); - - $r = Request::init() - ->sendsAndExpectsType('form'); - $this->assertEquals(Mime::FORM, $r->expected_type); - $this->assertEquals(Mime::FORM, $r->content_type); - - $r = Request::init() - ->sendsAndExpectsType('application/x-www-form-urlencoded'); - $this->assertEquals(Mime::FORM, $r->expected_type); - $this->assertEquals(Mime::FORM, $r->content_type); - - $r = Request::init() - ->sendsAndExpectsType(Mime::CSV); - $this->assertEquals(Mime::CSV, $r->expected_type); - $this->assertEquals(Mime::CSV, $r->content_type); - } - - function testIni() - { - // Test setting defaults/templates - - // Create the template - $template = Request::init() - ->method(Http::POST) - ->withStrictSsl() - ->expectsType(Mime::HTML) - ->sendsType(Mime::FORM); - - Request::ini($template); - - $r = Request::init(); - - $this->assertTrue($r->strict_ssl); - $this->assertEquals(Http::POST, $r->method); - $this->assertEquals(Mime::HTML, $r->expected_type); - $this->assertEquals(Mime::FORM, $r->content_type); - - // Test the default accessor as well - $this->assertTrue(Request::d('strict_ssl')); - $this->assertEquals(Http::POST, Request::d('method')); - $this->assertEquals(Mime::HTML, Request::d('expected_type')); - $this->assertEquals(Mime::FORM, Request::d('content_type')); - - Request::resetIni(); - } - - function testAccept() - { - $r = Request::get('http://example.com/') - ->expectsType(Mime::JSON); - - $this->assertEquals(Mime::JSON, $r->expected_type); - $r->_curlPrep(); - $this->assertContains('application/json', $r->raw_headers); - } - - function testCustomAccept() - { - $accept = 'application/api-1.0+json'; - $r = Request::get('http://example.com/') - ->addHeader('Accept', $accept); - - $r->_curlPrep(); - $this->assertContains($accept, $r->raw_headers); - $this->assertEquals($accept, $r->headers['Accept']); - } - - function testUserAgent() - { - $r = Request::get('http://example.com/') - ->withUserAgent('ACME/1.2.3'); - - $this->assertArrayHasKey('User-Agent', $r->headers); - $r->_curlPrep(); - $this->assertContains('User-Agent: ACME/1.2.3', $r->raw_headers); - $this->assertNotContains('User-Agent: HttpFul/1.0', $r->raw_headers); - - $r = Request::get('http://example.com/') - ->withUserAgent(''); - - $this->assertArrayHasKey('User-Agent', $r->headers); - $r->_curlPrep(); - $this->assertContains('User-Agent:', $r->raw_headers); - $this->assertNotContains('User-Agent: HttpFul/1.0', $r->raw_headers); - } - - function testAuthSetup() - { - $username = 'nathan'; - $password = 'opensesame'; - - $r = Request::get('http://example.com/') - ->authenticateWith($username, $password); - - $this->assertEquals($username, $r->username); - $this->assertEquals($password, $r->password); - $this->assertTrue($r->hasBasicAuth()); - } - - function testDigestAuthSetup() - { - $username = 'nathan'; - $password = 'opensesame'; - - $r = Request::get('http://example.com/') - ->authenticateWithDigest($username, $password); - - $this->assertEquals($username, $r->username); - $this->assertEquals($password, $r->password); - $this->assertTrue($r->hasDigestAuth()); - } - - function testJsonResponseParse() - { - $req = Request::init()->sendsAndExpects(Mime::JSON); - $response = new Response(self::SAMPLE_JSON_RESPONSE, self::SAMPLE_JSON_HEADER, $req); - - $this->assertEquals("value", $response->body->key); - $this->assertEquals("value", $response->body->object->key); - $this->assertInternalType('array', $response->body->array); - $this->assertEquals(1, $response->body->array[0]); - } - - function testXMLResponseParse() - { - $req = Request::init()->sendsAndExpects(Mime::XML); - $response = new Response(self::SAMPLE_XML_RESPONSE, self::SAMPLE_XML_HEADER, $req); - $sxe = $response->body; - $this->assertEquals("object", gettype($sxe)); - $this->assertEquals("SimpleXMLElement", get_class($sxe)); - $bools = $sxe->xpath('/stdClass/boolProp'); - list( , $bool ) = each($bools); - $this->assertEquals("TRUE", (string) $bool); - $ints = $sxe->xpath('/stdClass/arrayProp/array/k1/myClass/intProp'); - list( , $int ) = each($ints); - $this->assertEquals("2", (string) $int); - $strings = $sxe->xpath('/stdClass/stringProp'); - list( , $string ) = each($strings); - $this->assertEquals("a string", (string) $string); - } - - function testCsvResponseParse() - { - $req = Request::init()->sendsAndExpects(Mime::CSV); - $response = new Response(self::SAMPLE_CSV_RESPONSE, self::SAMPLE_CSV_HEADER, $req); - - $this->assertEquals("Key1", $response->body[0][0]); - $this->assertEquals("Value1", $response->body[1][0]); - $this->assertInternalType('string', $response->body[2][0]); - $this->assertEquals("40.0", $response->body[2][0]); - } - - function testParsingContentTypeCharset() - { - $req = Request::init()->sendsAndExpects(Mime::JSON); - // $response = new Response(SAMPLE_JSON_RESPONSE, "", $req); - // // Check default content type of iso-8859-1 - $response = new Response(self::SAMPLE_JSON_RESPONSE, "HTTP/1.1 200 OK -Content-Type: text/plain; charset=utf-8\r\n", $req); - $this->assertInstanceOf('Httpful\Response\Headers', $response->headers); - $this->assertEquals($response->headers['Content-Type'], 'text/plain; charset=utf-8'); - $this->assertEquals($response->content_type, 'text/plain'); - $this->assertEquals($response->charset, 'utf-8'); - } - - function testEmptyResponseParse() - { - $req = Request::init()->sendsAndExpects(Mime::JSON); - $response = new Response("", self::SAMPLE_JSON_HEADER, $req); - $this->assertEquals(null, $response->body); - - $reqXml = Request::init()->sendsAndExpects(Mime::XML); - $responseXml = new Response("", self::SAMPLE_XML_HEADER, $reqXml); - $this->assertEquals(null, $responseXml->body); - } - - function testNoAutoParse() - { - $req = Request::init()->sendsAndExpects(Mime::JSON)->withoutAutoParsing(); - $response = new Response(self::SAMPLE_JSON_RESPONSE, self::SAMPLE_JSON_HEADER, $req); - $this->assertInternalType('string', $response->body); - $req = Request::init()->sendsAndExpects(Mime::JSON)->withAutoParsing(); - $response = new Response(self::SAMPLE_JSON_RESPONSE, self::SAMPLE_JSON_HEADER, $req); - $this->assertInternalType('object', $response->body); - } - - function testParseHeaders() - { - $req = Request::init()->sendsAndExpects(Mime::JSON); - $response = new Response(self::SAMPLE_JSON_RESPONSE, self::SAMPLE_JSON_HEADER, $req); - $this->assertEquals('application/json', $response->headers['Content-Type']); - } - - function testRawHeaders() - { - $req = Request::init()->sendsAndExpects(Mime::JSON); - $response = new Response(self::SAMPLE_JSON_RESPONSE, self::SAMPLE_JSON_HEADER, $req); - $this->assertContains('Content-Type: application/json', $response->raw_headers); - } - - function testHasErrors() - { - $req = Request::init()->sendsAndExpects(Mime::JSON); - $response = new Response('', "HTTP/1.1 100 Continue\r\n", $req); - $this->assertFalse($response->hasErrors()); - $response = new Response('', "HTTP/1.1 200 OK\r\n", $req); - $this->assertFalse($response->hasErrors()); - $response = new Response('', "HTTP/1.1 300 Multiple Choices\r\n", $req); - $this->assertFalse($response->hasErrors()); - $response = new Response('', "HTTP/1.1 400 Bad Request\r\n", $req); - $this->assertTrue($response->hasErrors()); - $response = new Response('', "HTTP/1.1 500 Internal Server Error\r\n", $req); - $this->assertTrue($response->hasErrors()); - } - - function test_parseCode() - { - $req = Request::init()->sendsAndExpects(Mime::JSON); - $response = new Response(self::SAMPLE_JSON_RESPONSE, self::SAMPLE_JSON_HEADER, $req); - $code = $response->_parseCode("HTTP/1.1 406 Not Acceptable\r\n"); - $this->assertEquals(406, $code); - } - - function testToString() - { - $req = Request::init()->sendsAndExpects(Mime::JSON); - $response = new Response(self::SAMPLE_JSON_RESPONSE, self::SAMPLE_JSON_HEADER, $req); - $this->assertEquals(self::SAMPLE_JSON_RESPONSE, (string)$response); - } - - function test_parseHeaders() - { - $parse_headers = Response\Headers::fromString(self::SAMPLE_JSON_HEADER); - $this->assertCount(3, $parse_headers); - $this->assertEquals('application/json', $parse_headers['Content-Type']); - $this->assertTrue(isset($parse_headers['Connection'])); - } - - function testMultiHeaders() - { - $req = Request::init(); - $response = new Response(self::SAMPLE_JSON_RESPONSE, self::SAMPLE_MULTI_HEADER, $req); - $parse_headers = $response->_parseHeaders(self::SAMPLE_MULTI_HEADER); - $this->assertEquals('Value1,Value2', $parse_headers['X-My-Header']); - } - - function testDetectContentType() - { - $req = Request::init(); - $response = new Response(self::SAMPLE_JSON_RESPONSE, self::SAMPLE_JSON_HEADER, $req); - $this->assertEquals('application/json', $response->headers['Content-Type']); - } - - function testMissingBodyContentType() - { - $body = 'A string'; - $request = Request::post(HttpfulTest::TEST_URL, $body)->_curlPrep(); - $this->assertEquals($body, $request->serialized_payload); - } - - function testParentType() - { - // Parent type - $request = Request::init()->sendsAndExpects(Mime::XML); - $response = new Response('Nathan', self::SAMPLE_VENDOR_HEADER, $request); - - $this->assertEquals("application/xml", $response->parent_type); - $this->assertEquals(self::SAMPLE_VENDOR_TYPE, $response->content_type); - $this->assertTrue($response->is_mime_vendor_specific); - - // Make sure we still parsed as if it were plain old XML - $this->assertEquals("Nathan", $response->body->name->__toString()); - } - - function testMissingContentType() - { - // Parent type - $request = Request::init()->sendsAndExpects(Mime::XML); - $response = new Response('Nathan', -"HTTP/1.1 200 OK -Connection: keep-alive -Transfer-Encoding: chunked\r\n", $request); - - $this->assertEquals("", $response->content_type); - } - - function testCustomMimeRegistering() - { - // Register new mime type handler for "application/vnd.nategood.message+xml" - Httpful::register(self::SAMPLE_VENDOR_TYPE, new DemoMimeHandler()); - - $this->assertTrue(Httpful::hasParserRegistered(self::SAMPLE_VENDOR_TYPE)); - - $request = Request::init(); - $response = new Response('Nathan', self::SAMPLE_VENDOR_HEADER, $request); - - $this->assertEquals(self::SAMPLE_VENDOR_TYPE, $response->content_type); - $this->assertEquals('custom parse', $response->body); - } - - public function testShorthandMimeDefinition() - { - $r = Request::init()->expects('json'); - $this->assertEquals(Mime::JSON, $r->expected_type); - - $r = Request::init()->expectsJson(); - $this->assertEquals(Mime::JSON, $r->expected_type); - } - - public function testOverrideXmlHandler() - { - // Lazy test... - $prev = \Httpful\Httpful::get(\Httpful\Mime::XML); - $this->assertEquals($prev, new \Httpful\Handlers\XmlHandler()); - $conf = array('namespace' => 'http://example.com/'); - \Httpful\Httpful::register(\Httpful\Mime::XML, new \Httpful\Handlers\XmlHandler($conf)); - $new = \Httpful\Httpful::get(\Httpful\Mime::XML); - $this->assertNotEquals($prev, $new); - } -} - -class DemoMimeHandler extends \Httpful\Handlers\MimeHandlerAdapter { - public function parse($body) { - return 'custom parse'; - } -} - diff --git a/externals/httpful/tests/phpunit.xml b/externals/httpful/tests/phpunit.xml deleted file mode 100644 index 8f62e80a14..0000000000 --- a/externals/httpful/tests/phpunit.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - . - - - - - - diff --git a/externals/mimemailparser/MimeMailParser.class.php b/externals/mimemailparser/MimeMailParser.class.php index 3ce0ee49c7..914f50888e 100644 --- a/externals/mimemailparser/MimeMailParser.class.php +++ b/externals/mimemailparser/MimeMailParser.class.php @@ -111,6 +111,14 @@ public function setStream($stream) { * @param $data String */ public function setText($data) { + // NOTE: This has been modified for Phabricator. If the input data does not + // end in a newline, Mailparse fails to include the last line in the mail + // body. This happens somewhere deep, deep inside the mailparse extension, + // so adding a newline here seems like the most straightforward fix. + if (!preg_match('/\n\z/', $data)) { + $data = $data."\n"; + } + $this->resource = mailparse_msg_create(); // does not parse incrementally, fast memory hog might explode mailparse_msg_parse($this->resource, $data); @@ -195,23 +203,23 @@ public function getMessageBody($type = 'text') { ); if (in_array($type, array_keys($mime_types))) { foreach($this->parts as $part) { - $disposition = $this->getPartContentDisposition($part); - if ($disposition == 'attachment') { - // text/plain parts with "Content-Disposition: attachment" are - // attachments, not part of the text body. - continue; - } + $disposition = $this->getPartContentDisposition($part); + if ($disposition == 'attachment') { + // text/plain parts with "Content-Disposition: attachment" are + // attachments, not part of the text body. + continue; + } if ($this->getPartContentType($part) == $mime_types[$type]) { - $headers = $this->getPartHeaders($part); - // Concatenate all the matching parts into the body text. For example, - // if a user sends a message with some text, then an image, and then - // some more text, the text body of the email gets split over several - // attachments. + $headers = $this->getPartHeaders($part); + // Concatenate all the matching parts into the body text. For example, + // if a user sends a message with some text, then an image, and then + // some more text, the text body of the email gets split over several + // attachments. $body .= $this->decode( $this->getPartBody($part), array_key_exists('content-transfer-encoding', $headers) - ? $headers['content-transfer-encoding'] - : ''); + ? $headers['content-transfer-encoding'] + : ''); } } } else { @@ -243,20 +251,42 @@ public function getMessageBodyHeaders($type = 'text') { return $headers; } - /** * Returns the attachments contents in order of appearance * @return Array * @param $type Object[optional] */ public function getAttachments() { + // NOTE: This has been modified for Phabricator. Some mail clients do not + // send attachments with "Content-Disposition" headers. $attachments = array(); $dispositions = array("attachment","inline"); - foreach($this->parts as $part) { + $non_attachment_types = array("text/plain", "text/html"); + $nonameIter = 0; + foreach ($this->parts as $part) { $disposition = $this->getPartContentDisposition($part); - if (in_array($disposition, $dispositions)) { + $filename = 'noname'; + if (isset($part['disposition-filename'])) { + $filename = $part['disposition-filename']; + } elseif (isset($part['content-name'])) { + // if we have no disposition but we have a content-name, it's a valid attachment. + // we simulate the presence of an attachment disposition with a disposition filename + $filename = $part['content-name']; + $disposition = 'attachment'; + } elseif (!in_array($part['content-type'], $non_attachment_types, true) + && substr($part['content-type'], 0, 10) !== 'multipart/' + ) { + // if we cannot get it with getMessageBody, we assume it is an attachment + $disposition = 'attachment'; + } + + if (in_array($disposition, $dispositions) && isset($filename) === true) { + if ($filename == 'noname') { + $nonameIter++; + $filename = 'noname'.$nonameIter; + } $attachments[] = new MimeMailParser_attachment( - $part['disposition-filename'], + $filename, $this->getPartContentType($part), $this->getAttachmentStream($part), $disposition, @@ -405,7 +435,7 @@ private function getPartBodyFromText(&$part) { private function getAttachmentStream(&$part) { $temp_fp = tmpfile(); - array_key_exists('content-transfer-encoding', $part['headers']) ? $encoding = $part['headers']['content-transfer-encoding'] : $encoding = ''; + array_key_exists('content-transfer-encoding', $part['headers']) ? $encoding = $part['headers']['content-transfer-encoding'] : $encoding = ''; if ($temp_fp) { if ($this->stream) { @@ -437,21 +467,21 @@ private function getAttachmentStream(&$part) { } - /** - * Decode the string depending on encoding type. - * @return String the decoded string. - * @param $encodedString The string in its original encoded state. - * @param $encodingType The encoding type from the Content-Transfer-Encoding header of the part. - */ - private function decode($encodedString, $encodingType) { - if (strtolower($encodingType) == 'base64') { - return base64_decode($encodedString); - } else if (strtolower($encodingType) == 'quoted-printable') { - return quoted_printable_decode($encodedString); - } else { - return $encodedString; - } - } + /** + * Decode the string depending on encoding type. + * @return String the decoded string. + * @param $encodedString The string in its original encoded state. + * @param $encodingType The encoding type from the Content-Transfer-Encoding header of the part. + */ + private function decode($encodedString, $encodingType) { + if (strtolower($encodingType) == 'base64') { + return base64_decode($encodedString); + } else if (strtolower($encodingType) == 'quoted-printable') { + return quoted_printable_decode($encodedString); + } else { + return $encodedString; + } + } } diff --git a/externals/mimemailparser/attachment.class.php b/externals/mimemailparser/attachment.class.php index d56aba1f8d..2631a4fc44 100644 --- a/externals/mimemailparser/attachment.class.php +++ b/externals/mimemailparser/attachment.class.php @@ -102,7 +102,7 @@ public function read($bytes = 2082) { /** * Retrieve the file content in one go - * Once you retreive the content you cannot use MimeMailParser_attachment::read() + * Once you retrieve the content you cannot use MimeMailParser_attachment::read() * @return String */ public function getContent() { diff --git a/externals/octicons/LICENSE b/externals/octicons/LICENSE new file mode 100644 index 0000000000..4cf2020ce7 --- /dev/null +++ b/externals/octicons/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2012-2016 GitHub, Inc. + +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. diff --git a/externals/octicons/README.md b/externals/octicons/README.md new file mode 100644 index 0000000000..84edd84dce --- /dev/null +++ b/externals/octicons/README.md @@ -0,0 +1,194 @@ +# GitHub Octicons + +[![NPM version](https://img.shields.io/npm/v/octicons.svg)](https://www.npmjs.org/package/octicons) +[![Build Status](https://travis-ci.org/primer/octicons.svg?branch=master)](https://travis-ci.org/primer/octicons) + +> Octicons are a scalable set of icons handcrafted with <3 by GitHub. + +## Install + +**NOTE:** The compiled files are located in `/build/`. This directory is located in the published npm package. Which means you can access it when you `npm install octicons`. You can also build this directory by following the [building octicons directions](#building-octicons). The files in the `/lib/` directory are the raw source files and are not compiled or optimized. + +#### NPM + +This repository is distributed with [npm][npm]. After [installing npm][install-npm], you can install `octicons` with this command. + +``` +$ npm install --save octicons +``` + +## Usage + +For all the usages, we recommend using the CSS located in `./build/octicons.css`. This is some simple CSS to normalize the icons and inherit colors. + +### Spritesheet + +With a [SVG sprite icon system](https://css-tricks.com/svg-sprites-use-better-icon-fonts/) you can include the sprite sheet located `./build/sprite.octicons.svg` after you [build the icons](#building-octicons) or from the npm package. There is a demo of how to use the spritesheet in the build directory also. + +### Node + +After installing `npm install octicons` you can access the icons like this. + +```js +var octicons = require("octicons") +octicons.alert +// { keywords: [ 'warning', 'triangle', 'exclamation', 'point' ], +// path: '', +// height: '16', +// width: '16', +// symbol: 'alert', +// options: +// { version: '1.1', +// width: '16', +// height: '16', +// viewBox: '0 0 16 16', +// class: 'octicon octicon-alert', +// 'aria-hidden': 'true' }, +// toSVG: [Function] } +``` + +There will be a key for every icon, with `keywords` and `svg`. + +#### `octicons.alert.symbol` + +Returns the string of the symbol name + +```js +octicons.x.symbol +// "x" +``` + +#### `octicons.person.path` + +Path returns the string representation of the path of the icon. + +```js +octicons.x.path +// +``` + +#### `octicons.issue.options` + +This is a json object of all the `options` that will be added to the output tag. + +```js +octicons.x.options +// { version: '1.1', width: '12', height: '16', viewBox: '0 0 12 16', class: 'octicon octicon-x', 'aria-hidden': 'true' } +``` + +#### `octicons.alert.width` + +Width is the icon's true width. Based on the svg view box width. _Note, this doesn't change if you scale it up with size options, it only is the natural width of the icon_ + +#### `octicons.alert.height` + +Height is the icon's true height. Based on the svg view box height. _Note, this doesn't change if you scale it up with size options, it only is the natural height of the icon_ + +#### `keywords` + +Returns an array of keywords for the icon. The data [comes from the octicons repository](https://github.com/primer/octicons/blob/master/lib/data.json). Consider contributing more aliases for the icons. + +```js +octicons.x.keywords +// ["remove", "close", "delete"] +``` + +#### `octicons.alert.toSVG()` + +Returns a string of the svg tag + +```js +octicons.x.toSVG() +// +``` + +The `.toSVG()` method accepts an optional `options` object. This is used to add CSS classnames, a11y options, and sizing. + +##### class + +Add more CSS classes to the `` tag. + +```js +octicons.x.toSVG({ "class": "close" }) +// +``` + +##### aria-label + +Add accessibility `aria-label` to the icon. + +```js +octicons.x.toSVG({ "aria-label": "Close the window" }) +// +``` + +##### width & height + +Size the SVG icon larger using `width` & `height` independently or together. + +```js +octicons.x.toSVG({ "width": 45 }) +// +``` + +#### `octicons.alert.toSVGUse()` + +Returns a string of the svg tag with the `` tag, for use with the spritesheet located in the /build/ directory. + +```js +octicons.x.toSVGUse() +// +``` + +### Ruby + +If your environment is Ruby on Rails, we have a [octicons_helper](https://github.com/primer/octicons_helper) gem available that renders SVG in your page. The octicons_helper uses the [octicons_gem](https://github.com/primer/octicons_gem) to do the computing and reading of the SVG files. + +### Jekyll + +For jekyll, there's a [jekyll-octicons](https://github.com/primer/jekyll-octicons) plugin available. This works exactly like the octicons_helper. + +## Changing, adding, or deleting icons + +1. Open the [Sketch document][sketch-document] in `/lib/`. Each icon exists as an artboard within our master Sketch document. If you’re adding an icon, duplicate one of the artboards and add your shapes to it. Be sure to give your artboard a name that makes sense. +2. Once you’re happy with your icon set, choose File > Export… +3. Choose all the artboards you’d like to export and then press “Export” +4. Export to `/lib/svg/` + +You’ll next need to build your Octicons. + +## Building Octicons + +All the files you need will be in the `/build/` directory already, but if you’ve made changes to the `/lib/` directory and need to regenerate, follow these steps: + +1. Open the Octicons directory in Terminal +2. `npm install` to install all dependencies for the project. +3. Run the command `npm run build`. This will run the grunt task to build the SVGs, placing them in the `/build/` directory. + +## Publishing + +If you have access to publish this repository, these are the steps to publishing. If you need access, contact [#design-systems](https://github.slack.com/archives/design-systems). + +1. Update the [CHANGELOG.md](./CHANGELOG.md) with relevant version number and any updates made to the repository. +2. `npm version ` Run [npm version](https://docs.npmjs.com/cli/version) inputing the relevant version type. The versioning is [semver](http://semver.org/), so version appropriately based on what has changed. +3. `npm publish` This will publish the new version to npmjs.org +4. `git push && git push --tags` Push all these changes to origin. + +## License + +(c) 2012-2016 GitHub, Inc. + +When using the GitHub logos, be sure to follow the [GitHub logo guidelines](https://github.com/logos). + +_SVG License:_ [SIL OFL 1.1](http://scripts.sil.org/OFL) +Applies to all SVG files + +_Code License:_ [MIT](./LICENSE) +Applies to all other files + +[primer]: https://github.com/primer/primer +[docs]: http://primercss.io/ +[npm]: https://www.npmjs.com/ +[install-npm]: https://docs.npmjs.com/getting-started/installing-node +[sass]: http://sass-lang.com/ +[sketch-document]: https://github.com/primer/octicons/blob/master/lib/octicons-master.sketch diff --git a/externals/pear-figlet/Text/Figlet.php b/externals/pear-figlet/Text/Figlet.php new file mode 100644 index 0000000000..f8c888e4f7 --- /dev/null +++ b/externals/pear-figlet/Text/Figlet.php @@ -0,0 +1,502 @@ + +* @author Christian Weiske +* @license http://www.php.net/license PHP License +* @version CVS: $Id$ +* @link http://pear.php.net/package/Text_Figlet +*/ + +/** +* ASCII art text creation +* +* Project home page (Russian): http://bolknote.ru/files/figlet/ +* +* PHP Version 4 +* +* @category Text +* @package Text_Figlet +* @author Evgeny Stepanischev +* @author Christian Weiske +* @license http://www.php.net/license PHP License +* @link http://pear.php.net/package/Text_Figlet +*/ +class Text_Figlet +{ + /** + * Height of a letter + * + * @var integer + * + * @access protected + */ + var $height; + + /** + * Letter baseline + * + * @var integer + * + * @access protected + */ + var $oldlayout; + + /** + * Flag - RTL (right to left) or LTR (left to right) text direction + * + * @var integer + * + * @access protected + */ + var $rtol; + + /** + * Information about special 'hardblank' character + * + * @var integer + * + * @access protected + */ + var $hardblank; + + /** + * Is used for keeping font + * + * @var array + * + * @access protected + */ + var $font; + + /** + * Flag is true if smushing occured in letters printing cycle + * + * @var integer + * + * @access protected + */ + var $smush_flag; + + /** + * Comment lines buffer + * + * @var string + * + * @access public + */ + + var $font_comment; + + + /** + * Load user font. Must be invoked first. + * Automatically tries the Text_Figlet font data directory + * as long as no path separator is in the filename. + * + * @param string $filename font file name + * @param bool $loadgerman (optional) load German character set or not + * + * @access public + * @return mixed PEAR_Error or true for success + */ + function loadFont($filename, $loadgerman = true) + { + $this->font = array(); + if (!file_exists($filename)) { + return self::raiseError('Figlet font file "' + . $filename + . '" cannot be found', 1); + } + + $this->font_comment = ''; + + // If Gzip compressed font + if (substr($filename, -3, 3) == '.gz') { + $filename = 'compress.zlib://' . $filename; + $compressed = true; + + if (!function_exists('gzcompress')) { + return self::raiseError('Cannot load gzip compressed fonts since' + . ' gzcompress() is not available.', + 3); + } + } else { + $compressed = false; + } + + if (!($fp = fopen($filename, 'rb'))) { + return self::raiseError('Cannot open figlet font file ' . $filename, 2); + } + + if (!$compressed) { + /* ZIPed font */ + if (fread($fp, 2) == 'PK') { + fclose($fp); + + $zip = new ZipArchive(); + $open_flag = 0; + // The RDONLY flag was only introduced in 7.4.3. + if (defined('ZipArchive::RDONLY')) { + $open_flag = ZipArchive::RDONLY; + } + $open_result = $zip->open($filename, $open_flag); + if ($open_result !== true) { + return self::raiseError('Cannot open figlet font file ' . + $filename . ', got error: ' . $open_result, 2); + } + + $name = $zip->getNameIndex(0); + $zip->close(); + + if (!($fp = fopen('zip://' . realpath($filename) . '#' . $name, 'rb'))) { + return self::raiseError('Cannot open figlet font file ' . $filename, 2); + } + + $compressed = true; + } else { + flock($fp, LOCK_SH); + rewind($fp); + } + } + + // flf2a$ 6 5 20 15 3 0 143 229 + // | | | | | | | | | | + // / / | | | | | | | \ + // Signature / / | | | | | \ Codetag_Count + // Hardblank / / | | | \ Full_Layout + // Height / | | \ Print_Direction + // Baseline / \ Comment_Lines + // Max_Length Old_Layout + + + $header = explode(' ', fgets($fp, 2048)); + + if (substr($header[0], 0, 5) <> 'flf2a') { + return self::raiseError('Unknown FIGlet font format.', 4); + } + + @list ($this->hardblank, $this->height,,, + $this->oldlayout, $cmt_count, $this->rtol) = $header; + + $this->hardblank = substr($this->hardblank, -1, 1); + + for ($i = 0; $i < $cmt_count; $i++) { + $this->font_comment .= fgets($fp, 2048); + } + + // ASCII charcters + for ($i = 32; $i < 127; $i++) { + $this->font[$i] = $this->_char($fp); + } + + foreach (array(196, 214, 220, 228, 246, 252, 223) as $i) { + if ($loadgerman) { + $letter = $this->_char($fp); + + // Invalid character but main font is loaded and I can use it + if ($letter === false) { + fclose($fp); + return true; + } + + // Load if it is not blank only + if (trim(implode('', $letter)) <> '') { + $this->font[$i] = $letter; + } + } else { + $this->_skip($fp); + } + } + + // Extented characters + for ($n = 0; !feof($fp); $n++) { + list ($i) = explode(' ', rtrim(fgets($fp, 1024)), 2); + if ($i == '') { + continue; + } + + // If comment + if (preg_match('/^\-0x/i', $i)) { + $this->_skip($fp); + } else { + // If Unicode + if (preg_match('/^0x/i', $i)) { + $i = hexdec(substr($i, 2)); + } else { + // If octal + if ($i[0] === '0' && $i !== '0' || substr($i, 0, 2) == '-0') { + $i = octdec($i); + } + } + + $letter = $this->_char($fp); + + // Invalid character but main font is loaded and I can use it + if ($letter === false) { + fclose($fp); + return true; + } + + $this->font[$i] = $letter; + } + } + + fclose($fp); + return true; + } + + + + /** + * Print string using font loaded by LoadFont method + * + * @param string $str string for printing + * @param bool $inhtml (optional) output mode + * - HTML (true) or plain text (false) + * + * @access public + * @return string contains + */ + function lineEcho($str, $inhtml = false) + { + $out = array(); + + for ($i = 0; $ihardblank, '/'); + $sp = "$hb\\x00\\s"; + + // If chosen character not found try to use default + // If default character is not defined skip it + + if (!isset($this->font[$lt])) { + if (isset($this->font[0])) { + $lt = 0; + } else { + continue; + } + } + + for ($j = 0; $j < $this->height; $j++) { + $line = $this->font[$lt][$j]; + + // Replace hardblanks + if (isset($out[$j])) { + if ($this->rtol) { + $out[$j] = $line . $out[$j]; + } else { + $out[$j] .= $line; + } + } else { + $out[$j] = $line; + } + } + + if ($this->oldlayout > -1 && $i) { + // Calculate minimal distance between two last letters + + $mindiff = -1; + + for ($j = 0; $j < $this->height; $j++) { + if (preg_match("/\S(\s*\\x00\s*)\S/", $out[$j], $r)) { + if ($mindiff == -1) { + $mindiff = strlen($r[1]); + } else { + $mindiff = min($mindiff, strlen($r[1])); + } + } + } + + // Remove spaces between two last letter + // dec mindiff for exclude \x00 symbol + + if (--$mindiff > 0) { + for ($j = 0; $j < $this->height; $j++) { + if (preg_match("/\\x00(\s{0,{$mindiff}})/", $out[$j], $r)) { + $l = strlen($r[1]); + $b = $mindiff - $l; + $out[$j] = preg_replace("/\s{0,$b}\\x00\s{{$l}}/", + "\0", + $out[$j], + 1); + } + } + } + // Smushing + + $this->smush_flag = 0; + + for ($j = 0; $j < $this->height; $j++) { + $out[$j] = preg_replace_callback("#([^$sp])\\x00([^$sp])#", + array(&$this, '_rep'), + $out[$j]); + } + + // Remove one space if smushing + // and remove all \x00 except tail whenever + + if ($this->smush_flag) { + $pat = array("/\s\\x00(?!$)|\\x00\s/", "/\\x00(?!$)/"); + $rep = array('', ''); + } else { + $pat = "/\\x00(?!$)/"; + $rep = ''; + } + + for ($j = 0; $j<$this->height; $j++) { + $out[$j] = preg_replace($pat, $rep, $out[$j]); + } + } + } + + $trans = array("\0" => '', $this->hardblank => ' '); + $str = strtr(implode("\n", $out), $trans); + + if ($inhtml) { + self::raiseError( + 'Do not use the HTML escaping provided by this class in '. + 'a Phabricator context.'); + } + + return $str; + } + + + + /** + * It is preg_replace callback function that makes horizontal letter smushing + * + * @param array $r preg_replace matches array + * + * @return string + * @access private + */ + function _rep($r) + { + if ($this->oldlayout & 1 && $r[1] == $r[2]) { + $this->smush_flag = 1; + return $r[1]; + } + + if ($this->oldlayout & 2) { + $symb = '|/\\[]{}()<>'; + + if ($r[1] == '_' && strpos($symb, $r[2]) !== false || + $r[2] == '_' && strpos($symb, $r[1]) !== false) { + $this->smush_flag = 1; + return $r[1]; + } + } + + if ($this->oldlayout & 4) { + $classes = '|/\\[]{}()<>'; + + if (($left = strpos($classes, $r[1])) !== false) { + if (($right = strpos($classes, $r[2])) !== false) { + $this->smush_flag = 1; + return $right > $left ? $r[2] : $r[1]; + } + } + } + + if ($this->oldlayout & 8) { + $t = array('[' => ']', ']' => '[', '{' => '}', '}' => '{', + '(' => ')', ')' => '('); + + if (isset($t[$r[2]]) && $r[1] == $t[$r[2]]) { + $this->smush_flag = 1; + return '|'; + } + } + + if ($this->oldlayout & 16) { + $t = array("/\\" => '|', "\\/" => 'Y', '><' => 'X'); + + if (isset($t[$r[1].$r[2]])) { + $this->smush_flag = 1; + return $t[$r[1].$r[2]]; + } + } + + if ($this->oldlayout & 32) { + if ($r[1] == $r[2] && $r[1] == $this->hardblank) { + $this->smush_flag = 1; + return $this->hardblank; + } + } + + return $r[1]."\00".$r[2]; + } + + + + /** + * Function loads one character in the internal array from file + * + * @param resource &$fp handle of font file + * + * @return mixed lines of the character or false if foef occured + * @access private + */ + function _char(&$fp) + { + $out = array(); + + for ($i = 0; $i < $this->height; $i++) { + if (feof($fp)) { + return false; + } + + $line = rtrim(fgets($fp, 2048), "\r\n"); + if (preg_match('/(.){1,2}$/', $line, $r)) { + $line = str_replace($r[1], '', $line); + } + + $line .= "\x00"; + + $out[] = $line; + } + + return $out; + } + + + + /** + * Function for skipping one character in a font file + * + * @param resource &$fp handle of font file + * + * @return boolean always return true + * @access private + */ + function _skip(&$fp) + { + for ($i = 0; $i<$this->height && !feof($fp); $i++) { + fgets($fp, 2048); + } + + return true; + } + + + private static function raiseError($message, $code = 1) { + throw new Exception($message); + } +} \ No newline at end of file diff --git a/externals/pear-figlet/docs/README.TXT b/externals/pear-figlet/docs/README.TXT new file mode 100644 index 0000000000..544a5259a9 --- /dev/null +++ b/externals/pear-figlet/docs/README.TXT @@ -0,0 +1,26 @@ +FIGlet project home page: http://www.figlet.org/ +You can download FIGlet fonts from: ftp://ftp.figlet.org/pub/figlet/fonts/ +Project home page (Russian): http://bolknote.ru/files/figlet/ + +Notes: +1. There are no support flc and vertical smushing. +2. But horizontal smushing is supported. +3. Default character (0x00) is supported. +4. German symbols are supported. +5. It is supported Unicode as %uHHHH, HHHH - a hex code of a character (UCS-2). +7. RTL and LTR text directions are suppoted. +8. Windows and Unix font formats are supported. +9. Incomplete fonts are supported (for example dwhistled.flf). +10. Gzipped fonts supported as .flf.gz (zlib PHP extension required) +11. ZIPed fonts supported (ZIP PHP extension required) + ` +Usage: + + include_once 'Text/Figlet.php'; + + $figlet = new Text_Figlet(); + if (PEAR::isError($error = $figlet->LoadFont('slant.flf'))) { + echo 'Error: ', $error->getMessage(); + } else { + echo $figlet->LineEcho("Hello, world!"); + } \ No newline at end of file diff --git a/externals/pear-figlet/docs/examples/hello_world.php b/externals/pear-figlet/docs/examples/hello_world.php new file mode 100644 index 0000000000..849c997fb3 --- /dev/null +++ b/externals/pear-figlet/docs/examples/hello_world.php @@ -0,0 +1,35 @@ +LoadFont('makisupa.flf'); +if (PEAR::isError($error)) { + echo 'Error: ' . $error->getMessage() . "\n"; +} else { + echo $figlet->LineEcho(utf8tofiglet('Hello, world!')) . "\n"; +} +?> \ No newline at end of file diff --git a/externals/pear-figlet/fonts/makisupa.flf b/externals/pear-figlet/fonts/makisupa.flf new file mode 100644 index 0000000000..6ed7e1e6df --- /dev/null +++ b/externals/pear-figlet/fonts/makisupa.flf @@ -0,0 +1,2877 @@ +flf2a_ 16 16 100 -1 3 0 0 73 +Converted Makisupa (http://www.greywolfwebworks.com/fonts.html) +by Evgeny Stepanischev http://bolknote.ru/ 2010.07.08 +GPL and OFL license. +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_@@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_ _@ +_** _@ +_##* _@ +_##* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_##**## _@ +_##**## _@ +_##**## _@ +_##**## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ ##* ##* _@ +_*##**##** _@ +_######### _@ +_######### _@ +_ ##* ##* _@ +_*##**##** _@ +_######### _@ +_######### _@ +_ ##* ##* _@ +_ _@ +_@@ +_ *## _@ +_ *##* _@ +_*#####* _@ +_#######* _@ +_###**##* _@ +_###* ##* _@ +_######* _@ +_*###### _@ +_ ***##* _@ +_###**##* _@ +_#######* _@ +_*#####* _@ +_ *###* _@ +_ *## _@ +_ _@ +_@@ +_*##* #** _@ +_#### *### _@ +_#### #### _@ +_####*###* _@ +_######## _@ +_*######* _@ +_ **###* _@ +_ *###* _@ +_ *###* _@ +_ *######* _@ +_*######## _@ +_*##*##*## _@ +_###*##### _@ +_*#* *###* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ *####* _@ +_ ######* _@ +_ ###*##* _@ +_ ###*##* _@ +_ *####* _@ +_*#####*##* _@ +_#########* _@ +_##* ####* _@ +_###*#####* _@ +_*######### _@ +_ *####**#* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_ _@ +_@@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_###** _@ +_*#### _@ +_ *### _@ +_ _@ +_ _@ +_@@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ *##* _@ +_*###* _@ +_###* _@ +_##* _@ +_ _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ *# _@ +_#### _@ +_*### _@ +_#### _@ +_ *# _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_***##**** _@ +_######### _@ +_######### _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_##* _@ +_##* _@ +_*# _@ +_** _@ +_#* _@ +_ _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_********* _@ +_######### _@ +_######### _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_** _@ +_##* _@ +_##* _@ +_ _@ +_@@ +_ *#* _@ +_ *### _@ +_ *##* _@ +_ *###* _@ +_ *##* _@ +_ *### _@ +_ ###* _@ +_ *### _@ +_ ###* _@ +_ *##* _@ +_*###* _@ +_*##* _@ +_###* _@ +_*#* _@ +_ _@ +_@@ +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##*## *## _@ +_##*## *## _@ +_##*** *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +_*###* _@ +_####* _@ +_**##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_**###** _@ +_####### _@ +_####### _@ +_ _@ +_@@ +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_ *### _@ +_ *######* _@ +_*######* _@ +_###**** _@ +_##* _@ +_##* _@ +_###****** _@ +_######### _@ +_######### _@ +_ _@ +_@@ +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_ *### _@ +_ #####* _@ +_ #####* _@ +_ ***### _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +_ *##* _@ +_ *###* _@ +_ *####* _@ +_ *#####* _@ +_ *######* _@ +_ *####*##* _@ +_ ####**##* _@ +_*########* _@ +_*########* _@ +_ *##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ _@ +_@@ +_######### _@ +_######### _@ +_###****** _@ +_##* _@ +_##* _@ +_#######* _@ +_########* _@ +_******### _@ +_ *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +_ *#* _@ +_ *## _@ +_ ### _@ +_ *##* _@ +_ *## _@ +_ ##* _@ +_*######* _@ +_########* _@ +_######### _@ +_##* *### _@ +_##* *## _@ +_###***### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +_######### _@ +_######### _@ +_******### _@ +_ ###* _@ +_ *### _@ +_ *##* _@ +_ ###* _@ +_ *##* _@ +_ *##* _@ +_ ### _@ +_ *##* _@ +_ ### _@ +_ ##* _@ +_ ##* _@ +_ _@ +_@@ +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_###* *### _@ +_*#######* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_###**#### _@ +_*######## _@ +_ *######* _@ +_ *### _@ +_ *##* _@ +_ *###* _@ +_ *### _@ +_ ###* _@ +_ *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_##* _@ +_##* _@ +_** _@ +_ _@ +_ _@ +_ _@ +_** _@ +_##* _@ +_##* _@ +_ _@ +_@@ +_ _@ +_** _@ +_##* _@ +_##* _@ +_ _@ +_ _@ +_ _@ +_ _@ +_##* _@ +_##* _@ +_*# _@ +_** _@ +_#* _@ +_ _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ *#* _@ +_ *### _@ +_ *###* _@ +_*###* _@ +_###* _@ +_###* _@ +_*###* _@ +_ *###* _@ +_ *### _@ +_ *#* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_********* _@ +_######### _@ +_######### _@ +_ _@ +_********* _@ +_######### _@ +_######### _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_*#* _@ +_###* _@ +_*###* _@ +_ *###* _@ +_ *### _@ +_ *### _@ +_ *###* _@ +_*###* _@ +_###* _@ +_*#* _@ +_ _@ +_@@ +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_ *### _@ +_ *####* _@ +_ *####* _@ +_ *###** _@ +_ *##* _@ +_ ** _@ +_ ** _@ +_ *## _@ +_ *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ *####** _@ +_ *##*#*##* _@ +_ ##**#**#* _@ +_*#* #*# *# _@ +_*# ### *# _@ +_*#* #*# *# _@ +_ ## # #*## _@ +_ *### ###* _@ +_ *#####* _@ +_ *** _@ +_ _@ +_@@ +_ *###* _@ +_ *#####* _@ +_*###*###* _@ +_###* *### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_######### _@ +_######### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +_#######* _@ +_########* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *### _@ +_########* _@ +_########* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_########* _@ +_#######* _@ +_ _@ +_@@ +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* _@ +_##* _@ +_##* _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +_######* _@ +_#######* _@ +_###*####* _@ +_##* *### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *### _@ +_###*####* _@ +_#######* _@ +_######* _@ +_ _@ +_@@ +_######### _@ +_######### _@ +_###****** _@ +_##* _@ +_##* _@ +_##* _@ +_#######* _@ +_#######* _@ +_###**** _@ +_##* _@ +_##* _@ +_###****** _@ +_######### _@ +_######### _@ +_ _@ +_@@ +_######### _@ +_######### _@ +_###****** _@ +_##* _@ +_##* _@ +_##* _@ +_#######* _@ +_#######* _@ +_###**** _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_ _@ +_@@ +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* _@ +_##* ##### _@ +_##* ##### _@ +_##* **### _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_*######## _@ +_ *####### _@ +_ _@ +_@@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_######### _@ +_######### _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +_######### _@ +_######### _@ +_***###*** _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_***###*** _@ +_######### _@ +_######### _@ +_ _@ +_@@ +_ *##### _@ +_ *##### _@ +_ **### _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +_##* *## _@ +_##* *## _@ +_##* ### _@ +_##* *##* _@ +_##* ###* _@ +_##* *##* _@ +_#######* _@ +_####### _@ +_###*###* _@ +_##* *### _@ +_##* *##* _@ +_##* ### _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_###****** _@ +_######### _@ +_######### _@ +_ _@ +_@@ +_##* *## _@ +_### ### _@ +_###* *### _@ +_####*#### _@ +_######### _@ +_######### _@ +_##*###*## _@ +_##*###*## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +_##* *## _@ +_### *## _@ +_###* *## _@ +_####* *## _@ +_####* *## _@ +_#####**## _@ +_######*## _@ +_##*###### _@ +_##**##### _@ +_##* *#### _@ +_##* *#### _@ +_##* *### _@ +_##* ### _@ +_##* *## _@ +_ _@ +_@@ +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +_#######* _@ +_########* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *### _@ +_########* _@ +_#######* _@ +_###**** _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_ _@ +_@@ +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *#### _@ +_##* ##### _@ +_####*#### _@ +_*######## _@ +_ *######* _@ +_ _@ +_@@ +_#######* _@ +_########* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *### _@ +_########* _@ +_########* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +_ *#####* _@ +_ *#######* _@ +_ ###***### _@ +_ ##* *## _@ +_ ##* *## _@ +_ ###* _@ +_ *######* _@ +_ *######* _@ +_ ****### _@ +_ ##* *## _@ +_ ##* *## _@ +_ ###***### _@ +_ *#######* _@ +_ *#####* _@ +_ _@ +_@@ +_######### _@ +_######### _@ +_***###*** _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ _@ +_@@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_### ### _@ +_*##* *##* _@ +_ ###*### _@ +_ *#####* _@ +_ ##### _@ +_ *###* _@ +_ ##* _@ +_ _@ +_@@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##*###*## _@ +_##*###*## _@ +_######### _@ +_######### _@ +_####*#### _@ +_###* *### _@ +_### ### _@ +_##* *## _@ +_ _@ +_@@ +_##* *## _@ +_### ### _@ +_###* *### _@ +_*### ###* _@ +_ ###*### _@ +_ *#####* _@ +_ ##### _@ +_ ##### _@ +_ *#####* _@ +_ ###*### _@ +_*### ###* _@ +_###* *### _@ +_### ### _@ +_##* *## _@ +_ _@ +_@@ +_##* ##* _@ +_##* ##* _@ +_##* ##* _@ +_##* *##* _@ +_### *##* _@ +_###**###* _@ +_*######* _@ +_ *####* _@ +_ *##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ _@ +_@@ +_######### _@ +_######### _@ +_*****###* _@ +_ *###* _@ +_ ###* _@ +_ *### _@ +_ ###* _@ +_ *### _@ +_ ###* _@ +_ *### _@ +_*###* _@ +_*###***** _@ +_######### _@ +_######### _@ +_ _@ +_@@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_###** _@ +_#####* _@ +_#####* _@ +_ _@ +_ _@ +_@@ +_*#* _@ +_###* _@ +_*##* _@ +_*###* _@ +_ *##* _@ +_ ###* _@ +_ *### _@ +_ ###* _@ +_ *### _@ +_ *##* _@ +_ *###* _@ +_ *##* _@ +_ *### _@ +_ *#* _@ +_ _@ +_@@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_***##* _@ +_#####* _@ +_#####* _@ +_ _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ *#* _@ +_*###* _@ +_##*## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_********** _@ +_########## _@ +_########## _@ +_ _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_*#* _@ +_###* _@ +_ *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_##* *## _@ +_##* *## _@ +_##***## _@ +_####### _@ +_####### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_#####* _@ +_######* _@ +_##**### _@ +_##* *## _@ +_####### _@ +_######* _@ +_##**### _@ +_##* *## _@ +_##**### _@ +_######* _@ +_#####* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_##* *## _@ +_##* *## _@ +_##* _@ +_##* _@ +_##* *## _@ +_###*### _@ +_*#####* _@ +_ *###* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_#####* _@ +_######* _@ +_##*#### _@ +_##* ### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* ### _@ +_##*#### _@ +_######* _@ +_#####* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_####### _@ +_#######* _@ +_##***** _@ +_##* _@ +_###### _@ +_###### _@ +_##**** _@ +_##* _@ +_##***** _@ +_#######* _@ +_####### _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_####### _@ +_#######* _@ +_##***** _@ +_##* _@ +_###### _@ +_###### _@ +_##**** _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_##* *## _@ +_##*#### _@ +_##*#### _@ +_##***## _@ +_##* *## _@ +_###*### _@ +_*###### _@ +_ *##### _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_####### _@ +_####### _@ +_##***## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_####### _@ +_####### _@ +_***##** _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_***##** _@ +_####### _@ +_####### _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ *#### _@ +_ *#### _@ +_ ***## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_##* *## _@ +_###*### _@ +_*#####* _@ +_ *###* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_##* *## _@ +_##* *## _@ +_##**### _@ +_##**##* _@ +_#####* _@ +_#####* _@ +_##*### _@ +_##**##* _@ +_##* ### _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##***** _@ +_#######* _@ +_####### _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_##* *## _@ +_### ### _@ +_###*### _@ +_####### _@ +_####### _@ +_####### _@ +_####### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_##* *## _@ +_### *## _@ +_###**## _@ +_####*## _@ +_####*## _@ +_####### _@ +_##*#### _@ +_##*#### _@ +_##**### _@ +_##* ### _@ +_##* *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*#####* _@ +_ *###* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_#####* _@ +_######* _@ +_##**### _@ +_##* *## _@ +_####### _@ +_######* _@ +_##**** _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##***## _@ +_##*#### _@ +_####### _@ +_*###### _@ +_ *####* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_#####* _@ +_######* _@ +_##**### _@ +_##* *## _@ +_####### _@ +_######* _@ +_##**### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_##* *## _@ +_#####* _@ +_*#####* _@ +_ ***### _@ +_##* *## _@ +_###*### _@ +_*#####* _@ +_ *###* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_####### _@ +_####### _@ +_***##** _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*#####* _@ +_ *###* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*#####* _@ +_ ##### _@ +_ *###* _@ +_ *#* _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_####### _@ +_####### _@ +_####### _@ +_####### _@ +_###*### _@ +_### ### _@ +_##* *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_##* *## _@ +_##* *## _@ +_*##*##* _@ +_*#####* _@ +_ ##### _@ +_ *###* _@ +_ ##### _@ +_*#####* _@ +_*##*##* _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_### ##* _@ +_### ##* _@ +_### *##* _@ +_###**##* _@ +_*###### _@ +_ *####* _@ +_ *##* _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_####### _@ +_####### _@ +_****##* _@ +_ ###* _@ +_ *##* _@ +_ ### _@ +_ *##* _@ +_*### _@ +_*##**** _@ +_####### _@ +_####### _@ +_ _@ +_@@ +_ ##* _@ +_ *##* _@ +_*###* _@ +_*###* _@ +_ *##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ####* _@ +_ *#### _@ +_ *### _@ +_ _@ +_ _@ +_@@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_ _@ +_ _@ +_@@ +_ ##* _@ +_ ##* _@ +_ ###* _@ +_ ###* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ *##* _@ +_*###* _@ +_###* _@ +_##* _@ +_ _@ +_ _@ +_@@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ **** _@ +_*#####*#* _@ +_######### _@ +_*****###* _@ +_ _@ +_@@ +_ *##* _@ +_ *####* _@ +_*######* _@ +_#### ###* _@ +_###* *##* _@ +_### *##* _@ +_### *##* _@ +_###***##* _@ +_########* _@ +_########* _@ +_###* *##* _@ +_### *##* _@ +_### *##* _@ +_### ##* _@ +_ _@ +_@@ +_ *####* _@ +_*######* _@ +_####*###* _@ +_###* *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_###* *##* _@ +_####*###* _@ +_*######* _@ +_ *####* _@ +_ _@ +_@@ +_### ##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_###* *##* _@ +_####*###* _@ +_*######* _@ +_ *####* _@ +_ _@ +_@@ +_ _@ +_ *# *# _@ +_ * * _@ +_ *###* _@ +_*#####* _@ +_####### _@ +_### *## _@ +_##* *## _@ +_##***## _@ +_####### _@ +_####### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +_ _@ +_ *# *# _@ +_ * * _@ +_ *####* _@ +_*###### _@ +_###*### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*###### _@ +_ *####* _@ +_ _@ +_@@ +_ _@ +_ *# *# _@ +_ * * _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*###### _@ +_ *####* _@ +_ _@ +_@@ +_##* *## _@ +_##* *### _@ +_########* _@ +_########* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *### _@ +_##* *###* _@ +_##**###* _@ +_ *###* _@ +_ ###* _@ +_ *#* _@ +_ _@ +_ _@ +_@@ +0x45e EXT +_ *## _@ +_ *## _@ +_ *####* _@ +_#######* _@ +_###**##* _@ +_### ##* _@ +_### _@ +_### _@ +_### ##* _@ +_###**##* _@ +_#######* _@ +_*#####* _@ +_ *#### _@ +_ *## _@ +_ _@ +_@@ +0x408 EXT +_ *#####* _@ +_ *#######* _@ +_ ###***### _@ +_ ##* *## _@ +_ ##* *## _@ +_*##* _@ +_####### _@ +_####### _@ +_*###*** _@ +_ ##* _@ +_ ##* _@ +_*###*** _@ +_####### _@ +_####### _@ +_ _@ +_@@ +0x490 EXT +_##* *## _@ +_##* *## _@ +_##* *## _@ +_### *### _@ +_###**#### _@ +_*####### _@ +_ *##### _@ +_ *### _@ +_ ###### _@ +_ ###### _@ +_ **##** _@ +_ ###### _@ +_ ###### _@ +_ **##** _@ +_ _@ +_@@ +0xa4 EXT +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_##**## _@ +_###### _@ +_*#**#* _@ +_*#**#* _@ +_###### _@ +_##**## _@ +_ _@ +_@@ +0x2030 EXT +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ #****# _@ +_ ###### _@ +_ _@ +_@@ +0x457 EXT +_ ##* _@ +_ ##* _@ +_ ** _@ +_ *** _@ +_ *##* _@ +_ *###* _@ +_ *##### _@ +_*#####* _@ +_###*** _@ +_##* *## _@ +_##* *## _@ +_####*#### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +0x40e EXT +_##* _@ +_##* _@ +_** _@ +_ _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* _@ +_ _@ +_@@ +0xa7 EXT +_### *## _@ +_####* _@ +_*#####* _@ +_####### _@ +_##***## _@ +_##***## _@ +_####### _@ +_*#####* _@ +_ *#### _@ +_##**### _@ +_###*### _@ +_*#####* _@ +_ *####* _@ +_ _@ +_ _@ +_@@ +0xb6 EXT +_ *############# _@ +_ *############## _@ +_*########***###* _@ +_*########* ##* _@ +_*########* ##* _@ +_*########* ##* _@ +_ *#######* ##* _@ +_ *######* ##* _@ +_ *##* ##* _@ +_ ##* ##* _@ +_ ##* ##* _@ +_ ##* ##* _@ +_ ##* ##* _@ +_ ##* ##* _@ +_ _@ +_@@ +0xb5 EXT +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_######### _@ +_########* _@ +_##* _@ +_##* _@ +_##* _@ +_ _@ +_ _@ +_@@ +0xa9 EXT +_ _@ +_ _@ +_ _@ +_ _@ +_ *####** _@ +_ *#######* _@ +_ ##*#####* _@ +_*#**#**#*# _@ +_*# *# ***# _@ +_*#**#**#*# _@ +_ ## ###*## _@ +_ *##***##* _@ +_ *#####* _@ +_ *** _@ +_ _@ +_@@ +0xae EXT +_ _@ +_ _@ +_ _@ +_ _@ +_ *####** _@ +_ *##***##* _@ +_ ##*###*#* _@ +_*#* #*# *# _@ +_*# ### *# _@ +_*#* #*# *# _@ +_ ## # #*## _@ +_ *##* ###* _@ +_ *#####* _@ +_ *** _@ +_ _@ +_@@ +0x45b EXT +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ #****# _@ +_ ###### _@ +_ _@ +_@@ +0x40a EXT +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ # *# _@ +_ #****# _@ +_ ###### _@ +_ _@ +_@@ +0x42f EXT +_##* *## _@ +_##* *### _@ +_########* _@ +_########* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *### _@ +_##* *###* _@ +_##**###* _@ +_ *###* _@ +_ ###* _@ +_ *#* _@ +_ _@ +_ _@ +_@@ +0x410 EXT +_ *###* _@ +_ *#####* _@ +_*###*###* _@ +_###* *### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_######### _@ +_######### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +0x411 EXT +_ *###* _@ +_ *#####* _@ +_*###*###* _@ +_###* *### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_######### _@ +_######### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +0x412 EXT +_ *###* _@ +_ *#####* _@ +_*###*###* _@ +_###* *### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_######### _@ +_######### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +0x413 EXT +_ *###* _@ +_ *#####* _@ +_*###*###* _@ +_###* *### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_######### _@ +_######### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +0x414 EXT +_ *##* _@ +_ *####* _@ +_*######* _@ +_#### ###* _@ +_###* *##* _@ +_### *##* _@ +_### *##* _@ +_###***##* _@ +_########* _@ +_########* _@ +_###* *##* _@ +_### *##* _@ +_### *##* _@ +_### ##* _@ +_ _@ +_@@ +0x415 EXT +_ *###* _@ +_ *#####* _@ +_*###*###* _@ +_###* *### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_######### _@ +_######### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +0x416 EXT +_ *###*######### _@ +_ *############## _@ +_*###*####******* _@ +_###* *### _@ +_##* *## _@ +_##* *##* _@ +_##* *####### _@ +_###***######## _@ +_#########***** _@ +_######### _@ +_##* *## _@ +_##* *##******* _@ +_##* *######### _@ +_##* *######### _@ +_ _@ +_@@ +0x417 EXT +_##* *##* _@ +_##* ##* _@ +_##* ##* _@ +_##* _@ +_##* _@ +_##* _@ +_##* ##* _@ +_##* *##* _@ +_###**###* _@ +_*######* _@ +_ *####* _@ +_ ##* _@ +_ ##* _@ +_ _@ +_ _@ +_@@ +0x418 EXT +_######### _@ +_######### _@ +_###****** _@ +_##* _@ +_##* _@ +_##* _@ +_#######* _@ +_#######* _@ +_###**** _@ +_##* _@ +_##* _@ +_###****** _@ +_######### _@ +_######### _@ +_ _@ +_@@ +0x419 EXT +_######### _@ +_######### _@ +_###****** _@ +_##* _@ +_##* _@ +_##* _@ +_#######* _@ +_#######* _@ +_###**** _@ +_##* _@ +_##* _@ +_###****** _@ +_######### _@ +_######### _@ +_ _@ +_@@ +0x41a EXT +_######### _@ +_######### _@ +_###****** _@ +_##* _@ +_##* _@ +_##* _@ +_####### _@ +_####### _@ +_###**** _@ +_##* _@ +_##* _@ +_###****** _@ +_######### _@ +_######### _@ +_ _@ +_@@ +0x41b EXT +_#########* _@ +_#########* _@ +_###******* _@ +_### _@ +_### _@ +_###* _@ +_######## _@ +_######## _@ +_###***** _@ +_### _@ +_### _@ +_###******* _@ +_#########* _@ +_#########* _@ +_ _@ +_@@ +0x41c EXT +_######### _@ +_######### _@ +_***###*** _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_***###*** _@ +_######### _@ +_######### _@ +_ _@ +_@@ +0x41d EXT +_######### _@ +_######### _@ +_***###*** _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_***###*** _@ +_######### _@ +_######### _@ +_ _@ +_@@ +0x41e EXT +_######### _@ +_######### _@ +_***###*** _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_***###*** _@ +_######### _@ +_######### _@ +_ _@ +_@@ +0x41f EXT +_######### _@ +_######### _@ +_***###*** _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_ ##* _@ +_***###*** _@ +_######### _@ +_######### _@ +_ _@ +_@@ +0x420 EXT +_ *#####* _@ +_ *######* _@ +_ *##**###* _@ +_ *## *###* _@ +_ *## *##* _@ +_ *## ##* _@ +_###### ##* _@ +_###### ##* _@ +_**##** ##* _@ +_ *## *##* _@ +_ *## *###* _@ +_ *##**###* _@ +_ *######* _@ +_ *#####* _@ +_ _@ +_@@ +0x421 EXT +_##* *## _@ +_### *## _@ +_###* *## _@ +_####* *## _@ +_####* *## _@ +_#####**## _@ +_######*## _@ +_##*###### _@ +_##**##### _@ +_##* ##### _@ +_##* *#### _@ +_##* *### _@ +_##* ### _@ +_##* *## _@ +_ _@ +_@@ +0x422 EXT +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_####*#### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +0x423 EXT +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_####*#### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +0x424 EXT +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +0x425 EXT +_ *#####* _@ +_*#######* _@ +_###***### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +0x426 EXT +_ *####* _@ +_*######* _@ +_####*###* _@ +_###* *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_###* *##* _@ +_####*###* _@ +_*######* _@ +_ *####* _@ +_ _@ +_@@ +0x427 EXT +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_*#* *#* _@ +_###*### _@ +_*#####* _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_*#* *#* _@ +_ _@ +_@@ +0x428 EXT +_ *######* _@ +_*######## _@ +_###**#### _@ +_##* *#### _@ +_##* ##### _@ +_##**##### _@ +_##*###### _@ +_######*## _@ +_#####**## _@ +_##### *## _@ +_####* *## _@ +_####**### _@ +_########* _@ +_*######* _@ +_ _@ +_@@ +0x429 EXT +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_####*#### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +0x42a EXT +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_####*#### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +0x42b EXT +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###***### _@ +_*#######* _@ +_ *#####* _@ +_ _@ +_@@ +0x42c EXT +_### ##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_### *##* _@ +_###* *##* _@ +_####*###* _@ +_*######* _@ +_ *####* _@ +_ _@ +_@@ +0x430 EXT +_ ##* _@ +_ ### _@ +_ ** _@ +_ *###* _@ +_*#####* _@ +_####### _@ +_##* *## _@ +_##* *## _@ +_##***## _@ +_####### _@ +_####### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +0x431 EXT +_ *## _@ +_ ### _@ +_ ** _@ +_ *###* _@ +_*#####* _@ +_####### _@ +_##* *## _@ +_##* *## _@ +_##***## _@ +_####### _@ +_####### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +0x432 EXT +_ *##* _@ +_ #*## _@ +_ _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_##* *## _@ +_##* *## _@ +_##***## _@ +_####### _@ +_####### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +0x433 EXT +_####### _@ +_*#*#### _@ +_ *** _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_##* *## _@ +_##* *## _@ +_##***## _@ +_####### _@ +_####### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +0x434 EXT +_ _@ +_ *# *# _@ +_ * * _@ +_ *###* _@ +_*#####* _@ +_####### _@ +_### *## _@ +_##* *## _@ +_##***## _@ +_####### _@ +_####### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_ _@ +_@@ +0x435 EXT +_ *## _@ +_ *## _@ +_ _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_##* *## _@ +_##* ## _@ +_##***## _@ +_####### _@ +_####### _@ +_##* *## _@ +_##* ## _@ +_##* ## _@ +_ _@ +_@@ +0x436 EXT +_ _@ +_ _@ +_ _@ +_ *##########* _@ +_*###########* _@ +_###*###***** _@ +_##* *##* _@ +_##* ###### _@ +_##***###### _@ +_#######**** _@ +_#######* _@ +_##* *##***** _@ +_##* #######* _@ +_##* #######* _@ +_ _@ +_@@ +0x437 EXT +_ *####* _@ +_*###### _@ +_###*###* _@ +_### *##* _@ +_### ##* _@ +_### _@ +_### _@ +_### ##* _@ +_###**##* _@ +_#######* _@ +_ *####* _@ +_ *## _@ +_ *## _@ +_ _@ +_ _@ +_@@ +0x438 EXT +_ ##* _@ +_ *## _@ +_ ** _@ +_####### _@ +_#######* _@ +_##***** _@ +_##* _@ +_###### _@ +_###### _@ +_##**** _@ +_##* _@ +_##***** _@ +_#######* _@ +_####### _@ +_ _@ +_@@ +0x439 EXT +_ *## _@ +_ ##* _@ +_ ** _@ +_####### _@ +_#######* _@ +_##***** _@ +_##* _@ +_###### _@ +_###### _@ +_##**** _@ +_##* _@ +_##***** _@ +_#######* _@ +_####### _@ +_ _@ +_@@ +0x43a EXT +_ *##* _@ +_ #*## _@ +_ _@ +_####### _@ +_#######* _@ +_##***** _@ +_##* _@ +_###### _@ +_###### _@ +_##**** _@ +_##* _@ +_##***** _@ +_#######* _@ +_####### _@ +_ _@ +_@@ +0x43b EXT +_ _@ +_ *# *# _@ +_ * * _@ +_####### _@ +_#######* _@ +_##***** _@ +_##* _@ +_###### _@ +_###### _@ +_##**** _@ +_##* _@ +_##***** _@ +_#######* _@ +_####### _@ +_ _@ +_@@ +0x43c EXT +_ ##* _@ +_ *## _@ +_ ** _@ +_####### _@ +_####### _@ +_***##** _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_***##** _@ +_####### _@ +_####### _@ +_ _@ +_@@ +0x43d EXT +_ *## _@ +_ ##* _@ +_ ** _@ +_####### _@ +_####### _@ +_***##** _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_***##** _@ +_####### _@ +_####### _@ +_ _@ +_@@ +0x43e EXT +_ *##* _@ +_ #*## _@ +_ _@ +_####### _@ +_####### _@ +_***##** _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_***##** _@ +_####### _@ +_####### _@ +_ _@ +_@@ +0x43f EXT +_ _@ +_ *# *# _@ +_ * * _@ +_####### _@ +_####### _@ +_***##** _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_ *## _@ +_***##** _@ +_####### _@ +_####### _@ +_ _@ +_@@ +0x440 EXT +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ ## * _@ +_ *# ** _@ +_*#**#*#*# * _@ +_ #**#####*# _@ +_ # ######## _@ +_ ##*##**### _@ +_ *### _@ +_ _@ +_ _@ +_@@ +0x441 EXT +_####### _@ +_*#*#### _@ +_ *** _@ +_##* *## _@ +_### *## _@ +_###**## _@ +_####*## _@ +_####*## _@ +_####### _@ +_##*#### _@ +_##*#### _@ +_##**### _@ +_##* ### _@ +_##* *## _@ +_ _@ +_@@ +0x442 EXT +_ ##* _@ +_ *## _@ +_ ** _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*#####* _@ +_ *###* _@ +_ _@ +_@@ +0x443 EXT +_ *## _@ +_ ##* _@ +_ ** _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*#####* _@ +_ *###* _@ +_ _@ +_@@ +0x444 EXT +_ *##* _@ +_ #*## _@ +_ _@ +_ *#### _@ +_*###### _@ +_###*### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*###### _@ +_ *#### _@ +_ _@ +_@@ +0x445 EXT +_####### _@ +_*#*#### _@ +_ *** _@ +_ *###* _@ +_*#####* _@ +_###*### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*#####* _@ +_ *###* _@ +_ _@ +_@@ +0x446 EXT +_ _@ +_ *# *# _@ +_ * * _@ +_ *####* _@ +_*###### _@ +_###*### _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*###### _@ +_ *####* _@ +_ _@ +_@@ +0x447 EXT +_ _@ +_ _@ +_ _@ +_ _@ +_ _@ +_ ##* _@ +_ ##* _@ +_ *** _@ +_********* _@ +_######### _@ +_######### _@ +_ *** _@ +_ ##* _@ +_ ##* _@ +_ _@ +_@@ +0x448 EXT +_ _@ +_ _@ +_ _@ +_ *##### _@ +_*###### _@ +_###*### _@ +_##*#### _@ +_##*#### _@ +_####### _@ +_####*## _@ +_####*## _@ +_###*### _@ +_######* _@ +_#####* _@ +_ _@ +_@@ +0x449 EXT +_ ##* _@ +_ *## _@ +_ ** _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*#####* _@ +_ *###* _@ +_ _@ +_@@ +0x44a EXT +_ *## _@ +_ ##* _@ +_ ** _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*#####* _@ +_ *###* _@ +_ _@ +_@@ +0x44b EXT +_ *##* _@ +_ #*## _@ +_ _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*###### _@ +_ *#### _@ +_ _@ +_@@ +0x44c EXT +_ _@ +_ *# *# _@ +_ * * _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_##* *## _@ +_###*### _@ +_*###### _@ +_ *####* _@ +_ _@ +_@@ diff --git a/externals/phpmailer/class.phpmailer-lite.php b/externals/phpmailer/class.phpmailer-lite.php index 824878d074..335625ebad 100644 --- a/externals/phpmailer/class.phpmailer-lite.php +++ b/externals/phpmailer/class.phpmailer-lite.php @@ -42,6 +42,102 @@ class PHPMailerLite { + public static function newFromMessage( + PhabricatorMailExternalMessage $message) { + + $mailer = new self($use_exceptions = true); + + // By default, PHPMailerLite sends one mail per recipient. We handle + // combining or separating To and Cc higher in the stack, so tell it to + // send mail exactly like we ask. + $mailer->SingleTo = false; + + $mailer->CharSet = 'utf-8'; + $mailer->Encoding = 'base64'; + + $subject = $message->getSubject(); + if ($subject !== null) { + $mailer->Subject = $subject; + } + + $from_address = $message->getFromAddress(); + if ($from_address) { + $mailer->SetFrom( + $from_address->getAddress(), + (string)$from_address->getDisplayName(), + $crazy_side_effects = false); + } + + $reply_address = $message->getReplyToAddress(); + if ($reply_address) { + $mailer->AddReplyTo( + $reply_address->getAddress(), + (string)$reply_address->getDisplayName()); + } + + $to_addresses = $message->getToAddresses(); + if ($to_addresses) { + foreach ($to_addresses as $address) { + $mailer->AddAddress( + $address->getAddress(), + (string)$address->getDisplayName()); + } + } + + $cc_addresses = $message->getCCAddresses(); + if ($cc_addresses) { + foreach ($cc_addresses as $address) { + $mailer->AddCC( + $address->getAddress(), + (string)$address->getDisplayName()); + } + } + + $headers = $message->getHeaders(); + if ($headers) { + foreach ($headers as $header) { + $name = $header->getName(); + $value = $header->getValue(); + + if (phutil_utf8_strtolower($name) === 'message-id') { + $mailer->MessageID = $value; + } else { + $mailer->AddCustomHeader("{$name}: {$value}"); + } + } + } + + $attachments = $message->getAttachments(); + if ($attachments) { + foreach ($attachments as $attachment) { + $mailer->AddStringAttachment( + $attachment->getData(), + $attachment->getFilename(), + 'base64', + $attachment->getMimeType()); + } + } + + $text_body = $message->getTextBody(); + if ($text_body !== null) { + $mailer->Body = $text_body; + } + + $html_body = $message->getHTMLBody(); + if ($html_body !== null) { + $mailer->IsHTML(true); + $mailer->Body = $html_body; + if ($text_body !== null) { + $mailer->AltBody = $text_body; + } + } + + return $mailer; + } + + + + ///////////////////////////////////////////////// // PROPERTIES, PUBLIC ///////////////////////////////////////////////// @@ -491,13 +587,7 @@ public function Send() { switch($this->Mailer) { case 'amazon-ses': - $toArr = array(); - foreach($this->to as $t) { - $toArr[] = $this->AddrFormat($t); - } - $to = implode(', ', $toArr); return $this->customMailer->executeSend( - "To: ".$to."\n". $header. $body); @@ -662,6 +752,10 @@ public function AddrAppend($type, $addr) { $addr_str .= implode(', ', $addresses); $addr_str .= $this->LE; + // NOTE: This is a narrow hack to fix an issue with 1000+ characters of + // recipients, described in T12372. + $addr_str = wordwrap($addr_str, 75, "\n "); + return $addr_str; } diff --git a/externals/phpmailer/class.phpmailer.php b/externals/phpmailer/class.phpmailer.php index f616c76fef..69f9c45ba5 100644 --- a/externals/phpmailer/class.phpmailer.php +++ b/externals/phpmailer/class.phpmailer.php @@ -221,7 +221,7 @@ class PHPMailer { * This function will not work with the win32 version. * @var int */ - public $Timeout = 10; + public $Timeout = 60; /** * Sets SMTP class debugging on or off. @@ -1110,8 +1110,6 @@ public function CreateHeader() { if($this->MessageID != '') { $result .= $this->HeaderLine('Message-ID',$this->MessageID); - } else { - $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE); } $result .= $this->HeaderLine('X-Priority', $this->Priority); $result .= $this->HeaderLine('X-Mailer', 'PHPMailer '.$this->Version.' (phpmailer.sourceforge.net)'); diff --git a/externals/phpqrcode/LICENSE b/externals/phpqrcode/LICENSE new file mode 100644 index 0000000000..1883303261 --- /dev/null +++ b/externals/phpqrcode/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/externals/phpqrcode/README b/externals/phpqrcode/README new file mode 100644 index 0000000000..a022fb5e72 --- /dev/null +++ b/externals/phpqrcode/README @@ -0,0 +1,45 @@ +This is PHP implementation of QR Code 2-D barcode generator. It is pure-php +LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi. + +== LICENSING == + +Copyright (C) 2010 by Dominik Dzienia + +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or any later version. + +This library is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU Lesser General Public License (LICENSE file) +for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this library; if not, write to the Free Software Foundation, Inc., 51 +Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +== INSTALATION AND USAGE == + + * INSTALL file + * http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page + +== CONTACT == + +Fell free to contact me via e-mail (deltalab at poczta dot fm) or using +folowing project pages: + + * http://sourceforge.net/projects/phpqrcode/ + * http://phpqrcode.sourceforge.net/ + +== ACKNOWLEDGMENTS == + +Based on C libqrencode library (ver. 3.1.1) +Copyright (C) 2006-2010 by Kentaro Fukuchi +http://megaui.net/fukuchi/works/qrencode/index.en.html + +QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other +countries. + +Reed-Solomon code encoder is written by Phil Karn, KA9Q. +Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q + \ No newline at end of file diff --git a/externals/phpqrcode/VERSION b/externals/phpqrcode/VERSION new file mode 100644 index 0000000000..9f99279ea0 --- /dev/null +++ b/externals/phpqrcode/VERSION @@ -0,0 +1,2 @@ +1.1.4 +2010100721 \ No newline at end of file diff --git a/externals/phpqrcode/phpqrcode.php b/externals/phpqrcode/phpqrcode.php new file mode 100644 index 0000000000..54cde3ee9e --- /dev/null +++ b/externals/phpqrcode/phpqrcode.php @@ -0,0 +1,3312 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +/* + * Version: 1.1.4 + * Build: 2010100721 + */ + + + +//---- qrconst.php ----------------------------- + + + + + +/* + * PHP QR Code encoder + * + * Common constants + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + // Encoding modes + + define('QR_MODE_NUL', -1); + define('QR_MODE_NUM', 0); + define('QR_MODE_AN', 1); + define('QR_MODE_8', 2); + define('QR_MODE_KANJI', 3); + define('QR_MODE_STRUCTURE', 4); + + // Levels of error correction. + + define('QR_ECLEVEL_L', 0); + define('QR_ECLEVEL_M', 1); + define('QR_ECLEVEL_Q', 2); + define('QR_ECLEVEL_H', 3); + + // Supported output formats + + define('QR_FORMAT_TEXT', 0); + define('QR_FORMAT_PNG', 1); + + class qrstr { + public static function set(&$srctab, $x, $y, $repl, $replLen = false) { + $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); + } + } + + + +//---- merged_config.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Config file, tuned-up for merged verion + */ + + define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there + define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true + define('QR_LOG_DIR', false); // default error logs dir + + define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code + define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly + define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false + + define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images + + + + +//---- qrtools.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Toolset, handy and debug utilites. + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRtools { + + //---------------------------------------------------------------------- + public static function binarize($frame) + { + $len = count($frame); + foreach ($frame as &$frameLine) { + + for($i=0; $i<$len; $i++) { + $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; + } + } + + return $frame; + } + + //---------------------------------------------------------------------- + public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037') + { + $barcode_array = array(); + + if (!is_array($mode)) + $mode = explode(',', $mode); + + $eccLevel = 'L'; + + if (count($mode) > 1) { + $eccLevel = $mode[1]; + } + + $qrTab = QRcode::text($code, false, $eccLevel); + $size = count($qrTab); + + $barcode_array['num_rows'] = $size; + $barcode_array['num_cols'] = $size; + $barcode_array['bcode'] = array(); + + foreach ($qrTab as $line) { + $arrAdd = array(); + foreach(str_split($line) as $char) + $arrAdd[] = ($char=='1')?1:0; + $barcode_array['bcode'][] = $arrAdd; + } + + return $barcode_array; + } + + //---------------------------------------------------------------------- + public static function clearCache() + { + self::$frames = array(); + } + + //---------------------------------------------------------------------- + public static function buildCache() + { + QRtools::markTime('before_build_cache'); + + $mask = new QRmask(); + for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) { + $frame = QRspec::newFrame($a); + if (QR_IMAGE) { + $fileName = QR_CACHE_DIR.'frame_'.$a.'.png'; + QRimage::png(self::binarize($frame), $fileName, 1, 0); + } + + $width = count($frame); + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + for ($maskNo=0; $maskNo<8; $maskNo++) + $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); + } + + QRtools::markTime('after_build_cache'); + } + + //---------------------------------------------------------------------- + public static function log($outfile, $err) + { + if (QR_LOG_DIR !== false) { + if ($err != '') { + if ($outfile !== false) { + file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } else { + file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } + } + } + } + + //---------------------------------------------------------------------- + public static function dumpMask($frame) + { + $width = count($frame); + for($y=0;$y<$width;$y++) { + for($x=0;$x<$width;$x++) { + echo ord($frame[$y][$x]).','; + } + } + } + + //---------------------------------------------------------------------- + public static function markTime($markerId) + { + list($usec, $sec) = explode(" ", microtime()); + $time = ((float)$usec + (float)$sec); + + if (!isset($GLOBALS['qr_time_bench'])) + $GLOBALS['qr_time_bench'] = array(); + + $GLOBALS['qr_time_bench'][$markerId] = $time; + } + + //---------------------------------------------------------------------- + public static function timeBenchmark() + { + self::markTime('finish'); + + $lastTime = 0; + $startTime = 0; + $p = 0; + + echo ' + + '; + + foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) { + if ($p > 0) { + echo ''; + } else { + $startTime = $thisTime; + } + + $p++; + $lastTime = $thisTime; + } + + echo ' + + +
    BENCHMARK
    till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s
    TOTAL: '.number_format($lastTime-$startTime, 6).'s
    '; + } + + } + + //########################################################################## + + QRtools::markTime('start'); + + + + +//---- qrspec.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * QR Code specifications + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QRSPEC_VERSION_MAX', 40); + define('QRSPEC_WIDTH_MAX', 177); + + define('QRCAP_WIDTH', 0); + define('QRCAP_WORDS', 1); + define('QRCAP_REMINDER', 2); + define('QRCAP_EC', 3); + + class QRspec { + + public static $capacity = array( + array( 0, 0, 0, array( 0, 0, 0, 0)), + array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 + array( 25, 44, 7, array( 10, 16, 22, 28)), + array( 29, 70, 7, array( 15, 26, 36, 44)), + array( 33, 100, 7, array( 20, 36, 52, 64)), + array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 + array( 41, 172, 7, array( 36, 64, 96, 112)), + array( 45, 196, 0, array( 40, 72, 108, 130)), + array( 49, 242, 0, array( 48, 88, 132, 156)), + array( 53, 292, 0, array( 60, 110, 160, 192)), + array( 57, 346, 0, array( 72, 130, 192, 224)), //10 + array( 61, 404, 0, array( 80, 150, 224, 264)), + array( 65, 466, 0, array( 96, 176, 260, 308)), + array( 69, 532, 0, array( 104, 198, 288, 352)), + array( 73, 581, 3, array( 120, 216, 320, 384)), + array( 77, 655, 3, array( 132, 240, 360, 432)), //15 + array( 81, 733, 3, array( 144, 280, 408, 480)), + array( 85, 815, 3, array( 168, 308, 448, 532)), + array( 89, 901, 3, array( 180, 338, 504, 588)), + array( 93, 991, 3, array( 196, 364, 546, 650)), + array( 97, 1085, 3, array( 224, 416, 600, 700)), //20 + array(101, 1156, 4, array( 224, 442, 644, 750)), + array(105, 1258, 4, array( 252, 476, 690, 816)), + array(109, 1364, 4, array( 270, 504, 750, 900)), + array(113, 1474, 4, array( 300, 560, 810, 960)), + array(117, 1588, 4, array( 312, 588, 870, 1050)), //25 + array(121, 1706, 4, array( 336, 644, 952, 1110)), + array(125, 1828, 4, array( 360, 700, 1020, 1200)), + array(129, 1921, 3, array( 390, 728, 1050, 1260)), + array(133, 2051, 3, array( 420, 784, 1140, 1350)), + array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30 + array(141, 2323, 3, array( 480, 868, 1290, 1530)), + array(145, 2465, 3, array( 510, 924, 1350, 1620)), + array(149, 2611, 3, array( 540, 980, 1440, 1710)), + array(153, 2761, 3, array( 570, 1036, 1530, 1800)), + array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 + array(161, 3034, 0, array( 600, 1120, 1680, 1980)), + array(165, 3196, 0, array( 630, 1204, 1770, 2100)), + array(169, 3362, 0, array( 660, 1260, 1860, 2220)), + array(173, 3532, 0, array( 720, 1316, 1950, 2310)), + array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 + ); + + //---------------------------------------------------------------------- + public static function getDataLength($version, $level) + { + return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getECCLength($version, $level) + { + return self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getWidth($version) + { + return self::$capacity[$version][QRCAP_WIDTH]; + } + + //---------------------------------------------------------------------- + public static function getRemainder($version) + { + return self::$capacity[$version][QRCAP_REMINDER]; + } + + //---------------------------------------------------------------------- + public static function getMinimumVersion($size, $level) + { + + for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { + $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; + if($words >= $size) + return $i; + } + + return -1; + } + + //###################################################################### + + public static $lengthTableBits = array( + array(10, 12, 14), + array( 9, 11, 13), + array( 8, 16, 16), + array( 8, 10, 12) + ); + + //---------------------------------------------------------------------- + public static function lengthIndicator($mode, $version) + { + if ($mode == QR_MODE_STRUCTURE) + return 0; + + if ($version <= 9) { + $l = 0; + } else if ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + return self::$lengthTableBits[$mode][$l]; + } + + //---------------------------------------------------------------------- + public static function maximumWords($mode, $version) + { + if($mode == QR_MODE_STRUCTURE) + return 3; + + if($version <= 9) { + $l = 0; + } else if($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + $bits = self::$lengthTableBits[$mode][$l]; + $words = (1 << $bits) - 1; + + if($mode == QR_MODE_KANJI) { + $words *= 2; // the number of bytes is required + } + + return $words; + } + + // Error correction code ----------------------------------------------- + // Table of the error correction code (Reed-Solomon block) + // See Table 12-16 (pp.30-36), JIS X0510:2004. + + public static $eccTable = array( + array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), + array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 + array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), + array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), + array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), + array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), + array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10 + array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), + array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), + array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), + array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), + array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15 + array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), + array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), + array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), + array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), + array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20 + array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), + array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), + array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), + array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), + array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25 + array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), + array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), + array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), + array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), + array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 + array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), + array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), + array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), + array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), + array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35 + array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), + array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), + array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), + array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), + array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40 + ); + + //---------------------------------------------------------------------- + // CACHEABLE!!! + + public static function getEccSpec($version, $level, array &$spec) + { + if (count($spec) < 5) { + $spec = array(0,0,0,0,0); + } + + $b1 = self::$eccTable[$version][$level][0]; + $b2 = self::$eccTable[$version][$level][1]; + $data = self::getDataLength($version, $level); + $ecc = self::getECCLength($version, $level); + + if($b2 == 0) { + $spec[0] = $b1; + $spec[1] = (int)($data / $b1); + $spec[2] = (int)($ecc / $b1); + $spec[3] = 0; + $spec[4] = 0; + } else { + $spec[0] = $b1; + $spec[1] = (int)($data / ($b1 + $b2)); + $spec[2] = (int)($ecc / ($b1 + $b2)); + $spec[3] = $b2; + $spec[4] = $spec[1] + 1; + } + } + + // Alignment pattern --------------------------------------------------- + + // Positions of alignment patterns. + // This array includes only the second and the third position of the + // alignment patterns. Rest of them can be calculated from the distance + // between them. + + // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. + + public static $alignmentPattern = array( + array( 0, 0), + array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 + array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 + array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 + array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 + array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 + array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 + array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 + array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 + ); + + + /** -------------------------------------------------------------------- + * Put an alignment marker. + * @param frame + * @param width + * @param ox,oy center coordinate of the pattern + */ + public static function putAlignmentMarker(array &$frame, $ox, $oy) + { + $finder = array( + "\xa1\xa1\xa1\xa1\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa0\xa1\xa0\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa1\xa1\xa1\xa1" + ); + + $yStart = $oy-2; + $xStart = $ox-2; + + for($y=0; $y<5; $y++) { + QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function putAlignmentPattern($version, &$frame, $width) + { + if($version < 2) + return; + + $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; + if($d < 0) { + $w = 2; + } else { + $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); + } + + if($w * $w - 3 == 1) { + $x = self::$alignmentPattern[$version][0]; + $y = self::$alignmentPattern[$version][0]; + self::putAlignmentMarker($frame, $x, $y); + return; + } + + $cx = self::$alignmentPattern[$version][0]; + for($x=1; $x<$w - 1; $x++) { + self::putAlignmentMarker($frame, 6, $cx); + self::putAlignmentMarker($frame, $cx, 6); + $cx += $d; + } + + $cy = self::$alignmentPattern[$version][0]; + for($y=0; $y<$w-1; $y++) { + $cx = self::$alignmentPattern[$version][0]; + for($x=0; $x<$w-1; $x++) { + self::putAlignmentMarker($frame, $cx, $cy); + $cx += $d; + } + $cy += $d; + } + } + + // Version information pattern ----------------------------------------- + + // Version information pattern (BCH coded). + // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. + + // size: [QRSPEC_VERSION_MAX - 6] + + public static $versionPattern = array( + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, + 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, + 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, + 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, + 0x27541, 0x28c69 + ); + + //---------------------------------------------------------------------- + public static function getVersionPattern($version) + { + if($version < 7 || $version > QRSPEC_VERSION_MAX) + return 0; + + return self::$versionPattern[$version -7]; + } + + // Format information -------------------------------------------------- + // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) + + public static $formatInfo = array( + array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), + array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), + array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), + array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) + ); + + public static function getFormatInfo($mask, $level) + { + if($mask < 0 || $mask > 7) + return 0; + + if($level < 0 || $level > 3) + return 0; + + return self::$formatInfo[$level][$mask]; + } + + // Frame --------------------------------------------------------------- + // Cache of initial frames. + + public static $frames = array(); + + /** -------------------------------------------------------------------- + * Put a finder pattern. + * @param frame + * @param width + * @param ox,oy upper-left coordinate of the pattern + */ + public static function putFinderPattern(&$frame, $ox, $oy) + { + $finder = array( + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" + ); + + for($y=0; $y<7; $y++) { + QRstr::set($frame, $ox, $oy+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function createFrame($version) + { + $width = self::$capacity[$version][QRCAP_WIDTH]; + $frameLine = str_repeat ("\0", $width); + $frame = array_fill(0, $width, $frameLine); + + // Finder pattern + self::putFinderPattern($frame, 0, 0); + self::putFinderPattern($frame, $width - 7, 0); + self::putFinderPattern($frame, 0, $width - 7); + + // Separator + $yOffset = $width - 7; + + for($y=0; $y<7; $y++) { + $frame[$y][7] = "\xc0"; + $frame[$y][$width - 8] = "\xc0"; + $frame[$yOffset][7] = "\xc0"; + $yOffset++; + } + + $setPattern = str_repeat("\xc0", 8); + + QRstr::set($frame, 0, 7, $setPattern); + QRstr::set($frame, $width-8, 7, $setPattern); + QRstr::set($frame, 0, $width - 8, $setPattern); + + // Format info + $setPattern = str_repeat("\x84", 9); + QRstr::set($frame, 0, 8, $setPattern); + QRstr::set($frame, $width - 8, 8, $setPattern, 8); + + $yOffset = $width - 8; + + for($y=0; $y<8; $y++,$yOffset++) { + $frame[$y][8] = "\x84"; + $frame[$yOffset][8] = "\x84"; + } + + // Timing pattern + + for($i=1; $i<$width-15; $i++) { + $frame[6][7+$i] = chr(0x90 | ($i & 1)); + $frame[7+$i][6] = chr(0x90 | ($i & 1)); + } + + // Alignment pattern + self::putAlignmentPattern($version, $frame, $width); + + // Version information + if($version >= 7) { + $vinf = self::getVersionPattern($version); + + $v = $vinf; + + for($x=0; $x<6; $x++) { + for($y=0; $y<3; $y++) { + $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + + $v = $vinf; + for($y=0; $y<6; $y++) { + for($x=0; $x<3; $x++) { + $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + } + + // and a little bit... + $frame[$width - 8][8] = "\x81"; + + return $frame; + } + + //---------------------------------------------------------------------- + public static function debug($frame, $binary_mode = false) + { + if ($binary_mode) { + + foreach ($frame as &$frameLine) { + $frameLine = join('  ', explode('0', $frameLine)); + $frameLine = join('██', explode('1', $frameLine)); + } + + ?> + +


            '; + echo join("
            ", $frame); + echo '






    '; + + } else { + + foreach ($frame as &$frameLine) { + $frameLine = join(' ', explode("\xc0", $frameLine)); + $frameLine = join('', explode("\xc1", $frameLine)); + $frameLine = join(' ', explode("\xa0", $frameLine)); + $frameLine = join('', explode("\xa1", $frameLine)); + $frameLine = join('', explode("\x84", $frameLine)); //format 0 + $frameLine = join('', explode("\x85", $frameLine)); //format 1 + $frameLine = join('', explode("\x81", $frameLine)); //special bit + $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 + $frameLine = join('', explode("\x91", $frameLine)); //clock 1 + $frameLine = join(' ', explode("\x88", $frameLine)); //version + $frameLine = join('', explode("\x89", $frameLine)); //version + $frameLine = join('♦', explode("\x01", $frameLine)); + $frameLine = join('⋅', explode("\0", $frameLine)); + } + + ?> + + "; + echo join("
    ", $frame); + echo "
    "; + + } + } + + //---------------------------------------------------------------------- + public static function serial($frame) + { + return gzcompress(join("\n", $frame), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + return explode("\n", gzuncompress($code)); + } + + //---------------------------------------------------------------------- + public static function newFrame($version) + { + if($version < 1 || $version > QRSPEC_VERSION_MAX) + return null; + + if(!isset(self::$frames[$version])) { + + $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + self::$frames[$version] = self::unserial(file_get_contents($fileName)); + } else { + self::$frames[$version] = self::createFrame($version); + file_put_contents($fileName, self::serial(self::$frames[$version])); + } + } else { + self::$frames[$version] = self::createFrame($version); + } + } + + if(is_null(self::$frames[$version])) + return null; + + return self::$frames[$version]; + } + + //---------------------------------------------------------------------- + public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } + public static function rsBlockNum1($spec) { return $spec[0]; } + public static function rsDataCodes1($spec) { return $spec[1]; } + public static function rsEccCodes1($spec) { return $spec[2]; } + public static function rsBlockNum2($spec) { return $spec[3]; } + public static function rsDataCodes2($spec) { return $spec[4]; } + public static function rsEccCodes2($spec) { return $spec[2]; } + public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } + public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } + + } + + + +//---- qrimage.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Image output of code using GD2 + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QR_IMAGE', true); + + class QRimage { + + //---------------------------------------------------------------------- + public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/png"); + ImagePng($image); + } else { + if($saveandprint===TRUE){ + ImagePng($image, $filename); + header("Content-type: image/png"); + ImagePng($image); + }else{ + ImagePng($image, $filename); + } + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/jpeg"); + ImageJpeg($image, null, $q); + } else { + ImageJpeg($image, $filename, $q); + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) + { + $h = count($frame); + $w = strlen($frame[0]); + + $imgW = $w + 2*$outerFrame; + $imgH = $h + 2*$outerFrame; + + $base_image =ImageCreate($imgW, $imgH); + + $col[0] = ImageColorAllocate($base_image,255,255,255); + $col[1] = ImageColorAllocate($base_image,0,0,0); + + imagefill($base_image, 0, 0, $col[0]); + + for($y=0; $y<$h; $y++) { + for($x=0; $x<$w; $x++) { + if ($frame[$y][$x] == '1') { + ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); + } + } + } + + $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); + ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); + ImageDestroy($base_image); + + return $target_image; + } + } + + + +//---- qrinput.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Input encoding class + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('STRUCTURE_HEADER_BITS', 20); + define('MAX_STRUCTURED_SYMBOLS', 16); + + class QRinputItem { + + public $mode; + public $size; + public $data; + public $bstream; + + public function __construct($mode, $size, $data, $bstream = null) + { + $setData = array_slice($data, 0, $size); + + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); + } + + if(!QRinput::check($mode, $size, $setData)) { + throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); + return null; + } + + $this->mode = $mode; + $this->size = $size; + $this->data = $setData; + $this->bstream = $bstream; + } + + //---------------------------------------------------------------------- + public function encodeModeNum($version) + { + try { + + $words = (int)($this->size / 3); + $bs = new QRbitstream(); + + $val = 0x1; + $bs->appendNum(4, $val); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; + $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; + $val += (ord($this->data[$i*3+2]) - ord('0')); + $bs->appendNum(10, $val); + } + + if($this->size - $words * 3 == 1) { + $val = ord($this->data[$words*3]) - ord('0'); + $bs->appendNum(4, $val); + } else if($this->size - $words * 3 == 2) { + $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; + $val += (ord($this->data[$words*3+1]) - ord('0')); + $bs->appendNum(7, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeAn($version) + { + try { + $words = (int)($this->size / 2); + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x02); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; + $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); + + $bs->appendNum(11, $val); + } + + if($this->size & 1) { + $val = QRinput::lookAnTable(ord($this->data[$words * 2])); + $bs->appendNum(6, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeMode8($version) + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x4); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); + + for($i=0; $i<$this->size; $i++) { + $bs->appendNum(8, ord($this->data[$i])); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeKanji($version) + { + try { + + $bs = new QRbitrtream(); + + $bs->appendNum(4, 0x8); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); + + for($i=0; $i<$this->size; $i+=2) { + $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); + if($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + + $bs->appendNum(13, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeStructure() + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x03); + $bs->appendNum(4, ord($this->data[1]) - 1); + $bs->appendNum(4, ord($this->data[0]) - 1); + $bs->appendNum(8, ord($this->data[2])); + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function estimateBitStreamSizeOfEntry($version) + { + $bits = 0; + + if($version == 0) + $version = 1; + + switch($this->mode) { + case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; + case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; + case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; + case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; + case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; + default: + return 0; + } + + $l = QRspec::lengthIndicator($this->mode, $version); + $m = 1 << $l; + $num = (int)(($this->size + $m - 1) / $m); + + $bits += $num * (4 + $l); + + return $bits; + } + + //---------------------------------------------------------------------- + public function encodeBitStream($version) + { + try { + + unset($this->bstream); + $words = QRspec::maximumWords($this->mode, $version); + + if($this->size > $words) { + + $st1 = new QRinputItem($this->mode, $words, $this->data); + $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); + + $st1->encodeBitStream($version); + $st2->encodeBitStream($version); + + $this->bstream = new QRbitstream(); + $this->bstream->append($st1->bstream); + $this->bstream->append($st2->bstream); + + unset($st1); + unset($st2); + + } else { + + $ret = 0; + + switch($this->mode) { + case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; + case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; + case QR_MODE_8: $ret = $this->encodeMode8($version); break; + case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; + case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; + + default: + break; + } + + if($ret < 0) + return -1; + } + + return $this->bstream->size(); + + } catch (Exception $e) { + return -1; + } + } + }; + + //########################################################################## + + class QRinput { + + public $items; + + private $version; + private $level; + + //---------------------------------------------------------------------- + public function __construct($version = 0, $level = QR_ECLEVEL_L) + { + if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { + throw new Exception('Invalid version no'); + return NULL; + } + + $this->version = $version; + $this->level = $level; + } + + //---------------------------------------------------------------------- + public function getVersion() + { + return $this->version; + } + + //---------------------------------------------------------------------- + public function setVersion($version) + { + if($version < 0 || $version > QRSPEC_VERSION_MAX) { + throw new Exception('Invalid version no'); + return -1; + } + + $this->version = $version; + + return 0; + } + + //---------------------------------------------------------------------- + public function getErrorCorrectionLevel() + { + return $this->level; + } + + //---------------------------------------------------------------------- + public function setErrorCorrectionLevel($level) + { + if($level > QR_ECLEVEL_H) { + throw new Exception('Invalid ECLEVEL'); + return -1; + } + + $this->level = $level; + + return 0; + } + + //---------------------------------------------------------------------- + public function appendEntry(QRinputItem $entry) + { + $this->items[] = $entry; + } + + //---------------------------------------------------------------------- + public function append($mode, $size, $data) + { + try { + $entry = new QRinputItem($mode, $size, $data); + $this->items[] = $entry; + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + + public function insertStructuredAppendHeader($size, $index, $parity) + { + if( $size > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong size'); + } + + if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong index'); + } + + $buf = array($size, $index, $parity); + + try { + $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); + array_unshift($this->items, $entry); + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function calcParity() + { + $parity = 0; + + foreach($this->items as $item) { + if($item->mode != QR_MODE_STRUCTURE) { + for($i=$item->size-1; $i>=0; $i--) { + $parity ^= $item->data[$i]; + } + } + } + + return $parity; + } + + //---------------------------------------------------------------------- + public static function checkModeNum($size, $data) + { + for($i=0; $i<$size; $i++) { + if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeNum($size) + { + $w = (int)$size / 3; + $bits = $w * 10; + + switch($size - $w * 3) { + case 1: + $bits += 4; + break; + case 2: + $bits += 7; + break; + default: + break; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + ); + + //---------------------------------------------------------------------- + public static function lookAnTable($c) + { + return (($c > 127)?-1:self::$anTable[$c]); + } + + //---------------------------------------------------------------------- + public static function checkModeAn($size, $data) + { + for($i=0; $i<$size; $i++) { + if (self::lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeAn($size) + { + $w = (int)($size / 2); + $bits = $w * 11; + + if($size & 1) { + $bits += 6; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static function estimateBitsMode8($size) + { + return $size * 8; + } + + //---------------------------------------------------------------------- + public function estimateBitsModeKanji($size) + { + return (int)(($size / 2) * 13); + } + + //---------------------------------------------------------------------- + public static function checkModeKanji($size, $data) + { + if($size & 1) + return false; + + for($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if( $val < 0x8140 + || ($val > 0x9ffc && $val < 0xe040) + || $val > 0xebbf) { + return false; + } + } + + return true; + } + + /*********************************************************************** + * Validation + **********************************************************************/ + + public static function check($mode, $size, $data) + { + if($size <= 0) + return false; + + switch($mode) { + case QR_MODE_NUM: return self::checkModeNum($size, $data); break; + case QR_MODE_AN: return self::checkModeAn($size, $data); break; + case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; + case QR_MODE_8: return true; break; + case QR_MODE_STRUCTURE: return true; break; + + default: + break; + } + + return false; + } + + + //---------------------------------------------------------------------- + public function estimateBitStreamSize($version) + { + $bits = 0; + + foreach($this->items as $item) { + $bits += $item->estimateBitStreamSizeOfEntry($version); + } + + return $bits; + } + + //---------------------------------------------------------------------- + public function estimateVersion() + { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($prev); + $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + + return $version; + } + + //---------------------------------------------------------------------- + public static function lengthOfCode($mode, $version, $bits) + { + $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NUM: + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if($remain >= 7) { + $size += 2; + } else if($remain >= 4) { + $size += 1; + } + break; + case QR_MODE_AN: + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if($remain >= 6) + $size++; + break; + case QR_MODE_8: + $size = (int)($payload / 8); + break; + case QR_MODE_KANJI: + $size = (int)(($payload / 13) * 2); + break; + case QR_MODE_STRUCTURE: + $size = (int)($payload / 8); + break; + default: + $size = 0; + break; + } + + $maxsize = QRspec::maximumWords($mode, $version); + if($size < 0) $size = 0; + if($size > $maxsize) $size = $maxsize; + + return $size; + } + + //---------------------------------------------------------------------- + public function createBitStream() + { + $total = 0; + + foreach($this->items as $item) { + $bits = $item->encodeBitStream($this->version); + + if($bits < 0) + return -1; + + $total += $bits; + } + + return $total; + } + + //---------------------------------------------------------------------- + public function convertData() + { + $ver = $this->estimateVersion(); + if($ver > $this->getVersion()) { + $this->setVersion($ver); + } + + for(;;) { + $bits = $this->createBitStream(); + + if($bits < 0) + return -1; + + $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if($ver < 0) { + throw new Exception('WRONG VERSION'); + return -1; + } else if($ver > $this->getVersion()) { + $this->setVersion($ver); + } else { + break; + } + } + + return 0; + } + + //---------------------------------------------------------------------- + public function appendPaddingBit(&$bstream) + { + $bits = $bstream->size(); + $maxwords = QRspec::getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + + if ($maxbits == $bits) { + return 0; + } + + if ($maxbits - $bits < 5) { + return $bstream->appendNum($maxbits - $bits, 0); + } + + $bits += 4; + $words = (int)(($bits + 7) / 8); + + $padding = new QRbitstream(); + $ret = $padding->appendNum($words * 8 - $bits + 4, 0); + + if($ret < 0) + return $ret; + + $padlen = $maxwords - $words; + + if($padlen > 0) { + + $padbuf = array(); + for($i=0; $i<$padlen; $i++) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + + $ret = $padding->appendBytes($padlen, $padbuf); + + if($ret < 0) + return $ret; + + } + + $ret = $bstream->append($padding); + + return $ret; + } + + //---------------------------------------------------------------------- + public function mergeBitStream() + { + if($this->convertData() < 0) { + return null; + } + + $bstream = new QRbitstream(); + + foreach($this->items as $item) { + $ret = $bstream->append($item->bstream); + if($ret < 0) { + return null; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getBitStream() + { + + $bstream = $this->mergeBitStream(); + + if($bstream == null) { + return null; + } + + $ret = $this->appendPaddingBit($bstream); + if($ret < 0) { + return null; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getByteStream() + { + $bstream = $this->getBitStream(); + if($bstream == null) { + return null; + } + + return $bstream->toByte(); + } + } + + + + + + +//---- qrbitstream.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Bitstream class + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRbitstream { + + public $data = array(); + + //---------------------------------------------------------------------- + public function size() + { + return count($this->data); + } + + //---------------------------------------------------------------------- + public function allocate($setLength) + { + $this->data = array_fill(0, $setLength, 0); + return 0; + } + + //---------------------------------------------------------------------- + public static function newFromNum($bits, $num) + { + $bstream = new QRbitstream(); + $bstream->allocate($bits); + + $mask = 1 << ($bits - 1); + for($i=0; $i<$bits; $i++) { + if($num & $mask) { + $bstream->data[$i] = 1; + } else { + $bstream->data[$i] = 0; + } + $mask = $mask >> 1; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public static function newFromBytes($size, $data) + { + $bstream = new QRbitstream(); + $bstream->allocate($size * 8); + $p=0; + + for($i=0; $i<$size; $i++) { + $mask = 0x80; + for($j=0; $j<8; $j++) { + if($data[$i] & $mask) { + $bstream->data[$p] = 1; + } else { + $bstream->data[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function append(QRbitstream $arg) + { + if (is_null($arg)) { + return -1; + } + + if($arg->size() == 0) { + return 0; + } + + if($this->size() == 0) { + $this->data = $arg->data; + return 0; + } + + $this->data = array_values(array_merge($this->data, $arg->data)); + + return 0; + } + + //---------------------------------------------------------------------- + public function appendNum($bits, $num) + { + if ($bits == 0) + return 0; + + $b = QRbitstream::newFromNum($bits, $num); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function appendBytes($size, $data) + { + if ($size == 0) + return 0; + + $b = QRbitstream::newFromBytes($size, $data); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function toByte() + { + + $size = $this->size(); + + if($size == 0) { + return array(); + } + + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + + $p = 0; + + for($i=0; $i<$bytes; $i++) { + $v = 0; + for($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$i] = $v; + } + + if($size & 7) { + $v = 0; + for($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$bytes] = $v; + } + + return $data; + } + + } + + + + +//---- qrsplit.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Input splitting classes + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + class QRsplit { + + public $dataStr = ''; + public $input; + public $modeHint; + + //---------------------------------------------------------------------- + public function __construct($dataStr, $input, $modeHint) + { + $this->dataStr = $dataStr; + $this->input = $input; + $this->modeHint = $modeHint; + } + + //---------------------------------------------------------------------- + public static function isdigitat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + //---------------------------------------------------------------------- + public static function isalnumat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return (QRinput::lookAnTable(ord($str[$pos])) >= 0); + } + + //---------------------------------------------------------------------- + public function identifyMode($pos) + { + if ($pos >= strlen($this->dataStr)) + return QR_MODE_NUL; + + $c = $this->dataStr[$pos]; + + if(self::isdigitat($this->dataStr, $pos)) { + return QR_MODE_NUM; + } else if(self::isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } else if($this->modeHint == QR_MODE_KANJI) { + + if ($pos+1 < strlen($this->dataStr)) + { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KANJI; + } + } + } + + return QR_MODE_8; + } + + //---------------------------------------------------------------------- + public function eatNum() + { + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + while(self::isdigitat($this->dataStr, $p)) { + $p++; + } + + $run = $p; + $mode = $this->identifyMode($p); + + if($mode == QR_MODE_8) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + if($mode == QR_MODE_AN) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsModeAn(1) // + 4 + la + - QRinput::estimateBitsModeAn($run + 1);// - 4 - la + if($dif > 0) { + return $this->eatAn(); + } + } + + $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatAn() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + + while(self::isalnumat($this->dataStr, $p)) { + if(self::isdigitat($this->dataStr, $p)) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + + $dif = QRinput::estimateBitsModeAn($p) // + 4 + la + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsModeAn($q); // - 4 - la + + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + + if(!self::isalnumat($this->dataStr, $p)) { + $dif = QRinput::estimateBitsModeAn($run) + 4 + $la + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + + $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatKanji() + { + $p = 0; + + while($this->identifyMode($p) == QR_MODE_KANJI) { + $p += 2; + } + + $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eat8() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 1; + $dataStrLen = strlen($this->dataStr); + + while($p < $dataStrLen) { + + $mode = $this->identifyMode($p); + if($mode == QR_MODE_KANJI) { + break; + } + if($mode == QR_MODE_NUM) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else if($mode == QR_MODE_AN) { + $q = $p; + while(self::isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeAn($q - $p) + 4 + $la + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); + + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function splitString() + { + while (strlen($this->dataStr) > 0) + { + if($this->dataStr == '') + return 0; + + $mode = $this->identifyMode(0); + + switch ($mode) { + case QR_MODE_NUM: $length = $this->eatNum(); break; + case QR_MODE_AN: $length = $this->eatAn(); break; + case QR_MODE_KANJI: + if ($hint == QR_MODE_KANJI) + $length = $this->eatKanji(); + else $length = $this->eat8(); + break; + default: $length = $this->eat8(); break; + + } + + if($length == 0) return 0; + if($length < 0) return -1; + + $this->dataStr = substr($this->dataStr, $length); + } + } + + //---------------------------------------------------------------------- + public function toUpper() + { + $stringLen = strlen($this->dataStr); + $p = 0; + + while ($p<$stringLen) { + $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); + if($mode == QR_MODE_KANJI) { + $p += 2; + } else { + if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + + return $this->dataStr; + } + + //---------------------------------------------------------------------- + public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) + { + if(is_null($string) || $string == '\0' || $string == '') { + throw new Exception('empty string!!!'); + } + + $split = new QRsplit($string, $input, $modeHint); + + if(!$casesensitive) + $split->toUpper(); + + return $split->splitString(); + } + } + + + +//---- qrrscode.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Reed-Solomon error correction support + * + * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q + * (libfec is released under the GNU Lesser General Public License.) + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsItem { + + public $mm; // Bits per symbol + public $nn; // Symbols per block (= (1<= $this->nn) { + $x -= $this->nn; + $x = ($x >> $this->mm) + ($x & $this->nn); + } + + return $x; + } + + //---------------------------------------------------------------------- + public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + // Common code for intializing a Reed-Solomon control block (char or int symbols) + // Copyright 2004 Phil Karn, KA9Q + // May be used under the terms of the GNU Lesser General Public License (LGPL) + + $rs = null; + + // Check parameter ranges + if($symsize < 0 || $symsize > 8) return $rs; + if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; + if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; + if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! + if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding + + $rs = new QRrsItem(); + $rs->mm = $symsize; + $rs->nn = (1<<$symsize)-1; + $rs->pad = $pad; + + $rs->alpha_to = array_fill(0, $rs->nn+1, 0); + $rs->index_of = array_fill(0, $rs->nn+1, 0); + + // PHP style macro replacement ;) + $NN =& $rs->nn; + $A0 =& $NN; + + // Generate Galois field lookup tables + $rs->index_of[0] = $A0; // log(zero) = -inf + $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 + $sr = 1; + + for($i=0; $i<$rs->nn; $i++) { + $rs->index_of[$sr] = $i; + $rs->alpha_to[$i] = $sr; + $sr <<= 1; + if($sr & (1<<$symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs->nn; + } + + if($sr != 1){ + // field generator polynomial is not primitive! + $rs = NULL; + return $rs; + } + + /* Form RS code generator polynomial from its roots */ + $rs->genpoly = array_fill(0, $nroots+1, 0); + + $rs->fcr = $fcr; + $rs->prim = $prim; + $rs->nroots = $nroots; + $rs->gfpoly = $gfpoly; + + /* Find prim-th root of 1, used in decoding */ + for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) + ; // intentional empty-body loop! + + $rs->iprim = (int)($iprim / $prim); + $rs->genpoly[0] = 1; + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs->genpoly[$i+1] = 1; + + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; $j--) { + if ($rs->genpoly[$j] != 0) { + $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; + } else { + $rs->genpoly[$j] = $rs->genpoly[$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; + } + + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; $i++) + $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; + + return $rs; + } + + //---------------------------------------------------------------------- + public function encode_rs_char($data, &$parity) + { + $MM =& $this->mm; + $NN =& $this->nn; + $ALPHA_TO =& $this->alpha_to; + $INDEX_OF =& $this->index_of; + $GENPOLY =& $this->genpoly; + $NROOTS =& $this->nroots; + $FCR =& $this->fcr; + $PRIM =& $this->prim; + $IPRIM =& $this->iprim; + $PAD =& $this->pad; + $A0 =& $NN; + + $parity = array_fill(0, $NROOTS, 0); + + for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { + + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if($feedback != $A0) { + // feedback term is non-zero + + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); + + for($j=1;$j<$NROOTS;$j++) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; + } + } + + // Shift + array_shift($parity); + if($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + } + } + + //########################################################################## + + class QRrs { + + public static $items = array(); + + //---------------------------------------------------------------------- + public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + foreach(self::$items as $rs) { + if($rs->pad != $pad) continue; + if($rs->nroots != $nroots) continue; + if($rs->mm != $symsize) continue; + if($rs->gfpoly != $gfpoly) continue; + if($rs->fcr != $fcr) continue; + if($rs->prim != $prim) continue; + + return $rs; + } + + $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift(self::$items, $rs); + + return $rs; + } + } + + + +//---- qrmask.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Masking + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('N1', 3); + define('N2', 3); + define('N3', 40); + define('N4', 10); + + class QRmask { + + public $runLength = array(); + + //---------------------------------------------------------------------- + public function __construct() + { + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + } + + //---------------------------------------------------------------------- + public function writeFormatInformation($width, &$frame, $mask, $level) + { + $blacks = 0; + $format = QRspec::getFormatInfo($mask, $level); + + for($i=0; $i<8; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[8][$width - 1 - $i] = chr($v); + if($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + + for($i=0; $i<7; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[$width - 7 + $i][8] = chr($v); + if($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + + $format = $format >> 1; + } + + return $blacks; + } + + //---------------------------------------------------------------------- + public function mask0($x, $y) { return ($x+$y)&1; } + public function mask1($x, $y) { return ($y&1); } + public function mask2($x, $y) { return ($x%3); } + public function mask3($x, $y) { return ($x+$y)%3; } + public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } + public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } + public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } + public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } + + //---------------------------------------------------------------------- + private function generateMaskNo($maskNo, $width, $frame) + { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if(ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + + } + } + + return $bitMask; + } + + //---------------------------------------------------------------------- + public static function serial($bitFrame) + { + $codeArr = array(); + + foreach ($bitFrame as $line) + $codeArr[] = join('', $line); + + return gzcompress(join("\n", $codeArr), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + $codeArr = array(); + + $codeLines = explode("\n", gzuncompress($code)); + foreach ($codeLines as $line) + $codeArr[] = str_split($line); + + return $codeArr; + } + + //---------------------------------------------------------------------- + public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) + { + $b = 0; + $bitMask = array(); + + $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + $bitMask = self::unserial(file_get_contents($fileName)); + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) + mkdir(QR_CACHE_DIR.'mask_'.$maskNo); + file_put_contents($fileName, self::serial($bitMask)); + } + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + } + + if ($maskGenOnly) + return; + + $d = $s; + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + + return $b; + } + + //---------------------------------------------------------------------- + public function makeMask($width, $frame, $maskNo, $level) + { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + + return $masked; + } + + //---------------------------------------------------------------------- + public function calcN1N3($length) + { + $demerit = 0; + + for($i=0; $i<$length; $i++) { + + if($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if($i & 1) { + if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if(($this->runLength[$i-2] == $fact) && + ($this->runLength[$i-1] == $fact) && + ($this->runLength[$i+1] == $fact) && + ($this->runLength[$i+2] == $fact)) { + if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + //---------------------------------------------------------------------- + public function evaluateSymbol($width, $frame) + { + $head = 0; + $demerit = 0; + + for($y=0; $y<$width; $y++) { + $head = 0; + $this->runLength[0] = 1; + + $frameY = $frame[$y]; + + if ($y>0) + $frameYM = $frame[$y-1]; + + for($x=0; $x<$width; $x++) { + if(($x > 0) && ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + + if(($b22 | ($w22 ^ 1))&1) { + $demerit += N2; + } + } + if(($x == 0) && (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($x > 0) { + if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + for($x=0; $x<$width; $x++) { + $head = 0; + $this->runLength[0] = 1; + + for($y=0; $y<$width; $y++) { + if($y == 0 && (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($y > 0) { + if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + return $demerit; + } + + + //---------------------------------------------------------------------- + public function mask($width, $frame, $level) + { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = array(); + + $checked_masks = array(0,1,2,3,4,5,6,7); + + if (QR_FIND_FROM_RANDOM !== false) { + + $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; $i++) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + + } + + $bestMask = $frame; + + foreach($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + + if($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + + return $bestMask; + } + + //---------------------------------------------------------------------- + } + + + + +//---- qrencode.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Main encoder classes. + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsblock { + public $dataLength; + public $data = array(); + public $eccLength; + public $ecc = array(); + + public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) + { + $rs->encode_rs_char($data, $ecc); + + $this->dataLength = $dl; + $this->data = $data; + $this->eccLength = $el; + $this->ecc = $ecc; + } + }; + + //########################################################################## + + class QRrawcode { + public $version; + public $datacode = array(); + public $ecccode = array(); + public $blocks; + public $rsblocks = array(); //of RSblock + public $count; + public $dataLength; + public $eccLength; + public $b1; + + //---------------------------------------------------------------------- + public function __construct(QRinput $input) + { + $spec = array(0,0,0,0,0); + + $this->datacode = $input->getByteStream(); + if(is_null($this->datacode)) { + throw new Exception('null imput string'); + } + + QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); + + $this->version = $input->getVersion(); + $this->b1 = QRspec::rsBlockNum1($spec); + $this->dataLength = QRspec::rsDataLength($spec); + $this->eccLength = QRspec::rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = QRspec::rsBlockNum($spec); + + $ret = $this->init($spec); + if($ret < 0) { + throw new Exception('block alloc error'); + return null; + } + + $this->count = 0; + } + + //---------------------------------------------------------------------- + public function init(array $spec) + { + $dl = QRspec::rsDataCodes1($spec); + $el = QRspec::rsEccCodes1($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + if(QRspec::rsBlockNum2($spec) == 0) + return 0; + + $dl = QRspec::rsDataCodes2($spec); + $el = QRspec::rsEccCodes2($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + if($rs == NULL) return -1; + + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + return 0; + } + + //---------------------------------------------------------------------- + public function getCode() + { + $ret = null; + + if($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if($col >= $this->rsblocks[0]->dataLength) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]->data[$col]; + } else if($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]->ecc[$col]; + } else { + return 0; + } + $this->count++; + + return $ret; + } + } + + //########################################################################## + + class QRcode { + + public $version; + public $width; + public $data; + + //---------------------------------------------------------------------- + public function encodeMask(QRinput $input, $mask) + { + if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { + throw new Exception('wrong version'); + } + if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { + throw new Exception('wrong level'); + } + + $raw = new QRrawcode($input); + + QRtools::markTime('after_raw'); + + $version = $raw->version; + $width = QRspec::getWidth($version); + $frame = QRspec::newFrame($version); + + $filler = new FrameFiller($width, $frame); + if(is_null($filler)) { + return NULL; + } + + // inteleaved data and ecc codes + for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { + $code = $raw->getCode(); + $bit = 0x80; + for($j=0; $j<8; $j++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + + QRtools::markTime('after_filler'); + + unset($raw); + + // remainder bits + $j = QRspec::getRemainder($version); + for($i=0; $i<$j; $i++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02); + } + + $frame = $filler->frame; + unset($filler); + + + // masking + $maskObj = new QRmask(); + if($mask < 0) { + + if (QR_FIND_BEST_MASK) { + $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); + } else { + $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); + } + } else { + $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); + } + + if($masked == NULL) { + return NULL; + } + + QRtools::markTime('after_mask'); + + $this->version = $version; + $this->width = $width; + $this->data = $masked; + + return $this; + } + + //---------------------------------------------------------------------- + public function encodeInput(QRinput $input) + { + return $this->encodeMask($input, -1); + } + + //---------------------------------------------------------------------- + public function encodeString8bit($string, $version, $level) + { + if(string == NULL) { + throw new Exception('empty string!'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); + if($ret < 0) { + unset($input); + return NULL; + } + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public function encodeString($string, $version, $level, $hint, $casesensitive) + { + + if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { + throw new Exception('bad hint'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); + if($ret < 0) { + return NULL; + } + + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodePNG($text, $outfile, $saveandprint=false); + } + + //---------------------------------------------------------------------- + public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encode($text, $outfile); + } + + //---------------------------------------------------------------------- + public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodeRAW($text, $outfile); + } + } + + //########################################################################## + + class FrameFiller { + + public $width; + public $frame; + public $x; + public $y; + public $dir; + public $bit; + + //---------------------------------------------------------------------- + public function __construct($width, &$frame) + { + $this->width = $width; + $this->frame = $frame; + $this->x = $width - 1; + $this->y = $width - 1; + $this->dir = -1; + $this->bit = -1; + } + + //---------------------------------------------------------------------- + public function setFrameAt($at, $val) + { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + //---------------------------------------------------------------------- + public function getFrameAt($at) + { + return ord($this->frame[$at['y']][$at['x']]); + } + + //---------------------------------------------------------------------- + public function next() + { + do { + + if($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + + $x = $this->x; + $y = $this->y; + $w = $this->width; + + if($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + + if($this->dir < 0) { + if($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if($x == 6) { + $x--; + $y = 9; + } + } + } else { + if($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if($x == 6) { + $x--; + $y -= 8; + } + } + } + if($x < 0 || $y < 0) return null; + + $this->x = $x; + $this->y = $y; + + } while(ord($this->frame[$y][$x]) & 0x80); + + return array('x'=>$x, 'y'=>$y); + } + + } ; + + //########################################################################## + + class QRencode { + + public $casesensitive = true; + public $eightbit = false; + + public $version = 0; + public $size = 3; + public $margin = 4; + + public $structured = 0; // not supported yet + + public $level = QR_ECLEVEL_L; + public $hint = QR_MODE_8; + + //---------------------------------------------------------------------- + public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = new QRencode(); + $enc->size = $size; + $enc->margin = $margin; + + switch ($level.'') { + case '0': + case '1': + case '2': + case '3': + $enc->level = $level; + break; + case 'l': + case 'L': + $enc->level = QR_ECLEVEL_L; + break; + case 'm': + case 'M': + $enc->level = QR_ECLEVEL_M; + break; + case 'q': + case 'Q': + $enc->level = QR_ECLEVEL_Q; + break; + case 'h': + case 'H': + $enc->level = QR_ECLEVEL_H; + break; + } + + return $enc; + } + + //---------------------------------------------------------------------- + public function encodeRAW($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + return $code->data; + } + + //---------------------------------------------------------------------- + public function encode($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + QRtools::markTime('after_encode'); + + if ($outfile!== false) { + file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); + } else { + return QRtools::binarize($code->data); + } + } + + //---------------------------------------------------------------------- + public function encodePNG($intext, $outfile = false,$saveandprint=false) + { + try { + + ob_start(); + $tab = $this->encode($intext); + $err = ob_get_contents(); + ob_end_clean(); + + if ($err != '') + QRtools::log($outfile, $err); + + $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); + + QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); + + } catch (Exception $e) { + + QRtools::log($outfile, $e->getMessage()); + + } + } + } + + diff --git a/externals/porter-stemmer/LICENSE b/externals/porter-stemmer/LICENSE new file mode 100644 index 0000000000..d4afc6cfa7 --- /dev/null +++ b/externals/porter-stemmer/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2005-2016 Richard Heyes (http://www.phpguru.org/) + +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. diff --git a/externals/porter-stemmer/README.md b/externals/porter-stemmer/README.md new file mode 100644 index 0000000000..06bc417f9f --- /dev/null +++ b/externals/porter-stemmer/README.md @@ -0,0 +1,42 @@ +# Porter Stemmer by Richard Heyes + +# Installation (with composer) + +```json +{ + "require": { + "camspiers/porter-stemmer": "1.0.0" + } +} +``` + + $ composer install + +# Usage + +```php +$stem = Porter::Stem($word); +``` + +# License + +The MIT License (MIT) + +Copyright (c) 2005-2016 Richard Heyes (http://www.phpguru.org/) + +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. diff --git a/externals/porter-stemmer/src/Porter.php b/externals/porter-stemmer/src/Porter.php new file mode 100644 index 0000000000..b8715dade1 --- /dev/null +++ b/externals/porter-stemmer/src/Porter.php @@ -0,0 +1,426 @@ + + * + * Originally available under the GPL 2 or greater. Relicensed with permission + * of original authors under the MIT License in 2016. + * + * All rights reserved. + * + * @package PorterStemmer + * @author Richard Heyes + * @author Jon Abernathy + * @copyright 2005-2016 Richard Heyes (http://www.phpguru.org/) + * @license http://www.opensource.org/licenses/mit-license.html MIT License + */ + +/** + * PHP 5 Implementation of the Porter Stemmer algorithm. Certain elements + * were borrowed from the (broken) implementation by Jon Abernathy. + * + * See http://tartarus.org/~martin/PorterStemmer/ for a description of the + * algorithm. + * + * Usage: + * + * $stem = PorterStemmer::Stem($word); + * + * How easy is that? + * + * @package PorterStemmer + * @author Richard Heyes + * @author Jon Abernathy + * @copyright 2005-2016 Richard Heyes (http://www.phpguru.org/) + * @license http://www.opensource.org/licenses/mit-license.html MIT License + */ +class Porter +{ + /** + * Regex for matching a consonant + * + * @var string + */ + private static $regex_consonant = '(?:[bcdfghjklmnpqrstvwxz]|(?<=[aeiou])y|^y)'; + + /** + * Regex for matching a vowel + * + * @var string + */ + private static $regex_vowel = '(?:[aeiou]|(? 1) { + self::replace($word, 'e', ''); + + } elseif (self::m(substr($word, 0, -1)) == 1) { + + if (!self::cvc(substr($word, 0, -1))) { + self::replace($word, 'e', ''); + } + } + } + + // Part b + if (self::m($word) > 1 AND self::doubleConsonant($word) AND substr($word, -1) == 'l') { + $word = substr($word, 0, -1); + } + + return $word; + } + + /** + * Replaces the first string with the second, at the end of the string + * + * If third arg is given, then the preceding string must match that m + * count at least. + * + * @param string $str String to check + * @param string $check Ending to check for + * @param string $repl Replacement string + * @param int $m Optional minimum number of m() to meet + * + * @return bool Whether the $check string was at the end of the $str + * string. True does not necessarily mean that it was + * replaced. + */ + private static function replace(&$str, $check, $repl, $m = null) + { + $len = 0 - strlen($check); + + if (substr($str, $len) == $check) { + $substr = substr($str, 0, $len); + if (is_null($m) OR self::m($substr) > $m) { + $str = $substr . $repl; + } + + return true; + } + + return false; + } + + /** + * What, you mean it's not obvious from the name? + * + * m() measures the number of consonant sequences in $str. if c is + * a consonant sequence and v a vowel sequence, and <..> indicates arbitrary + * presence, + * + * gives 0 + * vc gives 1 + * vcvc gives 2 + * vcvcvc gives 3 + * + * @param string $str The string to return the m count for + * + * @return int The m count + */ + private static function m($str) + { + $c = self::$regex_consonant; + $v = self::$regex_vowel; + + $str = preg_replace("#^$c+#", '', $str); + $str = preg_replace("#$v+$#", '', $str); + + preg_match_all("#($v+$c+)#", $str, $matches); + + return count($matches[1]); + } + + /** + * Returns true/false as to whether the given string contains two + * of the same consonant next to each other at the end of the string. + * + * @param string $str String to check + * + * @return bool Result + */ + private static function doubleConsonant($str) + { + $c = self::$regex_consonant; + + return preg_match("#$c{2}$#", $str, $matches) AND $matches[0][0] == $matches[0][1]; + } + + /** + * Checks for ending CVC sequence where second C is not W, X or Y + * + * @param string $str String to check + * + * @return bool Result + */ + private static function cvc($str) + { + $c = self::$regex_consonant; + $v = self::$regex_vowel; + + return preg_match("#($c$v$c)$#", $str, $matches) + AND strlen($matches[1]) == 3 + AND $matches[1][2] != 'w' + AND $matches[1][2] != 'x' + AND $matches[1][2] != 'y'; + } +} diff --git a/externals/recaptcha/LICENSE b/externals/recaptcha/LICENSE deleted file mode 100644 index b612f71f01..0000000000 --- a/externals/recaptcha/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2007 reCAPTCHA -- http://recaptcha.net -AUTHORS: - Mike Crawford - Ben Maurer - -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. diff --git a/externals/recaptcha/recaptchalib.php b/externals/recaptcha/recaptchalib.php deleted file mode 100644 index 32c4f4d758..0000000000 --- a/externals/recaptcha/recaptchalib.php +++ /dev/null @@ -1,277 +0,0 @@ - $value ) - $req .= $key . '=' . urlencode( stripslashes($value) ) . '&'; - - // Cut the last '&' - $req=substr($req,0,strlen($req)-1); - return $req; -} - - - -/** - * Submits an HTTP POST to a reCAPTCHA server - * @param string $host - * @param string $path - * @param array $data - * @param int port - * @return array response - */ -function _recaptcha_http_post($host, $path, $data, $port = 80) { - - $req = _recaptcha_qsencode ($data); - - $http_request = "POST $path HTTP/1.0\r\n"; - $http_request .= "Host: $host\r\n"; - $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n"; - $http_request .= "Content-Length: " . strlen($req) . "\r\n"; - $http_request .= "User-Agent: reCAPTCHA/PHP\r\n"; - $http_request .= "\r\n"; - $http_request .= $req; - - $response = ''; - if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) { - die ('Could not open socket'); - } - - fwrite($fs, $http_request); - - while ( !feof($fs) ) - $response .= fgets($fs, 1160); // One TCP-IP packet - fclose($fs); - $response = explode("\r\n\r\n", $response, 2); - - return $response; -} - - - -/** - * Gets the challenge HTML (javascript and non-javascript version). - * This is called from the browser, and the resulting reCAPTCHA HTML widget - * is embedded within the HTML form it was called from. - * @param string $pubkey A public key for reCAPTCHA - * @param string $error The error given by reCAPTCHA (optional, default is null) - * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false) - - * @return string - The HTML to be embedded in the user's form. - */ -function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false) -{ - if ($pubkey == null || $pubkey == '') { - die ("To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create"); - } - - if ($use_ssl) { - $server = RECAPTCHA_API_SECURE_SERVER; - } else { - $server = RECAPTCHA_API_SERVER; - } - - $errorpart = ""; - if ($error) { - $errorpart = "&error=" . $error; - } - return ' - - '; -} - - - - -/** - * A ReCaptchaResponse is returned from recaptcha_check_answer() - */ -class ReCaptchaResponse { - var $is_valid; - var $error; -} - - -/** - * Calls an HTTP POST function to verify if the user's guess was correct - * @param string $privkey - * @param string $remoteip - * @param string $challenge - * @param string $response - * @param array $extra_params an array of extra variables to post to the server - * @return ReCaptchaResponse - */ -function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()) -{ - if ($privkey == null || $privkey == '') { - die ("To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create"); - } - - if ($remoteip == null || $remoteip == '') { - die ("For security reasons, you must pass the remote ip to reCAPTCHA"); - } - - - - //discard spam submissions - if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) { - $recaptcha_response = new ReCaptchaResponse(); - $recaptcha_response->is_valid = false; - $recaptcha_response->error = 'incorrect-captcha-sol'; - return $recaptcha_response; - } - - $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify", - array ( - 'privatekey' => $privkey, - 'remoteip' => $remoteip, - 'challenge' => $challenge, - 'response' => $response - ) + $extra_params - ); - - $answers = explode ("\n", $response [1]); - $recaptcha_response = new ReCaptchaResponse(); - - if (trim ($answers [0]) == 'true') { - $recaptcha_response->is_valid = true; - } - else { - $recaptcha_response->is_valid = false; - $recaptcha_response->error = $answers [1]; - } - return $recaptcha_response; - -} - -/** - * gets a URL where the user can sign up for reCAPTCHA. If your application - * has a configuration page where you enter a key, you should provide a link - * using this function. - * @param string $domain The domain where the page is hosted - * @param string $appname The name of your application - */ -function recaptcha_get_signup_url ($domain = null, $appname = null) { - return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname)); -} - -function _recaptcha_aes_pad($val) { - $block_size = 16; - $numpad = $block_size - (strlen ($val) % $block_size); - return str_pad($val, strlen ($val) + $numpad, chr($numpad)); -} - -/* Mailhide related code */ - -function _recaptcha_aes_encrypt($val,$ky) { - if (! function_exists ("mcrypt_encrypt")) { - die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed."); - } - $mode=MCRYPT_MODE_CBC; - $enc=MCRYPT_RIJNDAEL_128; - $val=_recaptcha_aes_pad($val); - return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); -} - - -function _recaptcha_mailhide_urlbase64 ($x) { - return strtr(base64_encode ($x), '+/', '-_'); -} - -/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */ -function recaptcha_mailhide_url(http://github.com/$pubkey,%20$privkey,%20$email) { - if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) { - die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " . - "you can do so at http://www.google.com/recaptcha/mailhide/apikey"); - } - - - $ky = pack('H*', $privkey); - $cryptmail = _recaptcha_aes_encrypt ($email, $ky); - - return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail); -} - -/** - * gets the parts of the email to expose to the user. - * eg, given johndoe@example,com return ["john", "example.com"]. - * the email is then displayed as john...@example.com - */ -function _recaptcha_mailhide_email_parts ($email) { - $arr = preg_split("/@/", $email ); - - if (strlen ($arr[0]) <= 4) { - $arr[0] = substr ($arr[0], 0, 1); - } else if (strlen ($arr[0]) <= 6) { - $arr[0] = substr ($arr[0], 0, 3); - } else { - $arr[0] = substr ($arr[0], 0, 4); - } - return $arr; -} - -/** - * Gets html to display an email address given a public an private key. - * to get a key, go to: - * - * http://www.google.com/recaptcha/mailhide/apikey - */ -function recaptcha_mailhide_html($pubkey, $privkey, $email) { - $emailparts = _recaptcha_mailhide_email_parts ($email); - $url = recaptcha_mailhide_url ($pubkey, $privkey, $email); - - return htmlentities($emailparts[0]) . "...@" . htmlentities ($emailparts [1]); - -} - - -?> diff --git a/externals/restful/.gitignore b/externals/restful/.gitignore deleted file mode 100644 index c67f2a8aff..0000000000 --- a/externals/restful/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -# composer -.buildpath -composer.lock -composer.phar -vendor - -# phar -*.phar - -# eclipse-pdt -.settings -.project diff --git a/externals/restful/.travis.yml b/externals/restful/.travis.yml deleted file mode 100644 index f88947021d..0000000000 --- a/externals/restful/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: php -before_script: - - curl -s http://getcomposer.org/installer | php - - php composer.phar install --prefer-source -script: phpunit --bootstrap vendor/autoload.php tests/ -php: - - 5.3 - - 5.4 diff --git a/externals/restful/LICENSE b/externals/restful/LICENSE deleted file mode 100644 index 5a7d4b23c4..0000000000 --- a/externals/restful/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2012 Noone - -MIT License - -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. \ No newline at end of file diff --git a/externals/restful/README.md b/externals/restful/README.md deleted file mode 100644 index 036d0b5439..0000000000 --- a/externals/restful/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# RESTful - -Library for writing RESTful PHP clients. - -[![Build Status](https://secure.travis-ci.org/bninja/restful.png)](http://travis-ci.org/bninja/restful) - -The design of this library was heavily influenced by [Httpful](https://github.com/nategood/httpful). - -## Requirements - -- [PHP](http://www.php.net) >= 5.3 **with** [cURL](http://www.php.net/manual/en/curl.installation.php) -- [Httpful](https://github.com/nategood/httpful) >= 0.1 - -## Issues - -Please use appropriately tagged github [issues](https://github.com/bninja/restful/issues) to request features or report bugs. - -## Installation - -You can install using [composer](#composer), a [phar](#phar) package or from [source](#source). Note that RESTful is [PSR-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md) compliant: - -### Composer - -If you don't have Composer [install](http://getcomposer.org/doc/00-intro.md#installation) it: - - $ curl -s https://getcomposer.org/installer | php - -Add this to your `composer.json`: - - { - "require": { - "bninja/restful": "*" - } - } - -Refresh your dependencies: - - $ php composer.phar update - - -Then make sure to `require` the autoloader and initialize both: - - setStub($stub); -exit_unless($phar, "Unable to create a phar. Make sure you have phar.readonly=0 set in your ini file."); -$phar->buildFromDirectory(dirname($source_dir)); -echo "[ OK ]\n"; - -echo "Renaming Phar... "; -$phar_versioned_name = 'restful-' . \RESTful\Settings::VERSION . '.phar'; -$phar_versioned_path = $base_dir . '/' . $phar_versioned_name; -rename($phar_path, $phar_versioned_path); -echo "[ OK ]\n"; \ No newline at end of file diff --git a/externals/restful/composer.json b/externals/restful/composer.json deleted file mode 100644 index 5cb3b439b7..0000000000 --- a/externals/restful/composer.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "bninja/restful", - "description": "Library for writing RESTful PHP clients.", - "homepage": "http://github.com/bninja/restful", - "license": "MIT", - "keywords": ["http", "api", "client", "rest"], - "version": "0.1.7", - "authors": [ - ], - "require": { - "nategood/httpful": "*" - }, - "autoload": { - "psr-0": { - "RESTful": "src/" - } - } -} diff --git a/externals/restful/src/RESTful/Bootstrap.php b/externals/restful/src/RESTful/Bootstrap.php deleted file mode 100644 index 9580e3d7de..0000000000 --- a/externals/restful/src/RESTful/Bootstrap.php +++ /dev/null @@ -1,44 +0,0 @@ -request_class = $request_class == null ? '\Httpful\Request' : $request_class; - $this->settings_class = $settings_class; - $this->convert_error = $convert_error; - } - - public function get($uri) - { - $settings_class = $this->settings_class; - $url = $settings_class::$url_root . $uri; - $request_class = $this->request_class; - $request = $request_class::get($url); - - return $this->_op($request); - } - - public function post($uri, $payload) - { - $settings_class = $this->settings_class; - $url = $settings_class::$url_root . $uri; - $request_class = $this->request_class; - $request = $request_class::post($url, $payload, 'json'); - - return $this->_op($request); - } - - public function put($uri, $payload) - { - $settings_class = $this->settings_class; - $url = $settings_class::$url_root . $uri; - $request_class = $this->request_class; - $request = $request_class::put($url, $payload, 'json'); - - return $this->_op($request); - } - - public function delete($uri) - { - $settings_class = $this->settings_class; - $url = $settings_class::$url_root . $uri; - $request_class = $this->request_class; - $request = $request_class::delete($url); - - return $this->_op($request); - } - - private function _op($request) - { - $settings_class = $this->settings_class; - $user_agent = $settings_class::$agent . '/' . $settings_class::$version; - $request->headers['User-Agent'] = $user_agent; - if ($settings_class::$api_key != null) { - $request = $request->authenticateWith($settings_class::$api_key, ''); - } - $request->expects('json'); - $response = $request->sendIt(); - if ($response->hasErrors() || $response->code == 300) { - if ($this->convert_error != null) { - $error = call_user_func($this->convert_error, $response); - } else { - $error = new HTTPError($response); - } - throw $error; - } - - return $response; - } -} diff --git a/externals/restful/src/RESTful/Collection.php b/externals/restful/src/RESTful/Collection.php deleted file mode 100644 index 1e8eb86111..0000000000 --- a/externals/restful/src/RESTful/Collection.php +++ /dev/null @@ -1,49 +0,0 @@ -_parseUri(); - } - - private function _parseUri() - { - $parsed = parse_url(http://github.com/$this-%3Euri); - $this->_uri = $parsed['path']; - if (array_key_exists('query', $parsed)) { - foreach (explode('&', $parsed['query']) as $param) { - $param = explode('=', $param); - $key = urldecode($param[0]); - $val = (count($param) == 1) ? null : urldecode($param[1]); - - // size - if ($key == 'limit') { - $this->_size = $val; - } - } - } - } - - public function create($payload) - { - $class = $this->resource; - $client = $class::getClient(); - $response = $client->post($this->uri, $payload); - - return new $this->resource($response->body); - } - - public function query() - { - return new Query($this->resource, $this->uri); - } - - public function paginate() - { - return new Pagination($this->resource, $this->uri); - } -} diff --git a/externals/restful/src/RESTful/Exceptions/Base.php b/externals/restful/src/RESTful/Exceptions/Base.php deleted file mode 100644 index 76a49506f3..0000000000 --- a/externals/restful/src/RESTful/Exceptions/Base.php +++ /dev/null @@ -1,10 +0,0 @@ -response = $response; - $this->_objectify($this->response->body); - } - - protected function _objectify($fields) - { - foreach ($fields as $key => $val) { - $this->$key = $val; - } - } -} diff --git a/externals/restful/src/RESTful/Exceptions/MultipleResultsFound.php b/externals/restful/src/RESTful/Exceptions/MultipleResultsFound.php deleted file mode 100644 index cde7d2f043..0000000000 --- a/externals/restful/src/RESTful/Exceptions/MultipleResultsFound.php +++ /dev/null @@ -1,11 +0,0 @@ -name = $name; - } - - public function __get($name) - { - return new Field($this->name . '.' . $name); - } - - public function in($vals) - { - return new FilterExpression($this->name, 'in', $vals, '!in'); - } - - public function startswith($prefix) - { - if (!is_string($prefix)) { - throw new \InvalidArgumentException('"startswith" prefix must be a string'); - } - - return new FilterExpression($this->name, 'contains', $prefix); - } - - public function endswith($suffix) - { - if (!is_string($suffix)) { - throw new \InvalidArgumentException('"endswith" suffix must be a string'); - } - - return new FilterExpression($this->name, 'contains', $suffix); - } - - public function contains($fragment) - { - if (!is_string($fragment)) { - throw new \InvalidArgumentException('"contains" fragment must be a string'); - } - - return new FilterExpression($this->name, 'contains', $fragment, '!contains'); - } - - public function eq($val) - { - return new FilterExpression($this->name, '=', $val, '!eq'); - } - - public function lt($val) - { - return new FilterExpression($this->name, '<', $val, '>='); - } - - public function lte($val) - { - return new FilterExpression($this->name, '<=', $val, '>'); - } - - public function gt($val) - { - return new FilterExpression($this->name, '>', $val, '<='); - } - - public function gte($val) - { - return new FilterExpression($this->name, '>=', $val, '<'); - } - - public function asc() - { - return new SortExpression($this->name, true); - } - - public function desc() - { - return new SortExpression($this->name, false); - } -} diff --git a/externals/restful/src/RESTful/Fields.php b/externals/restful/src/RESTful/Fields.php deleted file mode 100644 index ed2b62f89a..0000000000 --- a/externals/restful/src/RESTful/Fields.php +++ /dev/null @@ -1,11 +0,0 @@ -field = $field; - $this->op = $op; - $this->val = $val; - $this->not_op = $not_op; - } - - public function not() - { - if (null === $this->not_op) { - throw new \LogicException(sprintf('Filter cannot be inverted')); - } - $temp = $this->op; - $this->op = $this->not_op; - $this->not_op = $temp; - - return $this; - } -} diff --git a/externals/restful/src/RESTful/Itemization.php b/externals/restful/src/RESTful/Itemization.php deleted file mode 100644 index 11489e9470..0000000000 --- a/externals/restful/src/RESTful/Itemization.php +++ /dev/null @@ -1,99 +0,0 @@ -resource = $resource; - $this->uri = $uri; - if ($data != null) { - $this->_page = new Page($resource, $uri, $data); - } else { - $this->_page = null; - } - } - - protected function _getPage($offset = null) - { - if ($this->_page == null) { - $this->_offset = ($offset == null) ? 0 : $offset * $this->_size; - $uri = $this->_buildUri(); - $this->_page = new Page($this->resource, $uri); - } elseif ($offset != null) { - $offset = $offset * $this->_size; - if ($offset != $this->_offset) { - $this->_offset = $offset; - $uri = $this->_buildUri(); - $this->_page = new Page($this->resource, $uri); - } - } - - return $this->_page; - } - - protected function _getItem($offset) - { - $page_offset = floor($offset / $this->_size); - $page = $this->_getPage($page_offset); - - return $page->items[$offset - $page->offset]; - } - - public function total() - { - return $this->_getPage()->total; - } - - protected function _buildUri($offset = null) - { - # TODO: hacky but works for now - $offset = ($offset == null) ? $this->_offset : $offset; - if (strpos($this->uri, '?') === false) { - $uri = $this->uri . '?'; - } else { - $uri = $this->uri . '&'; - } - $uri = $uri . 'offset=' . strval($offset); - - return $uri; - } - - // IteratorAggregate - public function getIterator() - { - $uri = $this->_buildUri($offset = 0); - $uri = $this->_buildUri($offset = 0); - - return new ItemizationIterator($this->resource, $uri); - } - - // ArrayAccess - public function offsetSet($offset, $value) - { - throw new \BadMethodCallException(get_class($this) . ' array access is read-only'); - } - - public function offsetExists($offset) - { - return (0 <= $offset && $offset < $this->total()); - } - - public function offsetUnset($offset) - { - throw new \BadMethodCallException(get_class($this) . ' array access is read-only'); - } - - public function offsetGet($offset) - { - return $this->_getItem($offset); - } -} diff --git a/externals/restful/src/RESTful/ItemizationIterator.php b/externals/restful/src/RESTful/ItemizationIterator.php deleted file mode 100644 index 13d81b490d..0000000000 --- a/externals/restful/src/RESTful/ItemizationIterator.php +++ /dev/null @@ -1,45 +0,0 @@ -_page = new Page($resource, $uri, $data); - } - - // Iterator - public function current() - { - return $this->_page->items[$this->_offset]; - } - - public function key() - { - return $this->_page->offset + $this->_offset; - } - - public function next() - { - $this->_offset += 1; - if ($this->_offset >= count($this->_page->items)) { - $this->_offset = 0; - $this->_page = $this->_page->next(); - } - } - - public function rewind() - { - $this->_page = $this->_page->first(); - $this->_offset = 0; - } - - public function valid() - { - return ($this->_page != null && $this->_offset < count($this->_page->items)); - } -} diff --git a/externals/restful/src/RESTful/Page.php b/externals/restful/src/RESTful/Page.php deleted file mode 100644 index b611e21d3d..0000000000 --- a/externals/restful/src/RESTful/Page.php +++ /dev/null @@ -1,72 +0,0 @@ -resource = $resource; - if ($data == null) { - $client = $resource::getClient(); - $data = $client->get($uri)->body; - } - $this->total = $data->total; - $this->items = array_map( - function ($x) use ($resource) { - return new $resource($x); - }, - $data->items); - $this->offset = $data->offset; - $this->limit = $data->limit; - $this->_first_uri = property_exists($data, 'first_uri') ? $data->first_uri : null; - $this->_previous_uri = property_exists($data, 'previous_uri') ? $data->previous_uri : null; - $this->_next_uri = property_exists($data, 'next_uri') ? $data->next_uri : null; - $this->_last_uri = property_exists($data, 'last_uri') ? $data->last_uri : null; - } - - public function first() - { - return new Page($this->resource, $this->_first_uri); - } - - public function next() - { - if (!$this->hasNext()) { - return null; - } - - return new Page($this->resource, $this->_next_uri); - } - - public function hasNext() - { - return $this->_next_uri != null; - } - - public function previous() - { - return new Page($this->resource, $this->_previous_uri); - } - - public function hasPrevious() - { - return $this->_previous_uri != null; - } - - public function last() - { - return new Page($this->resource, $this->_last_uri); - } -} diff --git a/externals/restful/src/RESTful/Pagination.php b/externals/restful/src/RESTful/Pagination.php deleted file mode 100644 index 8284d3d0a8..0000000000 --- a/externals/restful/src/RESTful/Pagination.php +++ /dev/null @@ -1,90 +0,0 @@ -resource = $resource; - $this->uri = $uri; - if ($data != null) { - $this->_page = new Page($resource, $uri, $data); - } else { - $this->_page = null; - } - } - - protected function _getPage($offset = null) - { - if ($this->_page == null) { - $this->_offset = ($offset == null) ? 0 : $offset * $this->_size; - $uri = $this->_buildUri(); - $this->_page = new Page($this->resource, $uri); - } elseif ($offset != null) { - $offset = $offset * $this->_size; - if ($offset != $this->_offset) { - $this->_offset = $offset; - $uri = $this->_buildUri(); - $this->_page = new Page($this->resource, $uri); - } - } - - return $this->_page; - } - - public function total() - { - return floor($this->_getPage()->total / $this->_size); - } - - protected function _buildUri($offset = null) - { - # TODO: hacky but works for now - $offset = ($offset == null) ? $this->_offset : $offset; - if (strpos($this->uri, '?') === false) { - $uri = $this->uri . '?'; - } else { - $uri = $this->uri . '&'; - } - $uri = $uri . 'offset=' . strval($offset); - - return $uri; - } - - // IteratorAggregate - public function getIterator() - { - $uri = $this->_buildUri($offset = 0); - - return new PaginationIterator($this->resource, $uri); - } - - // ArrayAccess - public function offsetSet($offset, $value) - { - throw new \BadMethodCallException(get_class($this) . ' array access is read-only'); - } - - public function offsetExists($offset) - { - return (0 <= $offset && $offset < $this->total()); - } - - public function offsetUnset($offset) - { - throw new \BadMethodCallException(get_class($this) . ' array access is read-only'); - } - - public function offsetGet($offset) - { - return $this->_getPage($offset); - } -} diff --git a/externals/restful/src/RESTful/PaginationIterator.php b/externals/restful/src/RESTful/PaginationIterator.php deleted file mode 100644 index 7940c50e23..0000000000 --- a/externals/restful/src/RESTful/PaginationIterator.php +++ /dev/null @@ -1,37 +0,0 @@ -_page = new Page($resource, $uri, $data); - } - - // Iterator - public function current() - { - return $this->_page; - } - - public function key() - { - return $this->_page->index; - } - - public function next() - { - $this->_page = $this->_page->next(); - } - - public function rewind() - { - $this->_page = $this->_page->first(); - } - - public function valid() - { - return $this->_page != null; - } -} diff --git a/externals/restful/src/RESTful/Query.php b/externals/restful/src/RESTful/Query.php deleted file mode 100644 index 275dba1e55..0000000000 --- a/externals/restful/src/RESTful/Query.php +++ /dev/null @@ -1,161 +0,0 @@ -size = $this->_size; - $this->_parseUri($uri); - } - - private function _parseUri($uri) - { - $parsed = parse_url(http://github.com/$uri); - $this->uri = $parsed['path']; - if (array_key_exists('query', $parsed)) { - foreach (explode('&', $parsed['query']) as $param) { - $param = explode('=', $param); - $key = urldecode($param[0]); - $val = (count($param) == 1) ? null : urldecode($param[1]); - - // limit - if ($key == 'limit') { - $this->size = $this->_size = $val; - } // sorts - else if ($key == 'sort') { - array_push($this->sorts, $val); - } // everything else - else { - if (!array_key_exists($key, $this->filters)) { - $this->filters[$key] = array(); - } - if (!is_array($val)) { - $val = array($val); - } - $this->filters[$key] = array_merge($this->filters[$key], $val); - } - } - } - } - - protected function _buildUri($offset = null) - { - // params - $params = array_merge( - $this->filters, - array( - 'sort' => $this->sorts, - 'limit' => $this->_size, - 'offset' => ($offset == null) ? $this->_offset : $offset - ) - ); - $getSingle = function ($v) { - if (is_array($v) && count($v) == 1) - return $v[0]; - return $v; - }; - $params = array_map($getSingle, $params); - - // url encode params - // NOTE: http://stackoverflow.com/a/8171667/1339571 - $qs = http_build_query($params); - $qs = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', $qs); - - return $this->uri . '?' . $qs; - } - - private function _reset() - { - $this->_page = null; - } - - public function filter($expression) - { - if ($expression->op == '=') { - $field = $expression->field; - } else { - $field = $expression->field . '[' . $expression->op . ']'; - } - if (is_array($expression->val)) { - $val = implode(',', $expression->val); - } else { - $val = $expression->val; - } - if (!array_key_exists($field, $this->filters)) { - $this->filters[$field] = array(); - } - array_push($this->filters[$field], $val); - $this->_reset(); - - return $this; - } - - public function sort($expression) - { - $dir = $expression->ascending ? 'asc' : 'desc'; - array_push($this->sorts, $expression->field . ',' . $dir); - $this->_reset(); - - return $this; - } - - public function limit($limit) - { - $this->size = $this->_size = $limit; - $this->_reset(); - - return $this; - } - - public function all() - { - $items = array(); - foreach ($this as $item) { - array_push($items, $item); - } - - return $items; - } - - public function first() - { - $prev_size = $this->_size; - $this->_size = 1; - $page = new Page($this->resource, $this->_buildUri()); - $this->_size = $prev_size; - $item = count($page->items) != 0 ? $page->items[0] : null; - - return $item; - } - - public function one() - { - $prev_size = $this->_size; - $this->_size = 2; - $page = new Page($this->resource, $this->_buildUri()); - $this->_size = $prev_size; - if (count($page->items) == 1) { - return $page->items[0]; - } - if (count($page->items) == 0) { - throw new NoResultFound(); - } - - throw new MultipleResultsFound(); - } - - public function paginate() - { - return new Pagination($this->resource, $this->_buildUri()); - } -} diff --git a/externals/restful/src/RESTful/Registry.php b/externals/restful/src/RESTful/Registry.php deleted file mode 100644 index 9010b27d26..0000000000 --- a/externals/restful/src/RESTful/Registry.php +++ /dev/null @@ -1,29 +0,0 @@ -_resources, $resource); - } - - public function match($uri) - { - foreach ($this->_resources as $resource) { - $spec = $resource::getURISpec(); - $result = $spec->match($uri); - if ($result == null) { - continue; - } - $result['class'] = $resource; - - return $result; - } - - return null; - } -} diff --git a/externals/restful/src/RESTful/Resource.php b/externals/restful/src/RESTful/Resource.php deleted file mode 100644 index 2a60ae5b5d..0000000000 --- a/externals/restful/src/RESTful/Resource.php +++ /dev/null @@ -1,205 +0,0 @@ -_objectify($fields); - } - - public function __get($name) - { - // collection uri - if (array_key_exists($name, $this->_collection_uris)) { - $result = $this->_collection_uris[$name]; - $this->$name = new Collection($result['class'], $result['uri']); - - return $this->$name; - } // member uri - else if (array_key_exists($name, $this->_member_uris)) { - $result = $this->$_collection_uris[$name]; - $response = self::getClient() . get($result['uri']); - $class = $result['class']; - $this->$name = new $class($response->body); - - return $this->$name; - } - - // unknown - $trace = debug_backtrace(); - trigger_error( - sprintf('Undefined property via __get(): %s in %s on line %s', $name, $trace[0]['file'], $trace[0]['line']), - E_USER_NOTICE - ); - - return null; - } - - public function __isset($name) - { - if (array_key_exists($name, $this->_collection_uris) || array_key_exists($name, $this->_member_uris)) { - return true; - } - - return false; - } - - protected function _objectify($fields) - { - // initialize uris - $this->_collection_uris = array(); - $this->_member_uris = array(); - - foreach ($fields as $key => $val) { - // nested uri - if ((strlen($key) - 3) == strrpos($key, 'uri', 0) && $key != 'uri') { - $result = self::getRegistry()->match($val); - if ($result != null) { - $name = substr($key, 0, -4); - $class = $result['class']; - if ($result['collection']) { - $this->_collection_uris[$name] = array( - 'class' => $class, - 'uri' => $val, - ); - } else { - $this->_member_uris[$name] = array( - 'class' => $class, - 'uri' => $val, - ); - } - - continue; - } - } elseif (is_object($val) && property_exists($val, 'uri')) { - // nested - $result = self::getRegistry()->match($val->uri); - if ($result != null) { - $class = $result['class']; - if ($result['collection']) { - $this->$key = new Collection($class, $val['uri'], $val); - } else { - $this->$key = new $class($val); - } - - continue; - } - } elseif (is_array($val) && array_key_exists('uri', $val)) { - $result = self::getRegistry()->match($val['uri']); - if ($result != null) { - $class = $result['class']; - if ($result['collection']) { - $this->$key = new Collection($class, $val['uri'], $val); - } else { - $this->$key = new $class($val); - } - - continue; - } - } - - // default - $this->$key = $val; - } - } - - public static function query() - { - $uri_spec = self::getURISpec(); - if ($uri_spec == null || $uri_spec->collection_uri == null) { - $msg = sprintf('Cannot directly query %s resources', get_called_class()); - throw new \LogicException($msg); - } - - return new Query(get_called_class(), $uri_spec->collection_uri); - } - - public static function get($uri) - { - # id - if (strncmp($uri, '/', 1)) { - $uri_spec = self::getURISpec(); - if ($uri_spec == null || $uri_spec->collection_uri == null) { - $msg = sprintf('Cannot get %s resources by id %s', $class, $uri); - throw new \LogicException($msg); - } - $uri = $uri_spec->collection_uri . '/' . $uri; - } - - $response = self::getClient()->get($uri); - $class = get_called_class(); - - return new $class($response->body); - } - - public function save() - { - // payload - $payload = array(); - foreach ($this as $key => $val) { - if ($key[0] == '_' || is_object($val)) { - continue; - } - $payload[$key] = $val; - } - - // update - if (array_key_exists('uri', $payload)) { - $uri = $payload['uri']; - unset($payload['uri']); - $response = self::getClient()->put($uri, $payload); - } else { - // create - $class = get_class($this); - if ($class::$_uri_spec == null || $class::$_uri_spec->collection_uri == null) { - $msg = sprintf('Cannot directly create %s resources', $class); - throw new \LogicException($msg); - } - $response = self::getClient()->post($class::$_uri_spec->collection_uri, $payload); - } - - // re-objectify - foreach ($this as $key => $val) { - unset($this->$key); - } - $this->_objectify($response->body); - - return $this; - } - - public function delete() - { - self::getClient()->delete($this->uri); - - return $this; - } -} diff --git a/externals/restful/src/RESTful/Settings.php b/externals/restful/src/RESTful/Settings.php deleted file mode 100644 index 35e7975e20..0000000000 --- a/externals/restful/src/RESTful/Settings.php +++ /dev/null @@ -1,12 +0,0 @@ -field = $field; - $this->ascending = $ascending; - } -} diff --git a/externals/restful/src/RESTful/URISpec.php b/externals/restful/src/RESTful/URISpec.php deleted file mode 100644 index f5cad258b1..0000000000 --- a/externals/restful/src/RESTful/URISpec.php +++ /dev/null @@ -1,58 +0,0 @@ -name = $name; - if (!is_array($idNames)) { - $idNames = array($idNames); - } - $this->idNames = $idNames; - if ($root != null) { - if ($root == '' || substr($root, -1) == '/') { - $this->collection_uri = $root . $name; - } else { - $this->collection_uri = $root . '/' . $name; - } - } - } - - public function match($uri) - { - $parts = explode('/', rtrim($uri, "/")); - - // collection - if ($parts[count($parts) - 1] == $this->name) { - - return array( - 'collection' => true, - ); - } - - // non-member - if (count($parts) < count($this->idNames) + 1 || - $parts[count($parts) - 1 - count($this->idNames)] != $this->name - ) { - return null; - } - - // member - $ids = array_combine( - $this->idNames, - array_slice($parts, -count($this->idNames)) - ); - $result = array( - 'collection' => false, - 'ids' => $ids, - ); - - return $result; - } -} diff --git a/externals/restful/tests/RESTful/CoreTest.php b/externals/restful/tests/RESTful/CoreTest.php deleted file mode 100644 index 75594b2fc0..0000000000 --- a/externals/restful/tests/RESTful/CoreTest.php +++ /dev/null @@ -1,241 +0,0 @@ -add(get_called_class()); - } -} - -A::init(); - -class B extends Resource -{ - protected static $_uri_spec = null; - - public static function init() - { - self::$_uri_spec = new URISpec('bs', 'id', '/'); - self::$_registry->add(get_called_class()); - } -} - -B::init(); - -class URISpecTest extends \PHPUnit_Framework_TestCase -{ - public function testNoRoot() - { - $uri_spec = new URISpec('grapes', 'seed'); - $this->assertEquals($uri_spec->collection_uri, null); - - $result = $uri_spec->match('/some/raisins'); - $this->assertEquals($result, null); - - $result = $uri_spec->match('/some/grapes'); - $this->assertEquals($result, array('collection' => true)); - - $result = $uri_spec->match('/some/grapes/1234'); - $expected = array( - 'collection' => false, - 'ids' => array('seed' => '1234') - ); - $this->assertEquals($expected, $result); - } - - public function testSingleId() - { - $uri_spec = new URISpec('tomatoes', 'stem', '/v1'); - $this->assertNotEquals($uri_spec->collection_uri, null); - - $result = $uri_spec->match('/some/tomatoes/that/are/green'); - $this->assertEquals($result, null); - - $result = $uri_spec->match('/some/tomatoes'); - $this->assertEquals($result, array('collection' => true)); - - $result = $uri_spec->match('/some/tomatoes/4321'); - $expected = array( - 'collection' => false, - 'ids' => array('stem' => '4321') - ); - $this->assertEquals($expected, $result); - } - - public function testMultipleIds() - { - $uri_spec = new URISpec('tomatoes', array('stem', 'root'), '/v1'); - $this->assertNotEquals($uri_spec->collection_uri, null); - - $result = $uri_spec->match('/some/tomatoes/that/are/green'); - $this->assertEquals($result, null); - - $result = $uri_spec->match('/some/tomatoes'); - $this->assertEquals($result, array('collection' => true)); - - $result = $uri_spec->match('/some/tomatoes/4321/1234'); - $expected = array( - 'collection' => false, - 'ids' => array('stem' => '4321', 'root' => '1234') - ); - $this->assertEquals($expected, $result); - } -} - -class QueryTest extends \PHPUnit_Framework_TestCase -{ - public function testParse() - { - $uri = '/some/uri?field2=123&sort=field5%2Cdesc&limit=101&field3.field4%5Bcontains%5D=hi'; - $query = new Query('Resource', $uri); - $expected = array( - 'field2' => array('123'), - 'field3.field4[contains]' => array('hi') - ); - $this->assertEquals($query->filters, $expected); - $expected = array('field5,desc'); - $this->assertEquals($query->sorts, $expected); - $this->assertEquals($query->size, 101); - } - - public function testBuild() - { - $query = new Query('Resource', '/some/uri'); - $query->filter(Resource::$f->name->eq('Wonka Chocs')) - ->filter(Resource::$f->support_email->endswith('gmail.com')) - ->filter(Resource::$f->variable_fee_percentage->gte(3.5)) - ->sort(Resource::$f->name->asc()) - ->sort(Resource::$f->variable_fee_percentage->desc()) - ->limit(101); - $this->assertEquals( - $query->filters, - array( - 'name' => array('Wonka Chocs'), - 'support_email[contains]' => array('gmail.com'), - 'variable_fee_percentage[>=]'=> array(3.5) - ) - ); - $this->assertEquals( - $query->sorts, - array('name,asc', 'variable_fee_percentage,desc') - ); - $this->assertEquals( - $query->size, - 101 - ); - } -} - -class PageTest extends \PHPUnit_Framework_TestCase -{ - public function testConstruct() - { - $data = new \stdClass(); - $data->first_uri = 'some/first/uri'; - $data->previous_uri = 'some/previous/uri'; - $data->next_uri = null; - $data->last_uri = 'some/last/uri'; - $data->limit= 25; - $data->offset = 0; - $data->total = 101; - $data->items = array(); - - $page = new Page( - 'Resource', - '/some/uri', - $data - ); - - $this->assertEquals($page->resource, 'Resource'); - $this->assertEquals($page->total, 101); - $this->assertEquals($page->items, array()); - $this->assertTrue($page->hasPrevious()); - $this->assertFalse($page->hasNext()); - } -} - -class ResourceTest extends \PHPUnit_Framework_TestCase -{ - public function testQuery() - { - $query = A::query(); - $this->assertEquals(get_class($query), 'RESTful\Query'); - } - - public function testObjectify() - { - $a = new A(array( - 'uri' => '/as/123', - 'field1' => 123, - 'b' => array( - 'uri' => '/bs/321', - 'field2' => 321 - )) - ); - $this->assertEquals(get_class($a), 'RESTful\Test\A'); - $this->assertEquals($a->field1, 123); - $this->assertEquals(get_class($a->b), 'RESTful\Test\B'); - $this->assertEquals($a->b->field2, 321); - } -} diff --git a/externals/restful/tests/phpunit.xml b/externals/restful/tests/phpunit.xml deleted file mode 100644 index 117e02752d..0000000000 --- a/externals/restful/tests/phpunit.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - . - - - - - diff --git a/externals/s3/README.txt b/externals/s3/README.txt deleted file mode 100644 index 28a9e73f92..0000000000 --- a/externals/s3/README.txt +++ /dev/null @@ -1,105 +0,0 @@ -AMAZON S3 PHP CLASS - - -USING THE CLASS - -OO method (e,g; $s3->getObject(...)): -$s3 = new S3(awsAccessKey, awsSecretKey); - -Statically (e,g; S3::getObject(...)): -S3::setAuth(awsAccessKey, awsSecretKey); - - -For class documentation see: -http://undesigned.org.za/files/s3-class-documentation/index.html - - -OBJECTS - - -Put an object from a string: - $s3->putObject($string, $bucketName, $uploadName, S3::ACL_PUBLIC_READ) - Legacy function: $s3->putObjectString($string, $bucketName, $uploadName, S3::ACL_PUBLIC_READ) - - -Put an object from a file: - $s3->putObject($s3->inputFile($file, false), $bucketName, $uploadName, S3::ACL_PUBLIC_READ) - Legacy function: $s3->putObjectFile($uploadFile, $bucketName, $uploadName, S3::ACL_PUBLIC_READ) - - -Put an object from a resource (buffer/file size is required): - Please note: the resource will be fclose()'d automatically - $s3->putObject($s3->inputResource(fopen($file, 'rb'), filesize($file)), $bucketName, $uploadName, S3::ACL_PUBLIC_READ) - - -Get an object: - $s3->getObject($bucketName, $uploadName) - - -Save an object to file: - $s3->getObject($bucketName, $uploadName, $saveName) - - -Save an object to a resource of any type: - $s3->getObject($bucketName, $uploadName, fopen('savefile.txt', 'wb')) - - -Copy an object: - $s3->copyObject($srcBucket, $srcName, $bucketName, $saveName, $metaHeaders = array(), $requestHeaders = array()) - - -Delete an object: - $s3->deleteObject($bucketName, $uploadName) - - - -BUCKETS - - -Get a list of buckets: - $s3->listBuckets() // Simple bucket list - $s3->listBuckets(true) // Detailed bucket list - - -Create a public-read bucket: - $s3->putBucket($bucketName, S3::ACL_PUBLIC_READ) - $s3->putBucket($bucketName, S3::ACL_PUBLIC_READ, 'EU') // EU-hosted bucket - - -Get the contents of a bucket: - $s3->getBucket($bucketName) - - -Get a bucket's location: - $s3->getBucketLocation($bucketName) - - -Delete a bucket: - $s3->deleteBucket($bucketName) - - - - -KNOWN ISSUES - - Files larger than 2GB are not supported on 32 bit systems due to PHP’s signed integer problem - - - -MORE INFORMATION - - - Project URL: - http://undesigned.org.za/2007/10/22/amazon-s3-php-class - - Class documentation: - http://undesigned.org.za/files/s3-class-documentation/index.html - - Bug reports: - https://github.com/tpyo/amazon-s3-php-class/issues - - Amazon S3 documentation: - http://docs.amazonwebservices.com/AmazonS3/2006-03-01/ - - -EOF diff --git a/externals/s3/S3.php b/externals/s3/S3.php deleted file mode 100644 index 70e305e43f..0000000000 --- a/externals/s3/S3.php +++ /dev/null @@ -1,2317 +0,0 @@ - $host, 'type' => $type, 'user' => $user, 'pass' => $pass); - } - - - /** - * Set the error mode to exceptions - * - * @param boolean $enabled Enable exceptions - * @return void - */ - public static function setExceptions($enabled = true) - { - self::$useExceptions = $enabled; - } - - - /** - * Set signing key - * - * @param string $keyPairId AWS Key Pair ID - * @param string $signingKey Private Key - * @param boolean $isFile Load private key from file, set to false to load string - * @return boolean - */ - public static function setSigningKey($keyPairId, $signingKey, $isFile = true) - { - self::$__signingKeyPairId = $keyPairId; - if ((self::$__signingKeyResource = openssl_pkey_get_private($isFile ? - file_get_contents($signingKey) : $signingKey)) !== false) return true; - self::__triggerError('S3::setSigningKey(): Unable to open load private key: '.$signingKey, __FILE__, __LINE__); - return false; - } - - - /** - * Free signing key from memory, MUST be called if you are using setSigningKey() - * - * @return void - */ - public static function freeSigningKey() - { - if (self::$__signingKeyResource !== false) - openssl_free_key(self::$__signingKeyResource); - } - - - /** - * Internal error handler - * - * @internal Internal error handler - * @param string $message Error message - * @param string $file Filename - * @param integer $line Line number - * @param integer $code Error code - * @return void - */ - private static function __triggerError($message, $file, $line, $code = 0) - { - if (self::$useExceptions) - throw new S3Exception($message, $file, $line, $code); - else - trigger_error($message, E_USER_WARNING); - } - - - /** - * Get a list of buckets - * - * @param boolean $detailed Returns detailed bucket list when true - * @return array | false - */ - public static function listBuckets($detailed = false) - { - $rest = new S3Request('GET', '', '', self::$endpoint); - $rest = $rest->getResponse(); - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::listBuckets(): [%s] %s", $rest->error['code'], - $rest->error['message']), __FILE__, __LINE__); - return false; - } - $results = array(); - if (!isset($rest->body->Buckets)) return $results; - - if ($detailed) - { - if (isset($rest->body->Owner, $rest->body->Owner->ID, $rest->body->Owner->DisplayName)) - $results['owner'] = array( - 'id' => (string)$rest->body->Owner->ID, 'name' => (string)$rest->body->Owner->ID - ); - $results['buckets'] = array(); - foreach ($rest->body->Buckets->Bucket as $b) - $results['buckets'][] = array( - 'name' => (string)$b->Name, 'time' => strtotime((string)$b->CreationDate) - ); - } else - foreach ($rest->body->Buckets->Bucket as $b) $results[] = (string)$b->Name; - - return $results; - } - - - /** - * Get contents for a bucket - * - * If maxKeys is null this method will loop through truncated result sets - * - * @param string $bucket Bucket name - * @param string $prefix Prefix - * @param string $marker Marker (last file listed) - * @param string $maxKeys Max keys (maximum number of keys to return) - * @param string $delimiter Delimiter - * @param boolean $returnCommonPrefixes Set to true to return CommonPrefixes - * @return array | false - */ - public static function getBucket($bucket, $prefix = null, $marker = null, $maxKeys = null, $delimiter = null, $returnCommonPrefixes = false) - { - $rest = new S3Request('GET', $bucket, '', self::$endpoint); - if ($maxKeys == 0) $maxKeys = null; - if ($prefix !== null && $prefix !== '') $rest->setParameter('prefix', $prefix); - if ($marker !== null && $marker !== '') $rest->setParameter('marker', $marker); - if ($maxKeys !== null && $maxKeys !== '') $rest->setParameter('max-keys', $maxKeys); - if ($delimiter !== null && $delimiter !== '') $rest->setParameter('delimiter', $delimiter); - $response = $rest->getResponse(); - if ($response->error === false && $response->code !== 200) - $response->error = array('code' => $response->code, 'message' => 'Unexpected HTTP status'); - if ($response->error !== false) - { - self::__triggerError(sprintf("S3::getBucket(): [%s] %s", - $response->error['code'], $response->error['message']), __FILE__, __LINE__); - return false; - } - - $results = array(); - - $nextMarker = null; - if (isset($response->body, $response->body->Contents)) - foreach ($response->body->Contents as $c) - { - $results[(string)$c->Key] = array( - 'name' => (string)$c->Key, - 'time' => strtotime((string)$c->LastModified), - 'size' => (int)$c->Size, - 'hash' => substr((string)$c->ETag, 1, -1) - ); - $nextMarker = (string)$c->Key; - } - - if ($returnCommonPrefixes && isset($response->body, $response->body->CommonPrefixes)) - foreach ($response->body->CommonPrefixes as $c) - $results[(string)$c->Prefix] = array('prefix' => (string)$c->Prefix); - - if (isset($response->body, $response->body->IsTruncated) && - (string)$response->body->IsTruncated == 'false') return $results; - - if (isset($response->body, $response->body->NextMarker)) - $nextMarker = (string)$response->body->NextMarker; - - // Loop through truncated results if maxKeys isn't specified - if ($maxKeys == null && $nextMarker !== null && (string)$response->body->IsTruncated == 'true') - do - { - $rest = new S3Request('GET', $bucket, '', self::$endpoint); - if ($prefix !== null && $prefix !== '') $rest->setParameter('prefix', $prefix); - $rest->setParameter('marker', $nextMarker); - if ($delimiter !== null && $delimiter !== '') $rest->setParameter('delimiter', $delimiter); - - if (($response = $rest->getResponse()) == false || $response->code !== 200) break; - - if (isset($response->body, $response->body->Contents)) - foreach ($response->body->Contents as $c) - { - $results[(string)$c->Key] = array( - 'name' => (string)$c->Key, - 'time' => strtotime((string)$c->LastModified), - 'size' => (int)$c->Size, - 'hash' => substr((string)$c->ETag, 1, -1) - ); - $nextMarker = (string)$c->Key; - } - - if ($returnCommonPrefixes && isset($response->body, $response->body->CommonPrefixes)) - foreach ($response->body->CommonPrefixes as $c) - $results[(string)$c->Prefix] = array('prefix' => (string)$c->Prefix); - - if (isset($response->body, $response->body->NextMarker)) - $nextMarker = (string)$response->body->NextMarker; - - } while ($response !== false && (string)$response->body->IsTruncated == 'true'); - - return $results; - } - - - /** - * Put a bucket - * - * @param string $bucket Bucket name - * @param constant $acl ACL flag - * @param string $location Set as "EU" to create buckets hosted in Europe - * @return boolean - */ - public static function putBucket($bucket, $acl = self::ACL_PRIVATE, $location = false) - { - $rest = new S3Request('PUT', $bucket, '', self::$endpoint); - $rest->setAmzHeader('x-amz-acl', $acl); - - if ($location !== false) - { - $dom = new DOMDocument; - $createBucketConfiguration = $dom->createElement('CreateBucketConfiguration'); - $locationConstraint = $dom->createElement('LocationConstraint', $location); - $createBucketConfiguration->appendChild($locationConstraint); - $dom->appendChild($createBucketConfiguration); - $rest->data = $dom->saveXML(); - $rest->size = strlen($rest->data); - $rest->setHeader('Content-Type', 'application/xml'); - } - $rest = $rest->getResponse(); - - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::putBucket({$bucket}, {$acl}, {$location}): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - return true; - } - - - /** - * Delete an empty bucket - * - * @param string $bucket Bucket name - * @return boolean - */ - public static function deleteBucket($bucket) - { - $rest = new S3Request('DELETE', $bucket, '', self::$endpoint); - $rest = $rest->getResponse(); - if ($rest->error === false && $rest->code !== 204) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::deleteBucket({$bucket}): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - return true; - } - - - /** - * Create input info array for putObject() - * - * @param string $file Input file - * @param mixed $md5sum Use MD5 hash (supply a string if you want to use your own) - * @return array | false - */ - public static function inputFile($file, $md5sum = true) - { - if (!file_exists($file) || !is_file($file) || !is_readable($file)) - { - self::__triggerError('S3::inputFile(): Unable to open input file: '.$file, __FILE__, __LINE__); - return false; - } - return array('file' => $file, 'size' => filesize($file), 'md5sum' => $md5sum !== false ? - (is_string($md5sum) ? $md5sum : base64_encode(md5_file($file, true))) : ''); - } - - - /** - * Create input array info for putObject() with a resource - * - * @param string $resource Input resource to read from - * @param integer $bufferSize Input byte size - * @param string $md5sum MD5 hash to send (optional) - * @return array | false - */ - public static function inputResource(&$resource, $bufferSize = false, $md5sum = '') - { - if (!is_resource($resource) || (int)$bufferSize < 0) - { - self::__triggerError('S3::inputResource(): Invalid resource or buffer size', __FILE__, __LINE__); - return false; - } - - // Try to figure out the bytesize - if ($bufferSize === false) - { - if (fseek($resource, 0, SEEK_END) < 0 || ($bufferSize = ftell($resource)) === false) - { - self::__triggerError('S3::inputResource(): Unable to obtain resource size', __FILE__, __LINE__); - return false; - } - fseek($resource, 0); - } - - $input = array('size' => $bufferSize, 'md5sum' => $md5sum); - $input['fp'] =& $resource; - return $input; - } - - - /** - * Put an object - * - * @param mixed $input Input data - * @param string $bucket Bucket name - * @param string $uri Object URI - * @param constant $acl ACL constant - * @param array $metaHeaders Array of x-amz-meta-* headers - * @param array $requestHeaders Array of request headers or content type as a string - * @param constant $storageClass Storage class constant - * @param constant $serverSideEncryption Server-side encryption - * @return boolean - */ - public static function putObject($input, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array(), $storageClass = self::STORAGE_CLASS_STANDARD, $serverSideEncryption = self::SSE_NONE) - { - if ($input === false) return false; - $rest = new S3Request('PUT', $bucket, $uri, self::$endpoint); - - if (!is_array($input)) $input = array( - 'data' => $input, 'size' => strlen($input), - 'md5sum' => base64_encode(md5($input, true)) - ); - - // Data - if (isset($input['fp'])) - $rest->fp =& $input['fp']; - elseif (isset($input['file'])) - $rest->fp = @fopen($input['file'], 'rb'); - elseif (isset($input['data'])) - $rest->data = $input['data']; - - // Content-Length (required) - if (isset($input['size']) && $input['size'] >= 0) - $rest->size = $input['size']; - else { - if (isset($input['file'])) - $rest->size = filesize($input['file']); - elseif (isset($input['data'])) - $rest->size = strlen($input['data']); - } - - // Custom request headers (Content-Type, Content-Disposition, Content-Encoding) - if (is_array($requestHeaders)) - foreach ($requestHeaders as $h => $v) $rest->setHeader($h, $v); - elseif (is_string($requestHeaders)) // Support for legacy contentType parameter - $input['type'] = $requestHeaders; - - // Content-Type - if (!isset($input['type'])) - { - if (isset($requestHeaders['Content-Type'])) - $input['type'] =& $requestHeaders['Content-Type']; - elseif (isset($input['file'])) - $input['type'] = self::__getMimeType($input['file']); - else - $input['type'] = 'application/octet-stream'; - } - - if ($storageClass !== self::STORAGE_CLASS_STANDARD) // Storage class - $rest->setAmzHeader('x-amz-storage-class', $storageClass); - - if ($serverSideEncryption !== self::SSE_NONE) // Server-side encryption - $rest->setAmzHeader('x-amz-server-side-encryption', $serverSideEncryption); - - // We need to post with Content-Length and Content-Type, MD5 is optional - if ($rest->size >= 0 && ($rest->fp !== false || $rest->data !== false)) - { - $rest->setHeader('Content-Type', $input['type']); - if (isset($input['md5sum'])) $rest->setHeader('Content-MD5', $input['md5sum']); - - $rest->setAmzHeader('x-amz-acl', $acl); - foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v); - $rest->getResponse(); - } else - $rest->response->error = array('code' => 0, 'message' => 'Missing input parameters'); - - if ($rest->response->error === false && $rest->response->code !== 200) - $rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status'); - if ($rest->response->error !== false) - { - self::__triggerError(sprintf("S3::putObject(): [%s] %s", - $rest->response->error['code'], $rest->response->error['message']), __FILE__, __LINE__); - return false; - } - return true; - } - - - /** - * Put an object from a file (legacy function) - * - * @param string $file Input file path - * @param string $bucket Bucket name - * @param string $uri Object URI - * @param constant $acl ACL constant - * @param array $metaHeaders Array of x-amz-meta-* headers - * @param string $contentType Content type - * @return boolean - */ - public static function putObjectFile($file, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $contentType = null) - { - return self::putObject(self::inputFile($file), $bucket, $uri, $acl, $metaHeaders, $contentType); - } - - - /** - * Put an object from a string (legacy function) - * - * @param string $string Input data - * @param string $bucket Bucket name - * @param string $uri Object URI - * @param constant $acl ACL constant - * @param array $metaHeaders Array of x-amz-meta-* headers - * @param string $contentType Content type - * @return boolean - */ - public static function putObjectString($string, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $contentType = 'text/plain') - { - return self::putObject($string, $bucket, $uri, $acl, $metaHeaders, $contentType); - } - - - /** - * Get an object - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @param mixed $saveTo Filename or resource to write to - * @return mixed - */ - public static function getObject($bucket, $uri, $saveTo = false) - { - $rest = new S3Request('GET', $bucket, $uri, self::$endpoint); - if ($saveTo !== false) - { - if (is_resource($saveTo)) - $rest->fp =& $saveTo; - else - if (($rest->fp = @fopen($saveTo, 'wb')) !== false) - $rest->file = realpath($saveTo); - else - $rest->response->error = array('code' => 0, 'message' => 'Unable to open save file for writing: '.$saveTo); - } - if ($rest->response->error === false) $rest->getResponse(); - - if ($rest->response->error === false && $rest->response->code !== 200) - $rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status'); - if ($rest->response->error !== false) - { - self::__triggerError(sprintf("S3::getObject({$bucket}, {$uri}): [%s] %s", - $rest->response->error['code'], $rest->response->error['message']), __FILE__, __LINE__); - return false; - } - return $rest->response; - } - - - /** - * Get object information - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @param boolean $returnInfo Return response information - * @return mixed | false - */ - public static function getObjectInfo($bucket, $uri, $returnInfo = true) - { - $rest = new S3Request('HEAD', $bucket, $uri, self::$endpoint); - $rest = $rest->getResponse(); - if ($rest->error === false && ($rest->code !== 200 && $rest->code !== 404)) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::getObjectInfo({$bucket}, {$uri}): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - return $rest->code == 200 ? $returnInfo ? $rest->headers : true : false; - } - - - /** - * Copy an object - * - * @param string $srcBucket Source bucket name - * @param string $srcUri Source object URI - * @param string $bucket Destination bucket name - * @param string $uri Destination object URI - * @param constant $acl ACL constant - * @param array $metaHeaders Optional array of x-amz-meta-* headers - * @param array $requestHeaders Optional array of request headers (content type, disposition, etc.) - * @param constant $storageClass Storage class constant - * @return mixed | false - */ - public static function copyObject($srcBucket, $srcUri, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array(), $storageClass = self::STORAGE_CLASS_STANDARD) - { - $rest = new S3Request('PUT', $bucket, $uri, self::$endpoint); - $rest->setHeader('Content-Length', 0); - foreach ($requestHeaders as $h => $v) $rest->setHeader($h, $v); - foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v); - if ($storageClass !== self::STORAGE_CLASS_STANDARD) // Storage class - $rest->setAmzHeader('x-amz-storage-class', $storageClass); - $rest->setAmzHeader('x-amz-acl', $acl); - $rest->setAmzHeader('x-amz-copy-source', sprintf('/%s/%s', $srcBucket, rawurlencode($srcUri))); - if (sizeof($requestHeaders) > 0 || sizeof($metaHeaders) > 0) - $rest->setAmzHeader('x-amz-metadata-directive', 'REPLACE'); - - $rest = $rest->getResponse(); - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::copyObject({$srcBucket}, {$srcUri}, {$bucket}, {$uri}): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - return isset($rest->body->LastModified, $rest->body->ETag) ? array( - 'time' => strtotime((string)$rest->body->LastModified), - 'hash' => substr((string)$rest->body->ETag, 1, -1) - ) : false; - } - - - /** - * Set up a bucket redirection - * - * @param string $bucket Bucket name - * @param string $location Target host name - * @return boolean - */ - public static function setBucketRedirect($bucket = NULL, $location = NULL) - { - $rest = new S3Request('PUT', $bucket, '', self::$endpoint); - - if( empty($bucket) || empty($location) ) { - self::__triggerError("S3::setBucketRedirect({$bucket}, {$location}): Empty parameter.", __FILE__, __LINE__); - return false; - } - - $dom = new DOMDocument; - $websiteConfiguration = $dom->createElement('WebsiteConfiguration'); - $redirectAllRequestsTo = $dom->createElement('RedirectAllRequestsTo'); - $hostName = $dom->createElement('HostName', $location); - $redirectAllRequestsTo->appendChild($hostName); - $websiteConfiguration->appendChild($redirectAllRequestsTo); - $dom->appendChild($websiteConfiguration); - $rest->setParameter('website', null); - $rest->data = $dom->saveXML(); - $rest->size = strlen($rest->data); - $rest->setHeader('Content-Type', 'application/xml'); - $rest = $rest->getResponse(); - - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::setBucketRedirect({$bucket}, {$location}): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - return true; - } - - - /** - * Set logging for a bucket - * - * @param string $bucket Bucket name - * @param string $targetBucket Target bucket (where logs are stored) - * @param string $targetPrefix Log prefix (e,g; domain.com-) - * @return boolean - */ - public static function setBucketLogging($bucket, $targetBucket, $targetPrefix = null) - { - // The S3 log delivery group has to be added to the target bucket's ACP - if ($targetBucket !== null && ($acp = self::getAccessControlPolicy($targetBucket, '')) !== false) - { - // Only add permissions to the target bucket when they do not exist - $aclWriteSet = false; - $aclReadSet = false; - foreach ($acp['acl'] as $acl) - if ($acl['type'] == 'Group' && $acl['uri'] == 'http://acs.amazonaws.com/groups/s3/LogDelivery') - { - if ($acl['permission'] == 'WRITE') $aclWriteSet = true; - elseif ($acl['permission'] == 'READ_ACP') $aclReadSet = true; - } - if (!$aclWriteSet) $acp['acl'][] = array( - 'type' => 'Group', 'uri' => 'http://acs.amazonaws.com/groups/s3/LogDelivery', 'permission' => 'WRITE' - ); - if (!$aclReadSet) $acp['acl'][] = array( - 'type' => 'Group', 'uri' => 'http://acs.amazonaws.com/groups/s3/LogDelivery', 'permission' => 'READ_ACP' - ); - if (!$aclReadSet || !$aclWriteSet) self::setAccessControlPolicy($targetBucket, '', $acp); - } - - $dom = new DOMDocument; - $bucketLoggingStatus = $dom->createElement('BucketLoggingStatus'); - $bucketLoggingStatus->setAttribute('xmlns', 'http://s3.amazonaws.com/doc/2006-03-01/'); - if ($targetBucket !== null) - { - if ($targetPrefix == null) $targetPrefix = $bucket . '-'; - $loggingEnabled = $dom->createElement('LoggingEnabled'); - $loggingEnabled->appendChild($dom->createElement('TargetBucket', $targetBucket)); - $loggingEnabled->appendChild($dom->createElement('TargetPrefix', $targetPrefix)); - // TODO: Add TargetGrants? - $bucketLoggingStatus->appendChild($loggingEnabled); - } - $dom->appendChild($bucketLoggingStatus); - - $rest = new S3Request('PUT', $bucket, '', self::$endpoint); - $rest->setParameter('logging', null); - $rest->data = $dom->saveXML(); - $rest->size = strlen($rest->data); - $rest->setHeader('Content-Type', 'application/xml'); - $rest = $rest->getResponse(); - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::setBucketLogging({$bucket}, {$targetBucket}): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - return true; - } - - - /** - * Get logging status for a bucket - * - * This will return false if logging is not enabled. - * Note: To enable logging, you also need to grant write access to the log group - * - * @param string $bucket Bucket name - * @return array | false - */ - public static function getBucketLogging($bucket) - { - $rest = new S3Request('GET', $bucket, '', self::$endpoint); - $rest->setParameter('logging', null); - $rest = $rest->getResponse(); - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::getBucketLogging({$bucket}): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - if (!isset($rest->body->LoggingEnabled)) return false; // No logging - return array( - 'targetBucket' => (string)$rest->body->LoggingEnabled->TargetBucket, - 'targetPrefix' => (string)$rest->body->LoggingEnabled->TargetPrefix, - ); - } - - - /** - * Disable bucket logging - * - * @param string $bucket Bucket name - * @return boolean - */ - public static function disableBucketLogging($bucket) - { - return self::setBucketLogging($bucket, null); - } - - - /** - * Get a bucket's location - * - * @param string $bucket Bucket name - * @return string | false - */ - public static function getBucketLocation($bucket) - { - $rest = new S3Request('GET', $bucket, '', self::$endpoint); - $rest->setParameter('location', null); - $rest = $rest->getResponse(); - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::getBucketLocation({$bucket}): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - return (isset($rest->body[0]) && (string)$rest->body[0] !== '') ? (string)$rest->body[0] : 'US'; - } - - - /** - * Set object or bucket Access Control Policy - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @param array $acp Access Control Policy Data (same as the data returned from getAccessControlPolicy) - * @return boolean - */ - public static function setAccessControlPolicy($bucket, $uri = '', $acp = array()) - { - $dom = new DOMDocument; - $dom->formatOutput = true; - $accessControlPolicy = $dom->createElement('AccessControlPolicy'); - $accessControlList = $dom->createElement('AccessControlList'); - - // It seems the owner has to be passed along too - $owner = $dom->createElement('Owner'); - $owner->appendChild($dom->createElement('ID', $acp['owner']['id'])); - $owner->appendChild($dom->createElement('DisplayName', $acp['owner']['name'])); - $accessControlPolicy->appendChild($owner); - - foreach ($acp['acl'] as $g) - { - $grant = $dom->createElement('Grant'); - $grantee = $dom->createElement('Grantee'); - $grantee->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); - if (isset($g['id'])) - { // CanonicalUser (DisplayName is omitted) - $grantee->setAttribute('xsi:type', 'CanonicalUser'); - $grantee->appendChild($dom->createElement('ID', $g['id'])); - } - elseif (isset($g['email'])) - { // AmazonCustomerByEmail - $grantee->setAttribute('xsi:type', 'AmazonCustomerByEmail'); - $grantee->appendChild($dom->createElement('EmailAddress', $g['email'])); - } - elseif ($g['type'] == 'Group') - { // Group - $grantee->setAttribute('xsi:type', 'Group'); - $grantee->appendChild($dom->createElement('URI', $g['uri'])); - } - $grant->appendChild($grantee); - $grant->appendChild($dom->createElement('Permission', $g['permission'])); - $accessControlList->appendChild($grant); - } - - $accessControlPolicy->appendChild($accessControlList); - $dom->appendChild($accessControlPolicy); - - $rest = new S3Request('PUT', $bucket, $uri, self::$endpoint); - $rest->setParameter('acl', null); - $rest->data = $dom->saveXML(); - $rest->size = strlen($rest->data); - $rest->setHeader('Content-Type', 'application/xml'); - $rest = $rest->getResponse(); - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::setAccessControlPolicy({$bucket}, {$uri}): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - return true; - } - - - /** - * Get object or bucket Access Control Policy - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @return mixed | false - */ - public static function getAccessControlPolicy($bucket, $uri = '') - { - $rest = new S3Request('GET', $bucket, $uri, self::$endpoint); - $rest->setParameter('acl', null); - $rest = $rest->getResponse(); - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::getAccessControlPolicy({$bucket}, {$uri}): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - - $acp = array(); - if (isset($rest->body->Owner, $rest->body->Owner->ID, $rest->body->Owner->DisplayName)) - $acp['owner'] = array( - 'id' => (string)$rest->body->Owner->ID, 'name' => (string)$rest->body->Owner->DisplayName - ); - - if (isset($rest->body->AccessControlList)) - { - $acp['acl'] = array(); - foreach ($rest->body->AccessControlList->Grant as $grant) - { - foreach ($grant->Grantee as $grantee) - { - if (isset($grantee->ID, $grantee->DisplayName)) // CanonicalUser - $acp['acl'][] = array( - 'type' => 'CanonicalUser', - 'id' => (string)$grantee->ID, - 'name' => (string)$grantee->DisplayName, - 'permission' => (string)$grant->Permission - ); - elseif (isset($grantee->EmailAddress)) // AmazonCustomerByEmail - $acp['acl'][] = array( - 'type' => 'AmazonCustomerByEmail', - 'email' => (string)$grantee->EmailAddress, - 'permission' => (string)$grant->Permission - ); - elseif (isset($grantee->URI)) // Group - $acp['acl'][] = array( - 'type' => 'Group', - 'uri' => (string)$grantee->URI, - 'permission' => (string)$grant->Permission - ); - else continue; - } - } - } - return $acp; - } - - - /** - * Delete an object - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @return boolean - */ - public static function deleteObject($bucket, $uri) - { - $rest = new S3Request('DELETE', $bucket, $uri, self::$endpoint); - $rest = $rest->getResponse(); - if ($rest->error === false && $rest->code !== 204) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::deleteObject(): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - return true; - } - - - /** - * Get a query string authenticated URL - * - * @param string $bucket Bucket name - * @param string $uri Object URI - * @param integer $lifetime Lifetime in seconds - * @param boolean $hostBucket Use the bucket name as the hostname - * @param boolean $https Use HTTPS ($hostBucket should be false for SSL verification) - * @return string - */ - public static function getAuthenticatedURL($bucket, $uri, $lifetime, $hostBucket = false, $https = false) - { - $expires = time() + $lifetime; - $uri = str_replace(array('%2F', '%2B'), array('/', '+'), rawurlencode($uri)); - return sprintf(($https ? 'https' : 'http').'://%s/%s?AWSAccessKeyId=%s&Expires=%u&Signature=%s', - // $hostBucket ? $bucket : $bucket.'.s3.amazonaws.com', $uri, self::$__accessKey, $expires, - $hostBucket ? $bucket : self::$endpoint.'/'.$bucket, $uri, self::$__accessKey, $expires, - urlencode(self::__getHash("GET\n\n\n{$expires}\n/{$bucket}/{$uri}"))); - } - - - /** - * Get a CloudFront signed policy URL - * - * @param array $policy Policy - * @return string - */ - public static function getSignedPolicyURL($policy) - { - $data = json_encode($policy); - $signature = ''; - if (!openssl_sign($data, $signature, self::$__signingKeyResource)) return false; - - $encoded = str_replace(array('+', '='), array('-', '_', '~'), base64_encode($data)); - $signature = str_replace(array('+', '='), array('-', '_', '~'), base64_encode($signature)); - - $url = $policy['Statement'][0]['Resource'] . '?'; - foreach (array('Policy' => $encoded, 'Signature' => $signature, 'Key-Pair-Id' => self::$__signingKeyPairId) as $k => $v) - $url .= $k.'='.str_replace('%2F', '/', rawurlencode($v)).'&'; - return substr($url, 0, -1); - } - - - /** - * Get a CloudFront canned policy URL - * - * @param string $url URL to sign - * @param integer $lifetime URL lifetime - * @return string - */ - public static function getSignedCannedURL($url, $lifetime) - { - return self::getSignedPolicyURL(array( - 'Statement' => array( - array('Resource' => $url, 'Condition' => array( - 'DateLessThan' => array('AWS:EpochTime' => time() + $lifetime) - )) - ) - )); - } - - - /** - * Get upload POST parameters for form uploads - * - * @param string $bucket Bucket name - * @param string $uriPrefix Object URI prefix - * @param constant $acl ACL constant - * @param integer $lifetime Lifetime in seconds - * @param integer $maxFileSize Maximum filesize in bytes (default 5MB) - * @param string $successRedirect Redirect URL or 200 / 201 status code - * @param array $amzHeaders Array of x-amz-meta-* headers - * @param array $headers Array of request headers or content type as a string - * @param boolean $flashVars Includes additional "Filename" variable posted by Flash - * @return object - */ - public static function getHttpUploadPostParams($bucket, $uriPrefix = '', $acl = self::ACL_PRIVATE, $lifetime = 3600, - $maxFileSize = 5242880, $successRedirect = "201", $amzHeaders = array(), $headers = array(), $flashVars = false) - { - // Create policy object - $policy = new stdClass; - $policy->expiration = gmdate('Y-m-d\TH:i:s\Z', (time() + $lifetime)); - $policy->conditions = array(); - $obj = new stdClass; $obj->bucket = $bucket; array_push($policy->conditions, $obj); - $obj = new stdClass; $obj->acl = $acl; array_push($policy->conditions, $obj); - - $obj = new stdClass; // 200 for non-redirect uploads - if (is_numeric($successRedirect) && in_array((int)$successRedirect, array(200, 201))) - $obj->success_action_status = (string)$successRedirect; - else // URL - $obj->success_action_redirect = $successRedirect; - array_push($policy->conditions, $obj); - - if ($acl !== self::ACL_PUBLIC_READ) - array_push($policy->conditions, array('eq', '$acl', $acl)); - - array_push($policy->conditions, array('starts-with', '$key', $uriPrefix)); - if ($flashVars) array_push($policy->conditions, array('starts-with', '$Filename', '')); - foreach (array_keys($headers) as $headerKey) - array_push($policy->conditions, array('starts-with', '$'.$headerKey, '')); - foreach ($amzHeaders as $headerKey => $headerVal) - { - $obj = new stdClass; - $obj->{$headerKey} = (string)$headerVal; - array_push($policy->conditions, $obj); - } - array_push($policy->conditions, array('content-length-range', 0, $maxFileSize)); - $policy = base64_encode(str_replace('\/', '/', json_encode($policy))); - - // Create parameters - $params = new stdClass; - $params->AWSAccessKeyId = self::$__accessKey; - $params->key = $uriPrefix.'${filename}'; - $params->acl = $acl; - $params->policy = $policy; unset($policy); - $params->signature = self::__getHash($params->policy); - if (is_numeric($successRedirect) && in_array((int)$successRedirect, array(200, 201))) - $params->success_action_status = (string)$successRedirect; - else - $params->success_action_redirect = $successRedirect; - foreach ($headers as $headerKey => $headerVal) $params->{$headerKey} = (string)$headerVal; - foreach ($amzHeaders as $headerKey => $headerVal) $params->{$headerKey} = (string)$headerVal; - return $params; - } - - - /** - * Create a CloudFront distribution - * - * @param string $bucket Bucket name - * @param boolean $enabled Enabled (true/false) - * @param array $cnames Array containing CNAME aliases - * @param string $comment Use the bucket name as the hostname - * @param string $defaultRootObject Default root object - * @param string $originAccessIdentity Origin access identity - * @param array $trustedSigners Array of trusted signers - * @return array | false - */ - public static function createDistribution($bucket, $enabled = true, $cnames = array(), $comment = null, $defaultRootObject = null, $originAccessIdentity = null, $trustedSigners = array()) - { - if (!extension_loaded('openssl')) - { - self::__triggerError(sprintf("S3::createDistribution({$bucket}, ".(int)$enabled.", [], '$comment'): %s", - "CloudFront functionality requires SSL"), __FILE__, __LINE__); - return false; - } - $useSSL = self::$useSSL; - - self::$useSSL = true; // CloudFront requires SSL - $rest = new S3Request('POST', '', '2010-11-01/distribution', 'cloudfront.amazonaws.com'); - $rest->data = self::__getCloudFrontDistributionConfigXML( - $bucket.'.s3.amazonaws.com', - $enabled, - (string)$comment, - (string)microtime(true), - $cnames, - $defaultRootObject, - $originAccessIdentity, - $trustedSigners - ); - - $rest->size = strlen($rest->data); - $rest->setHeader('Content-Type', 'application/xml'); - $rest = self::__getCloudFrontResponse($rest); - - self::$useSSL = $useSSL; - - if ($rest->error === false && $rest->code !== 201) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::createDistribution({$bucket}, ".(int)$enabled.", [], '$comment'): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } elseif ($rest->body instanceof SimpleXMLElement) - return self::__parseCloudFrontDistributionConfig($rest->body); - return false; - } - - - /** - * Get CloudFront distribution info - * - * @param string $distributionId Distribution ID from listDistributions() - * @return array | false - */ - public static function getDistribution($distributionId) - { - if (!extension_loaded('openssl')) - { - self::__triggerError(sprintf("S3::getDistribution($distributionId): %s", - "CloudFront functionality requires SSL"), __FILE__, __LINE__); - return false; - } - $useSSL = self::$useSSL; - - self::$useSSL = true; // CloudFront requires SSL - $rest = new S3Request('GET', '', '2010-11-01/distribution/'.$distributionId, 'cloudfront.amazonaws.com'); - $rest = self::__getCloudFrontResponse($rest); - - self::$useSSL = $useSSL; - - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::getDistribution($distributionId): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - elseif ($rest->body instanceof SimpleXMLElement) - { - $dist = self::__parseCloudFrontDistributionConfig($rest->body); - $dist['hash'] = $rest->headers['hash']; - $dist['id'] = $distributionId; - return $dist; - } - return false; - } - - - /** - * Update a CloudFront distribution - * - * @param array $dist Distribution array info identical to output of getDistribution() - * @return array | false - */ - public static function updateDistribution($dist) - { - if (!extension_loaded('openssl')) - { - self::__triggerError(sprintf("S3::updateDistribution({$dist['id']}): %s", - "CloudFront functionality requires SSL"), __FILE__, __LINE__); - return false; - } - - $useSSL = self::$useSSL; - - self::$useSSL = true; // CloudFront requires SSL - $rest = new S3Request('PUT', '', '2010-11-01/distribution/'.$dist['id'].'/config', 'cloudfront.amazonaws.com'); - $rest->data = self::__getCloudFrontDistributionConfigXML( - $dist['origin'], - $dist['enabled'], - $dist['comment'], - $dist['callerReference'], - $dist['cnames'], - $dist['defaultRootObject'], - $dist['originAccessIdentity'], - $dist['trustedSigners'] - ); - - $rest->size = strlen($rest->data); - $rest->setHeader('If-Match', $dist['hash']); - $rest = self::__getCloudFrontResponse($rest); - - self::$useSSL = $useSSL; - - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::updateDistribution({$dist['id']}): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } else { - $dist = self::__parseCloudFrontDistributionConfig($rest->body); - $dist['hash'] = $rest->headers['hash']; - return $dist; - } - return false; - } - - - /** - * Delete a CloudFront distribution - * - * @param array $dist Distribution array info identical to output of getDistribution() - * @return boolean - */ - public static function deleteDistribution($dist) - { - if (!extension_loaded('openssl')) - { - self::__triggerError(sprintf("S3::deleteDistribution({$dist['id']}): %s", - "CloudFront functionality requires SSL"), __FILE__, __LINE__); - return false; - } - - $useSSL = self::$useSSL; - - self::$useSSL = true; // CloudFront requires SSL - $rest = new S3Request('DELETE', '', '2008-06-30/distribution/'.$dist['id'], 'cloudfront.amazonaws.com'); - $rest->setHeader('If-Match', $dist['hash']); - $rest = self::__getCloudFrontResponse($rest); - - self::$useSSL = $useSSL; - - if ($rest->error === false && $rest->code !== 204) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::deleteDistribution({$dist['id']}): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - return true; - } - - - /** - * Get a list of CloudFront distributions - * - * @return array - */ - public static function listDistributions() - { - if (!extension_loaded('openssl')) - { - self::__triggerError(sprintf("S3::listDistributions(): [%s] %s", - "CloudFront functionality requires SSL"), __FILE__, __LINE__); - return false; - } - - $useSSL = self::$useSSL; - self::$useSSL = true; // CloudFront requires SSL - $rest = new S3Request('GET', '', '2010-11-01/distribution', 'cloudfront.amazonaws.com'); - $rest = self::__getCloudFrontResponse($rest); - self::$useSSL = $useSSL; - - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - self::__triggerError(sprintf("S3::listDistributions(): [%s] %s", - $rest->error['code'], $rest->error['message']), __FILE__, __LINE__); - return false; - } - elseif ($rest->body instanceof SimpleXMLElement && isset($rest->body->DistributionSummary)) - { - $list = array(); - if (isset($rest->body->Marker, $rest->body->MaxItems, $rest->body->IsTruncated)) - { - //$info['marker'] = (string)$rest->body->Marker; - //$info['maxItems'] = (int)$rest->body->MaxItems; - //$info['isTruncated'] = (string)$rest->body->IsTruncated == 'true' ? true : false; - } - foreach ($rest->body->DistributionSummary as $summary) - $list[(string)$summary->Id] = self::__parseCloudFrontDistributionConfig($summary); - - return $list; - } - return array(); - } - - /** - * List CloudFront Origin Access Identities - * - * @return array - */ - public static function listOriginAccessIdentities() - { - if (!extension_loaded('openssl')) - { - self::__triggerError(sprintf("S3::listOriginAccessIdentities(): [%s] %s", - "CloudFront functionality requires SSL"), __FILE__, __LINE__); - return false; - } - - self::$useSSL = true; // CloudFront requires SSL - $rest = new S3Request('GET', '', '2010-11-01/origin-access-identity/cloudfront', 'cloudfront.amazonaws.com'); - $rest = self::__getCloudFrontResponse($rest); - $useSSL = self::$useSSL; - - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - trigger_error(sprintf("S3::listOriginAccessIdentities(): [%s] %s", - $rest->error['code'], $rest->error['message']), E_USER_WARNING); - return false; - } - - if (isset($rest->body->CloudFrontOriginAccessIdentitySummary)) - { - $identities = array(); - foreach ($rest->body->CloudFrontOriginAccessIdentitySummary as $identity) - if (isset($identity->S3CanonicalUserId)) - $identities[(string)$identity->Id] = array('id' => (string)$identity->Id, 's3CanonicalUserId' => (string)$identity->S3CanonicalUserId); - return $identities; - } - return false; - } - - - /** - * Invalidate objects in a CloudFront distribution - * - * Thanks to Martin Lindkvist for S3::invalidateDistribution() - * - * @param string $distributionId Distribution ID from listDistributions() - * @param array $paths Array of object paths to invalidate - * @return boolean - */ - public static function invalidateDistribution($distributionId, $paths) - { - if (!extension_loaded('openssl')) - { - self::__triggerError(sprintf("S3::invalidateDistribution(): [%s] %s", - "CloudFront functionality requires SSL"), __FILE__, __LINE__); - return false; - } - - $useSSL = self::$useSSL; - self::$useSSL = true; // CloudFront requires SSL - $rest = new S3Request('POST', '', '2010-08-01/distribution/'.$distributionId.'/invalidation', 'cloudfront.amazonaws.com'); - $rest->data = self::__getCloudFrontInvalidationBatchXML($paths, (string)microtime(true)); - $rest->size = strlen($rest->data); - $rest = self::__getCloudFrontResponse($rest); - self::$useSSL = $useSSL; - - if ($rest->error === false && $rest->code !== 201) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - trigger_error(sprintf("S3::invalidate('{$distributionId}',{$paths}): [%s] %s", - $rest->error['code'], $rest->error['message']), E_USER_WARNING); - return false; - } - return true; - } - - - /** - * Get a InvalidationBatch DOMDocument - * - * @internal Used to create XML in invalidateDistribution() - * @param array $paths Paths to objects to invalidateDistribution - * @param int $callerReference - * @return string - */ - private static function __getCloudFrontInvalidationBatchXML($paths, $callerReference = '0') - { - $dom = new DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - $invalidationBatch = $dom->createElement('InvalidationBatch'); - foreach ($paths as $path) - $invalidationBatch->appendChild($dom->createElement('Path', $path)); - - $invalidationBatch->appendChild($dom->createElement('CallerReference', $callerReference)); - $dom->appendChild($invalidationBatch); - return $dom->saveXML(); - } - - - /** - * List your invalidation batches for invalidateDistribution() in a CloudFront distribution - * - * http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/ListInvalidation.html - * returned array looks like this: - * Array - * ( - * [I31TWB0CN9V6XD] => InProgress - * [IT3TFE31M0IHZ] => Completed - * [I12HK7MPO1UQDA] => Completed - * [I1IA7R6JKTC3L2] => Completed - * ) - * - * @param string $distributionId Distribution ID from listDistributions() - * @return array - */ - public static function getDistributionInvalidationList($distributionId) - { - if (!extension_loaded('openssl')) - { - self::__triggerError(sprintf("S3::getDistributionInvalidationList(): [%s] %s", - "CloudFront functionality requires SSL"), __FILE__, __LINE__); - return false; - } - - $useSSL = self::$useSSL; - self::$useSSL = true; // CloudFront requires SSL - $rest = new S3Request('GET', '', '2010-11-01/distribution/'.$distributionId.'/invalidation', 'cloudfront.amazonaws.com'); - $rest = self::__getCloudFrontResponse($rest); - self::$useSSL = $useSSL; - - if ($rest->error === false && $rest->code !== 200) - $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status'); - if ($rest->error !== false) - { - trigger_error(sprintf("S3::getDistributionInvalidationList('{$distributionId}'): [%s]", - $rest->error['code'], $rest->error['message']), E_USER_WARNING); - return false; - } - elseif ($rest->body instanceof SimpleXMLElement && isset($rest->body->InvalidationSummary)) - { - $list = array(); - foreach ($rest->body->InvalidationSummary as $summary) - $list[(string)$summary->Id] = (string)$summary->Status; - - return $list; - } - return array(); - } - - - /** - * Get a DistributionConfig DOMDocument - * - * http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/index.html?PutConfig.html - * - * @internal Used to create XML in createDistribution() and updateDistribution() - * @param string $bucket S3 Origin bucket - * @param boolean $enabled Enabled (true/false) - * @param string $comment Comment to append - * @param string $callerReference Caller reference - * @param array $cnames Array of CNAME aliases - * @param string $defaultRootObject Default root object - * @param string $originAccessIdentity Origin access identity - * @param array $trustedSigners Array of trusted signers - * @return string - */ - private static function __getCloudFrontDistributionConfigXML($bucket, $enabled, $comment, $callerReference = '0', $cnames = array(), $defaultRootObject = null, $originAccessIdentity = null, $trustedSigners = array()) - { - $dom = new DOMDocument('1.0', 'UTF-8'); - $dom->formatOutput = true; - $distributionConfig = $dom->createElement('DistributionConfig'); - $distributionConfig->setAttribute('xmlns', 'http://cloudfront.amazonaws.com/doc/2010-11-01/'); - - $origin = $dom->createElement('S3Origin'); - $origin->appendChild($dom->createElement('DNSName', $bucket)); - if ($originAccessIdentity !== null) $origin->appendChild($dom->createElement('OriginAccessIdentity', $originAccessIdentity)); - $distributionConfig->appendChild($origin); - - if ($defaultRootObject !== null) $distributionConfig->appendChild($dom->createElement('DefaultRootObject', $defaultRootObject)); - - $distributionConfig->appendChild($dom->createElement('CallerReference', $callerReference)); - foreach ($cnames as $cname) - $distributionConfig->appendChild($dom->createElement('CNAME', $cname)); - if ($comment !== '') $distributionConfig->appendChild($dom->createElement('Comment', $comment)); - $distributionConfig->appendChild($dom->createElement('Enabled', $enabled ? 'true' : 'false')); - - $trusted = $dom->createElement('TrustedSigners'); - foreach ($trustedSigners as $id => $type) - $trusted->appendChild($id !== '' ? $dom->createElement($type, $id) : $dom->createElement($type)); - $distributionConfig->appendChild($trusted); - - $dom->appendChild($distributionConfig); - //var_dump($dom->saveXML()); - return $dom->saveXML(); - } - - - /** - * Parse a CloudFront distribution config - * - * See http://docs.amazonwebservices.com/AmazonCloudFront/latest/APIReference/index.html?GetDistribution.html - * - * @internal Used to parse the CloudFront DistributionConfig node to an array - * @param object &$node DOMNode - * @return array - */ - private static function __parseCloudFrontDistributionConfig(&$node) - { - if (isset($node->DistributionConfig)) - return self::__parseCloudFrontDistributionConfig($node->DistributionConfig); - - $dist = array(); - if (isset($node->Id, $node->Status, $node->LastModifiedTime, $node->DomainName)) - { - $dist['id'] = (string)$node->Id; - $dist['status'] = (string)$node->Status; - $dist['time'] = strtotime((string)$node->LastModifiedTime); - $dist['domain'] = (string)$node->DomainName; - } - - if (isset($node->CallerReference)) - $dist['callerReference'] = (string)$node->CallerReference; - - if (isset($node->Enabled)) - $dist['enabled'] = (string)$node->Enabled == 'true' ? true : false; - - if (isset($node->S3Origin)) - { - if (isset($node->S3Origin->DNSName)) - $dist['origin'] = (string)$node->S3Origin->DNSName; - - $dist['originAccessIdentity'] = isset($node->S3Origin->OriginAccessIdentity) ? - (string)$node->S3Origin->OriginAccessIdentity : null; - } - - $dist['defaultRootObject'] = isset($node->DefaultRootObject) ? (string)$node->DefaultRootObject : null; - - $dist['cnames'] = array(); - if (isset($node->CNAME)) - foreach ($node->CNAME as $cname) - $dist['cnames'][(string)$cname] = (string)$cname; - - $dist['trustedSigners'] = array(); - if (isset($node->TrustedSigners)) - foreach ($node->TrustedSigners as $signer) - { - if (isset($signer->Self)) - $dist['trustedSigners'][''] = 'Self'; - elseif (isset($signer->KeyPairId)) - $dist['trustedSigners'][(string)$signer->KeyPairId] = 'KeyPairId'; - elseif (isset($signer->AwsAccountNumber)) - $dist['trustedSigners'][(string)$signer->AwsAccountNumber] = 'AwsAccountNumber'; - } - - $dist['comment'] = isset($node->Comment) ? (string)$node->Comment : null; - return $dist; - } - - - /** - * Grab CloudFront response - * - * @internal Used to parse the CloudFront S3Request::getResponse() output - * @param object &$rest S3Request instance - * @return object - */ - private static function __getCloudFrontResponse(&$rest) - { - $rest->getResponse(); - if ($rest->response->error === false && isset($rest->response->body) && - is_string($rest->response->body) && substr($rest->response->body, 0, 5) == 'response->body = simplexml_load_string($rest->response->body); - // Grab CloudFront errors - if (isset($rest->response->body->Error, $rest->response->body->Error->Code, - $rest->response->body->Error->Message)) - { - $rest->response->error = array( - 'code' => (string)$rest->response->body->Error->Code, - 'message' => (string)$rest->response->body->Error->Message - ); - unset($rest->response->body); - } - } - return $rest->response; - } - - - /** - * Get MIME type for file - * - * To override the putObject() Content-Type, add it to $requestHeaders - * - * To use fileinfo, ensure the MAGIC environment variable is set - * - * @internal Used to get mime types - * @param string &$file File path - * @return string - */ - private static function __getMimeType(&$file) - { - // Use fileinfo if available - if (extension_loaded('fileinfo') && isset($_ENV['MAGIC']) && - ($finfo = finfo_open(FILEINFO_MIME, $_ENV['MAGIC'])) !== false) - { - if (($type = finfo_file($finfo, $file)) !== false) - { - // Remove the charset and grab the last content-type - $type = explode(' ', str_replace('; charset=', ';charset=', $type)); - $type = array_pop($type); - $type = explode(';', $type); - $type = trim(array_shift($type)); - } - finfo_close($finfo); - if ($type !== false && strlen($type) > 0) return $type; - } - - static $exts = array( - 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'gif' => 'image/gif', - 'png' => 'image/png', 'ico' => 'image/x-icon', 'pdf' => 'application/pdf', - 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'svg' => 'image/svg+xml', - 'svgz' => 'image/svg+xml', 'swf' => 'application/x-shockwave-flash', - 'zip' => 'application/zip', 'gz' => 'application/x-gzip', - 'tar' => 'application/x-tar', 'bz' => 'application/x-bzip', - 'bz2' => 'application/x-bzip2', 'rar' => 'application/x-rar-compressed', - 'exe' => 'application/x-msdownload', 'msi' => 'application/x-msdownload', - 'cab' => 'application/vnd.ms-cab-compressed', 'txt' => 'text/plain', - 'asc' => 'text/plain', 'htm' => 'text/html', 'html' => 'text/html', - 'css' => 'text/css', 'js' => 'text/javascript', - 'xml' => 'text/xml', 'xsl' => 'application/xsl+xml', - 'ogg' => 'application/ogg', 'mp3' => 'audio/mpeg', 'wav' => 'audio/x-wav', - 'avi' => 'video/x-msvideo', 'mpg' => 'video/mpeg', 'mpeg' => 'video/mpeg', - 'mov' => 'video/quicktime', 'flv' => 'video/x-flv', 'php' => 'text/x-php' - ); - $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); - // mime_content_type() is deprecated, fileinfo should be configured - $type = isset($exts[$ext]) ? $exts[$ext] : trim(mime_content_type($file)); - - return ($type !== false && strlen($type) > 0) ? $type : 'application/octet-stream'; - } - - - /** - * Generate the auth string: "AWS AccessKey:Signature" - * - * @internal Used by S3Request::getResponse() - * @param string $string String to sign - * @return string - */ - public static function __getSignature($string) - { - return 'AWS '.self::$__accessKey.':'.self::__getHash($string); - } - - - /** - * Creates a HMAC-SHA1 hash - * - * This uses the hash extension if loaded - * - * @internal Used by __getSignature() - * @param string $string String to sign - * @return string - */ - private static function __getHash($string) - { - return base64_encode(extension_loaded('hash') ? - hash_hmac('sha1', $string, self::$__secretKey, true) : pack('H*', sha1( - (str_pad(self::$__secretKey, 64, chr(0x00)) ^ (str_repeat(chr(0x5c), 64))) . - pack('H*', sha1((str_pad(self::$__secretKey, 64, chr(0x00)) ^ - (str_repeat(chr(0x36), 64))) . $string))))); - } - -} - -/** - * S3 Request class - * - * @link http://undesigned.org.za/2007/10/22/amazon-s3-php-class - * @version 0.5.0-dev - */ -final class S3Request -{ - /** - * AWS URI - * - * @var string - * @access pricate - */ - private $endpoint; - - /** - * Verb - * - * @var string - * @access private - */ - private $verb; - - /** - * S3 bucket name - * - * @var string - * @access private - */ - private $bucket; - - /** - * Object URI - * - * @var string - * @access private - */ - private $uri; - - /** - * Final object URI - * - * @var string - * @access private - */ - private $resource = ''; - - /** - * Additional request parameters - * - * @var array - * @access private - */ - private $parameters = array(); - - /** - * Amazon specific request headers - * - * @var array - * @access private - */ - private $amzHeaders = array(); - - /** - * HTTP request headers - * - * @var array - * @access private - */ - private $headers = array( - 'Host' => '', 'Date' => '', 'Content-MD5' => '', 'Content-Type' => '' - ); - - /** - * Use HTTP PUT? - * - * @var bool - * @access public - */ - public $fp = false; - - /** - * PUT file size - * - * @var int - * @access public - */ - public $size = 0; - - /** - * PUT post fields - * - * @var array - * @access public - */ - public $data = false; - - /** - * S3 request respone - * - * @var object - * @access public - */ - public $response; - - - /** - * Constructor - * - * @param string $verb Verb - * @param string $bucket Bucket name - * @param string $uri Object URI - * @param string $endpoint AWS endpoint URI - * @return mixed - */ - function __construct($verb, $bucket = '', $uri = '', $endpoint = 's3.amazonaws.com') - { - - $this->endpoint = $endpoint; - $this->verb = $verb; - $this->bucket = $bucket; - $this->uri = $uri !== '' ? '/'.str_replace('%2F', '/', rawurlencode($uri)) : '/'; - - //if ($this->bucket !== '') - // $this->resource = '/'.$this->bucket.$this->uri; - //else - // $this->resource = $this->uri; - - if ($this->bucket !== '') - { - if ($this->__dnsBucketName($this->bucket)) - { - $this->headers['Host'] = $this->bucket.'.'.$this->endpoint; - $this->resource = '/'.$this->bucket.$this->uri; - } - else - { - $this->headers['Host'] = $this->endpoint; - $this->uri = $this->uri; - if ($this->bucket !== '') $this->uri = '/'.$this->bucket.$this->uri; - $this->bucket = ''; - $this->resource = $this->uri; - } - } - else - { - $this->headers['Host'] = $this->endpoint; - $this->resource = $this->uri; - } - - - $this->headers['Date'] = gmdate('D, d M Y H:i:s T'); - $this->response = new STDClass; - $this->response->error = false; - $this->response->body = null; - $this->response->headers = array(); - } - - - /** - * Set request parameter - * - * @param string $key Key - * @param string $value Value - * @return void - */ - public function setParameter($key, $value) - { - $this->parameters[$key] = $value; - } - - - /** - * Set request header - * - * @param string $key Key - * @param string $value Value - * @return void - */ - public function setHeader($key, $value) - { - $this->headers[$key] = $value; - } - - - /** - * Set x-amz-meta-* header - * - * @param string $key Key - * @param string $value Value - * @return void - */ - public function setAmzHeader($key, $value) - { - $this->amzHeaders[$key] = $value; - } - - - /** - * Get the S3 response - * - * @return object | false - */ - public function getResponse() - { - $query = ''; - if (sizeof($this->parameters) > 0) - { - $query = substr($this->uri, -1) !== '?' ? '?' : '&'; - foreach ($this->parameters as $var => $value) - if ($value == null || $value == '') $query .= $var.'&'; - else $query .= $var.'='.rawurlencode($value).'&'; - $query = substr($query, 0, -1); - $this->uri .= $query; - - if (array_key_exists('acl', $this->parameters) || - array_key_exists('location', $this->parameters) || - array_key_exists('torrent', $this->parameters) || - array_key_exists('website', $this->parameters) || - array_key_exists('logging', $this->parameters)) - $this->resource .= $query; - } - $url = (S3::$useSSL ? 'https://' : 'http://') . ($this->headers['Host'] !== '' ? $this->headers['Host'] : $this->endpoint) . $this->uri; - - //var_dump('bucket: ' . $this->bucket, 'uri: ' . $this->uri, 'resource: ' . $this->resource, 'url: ' . $url); - - // Basic setup - $curl = curl_init(); - curl_setopt($curl, CURLOPT_USERAGENT, 'S3/php'); - - if (S3::$useSSL) - { - // SSL Validation can now be optional for those with broken OpenSSL installations - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, S3::$useSSLValidation ? 2 : 0); - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, S3::$useSSLValidation ? 1 : 0); - - if (S3::$sslKey !== null) curl_setopt($curl, CURLOPT_SSLKEY, S3::$sslKey); - if (S3::$sslCert !== null) curl_setopt($curl, CURLOPT_SSLCERT, S3::$sslCert); - if (S3::$sslCACert !== null) curl_setopt($curl, CURLOPT_CAINFO, S3::$sslCACert); - } - - curl_setopt($curl, CURLOPT_URL, $url); - - if (S3::$proxy != null && isset(S3::$proxy['host'])) - { - curl_setopt($curl, CURLOPT_PROXY, S3::$proxy['host']); - curl_setopt($curl, CURLOPT_PROXYTYPE, S3::$proxy['type']); - if (isset(S3::$proxy['user'], S3::$proxy['pass']) && S3::$proxy['user'] != null && S3::$proxy['pass'] != null) - curl_setopt($curl, CURLOPT_PROXYUSERPWD, sprintf('%s:%s', S3::$proxy['user'], S3::$proxy['pass'])); - } - - // Headers - $headers = array(); $amz = array(); - foreach ($this->amzHeaders as $header => $value) - if (strlen($value) > 0) $headers[] = $header.': '.$value; - foreach ($this->headers as $header => $value) - if (strlen($value) > 0) $headers[] = $header.': '.$value; - - // Collect AMZ headers for signature - foreach ($this->amzHeaders as $header => $value) - if (strlen($value) > 0) $amz[] = strtolower($header).':'.$value; - - // AMZ headers must be sorted - if (sizeof($amz) > 0) - { - //sort($amz); - usort($amz, array(&$this, '__sortMetaHeadersCmp')); - $amz = "\n".implode("\n", $amz); - } else $amz = ''; - - if (S3::hasAuth()) - { - // Authorization string (CloudFront stringToSign should only contain a date) - if ($this->headers['Host'] == 'cloudfront.amazonaws.com') - $headers[] = 'Authorization: ' . S3::__getSignature($this->headers['Date']); - else - { - $headers[] = 'Authorization: ' . S3::__getSignature( - $this->verb."\n". - $this->headers['Content-MD5']."\n". - $this->headers['Content-Type']."\n". - $this->headers['Date'].$amz."\n". - $this->resource - ); - } - } - - curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - curl_setopt($curl, CURLOPT_HEADER, false); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, false); - curl_setopt($curl, CURLOPT_WRITEFUNCTION, array(&$this, '__responseWriteCallback')); - curl_setopt($curl, CURLOPT_HEADERFUNCTION, array(&$this, '__responseHeaderCallback')); - curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); - - // Request types - switch ($this->verb) - { - case 'GET': break; - case 'PUT': case 'POST': // POST only used for CloudFront - if ($this->fp !== false) - { - curl_setopt($curl, CURLOPT_PUT, true); - curl_setopt($curl, CURLOPT_INFILE, $this->fp); - if ($this->size >= 0) - curl_setopt($curl, CURLOPT_INFILESIZE, $this->size); - } - elseif ($this->data !== false) - { - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->verb); - curl_setopt($curl, CURLOPT_POSTFIELDS, $this->data); - } - else - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->verb); - break; - case 'HEAD': - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'HEAD'); - curl_setopt($curl, CURLOPT_NOBODY, true); - break; - case 'DELETE': - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE'); - break; - default: break; - } - - // Execute, grab errors - if (curl_exec($curl)) - $this->response->code = curl_getinfo($curl, CURLINFO_HTTP_CODE); - else - $this->response->error = array( - 'code' => curl_errno($curl), - 'message' => curl_error($curl), - 'resource' => $this->resource - ); - - @curl_close($curl); - - // Parse body into XML - if ($this->response->error === false && isset($this->response->headers['type']) && - $this->response->headers['type'] == 'application/xml' && isset($this->response->body)) - { - $this->response->body = simplexml_load_string($this->response->body); - - // Grab S3 errors - if (!in_array($this->response->code, array(200, 204, 206)) && - isset($this->response->body->Code, $this->response->body->Message)) - { - $this->response->error = array( - 'code' => (string)$this->response->body->Code, - 'message' => (string)$this->response->body->Message - ); - if (isset($this->response->body->Resource)) - $this->response->error['resource'] = (string)$this->response->body->Resource; - unset($this->response->body); - } - } - - // Clean up file resources - if ($this->fp !== false && is_resource($this->fp)) fclose($this->fp); - - return $this->response; - } - - /** - * Sort compare for meta headers - * - * @internal Used to sort x-amz meta headers - * @param string $a String A - * @param string $b String B - * @return integer - */ - private function __sortMetaHeadersCmp($a, $b) - { - $lenA = strpos($a, ':'); - $lenB = strpos($b, ':'); - $minLen = min($lenA, $lenB); - $ncmp = strncmp($a, $b, $minLen); - if ($lenA == $lenB) return $ncmp; - if (0 == $ncmp) return $lenA < $lenB ? -1 : 1; - return $ncmp; - } - - /** - * CURL write callback - * - * @param resource &$curl CURL resource - * @param string &$data Data - * @return integer - */ - private function __responseWriteCallback(&$curl, &$data) - { - if (in_array($this->response->code, array(200, 206)) && $this->fp !== false) - return fwrite($this->fp, $data); - else - $this->response->body .= $data; - return strlen($data); - } - - - /** - * Check DNS conformity - * - * @param string $bucket Bucket name - * @return boolean - */ - private function __dnsBucketName($bucket) - { - if (strlen($bucket) > 63 || preg_match("/[^a-z0-9\.-]/", $bucket) > 0) return false; - if (strstr($bucket, '-.') !== false) return false; - if (strstr($bucket, '..') !== false) return false; - if (!preg_match("/^[0-9a-z]/", $bucket)) return false; - if (!preg_match("/[0-9a-z]$/", $bucket)) return false; - return true; - } - - - /** - * CURL header callback - * - * @param resource &$curl CURL resource - * @param string &$data Data - * @return integer - */ - private function __responseHeaderCallback(&$curl, &$data) - { - if (($strlen = strlen($data)) <= 2) return $strlen; - if (substr($data, 0, 4) == 'HTTP') - $this->response->code = (int)substr($data, 9, 3); - else - { - $data = trim($data); - if (strpos($data, ': ') === false) return $strlen; - list($header, $value) = explode(': ', $data, 2); - if ($header == 'Last-Modified') - $this->response->headers['time'] = strtotime($value); - elseif ($header == 'Content-Length') - $this->response->headers['size'] = (int)$value; - elseif ($header == 'Content-Type') - $this->response->headers['type'] = $value; - elseif ($header == 'ETag') - $this->response->headers['hash'] = $value{0} == '"' ? substr($value, 1, -1) : $value; - elseif (preg_match('/^x-amz-meta-.*$/', $header)) - $this->response->headers[$header] = $value; - } - return $strlen; - } - -} - -/** - * S3 exception class - * - * @link http://undesigned.org.za/2007/10/22/amazon-s3-php-class - * @version 0.5.0-dev - */ - -class S3Exception extends Exception { - /** - * Class constructor - * - * @param string $message Exception message - * @param string $file File in which exception was created - * @param string $line Line number on which exception was created - * @param int $code Exception code - */ - function __construct($message, $file, $line, $code = 0) - { - parent::__construct($message, $code); - $this->file = $file; - $this->line = $line; - } -} diff --git a/externals/skins/oblivious/404.php b/externals/skins/oblivious/404.php deleted file mode 100644 index fc208f6d4d..0000000000 --- a/externals/skins/oblivious/404.php +++ /dev/null @@ -1 +0,0 @@ -

    404 Not Found

    diff --git a/externals/skins/oblivious/css/oblivious.css b/externals/skins/oblivious/css/oblivious.css deleted file mode 100644 index cad5d6cf9a..0000000000 --- a/externals/skins/oblivious/css/oblivious.css +++ /dev/null @@ -1,90 +0,0 @@ -html, body, p, h1, h2, h3 { - padding: 0; - margin: 0; - font-weight: normal; -} - -html { - font-family: "Helvetica Neue", "Arial", sans-serif; - font-size: 16px; - overflow-y: scroll; - color: #555555; -} - -.oblivious-info { - position: fixed; - width: 15%; - border-right: 1px solid #dfdfdf; - top: 0; - bottom: 0; - left: 0; - padding: 140px 2% 0; - overflow: hidden; - - background: url(http://github.com/image/badge.png); - background-repeat: no-repeat; - background-position: 20px 20px; -} - -.oblivious-content { - padding-top: 3%; - margin-left: 22%; - max-width: 600px; -} - -a { - color: #222222; - text-decoration: none; -} - -a:hover { - color: #a00000; -} - - -h1 { - font-size: 24px; - font-weight: normal; -} - -h2 { - font-size: 22px; - font-weight: bold; -} - -.phame-post { - margin: 0 0 2em; -} - -.phame-post-date { - font-size: 12px; - margin: .25em 0 1em; -} - -.phame-post { - line-height: 1.6em; -} - -.phame-post p { - margin: 0 0 1em; -} - -.phame-post tt { - color: #333333; - background: #ebebeb; - padding: 0 .25em; - white-space: pre-wrap; -} - -.phame-post .remarkup-code-block pre { - overflow: auto; - padding: 10px 10px; - border: 1px solid #dfdfdf; - background-color: #f8f8f8; -} - -.fb-comments, -.fb-comments span, -.fb-comments iframe[style] { - width: 100% !important; -} diff --git a/externals/skins/oblivious/footer.php b/externals/skins/oblivious/footer.php deleted file mode 100644 index 5b6e2d6530..0000000000 --- a/externals/skins/oblivious/footer.php +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/externals/skins/oblivious/header.php b/externals/skins/oblivious/header.php deleted file mode 100644 index c3e7a4d60f..0000000000 --- a/externals/skins/oblivious/header.php +++ /dev/null @@ -1,18 +0,0 @@ - - - - <?php echo _e($title); ?> - - getCSSResources(); ?> - - - -
    -

    - getName()); - ?> -

    -

    getDescription()); ?>

    -
    -
    diff --git a/externals/skins/oblivious/image/badge.png b/externals/skins/oblivious/image/badge.png deleted file mode 100644 index 15f84b92f5..0000000000 Binary files a/externals/skins/oblivious/image/badge.png and /dev/null differ diff --git a/externals/skins/oblivious/post-detail.php b/externals/skins/oblivious/post-detail.php deleted file mode 100644 index 3ca30e9375..0000000000 --- a/externals/skins/oblivious/post-detail.php +++ /dev/null @@ -1 +0,0 @@ -render(); ?> diff --git a/externals/skins/oblivious/post-list.php b/externals/skins/oblivious/post-list.php deleted file mode 100644 index 1bcb65b28d..0000000000 --- a/externals/skins/oblivious/post-list.php +++ /dev/null @@ -1,13 +0,0 @@ -
    - renderWithSummary(); - } - - ?> -
    -
    - - -
    diff --git a/externals/skins/oblivious/skin.json b/externals/skins/oblivious/skin.json deleted file mode 100644 index 501ad7c2da..0000000000 --- a/externals/skins/oblivious/skin.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "Oblivious" -} diff --git a/externals/stripe-php/.travis.yml b/externals/stripe-php/.travis.yml new file mode 100644 index 0000000000..408711ba82 --- /dev/null +++ b/externals/stripe-php/.travis.yml @@ -0,0 +1,17 @@ +language: php + +php: + - 5.2 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - hhvm + +before_script: + - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.2' ]; then wget http://iweb.dl.sourceforge.net/project/simpletest/simpletest/simpletest_1.1/simpletest_1.1.0.tar.gz; tar xf simpletest_1.1.0.tar.gz -C test; else composer install --dev --prefer-source; fi" + - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.6' ]; then pear install pear/PHP_CodeSniffer; phpenv rehash; fi" + +script: + - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.6' ]; then phpcs --standard=zend --encoding=UTF-8 --ignore=vendor -p ./; fi" + - php test/Stripe.php diff --git a/externals/stripe-php/CHANGELOG b/externals/stripe-php/CHANGELOG new file mode 100644 index 0000000000..b86658a428 --- /dev/null +++ b/externals/stripe-php/CHANGELOG @@ -0,0 +1,156 @@ +=== 1.16.0 2014-06-17 + +* Add metadata for refunds and disputes + +=== 1.15.0 2014-05-28 + +* Support canceling transfers + +=== 1.14.1 2014-05-21 + +* Support cards for recipients. + +=== 1.13.1 2014-05-15 + +* Fix bug in account resource where `id` wasn't in the result + +=== 1.13.0 2014-04-10 + +* Add support for certificate blacklisting +* Update ca bundle +* Drop support for HHVM (Temporarily) + +=== 1.12.0 2014-04-01 + +* Add Stripe_RateLimitError for catching rate limit errors. +* Update to Zend coding style (thanks, @jpiasetz) + +=== 1.11.0 2014-01-29 + +* Add support for multiple subscriptions per customer + +=== 1.10.1 2013-12-02 + +* Add new ApplicationFee + +=== 1.9.1 2013-11-08 + +* Fix a bug where a null nestable object causes warnings to fire. + +=== 1.9.0 2013-10-16 + +* Add support for metadata API. + +=== 1.8.4 2013-09-18 + +* Add support for closing disputes. + +=== 1.8.3 2013-08-13 + +* Add new Balance and BalanceTransaction + +=== 1.8.2 2013-08-12 + +* Add support for unsetting attributes by updating to NULL. + Setting properties to a blank string is now an error. + +=== 1.8.1 2013-07-12 + +* Add support for multiple cards API (Stripe API version 2013-07-12: https://stripe.com/docs/upgrades#2013-07-05) + +=== 1.8.0 2013-04-11 + +* Allow Transfers to be creatable +* Add new Recipient resource + +=== 1.7.15 2013-02-21 + +* Add 'id' to the list of permanent object attributes + +=== 1.7.14 2013-02-20 + +* Don't re-encode strings that are already encoded in UTF-8. If you + were previously using plan or coupon objects with UTF-8 IDs, they + may have been treated as ISO-8859-1 (Latin-1) and encoded to UTF-8 a + 2nd time. You may now need to pass the IDs to utf8_encode before + passing them to Stripe_Plan::retrieve or Stripe_Coupon::retrieve. +* Ensure that all input is encoded in UTF-8 before submitting it to + Stripe's servers. (github issue #27) + +=== 1.7.13 2013-02-01 + +* Add support for passing options when retrieving Stripe objects + e.g., Stripe_Charge::retrieve(array("id"=>"foo", "expand" => array("customer"))) + Stripe_Charge::retrieve("foo") will continue to work + +=== 1.7.12 2013-01-15 + +* Add support for setting a Stripe API version override + +=== 1.7.11 2012-12-30 + +* Version bump to cleanup constants and such (github issue #26) + +=== 1.7.10 2012-11-08 + +* Add support for updating charge disputes. +* Fix bug preventing retrieval of null attributes + +=== 1.7.9 2012-11-08 + +* Fix usage under autoloaders such as the one generated by composer + (github issue #22) + +=== 1.7.8 2012-10-30 +* Add support for creating invoices. +* Add support for new invoice lines return format +* Add support for new list objects + +=== 1.7.7 2012-09-14 + +* Get all of the various version numbers in the repo in sync (no other + changes) + +=== 1.7.6 2012-08-31 + +* Add update and pay methods to Invoice resource + +=== 1.7.5 2012-08-23 + +* Change internal function names so that Stripe_SingletonApiRequest is + E_STRICT-clean (github issue #16) + +=== 1.7.4 2012-08-21 + +* Bugfix so that Stripe objects (e.g. Customer, Charge objects) used + in API calls are transparently converted to their object IDs + +=== 1.7.3 2012-08-15 + +* Add new Account resource + +=== 1.7.2 2012-06-26 + +* Make clearer that you should be including lib/Stripe.php, not + test/Stripe.php (github issue #14) + +=== 1.7.1 2012-05-24 + +* Add missing argument to Stripe_InvalidRequestError constructor in + Stripe_ApiResource::instanceUrl. Fixes a warning when + Stripe_ApiResource::instanceUrl is called on a resource with no ID + (github issue #12) + +=== 1.7.0 2012-05-17 + +* Support Composer and Packagist (github issue #9) + +* Add new deleteDiscount method to Stripe_Customer + +* Add new Transfer resource + +* Switch from using HTTP Basic auth to Bearer auth. (Note: Stripe will + support Basic auth for the indefinite future, but recommends Bearer + auth when possible going forward) + +* Numerous test suite improvements diff --git a/externals/stripe-php/LICENSE b/externals/stripe-php/LICENSE index ff5a9b0771..ac9fd37ebb 100644 --- a/externals/stripe-php/LICENSE +++ b/externals/stripe-php/LICENSE @@ -1,6 +1,6 @@ The MIT License -Copyright (c) 2010 Stripe +Copyright (c) 2010-2014 Stripe Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/externals/stripe-php/README.rdoc b/externals/stripe-php/README.rdoc index 034696ac68..4aca072a66 100644 --- a/externals/stripe-php/README.rdoc +++ b/externals/stripe-php/README.rdoc @@ -1,13 +1,49 @@ -= Installation += Stripe PHP bindings +{Build Status}[https://travis-ci.org/stripe/stripe-php] +{Latest Stable Version}[https://packagist.org/packages/stripe/stripe-php] +{Total Downloads}[https://packagist.org/packages/stripe/stripe-php] +{License}[https://packagist.org/packages/stripe/stripe-php] + +You can sign up for a Stripe account at https://stripe.com. + +== Requirements + +PHP 5.2 and later. + +== Composer + +You can install the bindings via Composer[http://getcomposer.org/]. Add this to your +composer.json+: + + { + "require": { + "stripe/stripe-php": "1.*" + } + } + +Then install via: + + composer.phar install + +To use the bindings, either user Composer's autoload[https://getcomposer.org/doc/00-intro.md#autoloading]: + + require_once('vendor/autoload.php'); + +Or manually: + + require_once('/path/to/vendor/stripe/stripe-php/lib/Stripe.php'); + +== Manual Installation Obtain the latest version of the Stripe PHP bindings with: git clone https://github.com/stripe/stripe-php -To get started, add the following to your PHP script: +To use the bindings, add the following to your PHP script: require_once("/path/to/stripe-php/lib/Stripe.php"); +== Getting Started + Simple usage looks like: Stripe::setApiKey('d8e8fca2dc0f896fd7cb4cb0031ba249'); @@ -15,6 +51,17 @@ Simple usage looks like: $charge = Stripe_Charge::create(array('card' => $myCard, 'amount' => 2000, 'currency' => 'usd')); echo $charge; -= Documentation +== Documentation Please see https://stripe.com/api for up-to-date documentation. + +== Tests + +In order to run tests you have to install SimpleTest[http://packagist.org/packages/simpletest/simpletest] via Composer[http://getcomposer.org/] (recommended way): + + composer.phar update --dev + +Run test suite: + + php ./test/Stripe.php + diff --git a/externals/stripe-php/VERSION b/externals/stripe-php/VERSION index 266146b87c..15b989e398 100644 --- a/externals/stripe-php/VERSION +++ b/externals/stripe-php/VERSION @@ -1 +1 @@ -1.6.3 +1.16.0 diff --git a/externals/stripe-php/composer.json b/externals/stripe-php/composer.json new file mode 100644 index 0000000000..42b50e3971 --- /dev/null +++ b/externals/stripe-php/composer.json @@ -0,0 +1,29 @@ +{ + "name": "stripe/stripe-php", + "description": "Stripe PHP Library", + "keywords": [ + "stripe", + "payment processing", + "api" + ], + "homepage": "https://stripe.com/", + "license": "MIT", + "authors": [ + { + "name": "Stripe and contributors", + "homepage": "https://github.com/stripe/stripe-php/contributors" + } + ], + "require": { + "php": ">=5.2", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*" + }, + "require-dev": { + "simpletest/simpletest": "*" + }, + "autoload": { + "classmap": ["lib/Stripe/"] + } +} diff --git a/externals/stripe-php/lib/Stripe.php b/externals/stripe-php/lib/Stripe.php index 32a130b4f1..372b738d61 100644 --- a/externals/stripe-php/lib/Stripe.php +++ b/externals/stripe-php/lib/Stripe.php @@ -9,34 +9,12 @@ if (!function_exists('json_decode')) { throw new Exception('Stripe needs the JSON PHP extension.'); } - - -abstract class Stripe -{ - public static $apiKey; - public static $apiBase = 'https://api.stripe.com/v1'; - public static $verifySslCerts = true; - const VERSION = '1.6.3'; - - public static function getApiKey() - { - return self::$apiKey; - } - - public static function setApiKey($apiKey) - { - self::$apiKey = $apiKey; - } - - public static function getVerifySslCerts() { - return self::$verifySslCerts; - } - - public static function setVerifySslCerts($verify) { - self::$verifySslCerts = $verify; - } +if (!function_exists('mb_detect_encoding')) { + throw new Exception('Stripe needs the Multibyte String PHP extension.'); } +// Stripe singleton +require(dirname(__FILE__) . '/Stripe/Stripe.php'); // Utilities require(dirname(__FILE__) . '/Stripe/Util.php'); @@ -49,18 +27,31 @@ public static function setVerifySslCerts($verify) { require(dirname(__FILE__) . '/Stripe/AuthenticationError.php'); require(dirname(__FILE__) . '/Stripe/CardError.php'); require(dirname(__FILE__) . '/Stripe/InvalidRequestError.php'); +require(dirname(__FILE__) . '/Stripe/RateLimitError.php'); // Plumbing require(dirname(__FILE__) . '/Stripe/Object.php'); require(dirname(__FILE__) . '/Stripe/ApiRequestor.php'); require(dirname(__FILE__) . '/Stripe/ApiResource.php'); +require(dirname(__FILE__) . '/Stripe/SingletonApiResource.php'); +require(dirname(__FILE__) . '/Stripe/AttachedObject.php'); +require(dirname(__FILE__) . '/Stripe/List.php'); // Stripe API Resources +require(dirname(__FILE__) . '/Stripe/Account.php'); +require(dirname(__FILE__) . '/Stripe/Card.php'); +require(dirname(__FILE__) . '/Stripe/Balance.php'); +require(dirname(__FILE__) . '/Stripe/BalanceTransaction.php'); require(dirname(__FILE__) . '/Stripe/Charge.php'); require(dirname(__FILE__) . '/Stripe/Customer.php'); require(dirname(__FILE__) . '/Stripe/Invoice.php'); require(dirname(__FILE__) . '/Stripe/InvoiceItem.php'); require(dirname(__FILE__) . '/Stripe/Plan.php'); +require(dirname(__FILE__) . '/Stripe/Subscription.php'); require(dirname(__FILE__) . '/Stripe/Token.php'); require(dirname(__FILE__) . '/Stripe/Coupon.php'); -require(dirname(__FILE__) . '/Stripe/Event.php'); \ No newline at end of file +require(dirname(__FILE__) . '/Stripe/Event.php'); +require(dirname(__FILE__) . '/Stripe/Transfer.php'); +require(dirname(__FILE__) . '/Stripe/Recipient.php'); +require(dirname(__FILE__) . '/Stripe/Refund.php'); +require(dirname(__FILE__) . '/Stripe/ApplicationFee.php'); diff --git a/externals/stripe-php/lib/Stripe/Account.php b/externals/stripe-php/lib/Stripe/Account.php new file mode 100644 index 0000000000..f5ef9a494d --- /dev/null +++ b/externals/stripe-php/lib/Stripe/Account.php @@ -0,0 +1,15 @@ +_apiKey = $apiKey; } + /** + * @param string $url The path to the API endpoint. + * + * @returns string The full path. + */ public static function apiUrl($url='') { $apiBase = Stripe::$apiBase; return "$apiBase$url"; } + /** + * @param string|mixed $value A string to UTF8-encode. + * + * @returns string|mixed The UTF8-encoded string, or the object passed in if + * it wasn't a string. + */ public static function utf8($value) { - if (is_string($value)) + if (is_string($value) + && mb_detect_encoding($value, "UTF-8", TRUE) != "UTF-8") { return utf8_encode($value); - else + } else { return $value; + } } private static function _encodeObjects($d) { - if ($d instanceof Stripe_ApiRequestor) { - return $d->id; + if ($d instanceof Stripe_ApiResource) { + return self::utf8($d->id); } else if ($d === true) { return 'true'; } else if ($d === false) { @@ -34,70 +60,142 @@ private static function _encodeObjects($d) } else if (is_array($d)) { $res = array(); foreach ($d as $k => $v) - $res[$k] = self::_encodeObjects($v); + $res[$k] = self::_encodeObjects($v); return $res; } else { - return $d; + return self::utf8($d); } } - public static function encode($d) + /** + * @param array $arr An map of param keys to values. + * @param string|null $prefix (It doesn't look like we ever use $prefix...) + * + * @returns string A querystring, essentially. + */ + public static function encode($arr, $prefix=null) { - return http_build_query($d, null, '&'); + if (!is_array($arr)) + return $arr; + + $r = array(); + foreach ($arr as $k => $v) { + if (is_null($v)) + continue; + + if ($prefix && $k && !is_int($k)) + $k = $prefix."[".$k."]"; + else if ($prefix) + $k = $prefix."[]"; + + if (is_array($v)) { + $r[] = self::encode($v, $k, true); + } else { + $r[] = urlencode($k)."=".urlencode($v); + } + } + + return implode("&", $r); } - public function request($meth, $url, $params=null) + /** + * @param string $method + * @param string $url + * @param array|null $params + * + * @return array An array whose first element is the response and second + * element is the API key used to make the request. + */ + public function request($method, $url, $params=null) { if (!$params) $params = array(); - list($rbody, $rcode, $myApiKey) = $this->_requestRaw($meth, $url, $params); + list($rbody, $rcode, $myApiKey) = + $this->_requestRaw($method, $url, $params); $resp = $this->_interpretResponse($rbody, $rcode); return array($resp, $myApiKey); } + + /** + * @param string $rbody A JSON string. + * @param int $rcode + * @param array $resp + * + * @throws Stripe_InvalidRequestError if the error is caused by the user. + * @throws Stripe_AuthenticationError if the error is caused by a lack of + * permissions. + * @throws Stripe_CardError if the error is the error code is 402 (payment + * required) + * @throws Stripe_ApiError otherwise. + */ public function handleApiError($rbody, $rcode, $resp) { - if (!is_array($resp) || !isset($resp['error'])) - throw new Stripe_ApiError("Invalid response object from API: $rbody (HTTP response code was $rcode)", $rcode, $rbody, $resp); + if (!is_array($resp) || !isset($resp['error'])) { + $msg = "Invalid response object from API: $rbody " + ."(HTTP response code was $rcode)"; + throw new Stripe_ApiError($msg, $rcode, $rbody, $resp); + } + $error = $resp['error']; + $msg = isset($error['message']) ? $error['message'] : null; + $param = isset($error['param']) ? $error['param'] : null; + $code = isset($error['code']) ? $error['code'] : null; + switch ($rcode) { case 400: + if ($code == 'rate_limit') { + throw new Stripe_RateLimitError( + $msg, $param, $rcode, $rbody, $resp + ); + } case 404: - throw new Stripe_InvalidRequestError(isset($error['message']) ? $error['message'] : null, - isset($error['param']) ? $error['param'] : null, - $rcode, $rbody, $resp); + throw new Stripe_InvalidRequestError( + $msg, $param, $rcode, $rbody, $resp + ); case 401: - throw new Stripe_AuthenticationError(isset($error['message']) ? $error['message'] : null, $rcode, $rbody, $resp); + throw new Stripe_AuthenticationError($msg, $rcode, $rbody, $resp); case 402: - throw new Stripe_CardError(isset($error['message']) ? $error['message'] : null, - isset($error['param']) ? $error['param'] : null, - isset($error['code']) ? $error['code'] : null, - $rcode, $rbody, $resp); + throw new Stripe_CardError($msg, $param, $code, $rcode, $rbody, $resp); default: - throw new Stripe_ApiError(isset($error['message']) ? $error['message'] : null, $rcode, $rbody, $resp); + throw new Stripe_ApiError($msg, $rcode, $rbody, $resp); } } - private function _requestRaw($meth, $url, $params) + private function _requestRaw($method, $url, $params) { $myApiKey = $this->_apiKey; if (!$myApiKey) $myApiKey = Stripe::$apiKey; - if (!$myApiKey) - throw new Stripe_AuthenticationError('No API key provided. (HINT: set your API key using "Stripe::setApiKey()". You can generate API keys from the Stripe web interface. See https://stripe.com/api for details, or email support@stripe.com if you have any questions.'); + + if (!$myApiKey) { + $msg = 'No API key provided. (HINT: set your API key using ' + . '"Stripe::setApiKey()". You can generate API keys from ' + . 'the Stripe web interface. See https://stripe.com/api for ' + . 'details, or email support@stripe.com if you have any questions.'; + throw new Stripe_AuthenticationError($msg); + } $absUrl = $this->apiUrl($url); $params = self::_encodeObjects($params); $langVersion = phpversion(); $uname = php_uname(); $ua = array('bindings_version' => Stripe::VERSION, - 'lang' => 'php', - 'lang_version' => $langVersion, - 'publisher' => 'stripe', - 'uname' => $uname); + 'lang' => 'php', + 'lang_version' => $langVersion, + 'publisher' => 'stripe', + 'uname' => $uname); $headers = array('X-Stripe-Client-User-Agent: ' . json_encode($ua), - 'User-Agent: Stripe/v1 PhpBindings/' . Stripe::VERSION); - list($rbody, $rcode) = $this->_curlRequest($meth, $absUrl, $headers, $params, $myApiKey); + 'User-Agent: Stripe/v1 PhpBindings/' . Stripe::VERSION, + 'Authorization: Bearer ' . $myApiKey); + if (Stripe::$apiVersion) + $headers[] = 'Stripe-Version: ' . Stripe::$apiVersion; + list($rbody, $rcode) = $this->_curlRequest( + $method, + $absUrl, + $headers, + $params + ); return array($rbody, $rcode, $myApiKey); } @@ -106,7 +204,9 @@ private function _interpretResponse($rbody, $rcode) try { $resp = json_decode($rbody, true); } catch (Exception $e) { - throw new Stripe_ApiError("Invalid response body from API: $rbody (HTTP response code was $rcode)", $rcode, $rbody); + $msg = "Invalid response body from API: $rbody " + . "(HTTP response code was $rcode)"; + throw new Stripe_ApiError($msg, $rcode, $rbody); } if ($rcode < 200 || $rcode >= 300) { @@ -115,28 +215,33 @@ private function _interpretResponse($rbody, $rcode) return $resp; } - private function _curlRequest($meth, $absUrl, $headers, $params, $myApiKey) + private function _curlRequest($method, $absUrl, $headers, $params) { + + if (!self::$_preFlight) { + self::$_preFlight = $this->checkSslCert($this->apiUrl()); + } + $curl = curl_init(); - $meth = strtolower($meth); + $method = strtolower($method); $opts = array(); - if ($meth == 'get') { + if ($method == 'get') { $opts[CURLOPT_HTTPGET] = 1; if (count($params) > 0) { - $encoded = self::encode($params); - $absUrl = "$absUrl?$encoded"; + $encoded = self::encode($params); + $absUrl = "$absUrl?$encoded"; } - } else if ($meth == 'post') { + } else if ($method == 'post') { $opts[CURLOPT_POST] = 1; $opts[CURLOPT_POSTFIELDS] = self::encode($params); - } else if ($meth == 'delete') { + } else if ($method == 'delete') { $opts[CURLOPT_CUSTOMREQUEST] = 'DELETE'; if (count($params) > 0) { - $encoded = self::encode($params); - $absUrl = "$absUrl?$encoded"; + $encoded = self::encode($params); + $absUrl = "$absUrl?$encoded"; } } else { - throw new Stripe_ApiError("Unrecognized method $meth"); + throw new Stripe_ApiError("Unrecognized method $method"); } $absUrl = self::utf8($absUrl); @@ -146,19 +251,27 @@ private function _curlRequest($meth, $absUrl, $headers, $params, $myApiKey) $opts[CURLOPT_TIMEOUT] = 80; $opts[CURLOPT_RETURNTRANSFER] = true; $opts[CURLOPT_HTTPHEADER] = $headers; - $opts[CURLOPT_USERPWD] = $myApiKey . ':'; if (!Stripe::$verifySslCerts) $opts[CURLOPT_SSL_VERIFYPEER] = false; curl_setopt_array($curl, $opts); $rbody = curl_exec($curl); + if (!defined('CURLE_SSL_CACERT_BADFILE')) { + define('CURLE_SSL_CACERT_BADFILE', 77); // constant not defined in PHP + } + $errno = curl_errno($curl); - if ($errno == CURLE_SSL_CACERT || $errno == CURLE_SSL_PEER_CERTIFICATE) { - array_push($headers, 'X-Stripe-Client-Info: {"ca":"using Stripe-supplied CA bundle"}'); + if ($errno == CURLE_SSL_CACERT || + $errno == CURLE_SSL_PEER_CERTIFICATE || + $errno == CURLE_SSL_CACERT_BADFILE) { + array_push( + $headers, + 'X-Stripe-Client-Info: {"ca":"using Stripe-supplied CA bundle"}' + ); + $cert = $this->caBundle(); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - curl_setopt($curl, CURLOPT_CAINFO, - dirname(__FILE__) . '/../data/ca-certificates.crt'); + curl_setopt($curl, CURLOPT_CAINFO, $cert); $rbody = curl_exec($curl); } @@ -174,6 +287,11 @@ private function _curlRequest($meth, $absUrl, $headers, $params, $myApiKey) return array($rbody, $rcode); } + /** + * @param number $errno + * @param string $message + * @throws Stripe_ApiConnectionError + */ public function handleCurlError($errno, $message) { $apiBase = Stripe::$apiBase; @@ -181,17 +299,119 @@ public function handleCurlError($errno, $message) case CURLE_COULDNT_CONNECT: case CURLE_COULDNT_RESOLVE_HOST: case CURLE_OPERATION_TIMEOUTED: - $msg = "Could not connect to Stripe ($apiBase). Please check your internet connection and try again. If this problem persists, you should check Stripe's service status at https://twitter.com/stripestatus, or let us know at support@stripe.com."; - break; + $msg = "Could not connect to Stripe ($apiBase). Please check your " + . "internet connection and try again. If this problem persists, " + . "you should check Stripe's service status at " + . "https://twitter.com/stripestatus,%20or"; + break; case CURLE_SSL_CACERT: case CURLE_SSL_PEER_CERTIFICATE: - $msg = "Could not verify Stripe's SSL certificate. Please make sure that your network is not intercepting certificates. (Try going to $apiBase in your browser.) If this problem persists, let us know at support@stripe.com."; - break; + $msg = "Could not verify Stripe's SSL certificate. Please make sure " + . "that your network is not intercepting certificates. " + . "(Try going to $apiBase in your browser.) " + . "If this problem persists,"; + break; default: - $msg = "Unexpected error communicating with Stripe. If this problem persists, let us know at support@stripe.com."; + $msg = "Unexpected error communicating with Stripe. " + . "If this problem persists,"; } + $msg .= " let us know at support@stripe.com."; - $msg .= "\n\n(Network error: $message)"; + $msg .= "\n\n(Network error [errno $errno]: $message)"; throw new Stripe_ApiConnectionError($msg); } + + /** + * Preflight the SSL certificate presented by the backend. This isn't 100% + * bulletproof, in that we're not actually validating the transport used to + * communicate with Stripe, merely that the first attempt to does not use a + * revoked certificate. + * + * Unfortunately the interface to OpenSSL doesn't make it easy to check the + * certificate before sending potentially sensitive data on the wire. This + * approach raises the bar for an attacker significantly. + */ + private function checkSslCert($url) + { + if (version_compare(PHP_VERSION, '5.3.0', '<')) { + error_log( + 'Warning: This version of PHP is too old to check SSL certificates '. + 'correctly. Stripe cannot guarantee that the server has a '. + 'certificate which is not blacklisted' + ); + return true; + } + + if (strpos(PHP_VERSION, 'hiphop') !== false) { + error_log( + 'Warning: HHVM does not support Stripe\'s SSL certificate '. + 'verification. (See http://docs.hhvm.com/manual/en/context.ssl.php) '. + 'Stripe cannot guarantee that the server has a certificate which is '. + 'not blacklisted' + ); + return true; + } + + $url = parse_url(http://github.com/$url); + $port = isset($url["port"]) ? $url["port"] : 443; + $url = "ssl://{$url["host"]}:{$port}"; + + $sslContext = stream_context_create( + array('ssl' => array( + 'capture_peer_cert' => true, + 'verify_peer' => true, + 'cafile' => $this->caBundle(), + )) + ); + $result = stream_socket_client( + $url, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $sslContext + ); + if ($errno !== 0) { + $apiBase = Stripe::$apiBase; + throw new Stripe_ApiConnectionError( + 'Could not connect to Stripe (' . $apiBase . '). Please check your '. + 'internet connection and try again. If this problem persists, '. + 'you should check Stripe\'s service status at '. + 'https://twitter.com/stripestatus.%20Reason%20was:'.$errstr + ); + } + + $params = stream_context_get_params($result); + + $cert = $params['options']['ssl']['peer_certificate']; + + openssl_x509_export($cert, $pemCert); + + if (self::isBlackListed($pemCert)) { + throw new Stripe_ApiConnectionError( + 'Invalid server certificate. You tried to connect to a server that '. + 'has a revoked SSL certificate, which means we cannot securely send '. + 'data to that server. Please email support@stripe.com if you need '. + 'help connecting to the correct API server.' + ); + } + + return true; + } + + /* Checks if a valid PEM encoded certificate is blacklisted + * @return boolean + */ + public static function isBlackListed($certificate) + { + $certificate = trim($certificate); + $lines = explode("\n", $certificate); + + // Kludgily remove the PEM padding + array_shift($lines); array_pop($lines); + + $derCert = base64_decode(implode("", $lines)); + $fingerprint = sha1($derCert); + return in_array($fingerprint, self::blacklistedCerts()); + } + + private function caBundle() + { + return dirname(__FILE__) . '/../data/ca-certificates.crt'; + } } diff --git a/externals/stripe-php/lib/Stripe/ApiResource.php b/externals/stripe-php/lib/Stripe/ApiResource.php index d17ccf32b5..8fb681e1b7 100644 --- a/externals/stripe-php/lib/Stripe/ApiResource.php +++ b/externals/stripe-php/lib/Stripe/ApiResource.php @@ -9,54 +9,102 @@ protected static function _scopedRetrieve($class, $id, $apiKey=null) return $instance; } + /** + * @returns Stripe_ApiResource The refreshed resource. + */ public function refresh() { $requestor = new Stripe_ApiRequestor($this->_apiKey); $url = $this->instanceUrl(); - list($response, $apiKey) = $requestor->request('get', $url); + + list($response, $apiKey) = $requestor->request( + 'get', + $url, + $this->_retrieveOptions + ); $this->refreshFrom($response, $apiKey); return $this; - } + } - public static function classUrl($class) + /** + * @param string $class + * + * @returns string The name of the class, with namespacing and underscores + * stripped. + */ + public static function className($class) { // Useful for namespaces: Foo\Stripe_Charge - if ($postfix = strrchr($class, '\\')) - $class = substr($postfix, 1); - if (substr($class, 0, strlen('Stripe')) == 'Stripe') + if ($postfixNamespaces = strrchr($class, '\\')) { + $class = substr($postfixNamespaces, 1); + } + // Useful for underscored 'namespaces': Foo_Stripe_Charge + if ($postfixFakeNamespaces = strrchr($class, 'Stripe_')) { + $class = $postfixFakeNamespaces; + } + if (substr($class, 0, strlen('Stripe')) == 'Stripe') { $class = substr($class, strlen('Stripe')); + } $class = str_replace('_', '', $class); $name = urlencode($class); $name = strtolower($name); - return "/${name}s"; + return $name; } + /** + * @param string $class + * + * @returns string The endpoint URL for the given class. + */ + public static function classUrl($class) + { + $base = self::_scopedLsb($class, 'className', $class); + return "/v1/${base}s"; + } + + /** + * @returns string The full API URL for this API resource. + */ public function instanceUrl() { $id = $this['id']; $class = get_class($this); - if (!$id) { - throw new Stripe_InvalidRequestError("Could not determine which URL to request: $class instance has invalid ID: $id"); + if ($id === null) { + $message = "Could not determine which URL to request: " + . "$class instance has invalid ID: $id"; + throw new Stripe_InvalidRequestError($message, null); } $id = Stripe_ApiRequestor::utf8($id); - $base = self::classUrl($class); + $base = $this->_lsb('classUrl', $class); $extn = urlencode($id); return "$base/$extn"; } private static function _validateCall($method, $params=null, $apiKey=null) { - if ($params && !is_array($params)) - throw new Stripe_Error("You must pass an array as the first argument to Stripe API method calls. (HINT: an example call to create a charge would be: \"StripeCharge::create(array('amount' => 100, 'currency' => 'usd', 'card' => array('number' => 4242424242424242, 'exp_month' => 5, 'exp_year' => 2015)))\")"); - if ($apiKey && !is_string($apiKey)) - throw new Stripe_Error('The second argument to Stripe API method calls is an optional per-request apiKey, which must be a string. (HINT: you can set a global apiKey by "Stripe::setApiKey()")'); + if ($params && !is_array($params)) { + $message = "You must pass an array as the first argument to Stripe API " + . "method calls. (HINT: an example call to create a charge " + . "would be: \"StripeCharge::create(array('amount' => 100, " + . "'currency' => 'usd', 'card' => array('number' => " + . "4242424242424242, 'exp_month' => 5, 'exp_year' => 2015)))\")"; + throw new Stripe_Error($message); + } + + if ($apiKey && !is_string($apiKey)) { + $message = 'The second argument to Stripe API method calls is an ' + . 'optional per-request apiKey, which must be a string. ' + . '(HINT: you can set a global apiKey by ' + . '"Stripe::setApiKey()")'; + throw new Stripe_Error($message); + } } protected static function _scopedAll($class, $params=null, $apiKey=null) { self::_validateCall('all', $params, $apiKey); $requestor = new Stripe_ApiRequestor($apiKey); - $url = self::classUrl($class); + $url = self::_scopedLsb($class, 'classUrl', $class); list($response, $apiKey) = $requestor->request('get', $url, $params); return Stripe_Util::convertToStripeObject($response, $apiKey); } @@ -65,19 +113,18 @@ protected static function _scopedCreate($class, $params=null, $apiKey=null) { self::_validateCall('create', $params, $apiKey); $requestor = new Stripe_ApiRequestor($apiKey); - $url = self::classUrl($class); + $url = self::_scopedLsb($class, 'classUrl', $class); list($response, $apiKey) = $requestor->request('post', $url, $params); return Stripe_Util::convertToStripeObject($response, $apiKey); } - protected function _scopedSave($class) + protected function _scopedSave($class, $apiKey=null) { self::_validateCall('save'); - if ($this->_unsavedValues) { - $requestor = new Stripe_ApiRequestor($this->_apiKey); - $params = array(); - foreach ($this->_unsavedValues->toArray() as $k) - $params[$k] = $this->$k; + $requestor = new Stripe_ApiRequestor($apiKey); + $params = $this->serializeParameters(); + + if (count($params) > 0) { $url = $this->instanceUrl(); list($response, $apiKey) = $requestor->request('post', $url, $params); $this->refreshFrom($response, $apiKey); diff --git a/externals/stripe-php/lib/Stripe/ApplicationFee.php b/externals/stripe-php/lib/Stripe/ApplicationFee.php new file mode 100644 index 0000000000..7cf420053a --- /dev/null +++ b/externals/stripe-php/lib/Stripe/ApplicationFee.php @@ -0,0 +1,53 @@ +_apiKey); + $url = $this->instanceUrl() . '/refund'; + list($response, $apiKey) = $requestor->request('post', $url, $params); + $this->refreshFrom($response, $apiKey); + return $this; + } +} diff --git a/externals/stripe-php/lib/Stripe/AttachedObject.php b/externals/stripe-php/lib/Stripe/AttachedObject.php new file mode 100644 index 0000000000..5566a66616 --- /dev/null +++ b/externals/stripe-php/lib/Stripe/AttachedObject.php @@ -0,0 +1,23 @@ +_values), array_keys($properties)); + // Don't unset, but rather set to null so we send up '' for deletion. + foreach ($removed as $k) { + $this->$k = null; + } + + foreach ($properties as $k => $v) { + $this->$k = $v; + } + } +} diff --git a/externals/stripe-php/lib/Stripe/Balance.php b/externals/stripe-php/lib/Stripe/Balance.php new file mode 100644 index 0000000000..b4fe7d5f0e --- /dev/null +++ b/externals/stripe-php/lib/Stripe/Balance.php @@ -0,0 +1,15 @@ +param = $param; $this->code = $code; } diff --git a/externals/stripe-php/lib/Stripe/Charge.php b/externals/stripe-php/lib/Stripe/Charge.php index 11ec470935..d05b948ba1 100644 --- a/externals/stripe-php/lib/Stripe/Charge.php +++ b/externals/stripe-php/lib/Stripe/Charge.php @@ -2,30 +2,56 @@ class Stripe_Charge extends Stripe_ApiResource { - public static function constructFrom($values, $apiKey=null) - { - $class = get_class(); - return self::scopedConstructFrom($class, $values, $apiKey); - } - + /** + * @param string $id The ID of the charge to retrieve. + * @param string|null $apiKey + * + * @return Stripe_Charge + */ public static function retrieve($id, $apiKey=null) { $class = get_class(); return self::_scopedRetrieve($class, $id, $apiKey); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return array An array of Stripe_Charges. + */ public static function all($params=null, $apiKey=null) { $class = get_class(); return self::_scopedAll($class, $params, $apiKey); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return Stripe_Charge The created charge. + */ public static function create($params=null, $apiKey=null) { $class = get_class(); return self::_scopedCreate($class, $params, $apiKey); } + /** + * @return Stripe_Charge The saved charge. + */ + public function save() + { + $class = get_class(); + return self::_scopedSave($class); + } + + /** + * @param array|null $params + * + * @return Stripe_Charge The refunded charge. + */ public function refund($params=null) { $requestor = new Stripe_ApiRequestor($this->_apiKey); @@ -35,6 +61,11 @@ public function refund($params=null) return $this; } + /** + * @param array|null $params + * + * @return Stripe_Charge The captured charge. + */ public function capture($params=null) { $requestor = new Stripe_ApiRequestor($this->_apiKey); @@ -43,4 +74,30 @@ public function capture($params=null) $this->refreshFrom($response, $apiKey); return $this; } + + /** + * @param array|null $params + * + * @return array The updated dispute. + */ + public function updateDispute($params=null) + { + $requestor = new Stripe_ApiRequestor($this->_apiKey); + $url = $this->instanceUrl() . '/dispute'; + list($response, $apiKey) = $requestor->request('post', $url, $params); + $this->refreshFrom(array('dispute' => $response), $apiKey, true); + return $this->dispute; + } + + /** + * @return Stripe_Charge The updated charge. + */ + public function closeDispute() + { + $requestor = new Stripe_ApiRequestor($this->_apiKey); + $url = $this->instanceUrl() . '/dispute/close'; + list($response, $apiKey) = $requestor->request('post', $url); + $this->refreshFrom($response, $apiKey); + return $this; + } } diff --git a/externals/stripe-php/lib/Stripe/Coupon.php b/externals/stripe-php/lib/Stripe/Coupon.php index 9ead002c93..00c4fc6bd1 100644 --- a/externals/stripe-php/lib/Stripe/Coupon.php +++ b/externals/stripe-php/lib/Stripe/Coupon.php @@ -2,30 +2,47 @@ class Stripe_Coupon extends Stripe_ApiResource { - public static function constructFrom($values, $apiKey=null) - { - $class = get_class(); - return self::scopedConstructFrom($class, $values, $apiKey); - } - + /** + * @param string $id The ID of the coupon to retrieve. + * @param string|null $apiKey + * + * @return Stripe_Coupon + */ public static function retrieve($id, $apiKey=null) { $class = get_class(); return self::_scopedRetrieve($class, $id, $apiKey); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return Stripe_Coupon The created coupon. + */ public static function create($params=null, $apiKey=null) { $class = get_class(); return self::_scopedCreate($class, $params, $apiKey); } + /** + * @param array|null $params + * + * @return Stripe_Coupon The deleted coupon. + */ public function delete($params=null) { $class = get_class(); return self::_scopedDelete($class, $params); } - + + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return array An array of Stripe_Coupons. + */ public static function all($params=null, $apiKey=null) { $class = get_class(); diff --git a/externals/stripe-php/lib/Stripe/Customer.php b/externals/stripe-php/lib/Stripe/Customer.php index 09b33e08b9..ae34b0e996 100644 --- a/externals/stripe-php/lib/Stripe/Customer.php +++ b/externals/stripe-php/lib/Stripe/Customer.php @@ -2,42 +2,67 @@ class Stripe_Customer extends Stripe_ApiResource { - public static function constructFrom($values, $apiKey=null) - { - $class = get_class(); - return self::scopedConstructFrom($class, $values, $apiKey); - } - + /** + * @param string $id The ID of the customer to retrieve. + * @param string|null $apiKey + * + * @return Stripe_Customer + */ public static function retrieve($id, $apiKey=null) { $class = get_class(); return self::_scopedRetrieve($class, $id, $apiKey); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return array An array of Stripe_Customers. + */ public static function all($params=null, $apiKey=null) { $class = get_class(); return self::_scopedAll($class, $params, $apiKey); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return Stripe_Customer The created customer. + */ public static function create($params=null, $apiKey=null) { $class = get_class(); return self::_scopedCreate($class, $params, $apiKey); } + /** + * @returns Stripe_Customer The saved customer. + */ public function save() { $class = get_class(); return self::_scopedSave($class); } + /** + * @param array|null $params + * + * @returns Stripe_Customer The deleted customer. + */ public function delete($params=null) { $class = get_class(); return self::_scopedDelete($class, $params); } + /** + * @param array|null $params + * + * @returns Stripe_InvoiceItem The resulting invoice item. + */ public function addInvoiceItem($params=null) { if (!$params) @@ -47,6 +72,11 @@ public function addInvoiceItem($params=null) return $ii; } + /** + * @param array|null $params + * + * @returns array An array of the customer's Stripe_Invoices. + */ public function invoices($params=null) { if (!$params) @@ -56,6 +86,11 @@ public function invoices($params=null) return $invoices; } + /** + * @param array|null $params + * + * @returns array An array of the customer's Stripe_InvoiceItems. + */ public function invoiceItems($params=null) { if (!$params) @@ -65,6 +100,11 @@ public function invoiceItems($params=null) return $iis; } + /** + * @param array|null $params + * + * @returns array An array of the customer's Stripe_Charges. + */ public function charges($params=null) { if (!$params) @@ -74,6 +114,11 @@ public function charges($params=null) return $charges; } + /** + * @param array|null $params + * + * @returns Stripe_Subscription The updated subscription. + */ public function updateSubscription($params=null) { $requestor = new Stripe_ApiRequestor($this->_apiKey); @@ -83,6 +128,11 @@ public function updateSubscription($params=null) return $this->subscription; } + /** + * @param array|null $params + * + * @returns Stripe_Subscription The cancelled subscription. + */ public function cancelSubscription($params=null) { $requestor = new Stripe_ApiRequestor($this->_apiKey); @@ -91,4 +141,17 @@ public function cancelSubscription($params=null) $this->refreshFrom(array('subscription' => $response), $apiKey, true); return $this->subscription; } + + /** + * @param array|null $params + * + * @returns Stripe_Customer The updated customer. + */ + public function deleteDiscount() + { + $requestor = new Stripe_ApiRequestor($this->_apiKey); + $url = $this->instanceUrl() . '/discount'; + list($response, $apiKey) = $requestor->request('delete', $url); + $this->refreshFrom(array('discount' => null), $apiKey, true); + } } diff --git a/externals/stripe-php/lib/Stripe/Error.php b/externals/stripe-php/lib/Stripe/Error.php index 896195677e..19705c9f2f 100644 --- a/externals/stripe-php/lib/Stripe/Error.php +++ b/externals/stripe-php/lib/Stripe/Error.php @@ -2,26 +2,28 @@ class Stripe_Error extends Exception { - public function __construct($message=null, $http_status=null, $http_body=null, $json_body=null) + public function __construct($message, $httpStatus=null, + $httpBody=null, $jsonBody=null + ) { parent::__construct($message); - $this->http_status = $http_status; - $this->http_body = $http_body; - $this->json_body = $json_body; + $this->httpStatus = $httpStatus; + $this->httpBody = $httpBody; + $this->jsonBody = $jsonBody; } public function getHttpStatus() { - return $this->http_status; + return $this->httpStatus; } public function getHttpBody() { - return $this->http_body; + return $this->httpBody; } public function getJsonBody() { - return $this->json_body; + return $this->jsonBody; } } diff --git a/externals/stripe-php/lib/Stripe/Event.php b/externals/stripe-php/lib/Stripe/Event.php index 1c73bd1c7d..6bd3f63e7f 100644 --- a/externals/stripe-php/lib/Stripe/Event.php +++ b/externals/stripe-php/lib/Stripe/Event.php @@ -2,18 +2,24 @@ class Stripe_Event extends Stripe_ApiResource { - public static function constructFrom($values, $apiKey=null) - { - $class = get_class(); - return self::scopedConstructFrom($class, $values, $apiKey); - } - + /** + * @param string $id The ID of the event to retrieve. + * @param string|null $apiKey + * + * @return Stripe_Event + */ public static function retrieve($id, $apiKey=null) { $class = get_class(); return self::_scopedRetrieve($class, $id, $apiKey); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return array An array of Stripe_Events. + */ public static function all($params=null, $apiKey=null) { $class = get_class(); diff --git a/externals/stripe-php/lib/Stripe/InvalidRequestError.php b/externals/stripe-php/lib/Stripe/InvalidRequestError.php index dba05bb861..8d8e669d98 100644 --- a/externals/stripe-php/lib/Stripe/InvalidRequestError.php +++ b/externals/stripe-php/lib/Stripe/InvalidRequestError.php @@ -2,9 +2,11 @@ class Stripe_InvalidRequestError extends Stripe_Error { - public function __construct($message, $param, $http_status=null, $http_body=null, $json_body=null) + public function __construct($message, $param, $httpStatus=null, + $httpBody=null, $jsonBody=null + ) { - parent::__construct($message, $http_status, $http_body, $json_body); + parent::__construct($message, $httpStatus, $httpBody, $jsonBody); $this->param = $param; } } diff --git a/externals/stripe-php/lib/Stripe/Invoice.php b/externals/stripe-php/lib/Stripe/Invoice.php index 87c30b74c6..29b2473fee 100644 --- a/externals/stripe-php/lib/Stripe/Invoice.php +++ b/externals/stripe-php/lib/Stripe/Invoice.php @@ -2,24 +2,48 @@ class Stripe_Invoice extends Stripe_ApiResource { - public static function constructFrom($values, $apiKey=null) + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return Stripe_Invoice The created invoice. + */ + public static function create($params=null, $apiKey=null) { $class = get_class(); - return self::scopedConstructFrom($class, $values, $apiKey); + return self::_scopedCreate($class, $params, $apiKey); } + /** + * @param string $id The ID of the invoice to retrieve. + * @param string|null $apiKey + * + * @return Stripe_Invoice + */ public static function retrieve($id, $apiKey=null) { $class = get_class(); return self::_scopedRetrieve($class, $id, $apiKey); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return array An array of Stripe_Invoices. + */ public static function all($params=null, $apiKey=null) { $class = get_class(); return self::_scopedAll($class, $params, $apiKey); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return Stripe_Invoice The upcoming invoice. + */ public static function upcoming($params=null, $apiKey=null) { $requestor = new Stripe_ApiRequestor($apiKey); @@ -27,4 +51,25 @@ public static function upcoming($params=null, $apiKey=null) list($response, $apiKey) = $requestor->request('get', $url, $params); return Stripe_Util::convertToStripeObject($response, $apiKey); } + + /** + * @return Stripe_Invoice The saved invoice. + */ + public function save() + { + $class = get_class(); + return self::_scopedSave($class); + } + + /** + * @return Stripe_Invoice The paid invoice. + */ + public function pay() + { + $requestor = new Stripe_ApiRequestor($this->_apiKey); + $url = $this->instanceUrl() . '/pay'; + list($response, $apiKey) = $requestor->request('post', $url); + $this->refreshFrom($response, $apiKey); + return $this; + } } diff --git a/externals/stripe-php/lib/Stripe/InvoiceItem.php b/externals/stripe-php/lib/Stripe/InvoiceItem.php index a93ddadae5..4987d276ba 100644 --- a/externals/stripe-php/lib/Stripe/InvoiceItem.php +++ b/externals/stripe-php/lib/Stripe/InvoiceItem.php @@ -2,36 +2,54 @@ class Stripe_InvoiceItem extends Stripe_ApiResource { - public static function constructFrom($values, $apiKey=null) - { - $class = get_class(); - return self::scopedConstructFrom($class, $values, $apiKey); - } - + /** + * @param string $id The ID of the invoice item to retrieve. + * @param string|null $apiKey + * + * @return Stripe_InvoiceItem + */ public static function retrieve($id, $apiKey=null) { $class = get_class(); return self::_scopedRetrieve($class, $id, $apiKey); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return array An array of Stripe_InvoiceItems. + */ public static function all($params=null, $apiKey=null) { $class = get_class(); return self::_scopedAll($class, $params, $apiKey); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return Stripe_InvoiceItem The created invoice item. + */ public static function create($params=null, $apiKey=null) { $class = get_class(); return self::_scopedCreate($class, $params, $apiKey); } + /** + * @return Stripe_InvoiceItem The saved invoice item. + */ public function save() { $class = get_class(); return self::_scopedSave($class); } + /** + * @return Stripe_InvoiceItem The deleted invoice item. + */ public function delete($params=null) { $class = get_class(); diff --git a/externals/stripe-php/lib/Stripe/List.php b/externals/stripe-php/lib/Stripe/List.php new file mode 100644 index 0000000000..3dd837bbcf --- /dev/null +++ b/externals/stripe-php/lib/Stripe/List.php @@ -0,0 +1,37 @@ +_apiKey); + list($response, $apiKey) = $requestor->request( + 'get', + $this['url'], + $params + ); + return Stripe_Util::convertToStripeObject($response, $apiKey); + } + + public function create($params=null) + { + $requestor = new Stripe_ApiRequestor($this->_apiKey); + list($response, $apiKey) = $requestor->request( + 'post', $this['url'], $params + ); + return Stripe_Util::convertToStripeObject($response, $apiKey); + } + + public function retrieve($id, $params=null) + { + $requestor = new Stripe_ApiRequestor($this->_apiKey); + $base = $this['url']; + $id = Stripe_ApiRequestor::utf8($id); + $extn = urlencode($id); + list($response, $apiKey) = $requestor->request( + 'get', "$base/$extn", $params + ); + return Stripe_Util::convertToStripeObject($response, $apiKey); + } + +} diff --git a/externals/stripe-php/lib/Stripe/Object.php b/externals/stripe-php/lib/Stripe/Object.php index 00ebdfc4d1..7df749909b 100644 --- a/externals/stripe-php/lib/Stripe/Object.php +++ b/externals/stripe-php/lib/Stripe/Object.php @@ -2,17 +2,28 @@ class Stripe_Object implements ArrayAccess { - public static $_permanentAttributes; + /** + * @var Stripe_Util_Set Attributes that should not be sent to the API because + * they're not updatable (e.g. API key, ID). + */ + public static $permanentAttributes; + /** + * @var Stripe_Util_Set Attributes that are nested but still updatable from + * the parent class's URL (e.g. metadata). + */ + public static $nestedUpdatableAttributes; public static function init() { - self::$_permanentAttributes = new Stripe_Util_Set(array('_apiKey')); + self::$permanentAttributes = new Stripe_Util_Set(array('_apiKey', 'id')); + self::$nestedUpdatableAttributes = new Stripe_Util_Set(array('metadata')); } protected $_apiKey; protected $_values; protected $_unsavedValues; protected $_transientValues; + protected $_retrieveOptions; public function __construct($id=null, $apiKey=null) { @@ -20,16 +31,41 @@ public function __construct($id=null, $apiKey=null) $this->_values = array(); $this->_unsavedValues = new Stripe_Util_Set(); $this->_transientValues = new Stripe_Util_Set(); - if ($id) + + $this->_retrieveOptions = array(); + if (is_array($id)) { + foreach ($id as $key => $value) { + if ($key != 'id') { + $this->_retrieveOptions[$key] = $value; + } + } + $id = $id['id']; + } + + if ($id !== null) { $this->id = $id; + } } // Standard accessor magic methods public function __set($k, $v) { - // TODO: may want to clear from $_transientValues. (Won't be user-visible.) - $this->_values[$k] = $v; - if (!self::$_permanentAttributes->includes($k)) + if ($v === "") { + throw new InvalidArgumentException( + 'You cannot set \''.$k.'\'to an empty string. ' + .'We interpret empty strings as NULL in requests. ' + .'You may set obj->'.$k.' = NULL to delete the property' + ); + } + + if (self::$nestedUpdatableAttributes->includes($k) + && isset($this->$k) && is_array($v)) { + $this->$k->replaceWith($v); + } else { + // TODO: may want to clear from $_transientValues (Won't be user-visible). + $this->_values[$k] = $v; + } + if (!self::$permanentAttributes->includes($k)) $this->_unsavedValues->add($k); } public function __isset($k) @@ -44,12 +80,18 @@ public function __unset($k) } public function __get($k) { - if (isset($this->_values[$k])) { + if (array_key_exists($k, $this->_values)) { return $this->_values[$k]; } else if ($this->_transientValues->includes($k)) { $class = get_class($this); $attrs = join(', ', array_keys($this->_values)); - error_log("Stripe Notice: Undefined property of $class instance: $k. HINT: The $k attribute was set in the past, however. It was then wiped when refreshing the object with the result returned by Stripe's API, probably as a result of a save(). The attributes currently available on this object are: $attrs"); + $message = "Stripe Notice: Undefined property of $class instance: $k. " + . "HINT: The $k attribute was set in the past, however. " + . "It was then wiped when refreshing the object " + . "with the result returned by Stripe's API, " + . "probably as a result of a save(). The attributes currently " + . "available on this object are: $attrs"; + error_log($message); return null; } else { $class = get_class($this); @@ -63,20 +105,35 @@ public function offsetSet($k, $v) { $this->$k = $v; } + public function offsetExists($k) { - return isset($this->$k); + return array_key_exists($k, $this->_values); } + public function offsetUnset($k) { unset($this->$k); } public function offsetGet($k) { - return isset($this->_values[$k]) ? $this->_values[$k] : null; + return array_key_exists($k, $this->_values) ? $this->_values[$k] : null; + } + + public function keys() + { + return array_keys($this->_values); } - // This unfortunately needs to be public to be used in Util.php + /** + * This unfortunately needs to be public to be used in Util.php + * + * @param string $class + * @param array $values + * @param string|null $apiKey + * + * @return Stripe_Object The object constructed from the given values. + */ public static function scopedConstructFrom($class, $values, $apiKey=null) { $obj = new $class(isset($values['id']) ? $values['id'] : null, $apiKey); @@ -84,44 +141,108 @@ public static function scopedConstructFrom($class, $values, $apiKey=null) return $obj; } + /** + * @param array $values + * @param string|null $apiKey + * + * @return Stripe_Object The object of the same class as $this constructed + * from the given values. + */ public static function constructFrom($values, $apiKey=null) { - $class = get_class(); - return self::scopedConstructFrom($class, $values, $apiKey); + return self::scopedConstructFrom(__CLASS__, $values, $apiKey); } + /** + * Refreshes this object using the provided values. + * + * @param array $values + * @param string $apiKey + * @param boolean $partial Defaults to false. + */ public function refreshFrom($values, $apiKey, $partial=false) { $this->_apiKey = $apiKey; + // Wipe old state before setting new. This is useful for e.g. updating a // customer, where there is no persistent card parameter. Mark those values // which don't persist as transient - if ($partial) + if ($partial) { $removed = new Stripe_Util_Set(); - else + } else { $removed = array_diff(array_keys($this->_values), array_keys($values)); + } foreach ($removed as $k) { - if (self::$_permanentAttributes->includes($k)) + if (self::$permanentAttributes->includes($k)) continue; unset($this->$k); } foreach ($values as $k => $v) { - if (self::$_permanentAttributes->includes($k)) + if (self::$permanentAttributes->includes($k) && isset($this[$k])) continue; - $this->_values[$k] = Stripe_Util::convertToStripeObject($v, $apiKey); + + if (self::$nestedUpdatableAttributes->includes($k) && is_array($v)) { + $this->_values[$k] = Stripe_Object::scopedConstructFrom( + 'Stripe_AttachedObject', $v, $apiKey + ); + } else { + $this->_values[$k] = Stripe_Util::convertToStripeObject($v, $apiKey); + } + $this->_transientValues->discard($k); $this->_unsavedValues->discard($k); } } + /** + * @return array A recursive mapping of attributes to values for this object, + * including the proper value for deleted attributes. + */ + public function serializeParameters() + { + $params = array(); + if ($this->_unsavedValues) { + foreach ($this->_unsavedValues->toArray() as $k) { + $v = $this->$k; + if ($v === NULL) { + $v = ''; + } + $params[$k] = $v; + } + } + + // Get nested updates. + foreach (self::$nestedUpdatableAttributes->toArray() as $property) { + if (isset($this->$property) + && $this->$property instanceOf Stripe_Object) { + $params[$property] = $this->$property->serializeParameters(); + } + } + return $params; + } + + // Pretend to have late static bindings, even in PHP 5.2 + protected function _lsb($method) + { + $class = get_class($this); + $args = array_slice(func_get_args(), 1); + return call_user_func_array(array($class, $method), $args); + } + protected static function _scopedLsb($class, $method) + { + $args = array_slice(func_get_args(), 2); + return call_user_func_array(array($class, $method), $args); + } + public function __toJSON() { - if (defined('JSON_PRETTY_PRINT')) + if (defined('JSON_PRETTY_PRINT')) { return json_encode($this->__toArray(true), JSON_PRETTY_PRINT); - else + } else { return json_encode($this->__toArray(true)); + } } public function __toString() @@ -131,10 +252,11 @@ public function __toString() public function __toArray($recursive=false) { - if ($recursive) + if ($recursive) { return Stripe_Util::convertStripeObjectToArray($this->_values); - else + } else { return $this->_values; + } } } diff --git a/externals/stripe-php/lib/Stripe/Plan.php b/externals/stripe-php/lib/Stripe/Plan.php index 171b67356f..2d7d99e7b4 100644 --- a/externals/stripe-php/lib/Stripe/Plan.php +++ b/externals/stripe-php/lib/Stripe/Plan.php @@ -2,36 +2,56 @@ class Stripe_Plan extends Stripe_ApiResource { - public static function constructFrom($values, $apiKey=null) - { - $class = get_class(); - return self::scopedConstructFrom($class, $values, $apiKey); - } - + /** + * @param string $id The ID of the plan to retrieve. + * @param string|null $apiKey + * + * @return Stripe_Plan + */ public static function retrieve($id, $apiKey=null) { $class = get_class(); return self::_scopedRetrieve($class, $id, $apiKey); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return Stripe_Plan The created plan. + */ public static function create($params=null, $apiKey=null) { $class = get_class(); return self::_scopedCreate($class, $params, $apiKey); } + /** + * @param array|null $params + * + * @return Stripe_Plan The deleted plan. + */ public function delete($params=null) { $class = get_class(); return self::_scopedDelete($class, $params); } + /** + * @return Stripe_Plan The saved plan. + */ public function save() { $class = get_class(); return self::_scopedSave($class); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return array An array of Stripe_Plans. + */ public static function all($params=null, $apiKey=null) { $class = get_class(); diff --git a/externals/stripe-php/lib/Stripe/RateLimitError.php b/externals/stripe-php/lib/Stripe/RateLimitError.php new file mode 100644 index 0000000000..b60124f291 --- /dev/null +++ b/externals/stripe-php/lib/Stripe/RateLimitError.php @@ -0,0 +1,11 @@ +id; + $transfers = Stripe_Transfer::all($params, $this->_apiKey); + return $transfers; + } +} diff --git a/externals/stripe-php/lib/Stripe/Refund.php b/externals/stripe-php/lib/Stripe/Refund.php new file mode 100644 index 0000000000..f9d5463916 --- /dev/null +++ b/externals/stripe-php/lib/Stripe/Refund.php @@ -0,0 +1,36 @@ +refresh(); + return $instance; + } + + /** + * @param Stripe_SingletonApiResource $class + * @return string The endpoint associated with this singleton class. + */ + public static function classUrl($class) + { + $base = self::className($class); + return "/v1/${base}"; + } + + /** + * @return string The endpoint associated with this singleton API resource. + */ + public function instanceUrl() + { + $class = get_class($this); + $base = self::classUrl($class); + return "$base"; + } +} diff --git a/externals/stripe-php/lib/Stripe/Stripe.php b/externals/stripe-php/lib/Stripe/Stripe.php new file mode 100644 index 0000000000..ae94f20894 --- /dev/null +++ b/externals/stripe-php/lib/Stripe/Stripe.php @@ -0,0 +1,73 @@ +_apiKey); + $url = $this->instanceUrl() . '/discount'; + list($response, $apiKey) = $requestor->request('delete', $url); + $this->refreshFrom(array('discount' => null), $apiKey, true); + } +} diff --git a/externals/stripe-php/lib/Stripe/Token.php b/externals/stripe-php/lib/Stripe/Token.php index 0870262d57..14195c1585 100644 --- a/externals/stripe-php/lib/Stripe/Token.php +++ b/externals/stripe-php/lib/Stripe/Token.php @@ -2,18 +2,24 @@ class Stripe_Token extends Stripe_ApiResource { - public static function constructFrom($values, $apiKey=null) - { - $class = get_class(); - return self::scopedConstructFrom($class, $values, $apiKey); - } - + /** + * @param string $id The ID of the token to retrieve. + * @param string|null $apiKey + * + * @return Stripe_Token + */ public static function retrieve($id, $apiKey=null) { $class = get_class(); return self::_scopedRetrieve($class, $id, $apiKey); } + /** + * @param array|null $params + * @param string|null $apiKey + * + * @return Stripe_Coupon The created token. + */ public static function create($params=null, $apiKey=null) { $class = get_class(); diff --git a/externals/stripe-php/lib/Stripe/Transfer.php b/externals/stripe-php/lib/Stripe/Transfer.php new file mode 100644 index 0000000000..2c988a40c7 --- /dev/null +++ b/externals/stripe-php/lib/Stripe/Transfer.php @@ -0,0 +1,62 @@ +_apiKey); + $url = $this->instanceUrl() . '/cancel'; + list($response, $apiKey) = $requestor->request('post', $url); + $this->refreshFrom($response, $apiKey); + return $this; + } + + /** + * @return Stripe_Transfer The saved transfer. + */ + public function save() + { + $class = get_class(); + return self::_scopedSave($class); + } + +} diff --git a/externals/stripe-php/lib/Stripe/Util.php b/externals/stripe-php/lib/Stripe/Util.php index 7828cf0386..9c2116957a 100644 --- a/externals/stripe-php/lib/Stripe/Util.php +++ b/externals/stripe-php/lib/Stripe/Util.php @@ -2,11 +2,18 @@ abstract class Stripe_Util { + /** + * Whether the provided array (or other) is a list rather than a dictionary. + * + * @param array|mixed $array + * @return boolean True if the given object is a list. + */ public static function isList($array) { if (!is_array($array)) return false; - // TODO: this isn't actually correct in general, but it's correct given Stripe's responses + + // TODO: generally incorrect, but it's correct given Stripe's response foreach (array_keys($array) as $k) { if (!is_numeric($k)) return false; @@ -14,43 +21,67 @@ public static function isList($array) return true; } + /** + * Recursively converts the PHP Stripe object to an array. + * + * @param array $values The PHP Stripe object to convert. + * @return array + */ public static function convertStripeObjectToArray($values) { $results = array(); foreach ($values as $k => $v) { // FIXME: this is an encapsulation violation - if (Stripe_Object::$_permanentAttributes->includes($k)) { + if ($k[0] == '_') { continue; } if ($v instanceof Stripe_Object) { $results[$k] = $v->__toArray(true); - } - else if (is_array($v)) { + } else if (is_array($v)) { $results[$k] = self::convertStripeObjectToArray($v); - } - else { + } else { $results[$k] = $v; } } return $results; } + /** + * Converts a response from the Stripe API to the corresponding PHP object. + * + * @param array $resp The response from the Stripe API. + * @param string $apiKey + * @return Stripe_Object|array + */ public static function convertToStripeObject($resp, $apiKey) { - $types = array('charge' => 'Stripe_Charge', - 'customer' => 'Stripe_Customer', - 'invoice' => 'Stripe_Invoice', - 'invoiceitem' => 'Stripe_InvoiceItem', 'event' => 'Stripe_Event'); + $types = array( + 'card' => 'Stripe_Card', + 'charge' => 'Stripe_Charge', + 'customer' => 'Stripe_Customer', + 'list' => 'Stripe_List', + 'invoice' => 'Stripe_Invoice', + 'invoiceitem' => 'Stripe_InvoiceItem', + 'event' => 'Stripe_Event', + 'transfer' => 'Stripe_Transfer', + 'plan' => 'Stripe_Plan', + 'recipient' => 'Stripe_Recipient', + 'refund' => 'Stripe_Refund', + 'subscription' => 'Stripe_Subscription' + ); if (self::isList($resp)) { $mapped = array(); foreach ($resp as $i) array_push($mapped, self::convertToStripeObject($i, $apiKey)); return $mapped; } else if (is_array($resp)) { - if (isset($resp['object']) && is_string($resp['object']) && isset($types[$resp['object']])) + if (isset($resp['object']) + && is_string($resp['object']) + && isset($types[$resp['object']])) { $class = $types[$resp['object']]; - else + } else { $class = 'Stripe_Object'; + } return Stripe_Object::scopedConstructFrom($class, $resp, $apiKey); } else { return $resp; diff --git a/externals/stripe-php/lib/data/ca-certificates.crt b/externals/stripe-php/lib/data/ca-certificates.crt index 51156cc2bb..0e11f6d870 100644 --- a/externals/stripe-php/lib/data/ca-certificates.crt +++ b/externals/stripe-php/lib/data/ca-certificates.crt @@ -1,925 +1,809 @@ -# Generated using the default CA bundle on Ubuntu Linux 11.10 on November 25, 2011 - ------BEGIN CERTIFICATE----- -MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx -EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h -bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy -YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp -Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy -MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG -A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt -YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD -VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA -isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj -Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50 -QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt -bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR -yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID -AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0 -cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f -BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj -cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1 -U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl -YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos -SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/ -t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u -mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb -K+9A46sd33oqK8n8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO -BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi -MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ -ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ -8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 -zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y -fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 -w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc -G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k -epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q -laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ -QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU -fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 -YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w -ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY -gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe -MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 -IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy -dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw -czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 -dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl -aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC -AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg -b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB -ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc -nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg -18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c -gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl -Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY -sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T -SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF -CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum -GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk -zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW -omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS -BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v -cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 -4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB -Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J -0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ -FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx -bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q -SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb -6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV -m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g -eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG -kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 -6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG -CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc -aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB -gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w -aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 -tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 -nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M -77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV -Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L -ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM -zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU -rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF -YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT -oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu -FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB -0m6lG5kngOcLqagA ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV -BAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4xDjAMBgNVBAcTBUZ1bGRhMRAwDgYDVQQK -EwdEZWJjb25mMRMwEQYDVQQDEwpEZWJjb25mIENBMR8wHQYJKoZIhvcNAQkBFhBq -b2VyZ0BkZWJpYW4ub3JnMB4XDTA1MTEwNTE3NTUxNFoXDTE1MTEwMzE3NTUxNFow -djELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjEOMAwGA1UEBxMFRnVsZGEx -EDAOBgNVBAoTB0RlYmNvbmYxEzARBgNVBAMTCkRlYmNvbmYgQ0ExHzAdBgkqhkiG -9w0BCQEWEGpvZXJnQGRlYmlhbi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvbOo0SrIwI5IMlsshH8WF3dHB9r9JlSKhMPaybawa1EyvZspMQ3wa -F5qxNf3Sj+NElEmjseEqvCZiIIzqwerHu0Qw62cDYCdCd2+Wb5m0bPYB5CGHiyU1 -eNP0je42O0YeXG2BvUujN8AviocVo39X2YwNQ0ryy4OaqYgm2pRlbtT2ESbF+SfV -Y2iqQj/f8ymF+lHo/pz8tbAqxWcqaSiHFAVQJrdqtFhtoodoNiE3q76zJoUkZTXB -k60Yc3MJSnatZCpnsSBr/D7zpntl0THrUjjtdRWCjQVhqfhM1yZJV+ApbLdheFh0 -ZWlSxdnp25p0q0XYw/7G92ELyFDfBUUNAgMBAAGjgdswgdgwHQYDVR0OBBYEFMuV -dFNb4mCWUFbcP5LOtxFLrEVTMIGoBgNVHSMEgaAwgZ2AFMuVdFNb4mCWUFbcP5LO -txFLrEVToXqkeDB2MQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMQ4wDAYD -VQQHEwVGdWxkYTEQMA4GA1UEChMHRGViY29uZjETMBEGA1UEAxMKRGViY29uZiBD -QTEfMB0GCSqGSIb3DQEJARYQam9lcmdAZGViaWFuLm9yZ4IJAJigUTEEXRQpMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGZXxHg4mnkvilRIM1EQfGdY -S5b/WcyF2MYSTeTvK4aIB6VHwpZoZCnDGj2m2D3CkHT0upAD9o0zM1tdsfncLzV+ -mDT/jNmBtYo4QXx5vEPwvEIcgrWjwk7SyaEUhZjtolTkHB7ACl0oD0r71St4iEPR -qTUCEXk2E47bg1Fz58wNt/yo2+4iqiRjg1XCH4evkQuhpW+dTZnDyFNqwSYZapOE -TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe -1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG -UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v -U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN -AQkBFhRpZ2NhQHNnZG4ucG0uZ291di5mcjAeFw0wMjEyMTMxNDM5MTVaFw0yMDEw -MTcxNDM5MTRaMIGFMQswCQYDVQQGEwJGUjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYD -VQQHEwVQYXJpczEQMA4GA1UEChMHUE0vU0dETjEOMAwGA1UECxMFRENTU0kxDjAM -BgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcNAQkBFhRpZ2NhQHNnZG4ucG0uZ291di5m -cjCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCFkMImdk9zDzJfTO4XPdAAmLbAdWws -ZiEMZh19RyTo3CyhFqO77OIXrwY6vc1pcc3MgWJ0dgQpAgrDMtmFFxpUu4gmjVsx -8GpxQC+4VOgLY8Cvmcd/UDzYg07EIRto8BwCpPJ/JfUxwzV2V3N713aAX+cEoKZ/ -s+kgxC6nZCA7oQIVALME/JYjkdW2uKIGngsEPbXAjdhDAoGADh/uqWJx94UBm31c -9d8ZTBfRGRnmSSRVFDgPWgA69JD4BR5da8tKz+1HjfMhDXljbMH86ixpD5Ka1Z0V -pRYUPbyAoB37tsmXMJY7kjyD19d5VdaZboUjVvhH6UJy5lpNNNGSvFl4fqkxyvw+ -pq1QV0N5RcvK120hlXdfHUX+YKYDgYQAAoGAQGr7IuKJcYIvJRMjxwl43KxXY2xC -aoCiM/bv117MfI94aNf1UusGhp7CbYAY9CXuL60P0oPMAajbaTE5Z34AuITeHq3Y -CNMHwxalip8BHqSSGmGiQsXeK7T+r1rPXsccZ1c5ikGDZ4xn5gUaCyy2rCmb+fOJ -6VAfCbAbAjmNKwejdzB1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgFGMBUG -A1UdIAQOMAwwCgYIKoF6AXkBAQEwHQYDVR0OBBYEFPkeNRcUf8idzpKblYbLNxs0 -MQhSMB8GA1UdIwQYMBaAFPkeNRcUf8idzpKblYbLNxs0MQhSMAsGByqGSM44BAMF -AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob -sRQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT -AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ -TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG -9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw -MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM -BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO -MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 -LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI -s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 -xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 -u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b -F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx -Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd -PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV -HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx -NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF -AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ -L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY -YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a -NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R -0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +# Generated by https://gist.github.com/ab/9756531 on 2014-03-25 +# from Ubuntu ca-certificates 20130906. +# See http://www.ubuntu.com/usn/usn-2154-1/ for version info. + +================================================================ +C: AT +O: A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH +OU: A-Trust-nQual-03 +CN: A-Trust-nQual-03 +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB +VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp +bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R +dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw +MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy +dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52 +ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM +EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj +lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ +znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH +2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1 +k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs +2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD +VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG +KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+ +8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R +FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE +DNuxUCAKGkq6ahq97BvIxYSazQ== -----END CERTIFICATE----- + +================================================================ +C: BE +O: GlobalSign nv-sa +OU: Root CA +CN: GlobalSign Root CA -----BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- + +================================================================ +C: BM +O: QuoVadis Limited +CN: QuoVadis Root CA 2 -----BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw -MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD -VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul -CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n -tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl -dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch -PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC -+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O -BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl -MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X -7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz -43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl -pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA -WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- + +================================================================ +C: BM +O: QuoVadis Limited +CN: QuoVadis Root CA 3 -----BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx -MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB -ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV -BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV -6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX -GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP -dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH -1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF -62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW -BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv -b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 -IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ -iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh -4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm -XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- + +================================================================ +C: BM +O: QuoVadis Limited +OU: Root Certification Authority +CN: QuoVadis Root Certification Authority -----BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 -MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK -EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh -BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq -xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G -87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i -2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U -WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 -0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G -A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr -pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm -aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv -hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm -hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 -P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y -iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no -xqE= +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== -----END CERTIFICATE----- + +================================================================ +C: CH +O: SwissSign AG +CN: SwissSign Gold CA - G2 -----BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk -hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym -1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW -OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb -2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko -O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU -AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb -LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir -oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C -MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- + +================================================================ +C: CH +O: SwissSign AG +CN: SwissSign Platinum CA - G2 -----BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC -206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci -KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 -JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 -BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e -Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B -PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 -Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq -Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 -+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj -FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn -xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 -LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc -obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 -CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe -IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA -DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F -AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX -Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb -AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl -Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw -RY8mkaKO/qk= +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu +IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw +WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD +ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y +IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn +IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ +6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob +jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw +izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl ++zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY +zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP +pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF +KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW +ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB +AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 +ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA +A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 +uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ +FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 +jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ +u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D +YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 +puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa +icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG +DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x +kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z +Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== -----END CERTIFICATE----- + +================================================================ +C: CH +O: SwissSign AG +CN: SwissSign Silver CA - G2 -----BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx -HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh -IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 -MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg -SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M -IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U -0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI -TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf -RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF -zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh -BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA -AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY -PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ -BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn -9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT -Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF -Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX -n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW -H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx -HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh -IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz -NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg -SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M -IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ -7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb -m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY -xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ -YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq -JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx -I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz -kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh -EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S -Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM -gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu -rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO -1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu -h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP -yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q -7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT -RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ -ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB -M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ -my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO -AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT -9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H -hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 -fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- + +================================================================ +C: CH +O: WISeKey +OU: Copyright (c) 2005 +OU: OISTE Foundation Endorsed +CN: OISTE WISeKey Global Root GA CA -----BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= -----END CERTIFICATE----- + +================================================================ +C: CN +O: CNNIC +CN: CNNIC ROOT -----BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD +TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 +MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF +Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh +IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 +dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO +V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC +GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN +v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB +AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB +Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO +76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK +OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH +ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi +yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL +buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj +2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== + +================================================================ +C: CN +O: China Internet Network Information Center +CN: China Internet Network Information Center EV Certificates Root +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC +Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g +Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 +aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa +Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg +SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo +aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp +ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z +7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// +DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx +zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 +hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs +4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u +gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY +NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 +j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG +52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB +echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI +zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy +wy39FCqQmbkHzJ8= -----END CERTIFICATE----- + +================================================================ +C: CO +O: Sociedad Cameral de Certificación Digital - Certicámara S.A. +CN: AC Raíz Certicámara S.A. -----BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx +CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp +ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa +QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw +NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft +ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu +QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG +qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL +fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ +Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 +Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ +54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b +MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j +ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej +YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt +A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF +rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ +pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB +lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy +YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 +7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs +YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 +xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc +unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ +Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp +ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 +gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 +jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ +XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD +W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ +RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r +MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk +BYn8eNZcLCZDqQ== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E -jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo -ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI -ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu -Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg -AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 -HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA -uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa -TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg -xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q -CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs -6GAqm4VKQPNriiTsBhYscw== + +================================================================ +C: DE +O: D-Trust GmbH +CN: D-TRUST Root Class 3 CA 2 2009 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== + +================================================================ +C: DE +O: D-Trust GmbH +CN: D-TRUST Root Class 3 CA 2 EV 2009 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 -----END CERTIFICATE----- + +================================================================ +C: DE +O: Deutsche Telekom AG +OU: T-TeleSec Trust Center +CN: Deutsche Telekom Root CA 2 -----BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= + +================================================================ +C: DE +O: T-Systems Enterprise Services GmbH +OU: T-Systems Trust Center +CN: T-TeleSec GlobalRoot Class 3 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== -----END CERTIFICATE----- + +================================================================ +C: DE +O: TC TrustCenter GmbH +OU: TC TrustCenter Class 2 CA +CN: TC TrustCenter Class 2 CA II -----BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp -ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow -fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV -BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM -cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S -HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 -CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk -3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz -6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV -HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw -Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww -DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 -5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI -gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ -aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl -izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf +tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg +uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J +XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK +8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 +5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 +kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS +GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt +ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 +au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV +hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI +dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== -----END CERTIFICATE----- + +================================================================ +C: DE +O: TC TrustCenter GmbH +OU: TC TrustCenter Class 3 CA +CN: TC TrustCenter Class 3 CA II -----BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 -aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla -MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO -BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD -VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW -fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt -TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL -fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW -1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 -kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G -A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo -dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu -Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ -HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS -jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ -xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn -dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW +Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q +Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 +1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq +ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 +Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX +XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN +irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 +TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 +g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB +95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj +S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== -----END CERTIFICATE----- + +================================================================ +C: DE +O: TC TrustCenter GmbH +OU: TC TrustCenter Universal CA +CN: TC TrustCenter Universal CA I -----BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx +MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg +R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD +VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR +JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T +fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu +jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z +wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ +fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD +VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G +CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 +7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn +8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs +ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ +2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY -----END CERTIFICATE----- + +================================================================ +C: DE +ST: Baden-Wuerttemberg (BW) +L: Stuttgart +O: Deutscher Sparkassen Verlag GmbH +CN: S-TRUST Authentication and Encryption Root CA 2005:PN -----BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcp +MRIwEAYDVQQHEwlTdHV0dGdhcnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fz +c2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVTLVRSVVNUIEF1dGhlbnRpY2F0aW9u +IGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0wNTA2MjIwMDAwMDBa +Fw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFkZW4t +V3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMg +RGV1dHNjaGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJV +U1QgQXV0aGVudGljYXRpb24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBO +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1 +toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob4QSwI7+Vio5bG0F/WsPo +TUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXLg3KSwlOy +ggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1 +XgqfeN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteF +hy+S8dF2g08LOlk3KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm +7QIDAQABo4GSMIGPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEG +MCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJvbmxpbmUxLTIwNDgtNTAdBgNV +HQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAUD8oeXHngovMp +ttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD +pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFo +LtU96G7m1R08P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersF +iXOMy6ZNwPv2AtawB6MDwidAnwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0y +h9WUUpY6RsZxlj33mA6ykaqP2vROJAA5VeitF7nTNCtKqUDMFypVZUF0Qn71wK/I +k63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8bHz2eBIPdltkdOpQ= -----END CERTIFICATE----- + +================================================================ +C: DK +O: TDC +CN: TDC OCES CA -----BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE +SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw +ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU +REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr +2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s +2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU +GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj +dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r +TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB +AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv +c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl +ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu +MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg +T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud +HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD +VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny +bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ +J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG +SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom +JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO +inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y +caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB +mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ +YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 +BKNDLdr8C2LqL19iUw== -----END CERTIFICATE----- + +================================================================ +C: DK +O: TDC Internet +OU: TDC Internet Root CA -----BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV -UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL -EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ -BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x -ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg -bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ -j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV -Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG -SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx -JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI -RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw -MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 -fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i -+DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG -SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN -QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ -gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE +SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg +Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV +BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl +cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA +vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu +Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a +0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 +4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN +eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD +R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG +A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu +dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME +Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 +WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ +KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO +Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX +wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 +9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 +jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 +aQNiuJkFBT1reBK9sG9l -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV -UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL -EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ -BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x -ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ -k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso -LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o -TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG -SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx -JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI -RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 -MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C -TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 -WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG -SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR -xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL -B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID + +================================================================ +C: EE +O: AS Sertifitseerimiskeskus +CN: EE Certification Centre Root CA +emailAddress: pki@sk.ee +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= -----END CERTIFICATE----- + +================================================================ +C: ES +CN: Autoridad de Certificacion Firmaprofesional CIF A62634068 -----BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy -MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA -vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G -CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA -WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ -h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 -f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN -B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy -vUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj -dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 -NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD -VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G -vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ -BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl -IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw -NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq -y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 -E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- + +================================================================ +C: ES +L: C/ Muntaner 244 Barcelona +CN: Autoridad de Certificacion Firmaprofesional CIF A62634068 +emailAddress: ca@firmaprofesional.com -----BEGIN CERTIFICATE----- MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 @@ -946,243 +830,816 @@ ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 quGnM/b9Sh/22WA= -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs -IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg -R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A -PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 -Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL -TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL -5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 -S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe -2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap -EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td -EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv -/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN -A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 -abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF -I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz -4iIprn2DQKi6bA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== + +================================================================ +C: ES +O: Agencia Catalana de Certificacio (NIF Q-0801176-I) +OU: Serveis Publics de Certificacio +OU: Vegeu https://www.catcert.net/verarrel (c)03 +OU: Jerarquia Entitats de Certificacio Catalanes +CN: EC-ACC +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB +8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy +dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 +YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 +dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh +IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD +LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG +EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g +KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD +ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu +bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg +ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R +85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm +4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV +HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd +QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t +lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB +o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 +opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo +dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW +ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN +AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y +/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k +SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy +Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS +Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl +nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= + +================================================================ +C: ES +O: Generalitat Valenciana +OU: PKIGVA +CN: Root CA Generalitat Valenciana +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF +UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ +R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN +MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw +JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+ +WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj +SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl +u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy +A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk +Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7 +MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr +aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC +IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A +cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA +YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA +bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA +bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA +aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA +ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA +YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA +ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA +LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6 +Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y +eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw +CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G +A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu +Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn +lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt +b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg +9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF +ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC +IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= -----END CERTIFICATE----- + +================================================================ +C: ES +O: IZENPE S.A. +CN: Izenpe.com -----BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- + +================================================================ +C: EU +L: Madrid (see current address at www.camerfirma.com/address) +serialNumber: A82743287 +O: AC Camerfirma S.A. +CN: Chambers of Commerce Root - 2008 -----BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ -----END CERTIFICATE----- + +================================================================ +C: EU +L: Madrid (see current address at www.camerfirma.com/address) +serialNumber: A82743287 +O: AC Camerfirma S.A. +CN: Global Chambersign Root - 2008 -----BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- + +================================================================ +C: EU +O: AC Camerfirma SA CIF A82743287 +OU: http://www.chambersign.org +CN: Chambers of Commerce Root -----BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= -----END CERTIFICATE----- + +================================================================ +C: EU +O: AC Camerfirma SA CIF A82743287 +OU: http://www.chambersign.org +CN: Global Chambersign Root -----BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== -----END CERTIFICATE----- + +================================================================ +C: FI +O: Sonera +CN: Sonera Class1 CA -----BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx +MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG +29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk +oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk +3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL +qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN +nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX +ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H +DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO +TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv +kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w +zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa -----END CERTIFICATE----- + +================================================================ +C: FI +O: Sonera +CN: Sonera Class2 CA -----BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +================================================================ +C: FR +O: Certinomis +OU: 0002 433998903 +CN: Certinomis - Autorité Racine +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk +BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 +Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl +cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 +aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY +F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N +8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe +rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K +/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu +7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC +28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 +lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E +nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB +0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 +5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj +WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN +jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s +ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM +OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q +619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn +2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj +o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v +nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG +5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq +pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb +dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 +BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +================================================================ +C: FR +O: Certplus +CN: Class 2 Primary CA +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +================================================================ +C: FR +O: Dhimyotis +CN: Certigna +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +================================================================ +C: FR +ST: France +L: Paris +O: PM/SGDN +OU: DCSSI +CN: IGC/A +emailAddress: igca@sgdn.pm.gouv.fr +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT +AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ +TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG +9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw +MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM +BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO +MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 +LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI +s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 +xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 +u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b +F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx +Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd +PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV +HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx +NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF +AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ +L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY +YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a +NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R +0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +-----END CERTIFICATE----- + +================================================================ +C: GB +O: Trustis Limited +OU: Trustis FPS Root CA +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +================================================================ +C: GB +ST: Greater Manchester +L: Salford +O: Comodo CA Limited +CN: AAA Certificate Services +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +================================================================ +C: GB +ST: Greater Manchester +L: Salford +O: Comodo CA Limited +CN: Secure Certificate Services +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= -----END CERTIFICATE----- + +================================================================ +C: GB +ST: Greater Manchester +L: Salford +O: Comodo CA Limited +CN: Trusted Certificate Services +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +================================================================ +C: GB +ST: Greater Manchester +L: Salford +O: COMODO CA Limited +CN: COMODO Certification Authority +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +================================================================ +C: GB +ST: Greater Manchester +L: Salford +O: COMODO CA Limited +CN: COMODO ECC Certification Authority +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +================================================================ +C: GR +O: Hellenic Academic and Research Institutions Cert. Authority +CN: Hellenic Academic and Research Institutions RootCA 2011 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +================================================================ +C: HK +O: Hongkong Post +CN: Hongkong Post Root CA 1 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +================================================================ +C: HU +L: Budapest +O: Microsec Ltd. +CN: Microsec e-Szigno Root CA 2009 +emailAddress: info@e-szigno.hu +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +================================================================ +C: HU +L: Budapest +O: NetLock Kft. +OU: Tanúsítványkiadók (Certification Services) +CN: NetLock Arany (Class Gold) Főtanúsítvány +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +================================================================ +C: HU +L: Budapest +O: Microsec Ltd. +OU: e-Szigno CA +CN: Microsec e-Szigno Root CA +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw +cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy +b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z +ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 +NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN +TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p +Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u +uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ +LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA +vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 +Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx +62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB +AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw +LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP +BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB +AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov +MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 +ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT +AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh +ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo +AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa +AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln +bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p +Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP +PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv +Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB +EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu +w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj +cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV +HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI +VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS +BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS +b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS +8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds +ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl +7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR +hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ +MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +================================================================ +C: HU +L: Budapest +O: NetLock Halozatbiztonsagi Kft. +OU: Tanusitvanykiadok +CN: NetLock Expressz (Class C) Tanusitvanykiado -----BEGIN CERTIFICATE----- MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 @@ -1214,43 +1671,14 @@ ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 Fp1hBWeAyNDYpQcCNJgEjTME1A== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV -MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe -TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 -dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 -N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC -dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu -MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL -b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD -zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi -3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 -WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY -Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi -NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC -ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 -QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 -YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz -aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm -ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg -ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs -amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv -IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 -Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 -ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 -YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg -dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs -b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G -CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO -xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP -0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ -QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk -f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK -8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI ------END CERTIFICATE----- + +================================================================ +C: HU +L: Budapest +O: NetLock Halozatbiztonsagi Kft. +OU: Tanusitvanykiadok +CN: NetLock Minositett Kozjegyzoi (Class QA) Tanusitvanykiado +emailAddress: info@netlock.hu -----BEGIN CERTIFICATE----- MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 @@ -1290,217 +1718,400 @@ VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY 83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 macqaJVmlaut74nLYKkGEsaUR+ko -----END CERTIFICATE----- + +================================================================ +C: HU +L: Budapest +O: NetLock Halozatbiztonsagi Kft. +OU: Tanusitvanykiadok +CN: NetLock Uzleti (Class B) Tanusitvanykiado +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +================================================================ +C: HU +ST: Hungary +L: Budapest +O: NetLock Halozatbiztonsagi Kft. +OU: Tanusitvanykiadok +CN: NetLock Kozjegyzoi (Class A) Tanusitvanykiado +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV +MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe +TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 +dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 +N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC +dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu +MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL +b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD +zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi +3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 +WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY +Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi +NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC +ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 +QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 +YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz +aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm +ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg +ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs +amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv +IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 +Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 +ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 +YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg +dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs +b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G +CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO +xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP +0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ +QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk +f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK +8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +================================================================ +C: IE +O: Baltimore +OU: CyberTrust +CN: Baltimore CyberTrust Root -----BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u + +================================================================ +C: IL +O: StartCom Ltd. +CN: StartCom Certification Authority G2 +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 +OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG +A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ +JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD +vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo +D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ +Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW +RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK +HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN +nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM +0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i +UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 +Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg +TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL +BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX +UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl +6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK +9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ +HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI +wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY +XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l +IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo +hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr +so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI -----END CERTIFICATE----- + +================================================================ +C: IL +O: StartCom Ltd. +OU: Secure Digital Certificate Signing +CN: StartCom Certification Authority -----BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= -----END CERTIFICATE----- + +================================================================ +C: IL +O: StartCom Ltd. +OU: Secure Digital Certificate Signing +CN: StartCom Certification Authority -----BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8= -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu + +================================================================ +C: IT +L: Milan +O: Actalis S.p.A./03358520967 +CN: Actalis Authentication Root CA +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- + +================================================================ +C: JP +O: Japan Certification Services, Inc. +CN: SecureSign RootCA11 -----BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp -dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy -MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp -eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg -/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl -wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh -AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 -PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu -AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR -MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc -HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ -Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO -rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch -6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 -7CAFYd4= +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- + +================================================================ +C: JP +O: Japanese Government +OU: ApplicationCA -----BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc +MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp +b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT +AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs +aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H +j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K +f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 +IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw +FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht +QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm +/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ +k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ +MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC +seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ +hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ +eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U +DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj +B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= -----END CERTIFICATE----- + +================================================================ +C: JP +O: SECOM Trust Systems CO.,LTD. +OU: Security Communication EV RootCA1 -----BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz +MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N +IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 +bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE +RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO +zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 +bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF +MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 +VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC +OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW +tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ +q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb +EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ +Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O +VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 -----END CERTIFICATE----- + +================================================================ +C: JP +O: SECOM Trust Systems CO.,LTD. +OU: Security Communication RootCA2 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +================================================================ +C: JP +O: SECOM Trust.net +OU: Security Communication RootCA1 -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t @@ -1521,267 +2132,603 @@ Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== -----END CERTIFICATE----- + +================================================================ +C: NL +O: Staat der Nederlanden +CN: Staat der Nederlanden Root CA - G2 -----BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx -MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG -29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk -oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk -3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL -qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN -nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX -ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H -DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO -TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv -kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w -zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +================================================================ +C: NL +O: Staat der Nederlanden +CN: Staat der Nederlanden Root CA +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO +TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy +MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk +ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn +ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 +9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO +hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U +tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o +BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh +SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww +OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv +cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA +7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm +eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 +u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy +7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +================================================================ +C: NO +O: Buypass AS-983163327 +CN: Buypass Class 2 CA 1 +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 +ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX +l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB +HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B +5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 +WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP +gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ +DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu +BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs +h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk +LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +================================================================ +C: NO +O: Buypass AS-983163327 +CN: Buypass Class 2 Root CA +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +================================================================ +C: NO +O: Buypass AS-983163327 +CN: Buypass Class 3 CA 1 +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg +isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z +NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI ++MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R +hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ +mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP +Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s +EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 +mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC +e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow +dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +================================================================ +C: NO +O: Buypass AS-983163327 +CN: Buypass Class 3 Root CA +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +================================================================ +C: PL +O: Unizeto Sp. z o.o. +CN: Certum CA +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +================================================================ +C: PL +O: Unizeto Technologies S.A. +OU: Certum Certification Authority +CN: Certum Trusted Network CA +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +================================================================ +C: RO +O: certSIGN +OU: certSIGN ROOT CA +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD -----END CERTIFICATE----- + +================================================================ +C: SE +O: AddTrust AB +OU: AddTrust External TTP Network +CN: AddTrust External CA Root -----BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- + +================================================================ +C: SE +O: AddTrust AB +OU: AddTrust TTP Network +CN: AddTrust Class 1 CA Root -----BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO -TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy -MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk -ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn -ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 -9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO -hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U -tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o -BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh -SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww -OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv -cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA -7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k -/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm -eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 -u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy -7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- + +================================================================ +C: SE +O: AddTrust AB +OU: AddTrust TTP Network +CN: AddTrust Public CA Root -----BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- + +================================================================ +C: SE +O: AddTrust AB +OU: AddTrust TTP Network +CN: AddTrust Qualified CA Root -----BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js -LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM -BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy -dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh -cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh -YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg -dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp -bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ -YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ -9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 -jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW -FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz -ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 -ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L -EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu -L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC -O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V -um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh -NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= -----END CERTIFICATE----- + +================================================================ +C: SK +L: Bratislava +O: Disig a.s. +CN: CA Disig -----BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk -MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 -YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg -Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT -AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp -Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 -m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih -FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ -TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F -EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco -kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu -HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF -vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo -19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC -L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW -bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX -JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw -FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc -K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf -ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik -Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB -sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e -3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR -ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip -mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH -b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf -rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms -hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y -zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 -MBr1mmz0DlP5OlvRHA== +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET +MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE +AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw +CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg +YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE +Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX +mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD +XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW +S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp +FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD +AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu +ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z +ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv +Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw +DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 +yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq +EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB +EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN +PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +================================================================ +C: SK +L: Bratislava +O: Disig a.s. +CN: CA Disig Root R1 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy +MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk +D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o +OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A +fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe +IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n +oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK +/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj +rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD +3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE +7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC +yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd +qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI +hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA +SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo +HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB +emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC +AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb +7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x +DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk +F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF +a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT +Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL -----END CERTIFICATE----- + +================================================================ +C: SK +L: Bratislava +O: Disig a.s. +CN: CA Disig Root R2 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +================================================================ +C: TR +L: Gebze - Kocaeli +O: Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK +OU: Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE +OU: Kamu Sertifikasyon Merkezi +CN: TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 -----BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS +MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp +bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw +VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy +YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy +dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe +Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx +GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls +aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU +QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh +xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 +aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr +IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h +gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK +O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO +fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw +lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID +AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP +NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t +wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM +7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh +gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n +oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs +yZyQ2uypQjyttgI= -----END CERTIFICATE----- + +================================================================ +C: TR +O: Elektronik Bilgi Guvenligi A.S. +CN: e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi -----BEGIN CERTIFICATE----- -MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu -IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw -WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD -ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y -IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn -IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ -6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob -jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw -izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl -+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY -zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP -pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF -KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW -ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB -AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 -ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW -IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA -A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 -uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ -FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 -jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ -u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D -YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 -puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa -icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG -DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x -kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z -Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp +Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp +a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx +MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg +R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU +MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT +L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H +5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC +90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 +c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE +VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP +qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S +/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj +/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X +KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX -----END CERTIFICATE----- + +================================================================ +C: TW +O: Chunghwa Telecom Co., Ltd. +OU: ePKI Root Certification Authority -----BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- + +================================================================ +C: TW +O: Government Root Certification Authority -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj @@ -1814,2105 +2761,2405 @@ ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl pYYsfPQS -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 -c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y -AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw -TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8 -/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/ -jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms -Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 -c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF -Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw -Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW -w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE -Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD -2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE -SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg -Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV -BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl -cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA -vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu -Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a -0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 -4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN -eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD -R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG -A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu -dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME -Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 -WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ -KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO -Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX -wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 -9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 -jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 -aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE -SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw -ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU -REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr -2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s -2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU -GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj -dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r -TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB -AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv -c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl -ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu -MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg -T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud -HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD -VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny -bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ -J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG -SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom -JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO -inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y -caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB -mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ -YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 -BKNDLdr8C2LqL19iUw== + +================================================================ +C: TW +O: TAIWAN-CA +OU: Root CA +CN: TWCA Root Certification Authority +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt -YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu -Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa -MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG -cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh -d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY -DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E -rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq -uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN -BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa -/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei -gQ== + +================================================================ +C: US +O: AffirmTrust +CN: AffirmTrust Commercial +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== + +================================================================ +C: US +O: AffirmTrust +CN: AffirmTrust Networking +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== + +================================================================ +C: US +O: AffirmTrust +CN: AffirmTrust Premium +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= + +================================================================ +C: US +O: AffirmTrust +CN: AffirmTrust Premium ECC +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== -----END CERTIFICATE----- + +================================================================ +C: US +O: America Online Inc. +CN: America Online Root Certification Authority 1 -----BEGIN CERTIFICATE----- -MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN -BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd -BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN -MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g -Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG -A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l -c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT -6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa -Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL -8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC -9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ -pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ -CayJSdM= +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 -----END CERTIFICATE----- + +================================================================ +C: US +O: America Online Inc. +CN: America Online Root Certification Authority 2 -----BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg -MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz -MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy -dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD -VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg -xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu -xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 -XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k -heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J -YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C -urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 -JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 -b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV -9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 -kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh -fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA -aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS -RGQDJereW26fyfJOrN3H +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= -----END CERTIFICATE----- + +================================================================ +C: US +O: DigiCert Inc +OU: www.digicert.com +CN: DigiCert Assured ID Root CA -----BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 -WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv -bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU -UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw -bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe -LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef -J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh -R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ -Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX -JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p -zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S -Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ -KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq -ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz -gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH -uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS -y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- + +================================================================ +C: US +O: DigiCert Inc +OU: www.digicert.com +CN: DigiCert Global Root CA -----BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB -kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw -IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG -EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu -dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 -E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ -D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK -4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq -lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW -bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB -o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js -LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr -BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB -AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj -j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH -KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv -2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 -mfnGV/TJVTl4uix5yaaIK/QI +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- + +================================================================ +C: US +O: DigiCert Inc +OU: www.digicert.com +CN: DigiCert High Assurance EV Root CA -----BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB -rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt -Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa -Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV -BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l -dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE -AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B -YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 -hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l -L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm -SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM -1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws -6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw -Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 -aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH -AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u -7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 -xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ -rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim -eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk -USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K -----END CERTIFICATE----- + +================================================================ +C: US +O: Digital Signature Trust +OU: DST ACES +CN: DST ACES CA X6 -----BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= -----END CERTIFICATE----- + +================================================================ +C: US +O: Digital Signature Trust Co. +OU: DSTCA E1 -----BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg +bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ +j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV +Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw +MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 +fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i ++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ +gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl -----END CERTIFICATE----- + +================================================================ +C: US +O: Digital Signature Trust Co. +OU: DSTCA E2 -----BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ +k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso +LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o +TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 +MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C +TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 +WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL +B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID -----END CERTIFICATE----- + +================================================================ +C: US +O: Entrust, Inc. +OU: www.entrust.net/CPS is incorporated by reference +OU: (c) 2006 Entrust, Inc. +CN: Entrust Root Certification Authority -----BEGIN CERTIFICATE----- -MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0f -zGVuDLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHi -TkVWaR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAFgVKTk8d6PaXCUDfGD67gmZPCcQcMgMCeazh88K4hiW -NWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n0a3hUKw8fGJLj7qE1xIV -Gx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZRjXZ+Hxb +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- + +================================================================ +C: US +O: Entrust.net +OU: www.entrust.net/CPS incorp. by ref. (limits liab.) +OU: (c) 1999 Entrust.net Limited +CN: Entrust.net Secure Server Certification Authority -----BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK -VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm -Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J -h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 -DzFc6PLZ +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= -----END CERTIFICATE----- + +================================================================ +C: US +O: Equifax +OU: Equifax Secure Certificate Authority -----BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 -nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO -8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV -ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb -PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr -n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a -qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 -wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 -ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs -pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 -E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 -----END CERTIFICATE----- + +================================================================ +C: US +O: Equifax Secure Inc. +CN: Equifax Secure Global eBusiness CA-1 -----BEGIN CERTIFICATE----- -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh -YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 -FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg -J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc -r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +================================================================ +C: US +O: Equifax Secure Inc. +CN: Equifax Secure eBusiness CA-1 +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== -----END CERTIFICATE----- + +================================================================ +C: US +O: GTE Corporation +OU: GTE CyberTrust Solutions, Inc. +CN: GTE CyberTrust Global Root -----BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns -YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y -aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe -Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj -IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx -KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM -HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw -DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC -AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji -nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn -jBJ7xUS0rg== +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ -----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +CN: GeoTrust Global CA -----BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy -aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp -Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp -Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g -Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt -IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU -J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO -JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY -wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o -koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E -Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe -xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u -7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU -sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI -sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP -cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== -----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +CN: GeoTrust Global CA 2 -----BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== -----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +CN: GeoTrust Primary Certification Authority -----BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +CN: GeoTrust Universal CA -----BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +CN: GeoTrust Universal CA 2 -----BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +OU: (c) 2007 GeoTrust Inc. - For authorized use only +CN: GeoTrust Primary Certification Authority - G2 -----BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM -HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK -qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj -cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP -T8qAkbYp +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K -----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +OU: (c) 2008 GeoTrust Inc. - For authorized use only +CN: GeoTrust Primary Certification Authority - G3 -----BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 -GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ -+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd -U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm -NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ -ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 -CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq -g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c -2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ -bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt -----END CERTIFICATE----- + +================================================================ +C: US +O: Network Solutions L.L.C. +CN: Network Solutions Certificate Authority -----BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- + +================================================================ +C: US +O: SecureTrust Corporation +CN: Secure Global CA -----BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 -MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww -KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G -A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 -5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE -SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O -JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu -ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE -AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB -AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB -CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw -b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo -7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ -0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 -nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ -33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- + +================================================================ +C: US +O: SecureTrust Corporation +CN: SecureTrust CA -----BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx -IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs -cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 -MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl -bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD -DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r -WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU -Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs -HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj -z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf -SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl -AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG -KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P -AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j -BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC -VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX -ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB -ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd -/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB -A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn -k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 -iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv -2G0xffX8oRAHh84vWdw+WNs= +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- + +================================================================ +C: US +O: Starfield Technologies, Inc. +OU: Starfield Class 2 Certification Authority -----BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- + +================================================================ +C: US +O: The Go Daddy Group, Inc. +OU: Go Daddy Class 2 Certification Authority -----BEGIN CERTIFICATE----- -MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw -OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu -ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h -gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K -5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy -9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE -gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3 -eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs -YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp -aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp -dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb -sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB -FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy -f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W -+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2 -uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf -tXncwKJrMiE3lvgOOBITRzcahirLer4c ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa -Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g -eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND -IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu -QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui -me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm -RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/ -OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G -O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF -BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI -KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh -c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl -cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw -HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX -hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV -Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw -6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF -6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e -Pr3WHV1wA7EY6oT4zBx+2gT9XBTB ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE -ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE -AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ -BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT -aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl -KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX -GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj -93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+ -P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow -ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g -ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN -W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB -IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB -ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA -ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb -MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv -J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW -pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J -HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu -dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD -QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG -A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV -BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln -bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo -VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs -Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI -iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD -VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0 -oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey -LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF -BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi -UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg -T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0 -b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS -C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt -iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M -eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71 -iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp -ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv -hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg -U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN -MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G -A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD -ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts -YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO -4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF -KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL -/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw -EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3 -dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh -My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB -BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g -IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93 -IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5 -dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM -GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+ -MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq -bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ -xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU -upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk -GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug -5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma -M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+ -HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW -Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9 -JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x -W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE -82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx -UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan -ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2 -2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV -tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue -Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA -iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE -OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db -w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC -3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM -ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4 -7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG -dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF -JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz -1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw -OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu -ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks -ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX -REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D -CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU -YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP -l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8 -MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz -dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg -Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg -Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt -L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf -BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN -AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI -cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1 -CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW -ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB -KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX -DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6 -IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg -U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd -uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v -LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c -ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w -bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM -MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH -AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr -YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC -ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf -MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO -Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz -+z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB -vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE -ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z -dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq -hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3 -WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh -bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g -dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE -AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt -YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6 -rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL -VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40 -I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV -HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/ -vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ -bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl -IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe -BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo -b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW -iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms -1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY= +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= -----END CERTIFICATE----- + +================================================================ +C: US +O: VISA +OU: Visa International Service Association +CN: Visa eCommerce Root -----BEGIN CERTIFICATE----- -MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD -VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz -MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD -VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx -JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz -MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh -cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe -MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo -b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5 -GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1 -fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx -Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u -jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx -ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp -/rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ -co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s -zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo -+uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F -TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w -ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm -gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO -BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf -U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h -c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN -AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/ -BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC -AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC -AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG -+EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV -HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN -BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y -PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M -AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP -qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP -sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v -dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/ -O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P -+UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg -g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg -T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa -yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE -o2A= +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: Class 1 Public Primary Certification Authority -----BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE -AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x -CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW -MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF -RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC -AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 -09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 -XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P -Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK -t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb -X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 -MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU -fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI -2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH -K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae -ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP -BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ -MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw -RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm -fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 -gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe -I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i -5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi -ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn -MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ -o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 -zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN -GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt -r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK -Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== +MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0f +zGVuDLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHi +TkVWaR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAFgVKTk8d6PaXCUDfGD67gmZPCcQcMgMCeazh88K4hiW +NWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n0a3hUKw8fGJLj7qE1xIV +Gx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZRjXZ+Hxb -----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: Class 1 Public Primary Certification Authority - G2 +OU: (c) 1998 VeriSign, Inc. - For authorized use only +OU: VeriSign Trust Network -----BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx -CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp -ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa -QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw -NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft -ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu -QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG -qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL -fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ -Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 -Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ -54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b -MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j -ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej -YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt -A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF -rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ -pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB -lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy -YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 -7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs -YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 -xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc -unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ -Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp -ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 -gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 -jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ -XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD -W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ -RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r -MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk -BYn8eNZcLCZDqQ== +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK +VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm +Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J +h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 +DzFc6PLZ -----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: Class 2 Public Primary Certification Authority - G2 +OU: (c) 1998 VeriSign, Inc. - For authorized use only +OU: VeriSign Trust Network -----BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc -MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp -b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT -AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs -aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H -j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K -f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 -IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw -FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht -QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm -/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ -k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ -MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC -seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ -hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ -eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U -DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj -B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns +YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe +Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx +KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM +HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw +DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji +nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn +jBJ7xUS0rg== -----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: Class 3 Public Primary Certification Authority -----BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy -MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD -VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv -ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl -AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF -661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 -am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 -ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 -PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS -3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k -SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF -3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM -ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g -StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz -Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB -jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k -----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: Class 3 Public Primary Certification Authority -----BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg -Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL -MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD -VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 -ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX -l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB -HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B -5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 -WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD -AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP -gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ -DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu -BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs -h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk -LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ -----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: Class 3 Public Primary Certification Authority - G2 +OU: (c) 1998 VeriSign, Inc. - For authorized use only +OU: VeriSign Trust Network -----BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg -Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL -MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD -VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg -isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z -NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI -+MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R -hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ -mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD -AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP -Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s -EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 -mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC -e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow -dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 -----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 1999 VeriSign, Inc. - For authorized use only +CN: VeriSign Class 1 Public Primary Certification Authority - G3 -----BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET -MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE -AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw -CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg -YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE -Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX -mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD -XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW -S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp -FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD -AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu -ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z -ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv -Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw -DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 -yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq -EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB -EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN -PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== -----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 1999 VeriSign, Inc. - For authorized use only +CN: VeriSign Class 2 Public Primary Certification Authority - G3 -----BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X -DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ -BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 -QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny -gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw -zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q -130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 -JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw -ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj -AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG -9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h -bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc -fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu -HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w -t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q -----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 1999 VeriSign, Inc. - For authorized use only +CN: VeriSign Class 3 Public Primary Certification Authority - G3 -----BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT -AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD -QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP -MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do -0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ -UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d -RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ -OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv -JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C -AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O -BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ -LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY -MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ -44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I -Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw -i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN -9u6wWk5JRFRYX0KD +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 1999 VeriSign, Inc. - For authorized use only +CN: VeriSign Class 4 Public Primary Certification Authority - G3 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 2006 VeriSign, Inc. - For authorized use only +CN: VeriSign Class 3 Public Primary Certification Authority - G5 +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 2007 VeriSign, Inc. - For authorized use only +CN: VeriSign Class 3 Public Primary Certification Authority - G4 -----BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz -IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz -MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj -dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw -EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp -MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 -28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq -VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q -DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR -5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL -ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a -Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl -UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s -+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 -Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx -hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV -HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 -+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN -YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t -L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy -ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt -IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV -HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w -DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW -PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF -5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 -glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH -FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 -pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD -xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG -tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq -jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De -fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ -d0jQ +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 2008 VeriSign, Inc. - For authorized use only +CN: VeriSign Universal Root Certification Authority -----BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD -TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 -MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF -Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh -IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 -dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO -V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC -GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN -v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB -AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB -Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO -76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK -OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH -ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi -yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL -buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj -2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- + +================================================================ +C: US +O: Wells Fargo +OU: Wells Fargo Certification Authority +CN: Wells Fargo Root Certificate Authority -----BEGIN CERTIFICATE----- -MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0 -MRMwEQYDVQQDEwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQG -EwJJTDAeFw0wNDAzMjQxMTMyMThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMT -CkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNpZ24xCzAJBgNVBAYTAklMMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49qROR+WCf4C9DklBKK -8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTyP2Q2 -98CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb -2CEJKHxNGGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxC -ejVb7Us6eva1jsz/D3zkYDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7Kpi -Xd3DTKaCQeQzC6zJMw9kglcq/QytNuEMrkvF7zuZ2SOzW120V+x0cAwqTwIDAQAB -o4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2Zl -ZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0PAQH/BAQD -AgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRL -AZs+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWd -foPPbrxHbvUanlR2QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0M -cXS6hMTXcpuEfDhOZAYnKuGntewImbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq -8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb/627HOkthIDYIb6FUtnUdLlp -hbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VGzT2ouvDzuFYk -Res3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U -AGegcQCCSA== +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 +MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww +KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G +A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 +5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE +SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O +JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu +ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE +AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB +AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB +CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw +b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo +7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ +0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 +nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ +33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= -----END CERTIFICATE----- + +================================================================ +C: US +O: Wells Fargo WellsSecure +OU: Wells Fargo Bank NA +CN: WellsSecure Public Root Certificate Authority -----BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw -PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu -MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx -GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL -MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf -HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh -gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW -v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue -Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr -9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt -6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 -MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl -Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 -ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq -hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p -iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC -dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL -kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL -hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx +IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs +cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 +MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl +bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD +DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r +WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU +Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs +HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj +z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf +SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl +AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG +KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P +AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j +BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC +VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX +ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB +ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd +/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB +A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn +k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 +iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv +2G0xffX8oRAHh84vWdw+WNs= -----END CERTIFICATE----- + +================================================================ +C: US +O: thawte, Inc. +OU: (c) 2007 thawte, Inc. - For authorized use only +CN: thawte Primary Root CA - G2 -----BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG -A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh -bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE -ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 -7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS -J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y -HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP -t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz -FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY -XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw -hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js -MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA -A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj -Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx -XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o -omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc -A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- + +================================================================ +C: US +O: thawte, Inc. +OU: Certification Services Division +OU: (c) 2006 thawte, Inc. - For authorized use only +CN: thawte Primary Root CA -----BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== -----END CERTIFICATE----- + +================================================================ +C: US +O: thawte, Inc. +OU: Certification Services Division +OU: (c) 2008 thawte, Inc. - For authorized use only +CN: thawte Primary Root CA - G3 -----BEGIN CERTIFICATE----- -MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV -BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt -ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 -MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg -SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl -a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h -4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk -tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s -tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL -dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 -c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um -TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z -+kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O -Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW -OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW -fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 -l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw -FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ -8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI -6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO -TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME -wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY -Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn -xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q -DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q -Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t -hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 -7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 -QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- + +================================================================ +C: US +OU: www.xrampsecurity.com +O: XRamp Security Services Inc +CN: XRamp Global Certification Authority -----BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp -Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp -a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx -MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg -R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU -MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT -L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H -5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC -90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 -c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE -VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP -qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S -/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj -/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X -KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw -IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL -SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH -SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh -ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X -DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 -TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ -fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA -sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU -WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS -nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH -dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip -NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC -AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF -MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB -uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl -PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP -JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ -gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 -j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 -5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB -o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS -/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z -Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE -W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D -hNQ+IIX3Sj0rnP0qCglN6oH4EZw= + +================================================================ +C: US +ST: Arizona +L: Scottsdale +O: GoDaddy.com, Inc. +CN: Go Daddy Root Certificate Authority - G2 +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +================================================================ +C: US +ST: Arizona +L: Scottsdale +O: Starfield Technologies, Inc. +CN: Starfield Root Certificate Authority - G2 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- + +================================================================ +C: US +ST: Arizona +L: Scottsdale +O: Starfield Technologies, Inc. +CN: Starfield Services Root Certificate Authority - G2 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +================================================================ +C: US +ST: Indiana +L: Indianapolis +O: Software in the Public Interest +OU: hostmaster +CN: Certificate Authority +emailAddress: hostmaster@spi-inc.org -----BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL -MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj -KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 -MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw -NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV -BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL -So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal -tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG -CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT -qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz -rD6ogRLQy7rQkgu2npaqBA+K +MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD +VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz +MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD +VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx +JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz +MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh +cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe +MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo +b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5 +GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1 +fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx +Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u +jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx +ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp +/rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ +co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s +zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo ++uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F +TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w +ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm +gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO +BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf +U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h +c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN +AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/ +BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC +AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC +AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG ++EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV +HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN +BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y +PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M +AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP +qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP +sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v +dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/ +O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P ++UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg +g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg +T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa +yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE +o2A= -----END CERTIFICATE----- + +================================================================ +C: US +ST: UT +L: Salt Lake City +O: The USERTRUST Network +OU: http://www.usertrust.com +CN: UTN - DATACorp SGC -----BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB -mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT -MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ -BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 -BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz -+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm -hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn -5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W -JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL -DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC -huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw -HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB -AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB -zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN -kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH -SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G -spki4cErx5z481+oghLrGREt +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI -----END CERTIFICATE----- + +================================================================ +C: US +ST: UT +L: Salt Lake City +O: The USERTRUST Network +OU: http://www.usertrust.com +CN: UTN-USERFirst-Client Authentication and Email -----BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD -VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 -IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 -MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx -MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy -cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG -A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl -BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI -hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed -KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 -G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 -zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 -ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG -HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 -Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V -yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e -beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r -6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog -zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW -BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr -ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp -ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk -cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt -YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC -CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow -KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI -hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ -UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz -X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x -fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz -a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd -Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd -SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O -AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso -M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge -v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt +Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa +Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV +BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l +dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE +AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B +YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 +hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l +L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm +SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM +1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws +6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw +Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 +aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u +7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 +xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ +rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim +eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk +USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= -----END CERTIFICATE----- + +================================================================ +C: US +ST: UT +L: Salt Lake City +O: The USERTRUST Network +OU: http://www.usertrust.com +CN: UTN-USERFirst-Hardware -----BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== -----END CERTIFICATE----- + +================================================================ +C: ZA +ST: Western Cape +L: Cape Town +O: Thawte Consulting cc +OU: Certification Services Division +CN: Thawte Premium Server CA +emailAddress: premium-server@thawte.com -----BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== -----END CERTIFICATE----- + +================================================================ +C: ZA +ST: Western Cape +L: Cape Town +O: Thawte Consulting cc +OU: Certification Services Division +CN: Thawte Server CA +emailAddress: server-certs@thawte.com -----BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT -AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ -TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG -9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw -MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM -BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO -MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 -LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI -s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 -xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 -u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b -F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx -Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd -PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV -HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx -NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF -AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ -L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY -YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a -NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R -0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= -----END CERTIFICATE----- + +================================================================ +C: ch +O: Swisscom +OU: Digital Certificate Services +CN: Swisscom Root CA 1 -----BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 -MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 -ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD -VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j -b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq -scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO -xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H -LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX -uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD -yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ -JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q -rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN -BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L -hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB -QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ -HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu -Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg -QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB -BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA -A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb -laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 -awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo -JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw -LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT -VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk -LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb -UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ -QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ -naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls -QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 +m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih +FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ +TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F +EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco +kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu +HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF +vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo +19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC +L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW +bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX +JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc +K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf +ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik +Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB +sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e +3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR +ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip +mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH +b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf +rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms +hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y +zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 +MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +================================================================ +C: ch +O: Swisscom +OU: Digital Certificate Services +CN: Swisscom Root CA 2 +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr +jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r +0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f +2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP +ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF +y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA +tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL +6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0 +uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL +acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh +k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q +VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O +BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh +b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R +fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv +/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI +REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx +srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv +aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT +woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n +Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W +t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N +8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2 +9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5 +wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- + +================================================================ +C: ch +O: Swisscom +OU: Digital Certificate Services +CN: Swisscom Root EV CA 2 +-----BEGIN CERTIFICATE----- +MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw +ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp +dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290 +IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD +VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy +dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg +MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx +UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD +1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH +oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR +HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/ +5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv +idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL +OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC +NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f +46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB +UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth +7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G +A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED +MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB +bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x +XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T +PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0 +Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70 +WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL +Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm +7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S +nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN +vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB +WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI +fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb +I+2ksx0WckNLIOFZfsLorSa/ovc= -----END CERTIFICATE----- + +================================================================ +CN: ACEDICOM Root +OU: PKI +O: EDICOM +C: ES -----BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN -AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp -dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw -MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw -CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ -MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB -SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz -ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH -LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP -PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL -2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w -ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC -MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk -AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 -AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz -AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz -AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f -BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY -P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi -CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g -kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 -HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS -na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q -qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z -TbvGRNs2yyqcjg== +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE +AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x +CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW +MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF +RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC +AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 +09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 +XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P +Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK +t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb +X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 +MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU +fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI +2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH +K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae +ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP +BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ +MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw +RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm +fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 +gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe +I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i +5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi +ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn +MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ +o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 +zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN +GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt +r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK +Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== -----END CERTIFICATE----- + +================================================================ +CN: ComSign CA +O: ComSign +C: IL -----BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0 +MRMwEQYDVQQDEwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQG +EwJJTDAeFw0wNDAzMjQxMTMyMThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMT +CkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNpZ24xCzAJBgNVBAYTAklMMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49qROR+WCf4C9DklBKK +8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTyP2Q2 +98CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb +2CEJKHxNGGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxC +ejVb7Us6eva1jsz/D3zkYDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7Kpi +Xd3DTKaCQeQzC6zJMw9kglcq/QytNuEMrkvF7zuZ2SOzW120V+x0cAwqTwIDAQAB +o4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2Zl +ZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0PAQH/BAQD +AgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRL +AZs+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWd +foPPbrxHbvUanlR2QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0M +cXS6hMTXcpuEfDhOZAYnKuGntewImbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq +8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb/627HOkthIDYIb6FUtnUdLlp +hbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VGzT2ouvDzuFYk +Res3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U +AGegcQCCSA== -----END CERTIFICATE----- + +================================================================ +CN: ComSign Secured CA +O: ComSign +C: IL -----BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw -cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy -b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z -ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 -NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN -TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p -Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u -uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ -LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA -vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 -Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx -62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB -AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw -LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP -BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB -AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov -MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 -ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT -AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh -ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo -AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa -AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln -bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p -Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP -PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv -Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB -EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu -w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj -cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV -HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI -VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS -BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS -b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS -8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds -ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl -7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR -hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ -MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw +PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu +MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx +GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL +MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf +HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh +gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW +v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue +Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr +9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt +6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 +MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl +Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 +ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq +hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p +iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC +dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL +kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL +hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== -----END CERTIFICATE----- + +================================================================ +CN: EBG Elektronik Sertifika Hizmet Sağlayıcısı +O: EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. +C: TR -----BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV +BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt +ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 +MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl +a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h +4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk +tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s +tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL +dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 +c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um +TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z ++kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O +Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW +OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW +fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 +l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw +FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ +8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI +6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO +TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME +wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY +Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn +xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q +DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q +Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t +hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 +7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 +QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT -----END CERTIFICATE----- + +================================================================ +CN: TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı +C: TR +L: ANKARA +O: (c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -----BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB -ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly -aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl -ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w -NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G -A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD -VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX -SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR -VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 -w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF -mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg -4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 -4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw -EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx -SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 -ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 -vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi -Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ -/L7fCg0= +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg +MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz +MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy +dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD +VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg +xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu +xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 +XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k +heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J +YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C +urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 +JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 +b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV +9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 +kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh +fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA +aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS +RGQDJereW26fyfJOrN3H -----END CERTIFICATE----- + +================================================================ +CN: TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı +C: TR +L: Ankara +O: TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 -----BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr -MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG -A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 -MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp -Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD -QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz -i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 -h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV -MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 -UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni -8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC -h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD -VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB -AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm -KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ -X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr -QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 -pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN -QSdJQO7e5iNEOdyhIta6A/I= +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx +OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry +b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC +VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE +sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F +ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY +KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG ++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG +HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P +IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M +733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk +Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW +AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 +mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa +XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ +qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 -----END CERTIFICATE----- + +================================================================ +CN: TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı +C: TR +L: Ankara +O: TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005 -----BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz -MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N -IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 -bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE -RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO -zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 -bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF -MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 -VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC -OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW -tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ -q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb -EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ -Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O -VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 +WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv +bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU +UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw +bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe +LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef +J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh +R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ +Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX +JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p +zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S +Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq +ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz +gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH +uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS +y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= -----END CERTIFICATE----- + +================================================================ +L: ValiCert Validation Network +O: ValiCert, Inc. +OU: ValiCert Class 1 Policy Validation Authority +CN: http://www.valicert.com/ +emailAddress: info@valicert.com -----BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX -DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 -qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp -uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU -Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE -pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp -5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M -UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN -GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy -5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv -6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK -eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 -B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ -BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov -L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG -SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS -CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen -5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 -IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK -gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL -+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL -vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm -bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk -N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC -Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z -ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI -----END CERTIFICATE----- + +================================================================ +L: ValiCert Validation Network +O: ValiCert, Inc. +OU: ValiCert Class 2 Policy Validation Authority +CN: http://www.valicert.com/ +emailAddress: info@valicert.com -----BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCB -rjELMAkGA1UEBhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcp -MRIwEAYDVQQHEwlTdHV0dGdhcnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fz -c2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVTLVRSVVNUIEF1dGhlbnRpY2F0aW9u -IGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0wNTA2MjIwMDAwMDBa -Fw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFkZW4t -V3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMg -RGV1dHNjaGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJV -U1QgQXV0aGVudGljYXRpb24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBO -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1 -toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob4QSwI7+Vio5bG0F/WsPo -TUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXLg3KSwlOy -ggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1 -XgqfeN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteF -hy+S8dF2g08LOlk3KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm -7QIDAQABo4GSMIGPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEG -MCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJvbmxpbmUxLTIwNDgtNTAdBgNV -HQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAUD8oeXHngovMp -ttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD -pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFo -LtU96G7m1R08P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersF -iXOMy6ZNwPv2AtawB6MDwidAnwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0y -h9WUUpY6RsZxlj33mA6ykaqP2vROJAA5VeitF7nTNCtKqUDMFypVZUF0Qn71wK/I -k63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8bHz2eBIPdltkdOpQ= +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd -----END CERTIFICATE----- + +================================================================ +L: ValiCert Validation Network +O: ValiCert, Inc. +OU: ValiCert Class 3 Policy Validation Authority +CN: http://www.valicert.com/ +emailAddress: info@valicert.com -----BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV -BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 -Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 -OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i -SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc -VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf -tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg -uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J -XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK -8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 -5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 -kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 -Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz -JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 -Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS -GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt -ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 -au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV -hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI -dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu -----END CERTIFICATE----- + +================================================================ +O: Cybertrust, Inc +CN: Cybertrust Global Root -----BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV -BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 -Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 -OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i -SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc -VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW -Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q -Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 -1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq -ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 -Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX -XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 -Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz -JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 -Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN -irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 -TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 -g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB -95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj -S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- + +================================================================ +O: Digital Signature Trust Co. +CN: DST Root CA X3 -----BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV -BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 -c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx -MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg -R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD -VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR -JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T -fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu -jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z -wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ -fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD -VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G -CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 -7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn -8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs -ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ -2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- + +================================================================ +O: Entrust.net +OU: www.entrust.net/CPS_2048 incorp. by ref. (limits liab.) +OU: (c) 1999 Entrust.net Limited +CN: Entrust.net Certification Authority (2048) -----BEGIN CERTIFICATE----- -MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV -BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1 -c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAeFw0wOTA5MDkwODE1MjdaFw0yOTEy -MzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNUQyBUcnVzdENlbnRl -ciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0ExKDAm -BgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF -5+cvAqBNLaT6hdqbJYUtQCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYv -DIRlzg9uwliT6CwLOunBjvvya8o84pxOjuT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8v -zArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+EutCHnNaYlAJ/Uqwa1D7KRT -yGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1M4BDj5yj -dipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBh -MB8GA1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI -4jANBgkqhkiG9w0BAQUFAAOCAQEAg8ev6n9NCjw5sWi+e22JLumzCecYV42Fmhfz -dkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+KGwWaODIl0YgoGhnYIg5IFHY -aAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhKBgePxLcHsU0G -DeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV -CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPH -LQNjO9Po5KIqwoIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= -----END CERTIFICATE----- + +================================================================ +O: RSA Security Inc +OU: RSA Security 2048 V3 -----BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp -IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi -BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw -MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig -YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v -dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ -BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 -papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K -DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 -KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox -XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4= -----END CERTIFICATE----- + +================================================================ +OU: GlobalSign Root CA - R2 +O: GlobalSign +CN: GlobalSign -----BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB -rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV -BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa -Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl -LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u -MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm -gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 -YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf -b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 -9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S -zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk -OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA -2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW -oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c -KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM -m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu -MdRAGmI0Nj81Aa6sY6A= +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- + +================================================================ +OU: GlobalSign Root CA - R3 +O: GlobalSign +CN: GlobalSign -----BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS -MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp -bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw -VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy -YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy -dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe -Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx -GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls -aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU -QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh -xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 -aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr -IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h -gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK -O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO -fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw -lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID -AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP -NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t -wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM -7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh -gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n -oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs -yZyQ2uypQjyttgI= +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp -U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg -SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln -biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm -GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve -fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ -aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj -aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW -kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC -4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga -FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== + +================================================================ +emailAddress: contacto@procert.net.ve +L: Chacao +ST: Miranda +OU: Proveedor de Certificados PROCERT +O: Sistema Nacional de Certificacion Electronica +C: VE +CN: PSCProcert +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s +YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz +dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 +aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh +IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ +KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw +MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy +b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx +KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG +A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u +aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 +7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 +BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G +ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 +JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 +PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 +0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ +6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m +v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 +K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev +bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw +MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w +MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD +gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 +b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh +bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 +cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp +ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg +ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq +hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD +AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w +MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag +RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t +UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl +cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG +AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN +AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS +1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB +3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv +Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh +HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm +pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz +sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE +qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb +mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 +opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H +YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km -----END CERTIFICATE----- + +================================================================ +emailAddress: pki@sk.ee +C: EE +O: AS Sertifitseerimiskeskus +CN: Juur-SK -----BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB -vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W -ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 -IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y -IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh -bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF -9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH -H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H -LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN -/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT -rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw -WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs -exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 -sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ -seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz -4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ -BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR -lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 -7M2CYfE45k+XmCpajQ== +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN +AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp +dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw +MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw +CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ +MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB +SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz +ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH +LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP +PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL +2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w +ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC +MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk +AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 +AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz +AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz +AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f +BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY +P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi +CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g +kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 +HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS +na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q +qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z +TbvGRNs2yyqcjg== -----END CERTIFICATE----- diff --git a/externals/vegas/LICENSE b/externals/vegas/LICENSE deleted file mode 100644 index 0c5ecafa21..0000000000 --- a/externals/vegas/LICENSE +++ /dev/null @@ -1,581 +0,0 @@ -Mozilla Public License 1.1 (MPL 1.1) - -1. Definitions. - - 1.0.1. "Commercial Use" means distribution or - otherwise making the Covered Code available to a third - party. - - 1.1. ''Contributor'' means each entity that creates or - contributes to the creation of Modifications. - - 1.2. ''Contributor Version'' means the combination of - the Original Code, prior Modifications used by - a Contributor, and the Modifications made by that - particular Contributor. - - 1.3. ''Covered Code'' means the Original Code or - Modifications or the combination of the Original Code - and Modifications, in each case including portions - thereof. - - 1.4. ''Electronic Distribution Mechanism'' means a - mechanism generally accepted in the software - development community for the electronic transfer of - data. - - 1.5. ''Executable'' means Covered Code in any form - other than Source Code. - - 1.6. ''Initial Developer'' means the individual or - entity identified as the Initial Developer in the - Source Code notice required by Exhibit A. - - 1.7. ''Larger Work'' means a work which combines - Covered Code or portions thereof with code not - governed by the terms of this License. - - 1.8. ''License'' means this document. - - 1.8.1. "Licensable" means having the right to grant, - to the maximum extent possible, whether at the time of - the initial grant or subsequently acquired, any and - all of the rights conveyed herein. - - 1.9. ''Modifications'' means any addition to or - deletion from the substance or structure of either the - Original Code or any previous Modifications. When - Covered Code is released as a series of files, a - Modification is: - - A. Any addition to or deletion from the contents - of a file containing Original Code or previous - Modifications. - - B. Any new file that contains any part of the - Original Code or previous Modifications. - - 1.10. ''Original Code'' means Source Code of computer - software code which is described in the Source Code - notice required by Exhibit A as Original Code, and - which, at the time of its release under this License - is not already Covered Code governed by this License. - - 1.10.1. "Patent Claims" means any patent claim(s), now - owned or hereafter acquired, including without - limitation, method, process, and apparatus claims, in - any patent Licensable by grantor. - - 1.11. ''Source Code'' means the preferred form of the - Covered Code for making modifications to it, including - all modules it contains, plus any associated interface - definition files, scripts used to control compilation - and installation of an Executable, or source code - differential comparisons against either the Original - Code or another well known, available Covered Code of - the Contributor's choice. The Source Code can be in a - compressed or archival form, provided the appropriate - decompression or de-archiving software is widely - available for no charge. - - 1.12. "You'' (or "Your") means an individual or a - legal entity exercising rights under, and complying - with all of the terms of, this License or a future - version of this License issued under Section 6.1. For - legal entities, "You'' includes any entity which - controls, is controlled by, or is under common control - with You. For purposes of this definition, "control'' - means (a) the power, direct or indirect, to cause the - direction or management of such entity, whether by - contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or - beneficial ownership of such entity. - - -2. Source Code License. - - 2.1. The Initial Developer Grant. - The Initial Developer hereby grants You a world-wide, - royalty-free, non-exclusive license, subject to third - party intellectual property claims: - (a) under intellectual property rights (other - than patent or trademark) Licensable by Initial - Developer to use, reproduce, modify, display, - perform, sublicense and distribute the Original - Code (or portions thereof) with or without - Modifications, and/or as part of a Larger Work; - and - - (b) under Patents Claims infringed by the making, - using or selling of Original Code, to make, have - made, use, practice, sell, and offer for sale, - and/or otherwise dispose of the Original Code (or - portions thereof). - - (c) the licenses granted in this Section 2.1(a) - and (b) are effective on the date Initial - Developer first distributes Original Code under - the terms of this License. - - (d) Notwithstanding Section 2.1(b) above, no - patent license is granted: 1) for code that You - delete from the Original Code; 2) separate from - the Original Code; or 3) for infringements - caused by: i) the modification of the Original - Code or ii) the combination of the Original Code - with other software or devices. - - 2.2. Contributor Grant. - Subject to third party intellectual property claims, - each Contributor hereby grants You a world-wide, - royalty-free, non-exclusive license - - (a) under intellectual property rights (other - than patent or trademark) Licensable by - Contributor, to use, reproduce, modify, display, - perform, sublicense and distribute the - Modifications created by such Contributor (or - portions thereof) either on an unmodified basis, - with other Modifications, as Covered Code and/or - as part of a Larger Work; - and - - (b) under Patent Claims infringed by the making, - using, or selling of Modifications made by that - Contributor either alone and/or in combination - with its Contributor Version (or portions of such - combination), to make, use, sell, offer for sale, - have made, and/or otherwise dispose of: 1) - Modifications made by that Contributor (or - portions thereof); and 2) the combination of - Modifications made by that Contributor with its - Contributor Version (or portions of such - combination). - - (c) the licenses granted in Sections 2.2(a) and - 2.2(b) are effective on the date Contributor - first makes Commercial Use of the Covered Code. - - (d) Notwithstanding Section 2.2(b) above, no - patent license is granted: 1) for any code that - Contributor has deleted from the Contributor - Version; 2) separate from the Contributor - Version; 3) for infringements caused by: i) - third party modifications of Contributor Version - or ii) the combination of Modifications made by - that Contributor with other software (except as - part of the Contributor Version) or other - devices; or 4) under Patent Claims infringed by - Covered Code in the absence of Modifications made - by that Contributor. - - -3. Distribution Obligations. - - 3.1. Application of License. - The Modifications which You create or to which You - contribute are governed by the terms of this License, - including without limitation Section 2.2. The Source - Code version of Covered Code may be distributed only - under the terms of this License or a future version of - this License released under Section 6.1, and You must - include a copy of this License with every copy of the - Source Code You distribute. You may not offer or - impose any terms on any Source Code version that - alters or restricts the applicable version of this - License or the recipients' rights hereunder. However, - You may include an additional document offering the - additional rights described in Section 3.5. - - 3.2. Availability of Source Code. - Any Modification which You create or to which You - contribute must be made available in Source Code form - under the terms of this License either on the same - media as an Executable version or via an accepted - Electronic Distribution Mechanism to anyone to whom - you made an Executable version available; and if made - available via Electronic Distribution Mechanism, must - remain available for at least twelve (12) months after - the date it initially became available, or at least - six (6) months after a subsequent version of that - particular Modification has been made available to - such recipients. You are responsible for ensuring that - the Source Code version remains available even if the - Electronic Distribution Mechanism is maintained by a - third party. - - 3.3. Description of Modifications. - You must cause all Covered Code to which You - contribute to contain a file documenting the changes - You made to create that Covered Code and the date of - any change. You must include a prominent statement - that the Modification is derived, directly or - indirectly, from Original Code provided by the Initial - Developer and including the name of the Initial - Developer in (a) the Source Code, and (b) in any - notice in an Executable version or related - documentation in which You describe the origin or - ownership of the Covered Code. - - 3.4. Intellectual Property Matters - (a) Third Party Claims. - If Contributor has knowledge that a license under - a third party's intellectual property rights is - required to exercise the rights granted by such - Contributor under Sections 2.1 or 2.2, - Contributor must include a text file with the - Source Code distribution titled "LEGAL'' which - describes the claim and the party making the - claim in sufficient detail that a recipient will - know whom to contact. If Contributor obtains such - knowledge after the Modification is made - available as described in Section 3.2, - Contributor shall promptly modify the LEGAL file - in all copies Contributor makes available - thereafter and shall take other steps (such as - notifying appropriate mailing lists or - newsgroups) reasonably calculated to inform those - who received the Covered Code that new knowledge - has been obtained. - - (b) Contributor APIs. - If Contributor's Modifications include an - application programming interface and Contributor - has knowledge of patent licenses which are - reasonably necessary to implement that API, - Contributor must also include this information in - the LEGAL file. - - (c) Representations. - Contributor represents that, except as disclosed - pursuant to Section 3.4(a) above, Contributor - believes that Contributor's Modifications are - Contributor's original creation(s) and/or - Contributor has sufficient rights to grant the - rights conveyed by this License. - - 3.5. Required Notices. - You must duplicate the notice in Exhibit A in each - file of the Source Code. If it is not possible to put - such notice in a particular Source Code file due to - its structure, then You must include such notice in a - location (such as a relevant directory) where a user - would be likely to look for such a notice. If You - created one or more Modification(s) You may add your - name as a Contributor to the notice described in - Exhibit A. You must also duplicate this License in - any documentation for the Source Code where You - describe recipients' rights or ownership rights - relating to Covered Code. You may choose to offer, - and to charge a fee for, warranty, support, indemnity - or liability obligations to one or more recipients of - Covered Code. However, You may do so only on Your own - behalf, and not on behalf of the Initial Developer or - any Contributor. You must make it absolutely clear - than any such warranty, support, indemnity or - liability obligation is offered by You alone, and You - hereby agree to indemnify the Initial Developer and - every Contributor for any liability incurred by the - Initial Developer or such Contributor as a result of - warranty, support, indemnity or liability terms You - offer. - - 3.6. Distribution of Executable Versions. - You may distribute Covered Code in Executable form - only if the requirements of Section 3.1-3.5 have been - met for that Covered Code, and if You include a notice - stating that the Source Code version of the Covered - Code is available under the terms of this License, - including a description of how and where You have - fulfilled the obligations of Section 3.2. The notice - must be conspicuously included in any notice in an - Executable version, related documentation or - collateral in which You describe recipients' rights - relating to the Covered Code. You may distribute the - Executable version of Covered Code or ownership rights - under a license of Your choice, which may contain - terms different from this License, provided that You - are in compliance with the terms of this License and - that the license for the Executable version does not - attempt to limit or alter the recipient's rights in - the Source Code version from the rights set forth in - this License. If You distribute the Executable version - under a different license You must make it absolutely - clear that any terms which differ from this License - are offered by You alone, not by the Initial Developer - or any Contributor. You hereby agree to indemnify the - Initial Developer and every Contributor for any - liability incurred by the Initial Developer or such - Contributor as a result of any such terms You offer. - - 3.7. Larger Works. - You may create a Larger Work by combining Covered Code - with other code not governed by the terms of this - License and distribute the Larger Work as a single - product. In such a case, You must make sure the - requirements of this License are fulfilled for the - Covered Code. - - -4. Inability to Comply Due to Statute or Regulation. - - If it is impossible for You to comply with any of the - terms of this License with respect to some or all of - the Covered Code due to statute, judicial order, or - regulation then You must: (a) comply with the terms of - this License to the maximum extent possible; and (b) - describe the limitations and the code they affect. - Such description must be included in the LEGAL file - described in Section 3.4 and must be included with all - distributions of the Source Code. Except to the extent - prohibited by statute or regulation, such description - must be sufficiently detailed for a recipient of - ordinary skill to be able to understand it. - - -5. Application of this License. - - This License applies to code to which the Initial - Developer has attached the notice in Exhibit A and to - related Covered Code. - - -6. Versions of the License. - - 6.1. New Versions. - Netscape Communications Corporation (''Netscape'') may - publish revised and/or new versions of the License - from time to time. Each version will be given a - distinguishing version number. - - 6.2. Effect of New Versions. - Once Covered Code has been published under a - particular version of the License, You may always - continue to use it under the terms of that version. - You may also choose to use such Covered Code under the - terms of any subsequent version of the License - published by Netscape. No one other than Netscape has - the right to modify the terms applicable to Covered - Code created under this License. - - 6.3. Derivative Works. - If You create or use a modified version of this - License (which you may only do in order to apply it to - code which is not already Covered Code governed by - this License), You must (a) rename Your license so - that the phrases ''Mozilla'', ''MOZILLAPL'', - ''MOZPL'', ''Netscape'', "MPL", ''NPL'' or any - confusingly similar phrase do not appear in your - license (except to note that your license differs from - this License) and (b) otherwise make it clear that - Your version of the license contains terms which - differ from the Mozilla Public License and Netscape - Public License. (Filling in the name of the Initial - Developer, Original Code or Contributor in the notice - described in Exhibit A shall not of themselves be - deemed to be modifications of this License.) - - -7. DISCLAIMER OF WARRANTY. - - COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS - IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER - EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, - WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, - MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON- - INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND - PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD - ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU - (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) - ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR - CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN - ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED - CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS - DISCLAIMER. - - -8. TERMINATION. - - 8.1. This License and the rights granted hereunder - will terminate automatically if You fail to comply - with terms herein and fail to cure such breach within - 30 days of becoming aware of the breach. All - sublicenses to the Covered Code which are properly - granted shall survive any termination of this License. - Provisions which, by their nature, must remain in - effect beyond the termination of this License shall - survive. - - 8.2. If You initiate litigation by asserting a patent - infringement claim (excluding declatory judgment - actions) against Initial Developer or a Contributor - (the Initial Developer or Contributor against whom You - file such action is referred to as "Participant") - alleging that: - - (a) such Participant's Contributor Version directly - or indirectly infringes any patent, then any and all - rights granted by such Participant to You under - Sections 2.1 and/or 2.2 of this License shall, upon 60 - days notice from Participant terminate prospectively, - unless if within 60 days after receipt of notice You - either: (i) agree in writing to pay Participant a - mutually agreeable reasonable royalty for Your past - and future use of Modifications made by such - Participant, or (ii) withdraw Your litigation claim - with respect to the Contributor Version against such - Participant. If within 60 days of notice, a - reasonable royalty and payment arrangement are not - mutually agreed upon in writing by the parties or the - litigation claim is not withdrawn, the rights granted - by Participant to You under Sections 2.1 and/or 2.2 - automatically terminate at the expiration of the 60 - day notice period specified above. - - (b) any software, hardware, or device, other than - such Participant's Contributor Version, directly or - indirectly infringes any patent, then any rights - granted to You by such Participant under Sections 2.1 - (b) and 2.2(b) are revoked effective as of the date - You first made, used, sold, distributed, or had made, - Modifications made by that Participant. - - 8.3. If You assert a patent infringement claim - against Participant alleging that such Participant's - Contributor Version directly or indirectly infringes - any patent where such claim is resolved (such as by - license or settlement) prior to the initiation of - patent infringement litigation, then the reasonable - value of the licenses granted by such Participant - under Sections 2.1 or 2.2 shall be taken into account - in determining the amount or value of any payment or - license. - - 8.4. In the event of termination under Sections 8.1 - or 8.2 above, all end user license agreements - (excluding distributors and resellers) which have been - validly granted by You or any distributor hereunder - prior to termination shall survive termination. - - -9. LIMITATION OF LIABILITY. - - UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, - WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR - OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER - CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR - ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY - PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR - CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, - WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK - STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND - ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH - PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF - SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT - APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY - RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT - APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME - JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION - OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS - EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. - - -10. U.S. GOVERNMENT END USERS. - - The Covered Code is a ''commercial item,'' as that - term is defined in 48 C.F.R. 2.101 (Oct. 1995), - consisting of ''commercial computer software'' and - ''commercial computer software documentation,'' as - such terms are used in 48 C.F.R. 12.212 (Sept. 1995). - Consistent with 48 C.F.R. 12.212 and 48 C.F.R. - 227.7202-1 through 227.7202-4 (June 1995), all U.S. - Government End Users acquire Covered Code with only - those rights set forth herein. - - -11. MISCELLANEOUS. - - This License represents the complete agreement - concerning subject matter hereof. If any provision of - this License is held to be unenforceable, such - provision shall be reformed only to the extent - necessary to make it enforceable. This License shall - be governed by California law provisions (except to - the extent applicable law, if any, provides - otherwise), excluding its conflict-of-law provisions. - With respect to disputes in which at least one party - is a citizen of, or an entity chartered or registered - to do business in the United States of America, any - litigation relating to this License shall be subject - to the jurisdiction of the Federal Courts of the - Northern District of California, with venue lying in - Santa Clara County, California, with the losing party - responsible for costs, including without limitation, - court costs and reasonable attorneys' fees and - expenses. The application of the United Nations - Convention on Contracts for the International Sale of - Goods is expressly excluded. Any law or regulation - which provides that the language of a contract shall - be construed against the drafter shall not apply to - this License. - - -12. RESPONSIBILITY FOR CLAIMS. - - As between Initial Developer and the Contributors, - each party is responsible for claims and damages - arising, directly or indirectly, out of its - utilization of rights under this License and You agree - to work with Initial Developer and Contributors to - distribute such responsibility on an equitable basis. - Nothing herein is intended or shall be deemed to - constitute any admission of liability. - - -13. MULTIPLE-LICENSED CODE. - - Initial Developer may designate portions of the - Covered Code as Multiple-Licensed. Multiple-Licensed - means that the Initial Developer permits you to - utilize portions of the Covered Code under Your choice - of the NPL or the alternative licenses, if any, - specified by the Initial Developer in the file - described in Exhibit A. - - - -EXHIBIT A - Mozilla Public License. - - The contents of this file are subject to the Mozilla Public License Version - 1.1 (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.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" basis, - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - for the specific language governing rights and limitations under the License. - - The Original Code is ______________________________________. - - The Initial Developer of the Original Code is - ________________________. - Portions created by ______________________ are Copyright (C) ______ - _______________________. All Rights Reserved. - - Contributor(s): ______________________________________. - - Alternatively, the contents of this file may be used under the terms of - the _____ license (the [___] License), in which case the provisions of - [______] License are applicable instead of those above. If you wish to - allow use of your version of this file only under the terms of the [____] - License and not to allow others to use your version of this file under - the MPL, indicate your decision by deleting the provisions above and - replace them with the notice and other provisions required by the [___] - License. If you do not delete the provisions above, a recipient may use - your version of this file under either the MPL or the [___] License. - - [NOTE: The text of this Exhibit A may differ slightly from the text of - the notices in the Source Code files of the Original Code. You should use - the text of this Exhibit A rather than the text found in the Original Code - Source Code for Your Modifications.] - diff --git a/externals/vegas/README b/externals/vegas/README deleted file mode 100644 index 1e7a2b7099..0000000000 --- a/externals/vegas/README +++ /dev/null @@ -1,29 +0,0 @@ -VEGAS AS3 - version 1.8.5.2228 - -The "vegas.swc" library contains all the AS3 source code of the VEGAS project with all this extensions. - -LICENCE - - Version: MPL 1.1/GPL 2.0/LGPL 2.1 - -PROJECT PAGES - - * http://code.google.com/p/vegas/ - -DOCUMENTATION & CO - - * http://code.google.com/p/vegas/ (tutorials and install) - * http://code.google.com/p/vegas/issues/list (issues) - * http://www.ekameleon.net/vegas/docs - - * http://www.ekameleon.net/blog/ (french blog) - -ABOUT AUTHOR - - * Author : ALCARAZ Marc (eKameleon) - * Link : http://www.ekameleon.net/blog - * Mail : ekameleon@gmail.com - -NOTES - -The vegas.swc file target now the FlashPlayer 10.2 and build with the Flex SDK 4.5.0.19786. \ No newline at end of file diff --git a/externals/vegas/src/system/Serializer.as b/externals/vegas/src/system/Serializer.as deleted file mode 100644 index afeb63dfcb..0000000000 --- a/externals/vegas/src/system/Serializer.as +++ /dev/null @@ -1,86 +0,0 @@ -/* - Version: MPL 1.1/GPL 2.0/LGPL 2.1 - - The contents of this file are subject to the Mozilla Public License Version - 1.1 (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.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" basis, - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - for the specific language governing rights and limitations under the - License. - - The Original Code is [maashaack framework]. - - The Initial Developers of the Original Code are - Zwetan Kjukov and Marc Alcaraz . - Portions created by the Initial Developers are Copyright (C) 2006-2011 - the Initial Developers. All Rights Reserved. - - Contributor(s): - - Alternatively, the contents of this file may be used under the terms of - either the GNU General Public License Version 2 or later (the "GPL"), or - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - in which case the provisions of the GPL or the LGPL are applicable instead - of those above. If you wish to allow use of your version of this file only - under the terms of either the GPL or the LGPL, and not to allow others to - use your version of this file under the terms of the MPL, indicate your - decision by deleting the provisions above and replace them with the notice - and other provisions required by the LGPL or the GPL. If you do not delete - the provisions above, a recipient may use your version of this file under - the terms of any one of the MPL, the GPL or the LGPL. -*/ - -package system -{ - - /** - * Defines what a Serializer have to implements to be integrated in the framework. - *

    Note : Every serializers (eden, json, wddx, etc.) should implement it.

    - */ - public interface Serializer - { - /** - * The prettyIndent value of the serializer. - */ - function get prettyIndent():int; - - /** - * @private - */ - function set prettyIndent( value:int ):void; - - /** - * The prettyPrinting value of the serializer. - */ - function get prettyPrinting():Boolean; - - /** - * @private - */ - function set prettyPrinting( value:Boolean ):void; - - /** - * The identor String value of the serializer. - */ - function get indentor():String; - - /** - * @private - */ - function set indentor( value:String ):void; - - /** - * Deserialize the specified String source representation. - */ - function deserialize( source:String ):*; - - /** - * Serialize the specified object. - */ - function serialize( value:* ):String; - } -} - diff --git a/externals/vegas/src/vegas/strings/JSON.as b/externals/vegas/src/vegas/strings/JSON.as deleted file mode 100644 index 8dcb4ff95f..0000000000 --- a/externals/vegas/src/vegas/strings/JSON.as +++ /dev/null @@ -1,107 +0,0 @@ -/* - - Version: MPL 1.1/GPL 2.0/LGPL 2.1 - - The contents of this file are subject to the Mozilla Public License Version - 1.1 (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.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" basis, - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - for the specific language governing rights and limitations under the License. - - The Original Code is VEGAS Framework. - - The Initial Developer of the Original Code is - ALCARAZ Marc (aka eKameleon) . - Portions created by the Initial Developer are Copyright (C) 2004-2011 - the Initial Developer. All Rights Reserved. - - Contributor(s) : - - Alternatively, the contents of this file may be used under the terms of - either the GNU General Public License Version 2 or later (the "GPL"), or - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - in which case the provisions of the GPL or the LGPL are applicable instead - of those above. If you wish to allow use of your version of this file only - under the terms of either the GPL or the LGPL, and not to allow others to - use your version of this file under the terms of the MPL, indicate your - decision by deleting the provisions above and replace them with the notice - and other provisions required by the LGPL or the GPL. If you do not delete - the provisions above, a recipient may use your version of this file under - the terms of any one of the MPL, the GPL or the LGPL. - -*/ -package vegas.strings -{ - import vegas.strings.json.JSONSerializer; - - /** - * JSON (JavaScript object Notation) is a lightweight data-interchange format. - *

    More information in the official site : http://www.JSON.org

    - *

    Add Hexa Digits tool in deserialize method - eden inspiration

    - * - * @example Example - * - * - * import core.getClassName ; - * - * import vegas.strings.JSON; - * import vegas.strings.errors.JSONError; - * - * // --- Init - * - * var a:Array = [2, true, "hello"] ; - * var o:Object = { prop1 : 1 , prop2 : 2 } ; - * var s:String = "hello world" ; - * var n:Number = 4 ; - * var b:Boolean = true ; - * - * trace("# Serialize \r") ; - * - * trace("- a : " + JSON.serialize( a ) ) ; - * trace("- o : " + JSON.serialize( o ) ) ; - * trace("- s : " + JSON.serialize( s ) ) ; - * trace("- n : " + JSON.serialize( n ) ) ; - * trace("- b : " + JSON.serialize( b ) ) ; - * - * trace ("\r# Deserialize \r") ; - * - * var source:String = '[ { "prop1" : 0xFF0000 , prop2:2, prop3:"hello", prop4:true} , 2, true, 3, [3, 2] ]' ; - * - * o = JSON.deserialize(source) ; - * - * var l:uint = o.length ; - * for (var i:uint = 0 ; i < l ; i++) - * { - * trace("> " + i + " : " + o[i] + " -> typeof :: " + typeof(o[i])) ; - * if (typeof(o[i]) == "object") - * { - * for (var each:String in o[i]) - * { - * trace(" > " + each + " : " + o[i][each] + " :: " + getClassName(o[i][each]) ) ; - * } - * } - * } - * - * trace ("\r# JSONError \r") ; - * - * source = "[3, 2," ; // test1 - * - * // var source:String = '{"prop1":coucou"}' ; // test2 - * - * try - * { - * var errorObj:Object = JSON.deserialize(source) ; - * } - * catch( e:JSONError ) - * { - * trace( e.toString() ) ; - * } - * - * - */ - public var JSON:JSONSerializer = new JSONSerializer() ; -} \ No newline at end of file diff --git a/externals/vegas/src/vegas/strings/json/JSONError.as b/externals/vegas/src/vegas/strings/json/JSONError.as deleted file mode 100644 index 0e1b20dfaf..0000000000 --- a/externals/vegas/src/vegas/strings/json/JSONError.as +++ /dev/null @@ -1,84 +0,0 @@ -/* - - Version: MPL 1.1/GPL 2.0/LGPL 2.1 - - The contents of this file are subject to the Mozilla Public License Version - 1.1 (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.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" basis, - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - for the specific language governing rights and limitations under the License. - - The Original Code is VEGAS Framework. - - The Initial Developer of the Original Code is - ALCARAZ Marc (aka eKameleon) . - Portions created by the Initial Developer are Copyright (C) 2004-2011 - the Initial Developer. All Rights Reserved. - - Contributor(s) : - - Alternatively, the contents of this file may be used under the terms of - either the GNU General Public License Version 2 or later (the "GPL"), or - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - in which case the provisions of the GPL or the LGPL are applicable instead - of those above. If you wish to allow use of your version of this file only - under the terms of either the GPL or the LGPL, and not to allow others to - use your version of this file under the terms of the MPL, indicate your - decision by deleting the provisions above and replace them with the notice - and other provisions required by the LGPL or the GPL. If you do not delete - the provisions above, a recipient may use your version of this file under - the terms of any one of the MPL, the GPL or the LGPL. - -*/ - -package vegas.strings.json -{ - /** - * This JSONError is throw in the JSON static methods. - */ - public class JSONError extends Error - { - /** - * Creates a new JSONError instance. - */ - public function JSONError( message:String, at:uint, source:String , id:int=0 ) - { - super( message , id ); - name = "JSONError" ; - this.at = at ; - this.source = source ; - } - - /** - * The position of char with an error parsing in the JSON String representation. - */ - public var at:uint ; - - /** - * The source ot the bad parsing. - */ - public var source:String ; - - /** - * Returns a String representation of the object. - * @return a String representation of the object. - */ - public function toString():String - { - var msg:String = "## " + name + " : " + message + " ##" ; - if (!isNaN(at)) - { - msg += ", at:" + at ; - } - if ( source != null ) - { - msg += " in \"" + source + "\""; - } - return msg ; - } - } -} \ No newline at end of file diff --git a/externals/vegas/src/vegas/strings/json/JSONSerializer.as b/externals/vegas/src/vegas/strings/json/JSONSerializer.as deleted file mode 100644 index 5da0afe267..0000000000 --- a/externals/vegas/src/vegas/strings/json/JSONSerializer.as +++ /dev/null @@ -1,757 +0,0 @@ -/* - - Version: MPL 1.1/GPL 2.0/LGPL 2.1 - - The contents of this file are subject to the Mozilla Public License Version - 1.1 (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.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" basis, - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - for the specific language governing rights and limitations under the License. - - The Original Code is VEGAS Framework. - - The Initial Developer of the Original Code is - ALCARAZ Marc (aka eKameleon) . - Portions created by the Initial Developer are Copyright (C) 2004-2011 - the Initial Developer. All Rights Reserved. - - Contributor(s) : - - Alternatively, the contents of this file may be used under the terms of - either the GNU General Public License Version 2 or later (the "GPL"), or - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - in which case the provisions of the GPL or the LGPL are applicable instead - of those above. If you wish to allow use of your version of this file only - under the terms of either the GPL or the LGPL, and not to allow others to - use your version of this file under the terms of the MPL, indicate your - decision by deleting the provisions above and replace them with the notice - and other provisions required by the LGPL or the GPL. If you do not delete - the provisions above, a recipient may use your version of this file under - the terms of any one of the MPL, the GPL or the LGPL. - -*/ - -package vegas.strings.json -{ - import system.Serializer; - - /** - * This class is the concrete class of the JSON singleton. - * JSON (JavaScript object Notation) is a lightweight data-interchange format. - *

    More information in the official site : http://www.JSON.org

    - *

    Add Hexa Digits tool in deserialize method - eden inspiration

    - *

    Example :

    - *
    -     * import core.getClassName ;
    -     * 
    -     * import vegas.strings.JSON;
    -     * import vegas.strings.JSONError;
    -     * 
    -     * // --- Init
    -     * 
    -     * var a:Array   = [2, true, "hello"] ;
    -     * var o:Object  = { prop1 : 1 , prop2 : 2 } ;
    -     * var s:String  = "hello world" ;
    -     * var n:Number  = 4 ;
    -     * var b:Boolean = true ;
    -     * 
    -     * trace("Serialize") ;
    -     * 
    -     * trace("- a : " + JSON.serialize( a ) )  ;
    -     * trace("- o : " + JSON.serialize( o ) )  ;
    -     * trace("- s : " + JSON.serialize( s ) )  ;
    -     * trace("- n : " + JSON.serialize( n ) )  ;
    -     * trace("- b : " + JSON.serialize( b ) )  ;
    -     * 
    -     * trace ("Deserialize") ;
    -     * 
    -     * var source:String = '[ { "prop1" : 0xFF0000 , prop2:2, prop3:"hello", prop4:true} , 2, true, 3, [3, 2] ]' ;
    -     * 
    -     * o = JSON.deserialize(source) ;
    -     * 
    -     * var l:uint = o.length ;
    -     * for (var i:uint = 0 ; i < l ; i++)
    -     * {
    -     *     trace("- " + i + " : " + o[i] + " , typeof :: " + typeof(o[i])) ;
    -     *     if (typeof(o[i]) == "object")
    -     *     {
    -     *         for (var each:String in o[i])
    -     *         {
    -     *             trace("    + " + each + " : " + o[i][each] + " :: " + getClassName(o[i][each]) ) ;
    -     *         }
    -     *     }
    -     * }
    -     * 
    -     * trace ("JSONError") ;
    -     * 
    -     * source = "[3, 2," ; // test1
    -     * 
    -     * // var source:String = '{"prop1":coucou"}' ; // test2
    -     * 
    -     * try
    -     * {
    -     *    var errorObj:Object = JSON.deserialize(source) ;
    -     * }
    -     * catch( e:JSONError )
    -     * {
    -     *     trace( e.toString() ) ;
    -     * }
    -     * 
    - */ - public class JSONSerializer implements Serializer - { - /** - * Creates a new JSONSerializer instance. - */ - public function JSONSerializer() - { - // - } - - /** - * The source to evaluate. - */ - public var source:String ; - - /** - * Indicates the indentor string representation. - */ - public function get indentor():String - { - return _indentor; - } - - /** - * @private - */ - public function set indentor(value:String):void - { - _indentor = value; - } - - /** - * Indicates the pretty indent value. - */ - public function get prettyIndent():int - { - return _prettyIndent; - } - - /** - * @private - */ - public function set prettyIndent(value:int):void - { - _prettyIndent = value ; - } - - /** - * Indicates the pretty printing flag value. - */ - public function get prettyPrinting():Boolean - { - return _prettyPrinting ; - } - - /** - * @private - */ - public function set prettyPrinting(value:Boolean):void - { - _prettyPrinting = value; - } - - /** - * Parse a string and interpret the source code to the correct object construct. - *

    Example :

    - *
    -         * "hello world" --> "hello world"
    -         * "0xFF"        --> 255
    -         * "{a:1,"b":2}" --> {a:1,b:2}
    -         * 
    - * @return a string representing the data. - */ - public function deserialize( source:String ):* - { - this.source = source ; - at = 0 ; - ch = ' ' ; - return value() ; - } - - /** - * Serialize the specified value object passed-in argument. - */ - public function serialize( value:* ):String - { - var c:String ; // char - var i:int ; - var l:int ; - var s:String = '' ; - var v:* ; - var tof:String = typeof(value) ; - switch (tof) - { - case 'object' : - { - if (value) - { - if (value is Array) - { - l = (value as Array).length ; - for (i = 0 ; i < l ; ++i) - { - v = serialize(value[i]); - if (s) s += ',' ; - s += v ; - } - return '[' + s + ']'; - } - else if ( typeof( value.toString ) != 'undefined') - { - for (var prop:String in value) - { - v = value[prop]; - if ( (typeof(v) != 'undefined') && (typeof(v) != 'function') ) - { - v = serialize(v); - if (s) - { - s += ',' ; - } - s += serialize(prop) + ':' + v ; - } - } - return "{" + s + "}"; - } - } - return 'null'; - } - case 'number': - { - return isFinite(value) ? String(value) : 'null' ; - } - case 'string' : - { - l = (value as String).length ; - s = '"' ; - for (i = 0 ; i < l ; i += 1) - { - c = (value as String).charAt(i) ; - if (c >= ' ') - { - if (c == '\\' || c == '"') - { - s += '\\'; - } - s += c; - } - else - { - switch (c) - { - case '\b': - { - s += '\\b'; - break ; - } - case '\f' : - { - s += '\\f' ; - break ; - } - case '\n' : - { - s += '\\n' ; - break ; - } - case '\r': - { - s += '\\r' ; - break ; - } - case '\t': - { - s += '\\t' ; - break ; - } - default: - { - var code:Number = c.charCodeAt() ; - s += '\\u00' + String(Math.floor(code / 16).toString(16)) + ((code % 16).toString(16)) ; - } - } - } - } - return s + '"' ; - } - case 'boolean' : - { - return String(value); - } - default : - { - return 'null'; - } - } - } - - /** - * The current position of the iterator in the source. - */ - protected var at:Number = 0 ; - - /** - * The current character of the iterator in the source. - */ - protected var ch:String = ' ' ; - - /** - * Check the Array objects in the source expression. - */ - protected function array():Array - { - var a:Array = []; - if ( ch == '[' ) - { - next() ; - white() ; - if (ch == ']') - { - next(); - return a; - } - while (ch) - { - a.push( value() ) ; - white(); - if (ch == ']') - { - next(); - return a; - } - else if (ch != ',') - { - break; - } - next(); - white(); - } - } - error( JSONStrings.badArray ); - return null ; - } - - /** - * Throws a JSONError with the passed-in message. - */ - protected function error( m:String ):void - { - throw new JSONError( m, at - 1 , source) ; - } - - /** - * Indicates if the passed-in character is a digit. - */ - protected function isDigit( c:String ):Boolean - { - return( ("0" <= c) && (c <= "9") ); - } - - /** - * Indicates if the passed-in character is a hexadecimal digit. - */ - protected function isHexDigit( c:String ):Boolean - { - return( isDigit( c ) || (("A" <= c) && (c <= "F")) || (("a" <= c) && (c <= "f")) ); - } - - /** - * Indicates if the current character is a key. - */ - protected function key():* - { - var s:String = ch ; - var semiColon:int = source.indexOf( ':' , at ) ; - var quoteIndex:int = source.indexOf( '"' , at ) ; - var squoteIndex:int = source.indexOf( "'" , at ) ; - if( (quoteIndex <= semiColon && quoteIndex > -1) || (squoteIndex <= semiColon && squoteIndex > -1)) - { - s = string() ; - white() ; - if(ch == ':') - { - return s; - } - else - { - error(JSONStrings.badKey); - } - } - while ( next() ) // Use key handling - { - if (ch == ':') - { - return s; - } - if(ch <= ' ') - { - // - } - else - { - s += ch; - } - } - error( JSONStrings.badKey ) ; - } - - /** - * Returns the next character in the source String representation. - * @return the next character in the source String representation. - */ - protected function next():String - { - ch = source.charAt(at); - at += 1; - return ch; - } - - /** - * Check the Number values in the source expression. - */ - protected function number():* - { - - var n:* = '' ; - var v:* ; - var hex:String = '' ; - var sign:String = '' ; - if (ch == '-') - { - n = '-'; - sign = n ; - next(); - } - if( ch == "0" ) - { - next() ; - if( ( ch == "x") || ( ch == "X") ) - { - next(); - while( isHexDigit( ch ) ) - { - hex += ch ; - next(); - } - if( hex == "" ) - { - error(JSONStrings.malFormedHexadecimal) ; - } - else - { - return Number( sign + "0x" + hex ) ; - } - } - else - { - n += "0" ; - } - } - while ( isDigit(ch) ) - { - n += ch ; - next() ; - } - if (ch == '.') - { - n += '.'; - while (next() && ch >= '0' && ch <= '9') - { - n += ch ; - } - } - v = 1 * n ; - if (!isFinite(v)) - { - error( JSONStrings.badNumber ); - } - else - { - return v ; - } - return NaN ; - } - - /** - * Check the Object values in the source expression. - */ - protected function object():* - { - var k:* = {} ; - var o:* = {} ; - if (ch == '{') - { - next(); - white(); - if (ch == '}') - { - next() ; - return o ; - } - while (ch) - { - k = key() ; - white(); - if (ch != ':') - { - break; - } - next(); - o[k] = value() ; - white(); - if (ch == '}') - { - next(); - return o; - } - else if (ch != ',') - { - break; - } - next(); - white(); - } - } - error( JSONStrings.badObject ) ; - } - - /** - * Check the string objects in the source expression. - */ - protected function string():* - { - var i:* = '' ; - var s:* = '' ; - var t:* ; - var u:* ; - var outer:Boolean ; - if (ch == '"' || ch == "'" ) - { - var outerChar:String = ch ; - while ( next() ) - { - if (ch == outerChar) - { - next() ; - return s ; - } - else if (ch == '\\') - { - switch ( next() ) - { - case 'b': - { - s += '\b' ; - break ; - } - case 'f' : - { - s += '\f'; - break ; - } - case 'n': - { - s += '\n'; - break ; - } - case 'r' : - { - s += '\r'; - break ; - } - case 't' : - { - s += '\t' ; - break ; - } - case 'u' : - { - u = 0; - for (i = 0; i < 4; i += 1) - { - t = parseInt( next() , 16 ) ; - if (!isFinite(t)) - { - outer = true; - break; - } - u = u * 16 + t; - } - if(outer) - { - outer = false; - break; - } - s += String.fromCharCode(u); - break; - } - default : - { - s += ch; - } - } - } - else - { - s += ch; - } - } - } - error( JSONStrings.badString ); - return null ; - } - - /** - * Evaluates the values in the source expression. - */ - protected function value():* - { - white() ; - if (ch == '{' ) - { - return object(); - } - else if ( ch == '[' ) - { - return array(); - } - else if ( ch == '"' || ch == "'" ) - { - return string(); - } - else if ( ch == '-' ) - { - return number(); - } - else - { - return ( ch >= '0' && ch <= '9' ) ? number() : word() ; - } - } - - /** - * Check all white spaces. - */ - protected function white():void - { - while (ch) - { - if (ch <= ' ') - { - next(); - } - else if (ch == '/') - { - switch ( next() ) - { - case '/' : - { - while ( next() && ch != '\n' && ch != '\r') - { - } - break; - } - case '*' : - { - next(); - for (;;) - { - if (ch) - { - if (ch == '*') - { - if ( next() == '/' ) - { - next(); - break; - } - } - else - { - next(); - } - } - else - { - error( JSONStrings.unterminatedComment ); - } - } - break ; - } - default : - { - error( JSONStrings.syntaxError ); - } - } - } - else - { - break ; - } - } - } - - /** - * Check all special words in the source to evaluate. - */ - protected function word():* - { - if (ch == 't') - { - if (next() == 'r' && next() == 'u' && next() == 'e') - { - next() ; - return true ; - } - } - else if ( ch == 'f' ) - { - if (next() == 'a' && next() == 'l' && next() == 's' && next() == 'e') - { - next() ; - return false ; - } - } - else if ( ch == 'n' ) - { - if (next() == 'u' && next() == 'l' && next() == 'l') - { - next() ; - return null ; - } - } - error( JSONStrings.syntaxError ); - return null ; - } - - /** - * @private - */ - private var _prettyIndent:int = 0 ; - - /** - * @private - */ - private var _prettyPrinting:Boolean ; - - /** - * @private - */ - private var _indentor:String = " " ; - } -} diff --git a/externals/vegas/src/vegas/strings/json/JSONStrings.as b/externals/vegas/src/vegas/strings/json/JSONStrings.as deleted file mode 100644 index 042876a694..0000000000 --- a/externals/vegas/src/vegas/strings/json/JSONStrings.as +++ /dev/null @@ -1,85 +0,0 @@ -/* - - Version: MPL 1.1/GPL 2.0/LGPL 2.1 - - The contents of this file are subject to the Mozilla Public License Version - 1.1 (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.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" basis, - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - for the specific language governing rights and limitations under the License. - - The Original Code is VEGAS Framework. - - The Initial Developer of the Original Code is - ALCARAZ Marc (aka eKameleon) . - Portions created by the Initial Developer are Copyright (C) 2004-2011 - the Initial Developer. All Rights Reserved. - - Contributor(s) : - - Alternatively, the contents of this file may be used under the terms of - either the GNU General Public License Version 2 or later (the "GPL"), or - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - in which case the provisions of the GPL or the LGPL are applicable instead - of those above. If you wish to allow use of your version of this file only - under the terms of either the GPL or the LGPL, and not to allow others to - use your version of this file under the terms of the MPL, indicate your - decision by deleting the provisions above and replace them with the notice - and other provisions required by the LGPL or the GPL. If you do not delete - the provisions above, a recipient may use your version of this file under - the terms of any one of the MPL, the GPL or the LGPL. - -*/ - -package vegas.strings.json -{ - /** - * The string messages used in the JSON class. - */ - public class JSONStrings - { - /** - * The bad Array error message. - */ - public static var badArray:String = "Bad Array" ; - - /** - * The bad key error message. - */ - public static var badKey:String = "Bad key" ; - - /** - * The bad Number error message. - */ - public static var badNumber:String = "Bad Number" ; - - /** - * The bad Object error message. - */ - public static var badObject:String = "Bad Object" ; - - /** - * The bad String error message. - */ - public static var badString:String = "Bad String" ; - - /** - * The mal formed Hexadecimal error message. - */ - public static var malFormedHexadecimal:String = "Mal formed Hexadecimal" ; - - /** - * The syntax error message. - */ - public static var syntaxError:String = "Syntax Error" ; - - /** - * The unterminated comment error message. - */ - public static var unterminatedComment:String = "Unterminated Comment" ; - } -} \ No newline at end of file diff --git a/externals/wepay/README.md b/externals/wepay/README.md deleted file mode 100644 index 78a3ccb3d2..0000000000 --- a/externals/wepay/README.md +++ /dev/null @@ -1,85 +0,0 @@ -WePay PHP SDK -============= - -WePay's API allows you to easily add payments into your application. - -For full documentation, see [WePay's developer documentation](https://www.wepay.com/developer) - -Usage ------ - -In addition to the samples below, we have included a very basic demo application in the `demoapp` directory. See its README file for additional information. - -### Configuration ### - -For all requests, you must initialize the SDK with your Client ID and Client Secret, into either Staging or Production mode. All API calls made against WePay's staging environment mirror production in functionality, but do not actually move money. This allows you to develop your application and test the checkout experience from the perspective of your users without spending any money on payments. Our [full documentation](https://www.wepay.com/developer) contains additional information on test account numbers you can use in addition to "magic" amounts you can use to trigger payment failures and reversals (helpful for testing IPNs). - -**Note:** Staging and Production are two completely independent environments and share NO data with each other. This means that in order to use staging, you must register at [stage.wepay.com](https://stage.wepay.com/developer) and get a set of API keys for your Staging application, and must do the same on Production when you are ready to go live. API keys and access tokens granted on stage *can not* be used on Production, and vice-versa. - - access_token; - } - else { - // Unable to obtain access token - } - } - -Full details on the access token response are [here](https://www.wepay.com/developer/reference/oauth2#token). - -**Note:** If you only need access for yourself (e.g., for a personal storefront), the application settings page automatically creates an access token for you. Simply copy and paste it into your code rather than manually going through the authentication flow. - -### Making API Calls ### - -With the `$access_token` from above, get a new SDK object: - - request('account/find'); - foreach ($accounts as $account) { - echo "account_uri\">$account->name: $account->description
    "; - } - } - catch (WePayException $e) { - // Something went wrong - normally you would log - // this and give your user a more informative message - echo $e->getMessage(); - } - -And that's it! For more detail on what API calls are available, their parameters and responses, and what permissions they require, please see [our documentation](https://www.wepay.com/developer/reference). For some more detailed examples, look in the `demoapp` directory and check the README. Dropping the entire directory in a web-accessible location and adding your API keys should allow you to be up and running in just a few seconds. - -### SSL Certificate ### - -If making an API call causes the following problem: - - Uncaught exception 'Exception' with message 'cURL error while making API call to WePay: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed' - -You can read the solution here: https://support.wepay.com/entries/21095813-problem-with-ssl-certificate-verification diff --git a/externals/wepay/demoapp/README b/externals/wepay/demoapp/README deleted file mode 100644 index a53835bacc..0000000000 --- a/externals/wepay/demoapp/README +++ /dev/null @@ -1,19 +0,0 @@ -After registering your application at wepay.com (or stage.wepay.com), you -need to make two updates to this application: - -1 - set your client_id and client_secret in _shared.php -2 - set the redirect_uri in login.php - -That should be enough to start making API calls against WePay's API. While -this is by no means a production-ready example, it should provide you a -couple ideas on how to get running. - -It also defaults to requesting all possible scope fields in the -authentication request. We suggest limiting the request to the minimum -your application requires, which will maximize the chance the user -grants permissions to your application. You can customize this in -login.php. - -If you have any questions, please contact the API team: api@wepay.com - -- WePay diff --git a/externals/wepay/demoapp/_shared.php b/externals/wepay/demoapp/_shared.php deleted file mode 100644 index f77892a8cd..0000000000 --- a/externals/wepay/demoapp/_shared.php +++ /dev/null @@ -1,4 +0,0 @@ - -

    WePay Demo App: Account List

    -Back -
    - -request('account/find'); - foreach ($accounts as $account) { - echo "account_uri\">$account->name: $account->description
    "; - } -} -catch (WePayException $e) { - // Something went wrong - normally you would log - // this and give your user a more informative message - echo $e->getMessage(); -} diff --git a/externals/wepay/demoapp/index.php b/externals/wepay/demoapp/index.php deleted file mode 100644 index 0b44f612ee..0000000000 --- a/externals/wepay/demoapp/index.php +++ /dev/null @@ -1,20 +0,0 @@ - - -

    WePay Demo App

    - - -Log in with WePay - - - -User info -
    -Open new account -
    -Account list -
    -Log out - - diff --git a/externals/wepay/demoapp/login.php b/externals/wepay/demoapp/login.php deleted file mode 100644 index 3f67ad4fda..0000000000 --- a/externals/wepay/demoapp/login.php +++ /dev/null @@ -1,41 +0,0 @@ -access_token; - // If desired, you can also store $info->user_id somewhere - header('Location: index.php'); - } - else { - // Unable to obtain access token - echo 'Unable to obtain access token from WePay.'; - } -} diff --git a/externals/wepay/demoapp/logout.php b/externals/wepay/demoapp/logout.php deleted file mode 100644 index 700adf7968..0000000000 --- a/externals/wepay/demoapp/logout.php +++ /dev/null @@ -1,6 +0,0 @@ - -

    WePay Demo App: Open Account

    -Back -
    - -request('account/create', array( - 'name' => $name, - 'description' => $desc, - )); - echo "Created account $name for '$desc'! View on WePay at account_uri\">$account->account_uri. See all of your accounts here."; - } - catch (WePayException $e) { - // Something went wrong - normally you would log - // this and give your user a more informative message - echo $e->getMessage(); - } - } - else { - echo 'Account name and description are both required.'; - } -} -?> - -
    -
    - Account Info - -
    - - -

    - -
    - - -

    - - -
    -
    diff --git a/externals/wepay/demoapp/user.php b/externals/wepay/demoapp/user.php deleted file mode 100644 index fccb8ed06d..0000000000 --- a/externals/wepay/demoapp/user.php +++ /dev/null @@ -1,22 +0,0 @@ - -

    WePay Demo App: User Info

    -Back -
    - -request('user'); - echo '
    '; - foreach ($user as $key => $value) { - echo "
    $key
    $value
    "; - } - echo '
    '; -} -catch (WePayException $e) { - // Something went wrong - normally you would log - // this and give your user a more informative message - echo $e->getMessage(); -} diff --git a/externals/wepay/iframe_demoapp/checkout.php b/externals/wepay/iframe_demoapp/checkout.php deleted file mode 100755 index 06fb4ee369..0000000000 --- a/externals/wepay/iframe_demoapp/checkout.php +++ /dev/null @@ -1,69 +0,0 @@ -request('/checkout/create', array( - 'account_id' => $account_id, // ID of the account that you want the money to go to - 'amount' => 100, // dollar amount you want to charge the user - 'short_description' => "this is a test payment", // a short description of what the payment is for - 'type' => "GOODS", // the type of the payment - choose from GOODS SERVICE DONATION or PERSONAL - 'mode' => "iframe", // put iframe here if you want the checkout to be in an iframe, regular if you want the user to be sent to WePay - ) - ); -} catch (WePayException $e) { // if the API call returns an error, get the error message for display later - $error = $e->getMessage(); -} - -?> - - - - - - - -

    Checkout:

    - -

    The user will checkout here:

    - - -

    ERROR:

    - -
    - - - - - - - - - \ No newline at end of file diff --git a/externals/wepay/iframe_demoapp/list_accounts.php b/externals/wepay/iframe_demoapp/list_accounts.php deleted file mode 100755 index d34ecae01f..0000000000 --- a/externals/wepay/iframe_demoapp/list_accounts.php +++ /dev/null @@ -1,74 +0,0 @@ -request('/account/find'); -} catch (WePayException $e) { // if the API call returns an error, get the error message for display later - $error = $e->getMessage(); -} - -?> - - - - - - - -

    List all accounts:

    - -

    The following is a list of all accounts that this user owns

    - - -

    ERROR:

    - -

    You do not have any accounts. Go to https://stage.wepay.com to open an account.

    - - - - - - - - - - - - - - - - - - -
    Account IDAccount NameAccount Description
    account_id ?>name ?>description ?>
    - - - - - \ No newline at end of file diff --git a/externals/wepay/wepay.php b/externals/wepay/wepay.php deleted file mode 100755 index f0b425f344..0000000000 --- a/externals/wepay/wepay.php +++ /dev/null @@ -1,294 +0,0 @@ - self::$client_id, - 'redirect_uri' => $redirect_uri, - 'scope' => implode(',', $scope), - 'state' => empty($options['state']) ? '' : $options['state'], - 'user_name' => empty($options['user_name']) ? '' : $options['user_name'], - 'user_email' => empty($options['user_email']) ? '' : $options['user_email'], - ), '', '&'); - return $uri; - } - - private static function getDomain() { - if (self::$production === true) { - return 'https://wepayapi.com/v2/'; - } - elseif (self::$production === false) { - return 'https://stage.wepayapi.com/v2/'; - } - else { - throw new RuntimeException('You must initialize the WePay SDK with WePay::useStaging() or WePay::useProduction()'); - } - } - - /** - * Exchange a temporary access code for a (semi-)permanent access token - * @param string $code 'code' field from query string passed to your redirect_uri page - * @param string $redirect_uri Where user went after logging in at WePay (must match value from getAuthorizationUri) - * @return StdClass|false - * user_id - * access_token - * token_type - */ - public static function getToken($code, $redirect_uri) { - $params = (array( - 'client_id' => self::$client_id, - 'client_secret' => self::$client_secret, - 'redirect_uri' => $redirect_uri, - 'code' => $code, - 'state' => '', // do not hardcode - )); - $result = self::make_request('oauth2/token', $params); - return $result; - } - - /** - * Configure SDK to run against WePay's production servers - * @param string $client_id Your application's client id - * @param string $client_secret Your application's client secret - * @return void - * @throws RuntimeException - */ - public static function useProduction($client_id, $client_secret) { - if (self::$production !== null) { - throw new RuntimeException('API mode has already been set.'); - } - self::$production = true; - self::$client_id = $client_id; - self::$client_secret = $client_secret; - } - - /** - * Configure SDK to run against WePay's staging servers - * @param string $client_id Your application's client id - * @param string $client_secret Your application's client secret - * @return void - * @throws RuntimeException - */ - public static function useStaging($client_id, $client_secret) { - if (self::$production !== null) { - throw new RuntimeException('API mode has already been set.'); - } - self::$production = false; - self::$client_id = $client_id; - self::$client_secret = $client_secret; - } - - /** - * Create a new API session - * @param string $token - access_token returned from WePay::getToken - */ - public function __construct($token) { - if ($token && !is_string($token)) { - throw new InvalidArgumentException('$token must be a string, ' . gettype($token) . ' provided'); - } - $this->token = $token; - } - - /** - * Clean up cURL handle - */ - public function __destruct() { - if (self::$ch) { - curl_close(self::$ch); - self::$ch = NULL; - } - } - - /** - * create the cURL request and execute it - */ - private static function make_request($endpoint, $values, $headers = array()) - { - self::$ch = curl_init(); - $headers = array_merge(array("Content-Type: application/json"), $headers); // always pass the correct Content-Type header - curl_setopt(self::$ch, CURLOPT_USERAGENT, 'WePay v2 PHP SDK v' . self::VERSION); - curl_setopt(self::$ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt(self::$ch, CURLOPT_HTTPHEADER, $headers); - curl_setopt(self::$ch, CURLOPT_TIMEOUT, 30); // 30-second timeout, adjust to taste - curl_setopt(self::$ch, CURLOPT_POST, !empty($values)); // WePay's API is not strictly RESTful, so all requests are sent as POST unless there are no request values - - $uri = self::getDomain() . $endpoint; - curl_setopt(self::$ch, CURLOPT_URL, $uri); - - if (!empty($values)) { - curl_setopt(self::$ch, CURLOPT_POSTFIELDS, json_encode($values)); - } - - $raw = curl_exec(self::$ch); - if ($errno = curl_errno(self::$ch)) { - // Set up special handling for request timeouts - if ($errno == CURLE_OPERATION_TIMEOUTED) { - throw new WePayServerException("Timeout occurred while trying to connect to WePay"); - } - throw new Exception('cURL error while making API call to WePay: ' . curl_error(self::$ch), $errno); - } - $result = json_decode($raw); - - $error_code = null; - if (isset($result->error_code)) { - $error_code = $result->error_code; - } - - $httpCode = curl_getinfo(self::$ch, CURLINFO_HTTP_CODE); - if ($httpCode >= 400) { - if ($httpCode >= 500) { - throw new WePayServerException($result->error_description, $httpCode, $result, $error_code); - } - switch ($result->error) { - case 'invalid_request': - throw new WePayRequestException($result->error_description, $httpCode, $result, $error_code); - case 'access_denied': - default: - throw new WePayPermissionException($result->error_description, $httpCode, $result, $error_code); - } - } - - return $result; - } - - /** - * Make API calls against authenticated user - * @param string $endpoint - API call to make (ex. 'user', 'account/find') - * @param array $values - Associative array of values to send in API call - * @return StdClass - * @throws WePayException on failure - * @throws Exception on catastrophic failure (non-WePay-specific cURL errors) - */ - public function request($endpoint, array $values = array()) { - $headers = array(); - - if ($this->token) { // if we have an access_token, add it to the Authorization header - $headers[] = "Authorization: Bearer $this->token"; - } - - $result = self::make_request($endpoint, $values, $headers); - - return $result; - } -} - -/** - * Different problems will have different exception types so you can - * catch and handle them differently. - * - * WePayServerException indicates some sort of 500-level error code and - * was unavoidable from your perspective. You may need to re-run the - * call, or check whether it was received (use a "find" call with your - * reference_id and make a decision based on the response) - * - * WePayRequestException indicates a development error - invalid endpoint, - * erroneous parameter, etc. - * - * WePayPermissionException indicates your authorization token has expired, - * was revoked, or is lacking in scope for the call you made - */ -class WePayException extends Exception { - public function __construct($description = '', $http_code = FALSE, $response = FALSE, $code = 0, $previous = NULL) - { - $this->response = $response; - - if (!defined('PHP_VERSION_ID')) { - $version = explode('.', PHP_VERSION); - define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); - } - - if (PHP_VERSION_ID < 50300) { - parent::__construct($description, $code); - } else { - parent::__construct($description, $code, $previous); - } - } -} -class WePayRequestException extends WePayException {} -class WePayPermissionException extends WePayException {} -class WePayServerException extends WePayException {} diff --git a/externals/wordlist/LICENSE.txt b/externals/wordlist/LICENSE.txt new file mode 100644 index 0000000000..26d7b1666b --- /dev/null +++ b/externals/wordlist/LICENSE.txt @@ -0,0 +1,15 @@ +The following copyright statement applies to this wordlists collection as a whole: +Copyright (c) 2002,2003 by Solar Designer of Openwall Project + +The homepage URL for this wordlists collection is: + +http://www.openwall.com/wordlists/ + +You're allowed to use and redistribute this wordlists collection or parts thereof, with or without modification, provided that credit is given where it is due, any modified versions are marked as such, this license is kept intact and included with each copy, and NO FEE IS CHARGED FOR OBTAINING A COPY except as negotiated with the copyright holder. In particular, you are NOT permitted to charge for bandwidth, physical media, and/or shipping. You're also not permitted to bundle this wordlists collection with a product you charge for. + +If redistribution for a fee is what you're after, please contact the copyright holder to negotiate special terms for the downloadable or the extended CD-ready version of this collection. + +It was a significant amount of work to compile this collection and having a monopoly on regulating the CD sales is my way to compensate for the time already spent and to allow for further work. + +-- +Alexander Peslyak aka Solar Designer \ No newline at end of file diff --git a/externals/wordlist/password.lst b/externals/wordlist/password.lst new file mode 100644 index 0000000000..3c75bf2e05 --- /dev/null +++ b/externals/wordlist/password.lst @@ -0,0 +1,3557 @@ +#!comment: This list has been compiled by Solar Designer of Openwall Project, +#!comment: http://www.openwall.com/wordlists/ +#!comment: +#!comment: This list is based on passwords most commonly seen on a set of Unix +#!comment: systems in mid-1990's, sorted for decreasing number of occurrences +#!comment: (that is, more common passwords are listed first). It has been +#!comment: revised to also include common website passwords from public lists +#!comment: of "top N passwords" from major community website compromises that +#!comment: occurred in 2006 through 2010. +#!comment: +#!comment: Last update: 2011/11/20 (3546 entries) +123456 +12345 +password +password1 +123456789 +12345678 +1234567890 +abc123 +computer +tigger +1234 +qwerty +money +carmen +mickey +secret +summer +internet +a1b2c3 +123 +service + +canada +hello +ranger +shadow +baseball +donald +harley +hockey +letmein +maggie +mike +mustang +snoopy +buster +dragon +jordan +michael +michelle +mindy +patrick +123abc +andrew +bear +calvin +changeme +diamond +fuckme +fuckyou +matthew +miller +tiger +trustno1 +alex +apple +avalon +brandy +chelsea +coffee +falcon +freedom +gandalf +green +helpme +linda +magic +merlin +newyork +soccer +thomas +wizard +asdfgh +bandit +batman +boris +butthead +dorothy +eeyore +fishing +football +george +happy +iloveyou +jennifer +jonathan +love +marina +master +missy +monday +monkey +natasha +ncc1701 +pamela +pepper +piglet +poohbear +pookie +rabbit +rachel +rocket +rose +smile +sparky +spring +steven +success +sunshine +victoria +whatever +zapata +8675309 +amanda +andy +angel +august +barney +biteme +boomer +brian +casey +cowboy +delta +doctor +fisher +island +john +joshua +karen +marley +orange +please +rascal +richard +sarah +scooter +shalom +silver +skippy +stanley +taylor +welcome +zephyr +111111 +aaaaaa +access +albert +alexander +andrea +anna +anthony +asdfjkl; +ashley +basketball +beavis +black +bob +booboo +bradley +brandon +buddy +caitlin +camaro +charlie +chicken +chris +cindy +cricket +dakota +dallas +daniel +david +debbie +dolphin +elephant +emily +friend +fucker +ginger +goodluck +hammer +heather +iceman +jason +jessica +jesus +joseph +jupiter +justin +kevin +knight +lacrosse +lakers +lizard +madison +mary +mother +muffin +murphy +nirvana +paris +pentium +phoenix +picture +rainbow +sandy +saturn +scott +shannon +shithead +skeeter +sophie +special +stephanie +stephen +steve +sweetie +teacher +tennis +test +test123 +tommy +topgun +tristan +wally +william +wilson +1q2w3e +654321 +666666 +a12345 +a1b2c3d4 +alpha +amber +angela +angie +archie +asdf +blazer +bond007 +booger +charles +christin +claire +control +danny +david1 +dennis +digital +disney +edward +elvis +felix +flipper +franklin +frodo +honda +horses +hunter +indigo +james +jasper +jeremy +julian +kelsey +killer +lauren +marie +maryjane +matrix +maverick +mayday +mercury +mitchell +morgan +mountain +niners +nothing +oliver +peace +peanut +pearljam +phantom +popcorn +princess +psycho +pumpkin +purple +randy +rebecca +reddog +robert +rocky +roses +salmon +samson +sharon +sierra +smokey +startrek +steelers +stimpy +sunflower +superman +support +sydney +techno +walter +willie +willow +winner +ziggy +zxcvbnm +alaska +alexis +alice +animal +apples +barbara +benjamin +billy +blue +bluebird +bobby +bonnie +bubba +camera +chocolate +clark +claudia +cocacola +compton +connect +cookie +cruise +douglas +dreamer +dreams +duckie +eagles +eddie +einstein +enter +explorer +faith +family +ferrari +flamingo +flower +foxtrot +francis +freddy +friday +froggy +giants +gizmo +global +goofy +happy1 +hendrix +henry +herman +homer +honey +house +houston +iguana +indiana +insane +inside +irish +ironman +jake +jasmin +jeanne +jerry +joey +justice +katherine +kermit +kitty +koala +larry +leslie +logan +lucky +mark +martin +matt +minnie +misty +mitch +mouse +nancy +nascar +nelson +pantera +parker +penguin +peter +piano +pizza +prince +punkin +pyramid +raymond +robin +roger +rosebud +route66 +royal +running +sadie +sasha +security +sheena +sheila +skiing +snapple +snowball +sparrow +spencer +spike +star +stealth +student +sunny +sylvia +tamara +taurus +teresa +theresa +thunderbird +tigers +tony +toyota +travel +tuesday +victory +viper1 +wesley +whisky +winnie +winter +wolves +xyz123 +zorro +123123 +1234567 +696969 +888888 +Anthony +Joshua +Matthew +Tigger +aaron +abby +abcdef +adidas +adrian +alfred +arthur +athena +austin +awesome +badger +bamboo +beagle +bears +beatles +beautiful +beaver +benny +bigmac +bingo +bitch +blonde +boogie +boston +brenda +bright +bubba1 +bubbles +buffy +button +buttons +cactus +candy +captain +carlos +caroline +carrie +casper +catch22 +chance +charity +charlotte +cheese +cheryl +chloe +chris1 +clancy +compaq +conrad +cooper +cooter +copper +cosmos +cougar +cracker +crawford +crystal +curtis +cyclone +dance +diablo +dollars +dookie +dumbass +dundee +elizabeth +eric +europe +farmer +firebird +fletcher +fluffy +france +freak1 +friends +fuckoff +gabriel +galaxy +gambit +garden +garfield +garnet +genesis +genius +godzilla +golfer +goober +grace +greenday +groovy +grover +guitar +hacker +harry +hazel +hector +herbert +horizon +hornet +howard +icecream +imagine +impala +jack +janice +jasmine +jason1 +jeanette +jeffrey +jenifer +jenni +jesus1 +jewels +joker +julie +julie1 +junior +justin1 +kathleen +keith +kelly +kelly1 +kennedy +kevin1 +knicks +larry1 +leonard +lestat +library +lincoln +lionking +london +louise +lucky1 +lucy +maddog +margaret +mariposa +marlboro +martin1 +marty +master1 +mensuck +mercedes +metal +midori +mikey +millie +mirage +molly +monet +money1 +monica +monopoly +mookie +moose +moroni +music +naomi +nathan +nguyen +nicholas +nicole +nimrod +october +olive +olivia +online +oscar +oxford +pacific +painter +peaches +penelope +pepsi +petunia +philip +phoenix1 +photo +pickle +player +poiuyt +porsche +porter +puppy +python +quality +raquel +raven +remember +robbie +robert1 +roman +rugby +runner +russell +ryan +sailing +sailor +samantha +savage +scarlett +school +sean +seven +shadow1 +sheba +shelby +shit +shoes +simba +simple +skipper +smiley +snake +snickers +sniper +snoopdog +snowman +sonic +spitfire +sprite +spunky +starwars +station +stella +stingray +storm +stormy +stupid +sunny1 +sunrise +surfer +susan +tammy +tango +tanya +teddy1 +theboss +theking +thumper +tina +tintin +tomcat +trebor +trevor +tweety +unicorn +valentine +valerie +vanilla +veronica +victor +vincent +viper +warrior +warriors +weasel +wheels +wilbur +winston +wisdom +wombat +xavier +yellow +zeppelin +1111 +1212 +Andrew +Family +Friends +Michael +Michelle +Snoopy +abcd1234 +abcdefg +abigail +account +adam +alex1 +alice1 +allison +alpine +andre1 +andrea1 +angel1 +anita +annette +antares +apache +apollo +aragorn +arizona +arnold +arsenal +asdfasdf +asdfg +asdfghjk +avenger +baby +babydoll +bailey +banana +barry +basket +batman1 +beaner +beast +beatrice +bella +bertha +bigben +bigdog +biggles +bigman +binky +biology +bishop +blondie +bluefish +bobcat +bosco +braves +brazil +bruce +bruno +brutus +buffalo +bulldog +bullet +bullshit +bunny +business +butch +butler +butter +california +carebear +carol +carol1 +carole +cassie +castle +catalina +catherine +cccccc +celine +center +champion +chanel +chaos +chelsea1 +chester1 +chicago +chico +christian +christy +church +cinder +colleen +colorado +columbia +commander +connie +cookies +cooking +corona +cowboys +coyote +craig +creative +cuddles +cuervo +cutie +daddy +daisy +daniel1 +danielle +davids +death +denis +derek +design +destiny +diana +diane +dickhead +digger +dodger +donna +dougie +dragonfly +dylan +eagle +eclipse +electric +emerald +etoile +excalibur +express +fender +fiona +fireman +flash +florida +flowers +foster +francesco +francine +francois +frank +french +fuckface +gemini +general +gerald +germany +gilbert +goaway +golden +goldfish +goose +gordon +graham +grant +gregory +gretchen +gunner +hannah +harold +harrison +harvey +hawkeye +heaven +heidi +helen +helena +hithere +hobbit +ibanez +idontknow +integra +ireland +irene +isaac +isabel +jackass +jackie +jackson +jaguar +jamaica +japan +jenny1 +jessie +johan +johnny +joker1 +jordan23 +judith +julia +jumanji +kangaroo +karen1 +kathy +keepout +keith1 +kenneth +kimberly +kingdom +kitkat +kramer +kristen +laura +laurie +lawrence +lawyer +legend +liberty +light +lindsay +lindsey +lisa +liverpool +lola +lonely +louis +lovely +loveme +lucas +madonna +malcolm +malibu +marathon +marcel +maria1 +mariah +mariah1 +marilyn +mario +marvin +maurice +maxine +maxwell +me +meggie +melanie +melissa +melody +mexico +michael1 +michele +midnight +mike1 +miracle +misha +mishka +molly1 +monique +montreal +moocow +moore +morris +mouse1 +mulder +nautica +nellie +newton +nick +nirvana1 +nissan +norman +notebook +ocean +olivier +ollie +oranges +oregon +orion +panda +pandora +panther +passion +patricia +pearl +peewee +pencil +penny +people +percy +person +peter1 +petey +picasso +pierre +pinkfloyd +polaris +police +pookie1 +poppy +power +predator +preston +q1w2e3 +queen +queenie +quentin +ralph +random +rangers +raptor +reality +redrum +remote +reynolds +rhonda +ricardo +ricardo1 +ricky +river +roadrunner +robinhood +rocknroll +rocky1 +ronald +roxy +ruthie +sabrina +sakura +sally +sampson +samuel +sandra +santa +sapphire +scarlet +scorpio +scott1 +scottie +scruffy +seattle +serena +shanti +shark +shogun +simon +singer +skull +skywalker +slacker +smashing +smiles +snowflake +snuffy +soccer1 +soleil +sonny +spanky +speedy +spider +spooky +stacey +star69 +start +steven1 +stinky +strawberry +stuart +sugar +sundance +superfly +suzanne +suzuki +swimmer +swimming +system +taffy +tarzan +teddy +teddybear +terry +theatre +thunder +thursday +tinker +tootsie +tornado +tracy +tricia +trident +trojan +truman +trumpet +tucker +turtle +tyler +utopia +voyager +warcraft +warlock +warren +water +wayne +wendy +williams +willy +winona +woody +woofwoof +wrangler +wright +xfiles +xxxxxx +yankees +yvonne +zebra +zenith +zigzag +zombie +zxc123 +zxcvb +000000 +007007 +11111 +11111111 +123321 +171717 +181818 +1a2b3c +1chris +4runner +54321 +55555 +6969 +7777777 +789456 +88888888 +Alexis +Bailey +Charlie +Chris +Daniel +Dragon +Elizabeth +HARLEY +Heather +Jennifer +Jessica +Jordan +KILLER +Nicholas +Password +Princess +Purple +Rebecca +Robert +Shadow +Steven +Summer +Sunshine +Superman +Taylor +Thomas +Victoria +abcd123 +abcde +accord +active +africa +airborne +alfaro +alicia +aliens +alina +aline +alison +allen +aloha +alpha1 +althea +altima +amanda1 +amazing +america +amour +anderson +andre +andrew1 +andromeda +angels +angie1 +annie +anything +apple1 +apple2 +applepie +april +aquarius +ariane +ariel +arlene +artemis +asdf1234 +asdfjkl +ashley1 +ashraf +ashton +asterix +attila +autumn +avatar +babes +bambi +barbie +barney1 +barrett +bball +beaches +beanie +beans +beauty +becca +belize +belle +belmont +benji +benson +bernardo +berry +betsy +betty +bigboss +bigred +billy1 +birdie +birthday +biscuit +bitter +blackjack +blah +blanche +blood +blowjob +blowme +blueeyes +blues +bogart +bombay +boobie +boots +bootsie +boxers +brandi +brent +brewster +bridge +bronco +bronte +brooke +brother +bryan +bubble +buddha +budgie +burton +butterfly +byron +calendar +calvin1 +camel +camille +campbell +camping +cancer +canela +cannon +carbon +carnage +carolyn +carrot +cascade +catfish +cathy +catwoman +cecile +celica +change +chantal +charger +cherry +chiara +chiefs +china +chris123 +christ1 +christmas +christopher +chuck +cindy1 +cinema +civic +claude +clueless +cobain +cobra +cody +colette +college +colors +colt45 +confused +cool +corvette +cosmo +country +crusader +cunningham +cupcake +cynthia +dagger +dammit +dancer +daphne +darkstar +darren +darryl +darwin +deborah +december +deedee +deeznuts +delano +delete +demon +denise +denny +desert +deskjet +detroit +devil +devine +devon +dexter +dianne +diesel +director +dixie +dodgers +doggy +dollar +dolly +dominique +domino +dontknow +doogie +doudou +downtown +dragon1 +driver +dude +dudley +dutchess +dwight +eagle1 +easter +eastern +edith +edmund +eight +element +elissa +ellen +elliot +empire +enigma +enterprise +erin +escort +estelle +eugene +evelyn +explore +family1 +fatboy +felipe +ferguson +ferret +ferris +fireball +fishes +fishie +flight +florida1 +flowerpot +forward +freddie +freebird +freeman +frisco +fritz +froggie +froggies +frogs +fucku +future +gabby +games +garcia +gaston +gateway +george1 +georgia +german +germany1 +getout +ghost +gibson +giselle +gmoney +goblin +goblue +gollum +grandma +gremlin +grizzly +grumpy +guess +guitar1 +gustavo +haggis +haha +hailey +halloween +hamilton +hamlet +hanna +hanson +happy123 +happyday +hardcore +harley1 +harriet +harris +harvard +health +heart +heather1 +heather2 +hedgehog +helene +hello1 +hello123 +hellohello +hermes +heythere +highland +hilda +hillary +history +hitler +hobbes +holiday +holly +honda1 +hongkong +hootie +horse +hotrod +hudson +hummer +huskies +idiot +iforget +iloveu +impact +indonesia +irina +isabelle +israel +italia +italy +jackie1 +jacob +jakey +james1 +jamesbond +jamie +jamjam +jeffrey1 +jennie +jenny +jensen +jesse +jesse1 +jester +jethro +jimbob +jimmy +joanna +joelle +john316 +jordie +jorge +josh +journey +joyce +jubilee +jules +julien +juliet +junebug +juniper +justdoit +karin +karine +karma +katerina +katie +katie1 +kayla +keeper +keller +kendall +kenny +ketchup +kings +kissme +kitten +kittycat +kkkkkk +kristi +kristine +labtec +laddie +ladybug +lance +laurel +lawson +leader +leland +lemon +lester +letter +letters +lexus1 +libra +lights +lionel +little +lizzy +lolita +lonestar +longhorn +looney +loren +lorna +loser +lovers +loveyou +lucia +lucifer +lucky14 +maddie +madmax +magic1 +magnum +maiden +maine +management +manson +manuel +marcus +maria +marielle +marine +marino +marshall +martha +maxmax +meatloaf +medical +megan +melina +memphis +mermaid +miami +michel +michigan +mickey1 +microsoft +mikael +milano +miles +millenium +million +miranda +miriam +mission +mmmmmm +mobile +monkey1 +monroe +montana +monty +moomoo +moonbeam +morpheus +motorola +movies +mozart +munchkin +murray +mustang1 +nadia +nadine +napoleon +nation +national +nestle +newlife +newyork1 +nichole +nikita +nikki +nintendo +nokia +nomore +normal +norton +noway +nugget +number9 +numbers +nurse +nutmeg +ohshit +oicu812 +omega +openup +orchid +oreo +orlando +packard +packers +paloma +pancake +panic +parola +parrot +partner +pascal +patches +patriots +paula +pauline +payton +peach +peanuts +pedro1 +peggy +perfect +perry +peterpan +philips +phillips +phone +pierce +pigeon +pink +pioneer +piper1 +pirate +pisces +playboy +pluto +poetry +pontiac +pookey +popeye +prayer +precious +prelude +premier +puddin +pulsar +pussy +pussy1 +qwert +qwerty12 +qwertyui +rabbit1 +rachelle +racoon +rambo +randy1 +ravens +redman +redskins +reggae +reggie +renee +renegade +rescue +revolution +richard1 +richards +richmond +riley +ripper +robby +roberts +rock +rocket1 +rockie +rockon +roger1 +rogers +roland +rommel +rookie +rootbeer +rosie +rufus +rusty +ruthless +sabbath +sabina +safety +saint +samiam +sammie +sammy +samsam +sandi +sanjose +saphire +sarah1 +saskia +sassy +saturday +science +scooby +scoobydoo +scooter1 +scorpion +scotty +scouts +search +september +server +seven7 +sexy +shaggy +shanny +shaolin +shasta +shayne +shelly +sherry +shirley +shorty +shotgun +sidney +simba1 +sinatra +sirius +skate +skipper1 +skyler +slayer +sleepy +slider +smile1 +smitty +smoke +snakes +snapper +snoop +solomon +sophia +space +sparks +spartan +spike1 +sponge +spurs +squash +stargate +starlight +stars +steph1 +steve1 +stevens +stewart +stone +stranger +stretch +strong +studio +stumpy +sucker +suckme +sultan +summit +sunfire +sunset +super +superstar +surfing +susan1 +sutton +sweden +sweetpea +sweety +swordfish +tabatha +tacobell +taiwan +tamtam +tanner +target +tasha +tattoo +tequila +terry1 +texas +thankyou +theend +thompson +thrasher +tiger2 +timber +timothy +tinkerbell +topcat +topher +toshiba +tototo +travis +treasure +trees +tricky +trish +triton +trombone +trouble +trucker +turbo +twins +tyler1 +ultimate +unique +united +ursula +vacation +valley +vampire +vanessa +venice +venus +vermont +vicki +vicky +victor1 +vincent1 +violet +violin +virgil +virginia +vision +volley +voodoo +vortex +waiting +wanker +warner +water1 +wayne1 +webster +weezer +wendy1 +western +white +whitney +whocares +wildcat +william1 +wilma +window +winniethepooh +wolfgang +wolverine +wonder +xxxxxxxx +yamaha +yankee +yogibear +yolanda +yomama +yvette +zachary +zebras +zxcvbn +00000000 +121212 +1234qwer +131313 +13579 +90210 +99999999 +ABC123 +action +amelie +anaconda +apollo13 +artist +asshole +benoit +bernard +bernie +bigbird +blizzard +bluesky +bonjour +caesar +cardinal +carolina +cesar +chandler +chapman +charlie1 +chevy +chiquita +chocolat +coco +cougars +courtney +dolphins +dominic +donkey +dusty +eminem +energy +fearless +forest +forever +glenn +guinness +hotdog +indian +jared +jimbo +johnson +jojo +josie +kristin +lloyd +lorraine +lynn +maxime +memory +mimi +mirror +nebraska +nemesis +network +nigel +oatmeal +patton +pedro +planet +players +portland +praise +psalms +qwaszx +raiders +rambo1 +rancid +shawn +shelley +softball +speedo +sports +ssssss +steele +steph +stephani +sunday +tiffany +tigre +toronto +trixie +undead +valentin +velvet +viking +walker +watson +young +babygirl +pretty +hottie +teamo +987654321 +naruto +spongebob +daniela +princesa +christ +blessed +single +qazwsx +pokemon +iloveyou1 +iloveyou2 +fuckyou1 +hahaha +poop +blessing +blahblah +blink182 +123qwe +trinity +passw0rd +google +looking +spirit +iloveyou! +qwerty1 +onelove +mylove +222222 +ilovegod +football1 +loving +emmanuel +1q2w3e4r +red123 +blabla +112233 +hallo +spiderman +simpsons +monster +november +brooklyn +poopoo +darkness +159753 +pineapple +chester +1qaz2wsx +drowssap +monkey12 +wordpass +q1w2e3r4 +coolness +11235813 +something +alexandra +estrella +miguel +iloveme +sayang +princess1 +555555 +999999 +alejandro +brittany +alejandra +tequiero +antonio +987654 +00000 +fernando +corazon +cristina +kisses +myspace +rebelde +babygurl +alyssa +mahalkita +gabriela +pictures +hellokitty +babygirl1 +angelica +mahalko +mariana +eduardo +andres +ronaldo +inuyasha +adriana +celtic +samsung +angelo +456789 +sebastian +karina +hotmail +0123456789 +barcelona +cameron +slipknot +cutiepie +50cent +bonita +maganda +babyboy +natalie +cuteako +javier +789456123 +123654 +bowwow +portugal +777777 +volleyball +january +cristian +bianca +chrisbrown +101010 +sweet +panget +benfica +love123 +lollipop +camila +qwertyuiop +harrypotter +ihateyou +christine +lorena +andreea +charmed +rafael +brianna +aaliyah +johncena +lovelove +gangsta +333333 +hiphop +mybaby +sergio +metallica +myspace1 +babyblue +badboy +fernanda +westlife +sasuke +steaua +roberto +slideshow +asdfghjkl +santiago +jayson +5201314 +jerome +gandako +gatita +babyko +246810 +sweetheart +chivas +alberto +valeria +nicole1 +12345678910 +leonardo +jayjay +liliana +sexygirl +232323 +amores +anthony1 +bitch1 +fatima +miamor +lover +lalala +252525 +skittles +colombia +159357 +manutd +123456a +britney +katrina +christina +pasaway +mahal +tatiana +cantik +0123456 +teiubesc +147258369 +natalia +francisco +amorcito +paola +angelito +manchester +mommy1 +147258 +amigos +marlon +linkinpark +147852 +diego +444444 +iverson +andrei +justine +frankie +pimpin +fashion +bestfriend +england +hermosa +456123 +102030 +sporting +hearts +potter +iloveu2 +number1 +212121 +truelove +jayden +savannah +hottie1 +ganda +scotland +ilovehim +shakira +estrellita +brandon1 +sweets +familia +love12 +omarion +monkeys +loverboy +elijah +ronnie +mamita +999999999 +broken +rodrigo +westside +mauricio +amigas +preciosa +shopping +flores +isabella +martinez +elaine +friendster +cheche +gracie +connor +valentina +darling +santos +joanne +fuckyou2 +pebbles +sunshine1 +gangster +gloria +darkangel +bettyboop +jessica1 +cheyenne +dustin +iubire +a123456 +purple1 +bestfriends +inlove +batista +karla +chacha +marian +sexyme +pogiako +jordan1 +010203 +daddy1 +daddysgirl +billabong +pinky +erika +skater +nenita +tigger1 +gatito +lokita +maldita +buttercup +bambam +glitter +123789 +sister +zacefron +tokiohotel +loveya +lovebug +bubblegum +marissa +cecilia +lollypop +nicolas +puppies +ariana +chubby +sexybitch +roxana +mememe +susana +baller +hotstuff +carter +babylove +angelina +playgirl +sweet16 +012345 +bhebhe +marcos +loveme1 +milagros +lilmama +beyonce +lovely1 +catdog +armando +margarita +151515 +loves +202020 +gerard +undertaker +amistad +capricorn +delfin +cheerleader +password2 +PASSWORD +lizzie +matthew1 +enrique +badgirl +141414 +dancing +cuteme +amelia +skyline +angeles +janine +carlitos +justme +legolas +michelle1 +cinderella +jesuschrist +ilovejesus +tazmania +tekiero +thebest +princesita +lucky7 +jesucristo +buddy1 +regina +myself +lipgloss +jazmin +rosita +chichi +pangit +mierda +741852963 +hernandez +arturo +silvia +melvin +celeste +pussycat +gorgeous +honeyko +mylife +babyboo +loveu +lupita +panthers +hollywood +alfredo +musica +hawaii +sparkle +kristina +sexymama +crazy +scarface +098765 +hayden +micheal +242424 +0987654321 +marisol +jeremiah +mhine +isaiah +lolipop +butterfly1 +xbox360 +madalina +anamaria +yourmom +jasmine1 +bubbles1 +beatriz +diamonds +friendship +sweetness +desiree +741852 +hannah1 +bananas +julius +leanne +marie1 +lover1 +twinkle +february +bebita +87654321 +twilight +imissyou +pollito +ashlee +cookie1 +147852369 +beckham +simone +nursing +torres +damian +123123123 +joshua1 +babyface +dinamo +mommy +juliana +cassandra +redsox +gundam +0000 +ou812 +dave +golf +molson +Monday +newpass +thx1138 +1 +Internet +coke +foobar +abc +fish +fred +help +ncc1701d +newuser +none +pat +dog +duck +duke +floyd +guest +joe +kingfish +micro +sam +telecom +test1 +7777 +absolut +babylon5 +backup +bill +bird33 +deliver +fire +flip +galileo +gopher +hansolo +jane +jim +mom +passwd +phil +phish +porsche911 +rain +red +sergei +training +truck +video +volvo +007 +1969 +5683 +Bond007 +Friday +Hendrix +October +Taurus +aaa +alexandr +catalog +challenge +clipper +coltrane +cyrano +dan +dawn +dean +deutsch +dilbert +e-mail +export +ford +fountain +fox +frog +gabriell +garlic +goforit +grateful +hoops +lady +ledzep +lee +mailman +mantra +market +mazda1 +metallic +ncc1701e +nesbitt +open +pete +quest +republic +research +supra +tara +testing +xanadu +xxxx +zaphod +zeus +0007 +1022 +10sne1 +1973 +1978 +2000 +2222 +3bears +Broadway +Fisher +Jeanne +Killer +Knight +Master +Pepper +Sierra +Tennis +abacab +abcd +ace +acropolis +amy +anders +avenir +basil +bass +beer +ben +bliss +blowfish +boss +bridges +buck +bugsy +bull +cannondale +canon +catnip +chip +civil +content +cook +cordelia +crack1 +cyber +daisie +dark1 +database +deadhead +denali +depeche +dickens +emmitt +entropy +farout +farside +feedback +fidel +firenze +fish1 +fletch +fool +fozzie +fun +gargoyle +gasman +gold +graphic +hell +image +intern +intrepid +jeff +jkl123 +joel +johanna1 +kidder +kim +king +kirk +kris +lambda +leon +logical +lorrie +major +mariner +mark1 +max +media +merlot +midway +mine +mmouse +moon +mopar +mortimer +nermal +nina +olsen +opera +overkill +pacers +packer +picard +polar +polo +primus +prometheus +public +radio +rastafarian +reptile +rob +robotech +rodeo +rolex +rouge +roy +ruby +salasana +scarecrow +scout +scuba1 +sergey +skibum +skunk +sound +starter +sting1 +sunbird +tbird +teflon +temporal +terminal +the +thejudge +time +toby +today +tokyo +tree +trout +vader +val +valhalla +windsurf +wolf +wolf1 +xcountry +yoda +yukon +1213 +1214 +1225 +1313 +1818 +1975 +1977 +1991 +1kitty +2001 +2020 +2112 +2kids +333 +4444 +5050 +57chevy +7dwarfs +Animals +Ariel +Bismillah +Booboo +Boston +Carol +Computer +Creative +Curtis +Denise +Eagles +Esther +Fishing +Freddy +Gandalf +Golden +Goober +Hacker +Harley +Henry +Hershey +Jackson +Jersey +Joanna +Johnson +Katie +Kitten +Liberty +Lindsay +Lizard +Madeline +Margaret +Maxwell +Money +Monster +Pamela +Peaches +Peter +Phoenix +Piglet +Pookie +Rabbit +Raiders +Random +Russell +Sammy +Saturn +Skeeter +Smokey +Sparky +Speedy +Sterling +Theresa +Thunder +Vincent +Willow +Winnie +Wolverine +aaaa +aardvark +abbott +acura +admin +admin1 +adrock +aerobics +agent +airwolf +ali +alien +allegro +allstate +altamira +altima1 +andrew! +ann +anne +anneli +aptiva +arrow +asdf;lkj +assmunch +baraka +barnyard +bart +bartman +beasty +beavis1 +bebe +belgium +beowulf +beryl +best +bharat +bichon +bigal +biker +bilbo +bills +bimmer +biochem +birdy +blinds +blitz +bluejean +bogey +bogus +boulder +bourbon +boxer +brain +branch +britain +broker +bucks +buffett +bugs +bulls +burns +buzz +c00per +calgary +camay +carl +cat +cement +cessna +chad +chainsaw +chameleon +chang +chess +chinook +chouette +chronos +cicero +circuit +cirque +cirrus +clapton +clarkson +class +claudel +cleo +cliff +clock +color +comet +concept +concorde +coolbean +corky +cornflake +corwin +cows +crescent +cross +crowley +cthulhu +cunt +current +cutlass +daedalus +dagger1 +daily +dale +dana +daytek +dead +decker +dharma +dillweed +dipper +disco +dixon +doitnow +doors +dork +doug +dutch +effie +ella +elsie +engage +eric1 +ernie1 +escort1 +excel +faculty +fairview +faust +fenris +finance +first +fishhead +flanders +fleurs +flute +flyboy +flyer +franka +frederic +free +front242 +frontier +fugazi +funtime +gaby +gaelic +gambler +gammaphi +garfunkel +garth +gary +gateway2 +gator1 +gibbons +gigi +gilgamesh +goat +godiva +goethe +gofish +good +gramps +gravis +gray +greed +greg +greg1 +greta +gretzky +guido +gumby +h2opolo +hamid +hank +hawkeye1 +health1 +hello8 +help123 +helper +homerj +hoosier +hope +huang +hugo +hydrogen +ib6ub9 +insight +instructor +integral +iomega +iris +izzy +jazz +jean +jeepster +jetta1 +joanie +josee +joy +julia2 +jumbo +jump +justice4 +kalamazoo +kali +kat +kate +kerala +kids +kiwi +kleenex +kombat +lamer +laser +laserjet +lassie1 +leblanc +legal +leo +life +lions +liz +logger +logos +loislane +loki +longer +lori +lost +lotus +lou +macha +macross +madoka +makeitso +mallard +marc +math +mattingly +mechanic +meister +mercer +merde +merrill +michal +michou +mickel +minou +mobydick +modem +mojo +montana3 +montrose +motor +mowgli +mulder1 +muscle +neil +neutrino +newaccount +nicklaus +nightshade +nightwing +nike +none1 +nopass +nouveau +novell +oaxaca +obiwan +obsession +orville +otter +ozzy +packrat +paint +papa +paradigm +pass +pavel +peterk +phialpha +phishy +piano1 +pianoman +pianos +pipeline +plato +play +poetic +print +printing +provider +qqq111 +quebec +qwer +racer +racerx +radar +rafiki +raleigh +rasta1 +redcloud +redfish +redwing +redwood +reed +rene +reznor +rhino +ripple +rita +robocop +robotics +roche +roni +rossignol +rugger +safety1 +saigon +satori +saturn5 +schnapps +scotch +scuba +secret3 +seeker +services +sex +shanghai +shazam +shelter +sigmachi +signal +signature +simsim +skydive +slick +smegma +smiths +smurfy +snow +sober1 +sonics +sony +spazz +sphynx +spock +spoon +spot +sprocket +starbuck +steel +stephi +sting +stocks +storage +strat +strato +stud +student2 +susanna +swanson +swim +switzer +system5 +t-bone +talon +tarheel +tata +tazdevil +tester +testtest +thisisit +thorne +tightend +tim +tom +tool +total +toucan +transfer +transit +transport +trapper +trash +trophy +tucson +turbo2 +unity +upsilon +vedder +vette +vikram +virago +visual +volcano +walden +waldo +walleye +webmaster +wedge +whale1 +whit +whoville +wibble +will +wombat1 +word +world +x-files +xxx123 +zack +zepplin +zoltan +zoomer +123go +21122112 +5555 +911 +FuckYou +Fuckyou +Gizmo +Hello +Michel +Qwerty +Windows +angus +aspen +ass +bird +booster +byteme +cats +changeit +christia +christoph +classroom +cloclo +corrado +dasha +fiction +french1 +fubar +gator +gilles +gocougs +hilbert +hola +home +judy +koko +lulu +mac +macintosh +mailer +mars +meow +ne1469 +niki +paul +politics +pomme +property +ruth +sales +salut +scrooge +skidoo +spain +surf +sylvie +symbol +forum +rotimi +god +saved +2580 +1998 +xxx +1928 +777 +info +a +netware +sun +tech +doom +mmm +one +ppp +1911 +1948 +1996 +5252 +Champs +Tuesday +bach +crow +don +draft +hal9000 +herzog +huey +jethrotull +jussi +mail +miki +nicarao +snowski +1316 +1412 +1430 +1952 +1953 +1955 +1956 +1960 +1964 +1qw23e +22 +2200 +2252 +3010 +3112 +4788 +6262 +Alpha +Bastard +Beavis +Cardinal +Celtics +Cougar +Darkman +Figaro +Fortune +Geronimo +Hammer +Homer +Janet +Mellon +Merlot +Metallic +Montreal +Newton +Paladin +Peanuts +Service +Vernon +Waterloo +Webster +aki123 +aqua +aylmer +beta +bozo +car +chat +chinacat +cora +courier +dogbert +eieio +elina1 +fly +funguy +fuzz +ggeorge +glider1 +gone +hawk +heikki +histoire +hugh +if6was9 +ingvar +jan +jedi +jimi +juhani +khan +lima +midvale +neko +nesbit +nexus6 +nisse +notta1 +pam +park +pole +pope +pyro +ram +reliant +rex +rush +seoul +skip +stan +sue +suzy +tab +testi +thelorax +tika +tnt +toto1 +tre +wind +x-men +xyz +zxc +369 +Abcdef +Asdfgh +Changeme +NCC1701 +Zxcvbnm +demo +doom2 +e +good-luck +homebrew +m1911a1 +nat +ne1410s +ne14a69 +zhongguo +sample123 +0852 +basf +OU812 +!@#$% +informix +majordomo +news +temp +trek +!@#$%^ +!@#$%^&* +Pentium +Raistlin +adi +bmw +law +m +new +opus +plus +visa +www +y +zzz +1332 +1950 +3141 +3533 +4055 +4854 +6301 +Bonzo +ChangeMe +Front242 +Gretel +Michel1 +Noriko +Sidekick +Sverige +Swoosh +Woodrow +aa +ayelet +barn +betacam +biz +boat +cuda +doc +hal +hallowell +haro +hosehead +i +ilmari +irmeli +j1l2t3 +jer +kcin +kerrya +kissa2 +leaf +lissabon +mart +matti1 +mech +morecats +paagal +performa +prof +ratio +ship +slip +stivers +tapani +targas +test2 +test3 +tula +unix +user1 +xanth +!@#$%^& +1701d +@#$%^& +Qwert +allo +dirk +go +newcourt +nite +notused +sss diff --git a/resources/builtin/agent.png b/resources/builtin/agent.png new file mode 100644 index 0000000000..ba103e67ec Binary files /dev/null and b/resources/builtin/agent.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/0.png b/resources/builtin/alphanumeric/aleo-white/0.png new file mode 100644 index 0000000000..6a54cfbe1c Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/0.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/1.png b/resources/builtin/alphanumeric/aleo-white/1.png new file mode 100644 index 0000000000..0002e20ec4 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/1.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/2.png b/resources/builtin/alphanumeric/aleo-white/2.png new file mode 100644 index 0000000000..f3f4c558cf Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/2.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/3.png b/resources/builtin/alphanumeric/aleo-white/3.png new file mode 100644 index 0000000000..c4f3d5b171 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/3.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/4.png b/resources/builtin/alphanumeric/aleo-white/4.png new file mode 100644 index 0000000000..ee847ed0af Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/4.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/5.png b/resources/builtin/alphanumeric/aleo-white/5.png new file mode 100644 index 0000000000..e1bf184d68 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/5.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/6.png b/resources/builtin/alphanumeric/aleo-white/6.png new file mode 100644 index 0000000000..b585755282 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/6.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/7.png b/resources/builtin/alphanumeric/aleo-white/7.png new file mode 100644 index 0000000000..0609917f72 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/7.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/8.png b/resources/builtin/alphanumeric/aleo-white/8.png new file mode 100644 index 0000000000..fe328e3aaa Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/8.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/9.png b/resources/builtin/alphanumeric/aleo-white/9.png new file mode 100644 index 0000000000..bb27dd9595 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/9.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/A.png b/resources/builtin/alphanumeric/aleo-white/A.png new file mode 100644 index 0000000000..d78b8b82ca Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/A.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/B.png b/resources/builtin/alphanumeric/aleo-white/B.png new file mode 100644 index 0000000000..5692da0896 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/B.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/C.png b/resources/builtin/alphanumeric/aleo-white/C.png new file mode 100644 index 0000000000..2667930e6f Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/C.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/D.png b/resources/builtin/alphanumeric/aleo-white/D.png new file mode 100644 index 0000000000..f75ad9a591 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/D.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/E.png b/resources/builtin/alphanumeric/aleo-white/E.png new file mode 100644 index 0000000000..413cb4690c Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/E.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/F.png b/resources/builtin/alphanumeric/aleo-white/F.png new file mode 100644 index 0000000000..64c4db4622 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/F.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/G.png b/resources/builtin/alphanumeric/aleo-white/G.png new file mode 100644 index 0000000000..46ba2212f3 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/G.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/H.png b/resources/builtin/alphanumeric/aleo-white/H.png new file mode 100644 index 0000000000..23b1f78cfb Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/H.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/I.png b/resources/builtin/alphanumeric/aleo-white/I.png new file mode 100644 index 0000000000..222feb88e6 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/I.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/J.png b/resources/builtin/alphanumeric/aleo-white/J.png new file mode 100644 index 0000000000..d3c81deb19 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/J.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/K.png b/resources/builtin/alphanumeric/aleo-white/K.png new file mode 100644 index 0000000000..05c527b5cb Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/K.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/L.png b/resources/builtin/alphanumeric/aleo-white/L.png new file mode 100644 index 0000000000..cc6af32ef9 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/L.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/M.png b/resources/builtin/alphanumeric/aleo-white/M.png new file mode 100644 index 0000000000..9422d110e2 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/M.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/N.png b/resources/builtin/alphanumeric/aleo-white/N.png new file mode 100644 index 0000000000..6efde37f25 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/N.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/O.png b/resources/builtin/alphanumeric/aleo-white/O.png new file mode 100644 index 0000000000..e7266a7d0f Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/O.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/P.png b/resources/builtin/alphanumeric/aleo-white/P.png new file mode 100644 index 0000000000..e94a48a4cc Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/P.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/Q.png b/resources/builtin/alphanumeric/aleo-white/Q.png new file mode 100644 index 0000000000..8217bfef59 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/Q.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/R.png b/resources/builtin/alphanumeric/aleo-white/R.png new file mode 100644 index 0000000000..3cf3892f3e Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/R.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/S.png b/resources/builtin/alphanumeric/aleo-white/S.png new file mode 100644 index 0000000000..4c08cf5982 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/S.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/T.png b/resources/builtin/alphanumeric/aleo-white/T.png new file mode 100644 index 0000000000..6484a2856f Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/T.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/U.png b/resources/builtin/alphanumeric/aleo-white/U.png new file mode 100644 index 0000000000..af3427b455 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/U.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/V.png b/resources/builtin/alphanumeric/aleo-white/V.png new file mode 100644 index 0000000000..948d35a674 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/V.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/W.png b/resources/builtin/alphanumeric/aleo-white/W.png new file mode 100644 index 0000000000..5db225e845 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/W.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/X.png b/resources/builtin/alphanumeric/aleo-white/X.png new file mode 100644 index 0000000000..aed5084b77 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/X.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/Y.png b/resources/builtin/alphanumeric/aleo-white/Y.png new file mode 100644 index 0000000000..80475739e4 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/Y.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/Z.png b/resources/builtin/alphanumeric/aleo-white/Z.png new file mode 100644 index 0000000000..f58fc9eb55 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/Z.png differ diff --git a/resources/builtin/alphanumeric/aleo-white/_default.png b/resources/builtin/alphanumeric/aleo-white/_default.png new file mode 100644 index 0000000000..167ab46b39 Binary files /dev/null and b/resources/builtin/alphanumeric/aleo-white/_default.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/0.png b/resources/builtin/alphanumeric/lato-dark/0.png new file mode 100644 index 0000000000..1d1640909d Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/0.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/1.png b/resources/builtin/alphanumeric/lato-dark/1.png new file mode 100644 index 0000000000..a634d966f4 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/1.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/2.png b/resources/builtin/alphanumeric/lato-dark/2.png new file mode 100644 index 0000000000..f8fbce508c Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/2.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/3.png b/resources/builtin/alphanumeric/lato-dark/3.png new file mode 100644 index 0000000000..b06b0b0993 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/3.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/4.png b/resources/builtin/alphanumeric/lato-dark/4.png new file mode 100644 index 0000000000..175bf669dd Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/4.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/5.png b/resources/builtin/alphanumeric/lato-dark/5.png new file mode 100644 index 0000000000..cb30839c0b Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/5.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/6.png b/resources/builtin/alphanumeric/lato-dark/6.png new file mode 100644 index 0000000000..1b4c8d2dbd Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/6.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/7.png b/resources/builtin/alphanumeric/lato-dark/7.png new file mode 100644 index 0000000000..97f0797d0f Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/7.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/8.png b/resources/builtin/alphanumeric/lato-dark/8.png new file mode 100644 index 0000000000..78490351c5 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/8.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/9.png b/resources/builtin/alphanumeric/lato-dark/9.png new file mode 100644 index 0000000000..51896d03dd Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/9.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/A.png b/resources/builtin/alphanumeric/lato-dark/A.png new file mode 100644 index 0000000000..96ec17c25a Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/A.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/B.png b/resources/builtin/alphanumeric/lato-dark/B.png new file mode 100644 index 0000000000..f13151b77d Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/B.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/C.png b/resources/builtin/alphanumeric/lato-dark/C.png new file mode 100644 index 0000000000..69245cb33d Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/C.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/D.png b/resources/builtin/alphanumeric/lato-dark/D.png new file mode 100644 index 0000000000..b6a4db9da7 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/D.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/E.png b/resources/builtin/alphanumeric/lato-dark/E.png new file mode 100644 index 0000000000..17838d9435 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/E.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/F.png b/resources/builtin/alphanumeric/lato-dark/F.png new file mode 100644 index 0000000000..ac5277a6cb Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/F.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/G.png b/resources/builtin/alphanumeric/lato-dark/G.png new file mode 100644 index 0000000000..54fb8a4659 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/G.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/H.png b/resources/builtin/alphanumeric/lato-dark/H.png new file mode 100644 index 0000000000..6b7b0a95a1 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/H.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/I.png b/resources/builtin/alphanumeric/lato-dark/I.png new file mode 100644 index 0000000000..4455baec89 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/I.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/J.png b/resources/builtin/alphanumeric/lato-dark/J.png new file mode 100644 index 0000000000..5c81aaf17d Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/J.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/K.png b/resources/builtin/alphanumeric/lato-dark/K.png new file mode 100644 index 0000000000..fd630d951b Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/K.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/L.png b/resources/builtin/alphanumeric/lato-dark/L.png new file mode 100644 index 0000000000..35e0557294 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/L.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/M.png b/resources/builtin/alphanumeric/lato-dark/M.png new file mode 100644 index 0000000000..46e9347578 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/M.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/N.png b/resources/builtin/alphanumeric/lato-dark/N.png new file mode 100644 index 0000000000..e8cffda355 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/N.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/O.png b/resources/builtin/alphanumeric/lato-dark/O.png new file mode 100644 index 0000000000..2ebd3b2a64 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/O.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/P.png b/resources/builtin/alphanumeric/lato-dark/P.png new file mode 100644 index 0000000000..632694600d Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/P.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/Q.png b/resources/builtin/alphanumeric/lato-dark/Q.png new file mode 100644 index 0000000000..ee7b343136 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/Q.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/R.png b/resources/builtin/alphanumeric/lato-dark/R.png new file mode 100644 index 0000000000..7213cb4911 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/R.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/S.png b/resources/builtin/alphanumeric/lato-dark/S.png new file mode 100644 index 0000000000..1ee5a01fad Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/S.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/T.png b/resources/builtin/alphanumeric/lato-dark/T.png new file mode 100644 index 0000000000..be8a7fc7a5 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/T.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/U.png b/resources/builtin/alphanumeric/lato-dark/U.png new file mode 100644 index 0000000000..467c8a9139 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/U.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/V.png b/resources/builtin/alphanumeric/lato-dark/V.png new file mode 100644 index 0000000000..47626ba4ee Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/V.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/W.png b/resources/builtin/alphanumeric/lato-dark/W.png new file mode 100644 index 0000000000..acd8f55c43 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/W.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/X.png b/resources/builtin/alphanumeric/lato-dark/X.png new file mode 100644 index 0000000000..c1dacfc86d Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/X.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/Y.png b/resources/builtin/alphanumeric/lato-dark/Y.png new file mode 100644 index 0000000000..247bf82254 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/Y.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/Z.png b/resources/builtin/alphanumeric/lato-dark/Z.png new file mode 100644 index 0000000000..8ec279f685 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/Z.png differ diff --git a/resources/builtin/alphanumeric/lato-dark/_default.png b/resources/builtin/alphanumeric/lato-dark/_default.png new file mode 100644 index 0000000000..48be8a15eb Binary files /dev/null and b/resources/builtin/alphanumeric/lato-dark/_default.png differ diff --git a/resources/builtin/alphanumeric/lato-white/0.png b/resources/builtin/alphanumeric/lato-white/0.png new file mode 100644 index 0000000000..a37a1305e3 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/0.png differ diff --git a/resources/builtin/alphanumeric/lato-white/1.png b/resources/builtin/alphanumeric/lato-white/1.png new file mode 100644 index 0000000000..e1b330190c Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/1.png differ diff --git a/resources/builtin/alphanumeric/lato-white/2.png b/resources/builtin/alphanumeric/lato-white/2.png new file mode 100644 index 0000000000..af3294627c Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/2.png differ diff --git a/resources/builtin/alphanumeric/lato-white/3.png b/resources/builtin/alphanumeric/lato-white/3.png new file mode 100644 index 0000000000..fe48e50396 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/3.png differ diff --git a/resources/builtin/alphanumeric/lato-white/4.png b/resources/builtin/alphanumeric/lato-white/4.png new file mode 100644 index 0000000000..bd208785ca Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/4.png differ diff --git a/resources/builtin/alphanumeric/lato-white/5.png b/resources/builtin/alphanumeric/lato-white/5.png new file mode 100644 index 0000000000..d93fe585c1 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/5.png differ diff --git a/resources/builtin/alphanumeric/lato-white/6.png b/resources/builtin/alphanumeric/lato-white/6.png new file mode 100644 index 0000000000..fc54fbe317 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/6.png differ diff --git a/resources/builtin/alphanumeric/lato-white/7.png b/resources/builtin/alphanumeric/lato-white/7.png new file mode 100644 index 0000000000..d77949da2f Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/7.png differ diff --git a/resources/builtin/alphanumeric/lato-white/8.png b/resources/builtin/alphanumeric/lato-white/8.png new file mode 100644 index 0000000000..4664d06d81 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/8.png differ diff --git a/resources/builtin/alphanumeric/lato-white/9.png b/resources/builtin/alphanumeric/lato-white/9.png new file mode 100644 index 0000000000..66058e023d Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/9.png differ diff --git a/resources/builtin/alphanumeric/lato-white/A.png b/resources/builtin/alphanumeric/lato-white/A.png new file mode 100644 index 0000000000..284ce2a060 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/A.png differ diff --git a/resources/builtin/alphanumeric/lato-white/B.png b/resources/builtin/alphanumeric/lato-white/B.png new file mode 100644 index 0000000000..3fa4722ab3 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/B.png differ diff --git a/resources/builtin/alphanumeric/lato-white/C.png b/resources/builtin/alphanumeric/lato-white/C.png new file mode 100644 index 0000000000..ee08793966 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/C.png differ diff --git a/resources/builtin/alphanumeric/lato-white/D.png b/resources/builtin/alphanumeric/lato-white/D.png new file mode 100644 index 0000000000..e100162e2a Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/D.png differ diff --git a/resources/builtin/alphanumeric/lato-white/E.png b/resources/builtin/alphanumeric/lato-white/E.png new file mode 100644 index 0000000000..0e6a648608 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/E.png differ diff --git a/resources/builtin/alphanumeric/lato-white/F.png b/resources/builtin/alphanumeric/lato-white/F.png new file mode 100644 index 0000000000..c0f43e59b3 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/F.png differ diff --git a/resources/builtin/alphanumeric/lato-white/G.png b/resources/builtin/alphanumeric/lato-white/G.png new file mode 100644 index 0000000000..4a15c197ba Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/G.png differ diff --git a/resources/builtin/alphanumeric/lato-white/H.png b/resources/builtin/alphanumeric/lato-white/H.png new file mode 100644 index 0000000000..0c627420fc Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/H.png differ diff --git a/resources/builtin/alphanumeric/lato-white/I.png b/resources/builtin/alphanumeric/lato-white/I.png new file mode 100644 index 0000000000..dfe79d9b35 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/I.png differ diff --git a/resources/builtin/alphanumeric/lato-white/J.png b/resources/builtin/alphanumeric/lato-white/J.png new file mode 100644 index 0000000000..a7ade6ba34 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/J.png differ diff --git a/resources/builtin/alphanumeric/lato-white/K.png b/resources/builtin/alphanumeric/lato-white/K.png new file mode 100644 index 0000000000..894f16abf9 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/K.png differ diff --git a/resources/builtin/alphanumeric/lato-white/L.png b/resources/builtin/alphanumeric/lato-white/L.png new file mode 100644 index 0000000000..61889a13cb Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/L.png differ diff --git a/resources/builtin/alphanumeric/lato-white/M.png b/resources/builtin/alphanumeric/lato-white/M.png new file mode 100644 index 0000000000..a54a3639dc Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/M.png differ diff --git a/resources/builtin/alphanumeric/lato-white/N.png b/resources/builtin/alphanumeric/lato-white/N.png new file mode 100644 index 0000000000..051ec3c09d Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/N.png differ diff --git a/resources/builtin/alphanumeric/lato-white/O.png b/resources/builtin/alphanumeric/lato-white/O.png new file mode 100644 index 0000000000..574d940f4f Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/O.png differ diff --git a/resources/builtin/alphanumeric/lato-white/P.png b/resources/builtin/alphanumeric/lato-white/P.png new file mode 100644 index 0000000000..0c735d3a4c Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/P.png differ diff --git a/resources/builtin/alphanumeric/lato-white/Q.png b/resources/builtin/alphanumeric/lato-white/Q.png new file mode 100644 index 0000000000..b09b9b9a03 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/Q.png differ diff --git a/resources/builtin/alphanumeric/lato-white/R.png b/resources/builtin/alphanumeric/lato-white/R.png new file mode 100644 index 0000000000..89f0fa8f26 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/R.png differ diff --git a/resources/builtin/alphanumeric/lato-white/S.png b/resources/builtin/alphanumeric/lato-white/S.png new file mode 100644 index 0000000000..8992f0f6a0 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/S.png differ diff --git a/resources/builtin/alphanumeric/lato-white/T.png b/resources/builtin/alphanumeric/lato-white/T.png new file mode 100644 index 0000000000..5c9393b0ae Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/T.png differ diff --git a/resources/builtin/alphanumeric/lato-white/U.png b/resources/builtin/alphanumeric/lato-white/U.png new file mode 100644 index 0000000000..e681eb61f4 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/U.png differ diff --git a/resources/builtin/alphanumeric/lato-white/V.png b/resources/builtin/alphanumeric/lato-white/V.png new file mode 100644 index 0000000000..c2ffde7044 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/V.png differ diff --git a/resources/builtin/alphanumeric/lato-white/W.png b/resources/builtin/alphanumeric/lato-white/W.png new file mode 100644 index 0000000000..60b3c36088 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/W.png differ diff --git a/resources/builtin/alphanumeric/lato-white/X.png b/resources/builtin/alphanumeric/lato-white/X.png new file mode 100644 index 0000000000..60c82d00eb Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/X.png differ diff --git a/resources/builtin/alphanumeric/lato-white/Y.png b/resources/builtin/alphanumeric/lato-white/Y.png new file mode 100644 index 0000000000..1f6bf139a2 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/Y.png differ diff --git a/resources/builtin/alphanumeric/lato-white/Z.png b/resources/builtin/alphanumeric/lato-white/Z.png new file mode 100644 index 0000000000..6f06c52cdc Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/Z.png differ diff --git a/resources/builtin/alphanumeric/lato-white/_default.png b/resources/builtin/alphanumeric/lato-white/_default.png new file mode 100644 index 0000000000..e6be069919 Binary files /dev/null and b/resources/builtin/alphanumeric/lato-white/_default.png differ diff --git a/resources/builtin/avatar.png b/resources/builtin/avatar.png new file mode 100644 index 0000000000..7d2514eca6 Binary files /dev/null and b/resources/builtin/avatar.png differ diff --git a/resources/builtin/blog.png b/resources/builtin/blog.png new file mode 100644 index 0000000000..bb68581a01 Binary files /dev/null and b/resources/builtin/blog.png differ diff --git a/resources/builtin/conpherence.png b/resources/builtin/conpherence.png new file mode 100644 index 0000000000..78bb8bdc05 Binary files /dev/null and b/resources/builtin/conpherence.png differ diff --git a/resources/builtin/favicon/default-120x120.png b/resources/builtin/favicon/default-120x120.png new file mode 100644 index 0000000000..a88125beca Binary files /dev/null and b/resources/builtin/favicon/default-120x120.png differ diff --git a/resources/builtin/favicon/default-128x128.png b/resources/builtin/favicon/default-128x128.png new file mode 100644 index 0000000000..3b51e6052b Binary files /dev/null and b/resources/builtin/favicon/default-128x128.png differ diff --git a/resources/builtin/favicon/default-152x152.png b/resources/builtin/favicon/default-152x152.png new file mode 100644 index 0000000000..94a69ade74 Binary files /dev/null and b/resources/builtin/favicon/default-152x152.png differ diff --git a/resources/builtin/favicon/default-76x76.png b/resources/builtin/favicon/default-76x76.png new file mode 100644 index 0000000000..0245ac2a21 Binary files /dev/null and b/resources/builtin/favicon/default-76x76.png differ diff --git a/resources/builtin/favicon/dot-pink-64x64.png b/resources/builtin/favicon/dot-pink-64x64.png new file mode 100644 index 0000000000..99595c8e1a Binary files /dev/null and b/resources/builtin/favicon/dot-pink-64x64.png differ diff --git a/resources/builtin/favicon/dot-red-64x64.png b/resources/builtin/favicon/dot-red-64x64.png new file mode 100644 index 0000000000..e727375be0 Binary files /dev/null and b/resources/builtin/favicon/dot-red-64x64.png differ diff --git a/resources/builtin/image-100x100.png b/resources/builtin/image-100x100.png new file mode 100644 index 0000000000..d77e1d4584 Binary files /dev/null and b/resources/builtin/image-100x100.png differ diff --git a/resources/builtin/image-200x200.png b/resources/builtin/image-200x200.png new file mode 100644 index 0000000000..520526a2d9 Binary files /dev/null and b/resources/builtin/image-200x200.png differ diff --git a/resources/builtin/image-220x220.png b/resources/builtin/image-220x220.png new file mode 100644 index 0000000000..f9fe4ade48 Binary files /dev/null and b/resources/builtin/image-220x220.png differ diff --git a/resources/builtin/image-280x210.png b/resources/builtin/image-280x210.png new file mode 100644 index 0000000000..ddece3327d Binary files /dev/null and b/resources/builtin/image-280x210.png differ diff --git a/resources/builtin/image-400x400.png b/resources/builtin/image-400x400.png new file mode 100644 index 0000000000..db23eb01c7 Binary files /dev/null and b/resources/builtin/image-400x400.png differ diff --git a/resources/builtin/image-526x526.png b/resources/builtin/image-526x526.png new file mode 100644 index 0000000000..3d666163b2 Binary files /dev/null and b/resources/builtin/image-526x526.png differ diff --git a/resources/builtin/image-800x800.png b/resources/builtin/image-800x800.png new file mode 100644 index 0000000000..9755de33f8 Binary files /dev/null and b/resources/builtin/image-800x800.png differ diff --git a/resources/builtin/macro/phabricator1/angelic.png b/resources/builtin/macro/phabricator1/angelic.png deleted file mode 100644 index 3238593254..0000000000 Binary files a/resources/builtin/macro/phabricator1/angelic.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/capn.png b/resources/builtin/macro/phabricator1/capn.png deleted file mode 100644 index 136a375198..0000000000 Binary files a/resources/builtin/macro/phabricator1/capn.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/disapprovey.png b/resources/builtin/macro/phabricator1/disapprovey.png deleted file mode 100644 index 5765cbb3f6..0000000000 Binary files a/resources/builtin/macro/phabricator1/disapprovey.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/hahalol.png b/resources/builtin/macro/phabricator1/hahalol.png deleted file mode 100644 index 50cf5ebd21..0000000000 Binary files a/resources/builtin/macro/phabricator1/hahalol.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/happyguy.png b/resources/builtin/macro/phabricator1/happyguy.png deleted file mode 100644 index 0fa43e3950..0000000000 Binary files a/resources/builtin/macro/phabricator1/happyguy.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/itsthedevil.png b/resources/builtin/macro/phabricator1/itsthedevil.png deleted file mode 100644 index a144ffd6ee..0000000000 Binary files a/resources/builtin/macro/phabricator1/itsthedevil.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/mater.png b/resources/builtin/macro/phabricator1/mater.png deleted file mode 100644 index 14da77060e..0000000000 Binary files a/resources/builtin/macro/phabricator1/mater.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/mcsquiggles.png b/resources/builtin/macro/phabricator1/mcsquiggles.png deleted file mode 100644 index 4d6b1d6a55..0000000000 Binary files a/resources/builtin/macro/phabricator1/mcsquiggles.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/mesmerized.png b/resources/builtin/macro/phabricator1/mesmerized.png deleted file mode 100644 index eb52eec2e3..0000000000 Binary files a/resources/builtin/macro/phabricator1/mesmerized.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/mrclowny.png b/resources/builtin/macro/phabricator1/mrclowny.png deleted file mode 100644 index 0777a735c3..0000000000 Binary files a/resources/builtin/macro/phabricator1/mrclowny.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/mumbles.png b/resources/builtin/macro/phabricator1/mumbles.png deleted file mode 100644 index 17bff50699..0000000000 Binary files a/resources/builtin/macro/phabricator1/mumbles.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/ohhrm.png b/resources/builtin/macro/phabricator1/ohhrm.png deleted file mode 100644 index 28b0c481aa..0000000000 Binary files a/resources/builtin/macro/phabricator1/ohhrm.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/ohisee.png b/resources/builtin/macro/phabricator1/ohisee.png deleted file mode 100644 index 80017e07cc..0000000000 Binary files a/resources/builtin/macro/phabricator1/ohisee.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/ohunhappy.png b/resources/builtin/macro/phabricator1/ohunhappy.png deleted file mode 100644 index 8c20a56f9c..0000000000 Binary files a/resources/builtin/macro/phabricator1/ohunhappy.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/sayahh.png b/resources/builtin/macro/phabricator1/sayahh.png deleted file mode 100644 index 097090a0e0..0000000000 Binary files a/resources/builtin/macro/phabricator1/sayahh.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/smileytongue.png b/resources/builtin/macro/phabricator1/smileytongue.png deleted file mode 100644 index f3786e7842..0000000000 Binary files a/resources/builtin/macro/phabricator1/smileytongue.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/smirky.png b/resources/builtin/macro/phabricator1/smirky.png deleted file mode 100644 index 2644ba75cf..0000000000 Binary files a/resources/builtin/macro/phabricator1/smirky.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/squintytongue.png b/resources/builtin/macro/phabricator1/squintytongue.png deleted file mode 100644 index 36e3699562..0000000000 Binary files a/resources/builtin/macro/phabricator1/squintytongue.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/stunna.png b/resources/builtin/macro/phabricator1/stunna.png deleted file mode 100644 index e32de27244..0000000000 Binary files a/resources/builtin/macro/phabricator1/stunna.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/thxu.png b/resources/builtin/macro/phabricator1/thxu.png deleted file mode 100644 index 15308e756d..0000000000 Binary files a/resources/builtin/macro/phabricator1/thxu.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/udidwat.png b/resources/builtin/macro/phabricator1/udidwat.png deleted file mode 100644 index 2c938647ad..0000000000 Binary files a/resources/builtin/macro/phabricator1/udidwat.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/uhwat.png b/resources/builtin/macro/phabricator1/uhwat.png deleted file mode 100644 index 8712ef31e3..0000000000 Binary files a/resources/builtin/macro/phabricator1/uhwat.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/undecided.png b/resources/builtin/macro/phabricator1/undecided.png deleted file mode 100644 index a86d50e68a..0000000000 Binary files a/resources/builtin/macro/phabricator1/undecided.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/vampy.png b/resources/builtin/macro/phabricator1/vampy.png deleted file mode 100644 index 6b7cb3117c..0000000000 Binary files a/resources/builtin/macro/phabricator1/vampy.png and /dev/null differ diff --git a/resources/builtin/macro/phabricator1/wowzers.png b/resources/builtin/macro/phabricator1/wowzers.png deleted file mode 100644 index 228e4c5da5..0000000000 Binary files a/resources/builtin/macro/phabricator1/wowzers.png and /dev/null differ diff --git a/resources/builtin/mailinglist.png b/resources/builtin/mailinglist.png new file mode 100644 index 0000000000..58e973608f Binary files /dev/null and b/resources/builtin/mailinglist.png differ diff --git a/resources/builtin/merchant.png b/resources/builtin/merchant.png new file mode 100644 index 0000000000..c8381eb00f Binary files /dev/null and b/resources/builtin/merchant.png differ diff --git a/resources/builtin/profile.png b/resources/builtin/profile.png index 755d19cd2e..7d2514eca6 100644 Binary files a/resources/builtin/profile.png and b/resources/builtin/profile.png differ diff --git a/resources/builtin/project.png b/resources/builtin/project.png new file mode 100644 index 0000000000..c6abf5ed42 Binary files /dev/null and b/resources/builtin/project.png differ diff --git a/resources/builtin/projects/fa-android.png b/resources/builtin/projects/fa-android.png new file mode 100644 index 0000000000..db56162683 Binary files /dev/null and b/resources/builtin/projects/fa-android.png differ diff --git a/resources/builtin/projects/fa-apple.png b/resources/builtin/projects/fa-apple.png new file mode 100644 index 0000000000..7e289818d1 Binary files /dev/null and b/resources/builtin/projects/fa-apple.png differ diff --git a/resources/builtin/projects/fa-beer.png b/resources/builtin/projects/fa-beer.png new file mode 100644 index 0000000000..ff5fd0646f Binary files /dev/null and b/resources/builtin/projects/fa-beer.png differ diff --git a/resources/builtin/projects/fa-bomb.png b/resources/builtin/projects/fa-bomb.png new file mode 100644 index 0000000000..bfeacfa84c Binary files /dev/null and b/resources/builtin/projects/fa-bomb.png differ diff --git a/resources/builtin/projects/fa-book.png b/resources/builtin/projects/fa-book.png new file mode 100644 index 0000000000..f6bda5d61c Binary files /dev/null and b/resources/builtin/projects/fa-book.png differ diff --git a/resources/builtin/projects/fa-briefcase.png b/resources/builtin/projects/fa-briefcase.png new file mode 100644 index 0000000000..afa70e2a3a Binary files /dev/null and b/resources/builtin/projects/fa-briefcase.png differ diff --git a/resources/builtin/projects/fa-bug.png b/resources/builtin/projects/fa-bug.png new file mode 100644 index 0000000000..83c538f885 Binary files /dev/null and b/resources/builtin/projects/fa-bug.png differ diff --git a/resources/builtin/projects/fa-building.png b/resources/builtin/projects/fa-building.png new file mode 100644 index 0000000000..d033366cf7 Binary files /dev/null and b/resources/builtin/projects/fa-building.png differ diff --git a/resources/builtin/projects/fa-calendar.png b/resources/builtin/projects/fa-calendar.png new file mode 100644 index 0000000000..80cfc3e11b Binary files /dev/null and b/resources/builtin/projects/fa-calendar.png differ diff --git a/resources/builtin/projects/fa-camera-retro.png b/resources/builtin/projects/fa-camera-retro.png new file mode 100644 index 0000000000..c1ac04d27b Binary files /dev/null and b/resources/builtin/projects/fa-camera-retro.png differ diff --git a/resources/builtin/projects/fa-chrome.png b/resources/builtin/projects/fa-chrome.png new file mode 100644 index 0000000000..177c2fe4f3 Binary files /dev/null and b/resources/builtin/projects/fa-chrome.png differ diff --git a/resources/builtin/projects/fa-cloud.png b/resources/builtin/projects/fa-cloud.png new file mode 100644 index 0000000000..ae1b855f94 Binary files /dev/null and b/resources/builtin/projects/fa-cloud.png differ diff --git a/resources/builtin/projects/fa-coffee.png b/resources/builtin/projects/fa-coffee.png new file mode 100644 index 0000000000..8d0850f0ee Binary files /dev/null and b/resources/builtin/projects/fa-coffee.png differ diff --git a/resources/builtin/projects/fa-comments.png b/resources/builtin/projects/fa-comments.png new file mode 100644 index 0000000000..927fb91bb2 Binary files /dev/null and b/resources/builtin/projects/fa-comments.png differ diff --git a/resources/builtin/projects/fa-credit-card.png b/resources/builtin/projects/fa-credit-card.png new file mode 100644 index 0000000000..c159d2b673 Binary files /dev/null and b/resources/builtin/projects/fa-credit-card.png differ diff --git a/resources/builtin/projects/fa-database.png b/resources/builtin/projects/fa-database.png new file mode 100644 index 0000000000..bafcd1e338 Binary files /dev/null and b/resources/builtin/projects/fa-database.png differ diff --git a/resources/builtin/projects/fa-desktop.png b/resources/builtin/projects/fa-desktop.png new file mode 100644 index 0000000000..f463db8e1b Binary files /dev/null and b/resources/builtin/projects/fa-desktop.png differ diff --git a/resources/builtin/projects/fa-diamond.png b/resources/builtin/projects/fa-diamond.png new file mode 100644 index 0000000000..34a68c3284 Binary files /dev/null and b/resources/builtin/projects/fa-diamond.png differ diff --git a/resources/builtin/projects/fa-empire.png b/resources/builtin/projects/fa-empire.png new file mode 100644 index 0000000000..2d9dc3a8df Binary files /dev/null and b/resources/builtin/projects/fa-empire.png differ diff --git a/resources/builtin/projects/fa-envelope.png b/resources/builtin/projects/fa-envelope.png new file mode 100644 index 0000000000..934f1587bb Binary files /dev/null and b/resources/builtin/projects/fa-envelope.png differ diff --git a/resources/builtin/projects/fa-facebook.png b/resources/builtin/projects/fa-facebook.png new file mode 100644 index 0000000000..3d5a5f1f9a Binary files /dev/null and b/resources/builtin/projects/fa-facebook.png differ diff --git a/resources/builtin/projects/fa-fax.png b/resources/builtin/projects/fa-fax.png new file mode 100644 index 0000000000..af00c31269 Binary files /dev/null and b/resources/builtin/projects/fa-fax.png differ diff --git a/resources/builtin/projects/fa-film.png b/resources/builtin/projects/fa-film.png new file mode 100644 index 0000000000..2c30ffe477 Binary files /dev/null and b/resources/builtin/projects/fa-film.png differ diff --git a/resources/builtin/projects/fa-firefox.png b/resources/builtin/projects/fa-firefox.png new file mode 100644 index 0000000000..25fd9fc739 Binary files /dev/null and b/resources/builtin/projects/fa-firefox.png differ diff --git a/resources/builtin/projects/fa-flag-checkered.png b/resources/builtin/projects/fa-flag-checkered.png new file mode 100644 index 0000000000..e8e2519b4a Binary files /dev/null and b/resources/builtin/projects/fa-flag-checkered.png differ diff --git a/resources/builtin/projects/fa-flask.png b/resources/builtin/projects/fa-flask.png new file mode 100644 index 0000000000..ce978ae7d3 Binary files /dev/null and b/resources/builtin/projects/fa-flask.png differ diff --git a/resources/builtin/projects/fa-folder.png b/resources/builtin/projects/fa-folder.png new file mode 100644 index 0000000000..f6003fcd91 Binary files /dev/null and b/resources/builtin/projects/fa-folder.png differ diff --git a/resources/builtin/projects/fa-gamepad.png b/resources/builtin/projects/fa-gamepad.png new file mode 100644 index 0000000000..db3e7df75e Binary files /dev/null and b/resources/builtin/projects/fa-gamepad.png differ diff --git a/resources/builtin/projects/fa-gears.png b/resources/builtin/projects/fa-gears.png new file mode 100644 index 0000000000..8f60e32f84 Binary files /dev/null and b/resources/builtin/projects/fa-gears.png differ diff --git a/resources/builtin/projects/fa-google.png b/resources/builtin/projects/fa-google.png new file mode 100644 index 0000000000..cd1ad99b1b Binary files /dev/null and b/resources/builtin/projects/fa-google.png differ diff --git a/resources/builtin/projects/fa-hand-peace-o.png b/resources/builtin/projects/fa-hand-peace-o.png new file mode 100644 index 0000000000..20a9181f5c Binary files /dev/null and b/resources/builtin/projects/fa-hand-peace-o.png differ diff --git a/resources/builtin/projects/fa-hashtag.png b/resources/builtin/projects/fa-hashtag.png new file mode 100644 index 0000000000..3324b19a05 Binary files /dev/null and b/resources/builtin/projects/fa-hashtag.png differ diff --git a/resources/builtin/projects/fa-heart.png b/resources/builtin/projects/fa-heart.png new file mode 100644 index 0000000000..35733cacca Binary files /dev/null and b/resources/builtin/projects/fa-heart.png differ diff --git a/resources/builtin/projects/fa-internet-explorer.png b/resources/builtin/projects/fa-internet-explorer.png new file mode 100644 index 0000000000..34d30aabd9 Binary files /dev/null and b/resources/builtin/projects/fa-internet-explorer.png differ diff --git a/resources/builtin/projects/fa-key.png b/resources/builtin/projects/fa-key.png new file mode 100644 index 0000000000..8b7f810fe5 Binary files /dev/null and b/resources/builtin/projects/fa-key.png differ diff --git a/resources/builtin/projects/fa-legal.png b/resources/builtin/projects/fa-legal.png new file mode 100644 index 0000000000..52d217f6ba Binary files /dev/null and b/resources/builtin/projects/fa-legal.png differ diff --git a/resources/builtin/projects/fa-linux.png b/resources/builtin/projects/fa-linux.png new file mode 100644 index 0000000000..e0defe6671 Binary files /dev/null and b/resources/builtin/projects/fa-linux.png differ diff --git a/resources/builtin/projects/fa-lock.png b/resources/builtin/projects/fa-lock.png new file mode 100644 index 0000000000..4c7f552c65 Binary files /dev/null and b/resources/builtin/projects/fa-lock.png differ diff --git a/resources/builtin/projects/fa-map-marker.png b/resources/builtin/projects/fa-map-marker.png new file mode 100644 index 0000000000..865175bd9a Binary files /dev/null and b/resources/builtin/projects/fa-map-marker.png differ diff --git a/resources/builtin/projects/fa-microphone.png b/resources/builtin/projects/fa-microphone.png new file mode 100644 index 0000000000..d279fe6934 Binary files /dev/null and b/resources/builtin/projects/fa-microphone.png differ diff --git a/resources/builtin/projects/fa-mobile.png b/resources/builtin/projects/fa-mobile.png new file mode 100644 index 0000000000..3147473cb7 Binary files /dev/null and b/resources/builtin/projects/fa-mobile.png differ diff --git a/resources/builtin/projects/fa-money.png b/resources/builtin/projects/fa-money.png new file mode 100644 index 0000000000..e0823759e2 Binary files /dev/null and b/resources/builtin/projects/fa-money.png differ diff --git a/resources/builtin/projects/fa-phone.png b/resources/builtin/projects/fa-phone.png new file mode 100644 index 0000000000..ad5f77913f Binary files /dev/null and b/resources/builtin/projects/fa-phone.png differ diff --git a/resources/builtin/projects/fa-pie-chart.png b/resources/builtin/projects/fa-pie-chart.png new file mode 100644 index 0000000000..23fefc60c3 Binary files /dev/null and b/resources/builtin/projects/fa-pie-chart.png differ diff --git a/resources/builtin/projects/fa-rebel.png b/resources/builtin/projects/fa-rebel.png new file mode 100644 index 0000000000..1ada36553b Binary files /dev/null and b/resources/builtin/projects/fa-rebel.png differ diff --git a/resources/builtin/projects/fa-reddit-alien.png b/resources/builtin/projects/fa-reddit-alien.png new file mode 100644 index 0000000000..897eca4f39 Binary files /dev/null and b/resources/builtin/projects/fa-reddit-alien.png differ diff --git a/resources/builtin/projects/fa-safari.png b/resources/builtin/projects/fa-safari.png new file mode 100644 index 0000000000..fc056a7388 Binary files /dev/null and b/resources/builtin/projects/fa-safari.png differ diff --git a/resources/builtin/projects/fa-search.png b/resources/builtin/projects/fa-search.png new file mode 100644 index 0000000000..e4135af53a Binary files /dev/null and b/resources/builtin/projects/fa-search.png differ diff --git a/resources/builtin/projects/fa-server.png b/resources/builtin/projects/fa-server.png new file mode 100644 index 0000000000..3369e094b7 Binary files /dev/null and b/resources/builtin/projects/fa-server.png differ diff --git a/resources/builtin/projects/fa-shopping-cart.png b/resources/builtin/projects/fa-shopping-cart.png new file mode 100644 index 0000000000..5a623e9b62 Binary files /dev/null and b/resources/builtin/projects/fa-shopping-cart.png differ diff --git a/resources/builtin/projects/fa-sitemap.png b/resources/builtin/projects/fa-sitemap.png new file mode 100644 index 0000000000..81cbe5406d Binary files /dev/null and b/resources/builtin/projects/fa-sitemap.png differ diff --git a/resources/builtin/projects/fa-star.png b/resources/builtin/projects/fa-star.png new file mode 100644 index 0000000000..02b66e7ef2 Binary files /dev/null and b/resources/builtin/projects/fa-star.png differ diff --git a/resources/builtin/projects/fa-tablet.png b/resources/builtin/projects/fa-tablet.png new file mode 100644 index 0000000000..263e50d733 Binary files /dev/null and b/resources/builtin/projects/fa-tablet.png differ diff --git a/resources/builtin/projects/fa-tag.png b/resources/builtin/projects/fa-tag.png new file mode 100644 index 0000000000..558fbc40fb Binary files /dev/null and b/resources/builtin/projects/fa-tag.png differ diff --git a/resources/builtin/projects/fa-tags.png b/resources/builtin/projects/fa-tags.png new file mode 100644 index 0000000000..a491bdefbe Binary files /dev/null and b/resources/builtin/projects/fa-tags.png differ diff --git a/resources/builtin/projects/fa-trash-o.png b/resources/builtin/projects/fa-trash-o.png new file mode 100644 index 0000000000..03c0f0362a Binary files /dev/null and b/resources/builtin/projects/fa-trash-o.png differ diff --git a/resources/builtin/projects/fa-truck.png b/resources/builtin/projects/fa-truck.png new file mode 100644 index 0000000000..bb67c3157a Binary files /dev/null and b/resources/builtin/projects/fa-truck.png differ diff --git a/resources/builtin/projects/fa-twitter.png b/resources/builtin/projects/fa-twitter.png new file mode 100644 index 0000000000..5dd349420c Binary files /dev/null and b/resources/builtin/projects/fa-twitter.png differ diff --git a/resources/builtin/projects/fa-umbrella.png b/resources/builtin/projects/fa-umbrella.png new file mode 100644 index 0000000000..5369f45840 Binary files /dev/null and b/resources/builtin/projects/fa-umbrella.png differ diff --git a/resources/builtin/projects/fa-university.png b/resources/builtin/projects/fa-university.png new file mode 100644 index 0000000000..5d523182e7 Binary files /dev/null and b/resources/builtin/projects/fa-university.png differ diff --git a/resources/builtin/projects/fa-user-secret.png b/resources/builtin/projects/fa-user-secret.png new file mode 100644 index 0000000000..c84267103c Binary files /dev/null and b/resources/builtin/projects/fa-user-secret.png differ diff --git a/resources/builtin/projects/fa-user.png b/resources/builtin/projects/fa-user.png new file mode 100644 index 0000000000..62c77a6729 Binary files /dev/null and b/resources/builtin/projects/fa-user.png differ diff --git a/resources/builtin/projects/fa-users.png b/resources/builtin/projects/fa-users.png new file mode 100644 index 0000000000..93d0a2f8bc Binary files /dev/null and b/resources/builtin/projects/fa-users.png differ diff --git a/resources/builtin/projects/fa-warning.png b/resources/builtin/projects/fa-warning.png new file mode 100644 index 0000000000..a950cb7e8e Binary files /dev/null and b/resources/builtin/projects/fa-warning.png differ diff --git a/resources/builtin/projects/fa-wheelchair.png b/resources/builtin/projects/fa-wheelchair.png new file mode 100644 index 0000000000..602f744a46 Binary files /dev/null and b/resources/builtin/projects/fa-wheelchair.png differ diff --git a/resources/builtin/projects/fa-windows.png b/resources/builtin/projects/fa-windows.png new file mode 100644 index 0000000000..5e7c6e6acf Binary files /dev/null and b/resources/builtin/projects/fa-windows.png differ diff --git a/resources/builtin/projects/v3/archive.png b/resources/builtin/projects/v3/archive.png new file mode 100644 index 0000000000..77ff79e555 Binary files /dev/null and b/resources/builtin/projects/v3/archive.png differ diff --git a/resources/builtin/projects/v3/basic-book.png b/resources/builtin/projects/v3/basic-book.png new file mode 100644 index 0000000000..b2a6d99415 Binary files /dev/null and b/resources/builtin/projects/v3/basic-book.png differ diff --git a/resources/builtin/projects/v3/book.png b/resources/builtin/projects/v3/book.png new file mode 100644 index 0000000000..eceb0bfb4d Binary files /dev/null and b/resources/builtin/projects/v3/book.png differ diff --git a/resources/builtin/projects/v3/briefcase.png b/resources/builtin/projects/v3/briefcase.png new file mode 100644 index 0000000000..c6abf5ed42 Binary files /dev/null and b/resources/builtin/projects/v3/briefcase.png differ diff --git a/resources/builtin/projects/v3/bug.png b/resources/builtin/projects/v3/bug.png new file mode 100644 index 0000000000..bb2948a93a Binary files /dev/null and b/resources/builtin/projects/v3/bug.png differ diff --git a/resources/builtin/projects/v3/calendar.png b/resources/builtin/projects/v3/calendar.png new file mode 100644 index 0000000000..6ebdc2e08c Binary files /dev/null and b/resources/builtin/projects/v3/calendar.png differ diff --git a/resources/builtin/projects/v3/clipboard.png b/resources/builtin/projects/v3/clipboard.png new file mode 100644 index 0000000000..60e2acd4f4 Binary files /dev/null and b/resources/builtin/projects/v3/clipboard.png differ diff --git a/resources/builtin/projects/v3/cloud.png b/resources/builtin/projects/v3/cloud.png new file mode 100644 index 0000000000..efb644001f Binary files /dev/null and b/resources/builtin/projects/v3/cloud.png differ diff --git a/resources/builtin/projects/v3/contact.png b/resources/builtin/projects/v3/contact.png new file mode 100644 index 0000000000..6b3095dc3d Binary files /dev/null and b/resources/builtin/projects/v3/contact.png differ diff --git a/resources/builtin/projects/v3/creditcard.png b/resources/builtin/projects/v3/creditcard.png new file mode 100644 index 0000000000..d231c9437d Binary files /dev/null and b/resources/builtin/projects/v3/creditcard.png differ diff --git a/resources/builtin/projects/v3/database.png b/resources/builtin/projects/v3/database.png new file mode 100644 index 0000000000..9e44c0ec58 Binary files /dev/null and b/resources/builtin/projects/v3/database.png differ diff --git a/resources/builtin/projects/v3/desktop.png b/resources/builtin/projects/v3/desktop.png new file mode 100644 index 0000000000..cf6f80eeaf Binary files /dev/null and b/resources/builtin/projects/v3/desktop.png differ diff --git a/resources/builtin/projects/v3/discussion.png b/resources/builtin/projects/v3/discussion.png new file mode 100644 index 0000000000..e4519d664f Binary files /dev/null and b/resources/builtin/projects/v3/discussion.png differ diff --git a/resources/builtin/projects/v3/download.png b/resources/builtin/projects/v3/download.png new file mode 100644 index 0000000000..f086222212 Binary files /dev/null and b/resources/builtin/projects/v3/download.png differ diff --git a/resources/builtin/projects/v3/experimental.png b/resources/builtin/projects/v3/experimental.png new file mode 100644 index 0000000000..5bb05ac100 Binary files /dev/null and b/resources/builtin/projects/v3/experimental.png differ diff --git a/resources/builtin/projects/v3/flag.png b/resources/builtin/projects/v3/flag.png new file mode 100644 index 0000000000..c7d2563115 Binary files /dev/null and b/resources/builtin/projects/v3/flag.png differ diff --git a/resources/builtin/projects/v3/folder.png b/resources/builtin/projects/v3/folder.png new file mode 100644 index 0000000000..cac0f9fbfa Binary files /dev/null and b/resources/builtin/projects/v3/folder.png differ diff --git a/resources/builtin/projects/v3/gears.png b/resources/builtin/projects/v3/gears.png new file mode 100644 index 0000000000..ecbef1a9cf Binary files /dev/null and b/resources/builtin/projects/v3/gears.png differ diff --git a/resources/builtin/projects/v3/gold.png b/resources/builtin/projects/v3/gold.png new file mode 100644 index 0000000000..630f45bc61 Binary files /dev/null and b/resources/builtin/projects/v3/gold.png differ diff --git a/resources/builtin/projects/v3/home.png b/resources/builtin/projects/v3/home.png new file mode 100644 index 0000000000..808d639f0d Binary files /dev/null and b/resources/builtin/projects/v3/home.png differ diff --git a/resources/builtin/projects/v3/library.png b/resources/builtin/projects/v3/library.png new file mode 100644 index 0000000000..1f9ea1a64a Binary files /dev/null and b/resources/builtin/projects/v3/library.png differ diff --git a/resources/builtin/projects/v3/lightbulb.png b/resources/builtin/projects/v3/lightbulb.png new file mode 100644 index 0000000000..1aba0d32f3 Binary files /dev/null and b/resources/builtin/projects/v3/lightbulb.png differ diff --git a/resources/builtin/projects/v3/lock.png b/resources/builtin/projects/v3/lock.png new file mode 100644 index 0000000000..839cb1e5bf Binary files /dev/null and b/resources/builtin/projects/v3/lock.png differ diff --git a/resources/builtin/projects/v3/mail.png b/resources/builtin/projects/v3/mail.png new file mode 100644 index 0000000000..17f91ea881 Binary files /dev/null and b/resources/builtin/projects/v3/mail.png differ diff --git a/resources/builtin/projects/v3/manage.png b/resources/builtin/projects/v3/manage.png new file mode 100644 index 0000000000..7804360a29 Binary files /dev/null and b/resources/builtin/projects/v3/manage.png differ diff --git a/resources/builtin/projects/v3/marker.png b/resources/builtin/projects/v3/marker.png new file mode 100644 index 0000000000..c2c753a006 Binary files /dev/null and b/resources/builtin/projects/v3/marker.png differ diff --git a/resources/builtin/projects/v3/mobile.png b/resources/builtin/projects/v3/mobile.png new file mode 100644 index 0000000000..fbb1985015 Binary files /dev/null and b/resources/builtin/projects/v3/mobile.png differ diff --git a/resources/builtin/projects/v3/one-server.png b/resources/builtin/projects/v3/one-server.png new file mode 100644 index 0000000000..d8fbff8a17 Binary files /dev/null and b/resources/builtin/projects/v3/one-server.png differ diff --git a/resources/builtin/projects/v3/organization.png b/resources/builtin/projects/v3/organization.png new file mode 100644 index 0000000000..1957dd8e68 Binary files /dev/null and b/resources/builtin/projects/v3/organization.png differ diff --git a/resources/builtin/projects/v3/people.png b/resources/builtin/projects/v3/people.png new file mode 100644 index 0000000000..5bb42656df Binary files /dev/null and b/resources/builtin/projects/v3/people.png differ diff --git a/resources/builtin/projects/v3/piechart.png b/resources/builtin/projects/v3/piechart.png new file mode 100644 index 0000000000..4c707ed6ff Binary files /dev/null and b/resources/builtin/projects/v3/piechart.png differ diff --git a/resources/builtin/projects/v3/police-badge.png b/resources/builtin/projects/v3/police-badge.png new file mode 100644 index 0000000000..8b729bc35a Binary files /dev/null and b/resources/builtin/projects/v3/police-badge.png differ diff --git a/resources/builtin/projects/v3/purchase-order.png b/resources/builtin/projects/v3/purchase-order.png new file mode 100644 index 0000000000..906d72a529 Binary files /dev/null and b/resources/builtin/projects/v3/purchase-order.png differ diff --git a/resources/builtin/projects/v3/robot.png b/resources/builtin/projects/v3/robot.png new file mode 100644 index 0000000000..317544f2dd Binary files /dev/null and b/resources/builtin/projects/v3/robot.png differ diff --git a/resources/builtin/projects/v3/rocket.png b/resources/builtin/projects/v3/rocket.png new file mode 100644 index 0000000000..f5a758ff81 Binary files /dev/null and b/resources/builtin/projects/v3/rocket.png differ diff --git a/resources/builtin/projects/v3/server-documentation.png b/resources/builtin/projects/v3/server-documentation.png new file mode 100644 index 0000000000..d71dd53b72 Binary files /dev/null and b/resources/builtin/projects/v3/server-documentation.png differ diff --git a/resources/builtin/projects/v3/servers.png b/resources/builtin/projects/v3/servers.png new file mode 100644 index 0000000000..df20dd6492 Binary files /dev/null and b/resources/builtin/projects/v3/servers.png differ diff --git a/resources/builtin/projects/v3/shield.png b/resources/builtin/projects/v3/shield.png new file mode 100644 index 0000000000..fd938307fd Binary files /dev/null and b/resources/builtin/projects/v3/shield.png differ diff --git a/resources/builtin/projects/v3/silver.png b/resources/builtin/projects/v3/silver.png new file mode 100644 index 0000000000..afe0e84b35 Binary files /dev/null and b/resources/builtin/projects/v3/silver.png differ diff --git a/resources/builtin/projects/v3/sitemap.png b/resources/builtin/projects/v3/sitemap.png new file mode 100644 index 0000000000..8ee6e232b4 Binary files /dev/null and b/resources/builtin/projects/v3/sitemap.png differ diff --git a/resources/builtin/projects/v3/support.png b/resources/builtin/projects/v3/support.png new file mode 100644 index 0000000000..88a9746708 Binary files /dev/null and b/resources/builtin/projects/v3/support.png differ diff --git a/resources/builtin/projects/v3/sword.png b/resources/builtin/projects/v3/sword.png new file mode 100644 index 0000000000..30040633fd Binary files /dev/null and b/resources/builtin/projects/v3/sword.png differ diff --git a/resources/builtin/projects/v3/tag.png b/resources/builtin/projects/v3/tag.png new file mode 100644 index 0000000000..c91bac473a Binary files /dev/null and b/resources/builtin/projects/v3/tag.png differ diff --git a/resources/builtin/projects/v3/three-servers.png b/resources/builtin/projects/v3/three-servers.png new file mode 100644 index 0000000000..3361d8967b Binary files /dev/null and b/resources/builtin/projects/v3/three-servers.png differ diff --git a/resources/builtin/projects/v3/trash.png b/resources/builtin/projects/v3/trash.png new file mode 100644 index 0000000000..ce3f557d44 Binary files /dev/null and b/resources/builtin/projects/v3/trash.png differ diff --git a/resources/builtin/projects/v3/truck.png b/resources/builtin/projects/v3/truck.png new file mode 100644 index 0000000000..3c903ea58b Binary files /dev/null and b/resources/builtin/projects/v3/truck.png differ diff --git a/resources/builtin/projects/v3/two-servers.png b/resources/builtin/projects/v3/two-servers.png new file mode 100644 index 0000000000..d5d408d9ad Binary files /dev/null and b/resources/builtin/projects/v3/two-servers.png differ diff --git a/resources/builtin/projects/v3/umbrella.png b/resources/builtin/projects/v3/umbrella.png new file mode 100644 index 0000000000..98c7c12365 Binary files /dev/null and b/resources/builtin/projects/v3/umbrella.png differ diff --git a/resources/builtin/projects/v3/upload.png b/resources/builtin/projects/v3/upload.png new file mode 100644 index 0000000000..13e33507bb Binary files /dev/null and b/resources/builtin/projects/v3/upload.png differ diff --git a/resources/builtin/projects/v3/wand.png b/resources/builtin/projects/v3/wand.png new file mode 100644 index 0000000000..6de1cb55ab Binary files /dev/null and b/resources/builtin/projects/v3/wand.png differ diff --git a/resources/builtin/repo/building.png b/resources/builtin/repo/building.png new file mode 100644 index 0000000000..d3ab581fe8 Binary files /dev/null and b/resources/builtin/repo/building.png differ diff --git a/resources/builtin/repo/cloud.png b/resources/builtin/repo/cloud.png new file mode 100644 index 0000000000..51a40d6cbe Binary files /dev/null and b/resources/builtin/repo/cloud.png differ diff --git a/resources/builtin/repo/code.png b/resources/builtin/repo/code.png new file mode 100644 index 0000000000..aeedf4a6ce Binary files /dev/null and b/resources/builtin/repo/code.png differ diff --git a/resources/builtin/repo/commit.png b/resources/builtin/repo/commit.png new file mode 100644 index 0000000000..e6d251f095 Binary files /dev/null and b/resources/builtin/repo/commit.png differ diff --git a/resources/builtin/repo/database.png b/resources/builtin/repo/database.png new file mode 100644 index 0000000000..4c9ec543fa Binary files /dev/null and b/resources/builtin/repo/database.png differ diff --git a/resources/builtin/repo/desktop.png b/resources/builtin/repo/desktop.png new file mode 100644 index 0000000000..f75cc54e43 Binary files /dev/null and b/resources/builtin/repo/desktop.png differ diff --git a/resources/builtin/repo/gears.png b/resources/builtin/repo/gears.png new file mode 100644 index 0000000000..ecbef1a9cf Binary files /dev/null and b/resources/builtin/repo/gears.png differ diff --git a/resources/builtin/repo/globe.png b/resources/builtin/repo/globe.png new file mode 100644 index 0000000000..b9ca72ffa2 Binary files /dev/null and b/resources/builtin/repo/globe.png differ diff --git a/resources/builtin/repo/locked.png b/resources/builtin/repo/locked.png new file mode 100644 index 0000000000..34074731a0 Binary files /dev/null and b/resources/builtin/repo/locked.png differ diff --git a/resources/builtin/repo/microchip.png b/resources/builtin/repo/microchip.png new file mode 100644 index 0000000000..25da5810de Binary files /dev/null and b/resources/builtin/repo/microchip.png differ diff --git a/resources/builtin/repo/mobile.png b/resources/builtin/repo/mobile.png new file mode 100644 index 0000000000..5c59ad9b07 Binary files /dev/null and b/resources/builtin/repo/mobile.png differ diff --git a/resources/builtin/repo/repo-git.png b/resources/builtin/repo/repo-git.png new file mode 100644 index 0000000000..b8dfed8ad2 Binary files /dev/null and b/resources/builtin/repo/repo-git.png differ diff --git a/resources/builtin/repo/repo-hg.png b/resources/builtin/repo/repo-hg.png new file mode 100644 index 0000000000..d12c2e5339 Binary files /dev/null and b/resources/builtin/repo/repo-hg.png differ diff --git a/resources/builtin/repo/repo-svn.png b/resources/builtin/repo/repo-svn.png new file mode 100644 index 0000000000..702f36e794 Binary files /dev/null and b/resources/builtin/repo/repo-svn.png differ diff --git a/resources/builtin/repo/repo.png b/resources/builtin/repo/repo.png new file mode 100644 index 0000000000..b3706f91bb Binary files /dev/null and b/resources/builtin/repo/repo.png differ diff --git a/resources/builtin/repo/servers.png b/resources/builtin/repo/servers.png new file mode 100644 index 0000000000..3adb8a2fcd Binary files /dev/null and b/resources/builtin/repo/servers.png differ diff --git a/resources/builtin/user0.png b/resources/builtin/user0.png new file mode 100644 index 0000000000..7d2514eca6 Binary files /dev/null and b/resources/builtin/user0.png differ diff --git a/resources/builtin/user1.png b/resources/builtin/user1.png new file mode 100644 index 0000000000..4c9860f79a Binary files /dev/null and b/resources/builtin/user1.png differ diff --git a/resources/builtin/user2.png b/resources/builtin/user2.png new file mode 100644 index 0000000000..7ee5ac105a Binary files /dev/null and b/resources/builtin/user2.png differ diff --git a/resources/builtin/user3.png b/resources/builtin/user3.png new file mode 100644 index 0000000000..502ac68d89 Binary files /dev/null and b/resources/builtin/user3.png differ diff --git a/resources/builtin/user4.png b/resources/builtin/user4.png new file mode 100644 index 0000000000..ebe68205ad Binary files /dev/null and b/resources/builtin/user4.png differ diff --git a/resources/builtin/user5.png b/resources/builtin/user5.png new file mode 100644 index 0000000000..b8e988d6c3 Binary files /dev/null and b/resources/builtin/user5.png differ diff --git a/resources/builtin/user6.png b/resources/builtin/user6.png new file mode 100644 index 0000000000..4357427338 Binary files /dev/null and b/resources/builtin/user6.png differ diff --git a/resources/builtin/user7.png b/resources/builtin/user7.png new file mode 100644 index 0000000000..cf19a42fe6 Binary files /dev/null and b/resources/builtin/user7.png differ diff --git a/resources/builtin/user8.png b/resources/builtin/user8.png new file mode 100644 index 0000000000..5f060aa3b2 Binary files /dev/null and b/resources/builtin/user8.png differ diff --git a/resources/builtin/user9.png b/resources/builtin/user9.png new file mode 100644 index 0000000000..bcf4ac1ac3 Binary files /dev/null and b/resources/builtin/user9.png differ diff --git a/resources/celerity/map.php b/resources/celerity/map.php new file mode 100644 index 0000000000..c29df70b1e --- /dev/null +++ b/resources/celerity/map.php @@ -0,0 +1,2443 @@ + array( + 'conpherence.pkg.css' => '0e3cf785', + 'conpherence.pkg.js' => '020aebcf', + 'core.pkg.css' => 'b816811e', + 'core.pkg.js' => 'd2de90d9', + 'dark-console.pkg.js' => '187792c2', + 'differential.pkg.css' => 'ffb69e3d', + 'differential.pkg.js' => 'c60bec1b', + 'diffusion.pkg.css' => '42c75c37', + 'diffusion.pkg.js' => '78c9885d', + 'maniphest.pkg.css' => '35995d6d', + 'maniphest.pkg.js' => 'c9308721', + 'rsrc/audio/basic/alert.mp3' => '17889334', + 'rsrc/audio/basic/bing.mp3' => 'a817a0c3', + 'rsrc/audio/basic/pock.mp3' => '0fa843d0', + 'rsrc/audio/basic/tap.mp3' => '02d16994', + 'rsrc/audio/basic/ting.mp3' => 'a6b6540e', + 'rsrc/css/aphront/aphront-bars.css' => '4a327b4a', + 'rsrc/css/aphront/dark-console.css' => '7f06cda2', + 'rsrc/css/aphront/dialog-view.css' => '6f4ea703', + 'rsrc/css/aphront/list-filter-view.css' => 'feb64255', + 'rsrc/css/aphront/multi-column.css' => 'fbc00ba3', + 'rsrc/css/aphront/notification.css' => '30240bd2', + 'rsrc/css/aphront/panel-view.css' => '46923d46', + 'rsrc/css/aphront/phabricator-nav-view.css' => '423f92cc', + 'rsrc/css/aphront/table-view.css' => '0bb61df1', + 'rsrc/css/aphront/tokenizer.css' => '34e2a838', + 'rsrc/css/aphront/tooltip.css' => 'e3f2412f', + 'rsrc/css/aphront/typeahead-browse.css' => 'b7ed02d2', + 'rsrc/css/aphront/typeahead.css' => '8779483d', + 'rsrc/css/application/almanac/almanac.css' => '2e050f4f', + 'rsrc/css/application/auth/auth.css' => 'c2f23d74', + 'rsrc/css/application/base/main-menu-view.css' => 'bcec20f0', + 'rsrc/css/application/base/notification-menu.css' => '4df1ee30', + 'rsrc/css/application/base/phui-theme.css' => '35883b37', + 'rsrc/css/application/base/standard-page-view.css' => 'a374f94c', + 'rsrc/css/application/chatlog/chatlog.css' => 'abdc76ee', + 'rsrc/css/application/conduit/conduit-api.css' => 'ce2cfc41', + 'rsrc/css/application/config/config-options.css' => '16c920ae', + 'rsrc/css/application/config/config-template.css' => '20babf50', + 'rsrc/css/application/config/setup-issue.css' => '5eed85b2', + 'rsrc/css/application/config/unhandled-exception.css' => '9ecfc00d', + 'rsrc/css/application/conpherence/color.css' => 'b17746b0', + 'rsrc/css/application/conpherence/durable-column.css' => '2d57072b', + 'rsrc/css/application/conpherence/header-pane.css' => 'c9a3db8e', + 'rsrc/css/application/conpherence/menu.css' => '67f4680d', + 'rsrc/css/application/conpherence/message-pane.css' => 'd244db1e', + 'rsrc/css/application/conpherence/notification.css' => '6a3d4e58', + 'rsrc/css/application/conpherence/participant-pane.css' => '69e0058a', + 'rsrc/css/application/conpherence/transaction.css' => '3a3f5e7e', + 'rsrc/css/application/contentsource/content-source-view.css' => 'cdf0d579', + 'rsrc/css/application/countdown/timer.css' => 'bff8012f', + 'rsrc/css/application/daemon/bulk-job.css' => '73af99f5', + 'rsrc/css/application/dashboard/dashboard.css' => '5a205b9d', + 'rsrc/css/application/diff/diff-tree-view.css' => 'e2d3e222', + 'rsrc/css/application/diff/inline-comment-summary.css' => '81eb368d', + 'rsrc/css/application/differential/add-comment.css' => '7e5900d9', + 'rsrc/css/application/differential/changeset-view.css' => '60c3d405', + 'rsrc/css/application/differential/core.css' => '7300a73e', + 'rsrc/css/application/differential/phui-inline-comment.css' => '9863a85e', + 'rsrc/css/application/differential/revision-comment.css' => '7dbc8d1d', + 'rsrc/css/application/differential/revision-history.css' => '237a2979', + 'rsrc/css/application/differential/revision-list.css' => '93d2df7d', + 'rsrc/css/application/differential/table-of-contents.css' => 'bba788b9', + 'rsrc/css/application/diffusion/diffusion-icons.css' => '23b31a1b', + 'rsrc/css/application/diffusion/diffusion-readme.css' => 'b68a76e4', + 'rsrc/css/application/diffusion/diffusion-repository.css' => 'b89e8c6c', + 'rsrc/css/application/diffusion/diffusion.css' => 'e46232d6', + 'rsrc/css/application/feed/feed.css' => 'd8b6e3f8', + 'rsrc/css/application/files/global-drag-and-drop.css' => '1d2713a4', + 'rsrc/css/application/flag/flag.css' => '2b77be8d', + 'rsrc/css/application/harbormaster/harbormaster.css' => '8dfe16b2', + 'rsrc/css/application/herald/herald-test.css' => '7e7bbdae', + 'rsrc/css/application/herald/herald.css' => '648d39e2', + 'rsrc/css/application/maniphest/report.css' => '3d53188b', + 'rsrc/css/application/maniphest/task-edit.css' => '272daa84', + 'rsrc/css/application/maniphest/task-summary.css' => '61d1667e', + 'rsrc/css/application/objectselector/object-selector.css' => 'ee77366f', + 'rsrc/css/application/owners/owners-path-editor.css' => 'fa7c13ef', + 'rsrc/css/application/paste/paste.css' => 'b37bcd38', + 'rsrc/css/application/people/people-picture-menu-item.css' => 'fe8e07cf', + 'rsrc/css/application/people/people-profile.css' => '2ea2daa1', + 'rsrc/css/application/phame/phame.css' => 'bb442327', + 'rsrc/css/application/pholio/pholio-edit.css' => '4df55b3b', + 'rsrc/css/application/pholio/pholio-inline-comments.css' => '722b48c2', + 'rsrc/css/application/pholio/pholio.css' => '88ef5ef1', + 'rsrc/css/application/phortune/phortune-credit-card-form.css' => '3b9868a8', + 'rsrc/css/application/phortune/phortune-invoice.css' => '4436b241', + 'rsrc/css/application/phortune/phortune.css' => '508a1a5e', + 'rsrc/css/application/phrequent/phrequent.css' => 'bd79cc67', + 'rsrc/css/application/phriction/phriction-document-css.css' => '03380da0', + 'rsrc/css/application/policy/policy-edit.css' => '8794e2ed', + 'rsrc/css/application/policy/policy-transaction-detail.css' => 'c02b8384', + 'rsrc/css/application/policy/policy.css' => 'ceb56a08', + 'rsrc/css/application/ponder/ponder-view.css' => '05a09d0a', + 'rsrc/css/application/project/project-card-view.css' => 'a9f2c2dd', + 'rsrc/css/application/project/project-triggers.css' => 'cd9c8bb9', + 'rsrc/css/application/project/project-view.css' => '567858b3', + 'rsrc/css/application/search/application-search-view.css' => '0f7c06d8', + 'rsrc/css/application/search/search-results.css' => '9ea70ace', + 'rsrc/css/application/slowvote/slowvote.css' => '1694baed', + 'rsrc/css/application/tokens/tokens.css' => 'ce5a50bd', + 'rsrc/css/application/uiexample/example.css' => 'b4795059', + 'rsrc/css/core/core.css' => 'b3ebd90d', + 'rsrc/css/core/remarkup.css' => '5baa3bd9', + 'rsrc/css/core/syntax.css' => '548567f6', + 'rsrc/css/core/z-index.css' => 'ac3bfcd4', + 'rsrc/css/diviner/diviner-shared.css' => '4bd263b0', + 'rsrc/css/font/font-awesome.css' => '3883938a', + 'rsrc/css/font/font-lato.css' => '23631304', + 'rsrc/css/font/phui-font-icon-base.css' => '303c9b87', + 'rsrc/css/fuel/fuel-grid.css' => '66697240', + 'rsrc/css/fuel/fuel-handle-list.css' => '2c4cbeca', + 'rsrc/css/fuel/fuel-map.css' => 'd6e31510', + 'rsrc/css/fuel/fuel-menu.css' => '21f5d199', + 'rsrc/css/layout/phabricator-source-code-view.css' => '03d7ac28', + 'rsrc/css/phui/button/phui-button-bar.css' => 'a4aa75c4', + 'rsrc/css/phui/button/phui-button-simple.css' => '1ff278aa', + 'rsrc/css/phui/button/phui-button.css' => 'ea704902', + 'rsrc/css/phui/calendar/phui-calendar-day.css' => '9597d706', + 'rsrc/css/phui/calendar/phui-calendar-list.css' => 'ccd7e4e2', + 'rsrc/css/phui/calendar/phui-calendar-month.css' => 'cb758c42', + 'rsrc/css/phui/calendar/phui-calendar.css' => 'f11073aa', + 'rsrc/css/phui/object-item/phui-oi-big-ui.css' => 'fa74cc35', + 'rsrc/css/phui/object-item/phui-oi-color.css' => 'b517bfa0', + 'rsrc/css/phui/object-item/phui-oi-drag-ui.css' => 'da15d3dc', + 'rsrc/css/phui/object-item/phui-oi-flush-ui.css' => '490e2e2e', + 'rsrc/css/phui/object-item/phui-oi-list-view.css' => 'af98a277', + 'rsrc/css/phui/object-item/phui-oi-simple-ui.css' => '6a30fa46', + 'rsrc/css/phui/phui-action-list.css' => '1b0085b2', + 'rsrc/css/phui/phui-action-panel.css' => '6c386cbf', + 'rsrc/css/phui/phui-badge.css' => '666e25ad', + 'rsrc/css/phui/phui-basic-nav-view.css' => '56ebd66d', + 'rsrc/css/phui/phui-big-info-view.css' => '362ad37b', + 'rsrc/css/phui/phui-box.css' => '5ed3b8cb', + 'rsrc/css/phui/phui-bulk-editor.css' => '374d5e30', + 'rsrc/css/phui/phui-chart.css' => '14df9ae3', + 'rsrc/css/phui/phui-cms.css' => '8c05c41e', + 'rsrc/css/phui/phui-comment-form.css' => '68a2d99a', + 'rsrc/css/phui/phui-comment-panel.css' => 'ec4e31c0', + 'rsrc/css/phui/phui-crumbs-view.css' => '614f43cf', + 'rsrc/css/phui/phui-curtain-object-ref-view.css' => '51d93266', + 'rsrc/css/phui/phui-curtain-view.css' => '68c5efb6', + 'rsrc/css/phui/phui-document-pro.css' => 'b9613a10', + 'rsrc/css/phui/phui-document-summary.css' => 'b068eed1', + 'rsrc/css/phui/phui-document.css' => '52b748a5', + 'rsrc/css/phui/phui-feed-story.css' => 'a0c05029', + 'rsrc/css/phui/phui-fontkit.css' => '1ec937e5', + 'rsrc/css/phui/phui-form-view.css' => '01b796c0', + 'rsrc/css/phui/phui-form.css' => '1f177cb7', + 'rsrc/css/phui/phui-formation-view.css' => 'd2dec8ed', + 'rsrc/css/phui/phui-head-thing.css' => 'd7f293df', + 'rsrc/css/phui/phui-header-view.css' => '36c86a58', + 'rsrc/css/phui/phui-hovercard.css' => '6ca90fa0', + 'rsrc/css/phui/phui-icon-set-selector.css' => '7aa5f3ec', + 'rsrc/css/phui/phui-icon.css' => '4cbc684a', + 'rsrc/css/phui/phui-image-mask.css' => '62c7f4d2', + 'rsrc/css/phui/phui-info-view.css' => 'a10a909b', + 'rsrc/css/phui/phui-invisible-character-view.css' => 'c694c4a4', + 'rsrc/css/phui/phui-left-right.css' => '68513c34', + 'rsrc/css/phui/phui-lightbox.css' => '4ebf22da', + 'rsrc/css/phui/phui-list.css' => '0c04affd', + 'rsrc/css/phui/phui-object-box.css' => 'b8d7eea0', + 'rsrc/css/phui/phui-pager.css' => 'd022c7ad', + 'rsrc/css/phui/phui-pinboard-view.css' => '1f08f5d8', + 'rsrc/css/phui/phui-policy-section-view.css' => '139fdc64', + 'rsrc/css/phui/phui-property-list-view.css' => '5adf7078', + 'rsrc/css/phui/phui-remarkup-preview.css' => '91767007', + 'rsrc/css/phui/phui-segment-bar-view.css' => '5166b370', + 'rsrc/css/phui/phui-spacing.css' => 'b05cadc3', + 'rsrc/css/phui/phui-status.css' => '293b5dad', + 'rsrc/css/phui/phui-tag-view.css' => 'fb811341', + 'rsrc/css/phui/phui-timeline-view.css' => '2d32d7a9', + 'rsrc/css/phui/phui-two-column-view.css' => 'f96d319f', + 'rsrc/css/phui/workboards/phui-workboard-color.css' => 'e86de308', + 'rsrc/css/phui/workboards/phui-workboard.css' => '74fc9d98', + 'rsrc/css/phui/workboards/phui-workcard.css' => '913441b6', + 'rsrc/css/phui/workboards/phui-workpanel.css' => '3ae89b20', + 'rsrc/css/sprite-login.css' => '18b368a6', + 'rsrc/css/sprite-tokens.css' => 'f1896dc5', + 'rsrc/css/syntax/syntax-default.css' => '055fc231', + 'rsrc/externals/d3/d3.min.js' => '9d068042', + 'rsrc/externals/font/fontawesome/fontawesome-webfont.eot' => '23f8c698', + 'rsrc/externals/font/fontawesome/fontawesome-webfont.ttf' => '70983df0', + 'rsrc/externals/font/fontawesome/fontawesome-webfont.woff' => 'cd02f93b', + 'rsrc/externals/font/fontawesome/fontawesome-webfont.woff2' => '351fd46a', + 'rsrc/externals/font/lato/lato-bold.eot' => '7367aa5e', + 'rsrc/externals/font/lato/lato-bold.svg' => '681aa4f5', + 'rsrc/externals/font/lato/lato-bold.ttf' => '66d3c296', + 'rsrc/externals/font/lato/lato-bold.woff' => '89d9fba7', + 'rsrc/externals/font/lato/lato-bold.woff2' => '389fcdb1', + 'rsrc/externals/font/lato/lato-bolditalic.eot' => '03eeb4da', + 'rsrc/externals/font/lato/lato-bolditalic.svg' => 'f56fa11c', + 'rsrc/externals/font/lato/lato-bolditalic.ttf' => '9c3aec21', + 'rsrc/externals/font/lato/lato-bolditalic.woff' => 'bfbd0616', + 'rsrc/externals/font/lato/lato-bolditalic.woff2' => 'bc7d1274', + 'rsrc/externals/font/lato/lato-italic.eot' => '7db5b247', + 'rsrc/externals/font/lato/lato-italic.svg' => 'b1ae496f', + 'rsrc/externals/font/lato/lato-italic.ttf' => '43eed813', + 'rsrc/externals/font/lato/lato-italic.woff' => 'c28975e1', + 'rsrc/externals/font/lato/lato-italic.woff2' => 'fffc0d8c', + 'rsrc/externals/font/lato/lato-regular.eot' => '06e0c291', + 'rsrc/externals/font/lato/lato-regular.svg' => '3ad95f53', + 'rsrc/externals/font/lato/lato-regular.ttf' => 'e2e9c398', + 'rsrc/externals/font/lato/lato-regular.woff' => '0b13d332', + 'rsrc/externals/font/lato/lato-regular.woff2' => '8f846797', + 'rsrc/externals/javelin/core/Event.js' => 'c03f2fb4', + 'rsrc/externals/javelin/core/Stratcom.js' => '0889b835', + 'rsrc/externals/javelin/core/__tests__/event-stop-and-kill.js' => '048472d2', + 'rsrc/externals/javelin/core/__tests__/install.js' => '14a7e671', + 'rsrc/externals/javelin/core/__tests__/stratcom.js' => 'a28464bb', + 'rsrc/externals/javelin/core/__tests__/util.js' => 'e29a4354', + 'rsrc/externals/javelin/core/init.js' => '98e6504a', + 'rsrc/externals/javelin/core/init_node.js' => '16961339', + 'rsrc/externals/javelin/core/install.js' => '5902260c', + 'rsrc/externals/javelin/core/util.js' => 'edb4d8c9', + 'rsrc/externals/javelin/docs/Base.js' => '5a401d7d', + 'rsrc/externals/javelin/docs/onload.js' => 'ee58fb62', + 'rsrc/externals/javelin/ext/fx/Color.js' => '78f811c9', + 'rsrc/externals/javelin/ext/fx/FX.js' => '34450586', + 'rsrc/externals/javelin/ext/reactor/core/DynVal.js' => '202a2e85', + 'rsrc/externals/javelin/ext/reactor/core/Reactor.js' => '1c850a26', + 'rsrc/externals/javelin/ext/reactor/core/ReactorNode.js' => '72960bc1', + 'rsrc/externals/javelin/ext/reactor/core/ReactorNodeCalmer.js' => '225bbb98', + 'rsrc/externals/javelin/ext/reactor/dom/RDOM.js' => '6cfa0008', + 'rsrc/externals/javelin/ext/view/HTMLView.js' => 'f8c4e135', + 'rsrc/externals/javelin/ext/view/View.js' => '289bf236', + 'rsrc/externals/javelin/ext/view/ViewInterpreter.js' => '876506b6', + 'rsrc/externals/javelin/ext/view/ViewPlaceholder.js' => 'a9942052', + 'rsrc/externals/javelin/ext/view/ViewRenderer.js' => '9aae2b66', + 'rsrc/externals/javelin/ext/view/ViewVisitor.js' => '308f9fe4', + 'rsrc/externals/javelin/ext/view/__tests__/HTMLView.js' => '6e50a13f', + 'rsrc/externals/javelin/ext/view/__tests__/View.js' => 'd284be5d', + 'rsrc/externals/javelin/ext/view/__tests__/ViewInterpreter.js' => 'a9f35511', + 'rsrc/externals/javelin/ext/view/__tests__/ViewRenderer.js' => '3a1b81f6', + 'rsrc/externals/javelin/lib/Cookie.js' => '05d290ef', + 'rsrc/externals/javelin/lib/DOM.js' => 'e4c7622a', + 'rsrc/externals/javelin/lib/History.js' => '030b4f7a', + 'rsrc/externals/javelin/lib/JSON.js' => '541f81c3', + 'rsrc/externals/javelin/lib/Leader.js' => '0d2490ce', + 'rsrc/externals/javelin/lib/Mask.js' => '7c4d8998', + 'rsrc/externals/javelin/lib/Quicksand.js' => 'd3799cb4', + 'rsrc/externals/javelin/lib/Request.js' => '84e6891f', + 'rsrc/externals/javelin/lib/Resource.js' => '20514cc2', + 'rsrc/externals/javelin/lib/Routable.js' => '6a18c42e', + 'rsrc/externals/javelin/lib/Router.js' => '32755edb', + 'rsrc/externals/javelin/lib/Scrollbar.js' => 'a43ae2ae', + 'rsrc/externals/javelin/lib/Sound.js' => 'd4cc2d2a', + 'rsrc/externals/javelin/lib/URI.js' => '2e255291', + 'rsrc/externals/javelin/lib/Vector.js' => 'e9c80beb', + 'rsrc/externals/javelin/lib/WebSocket.js' => 'fdc13e4e', + 'rsrc/externals/javelin/lib/Workflow.js' => '945ff654', + 'rsrc/externals/javelin/lib/__tests__/Cookie.js' => 'ca686f71', + 'rsrc/externals/javelin/lib/__tests__/DOM.js' => '4566e249', + 'rsrc/externals/javelin/lib/__tests__/JSON.js' => '710377ae', + 'rsrc/externals/javelin/lib/__tests__/URI.js' => '6fff0c2b', + 'rsrc/externals/javelin/lib/__tests__/behavior.js' => '8426ebeb', + 'rsrc/externals/javelin/lib/behavior.js' => '1b6acc2a', + 'rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js' => '89a1ae3a', + 'rsrc/externals/javelin/lib/control/typeahead/Typeahead.js' => 'a4356cde', + 'rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js' => 'a241536a', + 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js' => '22ee68a5', + 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js' => '23387297', + 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js' => '5a79f6c3', + 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js' => '8badee71', + 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js' => '80bff3af', + 'rsrc/favicons/favicon-16x16.png' => '4c51a03a', + 'rsrc/favicons/mask-icon.svg' => 'db699fe1', + 'rsrc/image/BFCFDA.png' => '74b5c88b', + 'rsrc/image/actions/edit.png' => 'fd987dff', + 'rsrc/image/avatar.png' => '0d17c6c4', + 'rsrc/image/checker_dark.png' => '7fc8fa7b', + 'rsrc/image/checker_light.png' => '3157a202', + 'rsrc/image/checker_lighter.png' => 'c45928c1', + 'rsrc/image/chevron-in.png' => '1aa2f88f', + 'rsrc/image/chevron-out.png' => 'c815e272', + 'rsrc/image/controls/checkbox-checked.png' => '1770d7a0', + 'rsrc/image/controls/checkbox-unchecked.png' => 'e1deba0a', + 'rsrc/image/d5d8e1.png' => '6764616e', + 'rsrc/image/darkload.gif' => '5bd41a89', + 'rsrc/image/divot.png' => '0fbe2453', + 'rsrc/image/examples/hero.png' => '5d8c4b21', + 'rsrc/image/grippy_texture.png' => 'a7d222b5', + 'rsrc/image/icon/fatcow/arrow_branch.png' => '98149d9f', + 'rsrc/image/icon/fatcow/arrow_merge.png' => 'e142f4f8', + 'rsrc/image/icon/fatcow/calendar_edit.png' => '5ff44a08', + 'rsrc/image/icon/fatcow/document_black.png' => 'd3515fa5', + 'rsrc/image/icon/fatcow/flag_blue.png' => '54db2e5c', + 'rsrc/image/icon/fatcow/flag_finish.png' => '2953a51b', + 'rsrc/image/icon/fatcow/flag_ghost.png' => '7d9ada92', + 'rsrc/image/icon/fatcow/flag_green.png' => '010f7161', + 'rsrc/image/icon/fatcow/flag_orange.png' => '6c384ca5', + 'rsrc/image/icon/fatcow/flag_pink.png' => '11ac6b12', + 'rsrc/image/icon/fatcow/flag_purple.png' => 'c4f423a4', + 'rsrc/image/icon/fatcow/flag_red.png' => '9e6d8817', + 'rsrc/image/icon/fatcow/flag_yellow.png' => '906733f4', + 'rsrc/image/icon/fatcow/key_question.png' => 'c10c26db', + 'rsrc/image/icon/fatcow/link.png' => '8edbf327', + 'rsrc/image/icon/fatcow/page_white_edit.png' => '17ef5625', + 'rsrc/image/icon/fatcow/page_white_put.png' => '82430c91', + 'rsrc/image/icon/fatcow/source/conduit.png' => '5b55130c', + 'rsrc/image/icon/fatcow/source/email.png' => '8a32b77f', + 'rsrc/image/icon/fatcow/source/fax.png' => '8bc2a49b', + 'rsrc/image/icon/fatcow/source/mobile.png' => '0a918412', + 'rsrc/image/icon/fatcow/source/tablet.png' => 'fc50b050', + 'rsrc/image/icon/fatcow/source/web.png' => '70433af3', + 'rsrc/image/icon/subscribe.png' => '07ef454e', + 'rsrc/image/icon/tango/attachment.png' => 'bac9032d', + 'rsrc/image/icon/tango/edit.png' => 'e6296206', + 'rsrc/image/icon/tango/go-down.png' => '0b903712', + 'rsrc/image/icon/tango/log.png' => '86b6a6f4', + 'rsrc/image/icon/tango/upload.png' => '3fe6b92d', + 'rsrc/image/icon/unsubscribe.png' => 'db04378a', + 'rsrc/image/lightblue-header.png' => 'e6d483c6', + 'rsrc/image/logo/light-eye.png' => '72337472', + 'rsrc/image/main_texture.png' => '894d03c4', + 'rsrc/image/menu_texture.png' => '896c9ade', + 'rsrc/image/people/harding.png' => '95b2db63', + 'rsrc/image/people/jefferson.png' => 'e883a3a2', + 'rsrc/image/people/lincoln.png' => 'be2c07c5', + 'rsrc/image/people/mckinley.png' => '6af510a0', + 'rsrc/image/people/taft.png' => 'b15ab07e', + 'rsrc/image/people/user0.png' => '4bc64b40', + 'rsrc/image/people/user1.png' => '8063f445', + 'rsrc/image/people/user2.png' => 'd28246c0', + 'rsrc/image/people/user3.png' => 'fb1ac12d', + 'rsrc/image/people/user4.png' => 'fe4fac8f', + 'rsrc/image/people/user5.png' => '3d07065c', + 'rsrc/image/people/user6.png' => 'e4bd47c8', + 'rsrc/image/people/user7.png' => '71d8fe8b', + 'rsrc/image/people/user8.png' => '85f86bf7', + 'rsrc/image/people/user9.png' => '523db8aa', + 'rsrc/image/people/washington.png' => '86159e68', + 'rsrc/image/phrequent_active.png' => 'de66dc50', + 'rsrc/image/phrequent_inactive.png' => '79c61baf', + 'rsrc/image/resize.png' => '9cc83373', + 'rsrc/image/sprite-login-X2.png' => '604545f6', + 'rsrc/image/sprite-login.png' => '7a001a9a', + 'rsrc/image/sprite-tokens-X2.png' => '21621dd9', + 'rsrc/image/sprite-tokens.png' => 'bede2580', + 'rsrc/image/texture/card-gradient.png' => 'e6892cb4', + 'rsrc/image/texture/dark-menu-hover.png' => '390a4fa1', + 'rsrc/image/texture/dark-menu.png' => '542f699c', + 'rsrc/image/texture/grip.png' => 'bc80753a', + 'rsrc/image/texture/panel-header-gradient.png' => '65004dbf', + 'rsrc/image/texture/phlnx-bg.png' => '6c9cd31d', + 'rsrc/image/texture/pholio-background.gif' => '84910bfc', + 'rsrc/image/texture/table_header.png' => '7652d1ad', + 'rsrc/image/texture/table_header_hover.png' => '12ea5236', + 'rsrc/image/texture/table_header_tall.png' => '5cc420c4', + 'rsrc/js/application/aphlict/Aphlict.js' => '022516b4', + 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => 'e9a2940f', + 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => '4e61fa88', + 'rsrc/js/application/aphlict/behavior-aphlict-status.js' => 'c3703a16', + 'rsrc/js/application/aphlict/behavior-desktop-notifications-control.js' => '070679fe', + 'rsrc/js/application/calendar/behavior-day-view.js' => '727a5a61', + 'rsrc/js/application/calendar/behavior-event-all-day.js' => '0b1bc990', + 'rsrc/js/application/calendar/behavior-month-view.js' => '158c64e0', + 'rsrc/js/application/config/behavior-reorder-fields.js' => '2539f834', + 'rsrc/js/application/conpherence/ConpherenceThreadManager.js' => 'aec8e38c', + 'rsrc/js/application/conpherence/behavior-conpherence-search.js' => '91befbcc', + 'rsrc/js/application/conpherence/behavior-durable-column.js' => 'fa6f30b2', + 'rsrc/js/application/conpherence/behavior-menu.js' => '8c2ed2bf', + 'rsrc/js/application/conpherence/behavior-participant-pane.js' => '43ba89a2', + 'rsrc/js/application/conpherence/behavior-pontificate.js' => '4ae58b5a', + 'rsrc/js/application/conpherence/behavior-quicksand-blacklist.js' => '5a6f6a06', + 'rsrc/js/application/conpherence/behavior-toggle-widget.js' => '8f959ad0', + 'rsrc/js/application/countdown/timer.js' => '6a162524', + 'rsrc/js/application/daemon/behavior-bulk-job-reload.js' => '3829a3cf', + 'rsrc/js/application/dashboard/behavior-dashboard-async-panel.js' => '9c01e364', + 'rsrc/js/application/dashboard/behavior-dashboard-move-panels.js' => 'a2ab19be', + 'rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js' => '1e413dc9', + 'rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js' => '0116d3e8', + 'rsrc/js/application/diff/DiffChangeset.js' => 'd7d3ba75', + 'rsrc/js/application/diff/DiffChangesetList.js' => 'cc2c5de5', + 'rsrc/js/application/diff/DiffInline.js' => '9c775532', + 'rsrc/js/application/diff/DiffInlineContentState.js' => 'aa51efb4', + 'rsrc/js/application/diff/DiffPathView.js' => '8207abf9', + 'rsrc/js/application/diff/DiffTreeView.js' => '5d83623b', + 'rsrc/js/application/differential/behavior-diff-radios.js' => '925fe8cd', + 'rsrc/js/application/differential/behavior-populate.js' => 'b86ef6c2', + 'rsrc/js/application/diffusion/DiffusionLocateFileSource.js' => '94243d89', + 'rsrc/js/application/diffusion/ExternalEditorLinkEngine.js' => '48a8641f', + 'rsrc/js/application/diffusion/behavior-audit-preview.js' => 'b7b73831', + 'rsrc/js/application/diffusion/behavior-commit-branches.js' => '4b671572', + 'rsrc/js/application/diffusion/behavior-commit-graph.js' => 'ac10c917', + 'rsrc/js/application/diffusion/behavior-locate-file.js' => '87428eb2', + 'rsrc/js/application/diffusion/behavior-pull-lastmodified.js' => 'c715c123', + 'rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js' => '6a85bc5a', + 'rsrc/js/application/drydock/drydock-live-operation-status.js' => '47a0728b', + 'rsrc/js/application/fact/Chart.js' => '52e3ff03', + 'rsrc/js/application/fact/ChartCurtainView.js' => '86954222', + 'rsrc/js/application/fact/ChartFunctionLabel.js' => '81de1dab', + 'rsrc/js/application/files/behavior-document-engine.js' => '243d6c22', + 'rsrc/js/application/files/behavior-icon-composer.js' => '38a6cedb', + 'rsrc/js/application/files/behavior-launch-icon-composer.js' => 'a17b84f1', + 'rsrc/js/application/harbormaster/behavior-harbormaster-log.js' => 'b347a301', + 'rsrc/js/application/herald/HeraldRuleEditor.js' => '2633bef7', + 'rsrc/js/application/herald/PathTypeahead.js' => 'ad486db3', + 'rsrc/js/application/herald/herald-rule-editor.js' => '0922e81d', + 'rsrc/js/application/maniphest/behavior-batch-selector.js' => '139ef688', + 'rsrc/js/application/maniphest/behavior-line-chart.js' => 'ad258e28', + 'rsrc/js/application/maniphest/behavior-list-edit.js' => 'c687e867', + 'rsrc/js/application/owners/OwnersPathEditor.js' => '2a8b62d9', + 'rsrc/js/application/owners/owners-path-editor.js' => 'ff688a7a', + 'rsrc/js/application/passphrase/passphrase-credential-control.js' => '48fe33d0', + 'rsrc/js/application/pholio/behavior-pholio-mock-edit.js' => '3eed1f2b', + 'rsrc/js/application/pholio/behavior-pholio-mock-view.js' => '5aa1544e', + 'rsrc/js/application/phortune/behavior-stripe-payment-form.js' => '02cb4398', + 'rsrc/js/application/phortune/behavior-test-payment-form.js' => '4a7fb02b', + 'rsrc/js/application/phortune/phortune-credit-card-form.js' => 'd12d214f', + 'rsrc/js/application/policy/behavior-policy-control.js' => '0eaa33a9', + 'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '9347f172', + 'rsrc/js/application/projects/WorkboardBoard.js' => 'b46d88c5', + 'rsrc/js/application/projects/WorkboardCard.js' => '0392a5d8', + 'rsrc/js/application/projects/WorkboardCardTemplate.js' => '84f82dad', + 'rsrc/js/application/projects/WorkboardColumn.js' => 'c3d24e63', + 'rsrc/js/application/projects/WorkboardController.js' => 'b9d0c2f3', + 'rsrc/js/application/projects/WorkboardDropEffect.js' => '8e0aa661', + 'rsrc/js/application/projects/WorkboardHeader.js' => '111bfd2d', + 'rsrc/js/application/projects/WorkboardHeaderTemplate.js' => 'ebe83a6b', + 'rsrc/js/application/projects/WorkboardOrderTemplate.js' => '03e8891f', + 'rsrc/js/application/projects/behavior-project-boards.js' => '58cb6a88', + 'rsrc/js/application/projects/behavior-project-create.js' => '34c53422', + 'rsrc/js/application/projects/behavior-reorder-columns.js' => '8ac32fd9', + 'rsrc/js/application/repository/repository-crossreference.js' => '44d48cd1', + 'rsrc/js/application/search/behavior-reorder-profile-menu-items.js' => 'e5bdb730', + 'rsrc/js/application/search/behavior-reorder-queries.js' => 'b86f297f', + 'rsrc/js/application/transactions/behavior-comment-actions.js' => '4dffaeb2', + 'rsrc/js/application/transactions/behavior-reorder-configs.js' => '4842f137', + 'rsrc/js/application/transactions/behavior-reorder-fields.js' => '0ad8d31f', + 'rsrc/js/application/transactions/behavior-show-older-transactions.js' => '8b5c7d65', + 'rsrc/js/application/transactions/behavior-transaction-comment-form.js' => '2bdadf1a', + 'rsrc/js/application/transactions/behavior-transaction-list.js' => '9cec214e', + 'rsrc/js/application/trigger/TriggerRule.js' => '41b7b4f6', + 'rsrc/js/application/trigger/TriggerRuleControl.js' => '5faf27b9', + 'rsrc/js/application/trigger/TriggerRuleEditor.js' => 'b49fd60c', + 'rsrc/js/application/trigger/TriggerRuleType.js' => '4feea7d3', + 'rsrc/js/application/trigger/trigger-rule-editor.js' => '398fdf13', + 'rsrc/js/application/typeahead/behavior-typeahead-browse.js' => '70245195', + 'rsrc/js/application/typeahead/behavior-typeahead-search.js' => '7b139193', + 'rsrc/js/application/uiexample/gesture-example.js' => '242dedd0', + 'rsrc/js/application/uiexample/notification-example.js' => '29819b75', + 'rsrc/js/core/Busy.js' => '5202e831', + 'rsrc/js/core/DragAndDropFileUpload.js' => '4370900d', + 'rsrc/js/core/DraggableList.js' => '0169e425', + 'rsrc/js/core/Favicon.js' => '7930776a', + 'rsrc/js/core/FileUpload.js' => 'ab85e184', + 'rsrc/js/core/Hovercard.js' => '6199f752', + 'rsrc/js/core/HovercardList.js' => 'de4b4919', + 'rsrc/js/core/KeyboardShortcut.js' => '1a844c06', + 'rsrc/js/core/KeyboardShortcutManager.js' => '81debc48', + 'rsrc/js/core/MultirowRowManager.js' => '5b54c823', + 'rsrc/js/core/Notification.js' => 'a9b91e3f', + 'rsrc/js/core/Prefab.js' => '5793d835', + 'rsrc/js/core/ShapedRequest.js' => '995f5102', + 'rsrc/js/core/TextAreaUtils.js' => 'f340a484', + 'rsrc/js/core/Title.js' => '43bc9360', + 'rsrc/js/core/ToolTip.js' => '83754533', + 'rsrc/js/core/behavior-audio-source.js' => '3dc5ad43', + 'rsrc/js/core/behavior-autofocus.js' => '65bb0011', + 'rsrc/js/core/behavior-badge-view.js' => '92cdd7b6', + 'rsrc/js/core/behavior-bulk-editor.js' => 'aa6d2308', + 'rsrc/js/core/behavior-choose-control.js' => '04f8a1e3', + 'rsrc/js/core/behavior-copy.js' => 'cf32921f', + 'rsrc/js/core/behavior-detect-timezone.js' => '78bc5d94', + 'rsrc/js/core/behavior-device.js' => 'ac2b1e01', + 'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '3277c62d', + 'rsrc/js/core/behavior-fancy-datepicker.js' => '36821f8d', + 'rsrc/js/core/behavior-form.js' => '55d7b788', + 'rsrc/js/core/behavior-gesture.js' => 'b58d1a2a', + 'rsrc/js/core/behavior-global-drag-and-drop.js' => '1cab0e9a', + 'rsrc/js/core/behavior-high-security-warning.js' => 'dae2d55b', + 'rsrc/js/core/behavior-history-install.js' => '6a1583a8', + 'rsrc/js/core/behavior-hovercard.js' => '183738e6', + 'rsrc/js/core/behavior-keyboard-pager.js' => '1325b731', + 'rsrc/js/core/behavior-keyboard-shortcuts.js' => '42c44e8b', + 'rsrc/js/core/behavior-lightbox-attachments.js' => '14c7ab36', + 'rsrc/js/core/behavior-line-linker.js' => '0d915ff5', + 'rsrc/js/core/behavior-linked-container.js' => '74446546', + 'rsrc/js/core/behavior-more.js' => '506aa3f4', + 'rsrc/js/core/behavior-object-selector.js' => '98ef467f', + 'rsrc/js/core/behavior-oncopy.js' => 'da8f5259', + 'rsrc/js/core/behavior-phabricator-remarkup-assist.js' => '54262396', + 'rsrc/js/core/behavior-read-only-warning.js' => 'b9109f8f', + 'rsrc/js/core/behavior-redirect.js' => '407ee861', + 'rsrc/js/core/behavior-refresh-csrf.js' => '46116c01', + 'rsrc/js/core/behavior-remarkup-load-image.js' => '202bfa3f', + 'rsrc/js/core/behavior-remarkup-preview.js' => 'd8a86cfb', + 'rsrc/js/core/behavior-reorder-applications.js' => 'aa371860', + 'rsrc/js/core/behavior-reveal-content.js' => 'b105a3a6', + 'rsrc/js/core/behavior-scrollbar.js' => '92388bae', + 'rsrc/js/core/behavior-search-typeahead.js' => '1cb7d027', + 'rsrc/js/core/behavior-select-content.js' => 'e8240b50', + 'rsrc/js/core/behavior-select-on-click.js' => '66365ee2', + 'rsrc/js/core/behavior-setup-check-https.js' => '01384686', + 'rsrc/js/core/behavior-time-typeahead.js' => '5803b9e7', + 'rsrc/js/core/behavior-toggle-class.js' => '32db8374', + 'rsrc/js/core/behavior-tokenizer.js' => '3b4899b0', + 'rsrc/js/core/behavior-tooltip.js' => '73ecc1f8', + 'rsrc/js/core/behavior-user-menu.js' => '60cd9241', + 'rsrc/js/core/behavior-watch-anchor.js' => 'a77e2cbd', + 'rsrc/js/core/behavior-workflow.js' => '9623adc1', + 'rsrc/js/core/darkconsole/DarkLog.js' => '3b869402', + 'rsrc/js/core/darkconsole/DarkMessage.js' => '26cd4b73', + 'rsrc/js/core/darkconsole/behavior-dark-console.js' => '457f4d16', + 'rsrc/js/core/phtize.js' => '2f1db1ed', + 'rsrc/js/phui/behavior-phui-dropdown-menu.js' => '5cf0501a', + 'rsrc/js/phui/behavior-phui-file-upload.js' => 'e150bd50', + 'rsrc/js/phui/behavior-phui-selectable-list.js' => 'b26a41e4', + 'rsrc/js/phui/behavior-phui-submenu.js' => 'b5e9bff9', + 'rsrc/js/phui/behavior-phui-tab-group.js' => '242aa08b', + 'rsrc/js/phui/behavior-phui-timer-control.js' => 'f84bcbf4', + 'rsrc/js/phuix/PHUIXActionListView.js' => 'c68f183f', + 'rsrc/js/phuix/PHUIXActionView.js' => 'a8f573a9', + 'rsrc/js/phuix/PHUIXAutocomplete.js' => '2fbe234d', + 'rsrc/js/phuix/PHUIXButtonView.js' => '55a24e84', + 'rsrc/js/phuix/PHUIXDropdownMenu.js' => 'b557770a', + 'rsrc/js/phuix/PHUIXExample.js' => 'c2c500a7', + 'rsrc/js/phuix/PHUIXFormControl.js' => '38c1f3fb', + 'rsrc/js/phuix/PHUIXFormationColumnView.js' => '4bcc1f78', + 'rsrc/js/phuix/PHUIXFormationFlankView.js' => '6648270a', + 'rsrc/js/phuix/PHUIXFormationView.js' => 'cef53b3e', + 'rsrc/js/phuix/PHUIXIconView.js' => 'a5257c4e', + ), + 'symbols' => array( + 'almanac-css' => '2e050f4f', + 'aphront-bars' => '4a327b4a', + 'aphront-dark-console-css' => '7f06cda2', + 'aphront-dialog-view-css' => '6f4ea703', + 'aphront-list-filter-view-css' => 'feb64255', + 'aphront-multi-column-view-css' => 'fbc00ba3', + 'aphront-panel-view-css' => '46923d46', + 'aphront-table-view-css' => '0bb61df1', + 'aphront-tokenizer-control-css' => '34e2a838', + 'aphront-tooltip-css' => 'e3f2412f', + 'aphront-typeahead-control-css' => '8779483d', + 'application-search-view-css' => '0f7c06d8', + 'auth-css' => 'c2f23d74', + 'bulk-job-css' => '73af99f5', + 'conduit-api-css' => 'ce2cfc41', + 'config-options-css' => '16c920ae', + 'conpherence-color-css' => 'b17746b0', + 'conpherence-durable-column-view' => '2d57072b', + 'conpherence-header-pane-css' => 'c9a3db8e', + 'conpherence-menu-css' => '67f4680d', + 'conpherence-message-pane-css' => 'd244db1e', + 'conpherence-notification-css' => '6a3d4e58', + 'conpherence-participant-pane-css' => '69e0058a', + 'conpherence-thread-manager' => 'aec8e38c', + 'conpherence-transaction-css' => '3a3f5e7e', + 'd3' => '9d068042', + 'diff-tree-view-css' => 'e2d3e222', + 'differential-changeset-view-css' => '60c3d405', + 'differential-core-view-css' => '7300a73e', + 'differential-revision-add-comment-css' => '7e5900d9', + 'differential-revision-comment-css' => '7dbc8d1d', + 'differential-revision-history-css' => '237a2979', + 'differential-revision-list-css' => '93d2df7d', + 'differential-table-of-contents-css' => 'bba788b9', + 'diffusion-css' => 'e46232d6', + 'diffusion-icons-css' => '23b31a1b', + 'diffusion-readme-css' => 'b68a76e4', + 'diffusion-repository-css' => 'b89e8c6c', + 'diviner-shared-css' => '4bd263b0', + 'font-fontawesome' => '3883938a', + 'font-lato' => '23631304', + 'fuel-grid-css' => '66697240', + 'fuel-handle-list-css' => '2c4cbeca', + 'fuel-map-css' => 'd6e31510', + 'fuel-menu-css' => '21f5d199', + 'global-drag-and-drop-css' => '1d2713a4', + 'harbormaster-css' => '8dfe16b2', + 'herald-css' => '648d39e2', + 'herald-rule-editor' => '2633bef7', + 'herald-test-css' => '7e7bbdae', + 'inline-comment-summary-css' => '81eb368d', + 'javelin-aphlict' => '022516b4', + 'javelin-behavior' => '1b6acc2a', + 'javelin-behavior-aphlict-dropdown' => 'e9a2940f', + 'javelin-behavior-aphlict-listen' => '4e61fa88', + 'javelin-behavior-aphlict-status' => 'c3703a16', + 'javelin-behavior-aphront-basic-tokenizer' => '3b4899b0', + 'javelin-behavior-aphront-drag-and-drop-textarea' => '3277c62d', + 'javelin-behavior-aphront-form-disable-on-submit' => '55d7b788', + 'javelin-behavior-aphront-more' => '506aa3f4', + 'javelin-behavior-audio-source' => '3dc5ad43', + 'javelin-behavior-audit-preview' => 'b7b73831', + 'javelin-behavior-badge-view' => '92cdd7b6', + 'javelin-behavior-bulk-editor' => 'aa6d2308', + 'javelin-behavior-bulk-job-reload' => '3829a3cf', + 'javelin-behavior-calendar-month-view' => '158c64e0', + 'javelin-behavior-choose-control' => '04f8a1e3', + 'javelin-behavior-comment-actions' => '4dffaeb2', + 'javelin-behavior-config-reorder-fields' => '2539f834', + 'javelin-behavior-conpherence-menu' => '8c2ed2bf', + 'javelin-behavior-conpherence-participant-pane' => '43ba89a2', + 'javelin-behavior-conpherence-pontificate' => '4ae58b5a', + 'javelin-behavior-conpherence-search' => '91befbcc', + 'javelin-behavior-countdown-timer' => '6a162524', + 'javelin-behavior-dark-console' => '457f4d16', + 'javelin-behavior-dashboard-async-panel' => '9c01e364', + 'javelin-behavior-dashboard-move-panels' => 'a2ab19be', + 'javelin-behavior-dashboard-query-panel-select' => '1e413dc9', + 'javelin-behavior-dashboard-tab-panel' => '0116d3e8', + 'javelin-behavior-day-view' => '727a5a61', + 'javelin-behavior-desktop-notifications-control' => '070679fe', + 'javelin-behavior-detect-timezone' => '78bc5d94', + 'javelin-behavior-device' => 'ac2b1e01', + 'javelin-behavior-differential-diff-radios' => '925fe8cd', + 'javelin-behavior-differential-populate' => 'b86ef6c2', + 'javelin-behavior-diffusion-commit-branches' => '4b671572', + 'javelin-behavior-diffusion-commit-graph' => 'ac10c917', + 'javelin-behavior-diffusion-locate-file' => '87428eb2', + 'javelin-behavior-diffusion-pull-lastmodified' => 'c715c123', + 'javelin-behavior-document-engine' => '243d6c22', + 'javelin-behavior-doorkeeper-tag' => '6a85bc5a', + 'javelin-behavior-drydock-live-operation-status' => '47a0728b', + 'javelin-behavior-durable-column' => 'fa6f30b2', + 'javelin-behavior-editengine-reorder-configs' => '4842f137', + 'javelin-behavior-editengine-reorder-fields' => '0ad8d31f', + 'javelin-behavior-event-all-day' => '0b1bc990', + 'javelin-behavior-fancy-datepicker' => '36821f8d', + 'javelin-behavior-global-drag-and-drop' => '1cab0e9a', + 'javelin-behavior-harbormaster-log' => 'b347a301', + 'javelin-behavior-herald-rule-editor' => '0922e81d', + 'javelin-behavior-high-security-warning' => 'dae2d55b', + 'javelin-behavior-history-install' => '6a1583a8', + 'javelin-behavior-icon-composer' => '38a6cedb', + 'javelin-behavior-launch-icon-composer' => 'a17b84f1', + 'javelin-behavior-lightbox-attachments' => '14c7ab36', + 'javelin-behavior-line-chart' => 'ad258e28', + 'javelin-behavior-linked-container' => '74446546', + 'javelin-behavior-maniphest-batch-selector' => '139ef688', + 'javelin-behavior-maniphest-list-editor' => 'c687e867', + 'javelin-behavior-owners-path-editor' => 'ff688a7a', + 'javelin-behavior-passphrase-credential-control' => '48fe33d0', + 'javelin-behavior-phabricator-autofocus' => '65bb0011', + 'javelin-behavior-phabricator-clipboard-copy' => 'cf32921f', + 'javelin-behavior-phabricator-gesture' => 'b58d1a2a', + 'javelin-behavior-phabricator-gesture-example' => '242dedd0', + 'javelin-behavior-phabricator-keyboard-pager' => '1325b731', + 'javelin-behavior-phabricator-keyboard-shortcuts' => '42c44e8b', + 'javelin-behavior-phabricator-line-linker' => '0d915ff5', + 'javelin-behavior-phabricator-notification-example' => '29819b75', + 'javelin-behavior-phabricator-object-selector' => '98ef467f', + 'javelin-behavior-phabricator-oncopy' => 'da8f5259', + 'javelin-behavior-phabricator-remarkup-assist' => '54262396', + 'javelin-behavior-phabricator-reveal-content' => 'b105a3a6', + 'javelin-behavior-phabricator-search-typeahead' => '1cb7d027', + 'javelin-behavior-phabricator-show-older-transactions' => '8b5c7d65', + 'javelin-behavior-phabricator-tooltips' => '73ecc1f8', + 'javelin-behavior-phabricator-transaction-comment-form' => '2bdadf1a', + 'javelin-behavior-phabricator-transaction-list' => '9cec214e', + 'javelin-behavior-phabricator-watch-anchor' => 'a77e2cbd', + 'javelin-behavior-pholio-mock-edit' => '3eed1f2b', + 'javelin-behavior-pholio-mock-view' => '5aa1544e', + 'javelin-behavior-phui-dropdown-menu' => '5cf0501a', + 'javelin-behavior-phui-file-upload' => 'e150bd50', + 'javelin-behavior-phui-hovercards' => '183738e6', + 'javelin-behavior-phui-selectable-list' => 'b26a41e4', + 'javelin-behavior-phui-submenu' => 'b5e9bff9', + 'javelin-behavior-phui-tab-group' => '242aa08b', + 'javelin-behavior-phui-timer-control' => 'f84bcbf4', + 'javelin-behavior-phuix-example' => 'c2c500a7', + 'javelin-behavior-policy-control' => '0eaa33a9', + 'javelin-behavior-policy-rule-editor' => '9347f172', + 'javelin-behavior-project-boards' => '58cb6a88', + 'javelin-behavior-project-create' => '34c53422', + 'javelin-behavior-quicksand-blacklist' => '5a6f6a06', + 'javelin-behavior-read-only-warning' => 'b9109f8f', + 'javelin-behavior-redirect' => '407ee861', + 'javelin-behavior-refresh-csrf' => '46116c01', + 'javelin-behavior-remarkup-load-image' => '202bfa3f', + 'javelin-behavior-remarkup-preview' => 'd8a86cfb', + 'javelin-behavior-reorder-applications' => 'aa371860', + 'javelin-behavior-reorder-columns' => '8ac32fd9', + 'javelin-behavior-reorder-profile-menu-items' => 'e5bdb730', + 'javelin-behavior-repository-crossreference' => '44d48cd1', + 'javelin-behavior-scrollbar' => '92388bae', + 'javelin-behavior-search-reorder-queries' => 'b86f297f', + 'javelin-behavior-select-content' => 'e8240b50', + 'javelin-behavior-select-on-click' => '66365ee2', + 'javelin-behavior-setup-check-https' => '01384686', + 'javelin-behavior-stripe-payment-form' => '02cb4398', + 'javelin-behavior-test-payment-form' => '4a7fb02b', + 'javelin-behavior-time-typeahead' => '5803b9e7', + 'javelin-behavior-toggle-class' => '32db8374', + 'javelin-behavior-toggle-widget' => '8f959ad0', + 'javelin-behavior-trigger-rule-editor' => '398fdf13', + 'javelin-behavior-typeahead-browse' => '70245195', + 'javelin-behavior-typeahead-search' => '7b139193', + 'javelin-behavior-user-menu' => '60cd9241', + 'javelin-behavior-view-placeholder' => 'a9942052', + 'javelin-behavior-workflow' => '9623adc1', + 'javelin-chart' => '52e3ff03', + 'javelin-chart-curtain-view' => '86954222', + 'javelin-chart-function-label' => '81de1dab', + 'javelin-color' => '78f811c9', + 'javelin-cookie' => '05d290ef', + 'javelin-diffusion-locate-file-source' => '94243d89', + 'javelin-dom' => 'e4c7622a', + 'javelin-dynval' => '202a2e85', + 'javelin-event' => 'c03f2fb4', + 'javelin-external-editor-link-engine' => '48a8641f', + 'javelin-fx' => '34450586', + 'javelin-history' => '030b4f7a', + 'javelin-install' => '5902260c', + 'javelin-json' => '541f81c3', + 'javelin-leader' => '0d2490ce', + 'javelin-magical-init' => '98e6504a', + 'javelin-mask' => '7c4d8998', + 'javelin-quicksand' => 'd3799cb4', + 'javelin-reactor' => '1c850a26', + 'javelin-reactor-dom' => '6cfa0008', + 'javelin-reactor-node-calmer' => '225bbb98', + 'javelin-reactornode' => '72960bc1', + 'javelin-request' => '84e6891f', + 'javelin-resource' => '20514cc2', + 'javelin-routable' => '6a18c42e', + 'javelin-router' => '32755edb', + 'javelin-scrollbar' => 'a43ae2ae', + 'javelin-sound' => 'd4cc2d2a', + 'javelin-stratcom' => '0889b835', + 'javelin-tokenizer' => '89a1ae3a', + 'javelin-typeahead' => 'a4356cde', + 'javelin-typeahead-composite-source' => '22ee68a5', + 'javelin-typeahead-normalizer' => 'a241536a', + 'javelin-typeahead-ondemand-source' => '23387297', + 'javelin-typeahead-preloaded-source' => '5a79f6c3', + 'javelin-typeahead-source' => '8badee71', + 'javelin-typeahead-static-source' => '80bff3af', + 'javelin-uri' => '2e255291', + 'javelin-util' => 'edb4d8c9', + 'javelin-vector' => 'e9c80beb', + 'javelin-view' => '289bf236', + 'javelin-view-html' => 'f8c4e135', + 'javelin-view-interpreter' => '876506b6', + 'javelin-view-renderer' => '9aae2b66', + 'javelin-view-visitor' => '308f9fe4', + 'javelin-websocket' => 'fdc13e4e', + 'javelin-workboard-board' => 'b46d88c5', + 'javelin-workboard-card' => '0392a5d8', + 'javelin-workboard-card-template' => '84f82dad', + 'javelin-workboard-column' => 'c3d24e63', + 'javelin-workboard-controller' => 'b9d0c2f3', + 'javelin-workboard-drop-effect' => '8e0aa661', + 'javelin-workboard-header' => '111bfd2d', + 'javelin-workboard-header-template' => 'ebe83a6b', + 'javelin-workboard-order-template' => '03e8891f', + 'javelin-workflow' => '945ff654', + 'maniphest-report-css' => '3d53188b', + 'maniphest-task-edit-css' => '272daa84', + 'maniphest-task-summary-css' => '61d1667e', + 'multirow-row-manager' => '5b54c823', + 'owners-path-editor' => '2a8b62d9', + 'owners-path-editor-css' => 'fa7c13ef', + 'paste-css' => 'b37bcd38', + 'path-typeahead' => 'ad486db3', + 'people-picture-menu-item-css' => 'fe8e07cf', + 'people-profile-css' => '2ea2daa1', + 'phabricator-action-list-view-css' => '1b0085b2', + 'phabricator-busy' => '5202e831', + 'phabricator-chatlog-css' => 'abdc76ee', + 'phabricator-content-source-view-css' => 'cdf0d579', + 'phabricator-core-css' => 'b3ebd90d', + 'phabricator-countdown-css' => 'bff8012f', + 'phabricator-darklog' => '3b869402', + 'phabricator-darkmessage' => '26cd4b73', + 'phabricator-dashboard-css' => '5a205b9d', + 'phabricator-diff-changeset' => 'd7d3ba75', + 'phabricator-diff-changeset-list' => 'cc2c5de5', + 'phabricator-diff-inline' => '9c775532', + 'phabricator-diff-inline-content-state' => 'aa51efb4', + 'phabricator-diff-path-view' => '8207abf9', + 'phabricator-diff-tree-view' => '5d83623b', + 'phabricator-drag-and-drop-file-upload' => '4370900d', + 'phabricator-draggable-list' => '0169e425', + 'phabricator-fatal-config-template-css' => '20babf50', + 'phabricator-favicon' => '7930776a', + 'phabricator-feed-css' => 'd8b6e3f8', + 'phabricator-file-upload' => 'ab85e184', + 'phabricator-flag-css' => '2b77be8d', + 'phabricator-keyboard-shortcut' => '1a844c06', + 'phabricator-keyboard-shortcut-manager' => '81debc48', + 'phabricator-main-menu-view' => 'bcec20f0', + 'phabricator-nav-view-css' => '423f92cc', + 'phabricator-notification' => 'a9b91e3f', + 'phabricator-notification-css' => '30240bd2', + 'phabricator-notification-menu-css' => '4df1ee30', + 'phabricator-object-selector-css' => 'ee77366f', + 'phabricator-phtize' => '2f1db1ed', + 'phabricator-prefab' => '5793d835', + 'phabricator-remarkup-css' => '5baa3bd9', + 'phabricator-search-results-css' => '9ea70ace', + 'phabricator-shaped-request' => '995f5102', + 'phabricator-slowvote-css' => '1694baed', + 'phabricator-source-code-view-css' => '03d7ac28', + 'phabricator-standard-page-view' => 'a374f94c', + 'phabricator-textareautils' => 'f340a484', + 'phabricator-title' => '43bc9360', + 'phabricator-tooltip' => '83754533', + 'phabricator-ui-example-css' => 'b4795059', + 'phabricator-zindex-css' => 'ac3bfcd4', + 'phame-css' => 'bb442327', + 'pholio-css' => '88ef5ef1', + 'pholio-edit-css' => '4df55b3b', + 'pholio-inline-comments-css' => '722b48c2', + 'phortune-credit-card-form' => 'd12d214f', + 'phortune-credit-card-form-css' => '3b9868a8', + 'phortune-css' => '508a1a5e', + 'phortune-invoice-css' => '4436b241', + 'phrequent-css' => 'bd79cc67', + 'phriction-document-css' => '03380da0', + 'phui-action-panel-css' => '6c386cbf', + 'phui-badge-view-css' => '666e25ad', + 'phui-basic-nav-view-css' => '56ebd66d', + 'phui-big-info-view-css' => '362ad37b', + 'phui-box-css' => '5ed3b8cb', + 'phui-bulk-editor-css' => '374d5e30', + 'phui-button-bar-css' => 'a4aa75c4', + 'phui-button-css' => 'ea704902', + 'phui-button-simple-css' => '1ff278aa', + 'phui-calendar-css' => 'f11073aa', + 'phui-calendar-day-css' => '9597d706', + 'phui-calendar-list-css' => 'ccd7e4e2', + 'phui-calendar-month-css' => 'cb758c42', + 'phui-chart-css' => '14df9ae3', + 'phui-cms-css' => '8c05c41e', + 'phui-comment-form-css' => '68a2d99a', + 'phui-comment-panel-css' => 'ec4e31c0', + 'phui-crumbs-view-css' => '614f43cf', + 'phui-curtain-object-ref-view-css' => '51d93266', + 'phui-curtain-view-css' => '68c5efb6', + 'phui-document-summary-view-css' => 'b068eed1', + 'phui-document-view-css' => '52b748a5', + 'phui-document-view-pro-css' => 'b9613a10', + 'phui-feed-story-css' => 'a0c05029', + 'phui-font-icon-base-css' => '303c9b87', + 'phui-fontkit-css' => '1ec937e5', + 'phui-form-css' => '1f177cb7', + 'phui-form-view-css' => '01b796c0', + 'phui-formation-view-css' => 'd2dec8ed', + 'phui-head-thing-view-css' => 'd7f293df', + 'phui-header-view-css' => '36c86a58', + 'phui-hovercard' => '6199f752', + 'phui-hovercard-list' => 'de4b4919', + 'phui-hovercard-view-css' => '6ca90fa0', + 'phui-icon-set-selector-css' => '7aa5f3ec', + 'phui-icon-view-css' => '4cbc684a', + 'phui-image-mask-css' => '62c7f4d2', + 'phui-info-view-css' => 'a10a909b', + 'phui-inline-comment-view-css' => '9863a85e', + 'phui-invisible-character-view-css' => 'c694c4a4', + 'phui-left-right-css' => '68513c34', + 'phui-lightbox-css' => '4ebf22da', + 'phui-list-view-css' => '0c04affd', + 'phui-object-box-css' => 'b8d7eea0', + 'phui-oi-big-ui-css' => 'fa74cc35', + 'phui-oi-color-css' => 'b517bfa0', + 'phui-oi-drag-ui-css' => 'da15d3dc', + 'phui-oi-flush-ui-css' => '490e2e2e', + 'phui-oi-list-view-css' => 'af98a277', + 'phui-oi-simple-ui-css' => '6a30fa46', + 'phui-pager-css' => 'd022c7ad', + 'phui-pinboard-view-css' => '1f08f5d8', + 'phui-policy-section-view-css' => '139fdc64', + 'phui-property-list-view-css' => '5adf7078', + 'phui-remarkup-preview-css' => '91767007', + 'phui-segment-bar-view-css' => '5166b370', + 'phui-spacing-css' => 'b05cadc3', + 'phui-status-list-view-css' => '293b5dad', + 'phui-tag-view-css' => 'fb811341', + 'phui-theme-css' => '35883b37', + 'phui-timeline-view-css' => '2d32d7a9', + 'phui-two-column-view-css' => 'f96d319f', + 'phui-workboard-color-css' => 'e86de308', + 'phui-workboard-view-css' => '74fc9d98', + 'phui-workcard-view-css' => '913441b6', + 'phui-workpanel-view-css' => '3ae89b20', + 'phuix-action-list-view' => 'c68f183f', + 'phuix-action-view' => 'a8f573a9', + 'phuix-autocomplete' => '2fbe234d', + 'phuix-button-view' => '55a24e84', + 'phuix-dropdown-menu' => 'b557770a', + 'phuix-form-control-view' => '38c1f3fb', + 'phuix-formation-column-view' => '4bcc1f78', + 'phuix-formation-flank-view' => '6648270a', + 'phuix-formation-view' => 'cef53b3e', + 'phuix-icon-view' => 'a5257c4e', + 'policy-css' => 'ceb56a08', + 'policy-edit-css' => '8794e2ed', + 'policy-transaction-detail-css' => 'c02b8384', + 'ponder-view-css' => '05a09d0a', + 'project-card-view-css' => 'a9f2c2dd', + 'project-triggers-css' => 'cd9c8bb9', + 'project-view-css' => '567858b3', + 'setup-issue-css' => '5eed85b2', + 'sprite-login-css' => '18b368a6', + 'sprite-tokens-css' => 'f1896dc5', + 'syntax-default-css' => '055fc231', + 'syntax-highlighting-css' => '548567f6', + 'tokens-css' => 'ce5a50bd', + 'trigger-rule' => '41b7b4f6', + 'trigger-rule-control' => '5faf27b9', + 'trigger-rule-editor' => 'b49fd60c', + 'trigger-rule-type' => '4feea7d3', + 'typeahead-browse-css' => 'b7ed02d2', + 'unhandled-exception-css' => '9ecfc00d', + ), + 'requires' => array( + '0116d3e8' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + ), + '01384686' => array( + 'javelin-behavior', + 'javelin-uri', + 'phabricator-notification', + ), + '0169e425' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-util', + 'javelin-vector', + 'javelin-magical-init', + ), + '022516b4' => array( + 'javelin-install', + 'javelin-util', + 'javelin-websocket', + 'javelin-leader', + 'javelin-json', + ), + '02cb4398' => array( + 'javelin-behavior', + 'javelin-dom', + 'phortune-credit-card-form', + ), + '030b4f7a' => array( + 'javelin-stratcom', + 'javelin-install', + 'javelin-uri', + 'javelin-util', + ), + '0392a5d8' => array( + 'javelin-install', + ), + '03e8891f' => array( + 'javelin-install', + ), + '04f8a1e3' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-workflow', + ), + '05d290ef' => array( + 'javelin-install', + 'javelin-util', + ), + '070679fe' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-uri', + 'phabricator-notification', + ), + '0889b835' => array( + 'javelin-install', + 'javelin-event', + 'javelin-util', + 'javelin-magical-init', + ), + '0922e81d' => array( + 'herald-rule-editor', + 'javelin-behavior', + ), + '0ad8d31f' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'phabricator-draggable-list', + ), + '0d2490ce' => array( + 'javelin-install', + ), + '0d915ff5' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-history', + 'javelin-external-editor-link-engine', + ), + '0eaa33a9' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'phuix-dropdown-menu', + 'phuix-action-list-view', + 'phuix-action-view', + 'javelin-workflow', + 'phuix-icon-view', + ), + '111bfd2d' => array( + 'javelin-install', + ), + '1325b731' => array( + 'javelin-behavior', + 'javelin-uri', + 'phabricator-keyboard-shortcut', + ), + '139ef688' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-util', + ), + '14c7ab36' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-mask', + 'javelin-util', + 'phuix-icon-view', + 'phabricator-busy', + ), + '183738e6' => array( + 'javelin-behavior', + 'javelin-behavior-device', + 'javelin-stratcom', + 'javelin-vector', + 'phui-hovercard', + 'phui-hovercard-list', + ), + '1a844c06' => array( + 'javelin-install', + 'javelin-util', + 'phabricator-keyboard-shortcut-manager', + ), + '1b6acc2a' => array( + 'javelin-magical-init', + 'javelin-util', + ), + '1c850a26' => array( + 'javelin-install', + 'javelin-util', + ), + '1cab0e9a' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-uri', + 'javelin-mask', + 'phabricator-drag-and-drop-file-upload', + ), + '1cb7d027' => array( + 'javelin-behavior', + 'javelin-typeahead-ondemand-source', + 'javelin-typeahead', + 'javelin-dom', + 'javelin-uri', + 'javelin-util', + 'javelin-stratcom', + 'phabricator-prefab', + 'phuix-icon-view', + ), + '1e413dc9' => array( + 'javelin-behavior', + 'javelin-dom', + ), + '1ff278aa' => array( + 'phui-button-css', + ), + '202a2e85' => array( + 'javelin-install', + 'javelin-reactornode', + 'javelin-util', + 'javelin-reactor', + ), + '202bfa3f' => array( + 'javelin-behavior', + 'javelin-request', + ), + '20514cc2' => array( + 'javelin-util', + 'javelin-uri', + 'javelin-install', + ), + '225bbb98' => array( + 'javelin-install', + 'javelin-reactor', + 'javelin-util', + ), + '22ee68a5' => array( + 'javelin-install', + 'javelin-typeahead-source', + 'javelin-util', + ), + 23387297 => array( + 'javelin-install', + 'javelin-util', + 'javelin-request', + 'javelin-typeahead-source', + ), + 23631304 => array( + 'phui-fontkit-css', + ), + '242aa08b' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), + '242dedd0' => array( + 'javelin-stratcom', + 'javelin-behavior', + 'javelin-vector', + 'javelin-dom', + ), + '243d6c22' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + ), + '2539f834' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-json', + 'phabricator-draggable-list', + ), + '2633bef7' => array( + 'multirow-row-manager', + 'javelin-install', + 'javelin-util', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-json', + 'phabricator-prefab', + ), + '289bf236' => array( + 'javelin-install', + 'javelin-util', + ), + '29819b75' => array( + 'phabricator-notification', + 'javelin-stratcom', + 'javelin-behavior', + ), + '2a8b62d9' => array( + 'multirow-row-manager', + 'javelin-install', + 'path-typeahead', + 'javelin-dom', + 'javelin-util', + 'phabricator-prefab', + 'phuix-form-control-view', + ), + '2bdadf1a' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-request', + 'phabricator-shaped-request', + ), + '2e255291' => array( + 'javelin-install', + 'javelin-util', + 'javelin-stratcom', + ), + '2f1db1ed' => array( + 'javelin-util', + ), + '2fbe234d' => array( + 'javelin-install', + 'javelin-dom', + 'phuix-icon-view', + 'phabricator-prefab', + ), + '308f9fe4' => array( + 'javelin-install', + 'javelin-util', + ), + '32755edb' => array( + 'javelin-install', + 'javelin-util', + ), + '3277c62d' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-json', + 'phabricator-drag-and-drop-file-upload', + 'phabricator-textareautils', + ), + '32db8374' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), + 34450586 => array( + 'javelin-color', + 'javelin-install', + 'javelin-util', + ), + '34c53422' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-workflow', + ), + '34e2a838' => array( + 'aphront-typeahead-control-css', + 'phui-tag-view-css', + ), + '36821f8d' => array( + 'javelin-behavior', + 'javelin-util', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-vector', + ), + '3829a3cf' => array( + 'javelin-behavior', + 'javelin-uri', + ), + '38a6cedb' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + ), + '38c1f3fb' => array( + 'javelin-install', + 'javelin-dom', + ), + '398fdf13' => array( + 'javelin-behavior', + 'trigger-rule-editor', + 'trigger-rule', + 'trigger-rule-type', + ), + '3ae89b20' => array( + 'phui-workcard-view-css', + ), + '3b4899b0' => array( + 'javelin-behavior', + 'phabricator-prefab', + ), + '3dc5ad43' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-dom', + ), + '3eed1f2b' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-workflow', + 'javelin-quicksand', + 'phabricator-phtize', + 'phabricator-drag-and-drop-file-upload', + 'phabricator-draggable-list', + ), + '407ee861' => array( + 'javelin-behavior', + 'javelin-uri', + ), + '42c44e8b' => array( + 'javelin-behavior', + 'javelin-workflow', + 'javelin-json', + 'javelin-dom', + 'phabricator-keyboard-shortcut', + ), + '4370900d' => array( + 'javelin-install', + 'javelin-util', + 'javelin-request', + 'javelin-dom', + 'javelin-uri', + 'phabricator-file-upload', + ), + '43ba89a2' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-util', + 'phabricator-notification', + 'conpherence-thread-manager', + ), + '43bc9360' => array( + 'javelin-install', + ), + '44d48cd1' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-uri', + ), + '457f4d16' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-util', + 'javelin-dom', + 'javelin-request', + 'phabricator-keyboard-shortcut', + 'phabricator-darklog', + 'phabricator-darkmessage', + ), + '46116c01' => array( + 'javelin-request', + 'javelin-behavior', + 'javelin-dom', + 'javelin-router', + 'javelin-util', + 'phabricator-busy', + ), + '47a0728b' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-request', + ), + '4842f137' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'phabricator-draggable-list', + ), + '48a8641f' => array( + 'javelin-install', + ), + '48fe33d0' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-util', + 'javelin-uri', + ), + '490e2e2e' => array( + 'phui-oi-list-view-css', + ), + '4a7fb02b' => array( + 'javelin-behavior', + 'javelin-dom', + 'phortune-credit-card-form', + ), + '4ae58b5a' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-workflow', + 'javelin-stratcom', + 'conpherence-thread-manager', + ), + '4b671572' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-request', + ), + '4bcc1f78' => array( + 'javelin-install', + 'javelin-dom', + ), + '4dffaeb2' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'phuix-form-control-view', + 'phuix-icon-view', + 'javelin-behavior-phabricator-gesture', + ), + '4e61fa88' => array( + 'javelin-behavior', + 'javelin-aphlict', + 'javelin-stratcom', + 'javelin-request', + 'javelin-uri', + 'javelin-dom', + 'javelin-json', + 'javelin-router', + 'javelin-util', + 'javelin-leader', + 'javelin-sound', + 'phabricator-notification', + ), + '4feea7d3' => array( + 'trigger-rule-control', + ), + '506aa3f4' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), + '5202e831' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-fx', + ), + '52e3ff03' => array( + 'phui-chart-css', + 'd3', + 'javelin-chart-curtain-view', + 'javelin-chart-function-label', + ), + '541f81c3' => array( + 'javelin-install', + ), + 54262396 => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'phabricator-phtize', + 'phabricator-textareautils', + 'javelin-workflow', + 'javelin-vector', + 'phuix-autocomplete', + 'javelin-mask', + ), + '548567f6' => array( + 'syntax-default-css', + ), + '55a24e84' => array( + 'javelin-install', + 'javelin-dom', + ), + '55d7b788' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), + '5793d835' => array( + 'javelin-install', + 'javelin-util', + 'javelin-dom', + 'javelin-typeahead', + 'javelin-tokenizer', + 'javelin-typeahead-preloaded-source', + 'javelin-typeahead-ondemand-source', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-util', + ), + '5803b9e7' => array( + 'javelin-behavior', + 'javelin-util', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-typeahead-static-source', + ), + '58cb6a88' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-vector', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-workboard-controller', + 'javelin-workboard-drop-effect', + ), + '5902260c' => array( + 'javelin-util', + 'javelin-magical-init', + ), + '5a6f6a06' => array( + 'javelin-behavior', + 'javelin-quicksand', + ), + '5a79f6c3' => array( + 'javelin-install', + 'javelin-util', + 'javelin-request', + 'javelin-typeahead-source', + ), + '5aa1544e' => array( + 'javelin-behavior', + 'javelin-util', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-vector', + 'javelin-magical-init', + 'javelin-request', + 'javelin-history', + 'javelin-workflow', + 'javelin-mask', + 'javelin-behavior-device', + 'phabricator-keyboard-shortcut', + ), + '5b54c823' => array( + 'javelin-install', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-util', + ), + '5cf0501a' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'phuix-dropdown-menu', + ), + '5d83623b' => array( + 'javelin-dom', + ), + '5faf27b9' => array( + 'phuix-form-control-view', + ), + '60c3d405' => array( + 'phui-inline-comment-view-css', + ), + '60cd9241' => array( + 'javelin-behavior', + ), + '6199f752' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-vector', + 'javelin-request', + 'javelin-uri', + ), + '65bb0011' => array( + 'javelin-behavior', + 'javelin-dom', + ), + '66365ee2' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), + '6648270a' => array( + 'javelin-install', + 'javelin-dom', + ), + '6a1583a8' => array( + 'javelin-behavior', + 'javelin-history', + ), + '6a162524' => array( + 'javelin-behavior', + 'javelin-dom', + ), + '6a18c42e' => array( + 'javelin-install', + ), + '6a30fa46' => array( + 'phui-oi-list-view-css', + ), + '6a85bc5a' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-json', + 'javelin-workflow', + 'javelin-magical-init', + ), + '6cfa0008' => array( + 'javelin-dom', + 'javelin-dynval', + 'javelin-reactor', + 'javelin-reactornode', + 'javelin-install', + 'javelin-util', + ), + 70245195 => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + ), + '727a5a61' => array( + 'phuix-icon-view', + ), + '72960bc1' => array( + 'javelin-install', + 'javelin-reactor', + 'javelin-util', + 'javelin-reactor-node-calmer', + ), + '73ecc1f8' => array( + 'javelin-behavior', + 'javelin-behavior-device', + 'javelin-stratcom', + 'phabricator-tooltip', + ), + 74446546 => array( + 'javelin-behavior', + 'javelin-dom', + ), + '78bc5d94' => array( + 'javelin-behavior', + 'javelin-uri', + 'phabricator-notification', + ), + '78f811c9' => array( + 'javelin-install', + ), + '7930776a' => array( + 'javelin-install', + 'javelin-dom', + ), + '7b139193' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + ), + '7c4d8998' => array( + 'javelin-install', + 'javelin-dom', + ), + '80bff3af' => array( + 'javelin-install', + 'javelin-typeahead-source', + ), + '81debc48' => array( + 'javelin-install', + 'javelin-util', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-vector', + ), + '8207abf9' => array( + 'javelin-dom', + ), + 83754533 => array( + 'javelin-install', + 'javelin-util', + 'javelin-dom', + 'javelin-vector', + ), + '84e6891f' => array( + 'javelin-install', + 'javelin-stratcom', + 'javelin-util', + 'javelin-behavior', + 'javelin-json', + 'javelin-dom', + 'javelin-resource', + 'javelin-routable', + ), + '84f82dad' => array( + 'javelin-install', + ), + '87428eb2' => array( + 'javelin-behavior', + 'javelin-diffusion-locate-file-source', + 'javelin-dom', + 'javelin-typeahead', + 'javelin-uri', + ), + '876506b6' => array( + 'javelin-view', + 'javelin-install', + 'javelin-dom', + ), + '89a1ae3a' => array( + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-install', + ), + '8ac32fd9' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'phabricator-draggable-list', + ), + '8b5c7d65' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'phabricator-busy', + ), + '8badee71' => array( + 'javelin-install', + 'javelin-util', + 'javelin-dom', + 'javelin-typeahead-normalizer', + ), + '8c2ed2bf' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-behavior-device', + 'javelin-history', + 'javelin-vector', + 'javelin-scrollbar', + 'phabricator-title', + 'phabricator-shaped-request', + 'conpherence-thread-manager', + ), + '8e0aa661' => array( + 'javelin-install', + 'javelin-dom', + ), + '8f959ad0' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-workflow', + 'javelin-stratcom', + ), + '91befbcc' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-workflow', + 'javelin-stratcom', + ), + '92388bae' => array( + 'javelin-behavior', + 'javelin-scrollbar', + ), + '925fe8cd' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), + '92cdd7b6' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), + '9347f172' => array( + 'javelin-behavior', + 'multirow-row-manager', + 'javelin-dom', + 'javelin-util', + 'phabricator-prefab', + 'javelin-json', + ), + '94243d89' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-typeahead-preloaded-source', + 'javelin-util', + ), + '945ff654' => array( + 'javelin-stratcom', + 'javelin-request', + 'javelin-dom', + 'javelin-vector', + 'javelin-install', + 'javelin-util', + 'javelin-mask', + 'javelin-uri', + 'javelin-routable', + ), + '9623adc1' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'javelin-router', + ), + '98ef467f' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-request', + 'javelin-util', + ), + '995f5102' => array( + 'javelin-install', + 'javelin-util', + 'javelin-request', + 'javelin-router', + ), + '9aae2b66' => array( + 'javelin-install', + 'javelin-util', + ), + '9c01e364' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-workflow', + ), + '9c775532' => array( + 'javelin-dom', + 'phabricator-diff-inline-content-state', + ), + '9cec214e' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'javelin-uri', + 'phabricator-textareautils', + ), + 'a17b84f1' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-workflow', + ), + 'a241536a' => array( + 'javelin-install', + ), + 'a2ab19be' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-workflow', + 'phabricator-draggable-list', + ), + 'a4356cde' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-vector', + 'javelin-util', + ), + 'a43ae2ae' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-vector', + ), + 'a4aa75c4' => array( + 'phui-button-css', + 'phui-button-simple-css', + ), + 'a5257c4e' => array( + 'javelin-install', + 'javelin-dom', + ), + 'a77e2cbd' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-vector', + ), + 'a8f573a9' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-util', + ), + 'a9942052' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-view-renderer', + 'javelin-install', + ), + 'a9b91e3f' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-util', + 'phabricator-notification-css', + ), + 'aa371860' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'phabricator-draggable-list', + ), + 'aa51efb4' => array( + 'javelin-dom', + ), + 'aa6d2308' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'multirow-row-manager', + 'javelin-json', + 'phuix-form-control-view', + ), + 'ab85e184' => array( + 'javelin-install', + 'javelin-dom', + 'phabricator-notification', + ), + 'ac10c917' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + ), + 'ac2b1e01' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'javelin-vector', + 'javelin-install', + ), + 'ad258e28' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-chart', + ), + 'ad486db3' => array( + 'javelin-install', + 'javelin-typeahead', + 'javelin-dom', + 'javelin-request', + 'javelin-typeahead-ondemand-source', + 'javelin-util', + ), + 'aec8e38c' => array( + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-install', + 'javelin-aphlict', + 'javelin-workflow', + 'javelin-router', + 'javelin-behavior-device', + 'javelin-vector', + ), + 'b105a3a6' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), + 'b26a41e4' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), + 'b347a301' => array( + 'javelin-behavior', + ), + 'b46d88c5' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-workflow', + 'phabricator-draggable-list', + 'javelin-workboard-column', + 'javelin-workboard-header-template', + 'javelin-workboard-card-template', + 'javelin-workboard-order-template', + ), + 'b49fd60c' => array( + 'multirow-row-manager', + 'trigger-rule', + ), + 'b517bfa0' => array( + 'phui-oi-list-view-css', + ), + 'b557770a' => array( + 'javelin-install', + 'javelin-util', + 'javelin-dom', + 'javelin-vector', + 'javelin-stratcom', + ), + 'b58d1a2a' => array( + 'javelin-behavior', + 'javelin-behavior-device', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-dom', + 'javelin-magical-init', + ), + 'b5e9bff9' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), + 'b7b73831' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'phabricator-shaped-request', + ), + 'b86ef6c2' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'phabricator-tooltip', + 'phabricator-diff-changeset-list', + 'phabricator-diff-changeset', + 'phuix-formation-view', + ), + 'b86f297f' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'phabricator-draggable-list', + ), + 'b9109f8f' => array( + 'javelin-behavior', + 'javelin-uri', + 'phabricator-notification', + ), + 'b9d0c2f3' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-util', + 'javelin-vector', + 'javelin-stratcom', + 'javelin-workflow', + 'phabricator-drag-and-drop-file-upload', + 'javelin-workboard-board', + ), + 'bcec20f0' => array( + 'phui-theme-css', + ), + 'c03f2fb4' => array( + 'javelin-install', + ), + 'c2c500a7' => array( + 'javelin-install', + 'javelin-dom', + 'phuix-button-view', + ), + 'c3703a16' => array( + 'javelin-behavior', + 'javelin-aphlict', + 'phabricator-phtize', + 'javelin-dom', + ), + 'c3d24e63' => array( + 'javelin-install', + 'javelin-workboard-card', + 'javelin-workboard-header', + ), + 'c687e867' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-fx', + 'javelin-util', + ), + 'c68f183f' => array( + 'javelin-install', + 'javelin-dom', + ), + 'c715c123' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-workflow', + 'javelin-json', + ), + 'cc2c5de5' => array( + 'javelin-install', + 'phuix-button-view', + 'phabricator-diff-tree-view', + ), + 'cef53b3e' => array( + 'javelin-install', + 'javelin-dom', + 'phuix-formation-column-view', + 'phuix-formation-flank-view', + ), + 'cf32921f' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + ), + 'd12d214f' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-json', + 'javelin-workflow', + 'javelin-util', + ), + 'd3799cb4' => array( + 'javelin-install', + ), + 'd4cc2d2a' => array( + 'javelin-install', + ), + 'd7d3ba75' => array( + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-install', + 'javelin-workflow', + 'javelin-router', + 'javelin-behavior-device', + 'javelin-vector', + 'phabricator-diff-inline', + 'phabricator-diff-path-view', + 'phuix-button-view', + 'javelin-external-editor-link-engine', + ), + 'd8a86cfb' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'phabricator-shaped-request', + ), + 'da15d3dc' => array( + 'phui-oi-list-view-css', + ), + 'da8f5259' => array( + 'javelin-behavior', + 'javelin-dom', + ), + 'dae2d55b' => array( + 'javelin-behavior', + 'javelin-uri', + 'phabricator-notification', + ), + 'de4b4919' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-vector', + 'javelin-request', + 'javelin-uri', + 'phui-hovercard', + ), + 'e150bd50' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'phuix-dropdown-menu', + ), + 'e4c7622a' => array( + 'javelin-magical-init', + 'javelin-install', + 'javelin-util', + 'javelin-vector', + 'javelin-stratcom', + ), + 'e5bdb730' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-dom', + 'phabricator-draggable-list', + ), + 'e8240b50' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), + 'e9a2940f' => array( + 'javelin-behavior', + 'javelin-request', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-dom', + 'javelin-uri', + 'javelin-behavior-device', + 'phabricator-title', + 'phabricator-favicon', + ), + 'e9c80beb' => array( + 'javelin-install', + 'javelin-event', + ), + 'ebe83a6b' => array( + 'javelin-install', + ), + 'ec4e31c0' => array( + 'phui-timeline-view-css', + ), + 'ee77366f' => array( + 'aphront-dialog-view-css', + ), + 'f340a484' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-vector', + ), + 'f84bcbf4' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + ), + 'f8c4e135' => array( + 'javelin-install', + 'javelin-dom', + 'javelin-view-visitor', + 'javelin-util', + ), + 'fa6f30b2' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-behavior-device', + 'javelin-scrollbar', + 'javelin-quicksand', + 'phabricator-keyboard-shortcut', + 'conpherence-thread-manager', + ), + 'fa74cc35' => array( + 'phui-oi-list-view-css', + ), + 'fdc13e4e' => array( + 'javelin-install', + ), + 'ff688a7a' => array( + 'owners-path-editor', + 'javelin-behavior', + ), + ), + 'packages' => array( + 'conpherence.pkg.css' => array( + 'conpherence-menu-css', + 'conpherence-color-css', + 'conpherence-message-pane-css', + 'conpherence-notification-css', + 'conpherence-transaction-css', + 'conpherence-participant-pane-css', + 'conpherence-header-pane-css', + ), + 'conpherence.pkg.js' => array( + 'javelin-behavior-conpherence-menu', + 'javelin-behavior-conpherence-participant-pane', + 'javelin-behavior-conpherence-pontificate', + 'javelin-behavior-toggle-widget', + ), + 'core.pkg.css' => array( + 'phabricator-core-css', + 'phabricator-zindex-css', + 'phui-button-css', + 'phui-button-simple-css', + 'phui-theme-css', + 'phabricator-standard-page-view', + 'aphront-dialog-view-css', + 'phui-form-view-css', + 'aphront-panel-view-css', + 'aphront-table-view-css', + 'aphront-tokenizer-control-css', + 'aphront-typeahead-control-css', + 'aphront-list-filter-view-css', + 'application-search-view-css', + 'phabricator-remarkup-css', + 'syntax-highlighting-css', + 'syntax-default-css', + 'phui-pager-css', + 'aphront-tooltip-css', + 'phabricator-flag-css', + 'phui-info-view-css', + 'phabricator-main-menu-view', + 'phabricator-notification-css', + 'phabricator-notification-menu-css', + 'phui-lightbox-css', + 'phui-comment-panel-css', + 'phui-header-view-css', + 'phabricator-nav-view-css', + 'phui-basic-nav-view-css', + 'phui-crumbs-view-css', + 'phui-oi-list-view-css', + 'phui-oi-color-css', + 'phui-oi-big-ui-css', + 'phui-oi-drag-ui-css', + 'phui-oi-simple-ui-css', + 'phui-oi-flush-ui-css', + 'global-drag-and-drop-css', + 'phui-spacing-css', + 'phui-form-css', + 'phui-icon-view-css', + 'phabricator-action-list-view-css', + 'phui-property-list-view-css', + 'phui-tag-view-css', + 'phui-list-view-css', + 'font-fontawesome', + 'font-lato', + 'phui-font-icon-base-css', + 'phui-fontkit-css', + 'phui-box-css', + 'phui-object-box-css', + 'phui-timeline-view-css', + 'phui-two-column-view-css', + 'phui-curtain-view-css', + 'sprite-login-css', + 'sprite-tokens-css', + 'tokens-css', + 'auth-css', + 'phui-status-list-view-css', + 'phui-feed-story-css', + 'phabricator-feed-css', + 'phabricator-dashboard-css', + 'aphront-multi-column-view-css', + 'phui-curtain-object-ref-view-css', + 'phui-comment-form-css', + 'phui-head-thing-view-css', + 'conpherence-durable-column-view', + 'phui-button-bar-css', + ), + 'core.pkg.js' => array( + 'javelin-util', + 'javelin-install', + 'javelin-event', + 'javelin-stratcom', + 'javelin-behavior', + 'javelin-resource', + 'javelin-request', + 'javelin-vector', + 'javelin-dom', + 'javelin-json', + 'javelin-uri', + 'javelin-workflow', + 'javelin-mask', + 'javelin-typeahead', + 'javelin-typeahead-normalizer', + 'javelin-typeahead-source', + 'javelin-typeahead-preloaded-source', + 'javelin-typeahead-ondemand-source', + 'javelin-tokenizer', + 'javelin-history', + 'javelin-router', + 'javelin-routable', + 'javelin-behavior-aphront-basic-tokenizer', + 'javelin-behavior-workflow', + 'javelin-behavior-aphront-form-disable-on-submit', + 'phabricator-keyboard-shortcut-manager', + 'phabricator-keyboard-shortcut', + 'javelin-behavior-phabricator-keyboard-shortcuts', + 'javelin-behavior-refresh-csrf', + 'javelin-behavior-phabricator-watch-anchor', + 'javelin-behavior-phabricator-autofocus', + 'phuix-dropdown-menu', + 'phuix-action-list-view', + 'phuix-action-view', + 'phuix-icon-view', + 'phabricator-phtize', + 'javelin-behavior-phabricator-oncopy', + 'phabricator-tooltip', + 'javelin-behavior-phabricator-tooltips', + 'phabricator-prefab', + 'javelin-behavior-device', + 'javelin-behavior-toggle-class', + 'javelin-behavior-lightbox-attachments', + 'phabricator-busy', + 'javelin-sound', + 'javelin-aphlict', + 'phabricator-notification', + 'javelin-behavior-aphlict-listen', + 'javelin-behavior-phabricator-search-typeahead', + 'javelin-behavior-aphlict-dropdown', + 'javelin-behavior-history-install', + 'javelin-behavior-phabricator-gesture', + 'javelin-behavior-phabricator-remarkup-assist', + 'phabricator-textareautils', + 'phabricator-file-upload', + 'javelin-behavior-global-drag-and-drop', + 'javelin-behavior-phabricator-reveal-content', + 'phui-hovercard', + 'phui-hovercard-list', + 'javelin-behavior-phui-hovercards', + 'javelin-color', + 'javelin-fx', + 'phabricator-draggable-list', + 'javelin-behavior-phabricator-transaction-list', + 'javelin-behavior-phabricator-show-older-transactions', + 'javelin-behavior-phui-dropdown-menu', + 'javelin-behavior-doorkeeper-tag', + 'phabricator-title', + 'javelin-leader', + 'javelin-websocket', + 'javelin-behavior-dashboard-async-panel', + 'javelin-behavior-dashboard-tab-panel', + 'javelin-quicksand', + 'javelin-behavior-quicksand-blacklist', + 'javelin-behavior-high-security-warning', + 'javelin-behavior-read-only-warning', + 'javelin-scrollbar', + 'javelin-behavior-scrollbar', + 'javelin-behavior-durable-column', + 'conpherence-thread-manager', + 'javelin-behavior-detect-timezone', + 'javelin-behavior-setup-check-https', + 'javelin-behavior-aphlict-status', + 'javelin-behavior-user-menu', + 'phabricator-favicon', + 'javelin-behavior-phui-tab-group', + 'javelin-behavior-phui-submenu', + 'phuix-button-view', + 'javelin-behavior-comment-actions', + 'phuix-form-control-view', + 'phuix-autocomplete', + ), + 'dark-console.pkg.js' => array( + 'javelin-behavior-dark-console', + 'phabricator-darklog', + 'phabricator-darkmessage', + ), + 'differential.pkg.css' => array( + 'differential-core-view-css', + 'differential-changeset-view-css', + 'differential-revision-history-css', + 'differential-revision-list-css', + 'differential-table-of-contents-css', + 'differential-revision-comment-css', + 'differential-revision-add-comment-css', + 'phabricator-object-selector-css', + 'phabricator-content-source-view-css', + 'inline-comment-summary-css', + 'phui-inline-comment-view-css', + 'diff-tree-view-css', + 'phui-formation-view-css', + ), + 'differential.pkg.js' => array( + 'phabricator-drag-and-drop-file-upload', + 'phabricator-shaped-request', + 'javelin-behavior-differential-populate', + 'javelin-behavior-differential-diff-radios', + 'javelin-behavior-aphront-drag-and-drop-textarea', + 'javelin-behavior-phabricator-object-selector', + 'javelin-behavior-repository-crossreference', + 'javelin-behavior-aphront-more', + 'phabricator-diff-inline-content-state', + 'phabricator-diff-inline', + 'phabricator-diff-changeset', + 'phabricator-diff-changeset-list', + 'phabricator-diff-tree-view', + 'phabricator-diff-path-view', + 'phuix-formation-view', + 'phuix-formation-column-view', + 'phuix-formation-flank-view', + 'javelin-external-editor-link-engine', + ), + 'diffusion.pkg.css' => array( + 'diffusion-icons-css', + ), + 'diffusion.pkg.js' => array( + 'javelin-behavior-diffusion-pull-lastmodified', + 'javelin-behavior-diffusion-commit-graph', + 'javelin-behavior-audit-preview', + ), + 'maniphest.pkg.css' => array( + 'maniphest-task-summary-css', + ), + 'maniphest.pkg.js' => array( + 'javelin-behavior-maniphest-batch-selector', + 'javelin-behavior-maniphest-list-editor', + ), + ), +); diff --git a/resources/celerity/packages.php b/resources/celerity/packages.php new file mode 100644 index 0000000000..fc5a4f11b6 --- /dev/null +++ b/resources/celerity/packages.php @@ -0,0 +1,248 @@ + array( + 'javelin-util', + 'javelin-install', + 'javelin-event', + 'javelin-stratcom', + 'javelin-behavior', + 'javelin-resource', + 'javelin-request', + 'javelin-vector', + 'javelin-dom', + 'javelin-json', + 'javelin-uri', + 'javelin-workflow', + 'javelin-mask', + 'javelin-typeahead', + 'javelin-typeahead-normalizer', + 'javelin-typeahead-source', + 'javelin-typeahead-preloaded-source', + 'javelin-typeahead-ondemand-source', + 'javelin-tokenizer', + 'javelin-history', + 'javelin-router', + 'javelin-routable', + 'javelin-behavior-aphront-basic-tokenizer', + 'javelin-behavior-workflow', + 'javelin-behavior-aphront-form-disable-on-submit', + 'phabricator-keyboard-shortcut-manager', + 'phabricator-keyboard-shortcut', + 'javelin-behavior-phabricator-keyboard-shortcuts', + 'javelin-behavior-refresh-csrf', + 'javelin-behavior-phabricator-watch-anchor', + 'javelin-behavior-phabricator-autofocus', + 'phuix-dropdown-menu', + 'phuix-action-list-view', + 'phuix-action-view', + 'phuix-icon-view', + 'phabricator-phtize', + 'javelin-behavior-phabricator-oncopy', + 'phabricator-tooltip', + 'javelin-behavior-phabricator-tooltips', + 'phabricator-prefab', + 'javelin-behavior-device', + 'javelin-behavior-toggle-class', + 'javelin-behavior-lightbox-attachments', + 'phabricator-busy', + 'javelin-sound', + 'javelin-aphlict', + 'phabricator-notification', + 'javelin-behavior-aphlict-listen', + 'javelin-behavior-phabricator-search-typeahead', + 'javelin-behavior-aphlict-dropdown', + 'javelin-behavior-history-install', + 'javelin-behavior-phabricator-gesture', + 'javelin-behavior-phabricator-remarkup-assist', + 'phabricator-textareautils', + 'phabricator-file-upload', + 'javelin-behavior-global-drag-and-drop', + 'javelin-behavior-phabricator-reveal-content', + 'phui-hovercard', + 'phui-hovercard-list', + 'javelin-behavior-phui-hovercards', + 'javelin-color', + 'javelin-fx', + 'phabricator-draggable-list', + 'javelin-behavior-phabricator-transaction-list', + 'javelin-behavior-phabricator-show-older-transactions', + 'javelin-behavior-phui-dropdown-menu', + 'javelin-behavior-doorkeeper-tag', + 'phabricator-title', + 'javelin-leader', + 'javelin-websocket', + 'javelin-behavior-dashboard-async-panel', + 'javelin-behavior-dashboard-tab-panel', + 'javelin-quicksand', + 'javelin-behavior-quicksand-blacklist', + 'javelin-behavior-high-security-warning', + 'javelin-behavior-read-only-warning', + 'javelin-scrollbar', + 'javelin-behavior-scrollbar', + 'javelin-behavior-durable-column', + 'conpherence-thread-manager', + 'javelin-behavior-detect-timezone', + 'javelin-behavior-setup-check-https', + 'javelin-behavior-aphlict-status', + 'javelin-behavior-user-menu', + 'phabricator-favicon', + 'javelin-behavior-phui-tab-group', + 'javelin-behavior-phui-submenu', + 'phuix-button-view', + 'javelin-behavior-comment-actions', + 'phuix-form-control-view', + 'phuix-autocomplete', + ), + 'core.pkg.css' => array( + 'phabricator-core-css', + 'phabricator-zindex-css', + 'phui-button-css', + 'phui-button-simple-css', + 'phui-theme-css', + 'phabricator-standard-page-view', + 'aphront-dialog-view-css', + 'phui-form-view-css', + 'aphront-panel-view-css', + 'aphront-table-view-css', + 'aphront-tokenizer-control-css', + 'aphront-typeahead-control-css', + 'aphront-list-filter-view-css', + 'application-search-view-css', + + 'phabricator-remarkup-css', + 'syntax-highlighting-css', + 'syntax-default-css', + 'phui-pager-css', + 'aphront-tooltip-css', + 'phabricator-flag-css', + 'phui-info-view-css', + + 'phabricator-main-menu-view', + 'phabricator-notification-css', + 'phabricator-notification-menu-css', + 'phui-lightbox-css', + 'phui-comment-panel-css', + 'phui-header-view-css', + 'phabricator-nav-view-css', + 'phui-basic-nav-view-css', + 'phui-crumbs-view-css', + 'phui-oi-list-view-css', + 'phui-oi-color-css', + 'phui-oi-big-ui-css', + 'phui-oi-drag-ui-css', + 'phui-oi-simple-ui-css', + 'phui-oi-flush-ui-css', + 'global-drag-and-drop-css', + 'phui-spacing-css', + 'phui-form-css', + 'phui-icon-view-css', + + 'phabricator-action-list-view-css', + 'phui-property-list-view-css', + 'phui-tag-view-css', + 'phui-list-view-css', + + 'font-fontawesome', + 'font-lato', + 'phui-font-icon-base-css', + 'phui-fontkit-css', + 'phui-box-css', + 'phui-object-box-css', + 'phui-timeline-view-css', + 'phui-two-column-view-css', + 'phui-curtain-view-css', + + 'sprite-login-css', + 'sprite-tokens-css', + 'tokens-css', + 'auth-css', + + 'phui-status-list-view-css', + 'phui-feed-story-css', + 'phabricator-feed-css', + 'phabricator-dashboard-css', + 'aphront-multi-column-view-css', + 'phui-curtain-object-ref-view-css', + 'phui-comment-form-css', + 'phui-head-thing-view-css', + + 'conpherence-durable-column-view', + 'phui-button-bar-css', + ), + 'conpherence.pkg.css' => array( + 'conpherence-menu-css', + 'conpherence-color-css', + 'conpherence-message-pane-css', + 'conpherence-notification-css', + 'conpherence-transaction-css', + 'conpherence-participant-pane-css', + 'conpherence-header-pane-css', + ), + 'conpherence.pkg.js' => array( + 'javelin-behavior-conpherence-menu', + 'javelin-behavior-conpherence-participant-pane', + 'javelin-behavior-conpherence-pontificate', + 'javelin-behavior-toggle-widget', + ), + 'differential.pkg.css' => array( + 'differential-core-view-css', + 'differential-changeset-view-css', + 'differential-revision-history-css', + 'differential-revision-list-css', + 'differential-table-of-contents-css', + 'differential-revision-comment-css', + 'differential-revision-add-comment-css', + 'phabricator-object-selector-css', + 'phabricator-content-source-view-css', + 'inline-comment-summary-css', + 'phui-inline-comment-view-css', + 'diff-tree-view-css', + 'phui-formation-view-css', + ), + 'differential.pkg.js' => array( + 'phabricator-drag-and-drop-file-upload', + 'phabricator-shaped-request', + + 'javelin-behavior-differential-populate', + 'javelin-behavior-differential-diff-radios', + 'javelin-behavior-aphront-drag-and-drop-textarea', + 'javelin-behavior-phabricator-object-selector', + 'javelin-behavior-repository-crossreference', + + 'javelin-behavior-aphront-more', + + 'phabricator-diff-inline-content-state', + 'phabricator-diff-inline', + 'phabricator-diff-changeset', + 'phabricator-diff-changeset-list', + 'phabricator-diff-tree-view', + 'phabricator-diff-path-view', + + 'phuix-formation-view', + 'phuix-formation-column-view', + 'phuix-formation-flank-view', + + 'javelin-external-editor-link-engine', + ), + 'diffusion.pkg.css' => array( + 'diffusion-icons-css', + ), + 'diffusion.pkg.js' => array( + 'javelin-behavior-diffusion-pull-lastmodified', + 'javelin-behavior-diffusion-commit-graph', + 'javelin-behavior-audit-preview', + ), + 'maniphest.pkg.css' => array( + 'maniphest-task-summary-css', + ), + 'maniphest.pkg.js' => array( + 'javelin-behavior-maniphest-batch-selector', + 'javelin-behavior-maniphest-list-editor', + ), + 'dark-console.pkg.js' => array( + 'javelin-behavior-dark-console', + 'phabricator-darklog', + 'phabricator-darkmessage', + ), +); diff --git a/resources/chatbot/example_config.json b/resources/chatbot/example_config.json deleted file mode 100644 index 670184eae0..0000000000 --- a/resources/chatbot/example_config.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "server" : "irc.freenode.net", - "port" : 6667, - "nick" : "phabot", - "join" : [ - "#phabot-test" - ], - "handlers" : [ - "PhabricatorBotObjectNameHandler", - "PhabricatorBotSymbolHandler", - "PhabricatorBotLogHandler", - "PhabricatorBotWhatsNewHandler", - "PhabricatorBotDifferentialNotificationHandler", - "PhabricatorBotMacroHandler" - ], - - "conduit.uri" : null, - "conduit.user" : null, - "conduit.cert" : null, - - "macro.size" : 48, - "macro.aspect" : 0.66, - - "notification.channels" : ["#phabot-test"] -} diff --git a/resources/cows/builtin/companion.cow b/resources/cows/builtin/companion.cow new file mode 100644 index 0000000000..e3514cda6f --- /dev/null +++ b/resources/cows/builtin/companion.cow @@ -0,0 +1,9 @@ + $thoughts + $thoughts + /---\__/---\\ + | / .... \ || + \ ..--.. // + |..($eyes). || + / ..--.. \\ + | \ .... / || + \---/--\---// diff --git a/resources/cows/custom/README b/resources/cows/custom/README new file mode 100644 index 0000000000..d0c28b6a56 --- /dev/null +++ b/resources/cows/custom/README @@ -0,0 +1,2 @@ +You can add custom ".cow" files here to make them available to the "cowsay" +interpreter in Remarkup. diff --git a/resources/emoji/manifest.json b/resources/emoji/manifest.json new file mode 100644 index 0000000000..47568fb43d --- /dev/null +++ b/resources/emoji/manifest.json @@ -0,0 +1,1630 @@ +{ + "8ball": "\ud83c\udfb1", + "a": "\ud83c\udd70", + "ab": "\ud83c\udd8e", + "abc": "\ud83d\udd24", + "abcd": "\ud83d\udd21", + "accept": "\ud83c\ude51", + "aerial_tramway": "\ud83d\udea1", + "airplane": "\u2708", + "airplane_arriving": "\ud83d\udeec", + "airplane_departure": "\ud83d\udeeb", + "airplane_small": "\ud83d\udee9", + "alarm_clock": "\u23f0", + "alembic": "\u2697", + "alien": "\ud83d\udc7d", + "ambulance": "\ud83d\ude91", + "amphora": "\ud83c\udffa", + "anchor": "\u2693", + "angel": "\ud83d\udc7c", + "angel_tone1": "\ud83d\udc7c\ud83c\udffb", + "angel_tone2": "\ud83d\udc7c\ud83c\udffc", + "angel_tone3": "\ud83d\udc7c\ud83c\udffd", + "angel_tone4": "\ud83d\udc7c\ud83c\udffe", + "angel_tone5": "\ud83d\udc7c\ud83c\udfff", + "anger": "\ud83d\udca2", + "anger_right": "\ud83d\uddef", + "angry": "\ud83d\ude20", + "anguished": "\ud83d\ude27", + "ant": "\ud83d\udc1c", + "apple": "\ud83c\udf4e", + "aquarius": "\u2652", + "aries": "\u2648", + "arrow_backward": "\u25c0", + "arrow_double_down": "\u23ec", + "arrow_double_up": "\u23eb", + "arrow_down": "\u2b07", + "arrow_down_small": "\ud83d\udd3d", + "arrow_forward": "\u25b6", + "arrow_heading_down": "\u2935", + "arrow_heading_up": "\u2934", + "arrow_left": "\u2b05", + "arrow_lower_left": "\u2199", + "arrow_lower_right": "\u2198", + "arrow_right": "\u27a1", + "arrow_right_hook": "\u21aa", + "arrow_up": "\u2b06", + "arrow_up_down": "\u2195", + "arrow_up_small": "\ud83d\udd3c", + "arrow_upper_left": "\u2196", + "arrow_upper_right": "\u2197", + "arrows_clockwise": "\ud83d\udd03", + "arrows_counterclockwise": "\ud83d\udd04", + "art": "\ud83c\udfa8", + "articulated_lorry": "\ud83d\ude9b", + "asterisk": "*\u20e3", + "astonished": "\ud83d\ude32", + "athletic_shoe": "\ud83d\udc5f", + "atm": "\ud83c\udfe7", + "atom": "\u269b", + "b": "\ud83c\udd71", + "baby": "\ud83d\udc76", + "baby_bottle": "\ud83c\udf7c", + "baby_chick": "\ud83d\udc24", + "baby_symbol": "\ud83d\udebc", + "baby_tone1": "\ud83d\udc76\ud83c\udffb", + "baby_tone2": "\ud83d\udc76\ud83c\udffc", + "baby_tone3": "\ud83d\udc76\ud83c\udffd", + "baby_tone4": "\ud83d\udc76\ud83c\udffe", + "baby_tone5": "\ud83d\udc76\ud83c\udfff", + "back": "\ud83d\udd19", + "badminton": "\ud83c\udff8", + "baggage_claim": "\ud83d\udec4", + "balloon": "\ud83c\udf88", + "ballot_box": "\ud83d\uddf3", + "ballot_box_with_check": "\u2611", + "bamboo": "\ud83c\udf8d", + "banana": "\ud83c\udf4c", + "bangbang": "\u203c", + "bank": "\ud83c\udfe6", + "bar_chart": "\ud83d\udcca", + "barber": "\ud83d\udc88", + "baseball": "\u26be", + "basketball": "\ud83c\udfc0", + "basketball_player": "\u26f9", + "basketball_player_tone1": "\u26f9\ud83c\udffb", + "basketball_player_tone2": "\u26f9\ud83c\udffc", + "basketball_player_tone3": "\u26f9\ud83c\udffd", + "basketball_player_tone4": "\u26f9\ud83c\udffe", + "basketball_player_tone5": "\u26f9\ud83c\udfff", + "bath": "\ud83d\udec0", + "bath_tone1": "\ud83d\udec0\ud83c\udffb", + "bath_tone2": "\ud83d\udec0\ud83c\udffc", + "bath_tone3": "\ud83d\udec0\ud83c\udffd", + "bath_tone4": "\ud83d\udec0\ud83c\udffe", + "bath_tone5": "\ud83d\udec0\ud83c\udfff", + "bathtub": "\ud83d\udec1", + "battery": "\ud83d\udd0b", + "beach": "\ud83c\udfd6", + "beach_umbrella": "\u26f1", + "bear": "\ud83d\udc3b", + "bed": "\ud83d\udecf", + "bee": "\ud83d\udc1d", + "beer": "\ud83c\udf7a", + "beers": "\ud83c\udf7b", + "beetle": "\ud83d\udc1e", + "beginner": "\ud83d\udd30", + "bell": "\ud83d\udd14", + "bellhop": "\ud83d\udece", + "bento": "\ud83c\udf71", + "bicyclist": "\ud83d\udeb4", + "bicyclist_tone1": "\ud83d\udeb4\ud83c\udffb", + "bicyclist_tone2": "\ud83d\udeb4\ud83c\udffc", + "bicyclist_tone3": "\ud83d\udeb4\ud83c\udffd", + "bicyclist_tone4": "\ud83d\udeb4\ud83c\udffe", + "bicyclist_tone5": "\ud83d\udeb4\ud83c\udfff", + "bike": "\ud83d\udeb2", + "bikini": "\ud83d\udc59", + "biohazard": "\u2623", + "bird": "\ud83d\udc26", + "birthday": "\ud83c\udf82", + "black_circle": "\u26ab", + "black_joker": "\ud83c\udccf", + "black_large_square": "\u2b1b", + "black_medium_small_square": "\u25fe", + "black_medium_square": "\u25fc", + "black_nib": "\u2712", + "black_small_square": "\u25aa", + "black_square_button": "\ud83d\udd32", + "blossom": "\ud83c\udf3c", + "blowfish": "\ud83d\udc21", + "blue_book": "\ud83d\udcd8", + "blue_car": "\ud83d\ude99", + "blue_heart": "\ud83d\udc99", + "blush": "\ud83d\ude0a", + "boar": "\ud83d\udc17", + "bomb": "\ud83d\udca3", + "book": "\ud83d\udcd6", + "bookmark": "\ud83d\udd16", + "bookmark_tabs": "\ud83d\udcd1", + "books": "\ud83d\udcda", + "boom": "\ud83d\udca5", + "boot": "\ud83d\udc62", + "bouquet": "\ud83d\udc90", + "bow": "\ud83d\ude47", + "bow_and_arrow": "\ud83c\udff9", + "bow_tone1": "\ud83d\ude47\ud83c\udffb", + "bow_tone2": "\ud83d\ude47\ud83c\udffc", + "bow_tone3": "\ud83d\ude47\ud83c\udffd", + "bow_tone4": "\ud83d\ude47\ud83c\udffe", + "bow_tone5": "\ud83d\ude47\ud83c\udfff", + "bowling": "\ud83c\udfb3", + "boy": "\ud83d\udc66", + "boy_tone1": "\ud83d\udc66\ud83c\udffb", + "boy_tone2": "\ud83d\udc66\ud83c\udffc", + "boy_tone3": "\ud83d\udc66\ud83c\udffd", + "boy_tone4": "\ud83d\udc66\ud83c\udffe", + "boy_tone5": "\ud83d\udc66\ud83c\udfff", + "bread": "\ud83c\udf5e", + "bride_with_veil": "\ud83d\udc70", + "bride_with_veil_tone1": "\ud83d\udc70\ud83c\udffb", + "bride_with_veil_tone2": "\ud83d\udc70\ud83c\udffc", + "bride_with_veil_tone3": "\ud83d\udc70\ud83c\udffd", + "bride_with_veil_tone4": "\ud83d\udc70\ud83c\udffe", + "bride_with_veil_tone5": "\ud83d\udc70\ud83c\udfff", + "bridge_at_night": "\ud83c\udf09", + "briefcase": "\ud83d\udcbc", + "broken_heart": "\ud83d\udc94", + "bug": "\ud83d\udc1b", + "bulb": "\ud83d\udca1", + "bullettrain_front": "\ud83d\ude85", + "bullettrain_side": "\ud83d\ude84", + "burrito": "\ud83c\udf2f", + "bus": "\ud83d\ude8c", + "busstop": "\ud83d\ude8f", + "bust_in_silhouette": "\ud83d\udc64", + "busts_in_silhouette": "\ud83d\udc65", + "cactus": "\ud83c\udf35", + "cake": "\ud83c\udf70", + "calendar": "\ud83d\udcc6", + "calendar_spiral": "\ud83d\uddd3", + "calling": "\ud83d\udcf2", + "camel": "\ud83d\udc2b", + "camera": "\ud83d\udcf7", + "camera_with_flash": "\ud83d\udcf8", + "camping": "\ud83c\udfd5", + "cancer": "\u264b", + "candle": "\ud83d\udd6f", + "candy": "\ud83c\udf6c", + "capital_abcd": "\ud83d\udd20", + "capricorn": "\u2651", + "card_box": "\ud83d\uddc3", + "card_index": "\ud83d\udcc7", + "carousel_horse": "\ud83c\udfa0", + "cat": "\ud83d\udc31", + "cat2": "\ud83d\udc08", + "cd": "\ud83d\udcbf", + "chains": "\u26d3", + "champagne": "\ud83c\udf7e", + "chart": "\ud83d\udcb9", + "chart_with_downwards_trend": "\ud83d\udcc9", + "chart_with_upwards_trend": "\ud83d\udcc8", + "checkered_flag": "\ud83c\udfc1", + "cheese": "\ud83e\uddc0", + "cherries": "\ud83c\udf52", + "cherry_blossom": "\ud83c\udf38", + "chestnut": "\ud83c\udf30", + "chicken": "\ud83d\udc14", + "children_crossing": "\ud83d\udeb8", + "chipmunk": "\ud83d\udc3f", + "chocolate_bar": "\ud83c\udf6b", + "christmas_tree": "\ud83c\udf84", + "church": "\u26ea", + "cinema": "\ud83c\udfa6", + "circus_tent": "\ud83c\udfaa", + "city_dusk": "\ud83c\udf06", + "city_sunset": "\ud83c\udf07", + "cityscape": "\ud83c\udfd9", + "cl": "\ud83c\udd91", + "clap": "\ud83d\udc4f", + "clap_tone1": "\ud83d\udc4f\ud83c\udffb", + "clap_tone2": "\ud83d\udc4f\ud83c\udffc", + "clap_tone3": "\ud83d\udc4f\ud83c\udffd", + "clap_tone4": "\ud83d\udc4f\ud83c\udffe", + "clap_tone5": "\ud83d\udc4f\ud83c\udfff", + "clapper": "\ud83c\udfac", + "classical_building": "\ud83c\udfdb", + "clipboard": "\ud83d\udccb", + "clock": "\ud83d\udd70", + "clock1": "\ud83d\udd50", + "clock10": "\ud83d\udd59", + "clock1030": "\ud83d\udd65", + "clock11": "\ud83d\udd5a", + "clock1130": "\ud83d\udd66", + "clock12": "\ud83d\udd5b", + "clock1230": "\ud83d\udd67", + "clock130": "\ud83d\udd5c", + "clock2": "\ud83d\udd51", + "clock230": "\ud83d\udd5d", + "clock3": "\ud83d\udd52", + "clock330": "\ud83d\udd5e", + "clock4": "\ud83d\udd53", + "clock430": "\ud83d\udd5f", + "clock5": "\ud83d\udd54", + "clock530": "\ud83d\udd60", + "clock6": "\ud83d\udd55", + "clock630": "\ud83d\udd61", + "clock7": "\ud83d\udd56", + "clock730": "\ud83d\udd62", + "clock8": "\ud83d\udd57", + "clock830": "\ud83d\udd63", + "clock9": "\ud83d\udd58", + "clock930": "\ud83d\udd64", + "closed_book": "\ud83d\udcd5", + "closed_lock_with_key": "\ud83d\udd10", + "closed_umbrella": "\ud83c\udf02", + "cloud": "\u2601", + "cloud_lightning": "\ud83c\udf29", + "cloud_rain": "\ud83c\udf27", + "cloud_snow": "\ud83c\udf28", + "cloud_tornado": "\ud83c\udf2a", + "clubs": "\u2663", + "cocktail": "\ud83c\udf78", + "coffee": "\u2615", + "coffin": "\u26b0", + "cold_sweat": "\ud83d\ude30", + "comet": "\u2604", + "compression": "\ud83d\udddc", + "computer": "\ud83d\udcbb", + "confetti_ball": "\ud83c\udf8a", + "confounded": "\ud83d\ude16", + "confused": "\ud83d\ude15", + "congratulations": "\u3297", + "construction": "\ud83d\udea7", + "construction_site": "\ud83c\udfd7", + "construction_worker": "\ud83d\udc77", + "construction_worker_tone1": "\ud83d\udc77\ud83c\udffb", + "construction_worker_tone2": "\ud83d\udc77\ud83c\udffc", + "construction_worker_tone3": "\ud83d\udc77\ud83c\udffd", + "construction_worker_tone4": "\ud83d\udc77\ud83c\udffe", + "construction_worker_tone5": "\ud83d\udc77\ud83c\udfff", + "control_knobs": "\ud83c\udf9b", + "convenience_store": "\ud83c\udfea", + "cookie": "\ud83c\udf6a", + "cool": "\ud83c\udd92", + "cop": "\ud83d\udc6e", + "cop_tone1": "\ud83d\udc6e\ud83c\udffb", + "cop_tone2": "\ud83d\udc6e\ud83c\udffc", + "cop_tone3": "\ud83d\udc6e\ud83c\udffd", + "cop_tone4": "\ud83d\udc6e\ud83c\udffe", + "cop_tone5": "\ud83d\udc6e\ud83c\udfff", + "copyright": "\u00a9", + "corn": "\ud83c\udf3d", + "couch": "\ud83d\udecb", + "couple": "\ud83d\udc6b", + "couple_mm": "\ud83d\udc68\u2764\ud83d\udc68", + "couple_with_heart": "\ud83d\udc91", + "couple_ww": "\ud83d\udc69\u2764\ud83d\udc69", + "couplekiss": "\ud83d\udc8f", + "cow": "\ud83d\udc2e", + "cow2": "\ud83d\udc04", + "crab": "\ud83e\udd80", + "crayon": "\ud83d\udd8d", + "credit_card": "\ud83d\udcb3", + "crescent_moon": "\ud83c\udf19", + "cricket": "\ud83c\udfcf", + "crocodile": "\ud83d\udc0a", + "cross": "\u271d", + "crossed_flags": "\ud83c\udf8c", + "crossed_swords": "\u2694", + "crown": "\ud83d\udc51", + "cruise_ship": "\ud83d\udef3", + "cry": "\ud83d\ude22", + "crying_cat_face": "\ud83d\ude3f", + "crystal_ball": "\ud83d\udd2e", + "cupid": "\ud83d\udc98", + "curly_loop": "\u27b0", + "currency_exchange": "\ud83d\udcb1", + "curry": "\ud83c\udf5b", + "custard": "\ud83c\udf6e", + "customs": "\ud83d\udec3", + "cyclone": "\ud83c\udf00", + "dagger": "\ud83d\udde1", + "dancer": "\ud83d\udc83", + "dancer_tone1": "\ud83d\udc83\ud83c\udffb", + "dancer_tone2": "\ud83d\udc83\ud83c\udffc", + "dancer_tone3": "\ud83d\udc83\ud83c\udffd", + "dancer_tone4": "\ud83d\udc83\ud83c\udffe", + "dancer_tone5": "\ud83d\udc83\ud83c\udfff", + "dancers": "\ud83d\udc6f", + "dango": "\ud83c\udf61", + "dark_sunglasses": "\ud83d\udd76", + "dart": "\ud83c\udfaf", + "dash": "\ud83d\udca8", + "date": "\ud83d\udcc5", + "deciduous_tree": "\ud83c\udf33", + "department_store": "\ud83c\udfec", + "desert": "\ud83c\udfdc", + "desktop": "\ud83d\udda5", + "diamond_shape_with_a_dot_inside": "\ud83d\udca0", + "diamonds": "\u2666", + "disappointed": "\ud83d\ude1e", + "disappointed_relieved": "\ud83d\ude25", + "dividers": "\ud83d\uddc2", + "dizzy": "\ud83d\udcab", + "dizzy_face": "\ud83d\ude35", + "do_not_litter": "\ud83d\udeaf", + "dog": "\ud83d\udc36", + "dog2": "\ud83d\udc15", + "dollar": "\ud83d\udcb5", + "dolls": "\ud83c\udf8e", + "dolphin": "\ud83d\udc2c", + "door": "\ud83d\udeaa", + "doughnut": "\ud83c\udf69", + "dove": "\ud83d\udd4a", + "dragon": "\ud83d\udc09", + "dragon_face": "\ud83d\udc32", + "dress": "\ud83d\udc57", + "dromedary_camel": "\ud83d\udc2a", + "droplet": "\ud83d\udca7", + "dvd": "\ud83d\udcc0", + "e-mail": "\ud83d\udce7", + "ear": "\ud83d\udc42", + "ear_of_rice": "\ud83c\udf3e", + "ear_tone1": "\ud83d\udc42\ud83c\udffb", + "ear_tone2": "\ud83d\udc42\ud83c\udffc", + "ear_tone3": "\ud83d\udc42\ud83c\udffd", + "ear_tone4": "\ud83d\udc42\ud83c\udffe", + "ear_tone5": "\ud83d\udc42\ud83c\udfff", + "earth_africa": "\ud83c\udf0d", + "earth_americas": "\ud83c\udf0e", + "earth_asia": "\ud83c\udf0f", + "egg": "\ud83c\udf73", + "eggplant": "\ud83c\udf46", + "eight": "8\u20e3", + "eight_pointed_black_star": "\u2734", + "eight_spoked_asterisk": "\u2733", + "electric_plug": "\ud83d\udd0c", + "elephant": "\ud83d\udc18", + "end": "\ud83d\udd1a", + "envelope": "\u2709", + "envelope_with_arrow": "\ud83d\udce9", + "euro": "\ud83d\udcb6", + "european_castle": "\ud83c\udff0", + "european_post_office": "\ud83c\udfe4", + "evergreen_tree": "\ud83c\udf32", + "exclamation": "\u2757", + "expressionless": "\ud83d\ude11", + "eye": "\ud83d\udc41", + "eye_in_speech_bubble": "\ud83d\udc41\ud83d\udde8", + "eyeglasses": "\ud83d\udc53", + "eyes": "\ud83d\udc40", + "factory": "\ud83c\udfed", + "fallen_leaf": "\ud83c\udf42", + "family": "\ud83d\udc6a", + "family_mmb": "\ud83d\udc68\ud83d\udc68\ud83d\udc66", + "family_mmbb": "\ud83d\udc68\ud83d\udc68\ud83d\udc66\ud83d\udc66", + "family_mmg": "\ud83d\udc68\ud83d\udc68\ud83d\udc67", + "family_mmgb": "\ud83d\udc68\ud83d\udc68\ud83d\udc67\ud83d\udc66", + "family_mmgg": "\ud83d\udc68\ud83d\udc68\ud83d\udc67\ud83d\udc67", + "family_mwbb": "\ud83d\udc68\ud83d\udc69\ud83d\udc66\ud83d\udc66", + "family_mwg": "\ud83d\udc68\ud83d\udc69\ud83d\udc67", + "family_mwgb": "\ud83d\udc68\ud83d\udc69\ud83d\udc67\ud83d\udc66", + "family_mwgg": "\ud83d\udc68\ud83d\udc69\ud83d\udc67\ud83d\udc67", + "family_wwb": "\ud83d\udc69\ud83d\udc69\ud83d\udc66", + "family_wwbb": "\ud83d\udc69\ud83d\udc69\ud83d\udc66\ud83d\udc66", + "family_wwg": "\ud83d\udc69\ud83d\udc69\ud83d\udc67", + "family_wwgb": "\ud83d\udc69\ud83d\udc69\ud83d\udc67\ud83d\udc66", + "family_wwgg": "\ud83d\udc69\ud83d\udc69\ud83d\udc67\ud83d\udc67", + "fast_forward": "\u23e9", + "fax": "\ud83d\udce0", + "fearful": "\ud83d\ude28", + "feet": "\ud83d\udc3e", + "ferris_wheel": "\ud83c\udfa1", + "ferry": "\u26f4", + "field_hockey": "\ud83c\udfd1", + "file_cabinet": "\ud83d\uddc4", + "file_folder": "\ud83d\udcc1", + "film_frames": "\ud83c\udf9e", + "fire": "\ud83d\udd25", + "fire_engine": "\ud83d\ude92", + "fireworks": "\ud83c\udf86", + "first_quarter_moon": "\ud83c\udf13", + "first_quarter_moon_with_face": "\ud83c\udf1b", + "fish": "\ud83d\udc1f", + "fish_cake": "\ud83c\udf65", + "fishing_pole_and_fish": "\ud83c\udfa3", + "fist": "\u270a", + "fist_tone1": "\u270a\ud83c\udffb", + "fist_tone2": "\u270a\ud83c\udffc", + "fist_tone3": "\u270a\ud83c\udffd", + "fist_tone4": "\u270a\ud83c\udffe", + "fist_tone5": "\u270a\ud83c\udfff", + "five": "5\u20e3", + "flag_ac": "\ud83c\udde6\ud83c\udde8", + "flag_ad": "\ud83c\udde6\ud83c\udde9", + "flag_ae": "\ud83c\udde6\ud83c\uddea", + "flag_af": "\ud83c\udde6\ud83c\uddeb", + "flag_ag": "\ud83c\udde6\ud83c\uddec", + "flag_ai": "\ud83c\udde6\ud83c\uddee", + "flag_al": "\ud83c\udde6\ud83c\uddf1", + "flag_am": "\ud83c\udde6\ud83c\uddf2", + "flag_ao": "\ud83c\udde6\ud83c\uddf4", + "flag_aq": "\ud83c\udde6\ud83c\uddf6", + "flag_ar": "\ud83c\udde6\ud83c\uddf7", + "flag_as": "\ud83c\udde6\ud83c\uddf8", + "flag_at": "\ud83c\udde6\ud83c\uddf9", + "flag_au": "\ud83c\udde6\ud83c\uddfa", + "flag_aw": "\ud83c\udde6\ud83c\uddfc", + "flag_ax": "\ud83c\udde6\ud83c\uddfd", + "flag_az": "\ud83c\udde6\ud83c\uddff", + "flag_ba": "\ud83c\udde7\ud83c\udde6", + "flag_bb": "\ud83c\udde7\ud83c\udde7", + "flag_bd": "\ud83c\udde7\ud83c\udde9", + "flag_be": "\ud83c\udde7\ud83c\uddea", + "flag_bf": "\ud83c\udde7\ud83c\uddeb", + "flag_bg": "\ud83c\udde7\ud83c\uddec", + "flag_bh": "\ud83c\udde7\ud83c\udded", + "flag_bi": "\ud83c\udde7\ud83c\uddee", + "flag_bj": "\ud83c\udde7\ud83c\uddef", + "flag_bl": "\ud83c\udde7\ud83c\uddf1", + "flag_black": "\ud83c\udff4", + "flag_bm": "\ud83c\udde7\ud83c\uddf2", + "flag_bn": "\ud83c\udde7\ud83c\uddf3", + "flag_bo": "\ud83c\udde7\ud83c\uddf4", + "flag_bq": "\ud83c\udde7\ud83c\uddf6", + "flag_br": "\ud83c\udde7\ud83c\uddf7", + "flag_bs": "\ud83c\udde7\ud83c\uddf8", + "flag_bt": "\ud83c\udde7\ud83c\uddf9", + "flag_bv": "\ud83c\udde7\ud83c\uddfb", + "flag_bw": "\ud83c\udde7\ud83c\uddfc", + "flag_by": "\ud83c\udde7\ud83c\uddfe", + "flag_bz": "\ud83c\udde7\ud83c\uddff", + "flag_ca": "\ud83c\udde8\ud83c\udde6", + "flag_cc": "\ud83c\udde8\ud83c\udde8", + "flag_cd": "\ud83c\udde8\ud83c\udde9", + "flag_cf": "\ud83c\udde8\ud83c\uddeb", + "flag_cg": "\ud83c\udde8\ud83c\uddec", + "flag_ch": "\ud83c\udde8\ud83c\udded", + "flag_ci": "\ud83c\udde8\ud83c\uddee", + "flag_ck": "\ud83c\udde8\ud83c\uddf0", + "flag_cl": "\ud83c\udde8\ud83c\uddf1", + "flag_cm": "\ud83c\udde8\ud83c\uddf2", + "flag_cn": "\ud83c\udde8\ud83c\uddf3", + "flag_co": "\ud83c\udde8\ud83c\uddf4", + "flag_cp": "\ud83c\udde8\ud83c\uddf5", + "flag_cr": "\ud83c\udde8\ud83c\uddf7", + "flag_cu": "\ud83c\udde8\ud83c\uddfa", + "flag_cv": "\ud83c\udde8\ud83c\uddfb", + "flag_cw": "\ud83c\udde8\ud83c\uddfc", + "flag_cx": "\ud83c\udde8\ud83c\uddfd", + "flag_cy": "\ud83c\udde8\ud83c\uddfe", + "flag_cz": "\ud83c\udde8\ud83c\uddff", + "flag_de": "\ud83c\udde9\ud83c\uddea", + "flag_dg": "\ud83c\udde9\ud83c\uddec", + "flag_dj": "\ud83c\udde9\ud83c\uddef", + "flag_dk": "\ud83c\udde9\ud83c\uddf0", + "flag_dm": "\ud83c\udde9\ud83c\uddf2", + "flag_do": "\ud83c\udde9\ud83c\uddf4", + "flag_dz": "\ud83c\udde9\ud83c\uddff", + "flag_ea": "\ud83c\uddea\ud83c\udde6", + "flag_ec": "\ud83c\uddea\ud83c\udde8", + "flag_ee": "\ud83c\uddea\ud83c\uddea", + "flag_eg": "\ud83c\uddea\ud83c\uddec", + "flag_eh": "\ud83c\uddea\ud83c\udded", + "flag_er": "\ud83c\uddea\ud83c\uddf7", + "flag_es": "\ud83c\uddea\ud83c\uddf8", + "flag_et": "\ud83c\uddea\ud83c\uddf9", + "flag_eu": "\ud83c\uddea\ud83c\uddfa", + "flag_fi": "\ud83c\uddeb\ud83c\uddee", + "flag_fj": "\ud83c\uddeb\ud83c\uddef", + "flag_fk": "\ud83c\uddeb\ud83c\uddf0", + "flag_fm": "\ud83c\uddeb\ud83c\uddf2", + "flag_fo": "\ud83c\uddeb\ud83c\uddf4", + "flag_fr": "\ud83c\uddeb\ud83c\uddf7", + "flag_ga": "\ud83c\uddec\ud83c\udde6", + "flag_gb": "\ud83c\uddec\ud83c\udde7", + "flag_gd": "\ud83c\uddec\ud83c\udde9", + "flag_ge": "\ud83c\uddec\ud83c\uddea", + "flag_gf": "\ud83c\uddec\ud83c\uddeb", + "flag_gg": "\ud83c\uddec\ud83c\uddec", + "flag_gh": "\ud83c\uddec\ud83c\udded", + "flag_gi": "\ud83c\uddec\ud83c\uddee", + "flag_gl": "\ud83c\uddec\ud83c\uddf1", + "flag_gm": "\ud83c\uddec\ud83c\uddf2", + "flag_gn": "\ud83c\uddec\ud83c\uddf3", + "flag_gp": "\ud83c\uddec\ud83c\uddf5", + "flag_gq": "\ud83c\uddec\ud83c\uddf6", + "flag_gr": "\ud83c\uddec\ud83c\uddf7", + "flag_gs": "\ud83c\uddec\ud83c\uddf8", + "flag_gt": "\ud83c\uddec\ud83c\uddf9", + "flag_gu": "\ud83c\uddec\ud83c\uddfa", + "flag_gw": "\ud83c\uddec\ud83c\uddfc", + "flag_gy": "\ud83c\uddec\ud83c\uddfe", + "flag_hk": "\ud83c\udded\ud83c\uddf0", + "flag_hm": "\ud83c\udded\ud83c\uddf2", + "flag_hn": "\ud83c\udded\ud83c\uddf3", + "flag_hr": "\ud83c\udded\ud83c\uddf7", + "flag_ht": "\ud83c\udded\ud83c\uddf9", + "flag_hu": "\ud83c\udded\ud83c\uddfa", + "flag_ic": "\ud83c\uddee\ud83c\udde8", + "flag_id": "\ud83c\uddee\ud83c\udde9", + "flag_ie": "\ud83c\uddee\ud83c\uddea", + "flag_il": "\ud83c\uddee\ud83c\uddf1", + "flag_im": "\ud83c\uddee\ud83c\uddf2", + "flag_in": "\ud83c\uddee\ud83c\uddf3", + "flag_io": "\ud83c\uddee\ud83c\uddf4", + "flag_iq": "\ud83c\uddee\ud83c\uddf6", + "flag_ir": "\ud83c\uddee\ud83c\uddf7", + "flag_is": "\ud83c\uddee\ud83c\uddf8", + "flag_it": "\ud83c\uddee\ud83c\uddf9", + "flag_je": "\ud83c\uddef\ud83c\uddea", + "flag_jm": "\ud83c\uddef\ud83c\uddf2", + "flag_jo": "\ud83c\uddef\ud83c\uddf4", + "flag_jp": "\ud83c\uddef\ud83c\uddf5", + "flag_ke": "\ud83c\uddf0\ud83c\uddea", + "flag_kg": "\ud83c\uddf0\ud83c\uddec", + "flag_kh": "\ud83c\uddf0\ud83c\udded", + "flag_ki": "\ud83c\uddf0\ud83c\uddee", + "flag_km": "\ud83c\uddf0\ud83c\uddf2", + "flag_kn": "\ud83c\uddf0\ud83c\uddf3", + "flag_kp": "\ud83c\uddf0\ud83c\uddf5", + "flag_kr": "\ud83c\uddf0\ud83c\uddf7", + "flag_kw": "\ud83c\uddf0\ud83c\uddfc", + "flag_ky": "\ud83c\uddf0\ud83c\uddfe", + "flag_kz": "\ud83c\uddf0\ud83c\uddff", + "flag_la": "\ud83c\uddf1\ud83c\udde6", + "flag_lb": "\ud83c\uddf1\ud83c\udde7", + "flag_lc": "\ud83c\uddf1\ud83c\udde8", + "flag_li": "\ud83c\uddf1\ud83c\uddee", + "flag_lk": "\ud83c\uddf1\ud83c\uddf0", + "flag_lr": "\ud83c\uddf1\ud83c\uddf7", + "flag_ls": "\ud83c\uddf1\ud83c\uddf8", + "flag_lt": "\ud83c\uddf1\ud83c\uddf9", + "flag_lu": "\ud83c\uddf1\ud83c\uddfa", + "flag_lv": "\ud83c\uddf1\ud83c\uddfb", + "flag_ly": "\ud83c\uddf1\ud83c\uddfe", + "flag_ma": "\ud83c\uddf2\ud83c\udde6", + "flag_mc": "\ud83c\uddf2\ud83c\udde8", + "flag_md": "\ud83c\uddf2\ud83c\udde9", + "flag_me": "\ud83c\uddf2\ud83c\uddea", + "flag_mf": "\ud83c\uddf2\ud83c\uddeb", + "flag_mg": "\ud83c\uddf2\ud83c\uddec", + "flag_mh": "\ud83c\uddf2\ud83c\udded", + "flag_mk": "\ud83c\uddf2\ud83c\uddf0", + "flag_ml": "\ud83c\uddf2\ud83c\uddf1", + "flag_mm": "\ud83c\uddf2\ud83c\uddf2", + "flag_mn": "\ud83c\uddf2\ud83c\uddf3", + "flag_mo": "\ud83c\uddf2\ud83c\uddf4", + "flag_mp": "\ud83c\uddf2\ud83c\uddf5", + "flag_mq": "\ud83c\uddf2\ud83c\uddf6", + "flag_mr": "\ud83c\uddf2\ud83c\uddf7", + "flag_ms": "\ud83c\uddf2\ud83c\uddf8", + "flag_mt": "\ud83c\uddf2\ud83c\uddf9", + "flag_mu": "\ud83c\uddf2\ud83c\uddfa", + "flag_mv": "\ud83c\uddf2\ud83c\uddfb", + "flag_mw": "\ud83c\uddf2\ud83c\uddfc", + "flag_mx": "\ud83c\uddf2\ud83c\uddfd", + "flag_my": "\ud83c\uddf2\ud83c\uddfe", + "flag_mz": "\ud83c\uddf2\ud83c\uddff", + "flag_na": "\ud83c\uddf3\ud83c\udde6", + "flag_nc": "\ud83c\uddf3\ud83c\udde8", + "flag_ne": "\ud83c\uddf3\ud83c\uddea", + "flag_nf": "\ud83c\uddf3\ud83c\uddeb", + "flag_ng": "\ud83c\uddf3\ud83c\uddec", + "flag_ni": "\ud83c\uddf3\ud83c\uddee", + "flag_nl": "\ud83c\uddf3\ud83c\uddf1", + "flag_no": "\ud83c\uddf3\ud83c\uddf4", + "flag_np": "\ud83c\uddf3\ud83c\uddf5", + "flag_nr": "\ud83c\uddf3\ud83c\uddf7", + "flag_nu": "\ud83c\uddf3\ud83c\uddfa", + "flag_nz": "\ud83c\uddf3\ud83c\uddff", + "flag_om": "\ud83c\uddf4\ud83c\uddf2", + "flag_pa": "\ud83c\uddf5\ud83c\udde6", + "flag_pe": "\ud83c\uddf5\ud83c\uddea", + "flag_pf": "\ud83c\uddf5\ud83c\uddeb", + "flag_pg": "\ud83c\uddf5\ud83c\uddec", + "flag_ph": "\ud83c\uddf5\ud83c\udded", + "flag_pk": "\ud83c\uddf5\ud83c\uddf0", + "flag_pl": "\ud83c\uddf5\ud83c\uddf1", + "flag_pm": "\ud83c\uddf5\ud83c\uddf2", + "flag_pn": "\ud83c\uddf5\ud83c\uddf3", + "flag_pr": "\ud83c\uddf5\ud83c\uddf7", + "flag_ps": "\ud83c\uddf5\ud83c\uddf8", + "flag_pt": "\ud83c\uddf5\ud83c\uddf9", + "flag_pw": "\ud83c\uddf5\ud83c\uddfc", + "flag_py": "\ud83c\uddf5\ud83c\uddfe", + "flag_qa": "\ud83c\uddf6\ud83c\udde6", + "flag_re": "\ud83c\uddf7\ud83c\uddea", + "flag_ro": "\ud83c\uddf7\ud83c\uddf4", + "flag_rs": "\ud83c\uddf7\ud83c\uddf8", + "flag_ru": "\ud83c\uddf7\ud83c\uddfa", + "flag_rw": "\ud83c\uddf7\ud83c\uddfc", + "flag_sa": "\ud83c\uddf8\ud83c\udde6", + "flag_sb": "\ud83c\uddf8\ud83c\udde7", + "flag_sc": "\ud83c\uddf8\ud83c\udde8", + "flag_sd": "\ud83c\uddf8\ud83c\udde9", + "flag_se": "\ud83c\uddf8\ud83c\uddea", + "flag_sg": "\ud83c\uddf8\ud83c\uddec", + "flag_sh": "\ud83c\uddf8\ud83c\udded", + "flag_si": "\ud83c\uddf8\ud83c\uddee", + "flag_sj": "\ud83c\uddf8\ud83c\uddef", + "flag_sk": "\ud83c\uddf8\ud83c\uddf0", + "flag_sl": "\ud83c\uddf8\ud83c\uddf1", + "flag_sm": "\ud83c\uddf8\ud83c\uddf2", + "flag_sn": "\ud83c\uddf8\ud83c\uddf3", + "flag_so": "\ud83c\uddf8\ud83c\uddf4", + "flag_sr": "\ud83c\uddf8\ud83c\uddf7", + "flag_ss": "\ud83c\uddf8\ud83c\uddf8", + "flag_st": "\ud83c\uddf8\ud83c\uddf9", + "flag_sv": "\ud83c\uddf8\ud83c\uddfb", + "flag_sx": "\ud83c\uddf8\ud83c\uddfd", + "flag_sy": "\ud83c\uddf8\ud83c\uddfe", + "flag_sz": "\ud83c\uddf8\ud83c\uddff", + "flag_ta": "\ud83c\uddf9\ud83c\udde6", + "flag_tc": "\ud83c\uddf9\ud83c\udde8", + "flag_td": "\ud83c\uddf9\ud83c\udde9", + "flag_tf": "\ud83c\uddf9\ud83c\uddeb", + "flag_tg": "\ud83c\uddf9\ud83c\uddec", + "flag_th": "\ud83c\uddf9\ud83c\udded", + "flag_tj": "\ud83c\uddf9\ud83c\uddef", + "flag_tk": "\ud83c\uddf9\ud83c\uddf0", + "flag_tl": "\ud83c\uddf9\ud83c\uddf1", + "flag_tm": "\ud83c\uddf9\ud83c\uddf2", + "flag_tn": "\ud83c\uddf9\ud83c\uddf3", + "flag_to": "\ud83c\uddf9\ud83c\uddf4", + "flag_tr": "\ud83c\uddf9\ud83c\uddf7", + "flag_tt": "\ud83c\uddf9\ud83c\uddf9", + "flag_tv": "\ud83c\uddf9\ud83c\uddfb", + "flag_tw": "\ud83c\uddf9\ud83c\uddfc", + "flag_tz": "\ud83c\uddf9\ud83c\uddff", + "flag_ua": "\ud83c\uddfa\ud83c\udde6", + "flag_ug": "\ud83c\uddfa\ud83c\uddec", + "flag_um": "\ud83c\uddfa\ud83c\uddf2", + "flag_us": "\ud83c\uddfa\ud83c\uddf8", + "flag_uy": "\ud83c\uddfa\ud83c\uddfe", + "flag_uz": "\ud83c\uddfa\ud83c\uddff", + "flag_va": "\ud83c\uddfb\ud83c\udde6", + "flag_vc": "\ud83c\uddfb\ud83c\udde8", + "flag_ve": "\ud83c\uddfb\ud83c\uddea", + "flag_vg": "\ud83c\uddfb\ud83c\uddec", + "flag_vi": "\ud83c\uddfb\ud83c\uddee", + "flag_vn": "\ud83c\uddfb\ud83c\uddf3", + "flag_vu": "\ud83c\uddfb\ud83c\uddfa", + "flag_wf": "\ud83c\uddfc\ud83c\uddeb", + "flag_white": "\ud83c\udff3", + "flag_ws": "\ud83c\uddfc\ud83c\uddf8", + "flag_xk": "\ud83c\uddfd\ud83c\uddf0", + "flag_ye": "\ud83c\uddfe\ud83c\uddea", + "flag_yt": "\ud83c\uddfe\ud83c\uddf9", + "flag_za": "\ud83c\uddff\ud83c\udde6", + "flag_zm": "\ud83c\uddff\ud83c\uddf2", + "flag_zw": "\ud83c\uddff\ud83c\uddfc", + "flags": "\ud83c\udf8f", + "flashlight": "\ud83d\udd26", + "fleur-de-lis": "\u269c", + "floppy_disk": "\ud83d\udcbe", + "flower_playing_cards": "\ud83c\udfb4", + "flushed": "\ud83d\ude33", + "fog": "\ud83c\udf2b", + "foggy": "\ud83c\udf01", + "football": "\ud83c\udfc8", + "footprints": "\ud83d\udc63", + "fork_and_knife": "\ud83c\udf74", + "fork_knife_plate": "\ud83c\udf7d", + "fountain": "\u26f2", + "four": "4\u20e3", + "four_leaf_clover": "\ud83c\udf40", + "frame_photo": "\ud83d\uddbc", + "free": "\ud83c\udd93", + "fried_shrimp": "\ud83c\udf64", + "fries": "\ud83c\udf5f", + "frog": "\ud83d\udc38", + "frowning": "\ud83d\ude26", + "frowning2": "\u2639", + "fuelpump": "\u26fd", + "full_moon": "\ud83c\udf15", + "full_moon_with_face": "\ud83c\udf1d", + "game_die": "\ud83c\udfb2", + "gear": "\u2699", + "gem": "\ud83d\udc8e", + "gemini": "\u264a", + "ghost": "\ud83d\udc7b", + "gift": "\ud83c\udf81", + "gift_heart": "\ud83d\udc9d", + "girl": "\ud83d\udc67", + "girl_tone1": "\ud83d\udc67\ud83c\udffb", + "girl_tone2": "\ud83d\udc67\ud83c\udffc", + "girl_tone3": "\ud83d\udc67\ud83c\udffd", + "girl_tone4": "\ud83d\udc67\ud83c\udffe", + "girl_tone5": "\ud83d\udc67\ud83c\udfff", + "globe_with_meridians": "\ud83c\udf10", + "goat": "\ud83d\udc10", + "golf": "\u26f3", + "golfer": "\ud83c\udfcc", + "grapes": "\ud83c\udf47", + "green_apple": "\ud83c\udf4f", + "green_book": "\ud83d\udcd7", + "green_heart": "\ud83d\udc9a", + "grey_exclamation": "\u2755", + "grey_question": "\u2754", + "grimacing": "\ud83d\ude2c", + "grin": "\ud83d\ude01", + "grinning": "\ud83d\ude00", + "guardsman": "\ud83d\udc82", + "guardsman_tone1": "\ud83d\udc82\ud83c\udffb", + "guardsman_tone2": "\ud83d\udc82\ud83c\udffc", + "guardsman_tone3": "\ud83d\udc82\ud83c\udffd", + "guardsman_tone4": "\ud83d\udc82\ud83c\udffe", + "guardsman_tone5": "\ud83d\udc82\ud83c\udfff", + "guitar": "\ud83c\udfb8", + "gun": "\ud83d\udd2b", + "haircut": "\ud83d\udc87", + "haircut_tone1": "\ud83d\udc87\ud83c\udffb", + "haircut_tone2": "\ud83d\udc87\ud83c\udffc", + "haircut_tone3": "\ud83d\udc87\ud83c\udffd", + "haircut_tone4": "\ud83d\udc87\ud83c\udffe", + "haircut_tone5": "\ud83d\udc87\ud83c\udfff", + "hamburger": "\ud83c\udf54", + "hammer": "\ud83d\udd28", + "hammer_pick": "\u2692", + "hamster": "\ud83d\udc39", + "hand_splayed": "\ud83d\udd90", + "hand_splayed_tone1": "\ud83d\udd90\ud83c\udffb", + "hand_splayed_tone2": "\ud83d\udd90\ud83c\udffc", + "hand_splayed_tone3": "\ud83d\udd90\ud83c\udffd", + "hand_splayed_tone4": "\ud83d\udd90\ud83c\udffe", + "hand_splayed_tone5": "\ud83d\udd90\ud83c\udfff", + "handbag": "\ud83d\udc5c", + "hash": "#\u20e3", + "hatched_chick": "\ud83d\udc25", + "hatching_chick": "\ud83d\udc23", + "head_bandage": "\ud83e\udd15", + "headphones": "\ud83c\udfa7", + "hear_no_evil": "\ud83d\ude49", + "heart": "\u2764", + "heart_decoration": "\ud83d\udc9f", + "heart_exclamation": "\u2763", + "heart_eyes": "\ud83d\ude0d", + "heart_eyes_cat": "\ud83d\ude3b", + "heartbeat": "\ud83d\udc93", + "heartpulse": "\ud83d\udc97", + "hearts": "\u2665", + "heavy_check_mark": "\u2714", + "heavy_division_sign": "\u2797", + "heavy_dollar_sign": "\ud83d\udcb2", + "heavy_minus_sign": "\u2796", + "heavy_multiplication_x": "\u2716", + "heavy_plus_sign": "\u2795", + "helicopter": "\ud83d\ude81", + "helmet_with_cross": "\u26d1", + "herb": "\ud83c\udf3f", + "hibiscus": "\ud83c\udf3a", + "high_brightness": "\ud83d\udd06", + "high_heel": "\ud83d\udc60", + "hockey": "\ud83c\udfd2", + "hole": "\ud83d\udd73", + "homes": "\ud83c\udfd8", + "honey_pot": "\ud83c\udf6f", + "horse": "\ud83d\udc34", + "horse_racing": "\ud83c\udfc7", + "horse_racing_tone1": "\ud83c\udfc7\ud83c\udffb", + "horse_racing_tone2": "\ud83c\udfc7\ud83c\udffc", + "horse_racing_tone3": "\ud83c\udfc7\ud83c\udffd", + "horse_racing_tone4": "\ud83c\udfc7\ud83c\udffe", + "horse_racing_tone5": "\ud83c\udfc7\ud83c\udfff", + "hospital": "\ud83c\udfe5", + "hot_pepper": "\ud83c\udf36", + "hotdog": "\ud83c\udf2d", + "hotel": "\ud83c\udfe8", + "hotsprings": "\u2668", + "hourglass": "\u231b", + "hourglass_flowing_sand": "\u23f3", + "house": "\ud83c\udfe0", + "house_abandoned": "\ud83c\udfda", + "house_with_garden": "\ud83c\udfe1", + "hugging": "\ud83e\udd17", + "hushed": "\ud83d\ude2f", + "ice_cream": "\ud83c\udf68", + "ice_skate": "\u26f8", + "icecream": "\ud83c\udf66", + "id": "\ud83c\udd94", + "ideograph_advantage": "\ud83c\ude50", + "imp": "\ud83d\udc7f", + "inbox_tray": "\ud83d\udce5", + "incoming_envelope": "\ud83d\udce8", + "information_desk_person": "\ud83d\udc81", + "information_desk_person_tone1": "\ud83d\udc81\ud83c\udffb", + "information_desk_person_tone2": "\ud83d\udc81\ud83c\udffc", + "information_desk_person_tone3": "\ud83d\udc81\ud83c\udffd", + "information_desk_person_tone4": "\ud83d\udc81\ud83c\udffe", + "information_desk_person_tone5": "\ud83d\udc81\ud83c\udfff", + "information_source": "\u2139", + "innocent": "\ud83d\ude07", + "interrobang": "\u2049", + "iphone": "\ud83d\udcf1", + "island": "\ud83c\udfdd", + "izakaya_lantern": "\ud83c\udfee", + "jack_o_lantern": "\ud83c\udf83", + "japan": "\ud83d\uddfe", + "japanese_castle": "\ud83c\udfef", + "japanese_goblin": "\ud83d\udc7a", + "japanese_ogre": "\ud83d\udc79", + "jeans": "\ud83d\udc56", + "joy": "\ud83d\ude02", + "joy_cat": "\ud83d\ude39", + "joystick": "\ud83d\udd79", + "kaaba": "\ud83d\udd4b", + "key": "\ud83d\udd11", + "key2": "\ud83d\udddd", + "keyboard": "\u2328", + "kimono": "\ud83d\udc58", + "kiss": "\ud83d\udc8b", + "kiss_mm": "\ud83d\udc68\u2764\ud83d\udc8b\ud83d\udc68", + "kiss_ww": "\ud83d\udc69\u2764\ud83d\udc8b\ud83d\udc69", + "kissing": "\ud83d\ude17", + "kissing_cat": "\ud83d\ude3d", + "kissing_closed_eyes": "\ud83d\ude1a", + "kissing_heart": "\ud83d\ude18", + "kissing_smiling_eyes": "\ud83d\ude19", + "knife": "\ud83d\udd2a", + "koala": "\ud83d\udc28", + "koko": "\ud83c\ude01", + "label": "\ud83c\udff7", + "large_blue_circle": "\ud83d\udd35", + "large_blue_diamond": "\ud83d\udd37", + "large_orange_diamond": "\ud83d\udd36", + "last_quarter_moon": "\ud83c\udf17", + "last_quarter_moon_with_face": "\ud83c\udf1c", + "laughing": "\ud83d\ude06", + "leaves": "\ud83c\udf43", + "ledger": "\ud83d\udcd2", + "left_luggage": "\ud83d\udec5", + "left_right_arrow": "\u2194", + "leftwards_arrow_with_hook": "\u21a9", + "lemon": "\ud83c\udf4b", + "leo": "\u264c", + "leopard": "\ud83d\udc06", + "level_slider": "\ud83c\udf9a", + "levitate": "\ud83d\udd74", + "libra": "\u264e", + "lifter": "\ud83c\udfcb", + "lifter_tone1": "\ud83c\udfcb\ud83c\udffb", + "lifter_tone2": "\ud83c\udfcb\ud83c\udffc", + "lifter_tone3": "\ud83c\udfcb\ud83c\udffd", + "lifter_tone4": "\ud83c\udfcb\ud83c\udffe", + "lifter_tone5": "\ud83c\udfcb\ud83c\udfff", + "light_rail": "\ud83d\ude88", + "link": "\ud83d\udd17", + "lion_face": "\ud83e\udd81", + "lips": "\ud83d\udc44", + "lipstick": "\ud83d\udc84", + "lock": "\ud83d\udd12", + "lock_with_ink_pen": "\ud83d\udd0f", + "lollipop": "\ud83c\udf6d", + "loop": "\u27bf", + "loud_sound": "\ud83d\udd0a", + "loudspeaker": "\ud83d\udce2", + "love_hotel": "\ud83c\udfe9", + "love_letter": "\ud83d\udc8c", + "low_brightness": "\ud83d\udd05", + "m": "\u24c2", + "mag": "\ud83d\udd0d", + "mag_right": "\ud83d\udd0e", + "mahjong": "\ud83c\udc04", + "mailbox": "\ud83d\udceb", + "mailbox_closed": "\ud83d\udcea", + "mailbox_with_mail": "\ud83d\udcec", + "mailbox_with_no_mail": "\ud83d\udced", + "man": "\ud83d\udc68", + "man_tone1": "\ud83d\udc68\ud83c\udffb", + "man_tone2": "\ud83d\udc68\ud83c\udffc", + "man_tone3": "\ud83d\udc68\ud83c\udffd", + "man_tone4": "\ud83d\udc68\ud83c\udffe", + "man_tone5": "\ud83d\udc68\ud83c\udfff", + "man_with_gua_pi_mao": "\ud83d\udc72", + "man_with_gua_pi_mao_tone1": "\ud83d\udc72\ud83c\udffb", + "man_with_gua_pi_mao_tone2": "\ud83d\udc72\ud83c\udffc", + "man_with_gua_pi_mao_tone3": "\ud83d\udc72\ud83c\udffd", + "man_with_gua_pi_mao_tone4": "\ud83d\udc72\ud83c\udffe", + "man_with_gua_pi_mao_tone5": "\ud83d\udc72\ud83c\udfff", + "man_with_turban": "\ud83d\udc73", + "man_with_turban_tone1": "\ud83d\udc73\ud83c\udffb", + "man_with_turban_tone2": "\ud83d\udc73\ud83c\udffc", + "man_with_turban_tone3": "\ud83d\udc73\ud83c\udffd", + "man_with_turban_tone4": "\ud83d\udc73\ud83c\udffe", + "man_with_turban_tone5": "\ud83d\udc73\ud83c\udfff", + "mans_shoe": "\ud83d\udc5e", + "map": "\ud83d\uddfa", + "maple_leaf": "\ud83c\udf41", + "mask": "\ud83d\ude37", + "massage": "\ud83d\udc86", + "massage_tone1": "\ud83d\udc86\ud83c\udffb", + "massage_tone2": "\ud83d\udc86\ud83c\udffc", + "massage_tone3": "\ud83d\udc86\ud83c\udffd", + "massage_tone4": "\ud83d\udc86\ud83c\udffe", + "massage_tone5": "\ud83d\udc86\ud83c\udfff", + "meat_on_bone": "\ud83c\udf56", + "medal": "\ud83c\udfc5", + "mega": "\ud83d\udce3", + "melon": "\ud83c\udf48", + "menorah": "\ud83d\udd4e", + "mens": "\ud83d\udeb9", + "metal": "\ud83e\udd18", + "metal_tone1": "\ud83e\udd18\ud83c\udffb", + "metal_tone2": "\ud83e\udd18\ud83c\udffc", + "metal_tone3": "\ud83e\udd18\ud83c\udffd", + "metal_tone4": "\ud83e\udd18\ud83c\udffe", + "metal_tone5": "\ud83e\udd18\ud83c\udfff", + "metro": "\ud83d\ude87", + "microphone": "\ud83c\udfa4", + "microphone2": "\ud83c\udf99", + "microscope": "\ud83d\udd2c", + "middle_finger": "\ud83d\udd95", + "middle_finger_tone1": "\ud83d\udd95\ud83c\udffb", + "middle_finger_tone2": "\ud83d\udd95\ud83c\udffc", + "middle_finger_tone3": "\ud83d\udd95\ud83c\udffd", + "middle_finger_tone4": "\ud83d\udd95\ud83c\udffe", + "middle_finger_tone5": "\ud83d\udd95\ud83c\udfff", + "military_medal": "\ud83c\udf96", + "milky_way": "\ud83c\udf0c", + "minibus": "\ud83d\ude90", + "minidisc": "\ud83d\udcbd", + "mobile_phone_off": "\ud83d\udcf4", + "money_mouth": "\ud83e\udd11", + "money_with_wings": "\ud83d\udcb8", + "moneybag": "\ud83d\udcb0", + "monkey": "\ud83d\udc12", + "monkey_face": "\ud83d\udc35", + "monorail": "\ud83d\ude9d", + "mortar_board": "\ud83c\udf93", + "mosque": "\ud83d\udd4c", + "motorboat": "\ud83d\udee5", + "motorcycle": "\ud83c\udfcd", + "motorway": "\ud83d\udee3", + "mount_fuji": "\ud83d\uddfb", + "mountain": "\u26f0", + "mountain_bicyclist": "\ud83d\udeb5", + "mountain_bicyclist_tone1": "\ud83d\udeb5\ud83c\udffb", + "mountain_bicyclist_tone2": "\ud83d\udeb5\ud83c\udffc", + "mountain_bicyclist_tone3": "\ud83d\udeb5\ud83c\udffd", + "mountain_bicyclist_tone4": "\ud83d\udeb5\ud83c\udffe", + "mountain_bicyclist_tone5": "\ud83d\udeb5\ud83c\udfff", + "mountain_cableway": "\ud83d\udea0", + "mountain_railway": "\ud83d\ude9e", + "mountain_snow": "\ud83c\udfd4", + "mouse": "\ud83d\udc2d", + "mouse2": "\ud83d\udc01", + "mouse_three_button": "\ud83d\uddb1", + "movie_camera": "\ud83c\udfa5", + "moyai": "\ud83d\uddff", + "muscle": "\ud83d\udcaa", + "muscle_tone1": "\ud83d\udcaa\ud83c\udffb", + "muscle_tone2": "\ud83d\udcaa\ud83c\udffc", + "muscle_tone3": "\ud83d\udcaa\ud83c\udffd", + "muscle_tone4": "\ud83d\udcaa\ud83c\udffe", + "muscle_tone5": "\ud83d\udcaa\ud83c\udfff", + "mushroom": "\ud83c\udf44", + "musical_keyboard": "\ud83c\udfb9", + "musical_note": "\ud83c\udfb5", + "musical_score": "\ud83c\udfbc", + "mute": "\ud83d\udd07", + "nail_care": "\ud83d\udc85", + "nail_care_tone1": "\ud83d\udc85\ud83c\udffb", + "nail_care_tone2": "\ud83d\udc85\ud83c\udffc", + "nail_care_tone3": "\ud83d\udc85\ud83c\udffd", + "nail_care_tone4": "\ud83d\udc85\ud83c\udffe", + "nail_care_tone5": "\ud83d\udc85\ud83c\udfff", + "name_badge": "\ud83d\udcdb", + "necktie": "\ud83d\udc54", + "negative_squared_cross_mark": "\u274e", + "nerd": "\ud83e\udd13", + "neutral_face": "\ud83d\ude10", + "new": "\ud83c\udd95", + "new_moon": "\ud83c\udf11", + "new_moon_with_face": "\ud83c\udf1a", + "newspaper": "\ud83d\udcf0", + "newspaper2": "\ud83d\uddde", + "ng": "\ud83c\udd96", + "night_with_stars": "\ud83c\udf03", + "nine": "9\u20e3", + "no_bell": "\ud83d\udd15", + "no_bicycles": "\ud83d\udeb3", + "no_entry": "\u26d4", + "no_entry_sign": "\ud83d\udeab", + "no_good": "\ud83d\ude45", + "no_good_tone1": "\ud83d\ude45\ud83c\udffb", + "no_good_tone2": "\ud83d\ude45\ud83c\udffc", + "no_good_tone3": "\ud83d\ude45\ud83c\udffd", + "no_good_tone4": "\ud83d\ude45\ud83c\udffe", + "no_good_tone5": "\ud83d\ude45\ud83c\udfff", + "no_mobile_phones": "\ud83d\udcf5", + "no_mouth": "\ud83d\ude36", + "no_pedestrians": "\ud83d\udeb7", + "no_smoking": "\ud83d\udead", + "non-potable_water": "\ud83d\udeb1", + "nose": "\ud83d\udc43", + "nose_tone1": "\ud83d\udc43\ud83c\udffb", + "nose_tone2": "\ud83d\udc43\ud83c\udffc", + "nose_tone3": "\ud83d\udc43\ud83c\udffd", + "nose_tone4": "\ud83d\udc43\ud83c\udffe", + "nose_tone5": "\ud83d\udc43\ud83c\udfff", + "notebook": "\ud83d\udcd3", + "notebook_with_decorative_cover": "\ud83d\udcd4", + "notepad_spiral": "\ud83d\uddd2", + "notes": "\ud83c\udfb6", + "nut_and_bolt": "\ud83d\udd29", + "o": "\u2b55", + "o2": "\ud83c\udd7e", + "ocean": "\ud83c\udf0a", + "octopus": "\ud83d\udc19", + "oden": "\ud83c\udf62", + "office": "\ud83c\udfe2", + "oil": "\ud83d\udee2", + "ok": "\ud83c\udd97", + "ok_hand": "\ud83d\udc4c", + "ok_hand_tone1": "\ud83d\udc4c\ud83c\udffb", + "ok_hand_tone2": "\ud83d\udc4c\ud83c\udffc", + "ok_hand_tone3": "\ud83d\udc4c\ud83c\udffd", + "ok_hand_tone4": "\ud83d\udc4c\ud83c\udffe", + "ok_hand_tone5": "\ud83d\udc4c\ud83c\udfff", + "ok_woman": "\ud83d\ude46", + "ok_woman_tone1": "\ud83d\ude46\ud83c\udffb", + "ok_woman_tone2": "\ud83d\ude46\ud83c\udffc", + "ok_woman_tone3": "\ud83d\ude46\ud83c\udffd", + "ok_woman_tone4": "\ud83d\ude46\ud83c\udffe", + "ok_woman_tone5": "\ud83d\ude46\ud83c\udfff", + "older_man": "\ud83d\udc74", + "older_man_tone1": "\ud83d\udc74\ud83c\udffb", + "older_man_tone2": "\ud83d\udc74\ud83c\udffc", + "older_man_tone3": "\ud83d\udc74\ud83c\udffd", + "older_man_tone4": "\ud83d\udc74\ud83c\udffe", + "older_man_tone5": "\ud83d\udc74\ud83c\udfff", + "older_woman": "\ud83d\udc75", + "older_woman_tone1": "\ud83d\udc75\ud83c\udffb", + "older_woman_tone2": "\ud83d\udc75\ud83c\udffc", + "older_woman_tone3": "\ud83d\udc75\ud83c\udffd", + "older_woman_tone4": "\ud83d\udc75\ud83c\udffe", + "older_woman_tone5": "\ud83d\udc75\ud83c\udfff", + "om_symbol": "\ud83d\udd49", + "on": "\ud83d\udd1b", + "oncoming_automobile": "\ud83d\ude98", + "oncoming_bus": "\ud83d\ude8d", + "oncoming_police_car": "\ud83d\ude94", + "oncoming_taxi": "\ud83d\ude96", + "one": "1\u20e3", + "open_file_folder": "\ud83d\udcc2", + "open_hands": "\ud83d\udc50", + "open_hands_tone1": "\ud83d\udc50\ud83c\udffb", + "open_hands_tone2": "\ud83d\udc50\ud83c\udffc", + "open_hands_tone3": "\ud83d\udc50\ud83c\udffd", + "open_hands_tone4": "\ud83d\udc50\ud83c\udffe", + "open_hands_tone5": "\ud83d\udc50\ud83c\udfff", + "open_mouth": "\ud83d\ude2e", + "ophiuchus": "\u26ce", + "orange_book": "\ud83d\udcd9", + "orthodox_cross": "\u2626", + "outbox_tray": "\ud83d\udce4", + "ox": "\ud83d\udc02", + "package": "\ud83d\udce6", + "page_facing_up": "\ud83d\udcc4", + "page_with_curl": "\ud83d\udcc3", + "pager": "\ud83d\udcdf", + "paintbrush": "\ud83d\udd8c", + "palm_tree": "\ud83c\udf34", + "panda_face": "\ud83d\udc3c", + "paperclip": "\ud83d\udcce", + "paperclips": "\ud83d\udd87", + "park": "\ud83c\udfde", + "parking": "\ud83c\udd7f", + "part_alternation_mark": "\u303d", + "partly_sunny": "\u26c5", + "passport_control": "\ud83d\udec2", + "pause_button": "\u23f8", + "peace": "\u262e", + "peach": "\ud83c\udf51", + "pear": "\ud83c\udf50", + "pen_ballpoint": "\ud83d\udd8a", + "pen_fountain": "\ud83d\udd8b", + "pencil": "\ud83d\udcdd", + "pencil2": "\u270f", + "penguin": "\ud83d\udc27", + "pensive": "\ud83d\ude14", + "performing_arts": "\ud83c\udfad", + "persevere": "\ud83d\ude23", + "person_frowning": "\ud83d\ude4d", + "person_frowning_tone1": "\ud83d\ude4d\ud83c\udffb", + "person_frowning_tone2": "\ud83d\ude4d\ud83c\udffc", + "person_frowning_tone3": "\ud83d\ude4d\ud83c\udffd", + "person_frowning_tone4": "\ud83d\ude4d\ud83c\udffe", + "person_frowning_tone5": "\ud83d\ude4d\ud83c\udfff", + "person_with_blond_hair": "\ud83d\udc71", + "person_with_blond_hair_tone1": "\ud83d\udc71\ud83c\udffb", + "person_with_blond_hair_tone2": "\ud83d\udc71\ud83c\udffc", + "person_with_blond_hair_tone3": "\ud83d\udc71\ud83c\udffd", + "person_with_blond_hair_tone4": "\ud83d\udc71\ud83c\udffe", + "person_with_blond_hair_tone5": "\ud83d\udc71\ud83c\udfff", + "person_with_pouting_face": "\ud83d\ude4e", + "person_with_pouting_face_tone1": "\ud83d\ude4e\ud83c\udffb", + "person_with_pouting_face_tone2": "\ud83d\ude4e\ud83c\udffc", + "person_with_pouting_face_tone3": "\ud83d\ude4e\ud83c\udffd", + "person_with_pouting_face_tone4": "\ud83d\ude4e\ud83c\udffe", + "person_with_pouting_face_tone5": "\ud83d\ude4e\ud83c\udfff", + "pick": "\u26cf", + "pig": "\ud83d\udc37", + "pig2": "\ud83d\udc16", + "pig_nose": "\ud83d\udc3d", + "pill": "\ud83d\udc8a", + "pineapple": "\ud83c\udf4d", + "ping_pong": "\ud83c\udfd3", + "pisces": "\u2653", + "pizza": "\ud83c\udf55", + "place_of_worship": "\ud83d\uded0", + "play_pause": "\u23ef", + "point_down": "\ud83d\udc47", + "point_down_tone1": "\ud83d\udc47\ud83c\udffb", + "point_down_tone2": "\ud83d\udc47\ud83c\udffc", + "point_down_tone3": "\ud83d\udc47\ud83c\udffd", + "point_down_tone4": "\ud83d\udc47\ud83c\udffe", + "point_down_tone5": "\ud83d\udc47\ud83c\udfff", + "point_left": "\ud83d\udc48", + "point_left_tone1": "\ud83d\udc48\ud83c\udffb", + "point_left_tone2": "\ud83d\udc48\ud83c\udffc", + "point_left_tone3": "\ud83d\udc48\ud83c\udffd", + "point_left_tone4": "\ud83d\udc48\ud83c\udffe", + "point_left_tone5": "\ud83d\udc48\ud83c\udfff", + "point_right": "\ud83d\udc49", + "point_right_tone1": "\ud83d\udc49\ud83c\udffb", + "point_right_tone2": "\ud83d\udc49\ud83c\udffc", + "point_right_tone3": "\ud83d\udc49\ud83c\udffd", + "point_right_tone4": "\ud83d\udc49\ud83c\udffe", + "point_right_tone5": "\ud83d\udc49\ud83c\udfff", + "point_up": "\u261d", + "point_up_2": "\ud83d\udc46", + "point_up_2_tone1": "\ud83d\udc46\ud83c\udffb", + "point_up_2_tone2": "\ud83d\udc46\ud83c\udffc", + "point_up_2_tone3": "\ud83d\udc46\ud83c\udffd", + "point_up_2_tone4": "\ud83d\udc46\ud83c\udffe", + "point_up_2_tone5": "\ud83d\udc46\ud83c\udfff", + "point_up_tone1": "\u261d\ud83c\udffb", + "point_up_tone2": "\u261d\ud83c\udffc", + "point_up_tone3": "\u261d\ud83c\udffd", + "point_up_tone4": "\u261d\ud83c\udffe", + "point_up_tone5": "\u261d\ud83c\udfff", + "police_car": "\ud83d\ude93", + "poodle": "\ud83d\udc29", + "poop": "\ud83d\udca9", + "popcorn": "\ud83c\udf7f", + "post_office": "\ud83c\udfe3", + "postal_horn": "\ud83d\udcef", + "postbox": "\ud83d\udcee", + "potable_water": "\ud83d\udeb0", + "pouch": "\ud83d\udc5d", + "poultry_leg": "\ud83c\udf57", + "pound": "\ud83d\udcb7", + "pouting_cat": "\ud83d\ude3e", + "pray": "\ud83d\ude4f", + "pray_tone1": "\ud83d\ude4f\ud83c\udffb", + "pray_tone2": "\ud83d\ude4f\ud83c\udffc", + "pray_tone3": "\ud83d\ude4f\ud83c\udffd", + "pray_tone4": "\ud83d\ude4f\ud83c\udffe", + "pray_tone5": "\ud83d\ude4f\ud83c\udfff", + "prayer_beads": "\ud83d\udcff", + "princess": "\ud83d\udc78", + "princess_tone1": "\ud83d\udc78\ud83c\udffb", + "princess_tone2": "\ud83d\udc78\ud83c\udffc", + "princess_tone3": "\ud83d\udc78\ud83c\udffd", + "princess_tone4": "\ud83d\udc78\ud83c\udffe", + "princess_tone5": "\ud83d\udc78\ud83c\udfff", + "printer": "\ud83d\udda8", + "projector": "\ud83d\udcfd", + "punch": "\ud83d\udc4a", + "punch_tone1": "\ud83d\udc4a\ud83c\udffb", + "punch_tone2": "\ud83d\udc4a\ud83c\udffc", + "punch_tone3": "\ud83d\udc4a\ud83c\udffd", + "punch_tone4": "\ud83d\udc4a\ud83c\udffe", + "punch_tone5": "\ud83d\udc4a\ud83c\udfff", + "purple_heart": "\ud83d\udc9c", + "purse": "\ud83d\udc5b", + "pushpin": "\ud83d\udccc", + "put_litter_in_its_place": "\ud83d\udeae", + "question": "\u2753", + "rabbit": "\ud83d\udc30", + "rabbit2": "\ud83d\udc07", + "race_car": "\ud83c\udfce", + "racehorse": "\ud83d\udc0e", + "radio": "\ud83d\udcfb", + "radio_button": "\ud83d\udd18", + "radioactive": "\u2622", + "rage": "\ud83d\ude21", + "railway_car": "\ud83d\ude83", + "railway_track": "\ud83d\udee4", + "rainbow": "\ud83c\udf08", + "raised_hand": "\u270b", + "raised_hand_tone1": "\u270b\ud83c\udffb", + "raised_hand_tone2": "\u270b\ud83c\udffc", + "raised_hand_tone3": "\u270b\ud83c\udffd", + "raised_hand_tone4": "\u270b\ud83c\udffe", + "raised_hand_tone5": "\u270b\ud83c\udfff", + "raised_hands": "\ud83d\ude4c", + "raised_hands_tone1": "\ud83d\ude4c\ud83c\udffb", + "raised_hands_tone2": "\ud83d\ude4c\ud83c\udffc", + "raised_hands_tone3": "\ud83d\ude4c\ud83c\udffd", + "raised_hands_tone4": "\ud83d\ude4c\ud83c\udffe", + "raised_hands_tone5": "\ud83d\ude4c\ud83c\udfff", + "raising_hand": "\ud83d\ude4b", + "raising_hand_tone1": "\ud83d\ude4b\ud83c\udffb", + "raising_hand_tone2": "\ud83d\ude4b\ud83c\udffc", + "raising_hand_tone3": "\ud83d\ude4b\ud83c\udffd", + "raising_hand_tone4": "\ud83d\ude4b\ud83c\udffe", + "raising_hand_tone5": "\ud83d\ude4b\ud83c\udfff", + "ram": "\ud83d\udc0f", + "ramen": "\ud83c\udf5c", + "rat": "\ud83d\udc00", + "record_button": "\u23fa", + "recycle": "\u267b", + "red_car": "\ud83d\ude97", + "red_circle": "\ud83d\udd34", + "registered": "\u00ae", + "relaxed": "\u263a", + "relieved": "\ud83d\ude0c", + "reminder_ribbon": "\ud83c\udf97", + "repeat": "\ud83d\udd01", + "repeat_one": "\ud83d\udd02", + "restroom": "\ud83d\udebb", + "revolving_hearts": "\ud83d\udc9e", + "rewind": "\u23ea", + "ribbon": "\ud83c\udf80", + "rice": "\ud83c\udf5a", + "rice_ball": "\ud83c\udf59", + "rice_cracker": "\ud83c\udf58", + "rice_scene": "\ud83c\udf91", + "ring": "\ud83d\udc8d", + "robot": "\ud83e\udd16", + "rocket": "\ud83d\ude80", + "roller_coaster": "\ud83c\udfa2", + "rolling_eyes": "\ud83d\ude44", + "rooster": "\ud83d\udc13", + "rose": "\ud83c\udf39", + "rosette": "\ud83c\udff5", + "rotating_light": "\ud83d\udea8", + "round_pushpin": "\ud83d\udccd", + "rowboat": "\ud83d\udea3", + "rowboat_tone1": "\ud83d\udea3\ud83c\udffb", + "rowboat_tone2": "\ud83d\udea3\ud83c\udffc", + "rowboat_tone3": "\ud83d\udea3\ud83c\udffd", + "rowboat_tone4": "\ud83d\udea3\ud83c\udffe", + "rowboat_tone5": "\ud83d\udea3\ud83c\udfff", + "rugby_football": "\ud83c\udfc9", + "runner": "\ud83c\udfc3", + "runner_tone1": "\ud83c\udfc3\ud83c\udffb", + "runner_tone2": "\ud83c\udfc3\ud83c\udffc", + "runner_tone3": "\ud83c\udfc3\ud83c\udffd", + "runner_tone4": "\ud83c\udfc3\ud83c\udffe", + "runner_tone5": "\ud83c\udfc3\ud83c\udfff", + "running_shirt_with_sash": "\ud83c\udfbd", + "sa": "\ud83c\ude02", + "sagittarius": "\u2650", + "sailboat": "\u26f5", + "sake": "\ud83c\udf76", + "sandal": "\ud83d\udc61", + "santa": "\ud83c\udf85", + "santa_tone1": "\ud83c\udf85\ud83c\udffb", + "santa_tone2": "\ud83c\udf85\ud83c\udffc", + "santa_tone3": "\ud83c\udf85\ud83c\udffd", + "santa_tone4": "\ud83c\udf85\ud83c\udffe", + "santa_tone5": "\ud83c\udf85\ud83c\udfff", + "satellite": "\ud83d\udce1", + "satellite_orbital": "\ud83d\udef0", + "saxophone": "\ud83c\udfb7", + "scales": "\u2696", + "school": "\ud83c\udfeb", + "school_satchel": "\ud83c\udf92", + "scissors": "\u2702", + "scorpion": "\ud83e\udd82", + "scorpius": "\u264f", + "scream": "\ud83d\ude31", + "scream_cat": "\ud83d\ude40", + "scroll": "\ud83d\udcdc", + "seat": "\ud83d\udcba", + "secret": "\u3299", + "see_no_evil": "\ud83d\ude48", + "seedling": "\ud83c\udf31", + "seven": "7\u20e3", + "shamrock": "\u2618", + "shaved_ice": "\ud83c\udf67", + "sheep": "\ud83d\udc11", + "shell": "\ud83d\udc1a", + "shield": "\ud83d\udee1", + "shinto_shrine": "\u26e9", + "ship": "\ud83d\udea2", + "shirt": "\ud83d\udc55", + "shopping_bags": "\ud83d\udecd", + "shower": "\ud83d\udebf", + "signal_strength": "\ud83d\udcf6", + "six": "6\u20e3", + "six_pointed_star": "\ud83d\udd2f", + "ski": "\ud83c\udfbf", + "skier": "\u26f7", + "skull": "\ud83d\udc80", + "skull_crossbones": "\u2620", + "sleeping": "\ud83d\ude34", + "sleeping_accommodation": "\ud83d\udecc", + "sleepy": "\ud83d\ude2a", + "slight_frown": "\ud83d\ude41", + "slight_smile": "\ud83d\ude42", + "slot_machine": "\ud83c\udfb0", + "small_blue_diamond": "\ud83d\udd39", + "small_orange_diamond": "\ud83d\udd38", + "small_red_triangle": "\ud83d\udd3a", + "small_red_triangle_down": "\ud83d\udd3b", + "smile": "\ud83d\ude04", + "smile_cat": "\ud83d\ude38", + "smiley": "\ud83d\ude03", + "smiley_cat": "\ud83d\ude3a", + "smiling_imp": "\ud83d\ude08", + "smirk": "\ud83d\ude0f", + "smirk_cat": "\ud83d\ude3c", + "smoking": "\ud83d\udeac", + "snail": "\ud83d\udc0c", + "snake": "\ud83d\udc0d", + "snowboarder": "\ud83c\udfc2", + "snowflake": "\u2744", + "snowman": "\u26c4", + "snowman2": "\u2603", + "sob": "\ud83d\ude2d", + "soccer": "\u26bd", + "soon": "\ud83d\udd1c", + "sos": "\ud83c\udd98", + "sound": "\ud83d\udd09", + "space_invader": "\ud83d\udc7e", + "spades": "\u2660", + "spaghetti": "\ud83c\udf5d", + "sparkle": "\u2747", + "sparkler": "\ud83c\udf87", + "sparkles": "\u2728", + "sparkling_heart": "\ud83d\udc96", + "speak_no_evil": "\ud83d\ude4a", + "speaker": "\ud83d\udd08", + "speaking_head": "\ud83d\udde3", + "speech_balloon": "\ud83d\udcac", + "speedboat": "\ud83d\udea4", + "spider": "\ud83d\udd77", + "spider_web": "\ud83d\udd78", + "spy": "\ud83d\udd75", + "spy_tone1": "\ud83d\udd75\ud83c\udffb", + "spy_tone2": "\ud83d\udd75\ud83c\udffc", + "spy_tone3": "\ud83d\udd75\ud83c\udffd", + "spy_tone4": "\ud83d\udd75\ud83c\udffe", + "spy_tone5": "\ud83d\udd75\ud83c\udfff", + "stadium": "\ud83c\udfdf", + "star": "\u2b50", + "star2": "\ud83c\udf1f", + "star_and_crescent": "\u262a", + "star_of_david": "\u2721", + "stars": "\ud83c\udf20", + "station": "\ud83d\ude89", + "statue_of_liberty": "\ud83d\uddfd", + "steam_locomotive": "\ud83d\ude82", + "stew": "\ud83c\udf72", + "stop_button": "\u23f9", + "stopwatch": "\u23f1", + "straight_ruler": "\ud83d\udccf", + "strawberry": "\ud83c\udf53", + "stuck_out_tongue": "\ud83d\ude1b", + "stuck_out_tongue_closed_eyes": "\ud83d\ude1d", + "stuck_out_tongue_winking_eye": "\ud83d\ude1c", + "sun_with_face": "\ud83c\udf1e", + "sunflower": "\ud83c\udf3b", + "sunglasses": "\ud83d\ude0e", + "sunny": "\u2600", + "sunrise": "\ud83c\udf05", + "sunrise_over_mountains": "\ud83c\udf04", + "surfer": "\ud83c\udfc4", + "surfer_tone1": "\ud83c\udfc4\ud83c\udffb", + "surfer_tone2": "\ud83c\udfc4\ud83c\udffc", + "surfer_tone3": "\ud83c\udfc4\ud83c\udffd", + "surfer_tone4": "\ud83c\udfc4\ud83c\udffe", + "surfer_tone5": "\ud83c\udfc4\ud83c\udfff", + "sushi": "\ud83c\udf63", + "suspension_railway": "\ud83d\ude9f", + "sweat": "\ud83d\ude13", + "sweat_drops": "\ud83d\udca6", + "sweat_smile": "\ud83d\ude05", + "sweet_potato": "\ud83c\udf60", + "swimmer": "\ud83c\udfca", + "swimmer_tone1": "\ud83c\udfca\ud83c\udffb", + "swimmer_tone2": "\ud83c\udfca\ud83c\udffc", + "swimmer_tone3": "\ud83c\udfca\ud83c\udffd", + "swimmer_tone4": "\ud83c\udfca\ud83c\udffe", + "swimmer_tone5": "\ud83c\udfca\ud83c\udfff", + "symbols": "\ud83d\udd23", + "synagogue": "\ud83d\udd4d", + "syringe": "\ud83d\udc89", + "taco": "\ud83c\udf2e", + "tada": "\ud83c\udf89", + "tanabata_tree": "\ud83c\udf8b", + "tangerine": "\ud83c\udf4a", + "taurus": "\u2649", + "taxi": "\ud83d\ude95", + "tea": "\ud83c\udf75", + "telephone": "\u260e", + "telephone_receiver": "\ud83d\udcde", + "telescope": "\ud83d\udd2d", + "ten": "\ud83d\udd1f", + "tennis": "\ud83c\udfbe", + "tent": "\u26fa", + "thermometer": "\ud83c\udf21", + "thermometer_face": "\ud83e\udd12", + "thinking": "\ud83e\udd14", + "thought_balloon": "\ud83d\udcad", + "three": "3\u20e3", + "thumbsdown": "\ud83d\udc4e", + "thumbsdown_tone1": "\ud83d\udc4e\ud83c\udffb", + "thumbsdown_tone2": "\ud83d\udc4e\ud83c\udffc", + "thumbsdown_tone3": "\ud83d\udc4e\ud83c\udffd", + "thumbsdown_tone4": "\ud83d\udc4e\ud83c\udffe", + "thumbsdown_tone5": "\ud83d\udc4e\ud83c\udfff", + "thumbsup": "\ud83d\udc4d", + "thumbsup_tone1": "\ud83d\udc4d\ud83c\udffb", + "thumbsup_tone2": "\ud83d\udc4d\ud83c\udffc", + "thumbsup_tone3": "\ud83d\udc4d\ud83c\udffd", + "thumbsup_tone4": "\ud83d\udc4d\ud83c\udffe", + "thumbsup_tone5": "\ud83d\udc4d\ud83c\udfff", + "thunder_cloud_rain": "\u26c8", + "ticket": "\ud83c\udfab", + "tickets": "\ud83c\udf9f", + "tiger": "\ud83d\udc2f", + "tiger2": "\ud83d\udc05", + "timer": "\u23f2", + "tired_face": "\ud83d\ude2b", + "tm": "\u2122", + "toilet": "\ud83d\udebd", + "tokyo_tower": "\ud83d\uddfc", + "tomato": "\ud83c\udf45", + "tone1": "\ud83c\udffb", + "tone2": "\ud83c\udffc", + "tone3": "\ud83c\udffd", + "tone4": "\ud83c\udffe", + "tone5": "\ud83c\udfff", + "tongue": "\ud83d\udc45", + "tools": "\ud83d\udee0", + "top": "\ud83d\udd1d", + "tophat": "\ud83c\udfa9", + "track_next": "\u23ed", + "track_previous": "\u23ee", + "trackball": "\ud83d\uddb2", + "tractor": "\ud83d\ude9c", + "traffic_light": "\ud83d\udea5", + "train": "\ud83d\ude8b", + "train2": "\ud83d\ude86", + "tram": "\ud83d\ude8a", + "triangular_flag_on_post": "\ud83d\udea9", + "triangular_ruler": "\ud83d\udcd0", + "trident": "\ud83d\udd31", + "triumph": "\ud83d\ude24", + "trolleybus": "\ud83d\ude8e", + "trophy": "\ud83c\udfc6", + "tropical_drink": "\ud83c\udf79", + "tropical_fish": "\ud83d\udc20", + "truck": "\ud83d\ude9a", + "trumpet": "\ud83c\udfba", + "tulip": "\ud83c\udf37", + "turkey": "\ud83e\udd83", + "turtle": "\ud83d\udc22", + "tv": "\ud83d\udcfa", + "twisted_rightwards_arrows": "\ud83d\udd00", + "two": "2\u20e3", + "two_hearts": "\ud83d\udc95", + "two_men_holding_hands": "\ud83d\udc6c", + "two_women_holding_hands": "\ud83d\udc6d", + "u5272": "\ud83c\ude39", + "u5408": "\ud83c\ude34", + "u55b6": "\ud83c\ude3a", + "u6307": "\ud83c\ude2f", + "u6708": "\ud83c\ude37", + "u6709": "\ud83c\ude36", + "u6e80": "\ud83c\ude35", + "u7121": "\ud83c\ude1a", + "u7533": "\ud83c\ude38", + "u7981": "\ud83c\ude32", + "u7a7a": "\ud83c\ude33", + "umbrella": "\u2614", + "umbrella2": "\u2602", + "unamused": "\ud83d\ude12", + "underage": "\ud83d\udd1e", + "unicorn": "\ud83e\udd84", + "unlock": "\ud83d\udd13", + "up": "\ud83c\udd99", + "upside_down": "\ud83d\ude43", + "urn": "\u26b1", + "v": "\u270c", + "v_tone1": "\u270c\ud83c\udffb", + "v_tone2": "\u270c\ud83c\udffc", + "v_tone3": "\u270c\ud83c\udffd", + "v_tone4": "\u270c\ud83c\udffe", + "v_tone5": "\u270c\ud83c\udfff", + "vertical_traffic_light": "\ud83d\udea6", + "vhs": "\ud83d\udcfc", + "vibration_mode": "\ud83d\udcf3", + "video_camera": "\ud83d\udcf9", + "video_game": "\ud83c\udfae", + "violin": "\ud83c\udfbb", + "virgo": "\u264d", + "volcano": "\ud83c\udf0b", + "volleyball": "\ud83c\udfd0", + "vs": "\ud83c\udd9a", + "vulcan": "\ud83d\udd96", + "vulcan_tone1": "\ud83d\udd96\ud83c\udffb", + "vulcan_tone2": "\ud83d\udd96\ud83c\udffc", + "vulcan_tone3": "\ud83d\udd96\ud83c\udffd", + "vulcan_tone4": "\ud83d\udd96\ud83c\udffe", + "vulcan_tone5": "\ud83d\udd96\ud83c\udfff", + "walking": "\ud83d\udeb6", + "walking_tone1": "\ud83d\udeb6\ud83c\udffb", + "walking_tone2": "\ud83d\udeb6\ud83c\udffc", + "walking_tone3": "\ud83d\udeb6\ud83c\udffd", + "walking_tone4": "\ud83d\udeb6\ud83c\udffe", + "walking_tone5": "\ud83d\udeb6\ud83c\udfff", + "waning_crescent_moon": "\ud83c\udf18", + "waning_gibbous_moon": "\ud83c\udf16", + "warning": "\u26a0", + "wastebasket": "\ud83d\uddd1", + "watch": "\u231a", + "water_buffalo": "\ud83d\udc03", + "watermelon": "\ud83c\udf49", + "wave": "\ud83d\udc4b", + "wave_tone1": "\ud83d\udc4b\ud83c\udffb", + "wave_tone2": "\ud83d\udc4b\ud83c\udffc", + "wave_tone3": "\ud83d\udc4b\ud83c\udffd", + "wave_tone4": "\ud83d\udc4b\ud83c\udffe", + "wave_tone5": "\ud83d\udc4b\ud83c\udfff", + "wavy_dash": "\u3030", + "waxing_crescent_moon": "\ud83c\udf12", + "waxing_gibbous_moon": "\ud83c\udf14", + "wc": "\ud83d\udebe", + "weary": "\ud83d\ude29", + "wedding": "\ud83d\udc92", + "whale": "\ud83d\udc33", + "whale2": "\ud83d\udc0b", + "wheel_of_dharma": "\u2638", + "wheelchair": "\u267f", + "white_check_mark": "\u2705", + "white_circle": "\u26aa", + "white_flower": "\ud83d\udcae", + "white_large_square": "\u2b1c", + "white_medium_small_square": "\u25fd", + "white_medium_square": "\u25fb", + "white_small_square": "\u25ab", + "white_square_button": "\ud83d\udd33", + "white_sun_cloud": "\ud83c\udf25", + "white_sun_rain_cloud": "\ud83c\udf26", + "white_sun_small_cloud": "\ud83c\udf24", + "wind_blowing_face": "\ud83c\udf2c", + "wind_chime": "\ud83c\udf90", + "wine_glass": "\ud83c\udf77", + "wink": "\ud83d\ude09", + "wolf": "\ud83d\udc3a", + "woman": "\ud83d\udc69", + "woman_tone1": "\ud83d\udc69\ud83c\udffb", + "woman_tone2": "\ud83d\udc69\ud83c\udffc", + "woman_tone3": "\ud83d\udc69\ud83c\udffd", + "woman_tone4": "\ud83d\udc69\ud83c\udffe", + "woman_tone5": "\ud83d\udc69\ud83c\udfff", + "womans_clothes": "\ud83d\udc5a", + "womans_hat": "\ud83d\udc52", + "womens": "\ud83d\udeba", + "worried": "\ud83d\ude1f", + "wrench": "\ud83d\udd27", + "writing_hand": "\u270d", + "writing_hand_tone1": "\u270d\ud83c\udffb", + "writing_hand_tone2": "\u270d\ud83c\udffc", + "writing_hand_tone3": "\u270d\ud83c\udffd", + "writing_hand_tone4": "\u270d\ud83c\udffe", + "writing_hand_tone5": "\u270d\ud83c\udfff", + "x": "\u274c", + "yellow_heart": "\ud83d\udc9b", + "yen": "\ud83d\udcb4", + "yin_yang": "\u262f", + "yum": "\ud83d\ude0b", + "zap": "\u26a1", + "zero": "0\u20e3", + "zipper_mouth": "\ud83e\udd10", + "zzz": "\ud83d\udca4", + "100": "\ud83d\udcaf", + "1234": "\ud83d\udd22", + + "party": "\ud83c\udf89", + "celebration": "\ud83c\udf89", + "confetti": "\ud83c\udf89" +} diff --git a/resources/figlet/custom/README b/resources/figlet/custom/README new file mode 100644 index 0000000000..c667bb20e3 --- /dev/null +++ b/resources/figlet/custom/README @@ -0,0 +1,2 @@ +Add Figlet ".flf" font files here to make them available to the "figlet" +Remarkup interpreter. diff --git a/resources/sprite/actions_dark_1x/close.png b/resources/sprite/actions_dark_1x/close.png deleted file mode 100644 index c2dbd225ef..0000000000 Binary files a/resources/sprite/actions_dark_1x/close.png and /dev/null differ diff --git a/resources/sprite/actions_dark_1x/down.png b/resources/sprite/actions_dark_1x/down.png deleted file mode 100644 index 2baa91d9b4..0000000000 Binary files a/resources/sprite/actions_dark_1x/down.png and /dev/null differ diff --git a/resources/sprite/actions_dark_1x/flag.png b/resources/sprite/actions_dark_1x/flag.png deleted file mode 100644 index 4496f0497d..0000000000 Binary files a/resources/sprite/actions_dark_1x/flag.png and /dev/null differ diff --git a/resources/sprite/actions_dark_1x/heart.png b/resources/sprite/actions_dark_1x/heart.png deleted file mode 100644 index 01bb0f996f..0000000000 Binary files a/resources/sprite/actions_dark_1x/heart.png and /dev/null differ diff --git a/resources/sprite/actions_dark_1x/move.png b/resources/sprite/actions_dark_1x/move.png deleted file mode 100644 index 0ef2fb6541..0000000000 Binary files a/resources/sprite/actions_dark_1x/move.png and /dev/null differ diff --git a/resources/sprite/actions_dark_1x/new.png b/resources/sprite/actions_dark_1x/new.png deleted file mode 100644 index d14964c11d..0000000000 Binary files a/resources/sprite/actions_dark_1x/new.png and /dev/null differ diff --git a/resources/sprite/actions_dark_1x/search.png b/resources/sprite/actions_dark_1x/search.png deleted file mode 100644 index f8dd7754fd..0000000000 Binary files a/resources/sprite/actions_dark_1x/search.png and /dev/null differ diff --git a/resources/sprite/actions_dark_1x/settings.png b/resources/sprite/actions_dark_1x/settings.png deleted file mode 100644 index 06b5b3f40f..0000000000 Binary files a/resources/sprite/actions_dark_1x/settings.png and /dev/null differ diff --git a/resources/sprite/actions_dark_1x/star.png b/resources/sprite/actions_dark_1x/star.png deleted file mode 100644 index 0b811ef9de..0000000000 Binary files a/resources/sprite/actions_dark_1x/star.png and /dev/null differ diff --git a/resources/sprite/actions_dark_1x/tag.png b/resources/sprite/actions_dark_1x/tag.png deleted file mode 100644 index bb00b00ba2..0000000000 Binary files a/resources/sprite/actions_dark_1x/tag.png and /dev/null differ diff --git a/resources/sprite/actions_dark_1x/token.png b/resources/sprite/actions_dark_1x/token.png deleted file mode 100644 index 544dffafd7..0000000000 Binary files a/resources/sprite/actions_dark_1x/token.png and /dev/null differ diff --git a/resources/sprite/actions_dark_1x/up.png b/resources/sprite/actions_dark_1x/up.png deleted file mode 100644 index fd21ffae1c..0000000000 Binary files a/resources/sprite/actions_dark_1x/up.png and /dev/null differ diff --git a/resources/sprite/actions_dark_1x/wrench.png b/resources/sprite/actions_dark_1x/wrench.png deleted file mode 100644 index d7ffd1327b..0000000000 Binary files a/resources/sprite/actions_dark_1x/wrench.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/close.png b/resources/sprite/actions_dark_2x/close.png deleted file mode 100644 index bca1a00508..0000000000 Binary files a/resources/sprite/actions_dark_2x/close.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/down.png b/resources/sprite/actions_dark_2x/down.png deleted file mode 100644 index 5483640a00..0000000000 Binary files a/resources/sprite/actions_dark_2x/down.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/flag.png b/resources/sprite/actions_dark_2x/flag.png deleted file mode 100644 index 9401ba3329..0000000000 Binary files a/resources/sprite/actions_dark_2x/flag.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/heart.png b/resources/sprite/actions_dark_2x/heart.png deleted file mode 100644 index 8485ee1f77..0000000000 Binary files a/resources/sprite/actions_dark_2x/heart.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/move.png b/resources/sprite/actions_dark_2x/move.png deleted file mode 100644 index 94def43ddc..0000000000 Binary files a/resources/sprite/actions_dark_2x/move.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/new.png b/resources/sprite/actions_dark_2x/new.png deleted file mode 100644 index 1d26319e09..0000000000 Binary files a/resources/sprite/actions_dark_2x/new.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/search.png b/resources/sprite/actions_dark_2x/search.png deleted file mode 100644 index 2a6b2bb144..0000000000 Binary files a/resources/sprite/actions_dark_2x/search.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/settings.png b/resources/sprite/actions_dark_2x/settings.png deleted file mode 100644 index f75f0311b5..0000000000 Binary files a/resources/sprite/actions_dark_2x/settings.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/star.png b/resources/sprite/actions_dark_2x/star.png deleted file mode 100644 index e264758efe..0000000000 Binary files a/resources/sprite/actions_dark_2x/star.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/tag.png b/resources/sprite/actions_dark_2x/tag.png deleted file mode 100644 index 88055e5acc..0000000000 Binary files a/resources/sprite/actions_dark_2x/tag.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/token.png b/resources/sprite/actions_dark_2x/token.png deleted file mode 100644 index 0c3b09200b..0000000000 Binary files a/resources/sprite/actions_dark_2x/token.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/up.png b/resources/sprite/actions_dark_2x/up.png deleted file mode 100644 index 51e8cec796..0000000000 Binary files a/resources/sprite/actions_dark_2x/up.png and /dev/null differ diff --git a/resources/sprite/actions_dark_2x/wrench.png b/resources/sprite/actions_dark_2x/wrench.png deleted file mode 100644 index 3e2eed1757..0000000000 Binary files a/resources/sprite/actions_dark_2x/wrench.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/close.png b/resources/sprite/actions_grey_1x/close.png deleted file mode 100644 index d488e851e5..0000000000 Binary files a/resources/sprite/actions_grey_1x/close.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/down.png b/resources/sprite/actions_grey_1x/down.png deleted file mode 100644 index c93c050d65..0000000000 Binary files a/resources/sprite/actions_grey_1x/down.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/flag.png b/resources/sprite/actions_grey_1x/flag.png deleted file mode 100644 index ae0a27474d..0000000000 Binary files a/resources/sprite/actions_grey_1x/flag.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/heart.png b/resources/sprite/actions_grey_1x/heart.png deleted file mode 100644 index cc76d040e1..0000000000 Binary files a/resources/sprite/actions_grey_1x/heart.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/move.png b/resources/sprite/actions_grey_1x/move.png deleted file mode 100644 index 8594727f9d..0000000000 Binary files a/resources/sprite/actions_grey_1x/move.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/new.png b/resources/sprite/actions_grey_1x/new.png deleted file mode 100644 index a0df6cd8ac..0000000000 Binary files a/resources/sprite/actions_grey_1x/new.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/search.png b/resources/sprite/actions_grey_1x/search.png deleted file mode 100644 index b4a8fcfa8a..0000000000 Binary files a/resources/sprite/actions_grey_1x/search.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/settings.png b/resources/sprite/actions_grey_1x/settings.png deleted file mode 100644 index 3cece32a8e..0000000000 Binary files a/resources/sprite/actions_grey_1x/settings.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/star.png b/resources/sprite/actions_grey_1x/star.png deleted file mode 100644 index 1a90ac32a0..0000000000 Binary files a/resources/sprite/actions_grey_1x/star.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/tag.png b/resources/sprite/actions_grey_1x/tag.png deleted file mode 100644 index f037ca43f5..0000000000 Binary files a/resources/sprite/actions_grey_1x/tag.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/token.png b/resources/sprite/actions_grey_1x/token.png deleted file mode 100644 index 5b6818be17..0000000000 Binary files a/resources/sprite/actions_grey_1x/token.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/up.png b/resources/sprite/actions_grey_1x/up.png deleted file mode 100644 index e0b211ce68..0000000000 Binary files a/resources/sprite/actions_grey_1x/up.png and /dev/null differ diff --git a/resources/sprite/actions_grey_1x/wrench.png b/resources/sprite/actions_grey_1x/wrench.png deleted file mode 100644 index f26466926c..0000000000 Binary files a/resources/sprite/actions_grey_1x/wrench.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/close.png b/resources/sprite/actions_grey_2x/close.png deleted file mode 100644 index ca606f46a1..0000000000 Binary files a/resources/sprite/actions_grey_2x/close.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/down.png b/resources/sprite/actions_grey_2x/down.png deleted file mode 100644 index 010175cece..0000000000 Binary files a/resources/sprite/actions_grey_2x/down.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/flag.png b/resources/sprite/actions_grey_2x/flag.png deleted file mode 100644 index 787c2435a1..0000000000 Binary files a/resources/sprite/actions_grey_2x/flag.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/heart.png b/resources/sprite/actions_grey_2x/heart.png deleted file mode 100644 index dc3be62797..0000000000 Binary files a/resources/sprite/actions_grey_2x/heart.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/move.png b/resources/sprite/actions_grey_2x/move.png deleted file mode 100644 index 121b9ecef6..0000000000 Binary files a/resources/sprite/actions_grey_2x/move.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/new.png b/resources/sprite/actions_grey_2x/new.png deleted file mode 100644 index 505bc4707c..0000000000 Binary files a/resources/sprite/actions_grey_2x/new.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/search.png b/resources/sprite/actions_grey_2x/search.png deleted file mode 100644 index 1f3227b790..0000000000 Binary files a/resources/sprite/actions_grey_2x/search.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/settings.png b/resources/sprite/actions_grey_2x/settings.png deleted file mode 100644 index b47c1cd865..0000000000 Binary files a/resources/sprite/actions_grey_2x/settings.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/star.png b/resources/sprite/actions_grey_2x/star.png deleted file mode 100644 index 1fa2c903d5..0000000000 Binary files a/resources/sprite/actions_grey_2x/star.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/tag.png b/resources/sprite/actions_grey_2x/tag.png deleted file mode 100644 index fdcfcd0f49..0000000000 Binary files a/resources/sprite/actions_grey_2x/tag.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/token.png b/resources/sprite/actions_grey_2x/token.png deleted file mode 100644 index d8fc3bbbb2..0000000000 Binary files a/resources/sprite/actions_grey_2x/token.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/up.png b/resources/sprite/actions_grey_2x/up.png deleted file mode 100644 index 5aaea6fb37..0000000000 Binary files a/resources/sprite/actions_grey_2x/up.png and /dev/null differ diff --git a/resources/sprite/actions_grey_2x/wrench.png b/resources/sprite/actions_grey_2x/wrench.png deleted file mode 100644 index d20b965763..0000000000 Binary files a/resources/sprite/actions_grey_2x/wrench.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/close.png b/resources/sprite/actions_white_1x/close.png deleted file mode 100644 index 86c77e1ddc..0000000000 Binary files a/resources/sprite/actions_white_1x/close.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/down.png b/resources/sprite/actions_white_1x/down.png deleted file mode 100644 index 0c8c348279..0000000000 Binary files a/resources/sprite/actions_white_1x/down.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/flag.png b/resources/sprite/actions_white_1x/flag.png deleted file mode 100644 index aacea07f9c..0000000000 Binary files a/resources/sprite/actions_white_1x/flag.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/heart.png b/resources/sprite/actions_white_1x/heart.png deleted file mode 100644 index db9523593e..0000000000 Binary files a/resources/sprite/actions_white_1x/heart.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/move.png b/resources/sprite/actions_white_1x/move.png deleted file mode 100644 index bf7b9eaf00..0000000000 Binary files a/resources/sprite/actions_white_1x/move.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/new.png b/resources/sprite/actions_white_1x/new.png deleted file mode 100644 index ef6e5855b7..0000000000 Binary files a/resources/sprite/actions_white_1x/new.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/search.png b/resources/sprite/actions_white_1x/search.png deleted file mode 100644 index 5547e5ea9a..0000000000 Binary files a/resources/sprite/actions_white_1x/search.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/settings.png b/resources/sprite/actions_white_1x/settings.png deleted file mode 100644 index e2e4e03634..0000000000 Binary files a/resources/sprite/actions_white_1x/settings.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/star.png b/resources/sprite/actions_white_1x/star.png deleted file mode 100644 index 1fbbe58386..0000000000 Binary files a/resources/sprite/actions_white_1x/star.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/tag.png b/resources/sprite/actions_white_1x/tag.png deleted file mode 100644 index f4f41482a1..0000000000 Binary files a/resources/sprite/actions_white_1x/tag.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/token.png b/resources/sprite/actions_white_1x/token.png deleted file mode 100644 index b1ce1fe349..0000000000 Binary files a/resources/sprite/actions_white_1x/token.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/up.png b/resources/sprite/actions_white_1x/up.png deleted file mode 100644 index 7a1ca75700..0000000000 Binary files a/resources/sprite/actions_white_1x/up.png and /dev/null differ diff --git a/resources/sprite/actions_white_1x/wrench.png b/resources/sprite/actions_white_1x/wrench.png deleted file mode 100644 index 03710016be..0000000000 Binary files a/resources/sprite/actions_white_1x/wrench.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/close.png b/resources/sprite/actions_white_2x/close.png deleted file mode 100644 index e5cfd26f8c..0000000000 Binary files a/resources/sprite/actions_white_2x/close.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/down.png b/resources/sprite/actions_white_2x/down.png deleted file mode 100644 index 09a0c79ea0..0000000000 Binary files a/resources/sprite/actions_white_2x/down.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/flag.png b/resources/sprite/actions_white_2x/flag.png deleted file mode 100644 index ab2827da01..0000000000 Binary files a/resources/sprite/actions_white_2x/flag.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/heart.png b/resources/sprite/actions_white_2x/heart.png deleted file mode 100644 index ebf31df9be..0000000000 Binary files a/resources/sprite/actions_white_2x/heart.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/move.png b/resources/sprite/actions_white_2x/move.png deleted file mode 100644 index 33860e9208..0000000000 Binary files a/resources/sprite/actions_white_2x/move.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/new.png b/resources/sprite/actions_white_2x/new.png deleted file mode 100644 index 6a4ecef131..0000000000 Binary files a/resources/sprite/actions_white_2x/new.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/search.png b/resources/sprite/actions_white_2x/search.png deleted file mode 100644 index 71d3395d6c..0000000000 Binary files a/resources/sprite/actions_white_2x/search.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/settings.png b/resources/sprite/actions_white_2x/settings.png deleted file mode 100644 index 3811452a6c..0000000000 Binary files a/resources/sprite/actions_white_2x/settings.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/star.png b/resources/sprite/actions_white_2x/star.png deleted file mode 100644 index 46be460f2f..0000000000 Binary files a/resources/sprite/actions_white_2x/star.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/tag.png b/resources/sprite/actions_white_2x/tag.png deleted file mode 100644 index a42942212b..0000000000 Binary files a/resources/sprite/actions_white_2x/tag.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/token.png b/resources/sprite/actions_white_2x/token.png deleted file mode 100644 index bdb0ce76bb..0000000000 Binary files a/resources/sprite/actions_white_2x/token.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/up.png b/resources/sprite/actions_white_2x/up.png deleted file mode 100644 index 4ec3a2697b..0000000000 Binary files a/resources/sprite/actions_white_2x/up.png and /dev/null differ diff --git a/resources/sprite/actions_white_2x/wrench.png b/resources/sprite/actions_white_2x/wrench.png deleted file mode 100644 index eb99d8c853..0000000000 Binary files a/resources/sprite/actions_white_2x/wrench.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/adventure.png b/resources/sprite/apps_blue_2x/adventure.png deleted file mode 100644 index 2af5ed65e0..0000000000 Binary files a/resources/sprite/apps_blue_2x/adventure.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/application.png b/resources/sprite/apps_blue_2x/application.png deleted file mode 100644 index f63b68b2fb..0000000000 Binary files a/resources/sprite/apps_blue_2x/application.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/audit.png b/resources/sprite/apps_blue_2x/audit.png deleted file mode 100644 index 2089193a56..0000000000 Binary files a/resources/sprite/apps_blue_2x/audit.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/authentication.png b/resources/sprite/apps_blue_2x/authentication.png deleted file mode 100644 index ba88acb776..0000000000 Binary files a/resources/sprite/apps_blue_2x/authentication.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/calendar.png b/resources/sprite/apps_blue_2x/calendar.png deleted file mode 100644 index 7e1e6b21e8..0000000000 Binary files a/resources/sprite/apps_blue_2x/calendar.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/chatlog.png b/resources/sprite/apps_blue_2x/chatlog.png deleted file mode 100644 index aa6e71473c..0000000000 Binary files a/resources/sprite/apps_blue_2x/chatlog.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/conduit.png b/resources/sprite/apps_blue_2x/conduit.png deleted file mode 100644 index dfe826017f..0000000000 Binary files a/resources/sprite/apps_blue_2x/conduit.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/conpherence.png b/resources/sprite/apps_blue_2x/conpherence.png deleted file mode 100644 index 92122acfc6..0000000000 Binary files a/resources/sprite/apps_blue_2x/conpherence.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/countdown.png b/resources/sprite/apps_blue_2x/countdown.png deleted file mode 100644 index 28ec6f821b..0000000000 Binary files a/resources/sprite/apps_blue_2x/countdown.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/daemon.png b/resources/sprite/apps_blue_2x/daemon.png deleted file mode 100644 index 4968d62809..0000000000 Binary files a/resources/sprite/apps_blue_2x/daemon.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/differential.png b/resources/sprite/apps_blue_2x/differential.png deleted file mode 100644 index d0d8e5721c..0000000000 Binary files a/resources/sprite/apps_blue_2x/differential.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/diffusion.png b/resources/sprite/apps_blue_2x/diffusion.png deleted file mode 100644 index 6371083b4a..0000000000 Binary files a/resources/sprite/apps_blue_2x/diffusion.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/diviner.png b/resources/sprite/apps_blue_2x/diviner.png deleted file mode 100644 index 0836885a60..0000000000 Binary files a/resources/sprite/apps_blue_2x/diviner.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/drydock.png b/resources/sprite/apps_blue_2x/drydock.png deleted file mode 100644 index c892bd664f..0000000000 Binary files a/resources/sprite/apps_blue_2x/drydock.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/fact.png b/resources/sprite/apps_blue_2x/fact.png deleted file mode 100644 index 6e932456fc..0000000000 Binary files a/resources/sprite/apps_blue_2x/fact.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/feed.png b/resources/sprite/apps_blue_2x/feed.png deleted file mode 100644 index 5c49b45a57..0000000000 Binary files a/resources/sprite/apps_blue_2x/feed.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/files.png b/resources/sprite/apps_blue_2x/files.png deleted file mode 100644 index 9cc4d3f82f..0000000000 Binary files a/resources/sprite/apps_blue_2x/files.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/flags.png b/resources/sprite/apps_blue_2x/flags.png deleted file mode 100644 index 4ea21e3d1f..0000000000 Binary files a/resources/sprite/apps_blue_2x/flags.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/harbormaster.png b/resources/sprite/apps_blue_2x/harbormaster.png deleted file mode 100644 index 6fd75277b1..0000000000 Binary files a/resources/sprite/apps_blue_2x/harbormaster.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/help.png b/resources/sprite/apps_blue_2x/help.png deleted file mode 100644 index 2b46d41a06..0000000000 Binary files a/resources/sprite/apps_blue_2x/help.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/herald.png b/resources/sprite/apps_blue_2x/herald.png deleted file mode 100644 index bb78c6a7aa..0000000000 Binary files a/resources/sprite/apps_blue_2x/herald.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/home.png b/resources/sprite/apps_blue_2x/home.png deleted file mode 100644 index 4e355684c7..0000000000 Binary files a/resources/sprite/apps_blue_2x/home.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/legalpad.png b/resources/sprite/apps_blue_2x/legalpad.png deleted file mode 100644 index 252cfef9bc..0000000000 Binary files a/resources/sprite/apps_blue_2x/legalpad.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/logo.png b/resources/sprite/apps_blue_2x/logo.png deleted file mode 100644 index 34be4af18c..0000000000 Binary files a/resources/sprite/apps_blue_2x/logo.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/macro.png b/resources/sprite/apps_blue_2x/macro.png deleted file mode 100644 index 205d918112..0000000000 Binary files a/resources/sprite/apps_blue_2x/macro.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/mail.png b/resources/sprite/apps_blue_2x/mail.png deleted file mode 100644 index f4579690f7..0000000000 Binary files a/resources/sprite/apps_blue_2x/mail.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/maniphest.png b/resources/sprite/apps_blue_2x/maniphest.png deleted file mode 100644 index a6f814c31b..0000000000 Binary files a/resources/sprite/apps_blue_2x/maniphest.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/metamta.png b/resources/sprite/apps_blue_2x/metamta.png deleted file mode 100644 index 6a64459a6e..0000000000 Binary files a/resources/sprite/apps_blue_2x/metamta.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/new.png b/resources/sprite/apps_blue_2x/new.png deleted file mode 100644 index dfce5dd7aa..0000000000 Binary files a/resources/sprite/apps_blue_2x/new.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/owners.png b/resources/sprite/apps_blue_2x/owners.png deleted file mode 100644 index a16a2480ed..0000000000 Binary files a/resources/sprite/apps_blue_2x/owners.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/paste.png b/resources/sprite/apps_blue_2x/paste.png deleted file mode 100644 index 5e7950ed49..0000000000 Binary files a/resources/sprite/apps_blue_2x/paste.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/people.png b/resources/sprite/apps_blue_2x/people.png deleted file mode 100644 index 258f0bbefc..0000000000 Binary files a/resources/sprite/apps_blue_2x/people.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/phage.png b/resources/sprite/apps_blue_2x/phage.png deleted file mode 100644 index fc149ad486..0000000000 Binary files a/resources/sprite/apps_blue_2x/phage.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/phame.png b/resources/sprite/apps_blue_2x/phame.png deleted file mode 100644 index 7c57c56699..0000000000 Binary files a/resources/sprite/apps_blue_2x/phame.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/phid.png b/resources/sprite/apps_blue_2x/phid.png deleted file mode 100644 index 8be5b90c30..0000000000 Binary files a/resources/sprite/apps_blue_2x/phid.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/phlux.png b/resources/sprite/apps_blue_2x/phlux.png deleted file mode 100644 index a96abf9ff5..0000000000 Binary files a/resources/sprite/apps_blue_2x/phlux.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/pholio.png b/resources/sprite/apps_blue_2x/pholio.png deleted file mode 100644 index 6d889057da..0000000000 Binary files a/resources/sprite/apps_blue_2x/pholio.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/phortune.png b/resources/sprite/apps_blue_2x/phortune.png deleted file mode 100644 index 66e19a2d3b..0000000000 Binary files a/resources/sprite/apps_blue_2x/phortune.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/phpast.png b/resources/sprite/apps_blue_2x/phpast.png deleted file mode 100644 index 713cb63993..0000000000 Binary files a/resources/sprite/apps_blue_2x/phpast.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/phrequent.png b/resources/sprite/apps_blue_2x/phrequent.png deleted file mode 100644 index 1bba8ff08b..0000000000 Binary files a/resources/sprite/apps_blue_2x/phrequent.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/phriction.png b/resources/sprite/apps_blue_2x/phriction.png deleted file mode 100644 index a6f7350583..0000000000 Binary files a/resources/sprite/apps_blue_2x/phriction.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/policy.png b/resources/sprite/apps_blue_2x/policy.png deleted file mode 100644 index 5fdb199e34..0000000000 Binary files a/resources/sprite/apps_blue_2x/policy.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/ponder.png b/resources/sprite/apps_blue_2x/ponder.png deleted file mode 100644 index 716c2e827f..0000000000 Binary files a/resources/sprite/apps_blue_2x/ponder.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/power.png b/resources/sprite/apps_blue_2x/power.png deleted file mode 100644 index 5e853fc27a..0000000000 Binary files a/resources/sprite/apps_blue_2x/power.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/projects.png b/resources/sprite/apps_blue_2x/projects.png deleted file mode 100644 index 0b35d257f2..0000000000 Binary files a/resources/sprite/apps_blue_2x/projects.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/releeph.png b/resources/sprite/apps_blue_2x/releeph.png deleted file mode 100644 index 02850f4c4a..0000000000 Binary files a/resources/sprite/apps_blue_2x/releeph.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/repositories.png b/resources/sprite/apps_blue_2x/repositories.png deleted file mode 100644 index 1f99ab9772..0000000000 Binary files a/resources/sprite/apps_blue_2x/repositories.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/settings.png b/resources/sprite/apps_blue_2x/settings.png deleted file mode 100644 index 81904a91d2..0000000000 Binary files a/resources/sprite/apps_blue_2x/settings.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/setup.png b/resources/sprite/apps_blue_2x/setup.png deleted file mode 100644 index 87ad589d2f..0000000000 Binary files a/resources/sprite/apps_blue_2x/setup.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/slowvote.png b/resources/sprite/apps_blue_2x/slowvote.png deleted file mode 100644 index 2ae9db517e..0000000000 Binary files a/resources/sprite/apps_blue_2x/slowvote.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/token.png b/resources/sprite/apps_blue_2x/token.png deleted file mode 100644 index 2cf3889a6d..0000000000 Binary files a/resources/sprite/apps_blue_2x/token.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/uiexamples.png b/resources/sprite/apps_blue_2x/uiexamples.png deleted file mode 100644 index 4fa1ace0c9..0000000000 Binary files a/resources/sprite/apps_blue_2x/uiexamples.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/workphlow.png b/resources/sprite/apps_blue_2x/workphlow.png deleted file mode 100644 index 24a53ce191..0000000000 Binary files a/resources/sprite/apps_blue_2x/workphlow.png and /dev/null differ diff --git a/resources/sprite/apps_blue_2x/xhprof.png b/resources/sprite/apps_blue_2x/xhprof.png deleted file mode 100644 index 4dcc8c9478..0000000000 Binary files a/resources/sprite/apps_blue_2x/xhprof.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/adventure.png b/resources/sprite/apps_blue_4x/adventure.png deleted file mode 100644 index 05d059dff8..0000000000 Binary files a/resources/sprite/apps_blue_4x/adventure.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/application.png b/resources/sprite/apps_blue_4x/application.png deleted file mode 100644 index 314ca32b00..0000000000 Binary files a/resources/sprite/apps_blue_4x/application.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/audit.png b/resources/sprite/apps_blue_4x/audit.png deleted file mode 100644 index 9a4f72b3e8..0000000000 Binary files a/resources/sprite/apps_blue_4x/audit.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/authentication.png b/resources/sprite/apps_blue_4x/authentication.png deleted file mode 100644 index 6ba71068b7..0000000000 Binary files a/resources/sprite/apps_blue_4x/authentication.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/calendar.png b/resources/sprite/apps_blue_4x/calendar.png deleted file mode 100644 index ab681bded6..0000000000 Binary files a/resources/sprite/apps_blue_4x/calendar.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/chatlog.png b/resources/sprite/apps_blue_4x/chatlog.png deleted file mode 100644 index f64dc040ee..0000000000 Binary files a/resources/sprite/apps_blue_4x/chatlog.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/conduit.png b/resources/sprite/apps_blue_4x/conduit.png deleted file mode 100644 index 97f04f3e84..0000000000 Binary files a/resources/sprite/apps_blue_4x/conduit.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/conpherence.png b/resources/sprite/apps_blue_4x/conpherence.png deleted file mode 100644 index 6b39d32ac4..0000000000 Binary files a/resources/sprite/apps_blue_4x/conpherence.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/countdown.png b/resources/sprite/apps_blue_4x/countdown.png deleted file mode 100644 index ff98c50e1a..0000000000 Binary files a/resources/sprite/apps_blue_4x/countdown.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/daemon.png b/resources/sprite/apps_blue_4x/daemon.png deleted file mode 100644 index 279bb8d60f..0000000000 Binary files a/resources/sprite/apps_blue_4x/daemon.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/differential.png b/resources/sprite/apps_blue_4x/differential.png deleted file mode 100644 index 7e34330886..0000000000 Binary files a/resources/sprite/apps_blue_4x/differential.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/diffusion.png b/resources/sprite/apps_blue_4x/diffusion.png deleted file mode 100644 index 72a64756db..0000000000 Binary files a/resources/sprite/apps_blue_4x/diffusion.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/diviner.png b/resources/sprite/apps_blue_4x/diviner.png deleted file mode 100644 index 13ccd88e73..0000000000 Binary files a/resources/sprite/apps_blue_4x/diviner.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/drydock.png b/resources/sprite/apps_blue_4x/drydock.png deleted file mode 100644 index 387b0a3edf..0000000000 Binary files a/resources/sprite/apps_blue_4x/drydock.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/fact.png b/resources/sprite/apps_blue_4x/fact.png deleted file mode 100644 index 2fe7030ffc..0000000000 Binary files a/resources/sprite/apps_blue_4x/fact.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/feed.png b/resources/sprite/apps_blue_4x/feed.png deleted file mode 100644 index 75c6f265ad..0000000000 Binary files a/resources/sprite/apps_blue_4x/feed.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/files.png b/resources/sprite/apps_blue_4x/files.png deleted file mode 100644 index 9d9460e31d..0000000000 Binary files a/resources/sprite/apps_blue_4x/files.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/flags.png b/resources/sprite/apps_blue_4x/flags.png deleted file mode 100644 index f06370cdba..0000000000 Binary files a/resources/sprite/apps_blue_4x/flags.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/harbormaster.png b/resources/sprite/apps_blue_4x/harbormaster.png deleted file mode 100644 index 312111e751..0000000000 Binary files a/resources/sprite/apps_blue_4x/harbormaster.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/help.png b/resources/sprite/apps_blue_4x/help.png deleted file mode 100644 index 4ba4ffe034..0000000000 Binary files a/resources/sprite/apps_blue_4x/help.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/herald.png b/resources/sprite/apps_blue_4x/herald.png deleted file mode 100644 index 3a8bf22f01..0000000000 Binary files a/resources/sprite/apps_blue_4x/herald.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/home.png b/resources/sprite/apps_blue_4x/home.png deleted file mode 100644 index cd98c4678f..0000000000 Binary files a/resources/sprite/apps_blue_4x/home.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/legalpad.png b/resources/sprite/apps_blue_4x/legalpad.png deleted file mode 100644 index 1dd208b5a4..0000000000 Binary files a/resources/sprite/apps_blue_4x/legalpad.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/logo.png b/resources/sprite/apps_blue_4x/logo.png deleted file mode 100644 index 1f27c52996..0000000000 Binary files a/resources/sprite/apps_blue_4x/logo.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/macro.png b/resources/sprite/apps_blue_4x/macro.png deleted file mode 100644 index 9bf3504785..0000000000 Binary files a/resources/sprite/apps_blue_4x/macro.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/mail.png b/resources/sprite/apps_blue_4x/mail.png deleted file mode 100644 index db49a77b71..0000000000 Binary files a/resources/sprite/apps_blue_4x/mail.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/maniphest.png b/resources/sprite/apps_blue_4x/maniphest.png deleted file mode 100644 index 71e70c52d8..0000000000 Binary files a/resources/sprite/apps_blue_4x/maniphest.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/metamta.png b/resources/sprite/apps_blue_4x/metamta.png deleted file mode 100644 index 2495b6ab48..0000000000 Binary files a/resources/sprite/apps_blue_4x/metamta.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/new.png b/resources/sprite/apps_blue_4x/new.png deleted file mode 100644 index b7c5bdea64..0000000000 Binary files a/resources/sprite/apps_blue_4x/new.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/owners.png b/resources/sprite/apps_blue_4x/owners.png deleted file mode 100644 index f8abe8e693..0000000000 Binary files a/resources/sprite/apps_blue_4x/owners.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/paste.png b/resources/sprite/apps_blue_4x/paste.png deleted file mode 100644 index 7e4fcb0e05..0000000000 Binary files a/resources/sprite/apps_blue_4x/paste.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/people.png b/resources/sprite/apps_blue_4x/people.png deleted file mode 100644 index 7c4553aad0..0000000000 Binary files a/resources/sprite/apps_blue_4x/people.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/phage.png b/resources/sprite/apps_blue_4x/phage.png deleted file mode 100644 index b665f3a9e1..0000000000 Binary files a/resources/sprite/apps_blue_4x/phage.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/phame.png b/resources/sprite/apps_blue_4x/phame.png deleted file mode 100644 index c8d10f4297..0000000000 Binary files a/resources/sprite/apps_blue_4x/phame.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/phid.png b/resources/sprite/apps_blue_4x/phid.png deleted file mode 100644 index 983e4b3c96..0000000000 Binary files a/resources/sprite/apps_blue_4x/phid.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/phlux.png b/resources/sprite/apps_blue_4x/phlux.png deleted file mode 100644 index b4657068fd..0000000000 Binary files a/resources/sprite/apps_blue_4x/phlux.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/pholio.png b/resources/sprite/apps_blue_4x/pholio.png deleted file mode 100644 index a675c8b889..0000000000 Binary files a/resources/sprite/apps_blue_4x/pholio.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/phortune.png b/resources/sprite/apps_blue_4x/phortune.png deleted file mode 100644 index e9cf7a2506..0000000000 Binary files a/resources/sprite/apps_blue_4x/phortune.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/phpast.png b/resources/sprite/apps_blue_4x/phpast.png deleted file mode 100644 index 4458866379..0000000000 Binary files a/resources/sprite/apps_blue_4x/phpast.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/phrequent.png b/resources/sprite/apps_blue_4x/phrequent.png deleted file mode 100644 index f47c142db7..0000000000 Binary files a/resources/sprite/apps_blue_4x/phrequent.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/phriction.png b/resources/sprite/apps_blue_4x/phriction.png deleted file mode 100644 index 00f1ef63f2..0000000000 Binary files a/resources/sprite/apps_blue_4x/phriction.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/policy.png b/resources/sprite/apps_blue_4x/policy.png deleted file mode 100644 index 17ba9c6067..0000000000 Binary files a/resources/sprite/apps_blue_4x/policy.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/ponder.png b/resources/sprite/apps_blue_4x/ponder.png deleted file mode 100644 index 71f172010f..0000000000 Binary files a/resources/sprite/apps_blue_4x/ponder.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/power.png b/resources/sprite/apps_blue_4x/power.png deleted file mode 100644 index f10e7b82b0..0000000000 Binary files a/resources/sprite/apps_blue_4x/power.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/projects.png b/resources/sprite/apps_blue_4x/projects.png deleted file mode 100644 index 89f1f6fc75..0000000000 Binary files a/resources/sprite/apps_blue_4x/projects.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/releeph.png b/resources/sprite/apps_blue_4x/releeph.png deleted file mode 100644 index 7ef411848f..0000000000 Binary files a/resources/sprite/apps_blue_4x/releeph.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/repositories.png b/resources/sprite/apps_blue_4x/repositories.png deleted file mode 100644 index c664fe20b9..0000000000 Binary files a/resources/sprite/apps_blue_4x/repositories.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/settings.png b/resources/sprite/apps_blue_4x/settings.png deleted file mode 100644 index 875164dfdb..0000000000 Binary files a/resources/sprite/apps_blue_4x/settings.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/setup.png b/resources/sprite/apps_blue_4x/setup.png deleted file mode 100644 index c5f770c6f3..0000000000 Binary files a/resources/sprite/apps_blue_4x/setup.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/slowvote.png b/resources/sprite/apps_blue_4x/slowvote.png deleted file mode 100644 index 89d056bdc0..0000000000 Binary files a/resources/sprite/apps_blue_4x/slowvote.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/token.png b/resources/sprite/apps_blue_4x/token.png deleted file mode 100644 index 7c95db4c1e..0000000000 Binary files a/resources/sprite/apps_blue_4x/token.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/uiexamples.png b/resources/sprite/apps_blue_4x/uiexamples.png deleted file mode 100644 index 5a5c8b94f0..0000000000 Binary files a/resources/sprite/apps_blue_4x/uiexamples.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/workphlow.png b/resources/sprite/apps_blue_4x/workphlow.png deleted file mode 100644 index 5a82bb0f4b..0000000000 Binary files a/resources/sprite/apps_blue_4x/workphlow.png and /dev/null differ diff --git a/resources/sprite/apps_blue_4x/xhprof.png b/resources/sprite/apps_blue_4x/xhprof.png deleted file mode 100644 index f17791f45b..0000000000 Binary files a/resources/sprite/apps_blue_4x/xhprof.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/adventure.png b/resources/sprite/apps_dark_1x/adventure.png deleted file mode 100644 index 08a6a3573b..0000000000 Binary files a/resources/sprite/apps_dark_1x/adventure.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/application.png b/resources/sprite/apps_dark_1x/application.png deleted file mode 100644 index c1014f9d48..0000000000 Binary files a/resources/sprite/apps_dark_1x/application.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/audit.png b/resources/sprite/apps_dark_1x/audit.png deleted file mode 100644 index 108926f328..0000000000 Binary files a/resources/sprite/apps_dark_1x/audit.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/authentication.png b/resources/sprite/apps_dark_1x/authentication.png deleted file mode 100644 index ae66f339e8..0000000000 Binary files a/resources/sprite/apps_dark_1x/authentication.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/calendar.png b/resources/sprite/apps_dark_1x/calendar.png deleted file mode 100644 index b62b0a59e1..0000000000 Binary files a/resources/sprite/apps_dark_1x/calendar.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/chatlog.png b/resources/sprite/apps_dark_1x/chatlog.png deleted file mode 100644 index 79c6864004..0000000000 Binary files a/resources/sprite/apps_dark_1x/chatlog.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/conduit.png b/resources/sprite/apps_dark_1x/conduit.png deleted file mode 100644 index 06bd1c18e0..0000000000 Binary files a/resources/sprite/apps_dark_1x/conduit.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/conpherence.png b/resources/sprite/apps_dark_1x/conpherence.png deleted file mode 100644 index 6819b2b261..0000000000 Binary files a/resources/sprite/apps_dark_1x/conpherence.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/countdown.png b/resources/sprite/apps_dark_1x/countdown.png deleted file mode 100644 index 3ec71afef3..0000000000 Binary files a/resources/sprite/apps_dark_1x/countdown.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/daemon.png b/resources/sprite/apps_dark_1x/daemon.png deleted file mode 100644 index 8c7493fb02..0000000000 Binary files a/resources/sprite/apps_dark_1x/daemon.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/differential.png b/resources/sprite/apps_dark_1x/differential.png deleted file mode 100644 index 3e45f64c20..0000000000 Binary files a/resources/sprite/apps_dark_1x/differential.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/diffusion.png b/resources/sprite/apps_dark_1x/diffusion.png deleted file mode 100644 index 56e02789fb..0000000000 Binary files a/resources/sprite/apps_dark_1x/diffusion.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/diviner.png b/resources/sprite/apps_dark_1x/diviner.png deleted file mode 100644 index 7d4a049dcb..0000000000 Binary files a/resources/sprite/apps_dark_1x/diviner.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/drydock.png b/resources/sprite/apps_dark_1x/drydock.png deleted file mode 100644 index 573cf3e7e5..0000000000 Binary files a/resources/sprite/apps_dark_1x/drydock.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/fact.png b/resources/sprite/apps_dark_1x/fact.png deleted file mode 100644 index 9f4533dbe2..0000000000 Binary files a/resources/sprite/apps_dark_1x/fact.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/feed.png b/resources/sprite/apps_dark_1x/feed.png deleted file mode 100644 index 658d99da3a..0000000000 Binary files a/resources/sprite/apps_dark_1x/feed.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/files.png b/resources/sprite/apps_dark_1x/files.png deleted file mode 100644 index 97eaf96295..0000000000 Binary files a/resources/sprite/apps_dark_1x/files.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/flags.png b/resources/sprite/apps_dark_1x/flags.png deleted file mode 100644 index 793651b13b..0000000000 Binary files a/resources/sprite/apps_dark_1x/flags.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/harbormaster.png b/resources/sprite/apps_dark_1x/harbormaster.png deleted file mode 100644 index 30dff771fa..0000000000 Binary files a/resources/sprite/apps_dark_1x/harbormaster.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/help.png b/resources/sprite/apps_dark_1x/help.png deleted file mode 100644 index 8df7d8d776..0000000000 Binary files a/resources/sprite/apps_dark_1x/help.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/herald.png b/resources/sprite/apps_dark_1x/herald.png deleted file mode 100644 index df63603d28..0000000000 Binary files a/resources/sprite/apps_dark_1x/herald.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/home.png b/resources/sprite/apps_dark_1x/home.png deleted file mode 100644 index b6644042a2..0000000000 Binary files a/resources/sprite/apps_dark_1x/home.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/legalpad.png b/resources/sprite/apps_dark_1x/legalpad.png deleted file mode 100644 index a3049cb2e3..0000000000 Binary files a/resources/sprite/apps_dark_1x/legalpad.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/logo.png b/resources/sprite/apps_dark_1x/logo.png deleted file mode 100644 index 90cb5edb60..0000000000 Binary files a/resources/sprite/apps_dark_1x/logo.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/macro.png b/resources/sprite/apps_dark_1x/macro.png deleted file mode 100644 index 926aa1b6eb..0000000000 Binary files a/resources/sprite/apps_dark_1x/macro.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/mail.png b/resources/sprite/apps_dark_1x/mail.png deleted file mode 100644 index b8ae22573e..0000000000 Binary files a/resources/sprite/apps_dark_1x/mail.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/maniphest.png b/resources/sprite/apps_dark_1x/maniphest.png deleted file mode 100644 index d8afda2e9b..0000000000 Binary files a/resources/sprite/apps_dark_1x/maniphest.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/metamta.png b/resources/sprite/apps_dark_1x/metamta.png deleted file mode 100644 index a2ca22dc9f..0000000000 Binary files a/resources/sprite/apps_dark_1x/metamta.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/new.png b/resources/sprite/apps_dark_1x/new.png deleted file mode 100644 index 36962eb14e..0000000000 Binary files a/resources/sprite/apps_dark_1x/new.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/owners.png b/resources/sprite/apps_dark_1x/owners.png deleted file mode 100644 index e29daf2867..0000000000 Binary files a/resources/sprite/apps_dark_1x/owners.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/paste.png b/resources/sprite/apps_dark_1x/paste.png deleted file mode 100644 index 3eea6a445b..0000000000 Binary files a/resources/sprite/apps_dark_1x/paste.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/people.png b/resources/sprite/apps_dark_1x/people.png deleted file mode 100644 index 1a4594b851..0000000000 Binary files a/resources/sprite/apps_dark_1x/people.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/phage.png b/resources/sprite/apps_dark_1x/phage.png deleted file mode 100644 index f9053b3614..0000000000 Binary files a/resources/sprite/apps_dark_1x/phage.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/phame.png b/resources/sprite/apps_dark_1x/phame.png deleted file mode 100644 index f0b081c3e2..0000000000 Binary files a/resources/sprite/apps_dark_1x/phame.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/phid.png b/resources/sprite/apps_dark_1x/phid.png deleted file mode 100644 index c86103550e..0000000000 Binary files a/resources/sprite/apps_dark_1x/phid.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/phlux.png b/resources/sprite/apps_dark_1x/phlux.png deleted file mode 100644 index 527adba874..0000000000 Binary files a/resources/sprite/apps_dark_1x/phlux.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/pholio.png b/resources/sprite/apps_dark_1x/pholio.png deleted file mode 100644 index 3e9c4524d4..0000000000 Binary files a/resources/sprite/apps_dark_1x/pholio.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/phortune.png b/resources/sprite/apps_dark_1x/phortune.png deleted file mode 100644 index f4549f4c3e..0000000000 Binary files a/resources/sprite/apps_dark_1x/phortune.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/phpast.png b/resources/sprite/apps_dark_1x/phpast.png deleted file mode 100644 index 1f8df33c47..0000000000 Binary files a/resources/sprite/apps_dark_1x/phpast.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/phrequent.png b/resources/sprite/apps_dark_1x/phrequent.png deleted file mode 100644 index 41f5d2d04d..0000000000 Binary files a/resources/sprite/apps_dark_1x/phrequent.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/phriction.png b/resources/sprite/apps_dark_1x/phriction.png deleted file mode 100644 index 68c053f715..0000000000 Binary files a/resources/sprite/apps_dark_1x/phriction.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/policy.png b/resources/sprite/apps_dark_1x/policy.png deleted file mode 100644 index bc5d5ebfda..0000000000 Binary files a/resources/sprite/apps_dark_1x/policy.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/ponder.png b/resources/sprite/apps_dark_1x/ponder.png deleted file mode 100644 index 91426fdd2b..0000000000 Binary files a/resources/sprite/apps_dark_1x/ponder.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/power.png b/resources/sprite/apps_dark_1x/power.png deleted file mode 100644 index e06372322f..0000000000 Binary files a/resources/sprite/apps_dark_1x/power.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/projects.png b/resources/sprite/apps_dark_1x/projects.png deleted file mode 100644 index 6a24ef286f..0000000000 Binary files a/resources/sprite/apps_dark_1x/projects.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/releeph.png b/resources/sprite/apps_dark_1x/releeph.png deleted file mode 100644 index 2b6eb57f3a..0000000000 Binary files a/resources/sprite/apps_dark_1x/releeph.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/repositories.png b/resources/sprite/apps_dark_1x/repositories.png deleted file mode 100644 index 52c324590c..0000000000 Binary files a/resources/sprite/apps_dark_1x/repositories.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/settings.png b/resources/sprite/apps_dark_1x/settings.png deleted file mode 100644 index 2acdddd08d..0000000000 Binary files a/resources/sprite/apps_dark_1x/settings.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/setup.png b/resources/sprite/apps_dark_1x/setup.png deleted file mode 100644 index 91ef650df9..0000000000 Binary files a/resources/sprite/apps_dark_1x/setup.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/slowvote.png b/resources/sprite/apps_dark_1x/slowvote.png deleted file mode 100644 index 218563e4ac..0000000000 Binary files a/resources/sprite/apps_dark_1x/slowvote.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/token.png b/resources/sprite/apps_dark_1x/token.png deleted file mode 100644 index 5ce9a945f6..0000000000 Binary files a/resources/sprite/apps_dark_1x/token.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/uiexamples.png b/resources/sprite/apps_dark_1x/uiexamples.png deleted file mode 100644 index 9120fe40fd..0000000000 Binary files a/resources/sprite/apps_dark_1x/uiexamples.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/workphlow.png b/resources/sprite/apps_dark_1x/workphlow.png deleted file mode 100644 index 8adbd739f2..0000000000 Binary files a/resources/sprite/apps_dark_1x/workphlow.png and /dev/null differ diff --git a/resources/sprite/apps_dark_1x/xhprof.png b/resources/sprite/apps_dark_1x/xhprof.png deleted file mode 100644 index 7292ab4da9..0000000000 Binary files a/resources/sprite/apps_dark_1x/xhprof.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/adventure.png b/resources/sprite/apps_dark_2x/adventure.png deleted file mode 100644 index b8c39f9961..0000000000 Binary files a/resources/sprite/apps_dark_2x/adventure.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/application.png b/resources/sprite/apps_dark_2x/application.png deleted file mode 100644 index 7290ba1862..0000000000 Binary files a/resources/sprite/apps_dark_2x/application.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/audit.png b/resources/sprite/apps_dark_2x/audit.png deleted file mode 100644 index a1c4ae27a1..0000000000 Binary files a/resources/sprite/apps_dark_2x/audit.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/authentication.png b/resources/sprite/apps_dark_2x/authentication.png deleted file mode 100644 index 42f3c8ba55..0000000000 Binary files a/resources/sprite/apps_dark_2x/authentication.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/calendar.png b/resources/sprite/apps_dark_2x/calendar.png deleted file mode 100644 index 5ce9d49940..0000000000 Binary files a/resources/sprite/apps_dark_2x/calendar.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/chatlog.png b/resources/sprite/apps_dark_2x/chatlog.png deleted file mode 100644 index 138e1b6074..0000000000 Binary files a/resources/sprite/apps_dark_2x/chatlog.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/conduit.png b/resources/sprite/apps_dark_2x/conduit.png deleted file mode 100644 index 7b20ebc464..0000000000 Binary files a/resources/sprite/apps_dark_2x/conduit.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/conpherence.png b/resources/sprite/apps_dark_2x/conpherence.png deleted file mode 100644 index f40fd380df..0000000000 Binary files a/resources/sprite/apps_dark_2x/conpherence.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/countdown.png b/resources/sprite/apps_dark_2x/countdown.png deleted file mode 100644 index 6b1655f4e2..0000000000 Binary files a/resources/sprite/apps_dark_2x/countdown.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/daemon.png b/resources/sprite/apps_dark_2x/daemon.png deleted file mode 100644 index 27e601f071..0000000000 Binary files a/resources/sprite/apps_dark_2x/daemon.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/differential.png b/resources/sprite/apps_dark_2x/differential.png deleted file mode 100644 index 7bc7c09538..0000000000 Binary files a/resources/sprite/apps_dark_2x/differential.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/diffusion.png b/resources/sprite/apps_dark_2x/diffusion.png deleted file mode 100644 index 5779996c26..0000000000 Binary files a/resources/sprite/apps_dark_2x/diffusion.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/diviner.png b/resources/sprite/apps_dark_2x/diviner.png deleted file mode 100644 index b09dd5c034..0000000000 Binary files a/resources/sprite/apps_dark_2x/diviner.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/drydock.png b/resources/sprite/apps_dark_2x/drydock.png deleted file mode 100644 index 06aa00a88a..0000000000 Binary files a/resources/sprite/apps_dark_2x/drydock.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/fact.png b/resources/sprite/apps_dark_2x/fact.png deleted file mode 100644 index 9e699ba705..0000000000 Binary files a/resources/sprite/apps_dark_2x/fact.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/feed.png b/resources/sprite/apps_dark_2x/feed.png deleted file mode 100644 index c474d27e68..0000000000 Binary files a/resources/sprite/apps_dark_2x/feed.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/files.png b/resources/sprite/apps_dark_2x/files.png deleted file mode 100644 index 3ee1b1ba9a..0000000000 Binary files a/resources/sprite/apps_dark_2x/files.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/flags.png b/resources/sprite/apps_dark_2x/flags.png deleted file mode 100644 index a508919def..0000000000 Binary files a/resources/sprite/apps_dark_2x/flags.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/harbormaster.png b/resources/sprite/apps_dark_2x/harbormaster.png deleted file mode 100644 index 0bd70f8ce1..0000000000 Binary files a/resources/sprite/apps_dark_2x/harbormaster.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/help.png b/resources/sprite/apps_dark_2x/help.png deleted file mode 100644 index af3aa0e55e..0000000000 Binary files a/resources/sprite/apps_dark_2x/help.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/herald.png b/resources/sprite/apps_dark_2x/herald.png deleted file mode 100644 index 1abfe33e1e..0000000000 Binary files a/resources/sprite/apps_dark_2x/herald.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/home.png b/resources/sprite/apps_dark_2x/home.png deleted file mode 100644 index 7e9248f3f6..0000000000 Binary files a/resources/sprite/apps_dark_2x/home.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/legalpad.png b/resources/sprite/apps_dark_2x/legalpad.png deleted file mode 100644 index d7c29ffbef..0000000000 Binary files a/resources/sprite/apps_dark_2x/legalpad.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/logo.png b/resources/sprite/apps_dark_2x/logo.png deleted file mode 100644 index a5070285d1..0000000000 Binary files a/resources/sprite/apps_dark_2x/logo.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/macro.png b/resources/sprite/apps_dark_2x/macro.png deleted file mode 100644 index 0b1484b86f..0000000000 Binary files a/resources/sprite/apps_dark_2x/macro.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/mail.png b/resources/sprite/apps_dark_2x/mail.png deleted file mode 100644 index 2144b99538..0000000000 Binary files a/resources/sprite/apps_dark_2x/mail.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/maniphest.png b/resources/sprite/apps_dark_2x/maniphest.png deleted file mode 100644 index 3f0777d5bb..0000000000 Binary files a/resources/sprite/apps_dark_2x/maniphest.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/metamta.png b/resources/sprite/apps_dark_2x/metamta.png deleted file mode 100644 index fd231c5d96..0000000000 Binary files a/resources/sprite/apps_dark_2x/metamta.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/new.png b/resources/sprite/apps_dark_2x/new.png deleted file mode 100644 index d22db61c3b..0000000000 Binary files a/resources/sprite/apps_dark_2x/new.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/owners.png b/resources/sprite/apps_dark_2x/owners.png deleted file mode 100644 index f9e85c340b..0000000000 Binary files a/resources/sprite/apps_dark_2x/owners.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/paste.png b/resources/sprite/apps_dark_2x/paste.png deleted file mode 100644 index 6cdf7401e2..0000000000 Binary files a/resources/sprite/apps_dark_2x/paste.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/people.png b/resources/sprite/apps_dark_2x/people.png deleted file mode 100644 index 98a1bc0255..0000000000 Binary files a/resources/sprite/apps_dark_2x/people.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/phage.png b/resources/sprite/apps_dark_2x/phage.png deleted file mode 100644 index 6dc7ed5b5c..0000000000 Binary files a/resources/sprite/apps_dark_2x/phage.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/phame.png b/resources/sprite/apps_dark_2x/phame.png deleted file mode 100644 index ba2a0e3d7b..0000000000 Binary files a/resources/sprite/apps_dark_2x/phame.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/phid.png b/resources/sprite/apps_dark_2x/phid.png deleted file mode 100644 index a33368f563..0000000000 Binary files a/resources/sprite/apps_dark_2x/phid.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/phlux.png b/resources/sprite/apps_dark_2x/phlux.png deleted file mode 100644 index b7133da5ca..0000000000 Binary files a/resources/sprite/apps_dark_2x/phlux.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/pholio.png b/resources/sprite/apps_dark_2x/pholio.png deleted file mode 100644 index a7534b610c..0000000000 Binary files a/resources/sprite/apps_dark_2x/pholio.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/phortune.png b/resources/sprite/apps_dark_2x/phortune.png deleted file mode 100644 index 43c853e171..0000000000 Binary files a/resources/sprite/apps_dark_2x/phortune.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/phpast.png b/resources/sprite/apps_dark_2x/phpast.png deleted file mode 100644 index b34407dfb1..0000000000 Binary files a/resources/sprite/apps_dark_2x/phpast.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/phrequent.png b/resources/sprite/apps_dark_2x/phrequent.png deleted file mode 100644 index 994574a7e8..0000000000 Binary files a/resources/sprite/apps_dark_2x/phrequent.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/phriction.png b/resources/sprite/apps_dark_2x/phriction.png deleted file mode 100644 index 78ccde9243..0000000000 Binary files a/resources/sprite/apps_dark_2x/phriction.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/policy.png b/resources/sprite/apps_dark_2x/policy.png deleted file mode 100644 index 046e5f7dca..0000000000 Binary files a/resources/sprite/apps_dark_2x/policy.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/ponder.png b/resources/sprite/apps_dark_2x/ponder.png deleted file mode 100644 index def56bf456..0000000000 Binary files a/resources/sprite/apps_dark_2x/ponder.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/power.png b/resources/sprite/apps_dark_2x/power.png deleted file mode 100644 index 2de7fb26b6..0000000000 Binary files a/resources/sprite/apps_dark_2x/power.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/projects.png b/resources/sprite/apps_dark_2x/projects.png deleted file mode 100644 index c2e49f1f60..0000000000 Binary files a/resources/sprite/apps_dark_2x/projects.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/releeph.png b/resources/sprite/apps_dark_2x/releeph.png deleted file mode 100644 index f94f642598..0000000000 Binary files a/resources/sprite/apps_dark_2x/releeph.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/repositories.png b/resources/sprite/apps_dark_2x/repositories.png deleted file mode 100644 index 32a16b498c..0000000000 Binary files a/resources/sprite/apps_dark_2x/repositories.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/settings.png b/resources/sprite/apps_dark_2x/settings.png deleted file mode 100644 index e30c1e1c7e..0000000000 Binary files a/resources/sprite/apps_dark_2x/settings.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/setup.png b/resources/sprite/apps_dark_2x/setup.png deleted file mode 100644 index 58066fa84d..0000000000 Binary files a/resources/sprite/apps_dark_2x/setup.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/slowvote.png b/resources/sprite/apps_dark_2x/slowvote.png deleted file mode 100644 index 09fec2388b..0000000000 Binary files a/resources/sprite/apps_dark_2x/slowvote.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/token.png b/resources/sprite/apps_dark_2x/token.png deleted file mode 100644 index 6352af2a0f..0000000000 Binary files a/resources/sprite/apps_dark_2x/token.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/uiexamples.png b/resources/sprite/apps_dark_2x/uiexamples.png deleted file mode 100644 index 2c41e474e4..0000000000 Binary files a/resources/sprite/apps_dark_2x/uiexamples.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/workphlow.png b/resources/sprite/apps_dark_2x/workphlow.png deleted file mode 100644 index 8f9525849b..0000000000 Binary files a/resources/sprite/apps_dark_2x/workphlow.png and /dev/null differ diff --git a/resources/sprite/apps_dark_2x/xhprof.png b/resources/sprite/apps_dark_2x/xhprof.png deleted file mode 100644 index d660a9e192..0000000000 Binary files a/resources/sprite/apps_dark_2x/xhprof.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/adventure.png b/resources/sprite/apps_dark_4x/adventure.png deleted file mode 100644 index f2794b6fcd..0000000000 Binary files a/resources/sprite/apps_dark_4x/adventure.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/application.png b/resources/sprite/apps_dark_4x/application.png deleted file mode 100644 index 22be802be7..0000000000 Binary files a/resources/sprite/apps_dark_4x/application.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/audit.png b/resources/sprite/apps_dark_4x/audit.png deleted file mode 100644 index 4f6eb2b335..0000000000 Binary files a/resources/sprite/apps_dark_4x/audit.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/authentication.png b/resources/sprite/apps_dark_4x/authentication.png deleted file mode 100644 index 4bfbbd0c68..0000000000 Binary files a/resources/sprite/apps_dark_4x/authentication.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/calendar.png b/resources/sprite/apps_dark_4x/calendar.png deleted file mode 100644 index ddfd62c543..0000000000 Binary files a/resources/sprite/apps_dark_4x/calendar.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/chatlog.png b/resources/sprite/apps_dark_4x/chatlog.png deleted file mode 100644 index cd9833c21c..0000000000 Binary files a/resources/sprite/apps_dark_4x/chatlog.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/conduit.png b/resources/sprite/apps_dark_4x/conduit.png deleted file mode 100644 index 14ba3f4d21..0000000000 Binary files a/resources/sprite/apps_dark_4x/conduit.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/conpherence.png b/resources/sprite/apps_dark_4x/conpherence.png deleted file mode 100644 index 80e1321d6c..0000000000 Binary files a/resources/sprite/apps_dark_4x/conpherence.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/countdown.png b/resources/sprite/apps_dark_4x/countdown.png deleted file mode 100644 index 54637f817a..0000000000 Binary files a/resources/sprite/apps_dark_4x/countdown.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/daemon.png b/resources/sprite/apps_dark_4x/daemon.png deleted file mode 100644 index 9f7ef81599..0000000000 Binary files a/resources/sprite/apps_dark_4x/daemon.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/differential.png b/resources/sprite/apps_dark_4x/differential.png deleted file mode 100644 index 51dcf39390..0000000000 Binary files a/resources/sprite/apps_dark_4x/differential.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/diffusion.png b/resources/sprite/apps_dark_4x/diffusion.png deleted file mode 100644 index 4470401859..0000000000 Binary files a/resources/sprite/apps_dark_4x/diffusion.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/diviner.png b/resources/sprite/apps_dark_4x/diviner.png deleted file mode 100644 index d4288d81f0..0000000000 Binary files a/resources/sprite/apps_dark_4x/diviner.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/drydock.png b/resources/sprite/apps_dark_4x/drydock.png deleted file mode 100644 index 059a75056b..0000000000 Binary files a/resources/sprite/apps_dark_4x/drydock.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/fact.png b/resources/sprite/apps_dark_4x/fact.png deleted file mode 100644 index d2ab0c1f1b..0000000000 Binary files a/resources/sprite/apps_dark_4x/fact.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/feed.png b/resources/sprite/apps_dark_4x/feed.png deleted file mode 100644 index d4a4cdacf2..0000000000 Binary files a/resources/sprite/apps_dark_4x/feed.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/files.png b/resources/sprite/apps_dark_4x/files.png deleted file mode 100644 index 6a7fdf6bb7..0000000000 Binary files a/resources/sprite/apps_dark_4x/files.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/flags.png b/resources/sprite/apps_dark_4x/flags.png deleted file mode 100644 index 2f6c274487..0000000000 Binary files a/resources/sprite/apps_dark_4x/flags.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/harbormaster.png b/resources/sprite/apps_dark_4x/harbormaster.png deleted file mode 100644 index 71d68e8f07..0000000000 Binary files a/resources/sprite/apps_dark_4x/harbormaster.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/help.png b/resources/sprite/apps_dark_4x/help.png deleted file mode 100644 index fa1b77b6c6..0000000000 Binary files a/resources/sprite/apps_dark_4x/help.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/herald.png b/resources/sprite/apps_dark_4x/herald.png deleted file mode 100644 index d78a6915fd..0000000000 Binary files a/resources/sprite/apps_dark_4x/herald.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/home.png b/resources/sprite/apps_dark_4x/home.png deleted file mode 100644 index a6dc9a98e6..0000000000 Binary files a/resources/sprite/apps_dark_4x/home.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/legalpad.png b/resources/sprite/apps_dark_4x/legalpad.png deleted file mode 100644 index df41cb8ea4..0000000000 Binary files a/resources/sprite/apps_dark_4x/legalpad.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/logo.png b/resources/sprite/apps_dark_4x/logo.png deleted file mode 100644 index 0b4df07a6b..0000000000 Binary files a/resources/sprite/apps_dark_4x/logo.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/macro.png b/resources/sprite/apps_dark_4x/macro.png deleted file mode 100644 index 8c8667d27e..0000000000 Binary files a/resources/sprite/apps_dark_4x/macro.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/mail.png b/resources/sprite/apps_dark_4x/mail.png deleted file mode 100644 index d5a6626135..0000000000 Binary files a/resources/sprite/apps_dark_4x/mail.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/maniphest.png b/resources/sprite/apps_dark_4x/maniphest.png deleted file mode 100644 index f5008bd1c0..0000000000 Binary files a/resources/sprite/apps_dark_4x/maniphest.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/metamta.png b/resources/sprite/apps_dark_4x/metamta.png deleted file mode 100644 index 08fd3695d3..0000000000 Binary files a/resources/sprite/apps_dark_4x/metamta.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/new.png b/resources/sprite/apps_dark_4x/new.png deleted file mode 100644 index 85c3ce57c7..0000000000 Binary files a/resources/sprite/apps_dark_4x/new.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/owners.png b/resources/sprite/apps_dark_4x/owners.png deleted file mode 100644 index 5017b6b35e..0000000000 Binary files a/resources/sprite/apps_dark_4x/owners.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/paste.png b/resources/sprite/apps_dark_4x/paste.png deleted file mode 100644 index ba30a8cd86..0000000000 Binary files a/resources/sprite/apps_dark_4x/paste.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/people.png b/resources/sprite/apps_dark_4x/people.png deleted file mode 100644 index 5a6a23014d..0000000000 Binary files a/resources/sprite/apps_dark_4x/people.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/phage.png b/resources/sprite/apps_dark_4x/phage.png deleted file mode 100644 index f3f0c759fa..0000000000 Binary files a/resources/sprite/apps_dark_4x/phage.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/phame.png b/resources/sprite/apps_dark_4x/phame.png deleted file mode 100644 index df419ae150..0000000000 Binary files a/resources/sprite/apps_dark_4x/phame.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/phid.png b/resources/sprite/apps_dark_4x/phid.png deleted file mode 100644 index 605f3f0f6e..0000000000 Binary files a/resources/sprite/apps_dark_4x/phid.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/phlux.png b/resources/sprite/apps_dark_4x/phlux.png deleted file mode 100644 index 970d7209f7..0000000000 Binary files a/resources/sprite/apps_dark_4x/phlux.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/pholio.png b/resources/sprite/apps_dark_4x/pholio.png deleted file mode 100644 index 414b43f43f..0000000000 Binary files a/resources/sprite/apps_dark_4x/pholio.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/phortune.png b/resources/sprite/apps_dark_4x/phortune.png deleted file mode 100644 index 524c89303e..0000000000 Binary files a/resources/sprite/apps_dark_4x/phortune.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/phpast.png b/resources/sprite/apps_dark_4x/phpast.png deleted file mode 100644 index 998c55a020..0000000000 Binary files a/resources/sprite/apps_dark_4x/phpast.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/phrequent.png b/resources/sprite/apps_dark_4x/phrequent.png deleted file mode 100644 index eb21794e10..0000000000 Binary files a/resources/sprite/apps_dark_4x/phrequent.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/phriction.png b/resources/sprite/apps_dark_4x/phriction.png deleted file mode 100644 index 01e57dbc36..0000000000 Binary files a/resources/sprite/apps_dark_4x/phriction.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/policy.png b/resources/sprite/apps_dark_4x/policy.png deleted file mode 100644 index 394d03e333..0000000000 Binary files a/resources/sprite/apps_dark_4x/policy.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/ponder.png b/resources/sprite/apps_dark_4x/ponder.png deleted file mode 100644 index 8ea011b27a..0000000000 Binary files a/resources/sprite/apps_dark_4x/ponder.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/power.png b/resources/sprite/apps_dark_4x/power.png deleted file mode 100644 index 4cd468f075..0000000000 Binary files a/resources/sprite/apps_dark_4x/power.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/projects.png b/resources/sprite/apps_dark_4x/projects.png deleted file mode 100644 index 1ddc862ed6..0000000000 Binary files a/resources/sprite/apps_dark_4x/projects.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/releeph.png b/resources/sprite/apps_dark_4x/releeph.png deleted file mode 100644 index c08a372a1e..0000000000 Binary files a/resources/sprite/apps_dark_4x/releeph.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/repositories.png b/resources/sprite/apps_dark_4x/repositories.png deleted file mode 100644 index 1c9492d11f..0000000000 Binary files a/resources/sprite/apps_dark_4x/repositories.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/settings.png b/resources/sprite/apps_dark_4x/settings.png deleted file mode 100644 index 707cc81a06..0000000000 Binary files a/resources/sprite/apps_dark_4x/settings.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/setup.png b/resources/sprite/apps_dark_4x/setup.png deleted file mode 100644 index 8a18030389..0000000000 Binary files a/resources/sprite/apps_dark_4x/setup.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/slowvote.png b/resources/sprite/apps_dark_4x/slowvote.png deleted file mode 100644 index ed105dc351..0000000000 Binary files a/resources/sprite/apps_dark_4x/slowvote.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/token.png b/resources/sprite/apps_dark_4x/token.png deleted file mode 100644 index 1ff74fe070..0000000000 Binary files a/resources/sprite/apps_dark_4x/token.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/uiexamples.png b/resources/sprite/apps_dark_4x/uiexamples.png deleted file mode 100644 index 48ad436d9b..0000000000 Binary files a/resources/sprite/apps_dark_4x/uiexamples.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/workphlow.png b/resources/sprite/apps_dark_4x/workphlow.png deleted file mode 100644 index 3d5c9a3c88..0000000000 Binary files a/resources/sprite/apps_dark_4x/workphlow.png and /dev/null differ diff --git a/resources/sprite/apps_dark_4x/xhprof.png b/resources/sprite/apps_dark_4x/xhprof.png deleted file mode 100644 index 242a68109e..0000000000 Binary files a/resources/sprite/apps_dark_4x/xhprof.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/adventure.png b/resources/sprite/apps_lb_2x/adventure.png deleted file mode 100644 index 8dac1c561a..0000000000 Binary files a/resources/sprite/apps_lb_2x/adventure.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/application.png b/resources/sprite/apps_lb_2x/application.png deleted file mode 100644 index 54fabdca9e..0000000000 Binary files a/resources/sprite/apps_lb_2x/application.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/audit.png b/resources/sprite/apps_lb_2x/audit.png deleted file mode 100644 index ac8f5b7a35..0000000000 Binary files a/resources/sprite/apps_lb_2x/audit.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/authentication.png b/resources/sprite/apps_lb_2x/authentication.png deleted file mode 100644 index 1052da99c8..0000000000 Binary files a/resources/sprite/apps_lb_2x/authentication.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/calendar.png b/resources/sprite/apps_lb_2x/calendar.png deleted file mode 100644 index d214646500..0000000000 Binary files a/resources/sprite/apps_lb_2x/calendar.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/chatlog.png b/resources/sprite/apps_lb_2x/chatlog.png deleted file mode 100644 index 7fe087f25b..0000000000 Binary files a/resources/sprite/apps_lb_2x/chatlog.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/conduit.png b/resources/sprite/apps_lb_2x/conduit.png deleted file mode 100644 index d92c6b5d0b..0000000000 Binary files a/resources/sprite/apps_lb_2x/conduit.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/conpherence.png b/resources/sprite/apps_lb_2x/conpherence.png deleted file mode 100644 index 4f4ace2658..0000000000 Binary files a/resources/sprite/apps_lb_2x/conpherence.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/countdown.png b/resources/sprite/apps_lb_2x/countdown.png deleted file mode 100644 index f0814ff6dc..0000000000 Binary files a/resources/sprite/apps_lb_2x/countdown.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/daemon.png b/resources/sprite/apps_lb_2x/daemon.png deleted file mode 100644 index 3cbf1b9c56..0000000000 Binary files a/resources/sprite/apps_lb_2x/daemon.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/differential.png b/resources/sprite/apps_lb_2x/differential.png deleted file mode 100644 index 496fde8b1a..0000000000 Binary files a/resources/sprite/apps_lb_2x/differential.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/diffusion.png b/resources/sprite/apps_lb_2x/diffusion.png deleted file mode 100644 index 8526a69543..0000000000 Binary files a/resources/sprite/apps_lb_2x/diffusion.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/diviner.png b/resources/sprite/apps_lb_2x/diviner.png deleted file mode 100644 index fd991ae4f2..0000000000 Binary files a/resources/sprite/apps_lb_2x/diviner.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/drydock.png b/resources/sprite/apps_lb_2x/drydock.png deleted file mode 100644 index d6cf55bafa..0000000000 Binary files a/resources/sprite/apps_lb_2x/drydock.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/fact.png b/resources/sprite/apps_lb_2x/fact.png deleted file mode 100644 index 508941ee0f..0000000000 Binary files a/resources/sprite/apps_lb_2x/fact.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/feed.png b/resources/sprite/apps_lb_2x/feed.png deleted file mode 100644 index c9471bec20..0000000000 Binary files a/resources/sprite/apps_lb_2x/feed.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/files.png b/resources/sprite/apps_lb_2x/files.png deleted file mode 100644 index e2e4254b0b..0000000000 Binary files a/resources/sprite/apps_lb_2x/files.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/flags.png b/resources/sprite/apps_lb_2x/flags.png deleted file mode 100644 index 8ad67e6669..0000000000 Binary files a/resources/sprite/apps_lb_2x/flags.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/harbormaster.png b/resources/sprite/apps_lb_2x/harbormaster.png deleted file mode 100644 index 47188935b2..0000000000 Binary files a/resources/sprite/apps_lb_2x/harbormaster.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/help.png b/resources/sprite/apps_lb_2x/help.png deleted file mode 100644 index 99948e3009..0000000000 Binary files a/resources/sprite/apps_lb_2x/help.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/herald.png b/resources/sprite/apps_lb_2x/herald.png deleted file mode 100644 index 2f982ab8a6..0000000000 Binary files a/resources/sprite/apps_lb_2x/herald.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/home.png b/resources/sprite/apps_lb_2x/home.png deleted file mode 100644 index 5b8cb9f1db..0000000000 Binary files a/resources/sprite/apps_lb_2x/home.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/legalpad.png b/resources/sprite/apps_lb_2x/legalpad.png deleted file mode 100644 index 6da9b90821..0000000000 Binary files a/resources/sprite/apps_lb_2x/legalpad.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/logo.png b/resources/sprite/apps_lb_2x/logo.png deleted file mode 100644 index 640cd44cb9..0000000000 Binary files a/resources/sprite/apps_lb_2x/logo.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/macro.png b/resources/sprite/apps_lb_2x/macro.png deleted file mode 100644 index eb1c43c946..0000000000 Binary files a/resources/sprite/apps_lb_2x/macro.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/mail.png b/resources/sprite/apps_lb_2x/mail.png deleted file mode 100644 index 9d99e60ed8..0000000000 Binary files a/resources/sprite/apps_lb_2x/mail.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/maniphest.png b/resources/sprite/apps_lb_2x/maniphest.png deleted file mode 100644 index d5fa4dd131..0000000000 Binary files a/resources/sprite/apps_lb_2x/maniphest.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/metamta.png b/resources/sprite/apps_lb_2x/metamta.png deleted file mode 100644 index eadfada4be..0000000000 Binary files a/resources/sprite/apps_lb_2x/metamta.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/new.png b/resources/sprite/apps_lb_2x/new.png deleted file mode 100644 index b285d2cb1c..0000000000 Binary files a/resources/sprite/apps_lb_2x/new.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/owners.png b/resources/sprite/apps_lb_2x/owners.png deleted file mode 100644 index 71a4122770..0000000000 Binary files a/resources/sprite/apps_lb_2x/owners.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/paste.png b/resources/sprite/apps_lb_2x/paste.png deleted file mode 100644 index e82ee90ce9..0000000000 Binary files a/resources/sprite/apps_lb_2x/paste.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/people.png b/resources/sprite/apps_lb_2x/people.png deleted file mode 100644 index 14279ee01d..0000000000 Binary files a/resources/sprite/apps_lb_2x/people.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/phage.png b/resources/sprite/apps_lb_2x/phage.png deleted file mode 100644 index b2ee00c2a7..0000000000 Binary files a/resources/sprite/apps_lb_2x/phage.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/phame.png b/resources/sprite/apps_lb_2x/phame.png deleted file mode 100644 index c95b1c450f..0000000000 Binary files a/resources/sprite/apps_lb_2x/phame.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/phid.png b/resources/sprite/apps_lb_2x/phid.png deleted file mode 100644 index fce1b641dc..0000000000 Binary files a/resources/sprite/apps_lb_2x/phid.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/phlux.png b/resources/sprite/apps_lb_2x/phlux.png deleted file mode 100644 index 6f9c3f4e19..0000000000 Binary files a/resources/sprite/apps_lb_2x/phlux.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/pholio.png b/resources/sprite/apps_lb_2x/pholio.png deleted file mode 100644 index 32d1459f76..0000000000 Binary files a/resources/sprite/apps_lb_2x/pholio.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/phortune.png b/resources/sprite/apps_lb_2x/phortune.png deleted file mode 100644 index 32de11289f..0000000000 Binary files a/resources/sprite/apps_lb_2x/phortune.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/phpast.png b/resources/sprite/apps_lb_2x/phpast.png deleted file mode 100644 index 051fce7cca..0000000000 Binary files a/resources/sprite/apps_lb_2x/phpast.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/phrequent.png b/resources/sprite/apps_lb_2x/phrequent.png deleted file mode 100644 index ef9ae27d79..0000000000 Binary files a/resources/sprite/apps_lb_2x/phrequent.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/phriction.png b/resources/sprite/apps_lb_2x/phriction.png deleted file mode 100644 index deabf4695f..0000000000 Binary files a/resources/sprite/apps_lb_2x/phriction.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/policy.png b/resources/sprite/apps_lb_2x/policy.png deleted file mode 100644 index 762a5e0963..0000000000 Binary files a/resources/sprite/apps_lb_2x/policy.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/ponder.png b/resources/sprite/apps_lb_2x/ponder.png deleted file mode 100644 index 98f9b7055b..0000000000 Binary files a/resources/sprite/apps_lb_2x/ponder.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/power.png b/resources/sprite/apps_lb_2x/power.png deleted file mode 100644 index a0db149fd4..0000000000 Binary files a/resources/sprite/apps_lb_2x/power.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/projects.png b/resources/sprite/apps_lb_2x/projects.png deleted file mode 100644 index 6b3d86ad67..0000000000 Binary files a/resources/sprite/apps_lb_2x/projects.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/releeph.png b/resources/sprite/apps_lb_2x/releeph.png deleted file mode 100644 index bd49bdd6a4..0000000000 Binary files a/resources/sprite/apps_lb_2x/releeph.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/repositories.png b/resources/sprite/apps_lb_2x/repositories.png deleted file mode 100644 index 314db4db33..0000000000 Binary files a/resources/sprite/apps_lb_2x/repositories.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/settings.png b/resources/sprite/apps_lb_2x/settings.png deleted file mode 100644 index 846092a6b2..0000000000 Binary files a/resources/sprite/apps_lb_2x/settings.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/setup.png b/resources/sprite/apps_lb_2x/setup.png deleted file mode 100644 index bfa1a6b96c..0000000000 Binary files a/resources/sprite/apps_lb_2x/setup.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/slowvote.png b/resources/sprite/apps_lb_2x/slowvote.png deleted file mode 100644 index fcaf99f9ae..0000000000 Binary files a/resources/sprite/apps_lb_2x/slowvote.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/token.png b/resources/sprite/apps_lb_2x/token.png deleted file mode 100644 index 2f7f3fde61..0000000000 Binary files a/resources/sprite/apps_lb_2x/token.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/uiexamples.png b/resources/sprite/apps_lb_2x/uiexamples.png deleted file mode 100644 index c10953e613..0000000000 Binary files a/resources/sprite/apps_lb_2x/uiexamples.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/workphlow.png b/resources/sprite/apps_lb_2x/workphlow.png deleted file mode 100644 index 2db95209dc..0000000000 Binary files a/resources/sprite/apps_lb_2x/workphlow.png and /dev/null differ diff --git a/resources/sprite/apps_lb_2x/xhprof.png b/resources/sprite/apps_lb_2x/xhprof.png deleted file mode 100644 index 3d716413af..0000000000 Binary files a/resources/sprite/apps_lb_2x/xhprof.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/adventure.png b/resources/sprite/apps_lb_4x/adventure.png deleted file mode 100644 index 02c2684dd0..0000000000 Binary files a/resources/sprite/apps_lb_4x/adventure.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/application.png b/resources/sprite/apps_lb_4x/application.png deleted file mode 100644 index 71297c7d15..0000000000 Binary files a/resources/sprite/apps_lb_4x/application.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/audit.png b/resources/sprite/apps_lb_4x/audit.png deleted file mode 100644 index cb2c6c1dbc..0000000000 Binary files a/resources/sprite/apps_lb_4x/audit.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/authentication.png b/resources/sprite/apps_lb_4x/authentication.png deleted file mode 100644 index e80002109a..0000000000 Binary files a/resources/sprite/apps_lb_4x/authentication.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/calendar.png b/resources/sprite/apps_lb_4x/calendar.png deleted file mode 100644 index db28d533e9..0000000000 Binary files a/resources/sprite/apps_lb_4x/calendar.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/chatlog.png b/resources/sprite/apps_lb_4x/chatlog.png deleted file mode 100644 index 5b54b912aa..0000000000 Binary files a/resources/sprite/apps_lb_4x/chatlog.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/conduit.png b/resources/sprite/apps_lb_4x/conduit.png deleted file mode 100644 index c0739b476b..0000000000 Binary files a/resources/sprite/apps_lb_4x/conduit.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/conpherence.png b/resources/sprite/apps_lb_4x/conpherence.png deleted file mode 100644 index a3cc9ef7b9..0000000000 Binary files a/resources/sprite/apps_lb_4x/conpherence.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/countdown.png b/resources/sprite/apps_lb_4x/countdown.png deleted file mode 100644 index 6b46b1d01e..0000000000 Binary files a/resources/sprite/apps_lb_4x/countdown.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/daemon.png b/resources/sprite/apps_lb_4x/daemon.png deleted file mode 100644 index 0fda3e868f..0000000000 Binary files a/resources/sprite/apps_lb_4x/daemon.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/differential.png b/resources/sprite/apps_lb_4x/differential.png deleted file mode 100644 index 2e831679d6..0000000000 Binary files a/resources/sprite/apps_lb_4x/differential.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/diffusion.png b/resources/sprite/apps_lb_4x/diffusion.png deleted file mode 100644 index 090ca29666..0000000000 Binary files a/resources/sprite/apps_lb_4x/diffusion.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/diviner.png b/resources/sprite/apps_lb_4x/diviner.png deleted file mode 100644 index 60ae291964..0000000000 Binary files a/resources/sprite/apps_lb_4x/diviner.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/drydock.png b/resources/sprite/apps_lb_4x/drydock.png deleted file mode 100644 index b8a801b24b..0000000000 Binary files a/resources/sprite/apps_lb_4x/drydock.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/fact.png b/resources/sprite/apps_lb_4x/fact.png deleted file mode 100644 index b5fdd29df9..0000000000 Binary files a/resources/sprite/apps_lb_4x/fact.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/feed.png b/resources/sprite/apps_lb_4x/feed.png deleted file mode 100644 index 6303dd17ce..0000000000 Binary files a/resources/sprite/apps_lb_4x/feed.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/files.png b/resources/sprite/apps_lb_4x/files.png deleted file mode 100644 index 5a311e665f..0000000000 Binary files a/resources/sprite/apps_lb_4x/files.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/flags.png b/resources/sprite/apps_lb_4x/flags.png deleted file mode 100644 index 9549e0d9dd..0000000000 Binary files a/resources/sprite/apps_lb_4x/flags.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/harbormaster.png b/resources/sprite/apps_lb_4x/harbormaster.png deleted file mode 100644 index c00a127280..0000000000 Binary files a/resources/sprite/apps_lb_4x/harbormaster.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/help.png b/resources/sprite/apps_lb_4x/help.png deleted file mode 100644 index c7327ba89f..0000000000 Binary files a/resources/sprite/apps_lb_4x/help.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/herald.png b/resources/sprite/apps_lb_4x/herald.png deleted file mode 100644 index 935d516119..0000000000 Binary files a/resources/sprite/apps_lb_4x/herald.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/home.png b/resources/sprite/apps_lb_4x/home.png deleted file mode 100644 index 517a52cd70..0000000000 Binary files a/resources/sprite/apps_lb_4x/home.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/legalpad.png b/resources/sprite/apps_lb_4x/legalpad.png deleted file mode 100644 index 245a08cf38..0000000000 Binary files a/resources/sprite/apps_lb_4x/legalpad.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/logo.png b/resources/sprite/apps_lb_4x/logo.png deleted file mode 100644 index ba9fa2fa7c..0000000000 Binary files a/resources/sprite/apps_lb_4x/logo.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/macro.png b/resources/sprite/apps_lb_4x/macro.png deleted file mode 100644 index 0db8258a01..0000000000 Binary files a/resources/sprite/apps_lb_4x/macro.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/mail.png b/resources/sprite/apps_lb_4x/mail.png deleted file mode 100644 index 270e50ee53..0000000000 Binary files a/resources/sprite/apps_lb_4x/mail.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/maniphest.png b/resources/sprite/apps_lb_4x/maniphest.png deleted file mode 100644 index 403e3df619..0000000000 Binary files a/resources/sprite/apps_lb_4x/maniphest.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/metamta.png b/resources/sprite/apps_lb_4x/metamta.png deleted file mode 100644 index 38375d7b09..0000000000 Binary files a/resources/sprite/apps_lb_4x/metamta.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/new.png b/resources/sprite/apps_lb_4x/new.png deleted file mode 100644 index 27e4c41c2e..0000000000 Binary files a/resources/sprite/apps_lb_4x/new.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/owners.png b/resources/sprite/apps_lb_4x/owners.png deleted file mode 100644 index b556dcaae0..0000000000 Binary files a/resources/sprite/apps_lb_4x/owners.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/paste.png b/resources/sprite/apps_lb_4x/paste.png deleted file mode 100644 index c0169a62c0..0000000000 Binary files a/resources/sprite/apps_lb_4x/paste.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/people.png b/resources/sprite/apps_lb_4x/people.png deleted file mode 100644 index b7d35b23a2..0000000000 Binary files a/resources/sprite/apps_lb_4x/people.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/phage.png b/resources/sprite/apps_lb_4x/phage.png deleted file mode 100644 index 92ac49f3e9..0000000000 Binary files a/resources/sprite/apps_lb_4x/phage.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/phame.png b/resources/sprite/apps_lb_4x/phame.png deleted file mode 100644 index 1e9c53b190..0000000000 Binary files a/resources/sprite/apps_lb_4x/phame.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/phid.png b/resources/sprite/apps_lb_4x/phid.png deleted file mode 100644 index 027804d397..0000000000 Binary files a/resources/sprite/apps_lb_4x/phid.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/phlux.png b/resources/sprite/apps_lb_4x/phlux.png deleted file mode 100644 index b4265a887c..0000000000 Binary files a/resources/sprite/apps_lb_4x/phlux.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/pholio.png b/resources/sprite/apps_lb_4x/pholio.png deleted file mode 100644 index 4bf9234ff5..0000000000 Binary files a/resources/sprite/apps_lb_4x/pholio.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/phortune.png b/resources/sprite/apps_lb_4x/phortune.png deleted file mode 100644 index fb05647921..0000000000 Binary files a/resources/sprite/apps_lb_4x/phortune.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/phpast.png b/resources/sprite/apps_lb_4x/phpast.png deleted file mode 100644 index 455f1aac4b..0000000000 Binary files a/resources/sprite/apps_lb_4x/phpast.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/phrequent.png b/resources/sprite/apps_lb_4x/phrequent.png deleted file mode 100644 index dd53891159..0000000000 Binary files a/resources/sprite/apps_lb_4x/phrequent.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/phriction.png b/resources/sprite/apps_lb_4x/phriction.png deleted file mode 100644 index 9fe3ec63ce..0000000000 Binary files a/resources/sprite/apps_lb_4x/phriction.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/policy.png b/resources/sprite/apps_lb_4x/policy.png deleted file mode 100644 index 4d74ee7ecf..0000000000 Binary files a/resources/sprite/apps_lb_4x/policy.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/ponder.png b/resources/sprite/apps_lb_4x/ponder.png deleted file mode 100644 index 9d9b0513b9..0000000000 Binary files a/resources/sprite/apps_lb_4x/ponder.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/power.png b/resources/sprite/apps_lb_4x/power.png deleted file mode 100644 index ded4b32929..0000000000 Binary files a/resources/sprite/apps_lb_4x/power.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/projects.png b/resources/sprite/apps_lb_4x/projects.png deleted file mode 100644 index ea2477231e..0000000000 Binary files a/resources/sprite/apps_lb_4x/projects.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/releeph.png b/resources/sprite/apps_lb_4x/releeph.png deleted file mode 100644 index da06dc9164..0000000000 Binary files a/resources/sprite/apps_lb_4x/releeph.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/repositories.png b/resources/sprite/apps_lb_4x/repositories.png deleted file mode 100644 index 6fa0772133..0000000000 Binary files a/resources/sprite/apps_lb_4x/repositories.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/settings.png b/resources/sprite/apps_lb_4x/settings.png deleted file mode 100644 index 3672869f5f..0000000000 Binary files a/resources/sprite/apps_lb_4x/settings.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/setup.png b/resources/sprite/apps_lb_4x/setup.png deleted file mode 100644 index 881005bf00..0000000000 Binary files a/resources/sprite/apps_lb_4x/setup.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/slowvote.png b/resources/sprite/apps_lb_4x/slowvote.png deleted file mode 100644 index 3f470ef686..0000000000 Binary files a/resources/sprite/apps_lb_4x/slowvote.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/token.png b/resources/sprite/apps_lb_4x/token.png deleted file mode 100644 index 47ccaab48f..0000000000 Binary files a/resources/sprite/apps_lb_4x/token.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/uiexamples.png b/resources/sprite/apps_lb_4x/uiexamples.png deleted file mode 100644 index f0089b69cf..0000000000 Binary files a/resources/sprite/apps_lb_4x/uiexamples.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/workphlow.png b/resources/sprite/apps_lb_4x/workphlow.png deleted file mode 100644 index 8a995fc4e5..0000000000 Binary files a/resources/sprite/apps_lb_4x/workphlow.png and /dev/null differ diff --git a/resources/sprite/apps_lb_4x/xhprof.png b/resources/sprite/apps_lb_4x/xhprof.png deleted file mode 100644 index 61b586c8e5..0000000000 Binary files a/resources/sprite/apps_lb_4x/xhprof.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/adventure.png b/resources/sprite/apps_white_1x/adventure.png deleted file mode 100644 index 5fda721350..0000000000 Binary files a/resources/sprite/apps_white_1x/adventure.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/application.png b/resources/sprite/apps_white_1x/application.png deleted file mode 100644 index ba77af4c1f..0000000000 Binary files a/resources/sprite/apps_white_1x/application.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/audit.png b/resources/sprite/apps_white_1x/audit.png deleted file mode 100644 index 44b5ef279e..0000000000 Binary files a/resources/sprite/apps_white_1x/audit.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/authentication.png b/resources/sprite/apps_white_1x/authentication.png deleted file mode 100644 index 17e11d0b5b..0000000000 Binary files a/resources/sprite/apps_white_1x/authentication.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/calendar.png b/resources/sprite/apps_white_1x/calendar.png deleted file mode 100644 index d87b755192..0000000000 Binary files a/resources/sprite/apps_white_1x/calendar.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/chatlog.png b/resources/sprite/apps_white_1x/chatlog.png deleted file mode 100644 index 39bf40df3b..0000000000 Binary files a/resources/sprite/apps_white_1x/chatlog.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/conduit.png b/resources/sprite/apps_white_1x/conduit.png deleted file mode 100644 index f253f621b5..0000000000 Binary files a/resources/sprite/apps_white_1x/conduit.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/conpherence.png b/resources/sprite/apps_white_1x/conpherence.png deleted file mode 100644 index f3fa5fe6aa..0000000000 Binary files a/resources/sprite/apps_white_1x/conpherence.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/countdown.png b/resources/sprite/apps_white_1x/countdown.png deleted file mode 100644 index 601864d06e..0000000000 Binary files a/resources/sprite/apps_white_1x/countdown.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/daemon.png b/resources/sprite/apps_white_1x/daemon.png deleted file mode 100644 index 134dbb2f15..0000000000 Binary files a/resources/sprite/apps_white_1x/daemon.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/differential.png b/resources/sprite/apps_white_1x/differential.png deleted file mode 100644 index 39f7398946..0000000000 Binary files a/resources/sprite/apps_white_1x/differential.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/diffusion.png b/resources/sprite/apps_white_1x/diffusion.png deleted file mode 100644 index f8e22b2ffe..0000000000 Binary files a/resources/sprite/apps_white_1x/diffusion.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/diviner.png b/resources/sprite/apps_white_1x/diviner.png deleted file mode 100644 index 5b6c22bcc8..0000000000 Binary files a/resources/sprite/apps_white_1x/diviner.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/drydock.png b/resources/sprite/apps_white_1x/drydock.png deleted file mode 100644 index 94e018d61b..0000000000 Binary files a/resources/sprite/apps_white_1x/drydock.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/fact.png b/resources/sprite/apps_white_1x/fact.png deleted file mode 100644 index b9902fe9d5..0000000000 Binary files a/resources/sprite/apps_white_1x/fact.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/feed.png b/resources/sprite/apps_white_1x/feed.png deleted file mode 100644 index 1f423fe0ff..0000000000 Binary files a/resources/sprite/apps_white_1x/feed.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/files.png b/resources/sprite/apps_white_1x/files.png deleted file mode 100644 index 4ca2e3d7ed..0000000000 Binary files a/resources/sprite/apps_white_1x/files.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/flags.png b/resources/sprite/apps_white_1x/flags.png deleted file mode 100644 index f608f29a59..0000000000 Binary files a/resources/sprite/apps_white_1x/flags.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/harbormaster.png b/resources/sprite/apps_white_1x/harbormaster.png deleted file mode 100644 index 21f5200c6e..0000000000 Binary files a/resources/sprite/apps_white_1x/harbormaster.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/help.png b/resources/sprite/apps_white_1x/help.png deleted file mode 100644 index 7d4ec93e67..0000000000 Binary files a/resources/sprite/apps_white_1x/help.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/herald.png b/resources/sprite/apps_white_1x/herald.png deleted file mode 100644 index d3d55d934a..0000000000 Binary files a/resources/sprite/apps_white_1x/herald.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/home.png b/resources/sprite/apps_white_1x/home.png deleted file mode 100644 index 6fe6d48d94..0000000000 Binary files a/resources/sprite/apps_white_1x/home.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/legalpad.png b/resources/sprite/apps_white_1x/legalpad.png deleted file mode 100644 index 554f389dfe..0000000000 Binary files a/resources/sprite/apps_white_1x/legalpad.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/logo.png b/resources/sprite/apps_white_1x/logo.png deleted file mode 100644 index d0ff11bc77..0000000000 Binary files a/resources/sprite/apps_white_1x/logo.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/macro.png b/resources/sprite/apps_white_1x/macro.png deleted file mode 100644 index 560740b9ca..0000000000 Binary files a/resources/sprite/apps_white_1x/macro.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/mail.png b/resources/sprite/apps_white_1x/mail.png deleted file mode 100644 index b797652d51..0000000000 Binary files a/resources/sprite/apps_white_1x/mail.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/maniphest.png b/resources/sprite/apps_white_1x/maniphest.png deleted file mode 100644 index 7d1ed7d335..0000000000 Binary files a/resources/sprite/apps_white_1x/maniphest.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/metamta.png b/resources/sprite/apps_white_1x/metamta.png deleted file mode 100644 index ac33c33756..0000000000 Binary files a/resources/sprite/apps_white_1x/metamta.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/new.png b/resources/sprite/apps_white_1x/new.png deleted file mode 100644 index 8fcfbd8227..0000000000 Binary files a/resources/sprite/apps_white_1x/new.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/owners.png b/resources/sprite/apps_white_1x/owners.png deleted file mode 100644 index 460ed21505..0000000000 Binary files a/resources/sprite/apps_white_1x/owners.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/paste.png b/resources/sprite/apps_white_1x/paste.png deleted file mode 100644 index 067c1a87be..0000000000 Binary files a/resources/sprite/apps_white_1x/paste.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/people.png b/resources/sprite/apps_white_1x/people.png deleted file mode 100644 index 3c5a62f21a..0000000000 Binary files a/resources/sprite/apps_white_1x/people.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/phage.png b/resources/sprite/apps_white_1x/phage.png deleted file mode 100644 index 7e1b4b9f4e..0000000000 Binary files a/resources/sprite/apps_white_1x/phage.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/phame.png b/resources/sprite/apps_white_1x/phame.png deleted file mode 100644 index 539c5c11b0..0000000000 Binary files a/resources/sprite/apps_white_1x/phame.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/phid.png b/resources/sprite/apps_white_1x/phid.png deleted file mode 100644 index e681c70e32..0000000000 Binary files a/resources/sprite/apps_white_1x/phid.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/phlux.png b/resources/sprite/apps_white_1x/phlux.png deleted file mode 100644 index b508a6977a..0000000000 Binary files a/resources/sprite/apps_white_1x/phlux.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/pholio.png b/resources/sprite/apps_white_1x/pholio.png deleted file mode 100644 index db9aebea5e..0000000000 Binary files a/resources/sprite/apps_white_1x/pholio.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/phortune.png b/resources/sprite/apps_white_1x/phortune.png deleted file mode 100644 index 6ce1ee3556..0000000000 Binary files a/resources/sprite/apps_white_1x/phortune.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/phpast.png b/resources/sprite/apps_white_1x/phpast.png deleted file mode 100644 index b2260574b3..0000000000 Binary files a/resources/sprite/apps_white_1x/phpast.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/phrequent.png b/resources/sprite/apps_white_1x/phrequent.png deleted file mode 100644 index 90cdb18c17..0000000000 Binary files a/resources/sprite/apps_white_1x/phrequent.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/phriction.png b/resources/sprite/apps_white_1x/phriction.png deleted file mode 100644 index 49c2258db2..0000000000 Binary files a/resources/sprite/apps_white_1x/phriction.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/policy.png b/resources/sprite/apps_white_1x/policy.png deleted file mode 100644 index 615d776eb7..0000000000 Binary files a/resources/sprite/apps_white_1x/policy.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/ponder.png b/resources/sprite/apps_white_1x/ponder.png deleted file mode 100644 index de3d748971..0000000000 Binary files a/resources/sprite/apps_white_1x/ponder.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/power.png b/resources/sprite/apps_white_1x/power.png deleted file mode 100644 index 9713de08a9..0000000000 Binary files a/resources/sprite/apps_white_1x/power.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/projects.png b/resources/sprite/apps_white_1x/projects.png deleted file mode 100644 index ff0abe277a..0000000000 Binary files a/resources/sprite/apps_white_1x/projects.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/releeph.png b/resources/sprite/apps_white_1x/releeph.png deleted file mode 100644 index 9df62e8e11..0000000000 Binary files a/resources/sprite/apps_white_1x/releeph.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/repositories.png b/resources/sprite/apps_white_1x/repositories.png deleted file mode 100644 index efd894d5c0..0000000000 Binary files a/resources/sprite/apps_white_1x/repositories.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/settings.png b/resources/sprite/apps_white_1x/settings.png deleted file mode 100644 index 615557ff6a..0000000000 Binary files a/resources/sprite/apps_white_1x/settings.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/setup.png b/resources/sprite/apps_white_1x/setup.png deleted file mode 100644 index 38214fdb48..0000000000 Binary files a/resources/sprite/apps_white_1x/setup.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/slowvote.png b/resources/sprite/apps_white_1x/slowvote.png deleted file mode 100644 index bd3b1094e1..0000000000 Binary files a/resources/sprite/apps_white_1x/slowvote.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/token.png b/resources/sprite/apps_white_1x/token.png deleted file mode 100644 index fbe2ac87c0..0000000000 Binary files a/resources/sprite/apps_white_1x/token.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/uiexamples.png b/resources/sprite/apps_white_1x/uiexamples.png deleted file mode 100644 index 0f0fef4e0a..0000000000 Binary files a/resources/sprite/apps_white_1x/uiexamples.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/workphlow.png b/resources/sprite/apps_white_1x/workphlow.png deleted file mode 100644 index 43da14881b..0000000000 Binary files a/resources/sprite/apps_white_1x/workphlow.png and /dev/null differ diff --git a/resources/sprite/apps_white_1x/xhprof.png b/resources/sprite/apps_white_1x/xhprof.png deleted file mode 100644 index 4723f506fa..0000000000 Binary files a/resources/sprite/apps_white_1x/xhprof.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/adventure.png b/resources/sprite/apps_white_2x/adventure.png deleted file mode 100644 index 9f73d302e7..0000000000 Binary files a/resources/sprite/apps_white_2x/adventure.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/application.png b/resources/sprite/apps_white_2x/application.png deleted file mode 100644 index a7aafce244..0000000000 Binary files a/resources/sprite/apps_white_2x/application.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/audit.png b/resources/sprite/apps_white_2x/audit.png deleted file mode 100644 index 4d8911fd34..0000000000 Binary files a/resources/sprite/apps_white_2x/audit.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/authentication.png b/resources/sprite/apps_white_2x/authentication.png deleted file mode 100644 index 17d3332948..0000000000 Binary files a/resources/sprite/apps_white_2x/authentication.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/calendar.png b/resources/sprite/apps_white_2x/calendar.png deleted file mode 100644 index 35e490f600..0000000000 Binary files a/resources/sprite/apps_white_2x/calendar.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/chatlog.png b/resources/sprite/apps_white_2x/chatlog.png deleted file mode 100644 index 15f5cd7b62..0000000000 Binary files a/resources/sprite/apps_white_2x/chatlog.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/conduit.png b/resources/sprite/apps_white_2x/conduit.png deleted file mode 100644 index ddde5300d6..0000000000 Binary files a/resources/sprite/apps_white_2x/conduit.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/conpherence.png b/resources/sprite/apps_white_2x/conpherence.png deleted file mode 100644 index bec0cf5b64..0000000000 Binary files a/resources/sprite/apps_white_2x/conpherence.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/countdown.png b/resources/sprite/apps_white_2x/countdown.png deleted file mode 100644 index dc284523f1..0000000000 Binary files a/resources/sprite/apps_white_2x/countdown.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/daemon.png b/resources/sprite/apps_white_2x/daemon.png deleted file mode 100644 index 3926bf5ec1..0000000000 Binary files a/resources/sprite/apps_white_2x/daemon.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/differential.png b/resources/sprite/apps_white_2x/differential.png deleted file mode 100644 index 9bb6b86da0..0000000000 Binary files a/resources/sprite/apps_white_2x/differential.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/diffusion.png b/resources/sprite/apps_white_2x/diffusion.png deleted file mode 100644 index 877f53c996..0000000000 Binary files a/resources/sprite/apps_white_2x/diffusion.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/diviner.png b/resources/sprite/apps_white_2x/diviner.png deleted file mode 100644 index a2a7e1162c..0000000000 Binary files a/resources/sprite/apps_white_2x/diviner.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/drydock.png b/resources/sprite/apps_white_2x/drydock.png deleted file mode 100644 index 499f3f2509..0000000000 Binary files a/resources/sprite/apps_white_2x/drydock.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/fact.png b/resources/sprite/apps_white_2x/fact.png deleted file mode 100644 index c2647392da..0000000000 Binary files a/resources/sprite/apps_white_2x/fact.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/feed.png b/resources/sprite/apps_white_2x/feed.png deleted file mode 100644 index 4b558c8d69..0000000000 Binary files a/resources/sprite/apps_white_2x/feed.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/files.png b/resources/sprite/apps_white_2x/files.png deleted file mode 100644 index 24b3a95ae5..0000000000 Binary files a/resources/sprite/apps_white_2x/files.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/flags.png b/resources/sprite/apps_white_2x/flags.png deleted file mode 100644 index 4516b98a2f..0000000000 Binary files a/resources/sprite/apps_white_2x/flags.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/harbormaster.png b/resources/sprite/apps_white_2x/harbormaster.png deleted file mode 100644 index 1262838b34..0000000000 Binary files a/resources/sprite/apps_white_2x/harbormaster.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/help.png b/resources/sprite/apps_white_2x/help.png deleted file mode 100644 index c6ff403840..0000000000 Binary files a/resources/sprite/apps_white_2x/help.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/herald.png b/resources/sprite/apps_white_2x/herald.png deleted file mode 100644 index 243858827e..0000000000 Binary files a/resources/sprite/apps_white_2x/herald.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/home.png b/resources/sprite/apps_white_2x/home.png deleted file mode 100644 index 9af1b284c6..0000000000 Binary files a/resources/sprite/apps_white_2x/home.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/legalpad.png b/resources/sprite/apps_white_2x/legalpad.png deleted file mode 100644 index 22969b6171..0000000000 Binary files a/resources/sprite/apps_white_2x/legalpad.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/logo.png b/resources/sprite/apps_white_2x/logo.png deleted file mode 100644 index 0528c36ce0..0000000000 Binary files a/resources/sprite/apps_white_2x/logo.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/macro.png b/resources/sprite/apps_white_2x/macro.png deleted file mode 100644 index 2b95286ab9..0000000000 Binary files a/resources/sprite/apps_white_2x/macro.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/mail.png b/resources/sprite/apps_white_2x/mail.png deleted file mode 100644 index d42852656d..0000000000 Binary files a/resources/sprite/apps_white_2x/mail.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/maniphest.png b/resources/sprite/apps_white_2x/maniphest.png deleted file mode 100644 index 552c2b8e21..0000000000 Binary files a/resources/sprite/apps_white_2x/maniphest.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/metamta.png b/resources/sprite/apps_white_2x/metamta.png deleted file mode 100644 index 4203cb10c4..0000000000 Binary files a/resources/sprite/apps_white_2x/metamta.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/new.png b/resources/sprite/apps_white_2x/new.png deleted file mode 100644 index 8aedbb3f67..0000000000 Binary files a/resources/sprite/apps_white_2x/new.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/owners.png b/resources/sprite/apps_white_2x/owners.png deleted file mode 100644 index 93f52e0f99..0000000000 Binary files a/resources/sprite/apps_white_2x/owners.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/paste.png b/resources/sprite/apps_white_2x/paste.png deleted file mode 100644 index af8cae54c3..0000000000 Binary files a/resources/sprite/apps_white_2x/paste.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/people.png b/resources/sprite/apps_white_2x/people.png deleted file mode 100644 index 807228484f..0000000000 Binary files a/resources/sprite/apps_white_2x/people.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/phage.png b/resources/sprite/apps_white_2x/phage.png deleted file mode 100644 index 782ed596a7..0000000000 Binary files a/resources/sprite/apps_white_2x/phage.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/phame.png b/resources/sprite/apps_white_2x/phame.png deleted file mode 100644 index 16dd65aeac..0000000000 Binary files a/resources/sprite/apps_white_2x/phame.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/phid.png b/resources/sprite/apps_white_2x/phid.png deleted file mode 100644 index be3bd0ca39..0000000000 Binary files a/resources/sprite/apps_white_2x/phid.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/phlux.png b/resources/sprite/apps_white_2x/phlux.png deleted file mode 100644 index 2c3aeb6714..0000000000 Binary files a/resources/sprite/apps_white_2x/phlux.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/pholio.png b/resources/sprite/apps_white_2x/pholio.png deleted file mode 100644 index 77dc6eb207..0000000000 Binary files a/resources/sprite/apps_white_2x/pholio.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/phortune.png b/resources/sprite/apps_white_2x/phortune.png deleted file mode 100644 index 02af14df7b..0000000000 Binary files a/resources/sprite/apps_white_2x/phortune.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/phpast.png b/resources/sprite/apps_white_2x/phpast.png deleted file mode 100644 index 7c4ace0cbb..0000000000 Binary files a/resources/sprite/apps_white_2x/phpast.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/phrequent.png b/resources/sprite/apps_white_2x/phrequent.png deleted file mode 100644 index 6f83589ed0..0000000000 Binary files a/resources/sprite/apps_white_2x/phrequent.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/phriction.png b/resources/sprite/apps_white_2x/phriction.png deleted file mode 100644 index 64da93ff1a..0000000000 Binary files a/resources/sprite/apps_white_2x/phriction.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/policy.png b/resources/sprite/apps_white_2x/policy.png deleted file mode 100644 index d29d00e78a..0000000000 Binary files a/resources/sprite/apps_white_2x/policy.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/ponder.png b/resources/sprite/apps_white_2x/ponder.png deleted file mode 100644 index bc94dac216..0000000000 Binary files a/resources/sprite/apps_white_2x/ponder.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/power.png b/resources/sprite/apps_white_2x/power.png deleted file mode 100644 index 02d317a9eb..0000000000 Binary files a/resources/sprite/apps_white_2x/power.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/projects.png b/resources/sprite/apps_white_2x/projects.png deleted file mode 100644 index 85748f38df..0000000000 Binary files a/resources/sprite/apps_white_2x/projects.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/releeph.png b/resources/sprite/apps_white_2x/releeph.png deleted file mode 100644 index c2cc33d499..0000000000 Binary files a/resources/sprite/apps_white_2x/releeph.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/repositories.png b/resources/sprite/apps_white_2x/repositories.png deleted file mode 100644 index f159f13d3c..0000000000 Binary files a/resources/sprite/apps_white_2x/repositories.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/settings.png b/resources/sprite/apps_white_2x/settings.png deleted file mode 100644 index bab237c745..0000000000 Binary files a/resources/sprite/apps_white_2x/settings.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/setup.png b/resources/sprite/apps_white_2x/setup.png deleted file mode 100644 index 6695ce637e..0000000000 Binary files a/resources/sprite/apps_white_2x/setup.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/slowvote.png b/resources/sprite/apps_white_2x/slowvote.png deleted file mode 100644 index 5d164190f4..0000000000 Binary files a/resources/sprite/apps_white_2x/slowvote.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/token.png b/resources/sprite/apps_white_2x/token.png deleted file mode 100644 index 273f26d5e8..0000000000 Binary files a/resources/sprite/apps_white_2x/token.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/uiexamples.png b/resources/sprite/apps_white_2x/uiexamples.png deleted file mode 100644 index bc585eae43..0000000000 Binary files a/resources/sprite/apps_white_2x/uiexamples.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/workphlow.png b/resources/sprite/apps_white_2x/workphlow.png deleted file mode 100644 index 48b44bff7c..0000000000 Binary files a/resources/sprite/apps_white_2x/workphlow.png and /dev/null differ diff --git a/resources/sprite/apps_white_2x/xhprof.png b/resources/sprite/apps_white_2x/xhprof.png deleted file mode 100644 index a96219c7fc..0000000000 Binary files a/resources/sprite/apps_white_2x/xhprof.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/adventure.png b/resources/sprite/apps_white_4x/adventure.png deleted file mode 100644 index c399210832..0000000000 Binary files a/resources/sprite/apps_white_4x/adventure.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/application.png b/resources/sprite/apps_white_4x/application.png deleted file mode 100644 index 6dc23f4d13..0000000000 Binary files a/resources/sprite/apps_white_4x/application.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/audit.png b/resources/sprite/apps_white_4x/audit.png deleted file mode 100644 index 5cd50424f5..0000000000 Binary files a/resources/sprite/apps_white_4x/audit.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/authentication.png b/resources/sprite/apps_white_4x/authentication.png deleted file mode 100644 index 6f227dd2df..0000000000 Binary files a/resources/sprite/apps_white_4x/authentication.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/calendar.png b/resources/sprite/apps_white_4x/calendar.png deleted file mode 100644 index 1d6db0628f..0000000000 Binary files a/resources/sprite/apps_white_4x/calendar.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/chatlog.png b/resources/sprite/apps_white_4x/chatlog.png deleted file mode 100644 index 81e9b5d5a0..0000000000 Binary files a/resources/sprite/apps_white_4x/chatlog.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/conduit.png b/resources/sprite/apps_white_4x/conduit.png deleted file mode 100644 index 3858d97136..0000000000 Binary files a/resources/sprite/apps_white_4x/conduit.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/conpherence.png b/resources/sprite/apps_white_4x/conpherence.png deleted file mode 100644 index ecfbf55aa5..0000000000 Binary files a/resources/sprite/apps_white_4x/conpherence.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/countdown.png b/resources/sprite/apps_white_4x/countdown.png deleted file mode 100644 index d7835da7ee..0000000000 Binary files a/resources/sprite/apps_white_4x/countdown.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/daemon.png b/resources/sprite/apps_white_4x/daemon.png deleted file mode 100644 index 3fb2f1d7b4..0000000000 Binary files a/resources/sprite/apps_white_4x/daemon.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/differential.png b/resources/sprite/apps_white_4x/differential.png deleted file mode 100644 index e971517817..0000000000 Binary files a/resources/sprite/apps_white_4x/differential.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/diffusion.png b/resources/sprite/apps_white_4x/diffusion.png deleted file mode 100644 index 367c3cb559..0000000000 Binary files a/resources/sprite/apps_white_4x/diffusion.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/diviner.png b/resources/sprite/apps_white_4x/diviner.png deleted file mode 100644 index 2ab6568c85..0000000000 Binary files a/resources/sprite/apps_white_4x/diviner.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/drydock.png b/resources/sprite/apps_white_4x/drydock.png deleted file mode 100644 index 01fb49bac6..0000000000 Binary files a/resources/sprite/apps_white_4x/drydock.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/fact.png b/resources/sprite/apps_white_4x/fact.png deleted file mode 100644 index de483ce073..0000000000 Binary files a/resources/sprite/apps_white_4x/fact.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/feed.png b/resources/sprite/apps_white_4x/feed.png deleted file mode 100644 index c019123d3f..0000000000 Binary files a/resources/sprite/apps_white_4x/feed.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/files.png b/resources/sprite/apps_white_4x/files.png deleted file mode 100644 index 39d4779eb0..0000000000 Binary files a/resources/sprite/apps_white_4x/files.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/flags.png b/resources/sprite/apps_white_4x/flags.png deleted file mode 100644 index 2f8e996170..0000000000 Binary files a/resources/sprite/apps_white_4x/flags.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/harbormaster.png b/resources/sprite/apps_white_4x/harbormaster.png deleted file mode 100644 index d597b2fca5..0000000000 Binary files a/resources/sprite/apps_white_4x/harbormaster.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/help.png b/resources/sprite/apps_white_4x/help.png deleted file mode 100644 index bdbe04c2cd..0000000000 Binary files a/resources/sprite/apps_white_4x/help.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/herald.png b/resources/sprite/apps_white_4x/herald.png deleted file mode 100644 index 5620fd7d61..0000000000 Binary files a/resources/sprite/apps_white_4x/herald.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/home.png b/resources/sprite/apps_white_4x/home.png deleted file mode 100644 index 0f8fa6953f..0000000000 Binary files a/resources/sprite/apps_white_4x/home.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/legalpad.png b/resources/sprite/apps_white_4x/legalpad.png deleted file mode 100644 index cd05e6eb1f..0000000000 Binary files a/resources/sprite/apps_white_4x/legalpad.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/logo.png b/resources/sprite/apps_white_4x/logo.png deleted file mode 100644 index e8653a3155..0000000000 Binary files a/resources/sprite/apps_white_4x/logo.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/macro.png b/resources/sprite/apps_white_4x/macro.png deleted file mode 100644 index 61adea8adf..0000000000 Binary files a/resources/sprite/apps_white_4x/macro.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/mail.png b/resources/sprite/apps_white_4x/mail.png deleted file mode 100644 index d21852a446..0000000000 Binary files a/resources/sprite/apps_white_4x/mail.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/maniphest.png b/resources/sprite/apps_white_4x/maniphest.png deleted file mode 100644 index 6a3767175a..0000000000 Binary files a/resources/sprite/apps_white_4x/maniphest.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/metamta.png b/resources/sprite/apps_white_4x/metamta.png deleted file mode 100644 index 15bbd27dfb..0000000000 Binary files a/resources/sprite/apps_white_4x/metamta.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/new.png b/resources/sprite/apps_white_4x/new.png deleted file mode 100644 index 13567e2517..0000000000 Binary files a/resources/sprite/apps_white_4x/new.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/owners.png b/resources/sprite/apps_white_4x/owners.png deleted file mode 100644 index b7bbe63a88..0000000000 Binary files a/resources/sprite/apps_white_4x/owners.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/paste.png b/resources/sprite/apps_white_4x/paste.png deleted file mode 100644 index 21d08c9db3..0000000000 Binary files a/resources/sprite/apps_white_4x/paste.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/people.png b/resources/sprite/apps_white_4x/people.png deleted file mode 100644 index 38a94e1130..0000000000 Binary files a/resources/sprite/apps_white_4x/people.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/phage.png b/resources/sprite/apps_white_4x/phage.png deleted file mode 100644 index 5c11d23ce1..0000000000 Binary files a/resources/sprite/apps_white_4x/phage.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/phame.png b/resources/sprite/apps_white_4x/phame.png deleted file mode 100644 index 507a04e94b..0000000000 Binary files a/resources/sprite/apps_white_4x/phame.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/phid.png b/resources/sprite/apps_white_4x/phid.png deleted file mode 100644 index 7e9a11d238..0000000000 Binary files a/resources/sprite/apps_white_4x/phid.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/phlux.png b/resources/sprite/apps_white_4x/phlux.png deleted file mode 100644 index 11ad7116c7..0000000000 Binary files a/resources/sprite/apps_white_4x/phlux.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/pholio.png b/resources/sprite/apps_white_4x/pholio.png deleted file mode 100644 index a7d4d6081e..0000000000 Binary files a/resources/sprite/apps_white_4x/pholio.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/phortune.png b/resources/sprite/apps_white_4x/phortune.png deleted file mode 100644 index 4b9c4472f5..0000000000 Binary files a/resources/sprite/apps_white_4x/phortune.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/phpast.png b/resources/sprite/apps_white_4x/phpast.png deleted file mode 100644 index 81e0b6257c..0000000000 Binary files a/resources/sprite/apps_white_4x/phpast.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/phrequent.png b/resources/sprite/apps_white_4x/phrequent.png deleted file mode 100644 index 2ffd70b162..0000000000 Binary files a/resources/sprite/apps_white_4x/phrequent.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/phriction.png b/resources/sprite/apps_white_4x/phriction.png deleted file mode 100644 index fc2095fe74..0000000000 Binary files a/resources/sprite/apps_white_4x/phriction.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/policy.png b/resources/sprite/apps_white_4x/policy.png deleted file mode 100644 index 80b4dae1d6..0000000000 Binary files a/resources/sprite/apps_white_4x/policy.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/ponder.png b/resources/sprite/apps_white_4x/ponder.png deleted file mode 100644 index 7bdb29c9b6..0000000000 Binary files a/resources/sprite/apps_white_4x/ponder.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/power.png b/resources/sprite/apps_white_4x/power.png deleted file mode 100644 index f48b880e66..0000000000 Binary files a/resources/sprite/apps_white_4x/power.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/projects.png b/resources/sprite/apps_white_4x/projects.png deleted file mode 100644 index e295d5fa6d..0000000000 Binary files a/resources/sprite/apps_white_4x/projects.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/releeph.png b/resources/sprite/apps_white_4x/releeph.png deleted file mode 100644 index 52b7cc9434..0000000000 Binary files a/resources/sprite/apps_white_4x/releeph.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/repositories.png b/resources/sprite/apps_white_4x/repositories.png deleted file mode 100644 index 0a1b9bcf17..0000000000 Binary files a/resources/sprite/apps_white_4x/repositories.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/settings.png b/resources/sprite/apps_white_4x/settings.png deleted file mode 100644 index 7a2c551a51..0000000000 Binary files a/resources/sprite/apps_white_4x/settings.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/setup.png b/resources/sprite/apps_white_4x/setup.png deleted file mode 100644 index 6c59fd643d..0000000000 Binary files a/resources/sprite/apps_white_4x/setup.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/slowvote.png b/resources/sprite/apps_white_4x/slowvote.png deleted file mode 100644 index cead92bbf0..0000000000 Binary files a/resources/sprite/apps_white_4x/slowvote.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/token.png b/resources/sprite/apps_white_4x/token.png deleted file mode 100644 index a7f8d85642..0000000000 Binary files a/resources/sprite/apps_white_4x/token.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/uiexamples.png b/resources/sprite/apps_white_4x/uiexamples.png deleted file mode 100644 index 7c8fb0cf3a..0000000000 Binary files a/resources/sprite/apps_white_4x/uiexamples.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/workphlow.png b/resources/sprite/apps_white_4x/workphlow.png deleted file mode 100644 index 5d5f8f6423..0000000000 Binary files a/resources/sprite/apps_white_4x/workphlow.png and /dev/null differ diff --git a/resources/sprite/apps_white_4x/xhprof.png b/resources/sprite/apps_white_4x/xhprof.png deleted file mode 100644 index 304a8f7021..0000000000 Binary files a/resources/sprite/apps_white_4x/xhprof.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/calendar_off.png b/resources/sprite/conpherence_1x/calendar_off.png deleted file mode 100644 index d4bbae5dfe..0000000000 Binary files a/resources/sprite/conpherence_1x/calendar_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/calendar_on.png b/resources/sprite/conpherence_1x/calendar_on.png deleted file mode 100644 index 9759fc0546..0000000000 Binary files a/resources/sprite/conpherence_1x/calendar_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/conversation_off.png b/resources/sprite/conpherence_1x/conversation_off.png deleted file mode 100644 index 2a0310bca2..0000000000 Binary files a/resources/sprite/conpherence_1x/conversation_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/conversation_on.png b/resources/sprite/conpherence_1x/conversation_on.png deleted file mode 100644 index 11e8437a0a..0000000000 Binary files a/resources/sprite/conpherence_1x/conversation_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/files_off.png b/resources/sprite/conpherence_1x/files_off.png deleted file mode 100644 index 0eb7e3996d..0000000000 Binary files a/resources/sprite/conpherence_1x/files_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/files_on.png b/resources/sprite/conpherence_1x/files_on.png deleted file mode 100644 index 5699ec5f00..0000000000 Binary files a/resources/sprite/conpherence_1x/files_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/list_off.png b/resources/sprite/conpherence_1x/list_off.png deleted file mode 100644 index 5f64e19b74..0000000000 Binary files a/resources/sprite/conpherence_1x/list_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/list_on.png b/resources/sprite/conpherence_1x/list_on.png deleted file mode 100644 index 5f104f217d..0000000000 Binary files a/resources/sprite/conpherence_1x/list_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/more_off.png b/resources/sprite/conpherence_1x/more_off.png deleted file mode 100644 index bd65726e00..0000000000 Binary files a/resources/sprite/conpherence_1x/more_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/more_on.png b/resources/sprite/conpherence_1x/more_on.png deleted file mode 100644 index d6c1c6b12a..0000000000 Binary files a/resources/sprite/conpherence_1x/more_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/people_off.png b/resources/sprite/conpherence_1x/people_off.png deleted file mode 100644 index 372f5ecd05..0000000000 Binary files a/resources/sprite/conpherence_1x/people_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/people_on.png b/resources/sprite/conpherence_1x/people_on.png deleted file mode 100644 index 87fd885951..0000000000 Binary files a/resources/sprite/conpherence_1x/people_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/settings_off.png b/resources/sprite/conpherence_1x/settings_off.png deleted file mode 100644 index d75b0f1fb7..0000000000 Binary files a/resources/sprite/conpherence_1x/settings_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_1x/settings_on.png b/resources/sprite/conpherence_1x/settings_on.png deleted file mode 100644 index f90ca7820d..0000000000 Binary files a/resources/sprite/conpherence_1x/settings_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/calendar_off.png b/resources/sprite/conpherence_2x/calendar_off.png deleted file mode 100644 index b807c6457e..0000000000 Binary files a/resources/sprite/conpherence_2x/calendar_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/calendar_on.png b/resources/sprite/conpherence_2x/calendar_on.png deleted file mode 100644 index b60e94dc02..0000000000 Binary files a/resources/sprite/conpherence_2x/calendar_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/conversation_off.png b/resources/sprite/conpherence_2x/conversation_off.png deleted file mode 100644 index 5c50e5ccfd..0000000000 Binary files a/resources/sprite/conpherence_2x/conversation_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/conversation_on.png b/resources/sprite/conpherence_2x/conversation_on.png deleted file mode 100644 index 8d1bf1435d..0000000000 Binary files a/resources/sprite/conpherence_2x/conversation_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/files_off.png b/resources/sprite/conpherence_2x/files_off.png deleted file mode 100644 index b593b1437f..0000000000 Binary files a/resources/sprite/conpherence_2x/files_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/files_on.png b/resources/sprite/conpherence_2x/files_on.png deleted file mode 100644 index a31547d8d9..0000000000 Binary files a/resources/sprite/conpherence_2x/files_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/list_off.png b/resources/sprite/conpherence_2x/list_off.png deleted file mode 100644 index a9add168df..0000000000 Binary files a/resources/sprite/conpherence_2x/list_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/list_on.png b/resources/sprite/conpherence_2x/list_on.png deleted file mode 100644 index 0214b6b0ca..0000000000 Binary files a/resources/sprite/conpherence_2x/list_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/more_off.png b/resources/sprite/conpherence_2x/more_off.png deleted file mode 100644 index ce90ebc722..0000000000 Binary files a/resources/sprite/conpherence_2x/more_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/more_on.png b/resources/sprite/conpherence_2x/more_on.png deleted file mode 100644 index 9b2b0f4321..0000000000 Binary files a/resources/sprite/conpherence_2x/more_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/people_off.png b/resources/sprite/conpherence_2x/people_off.png deleted file mode 100644 index ad51a2427d..0000000000 Binary files a/resources/sprite/conpherence_2x/people_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/people_on.png b/resources/sprite/conpherence_2x/people_on.png deleted file mode 100644 index ff42ad8f95..0000000000 Binary files a/resources/sprite/conpherence_2x/people_on.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/settings_off.png b/resources/sprite/conpherence_2x/settings_off.png deleted file mode 100644 index c25d7905ac..0000000000 Binary files a/resources/sprite/conpherence_2x/settings_off.png and /dev/null differ diff --git a/resources/sprite/conpherence_2x/settings_on.png b/resources/sprite/conpherence_2x/settings_on.png deleted file mode 100644 index 2aa6501876..0000000000 Binary files a/resources/sprite/conpherence_2x/settings_on.png and /dev/null differ diff --git a/resources/sprite/docs_1x/audio.png b/resources/sprite/docs_1x/audio.png deleted file mode 100644 index 2f06fc8951..0000000000 Binary files a/resources/sprite/docs_1x/audio.png and /dev/null differ diff --git a/resources/sprite/docs_1x/doc.png b/resources/sprite/docs_1x/doc.png deleted file mode 100644 index 568b80ddcc..0000000000 Binary files a/resources/sprite/docs_1x/doc.png and /dev/null differ diff --git a/resources/sprite/docs_1x/file.png b/resources/sprite/docs_1x/file.png deleted file mode 100644 index 5118a9589d..0000000000 Binary files a/resources/sprite/docs_1x/file.png and /dev/null differ diff --git a/resources/sprite/docs_1x/image.png b/resources/sprite/docs_1x/image.png deleted file mode 100644 index 0d1f404919..0000000000 Binary files a/resources/sprite/docs_1x/image.png and /dev/null differ diff --git a/resources/sprite/docs_1x/movie.png b/resources/sprite/docs_1x/movie.png deleted file mode 100644 index 0eb10e2e7d..0000000000 Binary files a/resources/sprite/docs_1x/movie.png and /dev/null differ diff --git a/resources/sprite/docs_1x/pdf.png b/resources/sprite/docs_1x/pdf.png deleted file mode 100644 index 514fb9c52b..0000000000 Binary files a/resources/sprite/docs_1x/pdf.png and /dev/null differ diff --git a/resources/sprite/docs_1x/place.png b/resources/sprite/docs_1x/place.png deleted file mode 100644 index f9e817fcda..0000000000 Binary files a/resources/sprite/docs_1x/place.png and /dev/null differ diff --git a/resources/sprite/docs_1x/zip.png b/resources/sprite/docs_1x/zip.png deleted file mode 100644 index fc288bb6b0..0000000000 Binary files a/resources/sprite/docs_1x/zip.png and /dev/null differ diff --git a/resources/sprite/docs_2x/audio.png b/resources/sprite/docs_2x/audio.png deleted file mode 100644 index e5ad1e20fe..0000000000 Binary files a/resources/sprite/docs_2x/audio.png and /dev/null differ diff --git a/resources/sprite/docs_2x/doc.png b/resources/sprite/docs_2x/doc.png deleted file mode 100644 index 7f87a9a679..0000000000 Binary files a/resources/sprite/docs_2x/doc.png and /dev/null differ diff --git a/resources/sprite/docs_2x/file.png b/resources/sprite/docs_2x/file.png deleted file mode 100644 index 6323e9ff78..0000000000 Binary files a/resources/sprite/docs_2x/file.png and /dev/null differ diff --git a/resources/sprite/docs_2x/image.png b/resources/sprite/docs_2x/image.png deleted file mode 100644 index 9af85529fb..0000000000 Binary files a/resources/sprite/docs_2x/image.png and /dev/null differ diff --git a/resources/sprite/docs_2x/movie.png b/resources/sprite/docs_2x/movie.png deleted file mode 100644 index 216ea40fe6..0000000000 Binary files a/resources/sprite/docs_2x/movie.png and /dev/null differ diff --git a/resources/sprite/docs_2x/pdf.png b/resources/sprite/docs_2x/pdf.png deleted file mode 100644 index 10cb451831..0000000000 Binary files a/resources/sprite/docs_2x/pdf.png and /dev/null differ diff --git a/resources/sprite/docs_2x/place.png b/resources/sprite/docs_2x/place.png deleted file mode 100644 index d1791d5061..0000000000 Binary files a/resources/sprite/docs_2x/place.png and /dev/null differ diff --git a/resources/sprite/docs_2x/zip.png b/resources/sprite/docs_2x/zip.png deleted file mode 100644 index d969383650..0000000000 Binary files a/resources/sprite/docs_2x/zip.png and /dev/null differ diff --git a/resources/sprite/gradients/blue-header.png b/resources/sprite/gradients/blue-header.png deleted file mode 100644 index fb4d5986b7..0000000000 Binary files a/resources/sprite/gradients/blue-header.png and /dev/null differ diff --git a/resources/sprite/gradients/breadcrumbs.png b/resources/sprite/gradients/breadcrumbs.png deleted file mode 100644 index ea39b776ab..0000000000 Binary files a/resources/sprite/gradients/breadcrumbs.png and /dev/null differ diff --git a/resources/sprite/gradients/dark-grey-header.png b/resources/sprite/gradients/dark-grey-header.png deleted file mode 100644 index 4a169a5054..0000000000 Binary files a/resources/sprite/gradients/dark-grey-header.png and /dev/null differ diff --git a/resources/sprite/gradients/dark-menu-label.png b/resources/sprite/gradients/dark-menu-label.png deleted file mode 100644 index 30f94c868a..0000000000 Binary files a/resources/sprite/gradients/dark-menu-label.png and /dev/null differ diff --git a/resources/sprite/gradients/green-header.png b/resources/sprite/gradients/green-header.png deleted file mode 100644 index c3b568ea49..0000000000 Binary files a/resources/sprite/gradients/green-header.png and /dev/null differ diff --git a/resources/sprite/gradients/grey-header.png b/resources/sprite/gradients/grey-header.png deleted file mode 100644 index e94e2dc468..0000000000 Binary files a/resources/sprite/gradients/grey-header.png and /dev/null differ diff --git a/resources/sprite/gradients/menu-label.png b/resources/sprite/gradients/menu-label.png deleted file mode 100644 index 263b7021ca..0000000000 Binary files a/resources/sprite/gradients/menu-label.png and /dev/null differ diff --git a/resources/sprite/gradients/red-header.png b/resources/sprite/gradients/red-header.png deleted file mode 100644 index 9516024aa5..0000000000 Binary files a/resources/sprite/gradients/red-header.png and /dev/null differ diff --git a/resources/sprite/gradients/yellow-header.png b/resources/sprite/gradients/yellow-header.png deleted file mode 100644 index 793dd159d7..0000000000 Binary files a/resources/sprite/gradients/yellow-header.png and /dev/null differ diff --git a/resources/sprite/icons_1x/action-menu.png b/resources/sprite/icons_1x/action-menu.png deleted file mode 100644 index 9186abe1fa..0000000000 Binary files a/resources/sprite/icons_1x/action-menu.png and /dev/null differ diff --git a/resources/sprite/icons_1x/arrow_left.png b/resources/sprite/icons_1x/arrow_left.png deleted file mode 100644 index 47685a2e39..0000000000 Binary files a/resources/sprite/icons_1x/arrow_left.png and /dev/null differ diff --git a/resources/sprite/icons_1x/arrow_right.png b/resources/sprite/icons_1x/arrow_right.png deleted file mode 100644 index a95b694a85..0000000000 Binary files a/resources/sprite/icons_1x/arrow_right.png and /dev/null differ diff --git a/resources/sprite/icons_1x/attach.png b/resources/sprite/icons_1x/attach.png deleted file mode 100644 index 0f3b8e671c..0000000000 Binary files a/resources/sprite/icons_1x/attach.png and /dev/null differ diff --git a/resources/sprite/icons_1x/blame.png b/resources/sprite/icons_1x/blame.png deleted file mode 100644 index ddeacfd64b..0000000000 Binary files a/resources/sprite/icons_1x/blame.png and /dev/null differ diff --git a/resources/sprite/icons_1x/check.png b/resources/sprite/icons_1x/check.png deleted file mode 100644 index 2f1cf85d94..0000000000 Binary files a/resources/sprite/icons_1x/check.png and /dev/null differ diff --git a/resources/sprite/icons_1x/comment.png b/resources/sprite/icons_1x/comment.png deleted file mode 100644 index c56a353ea6..0000000000 Binary files a/resources/sprite/icons_1x/comment.png and /dev/null differ diff --git a/resources/sprite/icons_1x/computer.png b/resources/sprite/icons_1x/computer.png deleted file mode 100644 index e90b406929..0000000000 Binary files a/resources/sprite/icons_1x/computer.png and /dev/null differ diff --git a/resources/sprite/icons_1x/create.png b/resources/sprite/icons_1x/create.png deleted file mode 100644 index b696e5921d..0000000000 Binary files a/resources/sprite/icons_1x/create.png and /dev/null differ diff --git a/resources/sprite/icons_1x/delete.png b/resources/sprite/icons_1x/delete.png deleted file mode 100644 index 499d7fe576..0000000000 Binary files a/resources/sprite/icons_1x/delete.png and /dev/null differ diff --git a/resources/sprite/icons_1x/disable.png b/resources/sprite/icons_1x/disable.png deleted file mode 100644 index 6a3ca19829..0000000000 Binary files a/resources/sprite/icons_1x/disable.png and /dev/null differ diff --git a/resources/sprite/icons_1x/dislike.png b/resources/sprite/icons_1x/dislike.png deleted file mode 100644 index d97bb99a13..0000000000 Binary files a/resources/sprite/icons_1x/dislike.png and /dev/null differ diff --git a/resources/sprite/icons_1x/download-alt.png b/resources/sprite/icons_1x/download-alt.png deleted file mode 100644 index da919a28ee..0000000000 Binary files a/resources/sprite/icons_1x/download-alt.png and /dev/null differ diff --git a/resources/sprite/icons_1x/download.png b/resources/sprite/icons_1x/download.png deleted file mode 100644 index 32adeb3a92..0000000000 Binary files a/resources/sprite/icons_1x/download.png and /dev/null differ diff --git a/resources/sprite/icons_1x/edit.png b/resources/sprite/icons_1x/edit.png deleted file mode 100644 index bfedfd2ac5..0000000000 Binary files a/resources/sprite/icons_1x/edit.png and /dev/null differ diff --git a/resources/sprite/icons_1x/enable.png b/resources/sprite/icons_1x/enable.png deleted file mode 100644 index 0878ab69fb..0000000000 Binary files a/resources/sprite/icons_1x/enable.png and /dev/null differ diff --git a/resources/sprite/icons_1x/file.png b/resources/sprite/icons_1x/file.png deleted file mode 100644 index 82de99a5bb..0000000000 Binary files a/resources/sprite/icons_1x/file.png and /dev/null differ diff --git a/resources/sprite/icons_1x/flag-0.png b/resources/sprite/icons_1x/flag-0.png deleted file mode 100644 index f9b6519a10..0000000000 Binary files a/resources/sprite/icons_1x/flag-0.png and /dev/null differ diff --git a/resources/sprite/icons_1x/flag-1.png b/resources/sprite/icons_1x/flag-1.png deleted file mode 100644 index 4fe2f30f89..0000000000 Binary files a/resources/sprite/icons_1x/flag-1.png and /dev/null differ diff --git a/resources/sprite/icons_1x/flag-2.png b/resources/sprite/icons_1x/flag-2.png deleted file mode 100644 index e81586bae7..0000000000 Binary files a/resources/sprite/icons_1x/flag-2.png and /dev/null differ diff --git a/resources/sprite/icons_1x/flag-3.png b/resources/sprite/icons_1x/flag-3.png deleted file mode 100644 index 8a637dd689..0000000000 Binary files a/resources/sprite/icons_1x/flag-3.png and /dev/null differ diff --git a/resources/sprite/icons_1x/flag-4.png b/resources/sprite/icons_1x/flag-4.png deleted file mode 100644 index 69d9e47f61..0000000000 Binary files a/resources/sprite/icons_1x/flag-4.png and /dev/null differ diff --git a/resources/sprite/icons_1x/flag-5.png b/resources/sprite/icons_1x/flag-5.png deleted file mode 100644 index 340e020c17..0000000000 Binary files a/resources/sprite/icons_1x/flag-5.png and /dev/null differ diff --git a/resources/sprite/icons_1x/flag-6.png b/resources/sprite/icons_1x/flag-6.png deleted file mode 100644 index 1be868b428..0000000000 Binary files a/resources/sprite/icons_1x/flag-6.png and /dev/null differ diff --git a/resources/sprite/icons_1x/flag-7.png b/resources/sprite/icons_1x/flag-7.png deleted file mode 100644 index df2deaab40..0000000000 Binary files a/resources/sprite/icons_1x/flag-7.png and /dev/null differ diff --git a/resources/sprite/icons_1x/flag-ghost.png b/resources/sprite/icons_1x/flag-ghost.png deleted file mode 100644 index e9e5f8600a..0000000000 Binary files a/resources/sprite/icons_1x/flag-ghost.png and /dev/null differ diff --git a/resources/sprite/icons_1x/flag.png b/resources/sprite/icons_1x/flag.png deleted file mode 100644 index d87948955b..0000000000 Binary files a/resources/sprite/icons_1x/flag.png and /dev/null differ diff --git a/resources/sprite/icons_1x/folder-open.png b/resources/sprite/icons_1x/folder-open.png deleted file mode 100644 index bc4f2195a3..0000000000 Binary files a/resources/sprite/icons_1x/folder-open.png and /dev/null differ diff --git a/resources/sprite/icons_1x/fork.png b/resources/sprite/icons_1x/fork.png deleted file mode 100644 index 09a1c9f2cf..0000000000 Binary files a/resources/sprite/icons_1x/fork.png and /dev/null differ diff --git a/resources/sprite/icons_1x/herald.png b/resources/sprite/icons_1x/herald.png deleted file mode 100644 index 90085dbe1e..0000000000 Binary files a/resources/sprite/icons_1x/herald.png and /dev/null differ diff --git a/resources/sprite/icons_1x/highlight.png b/resources/sprite/icons_1x/highlight.png deleted file mode 100644 index 34daf77573..0000000000 Binary files a/resources/sprite/icons_1x/highlight.png and /dev/null differ diff --git a/resources/sprite/icons_1x/history.png b/resources/sprite/icons_1x/history.png deleted file mode 100644 index bad0400568..0000000000 Binary files a/resources/sprite/icons_1x/history.png and /dev/null differ diff --git a/resources/sprite/icons_1x/home.png b/resources/sprite/icons_1x/home.png deleted file mode 100644 index 3eb844aa89..0000000000 Binary files a/resources/sprite/icons_1x/home.png and /dev/null differ diff --git a/resources/sprite/icons_1x/image.png b/resources/sprite/icons_1x/image.png deleted file mode 100644 index df966b428c..0000000000 Binary files a/resources/sprite/icons_1x/image.png and /dev/null differ diff --git a/resources/sprite/icons_1x/like.png b/resources/sprite/icons_1x/like.png deleted file mode 100644 index 978e86ff7c..0000000000 Binary files a/resources/sprite/icons_1x/like.png and /dev/null differ diff --git a/resources/sprite/icons_1x/link.png b/resources/sprite/icons_1x/link.png deleted file mode 100644 index 7291bc5102..0000000000 Binary files a/resources/sprite/icons_1x/link.png and /dev/null differ diff --git a/resources/sprite/icons_1x/lint-info.png b/resources/sprite/icons_1x/lint-info.png deleted file mode 100644 index 997fc74d47..0000000000 Binary files a/resources/sprite/icons_1x/lint-info.png and /dev/null differ diff --git a/resources/sprite/icons_1x/lint-ok.png b/resources/sprite/icons_1x/lint-ok.png deleted file mode 100644 index ac20e09c0f..0000000000 Binary files a/resources/sprite/icons_1x/lint-ok.png and /dev/null differ diff --git a/resources/sprite/icons_1x/lint-warning.png b/resources/sprite/icons_1x/lint-warning.png deleted file mode 100644 index ddeacfd64b..0000000000 Binary files a/resources/sprite/icons_1x/lint-warning.png and /dev/null differ diff --git a/resources/sprite/icons_1x/lock.png b/resources/sprite/icons_1x/lock.png deleted file mode 100644 index 14d88fc3f4..0000000000 Binary files a/resources/sprite/icons_1x/lock.png and /dev/null differ diff --git a/resources/sprite/icons_1x/love.png b/resources/sprite/icons_1x/love.png deleted file mode 100644 index f2e3f6ec81..0000000000 Binary files a/resources/sprite/icons_1x/love.png and /dev/null differ diff --git a/resources/sprite/icons_1x/merge.png b/resources/sprite/icons_1x/merge.png deleted file mode 100644 index 543632eff7..0000000000 Binary files a/resources/sprite/icons_1x/merge.png and /dev/null differ diff --git a/resources/sprite/icons_1x/message.png b/resources/sprite/icons_1x/message.png deleted file mode 100644 index be92f14d8d..0000000000 Binary files a/resources/sprite/icons_1x/message.png and /dev/null differ diff --git a/resources/sprite/icons_1x/meta-mta.png b/resources/sprite/icons_1x/meta-mta.png deleted file mode 100644 index d33de28b5f..0000000000 Binary files a/resources/sprite/icons_1x/meta-mta.png and /dev/null differ diff --git a/resources/sprite/icons_1x/move.png b/resources/sprite/icons_1x/move.png deleted file mode 100644 index 5989dd4f90..0000000000 Binary files a/resources/sprite/icons_1x/move.png and /dev/null differ diff --git a/resources/sprite/icons_1x/new.png b/resources/sprite/icons_1x/new.png deleted file mode 100644 index fd71681090..0000000000 Binary files a/resources/sprite/icons_1x/new.png and /dev/null differ diff --git a/resources/sprite/icons_1x/none.png b/resources/sprite/icons_1x/none.png deleted file mode 100644 index 0fa8c6a7d5..0000000000 Binary files a/resources/sprite/icons_1x/none.png and /dev/null differ diff --git a/resources/sprite/icons_1x/perflab.png b/resources/sprite/icons_1x/perflab.png deleted file mode 100644 index ac2282ec81..0000000000 Binary files a/resources/sprite/icons_1x/perflab.png and /dev/null differ diff --git a/resources/sprite/icons_1x/preview.png b/resources/sprite/icons_1x/preview.png deleted file mode 100644 index ae82c1ac11..0000000000 Binary files a/resources/sprite/icons_1x/preview.png and /dev/null differ diff --git a/resources/sprite/icons_1x/refresh.png b/resources/sprite/icons_1x/refresh.png deleted file mode 100644 index 4a6c92677a..0000000000 Binary files a/resources/sprite/icons_1x/refresh.png and /dev/null differ diff --git a/resources/sprite/icons_1x/remove.png b/resources/sprite/icons_1x/remove.png deleted file mode 100644 index e51c08b956..0000000000 Binary files a/resources/sprite/icons_1x/remove.png and /dev/null differ diff --git a/resources/sprite/icons_1x/search.png b/resources/sprite/icons_1x/search.png deleted file mode 100644 index cc77254ac1..0000000000 Binary files a/resources/sprite/icons_1x/search.png and /dev/null differ diff --git a/resources/sprite/icons_1x/start-sandcastle.png b/resources/sprite/icons_1x/start-sandcastle.png deleted file mode 100644 index 46ad38363e..0000000000 Binary files a/resources/sprite/icons_1x/start-sandcastle.png and /dev/null differ diff --git a/resources/sprite/icons_1x/tag.png b/resources/sprite/icons_1x/tag.png deleted file mode 100644 index 33792941f5..0000000000 Binary files a/resources/sprite/icons_1x/tag.png and /dev/null differ diff --git a/resources/sprite/icons_1x/transcript.png b/resources/sprite/icons_1x/transcript.png deleted file mode 100644 index 6bbb308943..0000000000 Binary files a/resources/sprite/icons_1x/transcript.png and /dev/null differ diff --git a/resources/sprite/icons_1x/undo.png b/resources/sprite/icons_1x/undo.png deleted file mode 100644 index 6d4bf685cd..0000000000 Binary files a/resources/sprite/icons_1x/undo.png and /dev/null differ diff --git a/resources/sprite/icons_1x/unlock.png b/resources/sprite/icons_1x/unlock.png deleted file mode 100644 index bd8de3808b..0000000000 Binary files a/resources/sprite/icons_1x/unlock.png and /dev/null differ diff --git a/resources/sprite/icons_1x/unmerge.png b/resources/sprite/icons_1x/unmerge.png deleted file mode 100644 index 16c77fe8f0..0000000000 Binary files a/resources/sprite/icons_1x/unmerge.png and /dev/null differ diff --git a/resources/sprite/icons_1x/unpublish.png b/resources/sprite/icons_1x/unpublish.png deleted file mode 100644 index a0a4757caa..0000000000 Binary files a/resources/sprite/icons_1x/unpublish.png and /dev/null differ diff --git a/resources/sprite/icons_1x/upload.png b/resources/sprite/icons_1x/upload.png deleted file mode 100644 index a63e52d039..0000000000 Binary files a/resources/sprite/icons_1x/upload.png and /dev/null differ diff --git a/resources/sprite/icons_1x/warning.png b/resources/sprite/icons_1x/warning.png deleted file mode 100644 index 64f9972c9c..0000000000 Binary files a/resources/sprite/icons_1x/warning.png and /dev/null differ diff --git a/resources/sprite/icons_1x/world.png b/resources/sprite/icons_1x/world.png deleted file mode 100644 index 7bdb5fd5c1..0000000000 Binary files a/resources/sprite/icons_1x/world.png and /dev/null differ diff --git a/resources/sprite/icons_2x/action-menu.png b/resources/sprite/icons_2x/action-menu.png deleted file mode 100644 index 4b79c4ea76..0000000000 Binary files a/resources/sprite/icons_2x/action-menu.png and /dev/null differ diff --git a/resources/sprite/icons_2x/arrow_left.png b/resources/sprite/icons_2x/arrow_left.png deleted file mode 100644 index e9fe2d8e70..0000000000 Binary files a/resources/sprite/icons_2x/arrow_left.png and /dev/null differ diff --git a/resources/sprite/icons_2x/arrow_right.png b/resources/sprite/icons_2x/arrow_right.png deleted file mode 100644 index f22ff1ccfb..0000000000 Binary files a/resources/sprite/icons_2x/arrow_right.png and /dev/null differ diff --git a/resources/sprite/icons_2x/attach.png b/resources/sprite/icons_2x/attach.png deleted file mode 100644 index fb0e7b1003..0000000000 Binary files a/resources/sprite/icons_2x/attach.png and /dev/null differ diff --git a/resources/sprite/icons_2x/blame.png b/resources/sprite/icons_2x/blame.png deleted file mode 100644 index 4b1eb3dee8..0000000000 Binary files a/resources/sprite/icons_2x/blame.png and /dev/null differ diff --git a/resources/sprite/icons_2x/check.png b/resources/sprite/icons_2x/check.png deleted file mode 100644 index 9d8752f444..0000000000 Binary files a/resources/sprite/icons_2x/check.png and /dev/null differ diff --git a/resources/sprite/icons_2x/comment.png b/resources/sprite/icons_2x/comment.png deleted file mode 100644 index 2ed90b538d..0000000000 Binary files a/resources/sprite/icons_2x/comment.png and /dev/null differ diff --git a/resources/sprite/icons_2x/computer.png b/resources/sprite/icons_2x/computer.png deleted file mode 100644 index 9e2d91dae2..0000000000 Binary files a/resources/sprite/icons_2x/computer.png and /dev/null differ diff --git a/resources/sprite/icons_2x/create.png b/resources/sprite/icons_2x/create.png deleted file mode 100644 index d25b869234..0000000000 Binary files a/resources/sprite/icons_2x/create.png and /dev/null differ diff --git a/resources/sprite/icons_2x/delete.png b/resources/sprite/icons_2x/delete.png deleted file mode 100644 index 8b1080b170..0000000000 Binary files a/resources/sprite/icons_2x/delete.png and /dev/null differ diff --git a/resources/sprite/icons_2x/disable.png b/resources/sprite/icons_2x/disable.png deleted file mode 100644 index ffc1956e54..0000000000 Binary files a/resources/sprite/icons_2x/disable.png and /dev/null differ diff --git a/resources/sprite/icons_2x/dislike.png b/resources/sprite/icons_2x/dislike.png deleted file mode 100644 index 8a7360c85d..0000000000 Binary files a/resources/sprite/icons_2x/dislike.png and /dev/null differ diff --git a/resources/sprite/icons_2x/download-alt.png b/resources/sprite/icons_2x/download-alt.png deleted file mode 100644 index 0f62916670..0000000000 Binary files a/resources/sprite/icons_2x/download-alt.png and /dev/null differ diff --git a/resources/sprite/icons_2x/download.png b/resources/sprite/icons_2x/download.png deleted file mode 100644 index 87411035d6..0000000000 Binary files a/resources/sprite/icons_2x/download.png and /dev/null differ diff --git a/resources/sprite/icons_2x/edit.png b/resources/sprite/icons_2x/edit.png deleted file mode 100644 index 8aa9e8d637..0000000000 Binary files a/resources/sprite/icons_2x/edit.png and /dev/null differ diff --git a/resources/sprite/icons_2x/enable.png b/resources/sprite/icons_2x/enable.png deleted file mode 100644 index ed20aa7838..0000000000 Binary files a/resources/sprite/icons_2x/enable.png and /dev/null differ diff --git a/resources/sprite/icons_2x/file.png b/resources/sprite/icons_2x/file.png deleted file mode 100644 index 62dbde4a2e..0000000000 Binary files a/resources/sprite/icons_2x/file.png and /dev/null differ diff --git a/resources/sprite/icons_2x/flag-0.png b/resources/sprite/icons_2x/flag-0.png deleted file mode 100644 index a53896e6e9..0000000000 Binary files a/resources/sprite/icons_2x/flag-0.png and /dev/null differ diff --git a/resources/sprite/icons_2x/flag-1.png b/resources/sprite/icons_2x/flag-1.png deleted file mode 100644 index 3fc9b34483..0000000000 Binary files a/resources/sprite/icons_2x/flag-1.png and /dev/null differ diff --git a/resources/sprite/icons_2x/flag-2.png b/resources/sprite/icons_2x/flag-2.png deleted file mode 100644 index cc5e25b186..0000000000 Binary files a/resources/sprite/icons_2x/flag-2.png and /dev/null differ diff --git a/resources/sprite/icons_2x/flag-3.png b/resources/sprite/icons_2x/flag-3.png deleted file mode 100644 index f9ff214a1e..0000000000 Binary files a/resources/sprite/icons_2x/flag-3.png and /dev/null differ diff --git a/resources/sprite/icons_2x/flag-4.png b/resources/sprite/icons_2x/flag-4.png deleted file mode 100644 index fd96fcfa7f..0000000000 Binary files a/resources/sprite/icons_2x/flag-4.png and /dev/null differ diff --git a/resources/sprite/icons_2x/flag-5.png b/resources/sprite/icons_2x/flag-5.png deleted file mode 100644 index c5d5d08d0e..0000000000 Binary files a/resources/sprite/icons_2x/flag-5.png and /dev/null differ diff --git a/resources/sprite/icons_2x/flag-6.png b/resources/sprite/icons_2x/flag-6.png deleted file mode 100644 index e515334c12..0000000000 Binary files a/resources/sprite/icons_2x/flag-6.png and /dev/null differ diff --git a/resources/sprite/icons_2x/flag-7.png b/resources/sprite/icons_2x/flag-7.png deleted file mode 100644 index 1681ed9981..0000000000 Binary files a/resources/sprite/icons_2x/flag-7.png and /dev/null differ diff --git a/resources/sprite/icons_2x/flag-ghost.png b/resources/sprite/icons_2x/flag-ghost.png deleted file mode 100644 index f500a970e3..0000000000 Binary files a/resources/sprite/icons_2x/flag-ghost.png and /dev/null differ diff --git a/resources/sprite/icons_2x/flag.png b/resources/sprite/icons_2x/flag.png deleted file mode 100644 index 864947030f..0000000000 Binary files a/resources/sprite/icons_2x/flag.png and /dev/null differ diff --git a/resources/sprite/icons_2x/folder-open.png b/resources/sprite/icons_2x/folder-open.png deleted file mode 100644 index 48da9c487e..0000000000 Binary files a/resources/sprite/icons_2x/folder-open.png and /dev/null differ diff --git a/resources/sprite/icons_2x/fork.png b/resources/sprite/icons_2x/fork.png deleted file mode 100644 index 9399c7e91c..0000000000 Binary files a/resources/sprite/icons_2x/fork.png and /dev/null differ diff --git a/resources/sprite/icons_2x/herald.png b/resources/sprite/icons_2x/herald.png deleted file mode 100644 index 1052839de3..0000000000 Binary files a/resources/sprite/icons_2x/herald.png and /dev/null differ diff --git a/resources/sprite/icons_2x/highlight.png b/resources/sprite/icons_2x/highlight.png deleted file mode 100644 index cbb70435b8..0000000000 Binary files a/resources/sprite/icons_2x/highlight.png and /dev/null differ diff --git a/resources/sprite/icons_2x/history.png b/resources/sprite/icons_2x/history.png deleted file mode 100644 index 994574a7e8..0000000000 Binary files a/resources/sprite/icons_2x/history.png and /dev/null differ diff --git a/resources/sprite/icons_2x/home.png b/resources/sprite/icons_2x/home.png deleted file mode 100644 index 02568a8cef..0000000000 Binary files a/resources/sprite/icons_2x/home.png and /dev/null differ diff --git a/resources/sprite/icons_2x/image.png b/resources/sprite/icons_2x/image.png deleted file mode 100644 index e6a3b88b2b..0000000000 Binary files a/resources/sprite/icons_2x/image.png and /dev/null differ diff --git a/resources/sprite/icons_2x/like.png b/resources/sprite/icons_2x/like.png deleted file mode 100644 index 6b23dc7052..0000000000 Binary files a/resources/sprite/icons_2x/like.png and /dev/null differ diff --git a/resources/sprite/icons_2x/link.png b/resources/sprite/icons_2x/link.png deleted file mode 100644 index 5c461741be..0000000000 Binary files a/resources/sprite/icons_2x/link.png and /dev/null differ diff --git a/resources/sprite/icons_2x/lint-info.png b/resources/sprite/icons_2x/lint-info.png deleted file mode 100644 index ab82a1951a..0000000000 Binary files a/resources/sprite/icons_2x/lint-info.png and /dev/null differ diff --git a/resources/sprite/icons_2x/lint-ok.png b/resources/sprite/icons_2x/lint-ok.png deleted file mode 100644 index 587d9af04d..0000000000 Binary files a/resources/sprite/icons_2x/lint-ok.png and /dev/null differ diff --git a/resources/sprite/icons_2x/lint-warning.png b/resources/sprite/icons_2x/lint-warning.png deleted file mode 100644 index 4b1eb3dee8..0000000000 Binary files a/resources/sprite/icons_2x/lint-warning.png and /dev/null differ diff --git a/resources/sprite/icons_2x/lock.png b/resources/sprite/icons_2x/lock.png deleted file mode 100644 index fb7a728d2c..0000000000 Binary files a/resources/sprite/icons_2x/lock.png and /dev/null differ diff --git a/resources/sprite/icons_2x/love.png b/resources/sprite/icons_2x/love.png deleted file mode 100644 index a8e00e017e..0000000000 Binary files a/resources/sprite/icons_2x/love.png and /dev/null differ diff --git a/resources/sprite/icons_2x/merge.png b/resources/sprite/icons_2x/merge.png deleted file mode 100644 index 97455a7fea..0000000000 Binary files a/resources/sprite/icons_2x/merge.png and /dev/null differ diff --git a/resources/sprite/icons_2x/message.png b/resources/sprite/icons_2x/message.png deleted file mode 100644 index 6fda2449b0..0000000000 Binary files a/resources/sprite/icons_2x/message.png and /dev/null differ diff --git a/resources/sprite/icons_2x/meta-mta.png b/resources/sprite/icons_2x/meta-mta.png deleted file mode 100644 index 25401d3d4e..0000000000 Binary files a/resources/sprite/icons_2x/meta-mta.png and /dev/null differ diff --git a/resources/sprite/icons_2x/move.png b/resources/sprite/icons_2x/move.png deleted file mode 100644 index d71860064d..0000000000 Binary files a/resources/sprite/icons_2x/move.png and /dev/null differ diff --git a/resources/sprite/icons_2x/new.png b/resources/sprite/icons_2x/new.png deleted file mode 100644 index 981ff1a109..0000000000 Binary files a/resources/sprite/icons_2x/new.png and /dev/null differ diff --git a/resources/sprite/icons_2x/none.png b/resources/sprite/icons_2x/none.png deleted file mode 100644 index 2d4d6168cf..0000000000 Binary files a/resources/sprite/icons_2x/none.png and /dev/null differ diff --git a/resources/sprite/icons_2x/perflab.png b/resources/sprite/icons_2x/perflab.png deleted file mode 100644 index d794e682e4..0000000000 Binary files a/resources/sprite/icons_2x/perflab.png and /dev/null differ diff --git a/resources/sprite/icons_2x/preview.png b/resources/sprite/icons_2x/preview.png deleted file mode 100644 index 586b96bc67..0000000000 Binary files a/resources/sprite/icons_2x/preview.png and /dev/null differ diff --git a/resources/sprite/icons_2x/refresh.png b/resources/sprite/icons_2x/refresh.png deleted file mode 100644 index 2a59067f2c..0000000000 Binary files a/resources/sprite/icons_2x/refresh.png and /dev/null differ diff --git a/resources/sprite/icons_2x/remove.png b/resources/sprite/icons_2x/remove.png deleted file mode 100644 index 7c3b3848b8..0000000000 Binary files a/resources/sprite/icons_2x/remove.png and /dev/null differ diff --git a/resources/sprite/icons_2x/search.png b/resources/sprite/icons_2x/search.png deleted file mode 100644 index 04d5bd60c7..0000000000 Binary files a/resources/sprite/icons_2x/search.png and /dev/null differ diff --git a/resources/sprite/icons_2x/start-sandcastle.png b/resources/sprite/icons_2x/start-sandcastle.png deleted file mode 100644 index 2da12818ad..0000000000 Binary files a/resources/sprite/icons_2x/start-sandcastle.png and /dev/null differ diff --git a/resources/sprite/icons_2x/tag.png b/resources/sprite/icons_2x/tag.png deleted file mode 100644 index 004d22302b..0000000000 Binary files a/resources/sprite/icons_2x/tag.png and /dev/null differ diff --git a/resources/sprite/icons_2x/transcript.png b/resources/sprite/icons_2x/transcript.png deleted file mode 100644 index a1eb254fbd..0000000000 Binary files a/resources/sprite/icons_2x/transcript.png and /dev/null differ diff --git a/resources/sprite/icons_2x/undo.png b/resources/sprite/icons_2x/undo.png deleted file mode 100644 index c65728a094..0000000000 Binary files a/resources/sprite/icons_2x/undo.png and /dev/null differ diff --git a/resources/sprite/icons_2x/unlock.png b/resources/sprite/icons_2x/unlock.png deleted file mode 100644 index ec8a1b5b9b..0000000000 Binary files a/resources/sprite/icons_2x/unlock.png and /dev/null differ diff --git a/resources/sprite/icons_2x/unmerge.png b/resources/sprite/icons_2x/unmerge.png deleted file mode 100644 index cdf0cf6bca..0000000000 Binary files a/resources/sprite/icons_2x/unmerge.png and /dev/null differ diff --git a/resources/sprite/icons_2x/unpublish.png b/resources/sprite/icons_2x/unpublish.png deleted file mode 100644 index 697635e29c..0000000000 Binary files a/resources/sprite/icons_2x/unpublish.png and /dev/null differ diff --git a/resources/sprite/icons_2x/upload.png b/resources/sprite/icons_2x/upload.png deleted file mode 100644 index 8df26ea1c0..0000000000 Binary files a/resources/sprite/icons_2x/upload.png and /dev/null differ diff --git a/resources/sprite/icons_2x/warning.png b/resources/sprite/icons_2x/warning.png deleted file mode 100644 index e8cecc3f7c..0000000000 Binary files a/resources/sprite/icons_2x/warning.png and /dev/null differ diff --git a/resources/sprite/icons_2x/world.png b/resources/sprite/icons_2x/world.png deleted file mode 100644 index d008a0c36d..0000000000 Binary files a/resources/sprite/icons_2x/world.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/action-menu.png b/resources/sprite/icons_grey_1x/action-menu.png deleted file mode 100644 index 626412a06c..0000000000 Binary files a/resources/sprite/icons_grey_1x/action-menu.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/arrow_left.png b/resources/sprite/icons_grey_1x/arrow_left.png deleted file mode 100644 index 96e37c7898..0000000000 Binary files a/resources/sprite/icons_grey_1x/arrow_left.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/arrow_right.png b/resources/sprite/icons_grey_1x/arrow_right.png deleted file mode 100644 index 6e674a08ca..0000000000 Binary files a/resources/sprite/icons_grey_1x/arrow_right.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/attach.png b/resources/sprite/icons_grey_1x/attach.png deleted file mode 100644 index b9d050731f..0000000000 Binary files a/resources/sprite/icons_grey_1x/attach.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/blame.png b/resources/sprite/icons_grey_1x/blame.png deleted file mode 100644 index 234c30debb..0000000000 Binary files a/resources/sprite/icons_grey_1x/blame.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/check.png b/resources/sprite/icons_grey_1x/check.png deleted file mode 100644 index cc864cc556..0000000000 Binary files a/resources/sprite/icons_grey_1x/check.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/comment.png b/resources/sprite/icons_grey_1x/comment.png deleted file mode 100644 index d9f126ca04..0000000000 Binary files a/resources/sprite/icons_grey_1x/comment.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/computer.png b/resources/sprite/icons_grey_1x/computer.png deleted file mode 100644 index 0913cf5d9b..0000000000 Binary files a/resources/sprite/icons_grey_1x/computer.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/create.png b/resources/sprite/icons_grey_1x/create.png deleted file mode 100644 index d13a2bc5df..0000000000 Binary files a/resources/sprite/icons_grey_1x/create.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/delete.png b/resources/sprite/icons_grey_1x/delete.png deleted file mode 100644 index 97044b0201..0000000000 Binary files a/resources/sprite/icons_grey_1x/delete.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/disable.png b/resources/sprite/icons_grey_1x/disable.png deleted file mode 100644 index 886b78d4ce..0000000000 Binary files a/resources/sprite/icons_grey_1x/disable.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/dislike.png b/resources/sprite/icons_grey_1x/dislike.png deleted file mode 100644 index feb73461ae..0000000000 Binary files a/resources/sprite/icons_grey_1x/dislike.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/download-alt.png b/resources/sprite/icons_grey_1x/download-alt.png deleted file mode 100644 index 926d0e06a9..0000000000 Binary files a/resources/sprite/icons_grey_1x/download-alt.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/download.png b/resources/sprite/icons_grey_1x/download.png deleted file mode 100644 index a2bfffd222..0000000000 Binary files a/resources/sprite/icons_grey_1x/download.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/edit.png b/resources/sprite/icons_grey_1x/edit.png deleted file mode 100644 index af38adb15e..0000000000 Binary files a/resources/sprite/icons_grey_1x/edit.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/enable.png b/resources/sprite/icons_grey_1x/enable.png deleted file mode 100644 index a7f98168b8..0000000000 Binary files a/resources/sprite/icons_grey_1x/enable.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/file.png b/resources/sprite/icons_grey_1x/file.png deleted file mode 100644 index eb06e00f10..0000000000 Binary files a/resources/sprite/icons_grey_1x/file.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/flag-0.png b/resources/sprite/icons_grey_1x/flag-0.png deleted file mode 100644 index 86e71b885c..0000000000 Binary files a/resources/sprite/icons_grey_1x/flag-0.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/flag-1.png b/resources/sprite/icons_grey_1x/flag-1.png deleted file mode 100644 index 86e71b885c..0000000000 Binary files a/resources/sprite/icons_grey_1x/flag-1.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/flag-2.png b/resources/sprite/icons_grey_1x/flag-2.png deleted file mode 100644 index 86e71b885c..0000000000 Binary files a/resources/sprite/icons_grey_1x/flag-2.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/flag-3.png b/resources/sprite/icons_grey_1x/flag-3.png deleted file mode 100644 index 86e71b885c..0000000000 Binary files a/resources/sprite/icons_grey_1x/flag-3.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/flag-4.png b/resources/sprite/icons_grey_1x/flag-4.png deleted file mode 100644 index 86e71b885c..0000000000 Binary files a/resources/sprite/icons_grey_1x/flag-4.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/flag-5.png b/resources/sprite/icons_grey_1x/flag-5.png deleted file mode 100644 index 86e71b885c..0000000000 Binary files a/resources/sprite/icons_grey_1x/flag-5.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/flag-6.png b/resources/sprite/icons_grey_1x/flag-6.png deleted file mode 100644 index 86e71b885c..0000000000 Binary files a/resources/sprite/icons_grey_1x/flag-6.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/flag-7.png b/resources/sprite/icons_grey_1x/flag-7.png deleted file mode 100644 index c6176639c5..0000000000 Binary files a/resources/sprite/icons_grey_1x/flag-7.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/flag-ghost.png b/resources/sprite/icons_grey_1x/flag-ghost.png deleted file mode 100644 index 86e71b885c..0000000000 Binary files a/resources/sprite/icons_grey_1x/flag-ghost.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/flag.png b/resources/sprite/icons_grey_1x/flag.png deleted file mode 100644 index 232e7a7062..0000000000 Binary files a/resources/sprite/icons_grey_1x/flag.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/folder-open.png b/resources/sprite/icons_grey_1x/folder-open.png deleted file mode 100644 index ce7fe7f9f6..0000000000 Binary files a/resources/sprite/icons_grey_1x/folder-open.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/fork.png b/resources/sprite/icons_grey_1x/fork.png deleted file mode 100644 index e6e86a55e4..0000000000 Binary files a/resources/sprite/icons_grey_1x/fork.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/herald.png b/resources/sprite/icons_grey_1x/herald.png deleted file mode 100644 index bc15160c0d..0000000000 Binary files a/resources/sprite/icons_grey_1x/herald.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/highlight.png b/resources/sprite/icons_grey_1x/highlight.png deleted file mode 100644 index 86b0a05d08..0000000000 Binary files a/resources/sprite/icons_grey_1x/highlight.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/history.png b/resources/sprite/icons_grey_1x/history.png deleted file mode 100644 index 5c0c3e08d5..0000000000 Binary files a/resources/sprite/icons_grey_1x/history.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/home.png b/resources/sprite/icons_grey_1x/home.png deleted file mode 100644 index 1a36392bd6..0000000000 Binary files a/resources/sprite/icons_grey_1x/home.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/image.png b/resources/sprite/icons_grey_1x/image.png deleted file mode 100644 index 6946ff19a5..0000000000 Binary files a/resources/sprite/icons_grey_1x/image.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/like.png b/resources/sprite/icons_grey_1x/like.png deleted file mode 100644 index cd7438d9c6..0000000000 Binary files a/resources/sprite/icons_grey_1x/like.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/link.png b/resources/sprite/icons_grey_1x/link.png deleted file mode 100644 index effc3072f2..0000000000 Binary files a/resources/sprite/icons_grey_1x/link.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/lint-info.png b/resources/sprite/icons_grey_1x/lint-info.png deleted file mode 100644 index 116852f4e8..0000000000 Binary files a/resources/sprite/icons_grey_1x/lint-info.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/lint-ok.png b/resources/sprite/icons_grey_1x/lint-ok.png deleted file mode 100644 index 8f2b43c024..0000000000 Binary files a/resources/sprite/icons_grey_1x/lint-ok.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/lint-warning.png b/resources/sprite/icons_grey_1x/lint-warning.png deleted file mode 100644 index 234c30debb..0000000000 Binary files a/resources/sprite/icons_grey_1x/lint-warning.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/lock.png b/resources/sprite/icons_grey_1x/lock.png deleted file mode 100644 index 28860c450e..0000000000 Binary files a/resources/sprite/icons_grey_1x/lock.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/love.png b/resources/sprite/icons_grey_1x/love.png deleted file mode 100644 index bc38799057..0000000000 Binary files a/resources/sprite/icons_grey_1x/love.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/merge.png b/resources/sprite/icons_grey_1x/merge.png deleted file mode 100644 index 76da2d8336..0000000000 Binary files a/resources/sprite/icons_grey_1x/merge.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/message.png b/resources/sprite/icons_grey_1x/message.png deleted file mode 100644 index b307895be5..0000000000 Binary files a/resources/sprite/icons_grey_1x/message.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/meta-mta.png b/resources/sprite/icons_grey_1x/meta-mta.png deleted file mode 100644 index 87647c5290..0000000000 Binary files a/resources/sprite/icons_grey_1x/meta-mta.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/move.png b/resources/sprite/icons_grey_1x/move.png deleted file mode 100644 index 120f3a1b35..0000000000 Binary files a/resources/sprite/icons_grey_1x/move.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/new.png b/resources/sprite/icons_grey_1x/new.png deleted file mode 100644 index 1fe8121802..0000000000 Binary files a/resources/sprite/icons_grey_1x/new.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/none.png b/resources/sprite/icons_grey_1x/none.png deleted file mode 100644 index 0fa8c6a7d5..0000000000 Binary files a/resources/sprite/icons_grey_1x/none.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/perflab.png b/resources/sprite/icons_grey_1x/perflab.png deleted file mode 100644 index 9f75cebab7..0000000000 Binary files a/resources/sprite/icons_grey_1x/perflab.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/preview.png b/resources/sprite/icons_grey_1x/preview.png deleted file mode 100644 index 8f69c71229..0000000000 Binary files a/resources/sprite/icons_grey_1x/preview.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/refresh.png b/resources/sprite/icons_grey_1x/refresh.png deleted file mode 100644 index 5fba23b3a3..0000000000 Binary files a/resources/sprite/icons_grey_1x/refresh.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/remove.png b/resources/sprite/icons_grey_1x/remove.png deleted file mode 100644 index 956290a3ca..0000000000 Binary files a/resources/sprite/icons_grey_1x/remove.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/search.png b/resources/sprite/icons_grey_1x/search.png deleted file mode 100644 index 180b14821b..0000000000 Binary files a/resources/sprite/icons_grey_1x/search.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/start-sandcastle.png b/resources/sprite/icons_grey_1x/start-sandcastle.png deleted file mode 100644 index 72b629b4db..0000000000 Binary files a/resources/sprite/icons_grey_1x/start-sandcastle.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/tag.png b/resources/sprite/icons_grey_1x/tag.png deleted file mode 100644 index 70034ab666..0000000000 Binary files a/resources/sprite/icons_grey_1x/tag.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/transcript.png b/resources/sprite/icons_grey_1x/transcript.png deleted file mode 100644 index be10399d83..0000000000 Binary files a/resources/sprite/icons_grey_1x/transcript.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/undo.png b/resources/sprite/icons_grey_1x/undo.png deleted file mode 100644 index 8e81f5f5db..0000000000 Binary files a/resources/sprite/icons_grey_1x/undo.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/unlock.png b/resources/sprite/icons_grey_1x/unlock.png deleted file mode 100644 index 780c6a594e..0000000000 Binary files a/resources/sprite/icons_grey_1x/unlock.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/unmerge.png b/resources/sprite/icons_grey_1x/unmerge.png deleted file mode 100644 index 655bc401bb..0000000000 Binary files a/resources/sprite/icons_grey_1x/unmerge.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/unpublish.png b/resources/sprite/icons_grey_1x/unpublish.png deleted file mode 100644 index ae6c1d0917..0000000000 Binary files a/resources/sprite/icons_grey_1x/unpublish.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/upload.png b/resources/sprite/icons_grey_1x/upload.png deleted file mode 100644 index 551ef16d2f..0000000000 Binary files a/resources/sprite/icons_grey_1x/upload.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/warning.png b/resources/sprite/icons_grey_1x/warning.png deleted file mode 100644 index 2e73a5ed2e..0000000000 Binary files a/resources/sprite/icons_grey_1x/warning.png and /dev/null differ diff --git a/resources/sprite/icons_grey_1x/world.png b/resources/sprite/icons_grey_1x/world.png deleted file mode 100644 index cda2f4c106..0000000000 Binary files a/resources/sprite/icons_grey_1x/world.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/action-menu.png b/resources/sprite/icons_grey_2x/action-menu.png deleted file mode 100644 index 6caead76e3..0000000000 Binary files a/resources/sprite/icons_grey_2x/action-menu.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/arrow_left.png b/resources/sprite/icons_grey_2x/arrow_left.png deleted file mode 100644 index ed8ac895ef..0000000000 Binary files a/resources/sprite/icons_grey_2x/arrow_left.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/arrow_right.png b/resources/sprite/icons_grey_2x/arrow_right.png deleted file mode 100644 index b80d53f0e0..0000000000 Binary files a/resources/sprite/icons_grey_2x/arrow_right.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/attach.png b/resources/sprite/icons_grey_2x/attach.png deleted file mode 100644 index 3d08d86eae..0000000000 Binary files a/resources/sprite/icons_grey_2x/attach.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/blame.png b/resources/sprite/icons_grey_2x/blame.png deleted file mode 100644 index 29819e9332..0000000000 Binary files a/resources/sprite/icons_grey_2x/blame.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/check.png b/resources/sprite/icons_grey_2x/check.png deleted file mode 100644 index 61ecca4662..0000000000 Binary files a/resources/sprite/icons_grey_2x/check.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/comment.png b/resources/sprite/icons_grey_2x/comment.png deleted file mode 100644 index f299018cb9..0000000000 Binary files a/resources/sprite/icons_grey_2x/comment.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/computer.png b/resources/sprite/icons_grey_2x/computer.png deleted file mode 100644 index 37295e0075..0000000000 Binary files a/resources/sprite/icons_grey_2x/computer.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/create.png b/resources/sprite/icons_grey_2x/create.png deleted file mode 100644 index e14c6007aa..0000000000 Binary files a/resources/sprite/icons_grey_2x/create.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/delete.png b/resources/sprite/icons_grey_2x/delete.png deleted file mode 100644 index be028254c9..0000000000 Binary files a/resources/sprite/icons_grey_2x/delete.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/disable.png b/resources/sprite/icons_grey_2x/disable.png deleted file mode 100644 index 6fb35c940a..0000000000 Binary files a/resources/sprite/icons_grey_2x/disable.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/dislike.png b/resources/sprite/icons_grey_2x/dislike.png deleted file mode 100644 index f69fdef9ae..0000000000 Binary files a/resources/sprite/icons_grey_2x/dislike.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/download-alt.png b/resources/sprite/icons_grey_2x/download-alt.png deleted file mode 100644 index 343b651b86..0000000000 Binary files a/resources/sprite/icons_grey_2x/download-alt.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/download.png b/resources/sprite/icons_grey_2x/download.png deleted file mode 100644 index b660abc89e..0000000000 Binary files a/resources/sprite/icons_grey_2x/download.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/edit.png b/resources/sprite/icons_grey_2x/edit.png deleted file mode 100644 index a7aa6985cd..0000000000 Binary files a/resources/sprite/icons_grey_2x/edit.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/enable.png b/resources/sprite/icons_grey_2x/enable.png deleted file mode 100644 index 9f03b1ce71..0000000000 Binary files a/resources/sprite/icons_grey_2x/enable.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/file.png b/resources/sprite/icons_grey_2x/file.png deleted file mode 100644 index 621fbb645c..0000000000 Binary files a/resources/sprite/icons_grey_2x/file.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/flag-0.png b/resources/sprite/icons_grey_2x/flag-0.png deleted file mode 100644 index 6961d3f69d..0000000000 Binary files a/resources/sprite/icons_grey_2x/flag-0.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/flag-1.png b/resources/sprite/icons_grey_2x/flag-1.png deleted file mode 100644 index 6961d3f69d..0000000000 Binary files a/resources/sprite/icons_grey_2x/flag-1.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/flag-2.png b/resources/sprite/icons_grey_2x/flag-2.png deleted file mode 100644 index 6961d3f69d..0000000000 Binary files a/resources/sprite/icons_grey_2x/flag-2.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/flag-3.png b/resources/sprite/icons_grey_2x/flag-3.png deleted file mode 100644 index 6961d3f69d..0000000000 Binary files a/resources/sprite/icons_grey_2x/flag-3.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/flag-4.png b/resources/sprite/icons_grey_2x/flag-4.png deleted file mode 100644 index 6961d3f69d..0000000000 Binary files a/resources/sprite/icons_grey_2x/flag-4.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/flag-5.png b/resources/sprite/icons_grey_2x/flag-5.png deleted file mode 100644 index 6961d3f69d..0000000000 Binary files a/resources/sprite/icons_grey_2x/flag-5.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/flag-6.png b/resources/sprite/icons_grey_2x/flag-6.png deleted file mode 100644 index 6961d3f69d..0000000000 Binary files a/resources/sprite/icons_grey_2x/flag-6.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/flag-7.png b/resources/sprite/icons_grey_2x/flag-7.png deleted file mode 100644 index add036d37e..0000000000 Binary files a/resources/sprite/icons_grey_2x/flag-7.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/flag-ghost.png b/resources/sprite/icons_grey_2x/flag-ghost.png deleted file mode 100644 index 6961d3f69d..0000000000 Binary files a/resources/sprite/icons_grey_2x/flag-ghost.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/flag.png b/resources/sprite/icons_grey_2x/flag.png deleted file mode 100644 index e880bf7377..0000000000 Binary files a/resources/sprite/icons_grey_2x/flag.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/folder-open.png b/resources/sprite/icons_grey_2x/folder-open.png deleted file mode 100644 index 0d18cba830..0000000000 Binary files a/resources/sprite/icons_grey_2x/folder-open.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/fork.png b/resources/sprite/icons_grey_2x/fork.png deleted file mode 100644 index 0dffb7a3f5..0000000000 Binary files a/resources/sprite/icons_grey_2x/fork.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/herald.png b/resources/sprite/icons_grey_2x/herald.png deleted file mode 100644 index 8e0b9bb652..0000000000 Binary files a/resources/sprite/icons_grey_2x/herald.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/highlight.png b/resources/sprite/icons_grey_2x/highlight.png deleted file mode 100644 index 04ac62476a..0000000000 Binary files a/resources/sprite/icons_grey_2x/highlight.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/history.png b/resources/sprite/icons_grey_2x/history.png deleted file mode 100644 index 754797da5d..0000000000 Binary files a/resources/sprite/icons_grey_2x/history.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/home.png b/resources/sprite/icons_grey_2x/home.png deleted file mode 100644 index e901292ab7..0000000000 Binary files a/resources/sprite/icons_grey_2x/home.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/image.png b/resources/sprite/icons_grey_2x/image.png deleted file mode 100644 index e306be8c1b..0000000000 Binary files a/resources/sprite/icons_grey_2x/image.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/like.png b/resources/sprite/icons_grey_2x/like.png deleted file mode 100644 index d89f58d658..0000000000 Binary files a/resources/sprite/icons_grey_2x/like.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/link.png b/resources/sprite/icons_grey_2x/link.png deleted file mode 100644 index f406abdf9c..0000000000 Binary files a/resources/sprite/icons_grey_2x/link.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/lint-info.png b/resources/sprite/icons_grey_2x/lint-info.png deleted file mode 100644 index 872b6af94f..0000000000 Binary files a/resources/sprite/icons_grey_2x/lint-info.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/lint-ok.png b/resources/sprite/icons_grey_2x/lint-ok.png deleted file mode 100644 index b69ffc4a39..0000000000 Binary files a/resources/sprite/icons_grey_2x/lint-ok.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/lint-warning.png b/resources/sprite/icons_grey_2x/lint-warning.png deleted file mode 100644 index 29819e9332..0000000000 Binary files a/resources/sprite/icons_grey_2x/lint-warning.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/lock.png b/resources/sprite/icons_grey_2x/lock.png deleted file mode 100644 index f029589126..0000000000 Binary files a/resources/sprite/icons_grey_2x/lock.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/love.png b/resources/sprite/icons_grey_2x/love.png deleted file mode 100644 index fcb26af1f2..0000000000 Binary files a/resources/sprite/icons_grey_2x/love.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/merge.png b/resources/sprite/icons_grey_2x/merge.png deleted file mode 100644 index 188bf933df..0000000000 Binary files a/resources/sprite/icons_grey_2x/merge.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/message.png b/resources/sprite/icons_grey_2x/message.png deleted file mode 100644 index 6d149df027..0000000000 Binary files a/resources/sprite/icons_grey_2x/message.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/meta-mta.png b/resources/sprite/icons_grey_2x/meta-mta.png deleted file mode 100644 index cbb00c1b38..0000000000 Binary files a/resources/sprite/icons_grey_2x/meta-mta.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/move.png b/resources/sprite/icons_grey_2x/move.png deleted file mode 100644 index b7fbfd686e..0000000000 Binary files a/resources/sprite/icons_grey_2x/move.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/new.png b/resources/sprite/icons_grey_2x/new.png deleted file mode 100644 index 603b4b5dc9..0000000000 Binary files a/resources/sprite/icons_grey_2x/new.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/none.png b/resources/sprite/icons_grey_2x/none.png deleted file mode 100644 index 2d4d6168cf..0000000000 Binary files a/resources/sprite/icons_grey_2x/none.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/perflab.png b/resources/sprite/icons_grey_2x/perflab.png deleted file mode 100644 index ca95a52edf..0000000000 Binary files a/resources/sprite/icons_grey_2x/perflab.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/preview.png b/resources/sprite/icons_grey_2x/preview.png deleted file mode 100644 index 35c1415d32..0000000000 Binary files a/resources/sprite/icons_grey_2x/preview.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/refresh.png b/resources/sprite/icons_grey_2x/refresh.png deleted file mode 100644 index 529fec4698..0000000000 Binary files a/resources/sprite/icons_grey_2x/refresh.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/remove.png b/resources/sprite/icons_grey_2x/remove.png deleted file mode 100644 index 0d7b2a5e14..0000000000 Binary files a/resources/sprite/icons_grey_2x/remove.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/search.png b/resources/sprite/icons_grey_2x/search.png deleted file mode 100644 index cabe89df30..0000000000 Binary files a/resources/sprite/icons_grey_2x/search.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/start-sandcastle.png b/resources/sprite/icons_grey_2x/start-sandcastle.png deleted file mode 100644 index c848619872..0000000000 Binary files a/resources/sprite/icons_grey_2x/start-sandcastle.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/tag.png b/resources/sprite/icons_grey_2x/tag.png deleted file mode 100644 index 5efe9282ce..0000000000 Binary files a/resources/sprite/icons_grey_2x/tag.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/transcript.png b/resources/sprite/icons_grey_2x/transcript.png deleted file mode 100644 index 823f7b541f..0000000000 Binary files a/resources/sprite/icons_grey_2x/transcript.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/undo.png b/resources/sprite/icons_grey_2x/undo.png deleted file mode 100644 index 7c9970f24a..0000000000 Binary files a/resources/sprite/icons_grey_2x/undo.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/unlock.png b/resources/sprite/icons_grey_2x/unlock.png deleted file mode 100644 index de6dcf7877..0000000000 Binary files a/resources/sprite/icons_grey_2x/unlock.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/unmerge.png b/resources/sprite/icons_grey_2x/unmerge.png deleted file mode 100644 index 5f499be7b0..0000000000 Binary files a/resources/sprite/icons_grey_2x/unmerge.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/unpublish.png b/resources/sprite/icons_grey_2x/unpublish.png deleted file mode 100644 index fbd59b71d7..0000000000 Binary files a/resources/sprite/icons_grey_2x/unpublish.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/upload.png b/resources/sprite/icons_grey_2x/upload.png deleted file mode 100644 index 8750fd1c47..0000000000 Binary files a/resources/sprite/icons_grey_2x/upload.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/warning.png b/resources/sprite/icons_grey_2x/warning.png deleted file mode 100644 index d68c30ac12..0000000000 Binary files a/resources/sprite/icons_grey_2x/warning.png and /dev/null differ diff --git a/resources/sprite/icons_grey_2x/world.png b/resources/sprite/icons_grey_2x/world.png deleted file mode 100644 index 9f68585d2b..0000000000 Binary files a/resources/sprite/icons_grey_2x/world.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/action-menu.png b/resources/sprite/icons_white_1x/action-menu.png deleted file mode 100644 index 69baa7a6e6..0000000000 Binary files a/resources/sprite/icons_white_1x/action-menu.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/arrow_left.png b/resources/sprite/icons_white_1x/arrow_left.png deleted file mode 100644 index 148389bdd4..0000000000 Binary files a/resources/sprite/icons_white_1x/arrow_left.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/arrow_right.png b/resources/sprite/icons_white_1x/arrow_right.png deleted file mode 100644 index cee60e3ef0..0000000000 Binary files a/resources/sprite/icons_white_1x/arrow_right.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/attach.png b/resources/sprite/icons_white_1x/attach.png deleted file mode 100644 index 03caf6a463..0000000000 Binary files a/resources/sprite/icons_white_1x/attach.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/blame.png b/resources/sprite/icons_white_1x/blame.png deleted file mode 100644 index d9e077be1e..0000000000 Binary files a/resources/sprite/icons_white_1x/blame.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/check.png b/resources/sprite/icons_white_1x/check.png deleted file mode 100644 index 4293d0a172..0000000000 Binary files a/resources/sprite/icons_white_1x/check.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/comment.png b/resources/sprite/icons_white_1x/comment.png deleted file mode 100644 index b1689d4aa7..0000000000 Binary files a/resources/sprite/icons_white_1x/comment.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/computer.png b/resources/sprite/icons_white_1x/computer.png deleted file mode 100644 index 27065c89d1..0000000000 Binary files a/resources/sprite/icons_white_1x/computer.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/create.png b/resources/sprite/icons_white_1x/create.png deleted file mode 100644 index 34d97c4269..0000000000 Binary files a/resources/sprite/icons_white_1x/create.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/delete.png b/resources/sprite/icons_white_1x/delete.png deleted file mode 100644 index 85b68b4349..0000000000 Binary files a/resources/sprite/icons_white_1x/delete.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/disable.png b/resources/sprite/icons_white_1x/disable.png deleted file mode 100644 index ced3ed1163..0000000000 Binary files a/resources/sprite/icons_white_1x/disable.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/dislike.png b/resources/sprite/icons_white_1x/dislike.png deleted file mode 100644 index f15b34b8d1..0000000000 Binary files a/resources/sprite/icons_white_1x/dislike.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/download-alt.png b/resources/sprite/icons_white_1x/download-alt.png deleted file mode 100644 index 9d4aa4975d..0000000000 Binary files a/resources/sprite/icons_white_1x/download-alt.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/download.png b/resources/sprite/icons_white_1x/download.png deleted file mode 100644 index 5a5cb45395..0000000000 Binary files a/resources/sprite/icons_white_1x/download.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/edit.png b/resources/sprite/icons_white_1x/edit.png deleted file mode 100644 index d8192681c7..0000000000 Binary files a/resources/sprite/icons_white_1x/edit.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/enable.png b/resources/sprite/icons_white_1x/enable.png deleted file mode 100644 index ef1eef523a..0000000000 Binary files a/resources/sprite/icons_white_1x/enable.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/file.png b/resources/sprite/icons_white_1x/file.png deleted file mode 100644 index cc7739dbd9..0000000000 Binary files a/resources/sprite/icons_white_1x/file.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/flag-0.png b/resources/sprite/icons_white_1x/flag-0.png deleted file mode 100644 index bd5fc33187..0000000000 Binary files a/resources/sprite/icons_white_1x/flag-0.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/flag-1.png b/resources/sprite/icons_white_1x/flag-1.png deleted file mode 100644 index bd5fc33187..0000000000 Binary files a/resources/sprite/icons_white_1x/flag-1.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/flag-2.png b/resources/sprite/icons_white_1x/flag-2.png deleted file mode 100644 index bd5fc33187..0000000000 Binary files a/resources/sprite/icons_white_1x/flag-2.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/flag-3.png b/resources/sprite/icons_white_1x/flag-3.png deleted file mode 100644 index bd5fc33187..0000000000 Binary files a/resources/sprite/icons_white_1x/flag-3.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/flag-4.png b/resources/sprite/icons_white_1x/flag-4.png deleted file mode 100644 index bd5fc33187..0000000000 Binary files a/resources/sprite/icons_white_1x/flag-4.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/flag-5.png b/resources/sprite/icons_white_1x/flag-5.png deleted file mode 100644 index bd5fc33187..0000000000 Binary files a/resources/sprite/icons_white_1x/flag-5.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/flag-6.png b/resources/sprite/icons_white_1x/flag-6.png deleted file mode 100644 index bd5fc33187..0000000000 Binary files a/resources/sprite/icons_white_1x/flag-6.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/flag-7.png b/resources/sprite/icons_white_1x/flag-7.png deleted file mode 100644 index 60cc092b8e..0000000000 Binary files a/resources/sprite/icons_white_1x/flag-7.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/flag-ghost.png b/resources/sprite/icons_white_1x/flag-ghost.png deleted file mode 100644 index bd5fc33187..0000000000 Binary files a/resources/sprite/icons_white_1x/flag-ghost.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/flag.png b/resources/sprite/icons_white_1x/flag.png deleted file mode 100644 index 8066586c7c..0000000000 Binary files a/resources/sprite/icons_white_1x/flag.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/folder-open.png b/resources/sprite/icons_white_1x/folder-open.png deleted file mode 100644 index 1e44e09800..0000000000 Binary files a/resources/sprite/icons_white_1x/folder-open.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/fork.png b/resources/sprite/icons_white_1x/fork.png deleted file mode 100644 index a99fb13760..0000000000 Binary files a/resources/sprite/icons_white_1x/fork.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/herald.png b/resources/sprite/icons_white_1x/herald.png deleted file mode 100644 index 568ebb1aba..0000000000 Binary files a/resources/sprite/icons_white_1x/herald.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/highlight.png b/resources/sprite/icons_white_1x/highlight.png deleted file mode 100644 index 21f6cda971..0000000000 Binary files a/resources/sprite/icons_white_1x/highlight.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/history.png b/resources/sprite/icons_white_1x/history.png deleted file mode 100644 index 9f6cf2c9d3..0000000000 Binary files a/resources/sprite/icons_white_1x/history.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/home.png b/resources/sprite/icons_white_1x/home.png deleted file mode 100644 index ce77e6614e..0000000000 Binary files a/resources/sprite/icons_white_1x/home.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/image.png b/resources/sprite/icons_white_1x/image.png deleted file mode 100644 index 1c21bf7a84..0000000000 Binary files a/resources/sprite/icons_white_1x/image.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/like.png b/resources/sprite/icons_white_1x/like.png deleted file mode 100644 index 891417cbfb..0000000000 Binary files a/resources/sprite/icons_white_1x/like.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/link.png b/resources/sprite/icons_white_1x/link.png deleted file mode 100644 index 0c7c7eb15e..0000000000 Binary files a/resources/sprite/icons_white_1x/link.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/lint-info.png b/resources/sprite/icons_white_1x/lint-info.png deleted file mode 100644 index 7f66261cf6..0000000000 Binary files a/resources/sprite/icons_white_1x/lint-info.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/lint-ok.png b/resources/sprite/icons_white_1x/lint-ok.png deleted file mode 100644 index 7e00d3772d..0000000000 Binary files a/resources/sprite/icons_white_1x/lint-ok.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/lint-warning.png b/resources/sprite/icons_white_1x/lint-warning.png deleted file mode 100644 index d9e077be1e..0000000000 Binary files a/resources/sprite/icons_white_1x/lint-warning.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/lock.png b/resources/sprite/icons_white_1x/lock.png deleted file mode 100644 index 2578f8540c..0000000000 Binary files a/resources/sprite/icons_white_1x/lock.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/love.png b/resources/sprite/icons_white_1x/love.png deleted file mode 100644 index 5599111eb7..0000000000 Binary files a/resources/sprite/icons_white_1x/love.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/merge.png b/resources/sprite/icons_white_1x/merge.png deleted file mode 100644 index e2b8387c26..0000000000 Binary files a/resources/sprite/icons_white_1x/merge.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/message.png b/resources/sprite/icons_white_1x/message.png deleted file mode 100644 index 88408a89f2..0000000000 Binary files a/resources/sprite/icons_white_1x/message.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/meta-mta.png b/resources/sprite/icons_white_1x/meta-mta.png deleted file mode 100644 index 9bd1b223c5..0000000000 Binary files a/resources/sprite/icons_white_1x/meta-mta.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/move.png b/resources/sprite/icons_white_1x/move.png deleted file mode 100644 index 33f402c522..0000000000 Binary files a/resources/sprite/icons_white_1x/move.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/new.png b/resources/sprite/icons_white_1x/new.png deleted file mode 100644 index c22475f869..0000000000 Binary files a/resources/sprite/icons_white_1x/new.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/none.png b/resources/sprite/icons_white_1x/none.png deleted file mode 100644 index 0fa8c6a7d5..0000000000 Binary files a/resources/sprite/icons_white_1x/none.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/perflab.png b/resources/sprite/icons_white_1x/perflab.png deleted file mode 100644 index 31b41cffea..0000000000 Binary files a/resources/sprite/icons_white_1x/perflab.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/preview.png b/resources/sprite/icons_white_1x/preview.png deleted file mode 100644 index 66eec6bd04..0000000000 Binary files a/resources/sprite/icons_white_1x/preview.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/refresh.png b/resources/sprite/icons_white_1x/refresh.png deleted file mode 100644 index 1dfb6df456..0000000000 Binary files a/resources/sprite/icons_white_1x/refresh.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/remove.png b/resources/sprite/icons_white_1x/remove.png deleted file mode 100644 index 3a3ff3f8d5..0000000000 Binary files a/resources/sprite/icons_white_1x/remove.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/search.png b/resources/sprite/icons_white_1x/search.png deleted file mode 100644 index 20cf58c4c4..0000000000 Binary files a/resources/sprite/icons_white_1x/search.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/start-sandcastle.png b/resources/sprite/icons_white_1x/start-sandcastle.png deleted file mode 100644 index 7b840ff3db..0000000000 Binary files a/resources/sprite/icons_white_1x/start-sandcastle.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/tag.png b/resources/sprite/icons_white_1x/tag.png deleted file mode 100644 index 5d4a819230..0000000000 Binary files a/resources/sprite/icons_white_1x/tag.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/transcript.png b/resources/sprite/icons_white_1x/transcript.png deleted file mode 100644 index 704e69896a..0000000000 Binary files a/resources/sprite/icons_white_1x/transcript.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/undo.png b/resources/sprite/icons_white_1x/undo.png deleted file mode 100644 index 45ad1abaa1..0000000000 Binary files a/resources/sprite/icons_white_1x/undo.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/unlock.png b/resources/sprite/icons_white_1x/unlock.png deleted file mode 100644 index e811cef4b3..0000000000 Binary files a/resources/sprite/icons_white_1x/unlock.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/unmerge.png b/resources/sprite/icons_white_1x/unmerge.png deleted file mode 100644 index 21df32938b..0000000000 Binary files a/resources/sprite/icons_white_1x/unmerge.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/unpublish.png b/resources/sprite/icons_white_1x/unpublish.png deleted file mode 100644 index 0ead19fcae..0000000000 Binary files a/resources/sprite/icons_white_1x/unpublish.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/upload.png b/resources/sprite/icons_white_1x/upload.png deleted file mode 100644 index 75e1e2588b..0000000000 Binary files a/resources/sprite/icons_white_1x/upload.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/warning.png b/resources/sprite/icons_white_1x/warning.png deleted file mode 100644 index fb1e24f792..0000000000 Binary files a/resources/sprite/icons_white_1x/warning.png and /dev/null differ diff --git a/resources/sprite/icons_white_1x/world.png b/resources/sprite/icons_white_1x/world.png deleted file mode 100644 index 551589c330..0000000000 Binary files a/resources/sprite/icons_white_1x/world.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/action-menu.png b/resources/sprite/icons_white_2x/action-menu.png deleted file mode 100644 index 5e76129539..0000000000 Binary files a/resources/sprite/icons_white_2x/action-menu.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/arrow_left.png b/resources/sprite/icons_white_2x/arrow_left.png deleted file mode 100644 index a0feee7497..0000000000 Binary files a/resources/sprite/icons_white_2x/arrow_left.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/arrow_right.png b/resources/sprite/icons_white_2x/arrow_right.png deleted file mode 100644 index e17e414351..0000000000 Binary files a/resources/sprite/icons_white_2x/arrow_right.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/attach.png b/resources/sprite/icons_white_2x/attach.png deleted file mode 100644 index 5b1629085c..0000000000 Binary files a/resources/sprite/icons_white_2x/attach.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/blame.png b/resources/sprite/icons_white_2x/blame.png deleted file mode 100644 index 52814bc4af..0000000000 Binary files a/resources/sprite/icons_white_2x/blame.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/check.png b/resources/sprite/icons_white_2x/check.png deleted file mode 100644 index 181652490c..0000000000 Binary files a/resources/sprite/icons_white_2x/check.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/comment.png b/resources/sprite/icons_white_2x/comment.png deleted file mode 100644 index b33917c048..0000000000 Binary files a/resources/sprite/icons_white_2x/comment.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/computer.png b/resources/sprite/icons_white_2x/computer.png deleted file mode 100644 index 113234174a..0000000000 Binary files a/resources/sprite/icons_white_2x/computer.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/create.png b/resources/sprite/icons_white_2x/create.png deleted file mode 100644 index c89c918109..0000000000 Binary files a/resources/sprite/icons_white_2x/create.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/delete.png b/resources/sprite/icons_white_2x/delete.png deleted file mode 100644 index 51dfed7abf..0000000000 Binary files a/resources/sprite/icons_white_2x/delete.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/disable.png b/resources/sprite/icons_white_2x/disable.png deleted file mode 100644 index c885b26a4f..0000000000 Binary files a/resources/sprite/icons_white_2x/disable.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/dislike.png b/resources/sprite/icons_white_2x/dislike.png deleted file mode 100644 index 5e78b3da50..0000000000 Binary files a/resources/sprite/icons_white_2x/dislike.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/download-alt.png b/resources/sprite/icons_white_2x/download-alt.png deleted file mode 100644 index 53ae28a07d..0000000000 Binary files a/resources/sprite/icons_white_2x/download-alt.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/download.png b/resources/sprite/icons_white_2x/download.png deleted file mode 100644 index 9638bab537..0000000000 Binary files a/resources/sprite/icons_white_2x/download.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/edit.png b/resources/sprite/icons_white_2x/edit.png deleted file mode 100644 index 0320cd5cd6..0000000000 Binary files a/resources/sprite/icons_white_2x/edit.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/enable.png b/resources/sprite/icons_white_2x/enable.png deleted file mode 100644 index 8f91017610..0000000000 Binary files a/resources/sprite/icons_white_2x/enable.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/file.png b/resources/sprite/icons_white_2x/file.png deleted file mode 100644 index a3c898e262..0000000000 Binary files a/resources/sprite/icons_white_2x/file.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/flag-0.png b/resources/sprite/icons_white_2x/flag-0.png deleted file mode 100644 index 159368acbe..0000000000 Binary files a/resources/sprite/icons_white_2x/flag-0.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/flag-1.png b/resources/sprite/icons_white_2x/flag-1.png deleted file mode 100644 index 159368acbe..0000000000 Binary files a/resources/sprite/icons_white_2x/flag-1.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/flag-2.png b/resources/sprite/icons_white_2x/flag-2.png deleted file mode 100644 index 159368acbe..0000000000 Binary files a/resources/sprite/icons_white_2x/flag-2.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/flag-3.png b/resources/sprite/icons_white_2x/flag-3.png deleted file mode 100644 index 159368acbe..0000000000 Binary files a/resources/sprite/icons_white_2x/flag-3.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/flag-4.png b/resources/sprite/icons_white_2x/flag-4.png deleted file mode 100644 index 159368acbe..0000000000 Binary files a/resources/sprite/icons_white_2x/flag-4.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/flag-5.png b/resources/sprite/icons_white_2x/flag-5.png deleted file mode 100644 index 159368acbe..0000000000 Binary files a/resources/sprite/icons_white_2x/flag-5.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/flag-6.png b/resources/sprite/icons_white_2x/flag-6.png deleted file mode 100644 index 159368acbe..0000000000 Binary files a/resources/sprite/icons_white_2x/flag-6.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/flag-7.png b/resources/sprite/icons_white_2x/flag-7.png deleted file mode 100644 index 09585efdee..0000000000 Binary files a/resources/sprite/icons_white_2x/flag-7.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/flag-ghost.png b/resources/sprite/icons_white_2x/flag-ghost.png deleted file mode 100644 index 159368acbe..0000000000 Binary files a/resources/sprite/icons_white_2x/flag-ghost.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/flag.png b/resources/sprite/icons_white_2x/flag.png deleted file mode 100644 index ab5dbab2f9..0000000000 Binary files a/resources/sprite/icons_white_2x/flag.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/folder-open.png b/resources/sprite/icons_white_2x/folder-open.png deleted file mode 100644 index add61260d2..0000000000 Binary files a/resources/sprite/icons_white_2x/folder-open.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/fork.png b/resources/sprite/icons_white_2x/fork.png deleted file mode 100644 index fe568c1976..0000000000 Binary files a/resources/sprite/icons_white_2x/fork.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/herald.png b/resources/sprite/icons_white_2x/herald.png deleted file mode 100644 index 0243396d9c..0000000000 Binary files a/resources/sprite/icons_white_2x/herald.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/highlight.png b/resources/sprite/icons_white_2x/highlight.png deleted file mode 100644 index 18e1009fc1..0000000000 Binary files a/resources/sprite/icons_white_2x/highlight.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/history.png b/resources/sprite/icons_white_2x/history.png deleted file mode 100644 index 38639130cf..0000000000 Binary files a/resources/sprite/icons_white_2x/history.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/home.png b/resources/sprite/icons_white_2x/home.png deleted file mode 100644 index f1d6bf8bea..0000000000 Binary files a/resources/sprite/icons_white_2x/home.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/image.png b/resources/sprite/icons_white_2x/image.png deleted file mode 100644 index 09a546dce5..0000000000 Binary files a/resources/sprite/icons_white_2x/image.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/like.png b/resources/sprite/icons_white_2x/like.png deleted file mode 100644 index ee574787e9..0000000000 Binary files a/resources/sprite/icons_white_2x/like.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/link.png b/resources/sprite/icons_white_2x/link.png deleted file mode 100644 index 4d5032e272..0000000000 Binary files a/resources/sprite/icons_white_2x/link.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/lint-info.png b/resources/sprite/icons_white_2x/lint-info.png deleted file mode 100644 index 8ef1aa7c09..0000000000 Binary files a/resources/sprite/icons_white_2x/lint-info.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/lint-ok.png b/resources/sprite/icons_white_2x/lint-ok.png deleted file mode 100644 index 39efb34925..0000000000 Binary files a/resources/sprite/icons_white_2x/lint-ok.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/lint-warning.png b/resources/sprite/icons_white_2x/lint-warning.png deleted file mode 100644 index 52814bc4af..0000000000 Binary files a/resources/sprite/icons_white_2x/lint-warning.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/lock.png b/resources/sprite/icons_white_2x/lock.png deleted file mode 100644 index 4c1ad05fd5..0000000000 Binary files a/resources/sprite/icons_white_2x/lock.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/love.png b/resources/sprite/icons_white_2x/love.png deleted file mode 100644 index 0dcf930e2b..0000000000 Binary files a/resources/sprite/icons_white_2x/love.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/merge.png b/resources/sprite/icons_white_2x/merge.png deleted file mode 100644 index 1d97f5c9b6..0000000000 Binary files a/resources/sprite/icons_white_2x/merge.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/message.png b/resources/sprite/icons_white_2x/message.png deleted file mode 100644 index 5c43088994..0000000000 Binary files a/resources/sprite/icons_white_2x/message.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/meta-mta.png b/resources/sprite/icons_white_2x/meta-mta.png deleted file mode 100644 index 161346aa23..0000000000 Binary files a/resources/sprite/icons_white_2x/meta-mta.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/move.png b/resources/sprite/icons_white_2x/move.png deleted file mode 100644 index a2c1c3a68b..0000000000 Binary files a/resources/sprite/icons_white_2x/move.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/new.png b/resources/sprite/icons_white_2x/new.png deleted file mode 100644 index 46b411a80a..0000000000 Binary files a/resources/sprite/icons_white_2x/new.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/none.png b/resources/sprite/icons_white_2x/none.png deleted file mode 100644 index 2d4d6168cf..0000000000 Binary files a/resources/sprite/icons_white_2x/none.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/perflab.png b/resources/sprite/icons_white_2x/perflab.png deleted file mode 100644 index 9afdb50aeb..0000000000 Binary files a/resources/sprite/icons_white_2x/perflab.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/preview.png b/resources/sprite/icons_white_2x/preview.png deleted file mode 100644 index 07ac9eaea9..0000000000 Binary files a/resources/sprite/icons_white_2x/preview.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/refresh.png b/resources/sprite/icons_white_2x/refresh.png deleted file mode 100644 index 8699cb5f58..0000000000 Binary files a/resources/sprite/icons_white_2x/refresh.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/remove.png b/resources/sprite/icons_white_2x/remove.png deleted file mode 100644 index 9edd718665..0000000000 Binary files a/resources/sprite/icons_white_2x/remove.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/search.png b/resources/sprite/icons_white_2x/search.png deleted file mode 100644 index 6573a9012c..0000000000 Binary files a/resources/sprite/icons_white_2x/search.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/start-sandcastle.png b/resources/sprite/icons_white_2x/start-sandcastle.png deleted file mode 100644 index ae4fe40292..0000000000 Binary files a/resources/sprite/icons_white_2x/start-sandcastle.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/tag.png b/resources/sprite/icons_white_2x/tag.png deleted file mode 100644 index 8d378f1e9e..0000000000 Binary files a/resources/sprite/icons_white_2x/tag.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/transcript.png b/resources/sprite/icons_white_2x/transcript.png deleted file mode 100644 index 56a5be2ea9..0000000000 Binary files a/resources/sprite/icons_white_2x/transcript.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/undo.png b/resources/sprite/icons_white_2x/undo.png deleted file mode 100644 index 51dcf87f98..0000000000 Binary files a/resources/sprite/icons_white_2x/undo.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/unlock.png b/resources/sprite/icons_white_2x/unlock.png deleted file mode 100644 index 4e1a045122..0000000000 Binary files a/resources/sprite/icons_white_2x/unlock.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/unmerge.png b/resources/sprite/icons_white_2x/unmerge.png deleted file mode 100644 index 3a02dad829..0000000000 Binary files a/resources/sprite/icons_white_2x/unmerge.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/unpublish.png b/resources/sprite/icons_white_2x/unpublish.png deleted file mode 100644 index 22e7ac798e..0000000000 Binary files a/resources/sprite/icons_white_2x/unpublish.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/upload.png b/resources/sprite/icons_white_2x/upload.png deleted file mode 100644 index 1d85389375..0000000000 Binary files a/resources/sprite/icons_white_2x/upload.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/warning.png b/resources/sprite/icons_white_2x/warning.png deleted file mode 100644 index 4da917ba8e..0000000000 Binary files a/resources/sprite/icons_white_2x/warning.png and /dev/null differ diff --git a/resources/sprite/icons_white_2x/world.png b/resources/sprite/icons_white_2x/world.png deleted file mode 100644 index 1c2e3f65b6..0000000000 Binary files a/resources/sprite/icons_white_2x/world.png and /dev/null differ diff --git a/resources/sprite/login_1x/Amazon.png b/resources/sprite/login_1x/Amazon.png index 1b70b07863..5bfe01331a 100644 Binary files a/resources/sprite/login_1x/Amazon.png and b/resources/sprite/login_1x/Amazon.png differ diff --git a/resources/sprite/login_1x/Asana.png b/resources/sprite/login_1x/Asana.png index 812ef52f7d..9b2fc85239 100644 Binary files a/resources/sprite/login_1x/Asana.png and b/resources/sprite/login_1x/Asana.png differ diff --git a/resources/sprite/login_1x/Bitbucket.png b/resources/sprite/login_1x/Bitbucket.png new file mode 100644 index 0000000000..22722998c7 Binary files /dev/null and b/resources/sprite/login_1x/Bitbucket.png differ diff --git a/resources/sprite/login_1x/Disqus.png b/resources/sprite/login_1x/Disqus.png index 0c6b7a1095..1d9ac9b519 100644 Binary files a/resources/sprite/login_1x/Disqus.png and b/resources/sprite/login_1x/Disqus.png differ diff --git a/resources/sprite/login_1x/Dropbox.png b/resources/sprite/login_1x/Dropbox.png deleted file mode 100644 index dd5c24764c..0000000000 Binary files a/resources/sprite/login_1x/Dropbox.png and /dev/null differ diff --git a/resources/sprite/login_1x/Facebook.png b/resources/sprite/login_1x/Facebook.png index 252a018177..8c7201b05e 100644 Binary files a/resources/sprite/login_1x/Facebook.png and b/resources/sprite/login_1x/Facebook.png differ diff --git a/resources/sprite/login_1x/Generic.png b/resources/sprite/login_1x/Generic.png index 21963932f7..8e322aa842 100644 Binary files a/resources/sprite/login_1x/Generic.png and b/resources/sprite/login_1x/Generic.png differ diff --git a/resources/sprite/login_1x/Github.png b/resources/sprite/login_1x/Github.png index c7dfa948ee..5187cefd2b 100644 Binary files a/resources/sprite/login_1x/Github.png and b/resources/sprite/login_1x/Github.png differ diff --git a/resources/sprite/login_1x/Google.png b/resources/sprite/login_1x/Google.png index bad6db7fcb..e0989b9c56 100644 Binary files a/resources/sprite/login_1x/Google.png and b/resources/sprite/login_1x/Google.png differ diff --git a/resources/sprite/login_1x/HTTP.png b/resources/sprite/login_1x/HTTP.png index 22c1fcedb9..6270291d59 100644 Binary files a/resources/sprite/login_1x/HTTP.png and b/resources/sprite/login_1x/HTTP.png differ diff --git a/resources/sprite/login_1x/Jira.png b/resources/sprite/login_1x/Jira.png index 65bf09ab42..74c26c1347 100644 Binary files a/resources/sprite/login_1x/Jira.png and b/resources/sprite/login_1x/Jira.png differ diff --git a/resources/sprite/login_1x/LDAP.png b/resources/sprite/login_1x/LDAP.png index 1abc9e8e47..447aa737b1 100644 Binary files a/resources/sprite/login_1x/LDAP.png and b/resources/sprite/login_1x/LDAP.png differ diff --git a/resources/sprite/login_1x/Linkedin.png b/resources/sprite/login_1x/Linkedin.png deleted file mode 100644 index 3ef9daa9c0..0000000000 Binary files a/resources/sprite/login_1x/Linkedin.png and /dev/null differ diff --git a/resources/sprite/login_1x/MediaWiki.png b/resources/sprite/login_1x/MediaWiki.png new file mode 100644 index 0000000000..64fa50d972 Binary files /dev/null and b/resources/sprite/login_1x/MediaWiki.png differ diff --git a/resources/sprite/login_1x/Openid.png b/resources/sprite/login_1x/Openid.png deleted file mode 100644 index 71571c35aa..0000000000 Binary files a/resources/sprite/login_1x/Openid.png and /dev/null differ diff --git a/resources/sprite/login_1x/PayPal.png b/resources/sprite/login_1x/PayPal.png new file mode 100644 index 0000000000..3294d4b3e1 Binary files /dev/null and b/resources/sprite/login_1x/PayPal.png differ diff --git a/resources/sprite/login_1x/Phabricator.png b/resources/sprite/login_1x/Phabricator.png index 865a4866b6..b998007a3c 100644 Binary files a/resources/sprite/login_1x/Phabricator.png and b/resources/sprite/login_1x/Phabricator.png differ diff --git a/resources/sprite/login_1x/Slack.png b/resources/sprite/login_1x/Slack.png new file mode 100644 index 0000000000..411bf73c13 Binary files /dev/null and b/resources/sprite/login_1x/Slack.png differ diff --git a/resources/sprite/login_1x/Stripe.png b/resources/sprite/login_1x/Stripe.png new file mode 100644 index 0000000000..b82a26ae49 Binary files /dev/null and b/resources/sprite/login_1x/Stripe.png differ diff --git a/resources/sprite/login_1x/TestPayment.png b/resources/sprite/login_1x/TestPayment.png new file mode 100644 index 0000000000..7b0505b721 Binary files /dev/null and b/resources/sprite/login_1x/TestPayment.png differ diff --git a/resources/sprite/login_1x/TwitchTV.png b/resources/sprite/login_1x/TwitchTV.png index d705521865..1e5733f90e 100644 Binary files a/resources/sprite/login_1x/TwitchTV.png and b/resources/sprite/login_1x/TwitchTV.png differ diff --git a/resources/sprite/login_1x/Twitter.png b/resources/sprite/login_1x/Twitter.png index f57645b166..8f2d91673f 100644 Binary files a/resources/sprite/login_1x/Twitter.png and b/resources/sprite/login_1x/Twitter.png differ diff --git a/resources/sprite/login_1x/WePay.png b/resources/sprite/login_1x/WePay.png new file mode 100644 index 0000000000..2e1f74d5f1 Binary files /dev/null and b/resources/sprite/login_1x/WePay.png differ diff --git a/resources/sprite/login_1x/WordPressCOM.png b/resources/sprite/login_1x/WordPressCOM.png new file mode 100644 index 0000000000..fbfa199797 Binary files /dev/null and b/resources/sprite/login_1x/WordPressCOM.png differ diff --git a/resources/sprite/login_1x/Yahoo.png b/resources/sprite/login_1x/Yahoo.png deleted file mode 100644 index 51703e34e3..0000000000 Binary files a/resources/sprite/login_1x/Yahoo.png and /dev/null differ diff --git a/resources/sprite/login_2x/Amazon.png b/resources/sprite/login_2x/Amazon.png index db0ddbca45..938dd94215 100644 Binary files a/resources/sprite/login_2x/Amazon.png and b/resources/sprite/login_2x/Amazon.png differ diff --git a/resources/sprite/login_2x/Asana.png b/resources/sprite/login_2x/Asana.png index 36cae4b6d1..6000ddc1bb 100644 Binary files a/resources/sprite/login_2x/Asana.png and b/resources/sprite/login_2x/Asana.png differ diff --git a/resources/sprite/login_2x/Bitbucket.png b/resources/sprite/login_2x/Bitbucket.png new file mode 100644 index 0000000000..cbe92da0fa Binary files /dev/null and b/resources/sprite/login_2x/Bitbucket.png differ diff --git a/resources/sprite/login_2x/Disqus.png b/resources/sprite/login_2x/Disqus.png index c4ad2a7a1c..6d9d428450 100644 Binary files a/resources/sprite/login_2x/Disqus.png and b/resources/sprite/login_2x/Disqus.png differ diff --git a/resources/sprite/login_2x/Dropbox.png b/resources/sprite/login_2x/Dropbox.png deleted file mode 100644 index 81105f70a8..0000000000 Binary files a/resources/sprite/login_2x/Dropbox.png and /dev/null differ diff --git a/resources/sprite/login_2x/Facebook.png b/resources/sprite/login_2x/Facebook.png index 11ed70826d..b3cac2bee5 100644 Binary files a/resources/sprite/login_2x/Facebook.png and b/resources/sprite/login_2x/Facebook.png differ diff --git a/resources/sprite/login_2x/Generic.png b/resources/sprite/login_2x/Generic.png index 49e4af00dc..c4b15320f6 100644 Binary files a/resources/sprite/login_2x/Generic.png and b/resources/sprite/login_2x/Generic.png differ diff --git a/resources/sprite/login_2x/Github.png b/resources/sprite/login_2x/Github.png index 414a1f8f01..17e77c4f42 100644 Binary files a/resources/sprite/login_2x/Github.png and b/resources/sprite/login_2x/Github.png differ diff --git a/resources/sprite/login_2x/Google.png b/resources/sprite/login_2x/Google.png index 8f0820ba8e..f16ad8c55b 100644 Binary files a/resources/sprite/login_2x/Google.png and b/resources/sprite/login_2x/Google.png differ diff --git a/resources/sprite/login_2x/HTTP.png b/resources/sprite/login_2x/HTTP.png index 0dee976db1..b4a8b00d40 100644 Binary files a/resources/sprite/login_2x/HTTP.png and b/resources/sprite/login_2x/HTTP.png differ diff --git a/resources/sprite/login_2x/Jira.png b/resources/sprite/login_2x/Jira.png index fa43c62a5f..d55a5b75d1 100644 Binary files a/resources/sprite/login_2x/Jira.png and b/resources/sprite/login_2x/Jira.png differ diff --git a/resources/sprite/login_2x/LDAP.png b/resources/sprite/login_2x/LDAP.png index 060cab2ab2..5f8793e431 100644 Binary files a/resources/sprite/login_2x/LDAP.png and b/resources/sprite/login_2x/LDAP.png differ diff --git a/resources/sprite/login_2x/Linkedin.png b/resources/sprite/login_2x/Linkedin.png deleted file mode 100644 index e8acef97ca..0000000000 Binary files a/resources/sprite/login_2x/Linkedin.png and /dev/null differ diff --git a/resources/sprite/login_2x/MediaWiki.png b/resources/sprite/login_2x/MediaWiki.png new file mode 100644 index 0000000000..db64d841eb Binary files /dev/null and b/resources/sprite/login_2x/MediaWiki.png differ diff --git a/resources/sprite/login_2x/Openid.png b/resources/sprite/login_2x/Openid.png deleted file mode 100644 index cd3b04d999..0000000000 Binary files a/resources/sprite/login_2x/Openid.png and /dev/null differ diff --git a/resources/sprite/login_2x/PayPal.png b/resources/sprite/login_2x/PayPal.png new file mode 100644 index 0000000000..4fad779020 Binary files /dev/null and b/resources/sprite/login_2x/PayPal.png differ diff --git a/resources/sprite/login_2x/Phabricator.png b/resources/sprite/login_2x/Phabricator.png index e3c92532a9..3792f723fc 100644 Binary files a/resources/sprite/login_2x/Phabricator.png and b/resources/sprite/login_2x/Phabricator.png differ diff --git a/resources/sprite/login_2x/Slack.png b/resources/sprite/login_2x/Slack.png new file mode 100644 index 0000000000..163d96cea0 Binary files /dev/null and b/resources/sprite/login_2x/Slack.png differ diff --git a/resources/sprite/login_2x/Stripe.png b/resources/sprite/login_2x/Stripe.png new file mode 100644 index 0000000000..c3d92c1ae6 Binary files /dev/null and b/resources/sprite/login_2x/Stripe.png differ diff --git a/resources/sprite/login_2x/TestPayment.png b/resources/sprite/login_2x/TestPayment.png new file mode 100644 index 0000000000..704e7e61f4 Binary files /dev/null and b/resources/sprite/login_2x/TestPayment.png differ diff --git a/resources/sprite/login_2x/TwitchTV.png b/resources/sprite/login_2x/TwitchTV.png index a3ae146078..5fd4b916fc 100644 Binary files a/resources/sprite/login_2x/TwitchTV.png and b/resources/sprite/login_2x/TwitchTV.png differ diff --git a/resources/sprite/login_2x/Twitter.png b/resources/sprite/login_2x/Twitter.png index 7f3b1ebe6e..d06ccc0416 100644 Binary files a/resources/sprite/login_2x/Twitter.png and b/resources/sprite/login_2x/Twitter.png differ diff --git a/resources/sprite/login_2x/WePay.png b/resources/sprite/login_2x/WePay.png new file mode 100644 index 0000000000..5b44bd2c61 Binary files /dev/null and b/resources/sprite/login_2x/WePay.png differ diff --git a/resources/sprite/login_2x/WordPressCOM.png b/resources/sprite/login_2x/WordPressCOM.png new file mode 100644 index 0000000000..78e87fb988 Binary files /dev/null and b/resources/sprite/login_2x/WordPressCOM.png differ diff --git a/resources/sprite/login_2x/Yahoo.png b/resources/sprite/login_2x/Yahoo.png deleted file mode 100644 index 511742369d..0000000000 Binary files a/resources/sprite/login_2x/Yahoo.png and /dev/null differ diff --git a/resources/sprite/manifest/actions.json b/resources/sprite/manifest/actions.json deleted file mode 100644 index 400891105e..0000000000 --- a/resources/sprite/manifest/actions.json +++ /dev/null @@ -1,206 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "actions-close-dark" : { - "name" : "actions-close-dark", - "rule" : ".actions-close-dark, .device-desktop .actions-close-grey.phui-icon-view:hover", - "hash" : "dc370e5777e6ac4ca06bc72adffea903" - }, - "actions-close-grey" : { - "name" : "actions-close-grey", - "rule" : ".actions-close-grey", - "hash" : "557249561ccfd1c44ce8b5ff52938195" - }, - "actions-close-white" : { - "name" : "actions-close-white", - "rule" : ".actions-close-white", - "hash" : "07ee0398d250301db4773a43a31ef2fa" - }, - "actions-down-dark" : { - "name" : "actions-down-dark", - "rule" : ".actions-down-dark, .device-desktop .actions-down-grey.phui-icon-view:hover", - "hash" : "56e0299b481c8cbd1104d4d06a9ad60f" - }, - "actions-down-grey" : { - "name" : "actions-down-grey", - "rule" : ".actions-down-grey", - "hash" : "62021593f80189ead4c16dbb6496eff9" - }, - "actions-down-white" : { - "name" : "actions-down-white", - "rule" : ".actions-down-white", - "hash" : "fbf8553693281e156a864cc10c90811c" - }, - "actions-flag-dark" : { - "name" : "actions-flag-dark", - "rule" : ".actions-flag-dark, .device-desktop .actions-flag-grey.phui-icon-view:hover", - "hash" : "c6d1f2054109fa35c61791ba6c8b3b4e" - }, - "actions-flag-grey" : { - "name" : "actions-flag-grey", - "rule" : ".actions-flag-grey", - "hash" : "f283ebb54b50a4dd4df6c968c327b1ae" - }, - "actions-flag-white" : { - "name" : "actions-flag-white", - "rule" : ".actions-flag-white", - "hash" : "e4ac2df6b75607b4a41a7be3a232340d" - }, - "actions-heart-dark" : { - "name" : "actions-heart-dark", - "rule" : ".actions-heart-dark, .device-desktop .actions-heart-grey.phui-icon-view:hover", - "hash" : "51063df4f5317c40fd3bbe55683c2eb8" - }, - "actions-heart-grey" : { - "name" : "actions-heart-grey", - "rule" : ".actions-heart-grey", - "hash" : "dc21c4569280ee297f556cc08a366f9a" - }, - "actions-heart-white" : { - "name" : "actions-heart-white", - "rule" : ".actions-heart-white", - "hash" : "5652d7ad050e93ef3795e8f3d535b0af" - }, - "actions-move-dark" : { - "name" : "actions-move-dark", - "rule" : ".actions-move-dark, .device-desktop .actions-move-grey.phui-icon-view:hover", - "hash" : "849975a0f7d870b2098b5df97a262e32" - }, - "actions-move-grey" : { - "name" : "actions-move-grey", - "rule" : ".actions-move-grey", - "hash" : "9f880792fcd0728a263685cf83c4c4ef" - }, - "actions-move-white" : { - "name" : "actions-move-white", - "rule" : ".actions-move-white", - "hash" : "0baa80bc68e08ee62a2ea00939d701dd" - }, - "actions-new-dark" : { - "name" : "actions-new-dark", - "rule" : ".actions-new-dark, .device-desktop .actions-new-grey.phui-icon-view:hover", - "hash" : "75f7db365f28cac6e8e4bef6582db4d5" - }, - "actions-new-grey" : { - "name" : "actions-new-grey", - "rule" : ".actions-new-grey", - "hash" : "edd7f1d803dc7c4991e484315e1690cd" - }, - "actions-new-white" : { - "name" : "actions-new-white", - "rule" : ".actions-new-white", - "hash" : "dded791b1ec55c32710845a1338bd31d" - }, - "actions-search-dark" : { - "name" : "actions-search-dark", - "rule" : ".actions-search-dark, .device-desktop .actions-search-grey.phui-icon-view:hover", - "hash" : "90e71b95196672296a329a9d2ba54b6f" - }, - "actions-search-grey" : { - "name" : "actions-search-grey", - "rule" : ".actions-search-grey", - "hash" : "041d1033d4500972791cc7cf752ed250" - }, - "actions-search-white" : { - "name" : "actions-search-white", - "rule" : ".actions-search-white", - "hash" : "8bfe4fb8c44c302c676d8b42740dfbe4" - }, - "actions-settings-dark" : { - "name" : "actions-settings-dark", - "rule" : ".actions-settings-dark, .device-desktop .actions-settings-grey.phui-icon-view:hover", - "hash" : "45a4a5f926b84dadffe036cb7cbda166" - }, - "actions-settings-grey" : { - "name" : "actions-settings-grey", - "rule" : ".actions-settings-grey", - "hash" : "73db9b654d8287d8e15be5bef8d72d89" - }, - "actions-settings-white" : { - "name" : "actions-settings-white", - "rule" : ".actions-settings-white", - "hash" : "ade04349a27cf2c223e8f4e7fea52cf1" - }, - "actions-star-dark" : { - "name" : "actions-star-dark", - "rule" : ".actions-star-dark, .device-desktop .actions-star-grey.phui-icon-view:hover", - "hash" : "ca65f112d09fed7854bb013de6e78323" - }, - "actions-star-grey" : { - "name" : "actions-star-grey", - "rule" : ".actions-star-grey", - "hash" : "23894980dd42da92451c355c844250c6" - }, - "actions-star-white" : { - "name" : "actions-star-white", - "rule" : ".actions-star-white", - "hash" : "fd709f3e1bebb17364bbfac7c0b8aaa5" - }, - "actions-tag-dark" : { - "name" : "actions-tag-dark", - "rule" : ".actions-tag-dark, .device-desktop .actions-tag-grey.phui-icon-view:hover", - "hash" : "7ca0e9df25c74a09e5111a8ce578c7fe" - }, - "actions-tag-grey" : { - "name" : "actions-tag-grey", - "rule" : ".actions-tag-grey", - "hash" : "02d0bb07ce65a12a8e653c7cced7e72d" - }, - "actions-tag-white" : { - "name" : "actions-tag-white", - "rule" : ".actions-tag-white", - "hash" : "dac6bff0b839a3430fda3de4a5c44bfd" - }, - "actions-token-dark" : { - "name" : "actions-token-dark", - "rule" : ".actions-token-dark, .device-desktop .actions-token-grey.phui-icon-view:hover", - "hash" : "4c289b5175df8375fc286127f47ddad9" - }, - "actions-token-grey" : { - "name" : "actions-token-grey", - "rule" : ".actions-token-grey", - "hash" : "93a9c3b4786480fd44ba4f17610f3926" - }, - "actions-token-white" : { - "name" : "actions-token-white", - "rule" : ".actions-token-white", - "hash" : "075f3f28279e73b793b612a61f4b1a07" - }, - "actions-up-dark" : { - "name" : "actions-up-dark", - "rule" : ".actions-up-dark, .device-desktop .actions-up-grey.phui-icon-view:hover", - "hash" : "e7f3352316b07244babe7a3ebab82132" - }, - "actions-up-grey" : { - "name" : "actions-up-grey", - "rule" : ".actions-up-grey", - "hash" : "a52ff86b194bf68f220668ba60013c0c" - }, - "actions-up-white" : { - "name" : "actions-up-white", - "rule" : ".actions-up-white", - "hash" : "e42262ba18632de2d3dfdab8c83324e6" - }, - "actions-wrench-dark" : { - "name" : "actions-wrench-dark", - "rule" : ".actions-wrench-dark, .device-desktop .actions-wrench-grey.phui-icon-view:hover", - "hash" : "aac832965a14438c2c161cdf347dfed7" - }, - "actions-wrench-grey" : { - "name" : "actions-wrench-grey", - "rule" : ".actions-wrench-grey", - "hash" : "1b27d1fe1776af2808503c6d3e842855" - }, - "actions-wrench-white" : { - "name" : "actions-wrench-white", - "rule" : ".actions-wrench-white", - "hash" : "fbb09cf182d70c99c74c360ce87724a2" - } - }, - "scales" : [ - 1, - 2 - ], - "header" : "\/**\n * @provides sprite-actions-css\n * @generated\n *\/\n\n.sprite-actions {\n background-image: url(http://rsrc//image//sprite-actions.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-actions {\n background-image: url(http://rsrc//image//sprite-actions-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", - "type" : "standard" -} diff --git a/resources/sprite/manifest/apps-large.json b/resources/sprite/manifest/apps-large.json deleted file mode 100644 index 8b4af64498..0000000000 --- a/resources/sprite/manifest/apps-large.json +++ /dev/null @@ -1,1091 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "apps-adventure-blue-large" : { - "name" : "apps-adventure-blue-large", - "rule" : ".apps-adventure-blue-large, .phabricator-crumb-view:hover .apps-adventure-dark-large", - "hash" : "0509fb4d048c93a6b8af646944709479" - }, - "apps-adventure-dark-large" : { - "name" : "apps-adventure-dark-large", - "rule" : ".apps-adventure-dark-large", - "hash" : "bd23a9b83a7026a417d31f454c434161" - }, - "apps-adventure-light-large" : { - "name" : "apps-adventure-light-large", - "rule" : ".apps-adventure-light-large", - "hash" : "3fb2fcd6e3745c9580346ea897aa65ab" - }, - "apps-adventure-white-large" : { - "name" : "apps-adventure-white-large", - "rule" : ".apps-adventure-white-large", - "hash" : "36df80df3c80bf991dc230294cc9c911" - }, - "apps-application-blue-large" : { - "name" : "apps-application-blue-large", - "rule" : ".apps-application-blue-large, .phabricator-crumb-view:hover .apps-application-dark-large", - "hash" : "fc889d8c9e69078f291c2ab51ff4343e" - }, - "apps-application-dark-large" : { - "name" : "apps-application-dark-large", - "rule" : ".apps-application-dark-large", - "hash" : "e348c2fc0cda05120bb678248409cfad" - }, - "apps-application-light-large" : { - "name" : "apps-application-light-large", - "rule" : ".apps-application-light-large", - "hash" : "3b2d8072002ea88aa8c09c5189694653" - }, - "apps-application-white-large" : { - "name" : "apps-application-white-large", - "rule" : ".apps-application-white-large", - "hash" : "541c6e2186743f49815e75da650208da" - }, - "apps-audit-blue-large" : { - "name" : "apps-audit-blue-large", - "rule" : ".apps-audit-blue-large, .phabricator-crumb-view:hover .apps-audit-dark-large", - "hash" : "9f869222b0aab808cf0e0cd662d9e72b" - }, - "apps-audit-dark-large" : { - "name" : "apps-audit-dark-large", - "rule" : ".apps-audit-dark-large", - "hash" : "6222153f10afce62ebc5190a011f6ac0" - }, - "apps-audit-light-large" : { - "name" : "apps-audit-light-large", - "rule" : ".apps-audit-light-large", - "hash" : "4defc8b4fbfd5f1a1a023829f6f9ceb9" - }, - "apps-audit-white-large" : { - "name" : "apps-audit-white-large", - "rule" : ".apps-audit-white-large", - "hash" : "901b7fb8940b77d61edf4b9848901b43" - }, - "apps-authentication-blue-large" : { - "name" : "apps-authentication-blue-large", - "rule" : ".apps-authentication-blue-large, .phabricator-crumb-view:hover .apps-authentication-dark-large", - "hash" : "9a8389120be19de5b0fba2814736d2c4" - }, - "apps-authentication-dark-large" : { - "name" : "apps-authentication-dark-large", - "rule" : ".apps-authentication-dark-large", - "hash" : "478a7a1ae296ccf988ccce89bc7de25d" - }, - "apps-authentication-light-large" : { - "name" : "apps-authentication-light-large", - "rule" : ".apps-authentication-light-large", - "hash" : "034256f1056033424b936e94debaa9ad" - }, - "apps-authentication-white-large" : { - "name" : "apps-authentication-white-large", - "rule" : ".apps-authentication-white-large", - "hash" : "29a681a8825dbeb805480bdddb91c737" - }, - "apps-calendar-blue-large" : { - "name" : "apps-calendar-blue-large", - "rule" : ".apps-calendar-blue-large, .phabricator-crumb-view:hover .apps-calendar-dark-large", - "hash" : "6f6c4fa212eba26c85471bdc2e94b706" - }, - "apps-calendar-dark-large" : { - "name" : "apps-calendar-dark-large", - "rule" : ".apps-calendar-dark-large", - "hash" : "a520b5d737b84ca39020319126f940b1" - }, - "apps-calendar-light-large" : { - "name" : "apps-calendar-light-large", - "rule" : ".apps-calendar-light-large", - "hash" : "cdcf72fd3ebe6265c6c84044996a0f10" - }, - "apps-calendar-white-large" : { - "name" : "apps-calendar-white-large", - "rule" : ".apps-calendar-white-large", - "hash" : "496778ccdb249b5b7b9877f5681dbf39" - }, - "apps-chatlog-blue-large" : { - "name" : "apps-chatlog-blue-large", - "rule" : ".apps-chatlog-blue-large, .phabricator-crumb-view:hover .apps-chatlog-dark-large", - "hash" : "8b52f731f5aaea0fb61974f72157c9af" - }, - "apps-chatlog-dark-large" : { - "name" : "apps-chatlog-dark-large", - "rule" : ".apps-chatlog-dark-large", - "hash" : "c6c6c0b312e1de94c44b32186f95ba9c" - }, - "apps-chatlog-light-large" : { - "name" : "apps-chatlog-light-large", - "rule" : ".apps-chatlog-light-large", - "hash" : "005a18858e65be19e330147dda0c440f" - }, - "apps-chatlog-white-large" : { - "name" : "apps-chatlog-white-large", - "rule" : ".apps-chatlog-white-large", - "hash" : "349fb6f6e577fc6fbda0bda316520a34" - }, - "apps-conduit-blue-large" : { - "name" : "apps-conduit-blue-large", - "rule" : ".apps-conduit-blue-large, .phabricator-crumb-view:hover .apps-conduit-dark-large", - "hash" : "7549d63a976dbb650faaceb58aaa3d9e" - }, - "apps-conduit-dark-large" : { - "name" : "apps-conduit-dark-large", - "rule" : ".apps-conduit-dark-large", - "hash" : "091090790dd5cc5482d9c71460935fd8" - }, - "apps-conduit-light-large" : { - "name" : "apps-conduit-light-large", - "rule" : ".apps-conduit-light-large", - "hash" : "3a9dd111ec843efd2048200bb537b455" - }, - "apps-conduit-white-large" : { - "name" : "apps-conduit-white-large", - "rule" : ".apps-conduit-white-large", - "hash" : "8e7697099b3f00ce4040a0d7c7913e7a" - }, - "apps-conpherence-blue-large" : { - "name" : "apps-conpherence-blue-large", - "rule" : ".apps-conpherence-blue-large, .phabricator-crumb-view:hover .apps-conpherence-dark-large", - "hash" : "ff76132c29d0557f514998c28a8ad010" - }, - "apps-conpherence-dark-large" : { - "name" : "apps-conpherence-dark-large", - "rule" : ".apps-conpherence-dark-large", - "hash" : "97b415b21758f185d85776deb31a9dab" - }, - "apps-conpherence-light-large" : { - "name" : "apps-conpherence-light-large", - "rule" : ".apps-conpherence-light-large", - "hash" : "4467dbd8438f72401b57cc16f3a3a369" - }, - "apps-conpherence-white-large" : { - "name" : "apps-conpherence-white-large", - "rule" : ".apps-conpherence-white-large", - "hash" : "71af2eb44d4fdfb0ec28be9a0ee77622" - }, - "apps-countdown-blue-large" : { - "name" : "apps-countdown-blue-large", - "rule" : ".apps-countdown-blue-large, .phabricator-crumb-view:hover .apps-countdown-dark-large", - "hash" : "405ddda3cc0c914287763036e37df797" - }, - "apps-countdown-dark-large" : { - "name" : "apps-countdown-dark-large", - "rule" : ".apps-countdown-dark-large", - "hash" : "5d4bd6a3a59ee6fc7ec1c3d2c665aa9e" - }, - "apps-countdown-light-large" : { - "name" : "apps-countdown-light-large", - "rule" : ".apps-countdown-light-large", - "hash" : "aefb7a38be433393086579b25c7066eb" - }, - "apps-countdown-white-large" : { - "name" : "apps-countdown-white-large", - "rule" : ".apps-countdown-white-large", - "hash" : "330580661c8fd81d99b9016fa12aab48" - }, - "apps-daemon-blue-large" : { - "name" : "apps-daemon-blue-large", - "rule" : ".apps-daemon-blue-large, .phabricator-crumb-view:hover .apps-daemon-dark-large", - "hash" : "58f90e6a7bb66482884d9f8a5898b7ed" - }, - "apps-daemon-dark-large" : { - "name" : "apps-daemon-dark-large", - "rule" : ".apps-daemon-dark-large", - "hash" : "3ada181435fe3294e5399e4252f8049b" - }, - "apps-daemon-light-large" : { - "name" : "apps-daemon-light-large", - "rule" : ".apps-daemon-light-large", - "hash" : "f91e115d5fb25718d21732243cc079d4" - }, - "apps-daemon-white-large" : { - "name" : "apps-daemon-white-large", - "rule" : ".apps-daemon-white-large", - "hash" : "0145258d65150a31f3c172196c92e5e3" - }, - "apps-differential-blue-large" : { - "name" : "apps-differential-blue-large", - "rule" : ".apps-differential-blue-large, .phabricator-crumb-view:hover .apps-differential-dark-large", - "hash" : "646a6f77909115b9d48f2e88d3975aad" - }, - "apps-differential-dark-large" : { - "name" : "apps-differential-dark-large", - "rule" : ".apps-differential-dark-large", - "hash" : "0e3beccd4aa5445f5219525d50579970" - }, - "apps-differential-light-large" : { - "name" : "apps-differential-light-large", - "rule" : ".apps-differential-light-large", - "hash" : "6d27ebc71ef3a78a5b972cb774024c71" - }, - "apps-differential-white-large" : { - "name" : "apps-differential-white-large", - "rule" : ".apps-differential-white-large", - "hash" : "c2a0d2f66a1031427bd72fe44237076b" - }, - "apps-diffusion-blue-large" : { - "name" : "apps-diffusion-blue-large", - "rule" : ".apps-diffusion-blue-large, .phabricator-crumb-view:hover .apps-diffusion-dark-large", - "hash" : "7ec644b09f8e56dd565fc9ec0d244f66" - }, - "apps-diffusion-dark-large" : { - "name" : "apps-diffusion-dark-large", - "rule" : ".apps-diffusion-dark-large", - "hash" : "b85b84d415fc4692a2f86597b888a5db" - }, - "apps-diffusion-light-large" : { - "name" : "apps-diffusion-light-large", - "rule" : ".apps-diffusion-light-large", - "hash" : "28a6d4f1eb8ac6b39f860f37643adec4" - }, - "apps-diffusion-white-large" : { - "name" : "apps-diffusion-white-large", - "rule" : ".apps-diffusion-white-large", - "hash" : "a8c22c20e29e2dad8f810f51b1a2e5b2" - }, - "apps-diviner-blue-large" : { - "name" : "apps-diviner-blue-large", - "rule" : ".apps-diviner-blue-large, .phabricator-crumb-view:hover .apps-diviner-dark-large", - "hash" : "a3b7d32c3d9b80e320c1f420016605e0" - }, - "apps-diviner-dark-large" : { - "name" : "apps-diviner-dark-large", - "rule" : ".apps-diviner-dark-large", - "hash" : "d808f0f4ece13af010e18f032f0dcc6f" - }, - "apps-diviner-light-large" : { - "name" : "apps-diviner-light-large", - "rule" : ".apps-diviner-light-large", - "hash" : "5002148c68c7ec415bebab5becfb4630" - }, - "apps-diviner-white-large" : { - "name" : "apps-diviner-white-large", - "rule" : ".apps-diviner-white-large", - "hash" : "c907b505545119d937c769cb3499a640" - }, - "apps-drydock-blue-large" : { - "name" : "apps-drydock-blue-large", - "rule" : ".apps-drydock-blue-large, .phabricator-crumb-view:hover .apps-drydock-dark-large", - "hash" : "3154a5eb6a852abab58f5af4bf726575" - }, - "apps-drydock-dark-large" : { - "name" : "apps-drydock-dark-large", - "rule" : ".apps-drydock-dark-large", - "hash" : "8c48692a7b02f8673d2fc5420b53ac4d" - }, - "apps-drydock-light-large" : { - "name" : "apps-drydock-light-large", - "rule" : ".apps-drydock-light-large", - "hash" : "e05d65b91702767cf027eb0b63a37b4f" - }, - "apps-drydock-white-large" : { - "name" : "apps-drydock-white-large", - "rule" : ".apps-drydock-white-large", - "hash" : "63f88bf99c50bd3adce75f2fececef75" - }, - "apps-fact-blue-large" : { - "name" : "apps-fact-blue-large", - "rule" : ".apps-fact-blue-large, .phabricator-crumb-view:hover .apps-fact-dark-large", - "hash" : "754c0154aa20b742cecb9a21ac6ca489" - }, - "apps-fact-dark-large" : { - "name" : "apps-fact-dark-large", - "rule" : ".apps-fact-dark-large", - "hash" : "3cf03586b53692c26978f2859c91b089" - }, - "apps-fact-light-large" : { - "name" : "apps-fact-light-large", - "rule" : ".apps-fact-light-large", - "hash" : "12315afc83750eebe6cd53cf31b4914e" - }, - "apps-fact-white-large" : { - "name" : "apps-fact-white-large", - "rule" : ".apps-fact-white-large", - "hash" : "d24e0b88ecfb05cb80de311eb5cc2e15" - }, - "apps-feed-blue-large" : { - "name" : "apps-feed-blue-large", - "rule" : ".apps-feed-blue-large, .phabricator-crumb-view:hover .apps-feed-dark-large", - "hash" : "40adb545b7791af405c2af74cbce25b0" - }, - "apps-feed-dark-large" : { - "name" : "apps-feed-dark-large", - "rule" : ".apps-feed-dark-large", - "hash" : "1d42c713aa65ceb1ba83ff20e0a9f5d4" - }, - "apps-feed-light-large" : { - "name" : "apps-feed-light-large", - "rule" : ".apps-feed-light-large", - "hash" : "3ca4012e0a20dc438d1bde5568ca4a54" - }, - "apps-feed-white-large" : { - "name" : "apps-feed-white-large", - "rule" : ".apps-feed-white-large", - "hash" : "2d5a5b5259d20555c1598ee9440e051c" - }, - "apps-files-blue-large" : { - "name" : "apps-files-blue-large", - "rule" : ".apps-files-blue-large, .phabricator-crumb-view:hover .apps-files-dark-large", - "hash" : "6b104cdecc59dd6a2b7ad80593e64bf5" - }, - "apps-files-dark-large" : { - "name" : "apps-files-dark-large", - "rule" : ".apps-files-dark-large", - "hash" : "698bc8702c9e2e8535457e3a0106ce86" - }, - "apps-files-light-large" : { - "name" : "apps-files-light-large", - "rule" : ".apps-files-light-large", - "hash" : "3120729c859f63c322956a62255ea277" - }, - "apps-files-white-large" : { - "name" : "apps-files-white-large", - "rule" : ".apps-files-white-large", - "hash" : "60b859821cf88dc66c08f816de1b46d3" - }, - "apps-flags-blue-large" : { - "name" : "apps-flags-blue-large", - "rule" : ".apps-flags-blue-large, .phabricator-crumb-view:hover .apps-flags-dark-large", - "hash" : "768654309d5c6dda89d7598cf8b24b74" - }, - "apps-flags-dark-large" : { - "name" : "apps-flags-dark-large", - "rule" : ".apps-flags-dark-large", - "hash" : "35d42bde8206adc11ea54cc3ac288932" - }, - "apps-flags-light-large" : { - "name" : "apps-flags-light-large", - "rule" : ".apps-flags-light-large", - "hash" : "5d5e3c7ac1ddda9042ea3b3d2777e27c" - }, - "apps-flags-white-large" : { - "name" : "apps-flags-white-large", - "rule" : ".apps-flags-white-large", - "hash" : "afe7afb44a98a74b5606942ef0c13e36" - }, - "apps-harbormaster-blue-large" : { - "name" : "apps-harbormaster-blue-large", - "rule" : ".apps-harbormaster-blue-large, .phabricator-crumb-view:hover .apps-harbormaster-dark-large", - "hash" : "c4c81a696f9a4e1242324a1e420ab35b" - }, - "apps-harbormaster-dark-large" : { - "name" : "apps-harbormaster-dark-large", - "rule" : ".apps-harbormaster-dark-large", - "hash" : "3c04eec4a91d96a10d515c1f9b8978b2" - }, - "apps-harbormaster-light-large" : { - "name" : "apps-harbormaster-light-large", - "rule" : ".apps-harbormaster-light-large", - "hash" : "9bfe6e18744b5746744104bc1efa912f" - }, - "apps-harbormaster-white-large" : { - "name" : "apps-harbormaster-white-large", - "rule" : ".apps-harbormaster-white-large", - "hash" : "f61ec3fbf17e07d16ce4982d52f4e14d" - }, - "apps-help-blue-large" : { - "name" : "apps-help-blue-large", - "rule" : ".apps-help-blue-large, .phabricator-crumb-view:hover .apps-help-dark-large", - "hash" : "d0fe3856424c359831387c6411a0956f" - }, - "apps-help-dark-large" : { - "name" : "apps-help-dark-large", - "rule" : ".apps-help-dark-large", - "hash" : "cb5a6b7244780bbc0bec5aaf2a130dfb" - }, - "apps-help-light-large" : { - "name" : "apps-help-light-large", - "rule" : ".apps-help-light-large", - "hash" : "125ad3aee619c3e789d85db7da91c9c7" - }, - "apps-help-white-large" : { - "name" : "apps-help-white-large", - "rule" : ".apps-help-white-large", - "hash" : "8b82d34c84c251977acf2025c6642ba7" - }, - "apps-herald-blue-large" : { - "name" : "apps-herald-blue-large", - "rule" : ".apps-herald-blue-large, .phabricator-crumb-view:hover .apps-herald-dark-large", - "hash" : "564bbf8a17fdb4578a5e10f02c068822" - }, - "apps-herald-dark-large" : { - "name" : "apps-herald-dark-large", - "rule" : ".apps-herald-dark-large", - "hash" : "1e3b612160abbfc6f42c5b6c35499f20" - }, - "apps-herald-light-large" : { - "name" : "apps-herald-light-large", - "rule" : ".apps-herald-light-large", - "hash" : "196c77eb0588a0453592810afe7efe0c" - }, - "apps-herald-white-large" : { - "name" : "apps-herald-white-large", - "rule" : ".apps-herald-white-large", - "hash" : "2410c465697e9af6b7e6ec4e5b32062d" - }, - "apps-home-blue-large" : { - "name" : "apps-home-blue-large", - "rule" : ".apps-home-blue-large, .phabricator-crumb-view:hover .apps-home-dark-large", - "hash" : "702a5bc08248e636f4088f4d816bac94" - }, - "apps-home-dark-large" : { - "name" : "apps-home-dark-large", - "rule" : ".apps-home-dark-large", - "hash" : "8c6fff938641378ee504bf473a34defc" - }, - "apps-home-light-large" : { - "name" : "apps-home-light-large", - "rule" : ".apps-home-light-large", - "hash" : "51b74f90f877258c47145807fd18e388" - }, - "apps-home-white-large" : { - "name" : "apps-home-white-large", - "rule" : ".apps-home-white-large", - "hash" : "709053e29f8364081c00724c1f9634aa" - }, - "apps-legalpad-blue-large" : { - "name" : "apps-legalpad-blue-large", - "rule" : ".apps-legalpad-blue-large, .phabricator-crumb-view:hover .apps-legalpad-dark-large", - "hash" : "c2570d0cccbcd57fdab9e67579ab1176" - }, - "apps-legalpad-dark-large" : { - "name" : "apps-legalpad-dark-large", - "rule" : ".apps-legalpad-dark-large", - "hash" : "c5e140c481b2ce1aec09b3ab858d01a9" - }, - "apps-legalpad-light-large" : { - "name" : "apps-legalpad-light-large", - "rule" : ".apps-legalpad-light-large", - "hash" : "486d7dd91fb4ef4bfb210488a7f0033c" - }, - "apps-legalpad-white-large" : { - "name" : "apps-legalpad-white-large", - "rule" : ".apps-legalpad-white-large", - "hash" : "e0c85d672ccb5a39a0839d765bb19aba" - }, - "apps-logo-blue-large" : { - "name" : "apps-logo-blue-large", - "rule" : ".apps-logo-blue-large, .phabricator-crumb-view:hover .apps-logo-dark-large", - "hash" : "69dfc24f011d28b6072d437a36161fa7" - }, - "apps-logo-dark-large" : { - "name" : "apps-logo-dark-large", - "rule" : ".apps-logo-dark-large", - "hash" : "2002d5458bcd09e292bf2e9fc17d62a0" - }, - "apps-logo-light-large" : { - "name" : "apps-logo-light-large", - "rule" : ".apps-logo-light-large", - "hash" : "56e015e168d46ffdaaba0c6fa99822bb" - }, - "apps-logo-white-large" : { - "name" : "apps-logo-white-large", - "rule" : ".apps-logo-white-large", - "hash" : "323fa19b10af04bd7a368b65591b7be1" - }, - "apps-macro-blue-large" : { - "name" : "apps-macro-blue-large", - "rule" : ".apps-macro-blue-large, .phabricator-crumb-view:hover .apps-macro-dark-large", - "hash" : "9a3e3f547f299745c3489286786f21ea" - }, - "apps-macro-dark-large" : { - "name" : "apps-macro-dark-large", - "rule" : ".apps-macro-dark-large", - "hash" : "ddd429dc24e7c7ae328b8a4489eb9175" - }, - "apps-macro-light-large" : { - "name" : "apps-macro-light-large", - "rule" : ".apps-macro-light-large", - "hash" : "a7bf42efa03a52ff4c498fd68913e634" - }, - "apps-macro-white-large" : { - "name" : "apps-macro-white-large", - "rule" : ".apps-macro-white-large", - "hash" : "934a5737d0d32d018980c48f3f6c9670" - }, - "apps-mail-blue-large" : { - "name" : "apps-mail-blue-large", - "rule" : ".apps-mail-blue-large, .phabricator-crumb-view:hover .apps-mail-dark-large", - "hash" : "8896adff632593c97a8e645a98de3e8d" - }, - "apps-mail-dark-large" : { - "name" : "apps-mail-dark-large", - "rule" : ".apps-mail-dark-large", - "hash" : "6432a08fd203ac359dc97b584e0a6c07" - }, - "apps-mail-light-large" : { - "name" : "apps-mail-light-large", - "rule" : ".apps-mail-light-large", - "hash" : "b5d2f0a8ccace78bbd4c547ffe5ab416" - }, - "apps-mail-white-large" : { - "name" : "apps-mail-white-large", - "rule" : ".apps-mail-white-large", - "hash" : "2eaf355dc47eb13019e67253747b8233" - }, - "apps-maniphest-blue-large" : { - "name" : "apps-maniphest-blue-large", - "rule" : ".apps-maniphest-blue-large, .phabricator-crumb-view:hover .apps-maniphest-dark-large", - "hash" : "78984a9d2fd49593af452ae6609695d4" - }, - "apps-maniphest-dark-large" : { - "name" : "apps-maniphest-dark-large", - "rule" : ".apps-maniphest-dark-large", - "hash" : "cab7745300b9d2d9252a31f00961cb5e" - }, - "apps-maniphest-light-large" : { - "name" : "apps-maniphest-light-large", - "rule" : ".apps-maniphest-light-large", - "hash" : "094a77fc53f07ba0b1556d7aa3375cfb" - }, - "apps-maniphest-white-large" : { - "name" : "apps-maniphest-white-large", - "rule" : ".apps-maniphest-white-large", - "hash" : "7999d438b78de9d3e0dbccec3dab1099" - }, - "apps-metamta-blue-large" : { - "name" : "apps-metamta-blue-large", - "rule" : ".apps-metamta-blue-large, .phabricator-crumb-view:hover .apps-metamta-dark-large", - "hash" : "a816ae9d535c407e406bed70e4c4bef3" - }, - "apps-metamta-dark-large" : { - "name" : "apps-metamta-dark-large", - "rule" : ".apps-metamta-dark-large", - "hash" : "a606b97f2345efe32b1a34587ed3b7b0" - }, - "apps-metamta-light-large" : { - "name" : "apps-metamta-light-large", - "rule" : ".apps-metamta-light-large", - "hash" : "384fe180c146aae5f10aa734c2ba5651" - }, - "apps-metamta-white-large" : { - "name" : "apps-metamta-white-large", - "rule" : ".apps-metamta-white-large", - "hash" : "076be59cc84b57c12e9f8b8542d103c3" - }, - "apps-new-blue-large" : { - "name" : "apps-new-blue-large", - "rule" : ".apps-new-blue-large, .phabricator-crumb-view:hover .apps-new-dark-large", - "hash" : "90656ea1eb5379434b77579df47318f3" - }, - "apps-new-dark-large" : { - "name" : "apps-new-dark-large", - "rule" : ".apps-new-dark-large", - "hash" : "2412643dfde502a297d2c35eb9ba4f93" - }, - "apps-new-light-large" : { - "name" : "apps-new-light-large", - "rule" : ".apps-new-light-large", - "hash" : "c93739e145aec183aaa1fea4e37aa3aa" - }, - "apps-new-white-large" : { - "name" : "apps-new-white-large", - "rule" : ".apps-new-white-large", - "hash" : "be597ce11c4d1630f67282cd7b81cc85" - }, - "apps-owners-blue-large" : { - "name" : "apps-owners-blue-large", - "rule" : ".apps-owners-blue-large, .phabricator-crumb-view:hover .apps-owners-dark-large", - "hash" : "b967fef9b4c42ae8c4458c2a9afd1463" - }, - "apps-owners-dark-large" : { - "name" : "apps-owners-dark-large", - "rule" : ".apps-owners-dark-large", - "hash" : "01be8451fbb612b975dd3c821ef19bbe" - }, - "apps-owners-light-large" : { - "name" : "apps-owners-light-large", - "rule" : ".apps-owners-light-large", - "hash" : "5eeeebd97c62a680195244781fc39eeb" - }, - "apps-owners-white-large" : { - "name" : "apps-owners-white-large", - "rule" : ".apps-owners-white-large", - "hash" : "a267ce517c928ce5861fe7ac85116af7" - }, - "apps-paste-blue-large" : { - "name" : "apps-paste-blue-large", - "rule" : ".apps-paste-blue-large, .phabricator-crumb-view:hover .apps-paste-dark-large", - "hash" : "099824fa00964a20a87e41a81d0a6ae3" - }, - "apps-paste-dark-large" : { - "name" : "apps-paste-dark-large", - "rule" : ".apps-paste-dark-large", - "hash" : "9c47ee87939bf25079c894fbd4d6d383" - }, - "apps-paste-light-large" : { - "name" : "apps-paste-light-large", - "rule" : ".apps-paste-light-large", - "hash" : "5d1485f2e96ec8a0da1081f02701e0b9" - }, - "apps-paste-white-large" : { - "name" : "apps-paste-white-large", - "rule" : ".apps-paste-white-large", - "hash" : "94cf3ee0f2b15b82ad8f62cb9399ecad" - }, - "apps-people-blue-large" : { - "name" : "apps-people-blue-large", - "rule" : ".apps-people-blue-large, .phabricator-crumb-view:hover .apps-people-dark-large", - "hash" : "185dba3e96e16b74b3f6dbf9d6ae5422" - }, - "apps-people-dark-large" : { - "name" : "apps-people-dark-large", - "rule" : ".apps-people-dark-large", - "hash" : "bcc355d6ef3681397597995bd2a7f2b3" - }, - "apps-people-light-large" : { - "name" : "apps-people-light-large", - "rule" : ".apps-people-light-large", - "hash" : "996077831ee507d016536b57f44e52d3" - }, - "apps-people-white-large" : { - "name" : "apps-people-white-large", - "rule" : ".apps-people-white-large", - "hash" : "4303feab5097ce04c3ba9a4ea5aa5cd2" - }, - "apps-phage-blue-large" : { - "name" : "apps-phage-blue-large", - "rule" : ".apps-phage-blue-large, .phabricator-crumb-view:hover .apps-phage-dark-large", - "hash" : "ed85496a4d3d451dde3115dd02d9e2ac" - }, - "apps-phage-dark-large" : { - "name" : "apps-phage-dark-large", - "rule" : ".apps-phage-dark-large", - "hash" : "a36cebcd08eebe541ca25515e6967948" - }, - "apps-phage-light-large" : { - "name" : "apps-phage-light-large", - "rule" : ".apps-phage-light-large", - "hash" : "26f0085b214257faab3324c5887b6f76" - }, - "apps-phage-white-large" : { - "name" : "apps-phage-white-large", - "rule" : ".apps-phage-white-large", - "hash" : "789781f15740da319e26ed7574c726ec" - }, - "apps-phame-blue-large" : { - "name" : "apps-phame-blue-large", - "rule" : ".apps-phame-blue-large, .phabricator-crumb-view:hover .apps-phame-dark-large", - "hash" : "86a9c9ff13be7f9ad63bf806451fe70a" - }, - "apps-phame-dark-large" : { - "name" : "apps-phame-dark-large", - "rule" : ".apps-phame-dark-large", - "hash" : "df73634d3cef65f6d287b4e403725fe9" - }, - "apps-phame-light-large" : { - "name" : "apps-phame-light-large", - "rule" : ".apps-phame-light-large", - "hash" : "68e29657ff2422773727d07303db5281" - }, - "apps-phame-white-large" : { - "name" : "apps-phame-white-large", - "rule" : ".apps-phame-white-large", - "hash" : "0edcf86764e306245e9eaa22938fd7db" - }, - "apps-phid-blue-large" : { - "name" : "apps-phid-blue-large", - "rule" : ".apps-phid-blue-large, .phabricator-crumb-view:hover .apps-phid-dark-large", - "hash" : "174373bf52ec78748446b28b143d2cce" - }, - "apps-phid-dark-large" : { - "name" : "apps-phid-dark-large", - "rule" : ".apps-phid-dark-large", - "hash" : "d1916c03adf0350fce0fd1258aa323ec" - }, - "apps-phid-light-large" : { - "name" : "apps-phid-light-large", - "rule" : ".apps-phid-light-large", - "hash" : "6a0b438b4c274fe61adfa0e21c069c73" - }, - "apps-phid-white-large" : { - "name" : "apps-phid-white-large", - "rule" : ".apps-phid-white-large", - "hash" : "4197c9c620ea407d260800ef4982093e" - }, - "apps-phlux-blue-large" : { - "name" : "apps-phlux-blue-large", - "rule" : ".apps-phlux-blue-large, .phabricator-crumb-view:hover .apps-phlux-dark-large", - "hash" : "4e237442860cabf117fc843e34b8bb0e" - }, - "apps-phlux-dark-large" : { - "name" : "apps-phlux-dark-large", - "rule" : ".apps-phlux-dark-large", - "hash" : "9a15854e253eac3ca6f8bea32e911162" - }, - "apps-phlux-light-large" : { - "name" : "apps-phlux-light-large", - "rule" : ".apps-phlux-light-large", - "hash" : "5cbb03e1569ea8722cadd8f074f1f850" - }, - "apps-phlux-white-large" : { - "name" : "apps-phlux-white-large", - "rule" : ".apps-phlux-white-large", - "hash" : "29bbe338fe9da82eb1fadde2794e354b" - }, - "apps-pholio-blue-large" : { - "name" : "apps-pholio-blue-large", - "rule" : ".apps-pholio-blue-large, .phabricator-crumb-view:hover .apps-pholio-dark-large", - "hash" : "a81650e8da29b6cff76580dc6baac0df" - }, - "apps-pholio-dark-large" : { - "name" : "apps-pholio-dark-large", - "rule" : ".apps-pholio-dark-large", - "hash" : "3d02ad19cf0b2e81edafc0e47e131cee" - }, - "apps-pholio-light-large" : { - "name" : "apps-pholio-light-large", - "rule" : ".apps-pholio-light-large", - "hash" : "1d11f75c735e22e9328b81040e5d413d" - }, - "apps-pholio-white-large" : { - "name" : "apps-pholio-white-large", - "rule" : ".apps-pholio-white-large", - "hash" : "477edf2de6e0e7abec2635f948ccbb14" - }, - "apps-phortune-blue-large" : { - "name" : "apps-phortune-blue-large", - "rule" : ".apps-phortune-blue-large, .phabricator-crumb-view:hover .apps-phortune-dark-large", - "hash" : "78c71081f4f3c8f5075041f5e6c802a1" - }, - "apps-phortune-dark-large" : { - "name" : "apps-phortune-dark-large", - "rule" : ".apps-phortune-dark-large", - "hash" : "7e8a5ad784e4353309c8ae496dff9141" - }, - "apps-phortune-light-large" : { - "name" : "apps-phortune-light-large", - "rule" : ".apps-phortune-light-large", - "hash" : "fae63e1b2078ae2da749cea129950030" - }, - "apps-phortune-white-large" : { - "name" : "apps-phortune-white-large", - "rule" : ".apps-phortune-white-large", - "hash" : "b327cddd3b78bc5cec89f55b48f67ac9" - }, - "apps-phpast-blue-large" : { - "name" : "apps-phpast-blue-large", - "rule" : ".apps-phpast-blue-large, .phabricator-crumb-view:hover .apps-phpast-dark-large", - "hash" : "d88417d692d4e11826906bf939e99600" - }, - "apps-phpast-dark-large" : { - "name" : "apps-phpast-dark-large", - "rule" : ".apps-phpast-dark-large", - "hash" : "2f5db781700735aaf2ef3915451459ff" - }, - "apps-phpast-light-large" : { - "name" : "apps-phpast-light-large", - "rule" : ".apps-phpast-light-large", - "hash" : "1de84bb2aba7c22b78e0b74628aefce1" - }, - "apps-phpast-white-large" : { - "name" : "apps-phpast-white-large", - "rule" : ".apps-phpast-white-large", - "hash" : "69ffddb6e09d2f0fb9dd286bec30ed85" - }, - "apps-phrequent-blue-large" : { - "name" : "apps-phrequent-blue-large", - "rule" : ".apps-phrequent-blue-large, .phabricator-crumb-view:hover .apps-phrequent-dark-large", - "hash" : "65c872d3969cb1cbe7f0bd506ef36cca" - }, - "apps-phrequent-dark-large" : { - "name" : "apps-phrequent-dark-large", - "rule" : ".apps-phrequent-dark-large", - "hash" : "98c392d11698acc093c81fd899b32f19" - }, - "apps-phrequent-light-large" : { - "name" : "apps-phrequent-light-large", - "rule" : ".apps-phrequent-light-large", - "hash" : "8411d312b9f649aa5ae0621088bb25f5" - }, - "apps-phrequent-white-large" : { - "name" : "apps-phrequent-white-large", - "rule" : ".apps-phrequent-white-large", - "hash" : "93aad2015d07f5227f628c6a880cd397" - }, - "apps-phriction-blue-large" : { - "name" : "apps-phriction-blue-large", - "rule" : ".apps-phriction-blue-large, .phabricator-crumb-view:hover .apps-phriction-dark-large", - "hash" : "8b29e0ee777d2d4d1ec2a91b3f910017" - }, - "apps-phriction-dark-large" : { - "name" : "apps-phriction-dark-large", - "rule" : ".apps-phriction-dark-large", - "hash" : "63ab802a41c87ef69b30718e9946ffb0" - }, - "apps-phriction-light-large" : { - "name" : "apps-phriction-light-large", - "rule" : ".apps-phriction-light-large", - "hash" : "e122d15b4ff0956ad37329b79fbfdc3a" - }, - "apps-phriction-white-large" : { - "name" : "apps-phriction-white-large", - "rule" : ".apps-phriction-white-large", - "hash" : "9e9a641a783ef9a7060d57e6fa49a685" - }, - "apps-policy-blue-large" : { - "name" : "apps-policy-blue-large", - "rule" : ".apps-policy-blue-large, .phabricator-crumb-view:hover .apps-policy-dark-large", - "hash" : "23a55bb7794a0fd01cc5eefc78cff3b3" - }, - "apps-policy-dark-large" : { - "name" : "apps-policy-dark-large", - "rule" : ".apps-policy-dark-large", - "hash" : "44080f0d70116bc2f56cc9c879caf3de" - }, - "apps-policy-light-large" : { - "name" : "apps-policy-light-large", - "rule" : ".apps-policy-light-large", - "hash" : "fc07ff7b5f17fe7701f0967a2cc05ff1" - }, - "apps-policy-white-large" : { - "name" : "apps-policy-white-large", - "rule" : ".apps-policy-white-large", - "hash" : "8a62d1a408675dd3953fbb5773276c3a" - }, - "apps-ponder-blue-large" : { - "name" : "apps-ponder-blue-large", - "rule" : ".apps-ponder-blue-large, .phabricator-crumb-view:hover .apps-ponder-dark-large", - "hash" : "76436677bc26190c4fd3993c6cd6034f" - }, - "apps-ponder-dark-large" : { - "name" : "apps-ponder-dark-large", - "rule" : ".apps-ponder-dark-large", - "hash" : "54beefa78bd1aae4a35f57d6f08be1d8" - }, - "apps-ponder-light-large" : { - "name" : "apps-ponder-light-large", - "rule" : ".apps-ponder-light-large", - "hash" : "80bc15e0ffe9010975e643456baf9563" - }, - "apps-ponder-white-large" : { - "name" : "apps-ponder-white-large", - "rule" : ".apps-ponder-white-large", - "hash" : "12ea3fd66ddc7fb2b65ac66e02be8df8" - }, - "apps-power-blue-large" : { - "name" : "apps-power-blue-large", - "rule" : ".apps-power-blue-large, .phabricator-crumb-view:hover .apps-power-dark-large", - "hash" : "e7e42f93324499a3194dfd73b6ae7b1b" - }, - "apps-power-dark-large" : { - "name" : "apps-power-dark-large", - "rule" : ".apps-power-dark-large", - "hash" : "d22328989a099998c340525bf485bb75" - }, - "apps-power-light-large" : { - "name" : "apps-power-light-large", - "rule" : ".apps-power-light-large", - "hash" : "84e7423a510311b237f3bfe4e700b346" - }, - "apps-power-white-large" : { - "name" : "apps-power-white-large", - "rule" : ".apps-power-white-large", - "hash" : "0423113a2bc1ba1f06bd2de9a24a3de3" - }, - "apps-projects-blue-large" : { - "name" : "apps-projects-blue-large", - "rule" : ".apps-projects-blue-large, .phabricator-crumb-view:hover .apps-projects-dark-large", - "hash" : "997f71636ccc6af73e75198cbb379469" - }, - "apps-projects-dark-large" : { - "name" : "apps-projects-dark-large", - "rule" : ".apps-projects-dark-large", - "hash" : "8d33919d561678a4b206c73f17b23411" - }, - "apps-projects-light-large" : { - "name" : "apps-projects-light-large", - "rule" : ".apps-projects-light-large", - "hash" : "22aa7d0cc5c8808eee523b8d4b022e97" - }, - "apps-projects-white-large" : { - "name" : "apps-projects-white-large", - "rule" : ".apps-projects-white-large", - "hash" : "af43f034c78d9c268b62194d9a017c48" - }, - "apps-releeph-blue-large" : { - "name" : "apps-releeph-blue-large", - "rule" : ".apps-releeph-blue-large, .phabricator-crumb-view:hover .apps-releeph-dark-large", - "hash" : "ef3155ec0b10e5e75fdefb214d7e0d1a" - }, - "apps-releeph-dark-large" : { - "name" : "apps-releeph-dark-large", - "rule" : ".apps-releeph-dark-large", - "hash" : "d5ca94cade1a437e0967b9d33e7ecbcd" - }, - "apps-releeph-light-large" : { - "name" : "apps-releeph-light-large", - "rule" : ".apps-releeph-light-large", - "hash" : "aa7a60713d6308688ac697304ae67bd8" - }, - "apps-releeph-white-large" : { - "name" : "apps-releeph-white-large", - "rule" : ".apps-releeph-white-large", - "hash" : "d2cc5f4177e4f338cc7378e28c884f71" - }, - "apps-repositories-blue-large" : { - "name" : "apps-repositories-blue-large", - "rule" : ".apps-repositories-blue-large, .phabricator-crumb-view:hover .apps-repositories-dark-large", - "hash" : "a41af8e724aa960c2748c132f1fb696c" - }, - "apps-repositories-dark-large" : { - "name" : "apps-repositories-dark-large", - "rule" : ".apps-repositories-dark-large", - "hash" : "d9bb66b0e220714f09c17df6c615465a" - }, - "apps-repositories-light-large" : { - "name" : "apps-repositories-light-large", - "rule" : ".apps-repositories-light-large", - "hash" : "51eb3a6cbbc934bc5ea457ed37c38064" - }, - "apps-repositories-white-large" : { - "name" : "apps-repositories-white-large", - "rule" : ".apps-repositories-white-large", - "hash" : "e249fe8d4137e4b357c88ee237535632" - }, - "apps-settings-blue-large" : { - "name" : "apps-settings-blue-large", - "rule" : ".apps-settings-blue-large, .phabricator-crumb-view:hover .apps-settings-dark-large", - "hash" : "3623ea33b34613d3d527094a238913ae" - }, - "apps-settings-dark-large" : { - "name" : "apps-settings-dark-large", - "rule" : ".apps-settings-dark-large", - "hash" : "d80deac60d655bf3e52a1229cba69dfb" - }, - "apps-settings-light-large" : { - "name" : "apps-settings-light-large", - "rule" : ".apps-settings-light-large", - "hash" : "a754e26164dac005b5e230f99b94851a" - }, - "apps-settings-white-large" : { - "name" : "apps-settings-white-large", - "rule" : ".apps-settings-white-large", - "hash" : "914a8f39d4adc81dcad01819839c030e" - }, - "apps-setup-blue-large" : { - "name" : "apps-setup-blue-large", - "rule" : ".apps-setup-blue-large, .phabricator-crumb-view:hover .apps-setup-dark-large", - "hash" : "3e6503e724de415ff6f2ba950616cd6b" - }, - "apps-setup-dark-large" : { - "name" : "apps-setup-dark-large", - "rule" : ".apps-setup-dark-large", - "hash" : "249661f744dfd6244280f0c2e42d452e" - }, - "apps-setup-light-large" : { - "name" : "apps-setup-light-large", - "rule" : ".apps-setup-light-large", - "hash" : "39d37bf9ff87e4dad2432a547008bbf5" - }, - "apps-setup-white-large" : { - "name" : "apps-setup-white-large", - "rule" : ".apps-setup-white-large", - "hash" : "632635def3cf7054c07dde8cff309844" - }, - "apps-slowvote-blue-large" : { - "name" : "apps-slowvote-blue-large", - "rule" : ".apps-slowvote-blue-large, .phabricator-crumb-view:hover .apps-slowvote-dark-large", - "hash" : "8e31e0f5e778c9edbd0da4612359d755" - }, - "apps-slowvote-dark-large" : { - "name" : "apps-slowvote-dark-large", - "rule" : ".apps-slowvote-dark-large", - "hash" : "ab081bf44dc1e2f9bf782d28b3cdc522" - }, - "apps-slowvote-light-large" : { - "name" : "apps-slowvote-light-large", - "rule" : ".apps-slowvote-light-large", - "hash" : "b908c23ed5b1a5af8d2645c3704e1db0" - }, - "apps-slowvote-white-large" : { - "name" : "apps-slowvote-white-large", - "rule" : ".apps-slowvote-white-large", - "hash" : "108ef68b330e4b87ba5dc3aa85fbc3cc" - }, - "apps-token-blue-large" : { - "name" : "apps-token-blue-large", - "rule" : ".apps-token-blue-large, .phabricator-crumb-view:hover .apps-token-dark-large", - "hash" : "3bf65ffafa2b122eb60f626473232e40" - }, - "apps-token-dark-large" : { - "name" : "apps-token-dark-large", - "rule" : ".apps-token-dark-large", - "hash" : "2a84d5ef0a513a1c57897d8fbf7346df" - }, - "apps-token-light-large" : { - "name" : "apps-token-light-large", - "rule" : ".apps-token-light-large", - "hash" : "258a406e20227a202066913ca4fe63ac" - }, - "apps-token-white-large" : { - "name" : "apps-token-white-large", - "rule" : ".apps-token-white-large", - "hash" : "be85c082b484778feb5253938d0c83ef" - }, - "apps-uiexamples-blue-large" : { - "name" : "apps-uiexamples-blue-large", - "rule" : ".apps-uiexamples-blue-large, .phabricator-crumb-view:hover .apps-uiexamples-dark-large", - "hash" : "24ea65da28397859eab59d9d5cc3d182" - }, - "apps-uiexamples-dark-large" : { - "name" : "apps-uiexamples-dark-large", - "rule" : ".apps-uiexamples-dark-large", - "hash" : "a200274e5aab9e6f036d95816dfd1a58" - }, - "apps-uiexamples-light-large" : { - "name" : "apps-uiexamples-light-large", - "rule" : ".apps-uiexamples-light-large", - "hash" : "783d7b5507c7d2c5b54dafa48bfb16b4" - }, - "apps-uiexamples-white-large" : { - "name" : "apps-uiexamples-white-large", - "rule" : ".apps-uiexamples-white-large", - "hash" : "2aa6749cf6f7f2ddb3b705ac1e4e3145" - }, - "apps-workphlow-blue-large" : { - "name" : "apps-workphlow-blue-large", - "rule" : ".apps-workphlow-blue-large, .phabricator-crumb-view:hover .apps-workphlow-dark-large", - "hash" : "c6629e2fd3bafe8bb3fbf5145bbf190a" - }, - "apps-workphlow-dark-large" : { - "name" : "apps-workphlow-dark-large", - "rule" : ".apps-workphlow-dark-large", - "hash" : "7de748184d0acc8ef5028fbb9fafab72" - }, - "apps-workphlow-light-large" : { - "name" : "apps-workphlow-light-large", - "rule" : ".apps-workphlow-light-large", - "hash" : "f4c28448cfe72304d153a77dc2f34197" - }, - "apps-workphlow-white-large" : { - "name" : "apps-workphlow-white-large", - "rule" : ".apps-workphlow-white-large", - "hash" : "8e2072d0161bcd78d7c36d70f13a87b7" - }, - "apps-xhprof-blue-large" : { - "name" : "apps-xhprof-blue-large", - "rule" : ".apps-xhprof-blue-large, .phabricator-crumb-view:hover .apps-xhprof-dark-large", - "hash" : "e55fcaa0d27b88591927545aaaeb3b45" - }, - "apps-xhprof-dark-large" : { - "name" : "apps-xhprof-dark-large", - "rule" : ".apps-xhprof-dark-large", - "hash" : "9d70d3e125981dc2366603c3b90c043e" - }, - "apps-xhprof-light-large" : { - "name" : "apps-xhprof-light-large", - "rule" : ".apps-xhprof-light-large", - "hash" : "60d566581dbffaab5a61d5bd73ad5ab3" - }, - "apps-xhprof-white-large" : { - "name" : "apps-xhprof-white-large", - "rule" : ".apps-xhprof-white-large", - "hash" : "01695eb21cfadc014378fa63cd2e8579" - } - }, - "scales" : [ - 1, - 2 - ], - "header" : "\/**\n * @provides sprite-apps-large-css\n * @generated\n *\/\n\n.sprite-apps-large {\n background-image: url(http://rsrc//image//sprite-apps-large.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-apps-large {\n background-image: url(http://rsrc//image//sprite-apps-large-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", - "type" : "standard" -} diff --git a/resources/sprite/manifest/apps-xlarge.json b/resources/sprite/manifest/apps-xlarge.json deleted file mode 100644 index 9812599fa1..0000000000 --- a/resources/sprite/manifest/apps-xlarge.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "app-application-dark-xlarge" : { - "name" : "app-application-dark-xlarge", - "rule" : ".app-application-dark-xlarge", - "hash" : "7a643a12413cff83e4a80a1e845526f8" - }, - "app-audit-dark-xlarge" : { - "name" : "app-audit-dark-xlarge", - "rule" : ".app-audit-dark-xlarge", - "hash" : "5551492ef2b1f0c6dc29707a268abcb7" - }, - "app-calendar-dark-xlarge" : { - "name" : "app-calendar-dark-xlarge", - "rule" : ".app-calendar-dark-xlarge", - "hash" : "f38663d868c6865423ad7072f1031cdf" - }, - "app-conduit-dark-xlarge" : { - "name" : "app-conduit-dark-xlarge", - "rule" : ".app-conduit-dark-xlarge", - "hash" : "bcee651ff297aab466c388739c219a27" - }, - "app-countdown-dark-xlarge" : { - "name" : "app-countdown-dark-xlarge", - "rule" : ".app-countdown-dark-xlarge", - "hash" : "c3667959ddfebe2ae95681215a71fc6e" - }, - "app-daemon-dark-xlarge" : { - "name" : "app-daemon-dark-xlarge", - "rule" : ".app-daemon-dark-xlarge", - "hash" : "f7b12a99852a6b10c3a37c834924adc0" - }, - "app-differential-dark-xlarge" : { - "name" : "app-differential-dark-xlarge", - "rule" : ".app-differential-dark-xlarge", - "hash" : "4593b952ecfc1d34971519912bb929c5" - }, - "app-diffusion-dark-xlarge" : { - "name" : "app-diffusion-dark-xlarge", - "rule" : ".app-diffusion-dark-xlarge", - "hash" : "6db32b1bc12d289ef6f3961d8db835b2" - }, - "app-diviner-dark-xlarge" : { - "name" : "app-diviner-dark-xlarge", - "rule" : ".app-diviner-dark-xlarge", - "hash" : "99df86667a67c4790f7fafd836320811" - }, - "app-drydock-dark-xlarge" : { - "name" : "app-drydock-dark-xlarge", - "rule" : ".app-drydock-dark-xlarge", - "hash" : "7e3fca7e8a676f31a584bba714223be3" - }, - "app-fact-dark-xlarge" : { - "name" : "app-fact-dark-xlarge", - "rule" : ".app-fact-dark-xlarge", - "hash" : "d9b1d20ff52ca3e78a8d4f86d8cba80a" - }, - "app-feed-dark-xlarge" : { - "name" : "app-feed-dark-xlarge", - "rule" : ".app-feed-dark-xlarge", - "hash" : "e380a1ad743816ec1fb5a39f2bbd1ce9" - }, - "app-files-dark-xlarge" : { - "name" : "app-files-dark-xlarge", - "rule" : ".app-files-dark-xlarge", - "hash" : "f98aaf6cafcd39cfa45de67814c8e25c" - }, - "app-flags-dark-xlarge" : { - "name" : "app-flags-dark-xlarge", - "rule" : ".app-flags-dark-xlarge", - "hash" : "9c439bf054d35ebb5f06b22a9acb5d64" - }, - "app-help-dark-xlarge" : { - "name" : "app-help-dark-xlarge", - "rule" : ".app-help-dark-xlarge", - "hash" : "dea35456361ba0851085dd68c1f586e3" - }, - "app-herald-dark-xlarge" : { - "name" : "app-herald-dark-xlarge", - "rule" : ".app-herald-dark-xlarge", - "hash" : "dbff6868cd9046c41d7d9d1f57bb4bf8" - }, - "app-home-dark-xlarge" : { - "name" : "app-home-dark-xlarge", - "rule" : ".app-home-dark-xlarge", - "hash" : "c0758afffbbbe6cc076d2e6fa22ca809" - }, - "app-logo-dark-xlarge" : { - "name" : "app-logo-dark-xlarge", - "rule" : ".app-logo-dark-xlarge", - "hash" : "50a1a90428301872442f438a884053cd" - }, - "app-macro-dark-xlarge" : { - "name" : "app-macro-dark-xlarge", - "rule" : ".app-macro-dark-xlarge", - "hash" : "4992c19c9d883a7aa40d26a67253c4af" - }, - "app-mail-dark-xlarge" : { - "name" : "app-mail-dark-xlarge", - "rule" : ".app-mail-dark-xlarge", - "hash" : "47e47cf18b434e567fedd5ecd3b1dd06" - }, - "app-maniphest-dark-xlarge" : { - "name" : "app-maniphest-dark-xlarge", - "rule" : ".app-maniphest-dark-xlarge", - "hash" : "f50e0c476990448c594892e7436c3f25" - }, - "app-metamta-dark-xlarge" : { - "name" : "app-metamta-dark-xlarge", - "rule" : ".app-metamta-dark-xlarge", - "hash" : "48bbb5e9bf22c61f47f20e4d4f28e388" - }, - "app-owners-dark-xlarge" : { - "name" : "app-owners-dark-xlarge", - "rule" : ".app-owners-dark-xlarge", - "hash" : "cdd4aff8d915194a03f91bf179f769e3" - }, - "app-paste-dark-xlarge" : { - "name" : "app-paste-dark-xlarge", - "rule" : ".app-paste-dark-xlarge", - "hash" : "01fb15f0c1737b8ebfff35f2640f724b" - }, - "app-people-dark-xlarge" : { - "name" : "app-people-dark-xlarge", - "rule" : ".app-people-dark-xlarge", - "hash" : "84b938691e8bfe3a703bcb4268557c4f" - }, - "app-phame-dark-xlarge" : { - "name" : "app-phame-dark-xlarge", - "rule" : ".app-phame-dark-xlarge", - "hash" : "83c25a09a86864b2234b15a822bcc3ee" - }, - "app-phid-dark-xlarge" : { - "name" : "app-phid-dark-xlarge", - "rule" : ".app-phid-dark-xlarge", - "hash" : "920ce85f9599b2e108f91646d02d0d98" - }, - "app-pholio-dark-xlarge" : { - "name" : "app-pholio-dark-xlarge", - "rule" : ".app-pholio-dark-xlarge", - "hash" : "3df7131f4ba39cb1b41265a8c9ab21b4" - }, - "app-phpast-dark-xlarge" : { - "name" : "app-phpast-dark-xlarge", - "rule" : ".app-phpast-dark-xlarge", - "hash" : "a6e70722d85061c262cb7cb89a66d6e7" - }, - "app-phriction-dark-xlarge" : { - "name" : "app-phriction-dark-xlarge", - "rule" : ".app-phriction-dark-xlarge", - "hash" : "7abef95c6c378ab6bb3d08ca4a252c5c" - }, - "app-ponder-dark-xlarge" : { - "name" : "app-ponder-dark-xlarge", - "rule" : ".app-ponder-dark-xlarge", - "hash" : "fab5f0539a3e17ff9934b1165658987d" - }, - "app-power-dark-xlarge" : { - "name" : "app-power-dark-xlarge", - "rule" : ".app-power-dark-xlarge", - "hash" : "dcfbd602f69e65b52c42825fd65fdb15" - }, - "app-projects-dark-xlarge" : { - "name" : "app-projects-dark-xlarge", - "rule" : ".app-projects-dark-xlarge", - "hash" : "403790d745f6e385e2639d72d57f40e5" - }, - "app-repositories-dark-xlarge" : { - "name" : "app-repositories-dark-xlarge", - "rule" : ".app-repositories-dark-xlarge", - "hash" : "f3319bd72328ed112650b79f3bc06831" - }, - "app-settings-dark-xlarge" : { - "name" : "app-settings-dark-xlarge", - "rule" : ".app-settings-dark-xlarge", - "hash" : "48788e1a045452ae1c2ca179e623d056" - }, - "app-setup-dark-xlarge" : { - "name" : "app-setup-dark-xlarge", - "rule" : ".app-setup-dark-xlarge", - "hash" : "9ab00a533af4fa79018cd18aa605a1a3" - }, - "app-slowvote-dark-xlarge" : { - "name" : "app-slowvote-dark-xlarge", - "rule" : ".app-slowvote-dark-xlarge", - "hash" : "705b09e36b25a7ed4b4a9c924173e79e" - }, - "app-uiexamples-dark-xlarge" : { - "name" : "app-uiexamples-dark-xlarge", - "rule" : ".app-uiexamples-dark-xlarge", - "hash" : "3f58b1ab30daf4a5a8cedfc7484421bf" - } - }, - "scales" : [ - 1 - ], - "header" : "\/**\n * @provides sprite-apps-xlarge-css\n * @generated\n *\/\n\n.sprite-apps-xlarge {\n background-image: url(http://rsrc//image//sprite-apps-xlarge.png);\n background-repeat: no-repeat;\n}\n\n\n", - "type" : "standard" -} diff --git a/resources/sprite/manifest/apps.json b/resources/sprite/manifest/apps.json deleted file mode 100644 index aec07ee8a9..0000000000 --- a/resources/sprite/manifest/apps.json +++ /dev/null @@ -1,551 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "apps-adventure-dark" : { - "name" : "apps-adventure-dark", - "rule" : ".apps-adventure-dark", - "hash" : "a28314cca031158b744be7bf71612261" - }, - "apps-adventure-white" : { - "name" : "apps-adventure-white", - "rule" : ".apps-adventure-white", - "hash" : "bd4dd76bc727638a757f392c8b1ffdeb" - }, - "apps-application-dark" : { - "name" : "apps-application-dark", - "rule" : ".apps-application-dark", - "hash" : "cb6533f585c2ab831916aee29ab29338" - }, - "apps-application-white" : { - "name" : "apps-application-white", - "rule" : ".apps-application-white", - "hash" : "efe96bec30b97147c5eb4ffa818cac5a" - }, - "apps-audit-dark" : { - "name" : "apps-audit-dark", - "rule" : ".apps-audit-dark", - "hash" : "1b6b4d4fc3954309e7af1c777401511d" - }, - "apps-audit-white" : { - "name" : "apps-audit-white", - "rule" : ".apps-audit-white", - "hash" : "8b14beee5adc284b3804d0bb99e0498f" - }, - "apps-authentication-dark" : { - "name" : "apps-authentication-dark", - "rule" : ".apps-authentication-dark", - "hash" : "5ae0f7e5d45df5da12ecc447f44bc7d9" - }, - "apps-authentication-white" : { - "name" : "apps-authentication-white", - "rule" : ".apps-authentication-white", - "hash" : "567b1e8f11974b0817250b933b9dd3de" - }, - "apps-calendar-dark" : { - "name" : "apps-calendar-dark", - "rule" : ".apps-calendar-dark", - "hash" : "ace8540406796c442b7e821d7009a354" - }, - "apps-calendar-white" : { - "name" : "apps-calendar-white", - "rule" : ".apps-calendar-white", - "hash" : "d1a6ba42bc0b5e8b595e5f3a5ecc4c07" - }, - "apps-chatlog-dark" : { - "name" : "apps-chatlog-dark", - "rule" : ".apps-chatlog-dark", - "hash" : "a9fc7a1da24693ced95accf6646d658b" - }, - "apps-chatlog-white" : { - "name" : "apps-chatlog-white", - "rule" : ".apps-chatlog-white", - "hash" : "edff1793764633464cf167e3c6c128f0" - }, - "apps-conduit-dark" : { - "name" : "apps-conduit-dark", - "rule" : ".apps-conduit-dark", - "hash" : "731db33ba8fa2971e4d3d1feff1ac574" - }, - "apps-conduit-white" : { - "name" : "apps-conduit-white", - "rule" : ".apps-conduit-white", - "hash" : "3023fb959718d9abae4eb8af770c8378" - }, - "apps-conpherence-dark" : { - "name" : "apps-conpherence-dark", - "rule" : ".apps-conpherence-dark", - "hash" : "2dcf4de0160464abf6329350a1baae59" - }, - "apps-conpherence-white" : { - "name" : "apps-conpherence-white", - "rule" : ".apps-conpherence-white", - "hash" : "d9a2ce4d8928a81b8f02954ea179c75f" - }, - "apps-countdown-dark" : { - "name" : "apps-countdown-dark", - "rule" : ".apps-countdown-dark", - "hash" : "9db932741a6d3d64b8df7a8e28b0025e" - }, - "apps-countdown-white" : { - "name" : "apps-countdown-white", - "rule" : ".apps-countdown-white", - "hash" : "8d27e6577c033a77ce1d62417845812f" - }, - "apps-daemon-dark" : { - "name" : "apps-daemon-dark", - "rule" : ".apps-daemon-dark", - "hash" : "83a2aefb0e297b22bb40fbe76537dbcc" - }, - "apps-daemon-white" : { - "name" : "apps-daemon-white", - "rule" : ".apps-daemon-white", - "hash" : "c07fc293a9207edc535b2b74e7ae059b" - }, - "apps-differential-dark" : { - "name" : "apps-differential-dark", - "rule" : ".apps-differential-dark", - "hash" : "47c31971aeeba0b0cf3dae7c3f34d746" - }, - "apps-differential-white" : { - "name" : "apps-differential-white", - "rule" : ".apps-differential-white", - "hash" : "feb4e921077420f55a936a2eea300a37" - }, - "apps-diffusion-dark" : { - "name" : "apps-diffusion-dark", - "rule" : ".apps-diffusion-dark", - "hash" : "b6bf9ca076cea40ae409844669b8bcf8" - }, - "apps-diffusion-white" : { - "name" : "apps-diffusion-white", - "rule" : ".apps-diffusion-white", - "hash" : "f6786cf8d18610621d1baa04d3b55e75" - }, - "apps-diviner-dark" : { - "name" : "apps-diviner-dark", - "rule" : ".apps-diviner-dark", - "hash" : "356f063869ad2e9b881844a7ee9813ba" - }, - "apps-diviner-white" : { - "name" : "apps-diviner-white", - "rule" : ".apps-diviner-white", - "hash" : "1fa0636256aeaea27fd6259aa9cc7003" - }, - "apps-drydock-dark" : { - "name" : "apps-drydock-dark", - "rule" : ".apps-drydock-dark", - "hash" : "30bddd91ffd0c3dba57a0156717f28be" - }, - "apps-drydock-white" : { - "name" : "apps-drydock-white", - "rule" : ".apps-drydock-white", - "hash" : "599108df7b845329cb9d8982925cf5eb" - }, - "apps-fact-dark" : { - "name" : "apps-fact-dark", - "rule" : ".apps-fact-dark", - "hash" : "029a4b291e7ec8df75f656ad90443fd1" - }, - "apps-fact-white" : { - "name" : "apps-fact-white", - "rule" : ".apps-fact-white", - "hash" : "f387ef4101d9ae0511d975cd25e9b9aa" - }, - "apps-feed-dark" : { - "name" : "apps-feed-dark", - "rule" : ".apps-feed-dark", - "hash" : "b1ba15483949965dc40f8afe1fed36f3" - }, - "apps-feed-white" : { - "name" : "apps-feed-white", - "rule" : ".apps-feed-white", - "hash" : "7540dff74270975a9bf1df4bbc65b728" - }, - "apps-files-dark" : { - "name" : "apps-files-dark", - "rule" : ".apps-files-dark", - "hash" : "7ac5474f6c77942a4a002c7236bb02bd" - }, - "apps-files-white" : { - "name" : "apps-files-white", - "rule" : ".apps-files-white", - "hash" : "48235273ebb9c6ebdca82dddd64b5eaf" - }, - "apps-flags-dark" : { - "name" : "apps-flags-dark", - "rule" : ".apps-flags-dark", - "hash" : "d32b409cac006890391cbf3deaf9c66c" - }, - "apps-flags-white" : { - "name" : "apps-flags-white", - "rule" : ".apps-flags-white", - "hash" : "9ce2476cff7e5f123a20a9152c79b4b0" - }, - "apps-harbormaster-dark" : { - "name" : "apps-harbormaster-dark", - "rule" : ".apps-harbormaster-dark", - "hash" : "71490d2cba389b33791db899fa86ac43" - }, - "apps-harbormaster-white" : { - "name" : "apps-harbormaster-white", - "rule" : ".apps-harbormaster-white", - "hash" : "205912048bf6dba9d8e09835922c13ec" - }, - "apps-help-dark" : { - "name" : "apps-help-dark", - "rule" : ".apps-help-dark", - "hash" : "59c2301a521deec631bb4373b6b5932c" - }, - "apps-help-white" : { - "name" : "apps-help-white", - "rule" : ".apps-help-white", - "hash" : "a62819577284cfce49e9595760a69071" - }, - "apps-herald-dark" : { - "name" : "apps-herald-dark", - "rule" : ".apps-herald-dark", - "hash" : "39dee5205e7fd0193db1249e8c58476a" - }, - "apps-herald-white" : { - "name" : "apps-herald-white", - "rule" : ".apps-herald-white", - "hash" : "0b962a02801a8ef892ff9dd1f325b09e" - }, - "apps-home-dark" : { - "name" : "apps-home-dark", - "rule" : ".apps-home-dark", - "hash" : "4a90080e06032017e21a1cadcd6d0993" - }, - "apps-home-white" : { - "name" : "apps-home-white", - "rule" : ".apps-home-white", - "hash" : "3b034189ce2507d5acf06a018325524d" - }, - "apps-legalpad-dark" : { - "name" : "apps-legalpad-dark", - "rule" : ".apps-legalpad-dark", - "hash" : "88d540034c93583f0d0ae93493e9b17c" - }, - "apps-legalpad-white" : { - "name" : "apps-legalpad-white", - "rule" : ".apps-legalpad-white", - "hash" : "bb0f8fa6ff6a0b4f810923751f9ebd55" - }, - "apps-logo-dark" : { - "name" : "apps-logo-dark", - "rule" : ".apps-logo-dark", - "hash" : "124cad7ef1ba1abb032beb50f3e4b9db" - }, - "apps-logo-white" : { - "name" : "apps-logo-white", - "rule" : ".apps-logo-white", - "hash" : "885b8ab26f2873d326e2173fad44dce7" - }, - "apps-macro-dark" : { - "name" : "apps-macro-dark", - "rule" : ".apps-macro-dark", - "hash" : "8c5b3dee46497cdecc7b21ed0e83afa4" - }, - "apps-macro-white" : { - "name" : "apps-macro-white", - "rule" : ".apps-macro-white", - "hash" : "81e36ce1cbf39a8c33c5d4f5b01c61dc" - }, - "apps-mail-dark" : { - "name" : "apps-mail-dark", - "rule" : ".apps-mail-dark", - "hash" : "73b7a7b1bd0efca32d7d57039b7515d9" - }, - "apps-mail-white" : { - "name" : "apps-mail-white", - "rule" : ".apps-mail-white", - "hash" : "83a336b8f0cf4fc29e8fad4418b453a5" - }, - "apps-maniphest-dark" : { - "name" : "apps-maniphest-dark", - "rule" : ".apps-maniphest-dark", - "hash" : "f69f9b71fba0a3cb2ad3f989b9e80aa3" - }, - "apps-maniphest-white" : { - "name" : "apps-maniphest-white", - "rule" : ".apps-maniphest-white", - "hash" : "246e1edc77f59f5c5847c5e99bf725f1" - }, - "apps-metamta-dark" : { - "name" : "apps-metamta-dark", - "rule" : ".apps-metamta-dark", - "hash" : "d7c8b12880351a5214747e5fec9a6047" - }, - "apps-metamta-white" : { - "name" : "apps-metamta-white", - "rule" : ".apps-metamta-white", - "hash" : "1664f51de85251cf358b9fad3623d1d5" - }, - "apps-new-dark" : { - "name" : "apps-new-dark", - "rule" : ".apps-new-dark", - "hash" : "39f2b8d62c4595dc653badf9f11a08d7" - }, - "apps-new-white" : { - "name" : "apps-new-white", - "rule" : ".apps-new-white", - "hash" : "dc5ce42c7d60e6ba37b07631b3c3280a" - }, - "apps-owners-dark" : { - "name" : "apps-owners-dark", - "rule" : ".apps-owners-dark", - "hash" : "6820f0ed3b1c2a02ee8523b7ca16bd73" - }, - "apps-owners-white" : { - "name" : "apps-owners-white", - "rule" : ".apps-owners-white", - "hash" : "7f409576c8ddab7a513313c301c61683" - }, - "apps-paste-dark" : { - "name" : "apps-paste-dark", - "rule" : ".apps-paste-dark", - "hash" : "681914299ac0a104ce669f3fca3433f0" - }, - "apps-paste-white" : { - "name" : "apps-paste-white", - "rule" : ".apps-paste-white", - "hash" : "ed5ec1ee39cc2a01f568f91c72141bfb" - }, - "apps-people-dark" : { - "name" : "apps-people-dark", - "rule" : ".apps-people-dark", - "hash" : "be18920c5e1ce28e92bef89b01196d6d" - }, - "apps-people-white" : { - "name" : "apps-people-white", - "rule" : ".apps-people-white", - "hash" : "64bbb2b31873a206a08a50bd14f80c3e" - }, - "apps-phage-dark" : { - "name" : "apps-phage-dark", - "rule" : ".apps-phage-dark", - "hash" : "7a15eec085afcc137b50b23781889526" - }, - "apps-phage-white" : { - "name" : "apps-phage-white", - "rule" : ".apps-phage-white", - "hash" : "19c313baea3de0f7c6ab13eb5d1931a9" - }, - "apps-phame-dark" : { - "name" : "apps-phame-dark", - "rule" : ".apps-phame-dark", - "hash" : "bcb80ee46f3a68c9218132537c1ad403" - }, - "apps-phame-white" : { - "name" : "apps-phame-white", - "rule" : ".apps-phame-white", - "hash" : "3e8c589577b39c5bb6cb416394ca995e" - }, - "apps-phid-dark" : { - "name" : "apps-phid-dark", - "rule" : ".apps-phid-dark", - "hash" : "30abc202bd6d191d0686ac601b4827d9" - }, - "apps-phid-white" : { - "name" : "apps-phid-white", - "rule" : ".apps-phid-white", - "hash" : "35cabe4468dc7ad83ca814d14584da46" - }, - "apps-phlux-dark" : { - "name" : "apps-phlux-dark", - "rule" : ".apps-phlux-dark", - "hash" : "67c98e15d093726c13325dfb7b130d5b" - }, - "apps-phlux-white" : { - "name" : "apps-phlux-white", - "rule" : ".apps-phlux-white", - "hash" : "e45320aa27d6221b513c946a43025e55" - }, - "apps-pholio-dark" : { - "name" : "apps-pholio-dark", - "rule" : ".apps-pholio-dark", - "hash" : "a7c0eed5e0acf244d77a40ba48605de3" - }, - "apps-pholio-white" : { - "name" : "apps-pholio-white", - "rule" : ".apps-pholio-white", - "hash" : "aafd79e9702c566c91345ba19eb4982b" - }, - "apps-phortune-dark" : { - "name" : "apps-phortune-dark", - "rule" : ".apps-phortune-dark", - "hash" : "2ddad4cb503d2b3ae7662717170684ce" - }, - "apps-phortune-white" : { - "name" : "apps-phortune-white", - "rule" : ".apps-phortune-white", - "hash" : "6722013edddd2b302420727a52aec7a0" - }, - "apps-phpast-dark" : { - "name" : "apps-phpast-dark", - "rule" : ".apps-phpast-dark", - "hash" : "c9be5edad0b04067552f15460871f608" - }, - "apps-phpast-white" : { - "name" : "apps-phpast-white", - "rule" : ".apps-phpast-white", - "hash" : "3c72bb3a2701584538d677e9a792837e" - }, - "apps-phrequent-dark" : { - "name" : "apps-phrequent-dark", - "rule" : ".apps-phrequent-dark", - "hash" : "eb16969e42515916a040014870270a04" - }, - "apps-phrequent-white" : { - "name" : "apps-phrequent-white", - "rule" : ".apps-phrequent-white", - "hash" : "3a5ab5724f2256b346987f478fac8ae8" - }, - "apps-phriction-dark" : { - "name" : "apps-phriction-dark", - "rule" : ".apps-phriction-dark", - "hash" : "8a1035b1cbc512ed0845939158d266a3" - }, - "apps-phriction-white" : { - "name" : "apps-phriction-white", - "rule" : ".apps-phriction-white", - "hash" : "a6717397b2e049a1eb77757ae6fcd012" - }, - "apps-policy-dark" : { - "name" : "apps-policy-dark", - "rule" : ".apps-policy-dark", - "hash" : "2704a7b1f48628ca89cc863d56adcdd6" - }, - "apps-policy-white" : { - "name" : "apps-policy-white", - "rule" : ".apps-policy-white", - "hash" : "53571de9f0025688d71f1f65aff23b00" - }, - "apps-ponder-dark" : { - "name" : "apps-ponder-dark", - "rule" : ".apps-ponder-dark", - "hash" : "2b38741f594a8c8501262dc5069b7ef1" - }, - "apps-ponder-white" : { - "name" : "apps-ponder-white", - "rule" : ".apps-ponder-white", - "hash" : "8177095a1bae6421f67395db4bc9fbd1" - }, - "apps-power-dark" : { - "name" : "apps-power-dark", - "rule" : ".apps-power-dark", - "hash" : "6203c8631039352f62884cb36862c53a" - }, - "apps-power-white" : { - "name" : "apps-power-white", - "rule" : ".apps-power-white", - "hash" : "fbc21eb5f7cd1c4b9944335cad012388" - }, - "apps-projects-dark" : { - "name" : "apps-projects-dark", - "rule" : ".apps-projects-dark", - "hash" : "c982e15e33f1ede39ece69f281300d52" - }, - "apps-projects-white" : { - "name" : "apps-projects-white", - "rule" : ".apps-projects-white", - "hash" : "84063e2f20613b2f36c232a33b633f4b" - }, - "apps-releeph-dark" : { - "name" : "apps-releeph-dark", - "rule" : ".apps-releeph-dark", - "hash" : "7f2ce7d637dac9200cdbdf39878e3448" - }, - "apps-releeph-white" : { - "name" : "apps-releeph-white", - "rule" : ".apps-releeph-white", - "hash" : "a0b09bcb3ac6f654485dc8b8c100e769" - }, - "apps-repositories-dark" : { - "name" : "apps-repositories-dark", - "rule" : ".apps-repositories-dark", - "hash" : "6703a039b6d3fe08a15d358c25febe91" - }, - "apps-repositories-white" : { - "name" : "apps-repositories-white", - "rule" : ".apps-repositories-white", - "hash" : "848bb97c36e927353a097f2e7312841d" - }, - "apps-settings-dark" : { - "name" : "apps-settings-dark", - "rule" : ".apps-settings-dark", - "hash" : "a5ebbb89a36998a4f4a42e8ae43eedd2" - }, - "apps-settings-white" : { - "name" : "apps-settings-white", - "rule" : ".apps-settings-white", - "hash" : "ec11387921da7fef5a3b5e8e160a8565" - }, - "apps-setup-dark" : { - "name" : "apps-setup-dark", - "rule" : ".apps-setup-dark", - "hash" : "3d959dc32fab465dd68df57a19fcd64c" - }, - "apps-setup-white" : { - "name" : "apps-setup-white", - "rule" : ".apps-setup-white", - "hash" : "2625facb1900aee48168386418876f4f" - }, - "apps-slowvote-dark" : { - "name" : "apps-slowvote-dark", - "rule" : ".apps-slowvote-dark", - "hash" : "e5aeb00a1f7b70e20a41f7a494e2aad3" - }, - "apps-slowvote-white" : { - "name" : "apps-slowvote-white", - "rule" : ".apps-slowvote-white", - "hash" : "963b5c1bdad04d944f71a56e05f3160f" - }, - "apps-token-dark" : { - "name" : "apps-token-dark", - "rule" : ".apps-token-dark", - "hash" : "5a35e3577ace0fc01296aaefd77703b7" - }, - "apps-token-white" : { - "name" : "apps-token-white", - "rule" : ".apps-token-white", - "hash" : "f9704614e4690af63f8b2fa1bce1be88" - }, - "apps-uiexamples-dark" : { - "name" : "apps-uiexamples-dark", - "rule" : ".apps-uiexamples-dark", - "hash" : "78f717f6d01fcb9c636065218839d93a" - }, - "apps-uiexamples-white" : { - "name" : "apps-uiexamples-white", - "rule" : ".apps-uiexamples-white", - "hash" : "d1a649462c5fd374059011bb7f705d5b" - }, - "apps-workphlow-dark" : { - "name" : "apps-workphlow-dark", - "rule" : ".apps-workphlow-dark", - "hash" : "60df1eab180a860e4022b349c7e76a2e" - }, - "apps-workphlow-white" : { - "name" : "apps-workphlow-white", - "rule" : ".apps-workphlow-white", - "hash" : "5a5647193d080169b14d631e6fd6a702" - }, - "apps-xhprof-dark" : { - "name" : "apps-xhprof-dark", - "rule" : ".apps-xhprof-dark", - "hash" : "02b12b5beeb1a044699046247d065dc3" - }, - "apps-xhprof-white" : { - "name" : "apps-xhprof-white", - "rule" : ".apps-xhprof-white", - "hash" : "e2381887939895b4473a2a7d1423cdb6" - } - }, - "scales" : [ - 1, - 2 - ], - "header" : "\/**\n * @provides sprite-apps-css\n * @generated\n *\/\n\n.sprite-apps {\n background-image: url(http://rsrc//image//sprite-apps.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-apps {\n background-image: url(http://rsrc//image//sprite-apps-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", - "type" : "standard" -} diff --git a/resources/sprite/manifest/conpherence.json b/resources/sprite/manifest/conpherence.json deleted file mode 100644 index 1069045582..0000000000 --- a/resources/sprite/manifest/conpherence.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "conpherence_calendar_off" : { - "name" : "conpherence_calendar_off", - "rule" : ".conpherence_calendar_off", - "hash" : "e796dcc485ac1c7538077602dec9d19d" - }, - "conpherence_calendar_on" : { - "name" : "conpherence_calendar_on", - "rule" : ".conpherence_calendar_on, .device-desktop .conpherence_calendar_off:hover ", - "hash" : "da4b7152589b0eb36834bfeda6b55c69" - }, - "conpherence_conversation_off" : { - "name" : "conpherence_conversation_off", - "rule" : ".conpherence_conversation_off", - "hash" : "74cf53c92e7ad9ad3a852adfb0e655f4" - }, - "conpherence_conversation_on" : { - "name" : "conpherence_conversation_on", - "rule" : ".conpherence_conversation_on, .device-desktop .conpherence_conversation_off:hover ", - "hash" : "e8c73f0fcf11cf7fe1b252ede2211b34" - }, - "conpherence_files_off" : { - "name" : "conpherence_files_off", - "rule" : ".conpherence_files_off", - "hash" : "44643c3e1ac4eb2d46fbb256220e5957" - }, - "conpherence_files_on" : { - "name" : "conpherence_files_on", - "rule" : ".conpherence_files_on, .device-desktop .conpherence_files_off:hover ", - "hash" : "9f7bab94f1afcacce64762023ad53974" - }, - "conpherence_list_off" : { - "name" : "conpherence_list_off", - "rule" : ".conpherence_list_off", - "hash" : "28326e81ee1fb2c7b615f42a95d7429b" - }, - "conpherence_list_on" : { - "name" : "conpherence_list_on", - "rule" : ".conpherence_list_on, .device-desktop .conpherence_list_off:hover ", - "hash" : "ee13901236f1f5a7db2d682ddc6884ce" - }, - "conpherence_more_off" : { - "name" : "conpherence_more_off", - "rule" : ".conpherence_more_off", - "hash" : "2c0e47c834fa96248b70d7b8c9a4a931" - }, - "conpherence_more_on" : { - "name" : "conpherence_more_on", - "rule" : ".conpherence_more_on, .device-desktop .conpherence_more_off:hover ", - "hash" : "6eefff663beef44f01d438ddda54a8b7" - }, - "conpherence_people_off" : { - "name" : "conpherence_people_off", - "rule" : ".conpherence_people_off", - "hash" : "fccd3f5b8fe2e0af32dcb58b912153c9" - }, - "conpherence_people_on" : { - "name" : "conpherence_people_on", - "rule" : ".conpherence_people_on, .device-desktop .conpherence_people_off:hover ", - "hash" : "f959cea0c9d0f22aeefabc398e5d4ea7" - }, - "conpherence_settings_off" : { - "name" : "conpherence_settings_off", - "rule" : ".conpherence_settings_off", - "hash" : "b28d654205d852c92606cd18e229a390" - }, - "conpherence_settings_on" : { - "name" : "conpherence_settings_on", - "rule" : ".conpherence_settings_on, .device-desktop .conpherence_settings_off:hover ", - "hash" : "50b5f0920d22874ba3416bf6d796cfbd" - } - }, - "scales" : [ - 1, - 2 - ], - "header" : "\/**\n * @provides sprite-conpherence-css\n * @generated\n *\/\n\n.sprite-conpherence {\n background-image: url(http://rsrc//image//sprite-conpherence.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-conpherence {\n background-image: url(http://rsrc//image//sprite-conpherence-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", - "type" : "standard" -} diff --git a/resources/sprite/manifest/docs.json b/resources/sprite/manifest/docs.json deleted file mode 100644 index 2f9f6ecc58..0000000000 --- a/resources/sprite/manifest/docs.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "docs_audio" : { - "name" : "docs_audio", - "rule" : ".docs_audio", - "hash" : "673217354b0a2406be92be7d1d710422" - }, - "docs_doc" : { - "name" : "docs_doc", - "rule" : ".docs_doc", - "hash" : "5cc83abc67ba4b26bb898b35d75ebef7" - }, - "docs_file" : { - "name" : "docs_file", - "rule" : ".docs_file", - "hash" : "319218d4f65c766faac607a26ffa751e" - }, - "docs_image" : { - "name" : "docs_image", - "rule" : ".docs_image", - "hash" : "ee313b6b35435ef4c534614ea2a6182e" - }, - "docs_movie" : { - "name" : "docs_movie", - "rule" : ".docs_movie", - "hash" : "aa9f12307047adb1bda4f74d4376a57a" - }, - "docs_pdf" : { - "name" : "docs_pdf", - "rule" : ".docs_pdf", - "hash" : "a6e4a2cb8b8d0e6777e6010ab4d530b5" - }, - "docs_place" : { - "name" : "docs_place", - "rule" : ".docs_place", - "hash" : "7328b8d6c6d8440975f7f098a347a17e" - }, - "docs_zip" : { - "name" : "docs_zip", - "rule" : ".docs_zip", - "hash" : "d6b11a4d6217356fe7c488c729e6fc99" - } - }, - "scales" : [ - 1, - 2 - ], - "header" : "\/**\n * @provides sprite-docs-css\n * @generated\n *\/\n\n.sprite-docs {\n background-image: url(http://rsrc//image//sprite-docs.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-docs {\n background-image: url(http://rsrc//image//sprite-docs-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", - "type" : "standard" -} diff --git a/resources/sprite/manifest/gradient.json b/resources/sprite/manifest/gradient.json deleted file mode 100644 index b701841317..0000000000 --- a/resources/sprite/manifest/gradient.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "gradient-blue-header" : { - "name" : "gradient-blue-header", - "rule" : ".gradient-blue-header", - "hash" : "bcfc1d3e93ea8585af5b5ca52b08e944" - }, - "gradient-breadcrumbs" : { - "name" : "gradient-breadcrumbs", - "rule" : ".gradient-breadcrumbs", - "hash" : "ed46fe9544216513a3958900c688a808" - }, - "gradient-dark-grey-header" : { - "name" : "gradient-dark-grey-header", - "rule" : ".gradient-dark-grey-header", - "hash" : "e8762dd2849410a7e4fba8f972f946ff" - }, - "gradient-dark-menu-label" : { - "name" : "gradient-dark-menu-label", - "rule" : ".gradient-dark-menu-label, .phabricator-dark-menu .phui-list-item-type-label", - "hash" : "8a11efa454f788aa2419ed8c745dece2" - }, - "gradient-green-header" : { - "name" : "gradient-green-header", - "rule" : ".gradient-green-header", - "hash" : "848b563e846e187b688e899a9d838e40" - }, - "gradient-grey-header" : { - "name" : "gradient-grey-header", - "rule" : ".gradient-grey-header", - "hash" : "1c8f8d61984e3fc5a7e528b9bd4d484a" - }, - "gradient-menu-label" : { - "name" : "gradient-menu-label", - "rule" : ".gradient-menu-label, .phabricator-side-menu .phui-list-item-type-label", - "hash" : "e2aa8e74c3b2c0b18de34d336d318b5c" - }, - "gradient-red-header" : { - "name" : "gradient-red-header", - "rule" : ".gradient-red-header", - "hash" : "070a2e01f611bfaf5207be25eebdd6f2" - }, - "gradient-yellow-header" : { - "name" : "gradient-yellow-header", - "rule" : ".gradient-yellow-header", - "hash" : "166ee67c5201416cfa598c1eb86bf92a" - } - }, - "scales" : [ - 1 - ], - "header" : "\/**\n * @provides sprite-gradient-css\n * @generated\n *\/\n\n.sprite-gradient, .phabricator-dark-menu .phui-list-item-type-label, .phabricator-side-menu .phui-list-item-type-label {\n background-image: url(http://rsrc//image//sprite-gradient.png);\n background-repeat: repeat-x;\n}\n\n\n", - "type" : "repeat-x" -} diff --git a/resources/sprite/manifest/icons.json b/resources/sprite/manifest/icons.json deleted file mode 100644 index 820c73754f..0000000000 --- a/resources/sprite/manifest/icons.json +++ /dev/null @@ -1,1021 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "icons-action-menu" : { - "name" : "icons-action-menu", - "rule" : ".icons-action-menu", - "hash" : "65e2ba8ae2b70772681bd956b92dab8d" - }, - "icons-action-menu-grey" : { - "name" : "icons-action-menu-grey", - "rule" : ".icons-action-menu-grey", - "hash" : "06a54330a793bc0394df88255d373f98" - }, - "icons-action-menu-white" : { - "name" : "icons-action-menu-white", - "rule" : ".icons-action-menu-white, .device-desktop .phabricator-action-view:hover .icons-action-menu, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-action-menu", - "hash" : "00e485cb276b12e8b68a4cb0a8797f0e" - }, - "icons-arrow_left" : { - "name" : "icons-arrow_left", - "rule" : ".icons-arrow_left", - "hash" : "d169808216d441adc1e802932902575a" - }, - "icons-arrow_left-grey" : { - "name" : "icons-arrow_left-grey", - "rule" : ".icons-arrow_left-grey", - "hash" : "bcc1f969b43dbd8b06acfde05f733216" - }, - "icons-arrow_left-white" : { - "name" : "icons-arrow_left-white", - "rule" : ".icons-arrow_left-white, .device-desktop .phabricator-action-view:hover .icons-arrow_left, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-arrow_left", - "hash" : "d58023faf291b015bd661dd407ea4956" - }, - "icons-arrow_right" : { - "name" : "icons-arrow_right", - "rule" : ".icons-arrow_right", - "hash" : "23a210534e578aaef0ce0dbb4a447af9" - }, - "icons-arrow_right-grey" : { - "name" : "icons-arrow_right-grey", - "rule" : ".icons-arrow_right-grey", - "hash" : "7d7bbb08efcd1260071d9c9ba7360245" - }, - "icons-arrow_right-white" : { - "name" : "icons-arrow_right-white", - "rule" : ".icons-arrow_right-white, .device-desktop .phabricator-action-view:hover .icons-arrow_right, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-arrow_right", - "hash" : "49ab99fbd64d32d4b806e76822451bf8" - }, - "icons-attach" : { - "name" : "icons-attach", - "rule" : ".icons-attach", - "hash" : "71e3838577d3e25e22320f905a326130" - }, - "icons-attach-grey" : { - "name" : "icons-attach-grey", - "rule" : ".icons-attach-grey", - "hash" : "55199a40d4abc0c3deb818689dcacbf5" - }, - "icons-attach-white" : { - "name" : "icons-attach-white", - "rule" : ".icons-attach-white, .device-desktop .phabricator-action-view:hover .icons-attach, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-attach", - "hash" : "a0d3782a4236b48b37177e20c3693d79" - }, - "icons-blame" : { - "name" : "icons-blame", - "rule" : ".icons-blame", - "hash" : "563657dc650128faf135a475a1a969dc" - }, - "icons-blame-grey" : { - "name" : "icons-blame-grey", - "rule" : ".icons-blame-grey", - "hash" : "1ae83eb91ed65eb7b16600c2de3b95ae" - }, - "icons-blame-white" : { - "name" : "icons-blame-white", - "rule" : ".icons-blame-white, .device-desktop .phabricator-action-view:hover .icons-blame, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-blame", - "hash" : "cc0ce5ec8d7f8525de1104e6c431830a" - }, - "icons-check" : { - "name" : "icons-check", - "rule" : ".icons-check", - "hash" : "ad96ecaafbc22374be2d9433a8104baa" - }, - "icons-check-grey" : { - "name" : "icons-check-grey", - "rule" : ".icons-check-grey", - "hash" : "f6a5c2c73484d7a55355326c3b66ab72" - }, - "icons-check-white" : { - "name" : "icons-check-white", - "rule" : ".icons-check-white, .device-desktop .phabricator-action-view:hover .icons-check, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-check", - "hash" : "4f736c725aa17dced72790b9e289e4dd" - }, - "icons-comment" : { - "name" : "icons-comment", - "rule" : ".icons-comment", - "hash" : "bae84acfb9ffe4c52b4de9f7547a53ae" - }, - "icons-comment-grey" : { - "name" : "icons-comment-grey", - "rule" : ".icons-comment-grey", - "hash" : "5d6b6bc4578e99072f8374aae91e9845" - }, - "icons-comment-white" : { - "name" : "icons-comment-white", - "rule" : ".icons-comment-white, .device-desktop .phabricator-action-view:hover .icons-comment, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-comment", - "hash" : "01a6206d77662de8bcbe8e402ba493ee" - }, - "icons-computer" : { - "name" : "icons-computer", - "rule" : ".icons-computer", - "hash" : "7461e67f1d27249c2d543fd06f2bc23d" - }, - "icons-computer-grey" : { - "name" : "icons-computer-grey", - "rule" : ".icons-computer-grey", - "hash" : "303df3adea2acc2914057b9fd45600ff" - }, - "icons-computer-white" : { - "name" : "icons-computer-white", - "rule" : ".icons-computer-white, .device-desktop .phabricator-action-view:hover .icons-computer, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-computer", - "hash" : "eec30cac2b896348f48a6fed13f254d0" - }, - "icons-create" : { - "name" : "icons-create", - "rule" : ".icons-create", - "hash" : "9d66445b6c36b88ab1c56196de78c129" - }, - "icons-create-grey" : { - "name" : "icons-create-grey", - "rule" : ".icons-create-grey", - "hash" : "505df21d338c0d1ca8c5d6e2dc69f7fb" - }, - "icons-create-white" : { - "name" : "icons-create-white", - "rule" : ".icons-create-white, .device-desktop .phabricator-action-view:hover .icons-create, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-create", - "hash" : "4e1c0e227dce99c26d6f8bdbb3fa4b5b" - }, - "icons-delete" : { - "name" : "icons-delete", - "rule" : ".icons-delete", - "hash" : "4ce6010354e5d1e079ed3fc3547e37c1" - }, - "icons-delete-grey" : { - "name" : "icons-delete-grey", - "rule" : ".icons-delete-grey", - "hash" : "cd0175b3f09f9a68028bec8f23f4aefd" - }, - "icons-delete-white" : { - "name" : "icons-delete-white", - "rule" : ".icons-delete-white, .device-desktop .phabricator-action-view:hover .icons-delete, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-delete", - "hash" : "a925268a638431f331ab17915253347b" - }, - "icons-disable" : { - "name" : "icons-disable", - "rule" : ".icons-disable", - "hash" : "e4af79cb1958352075292f438ccfc799" - }, - "icons-disable-grey" : { - "name" : "icons-disable-grey", - "rule" : ".icons-disable-grey", - "hash" : "ebf2465329f5ff263718ef5f204fb173" - }, - "icons-disable-white" : { - "name" : "icons-disable-white", - "rule" : ".icons-disable-white, .device-desktop .phabricator-action-view:hover .icons-disable, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-disable", - "hash" : "3e4c405df5d7ee481bd35c571534104e" - }, - "icons-dislike" : { - "name" : "icons-dislike", - "rule" : ".icons-dislike", - "hash" : "32d6eaa69413349f3138c3d96d219c10" - }, - "icons-dislike-grey" : { - "name" : "icons-dislike-grey", - "rule" : ".icons-dislike-grey", - "hash" : "09b90ed2be402f9fcd888b044836fb72" - }, - "icons-dislike-white" : { - "name" : "icons-dislike-white", - "rule" : ".icons-dislike-white, .device-desktop .phabricator-action-view:hover .icons-dislike, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-dislike", - "hash" : "96b7063a9297f64ff775190e2923d90a" - }, - "icons-download" : { - "name" : "icons-download", - "rule" : ".icons-download", - "hash" : "63efe6aa0b39cd489249d70316dc179f" - }, - "icons-download-alt" : { - "name" : "icons-download-alt", - "rule" : ".icons-download-alt", - "hash" : "02a0724de9e1bad47a4ad4e27975c105" - }, - "icons-download-alt-grey" : { - "name" : "icons-download-alt-grey", - "rule" : ".icons-download-alt-grey", - "hash" : "d7e7b5156558de867f2308968f5ecca2" - }, - "icons-download-alt-white" : { - "name" : "icons-download-alt-white", - "rule" : ".icons-download-alt-white, .device-desktop .phabricator-action-view:hover .icons-download-alt, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-download-alt", - "hash" : "879d5757474e9fbdc87784a987fe4342" - }, - "icons-download-grey" : { - "name" : "icons-download-grey", - "rule" : ".icons-download-grey", - "hash" : "fe4e4fe31ca16e1242be52d6dca76ecd" - }, - "icons-download-white" : { - "name" : "icons-download-white", - "rule" : ".icons-download-white, .device-desktop .phabricator-action-view:hover .icons-download, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-download", - "hash" : "8a511b7c1c5dcf96ae4af895fd1e9e96" - }, - "icons-edit" : { - "name" : "icons-edit", - "rule" : ".icons-edit", - "hash" : "4f39c952ca119ddc3b6e146da2e32078" - }, - "icons-edit-grey" : { - "name" : "icons-edit-grey", - "rule" : ".icons-edit-grey", - "hash" : "fdcaf71d1d09fdb21799e640e8cbfcc5" - }, - "icons-edit-white" : { - "name" : "icons-edit-white", - "rule" : ".icons-edit-white, .device-desktop .phabricator-action-view:hover .icons-edit, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-edit", - "hash" : "9273b4d1a9f001aeba1eaac7ee4de00d" - }, - "icons-enable" : { - "name" : "icons-enable", - "rule" : ".icons-enable", - "hash" : "5740a70645b05def8409785778e7b8e3" - }, - "icons-enable-grey" : { - "name" : "icons-enable-grey", - "rule" : ".icons-enable-grey", - "hash" : "297e97b68cb96c95fbe88841959a0a00" - }, - "icons-enable-white" : { - "name" : "icons-enable-white", - "rule" : ".icons-enable-white, .device-desktop .phabricator-action-view:hover .icons-enable, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-enable", - "hash" : "e00d26ac67a0e1694b92c4a906930f9f" - }, - "icons-file" : { - "name" : "icons-file", - "rule" : ".icons-file", - "hash" : "917ea2dbb1bb7ff2c98a774d33e825f7" - }, - "icons-file-grey" : { - "name" : "icons-file-grey", - "rule" : ".icons-file-grey", - "hash" : "93a8ad80fbd4747ebc77d8efddf0968a" - }, - "icons-file-white" : { - "name" : "icons-file-white", - "rule" : ".icons-file-white, .device-desktop .phabricator-action-view:hover .icons-file, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-file", - "hash" : "0a89623e32b4a1aa86e79a3a8fe6927e" - }, - "icons-flag" : { - "name" : "icons-flag", - "rule" : ".icons-flag", - "hash" : "47abea6d5ef3483972861efb7ccf96f4" - }, - "icons-flag-0" : { - "name" : "icons-flag-0", - "rule" : ".icons-flag-0", - "hash" : "f3f4b6597b2b571ad501db31368ea015" - }, - "icons-flag-0-grey" : { - "name" : "icons-flag-0-grey", - "rule" : ".icons-flag-0-grey", - "hash" : "e1d8858e73b6becdd1922509ac577941" - }, - "icons-flag-0-white" : { - "name" : "icons-flag-0-white", - "rule" : ".icons-flag-0-white, .device-desktop .phabricator-action-view:hover .icons-flag-0, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-0", - "hash" : "8956801c3c7a64593ec204214e7e6a91" - }, - "icons-flag-1" : { - "name" : "icons-flag-1", - "rule" : ".icons-flag-1", - "hash" : "d5c1900344c2d95b1624815fa75e963b" - }, - "icons-flag-1-grey" : { - "name" : "icons-flag-1-grey", - "rule" : ".icons-flag-1-grey", - "hash" : "266078ea18a952fa2d716dfef005bf89" - }, - "icons-flag-1-white" : { - "name" : "icons-flag-1-white", - "rule" : ".icons-flag-1-white, .device-desktop .phabricator-action-view:hover .icons-flag-1, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-1", - "hash" : "934fbe409d902a7cd4dc44c9143af15a" - }, - "icons-flag-2" : { - "name" : "icons-flag-2", - "rule" : ".icons-flag-2", - "hash" : "146fe0b438014059bd33666d6b608236" - }, - "icons-flag-2-grey" : { - "name" : "icons-flag-2-grey", - "rule" : ".icons-flag-2-grey", - "hash" : "3226192d89efc04fed632cee46eabfb1" - }, - "icons-flag-2-white" : { - "name" : "icons-flag-2-white", - "rule" : ".icons-flag-2-white, .device-desktop .phabricator-action-view:hover .icons-flag-2, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-2", - "hash" : "da99be78ec09dce320c50d9605f61874" - }, - "icons-flag-3" : { - "name" : "icons-flag-3", - "rule" : ".icons-flag-3", - "hash" : "870ca70bce72d14179ca7c769d458420" - }, - "icons-flag-3-grey" : { - "name" : "icons-flag-3-grey", - "rule" : ".icons-flag-3-grey", - "hash" : "bd42b4cdfbb8d9a66c5608433c7a3cb6" - }, - "icons-flag-3-white" : { - "name" : "icons-flag-3-white", - "rule" : ".icons-flag-3-white, .device-desktop .phabricator-action-view:hover .icons-flag-3, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-3", - "hash" : "71a909a95c5c5c6142f9437ebac62a1f" - }, - "icons-flag-4" : { - "name" : "icons-flag-4", - "rule" : ".icons-flag-4", - "hash" : "d134b3302e5e6f1e01686bedd7af9cb7" - }, - "icons-flag-4-grey" : { - "name" : "icons-flag-4-grey", - "rule" : ".icons-flag-4-grey", - "hash" : "72bbfc34f79f8a80e19029de75c05e6c" - }, - "icons-flag-4-white" : { - "name" : "icons-flag-4-white", - "rule" : ".icons-flag-4-white, .device-desktop .phabricator-action-view:hover .icons-flag-4, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-4", - "hash" : "97d1b55bd2e5d197c21f82a2fc015f75" - }, - "icons-flag-5" : { - "name" : "icons-flag-5", - "rule" : ".icons-flag-5", - "hash" : "d8b41d6fa77d3b96dc3fcac1a2b8dfb0" - }, - "icons-flag-5-grey" : { - "name" : "icons-flag-5-grey", - "rule" : ".icons-flag-5-grey", - "hash" : "478f17d5e70fea8b60f513d0559c9190" - }, - "icons-flag-5-white" : { - "name" : "icons-flag-5-white", - "rule" : ".icons-flag-5-white, .device-desktop .phabricator-action-view:hover .icons-flag-5, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-5", - "hash" : "3bf3156e44bf223c8b5c8114c80162dd" - }, - "icons-flag-6" : { - "name" : "icons-flag-6", - "rule" : ".icons-flag-6", - "hash" : "1d64ef628490489bca1a948bea4ae066" - }, - "icons-flag-6-grey" : { - "name" : "icons-flag-6-grey", - "rule" : ".icons-flag-6-grey", - "hash" : "07e41e9c8588851558073f99cbb71bcd" - }, - "icons-flag-6-white" : { - "name" : "icons-flag-6-white", - "rule" : ".icons-flag-6-white, .device-desktop .phabricator-action-view:hover .icons-flag-6, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-6", - "hash" : "7e41da9a5e36702a7ab4c94f4eb2ac1e" - }, - "icons-flag-7" : { - "name" : "icons-flag-7", - "rule" : ".icons-flag-7", - "hash" : "efd7613fcc723fc43daab20069867092" - }, - "icons-flag-7-grey" : { - "name" : "icons-flag-7-grey", - "rule" : ".icons-flag-7-grey", - "hash" : "9a6a040f317b38974573feafa66b5ed5" - }, - "icons-flag-7-white" : { - "name" : "icons-flag-7-white", - "rule" : ".icons-flag-7-white, .device-desktop .phabricator-action-view:hover .icons-flag-7, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-7", - "hash" : "84db1652537190f27d419dd3e3183907" - }, - "icons-flag-ghost" : { - "name" : "icons-flag-ghost", - "rule" : ".icons-flag-ghost", - "hash" : "fc16021d6e1f8aa1ece0f7838a32d297" - }, - "icons-flag-ghost-grey" : { - "name" : "icons-flag-ghost-grey", - "rule" : ".icons-flag-ghost-grey", - "hash" : "202359b6cde4d47097d50070e593745b" - }, - "icons-flag-ghost-white" : { - "name" : "icons-flag-ghost-white", - "rule" : ".icons-flag-ghost-white, .device-desktop .phabricator-action-view:hover .icons-flag-ghost, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-ghost", - "hash" : "b8d7d1fc2d97ad43b57c7d6fb2d10d54" - }, - "icons-flag-grey" : { - "name" : "icons-flag-grey", - "rule" : ".icons-flag-grey", - "hash" : "d351908777fd3cdeb0b464569baabf8e" - }, - "icons-flag-white" : { - "name" : "icons-flag-white", - "rule" : ".icons-flag-white, .device-desktop .phabricator-action-view:hover .icons-flag, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag", - "hash" : "d02ba761bfefc1aa90d8a554479d1d52" - }, - "icons-folder-open" : { - "name" : "icons-folder-open", - "rule" : ".icons-folder-open", - "hash" : "830d8ed00f23d63911f8105cadf49511" - }, - "icons-folder-open-grey" : { - "name" : "icons-folder-open-grey", - "rule" : ".icons-folder-open-grey", - "hash" : "ff45683f3c69768ced2ce89514d7f9d8" - }, - "icons-folder-open-white" : { - "name" : "icons-folder-open-white", - "rule" : ".icons-folder-open-white, .device-desktop .phabricator-action-view:hover .icons-folder-open, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-folder-open", - "hash" : "7ee2ccc6b3a04a524f6368b229d37f70" - }, - "icons-fork" : { - "name" : "icons-fork", - "rule" : ".icons-fork", - "hash" : "10b507d0fa52b5951843cc39adae77b8" - }, - "icons-fork-grey" : { - "name" : "icons-fork-grey", - "rule" : ".icons-fork-grey", - "hash" : "b863bd1f8eb4fc070d0093288ec55ce3" - }, - "icons-fork-white" : { - "name" : "icons-fork-white", - "rule" : ".icons-fork-white, .device-desktop .phabricator-action-view:hover .icons-fork, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-fork", - "hash" : "fb3f6ce20dccc2e2520cf18b2490a8cc" - }, - "icons-herald" : { - "name" : "icons-herald", - "rule" : ".icons-herald", - "hash" : "ef8460234cf18474fb9cc0555794d372" - }, - "icons-herald-grey" : { - "name" : "icons-herald-grey", - "rule" : ".icons-herald-grey", - "hash" : "7b59f18f6d69b073dfdf4c1f3b4509b9" - }, - "icons-herald-white" : { - "name" : "icons-herald-white", - "rule" : ".icons-herald-white, .device-desktop .phabricator-action-view:hover .icons-herald, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-herald", - "hash" : "30ca9558082b29a8d97f0345e55dd080" - }, - "icons-highlight" : { - "name" : "icons-highlight", - "rule" : ".icons-highlight", - "hash" : "05b81eadbf2fe63826a76594ccbebb16" - }, - "icons-highlight-grey" : { - "name" : "icons-highlight-grey", - "rule" : ".icons-highlight-grey", - "hash" : "1db34e1c24abe148cb5261f9dd50b779" - }, - "icons-highlight-white" : { - "name" : "icons-highlight-white", - "rule" : ".icons-highlight-white, .device-desktop .phabricator-action-view:hover .icons-highlight, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-highlight", - "hash" : "f595c9b5e3de3125c1e46d9c01a49534" - }, - "icons-history" : { - "name" : "icons-history", - "rule" : ".icons-history", - "hash" : "4052fe2ea4e21d729a7d1a3be726e8ab" - }, - "icons-history-grey" : { - "name" : "icons-history-grey", - "rule" : ".icons-history-grey", - "hash" : "5a03ae7415b7690e34f627cac52d61c1" - }, - "icons-history-white" : { - "name" : "icons-history-white", - "rule" : ".icons-history-white, .device-desktop .phabricator-action-view:hover .icons-history, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-history", - "hash" : "abf579dc51ba5e04544d2eaf45df155c" - }, - "icons-home" : { - "name" : "icons-home", - "rule" : ".icons-home", - "hash" : "48c2bcd5ed33e5a808f61c2d844f6a75" - }, - "icons-home-grey" : { - "name" : "icons-home-grey", - "rule" : ".icons-home-grey", - "hash" : "6a6eb1de1faec35570a474a750f5737e" - }, - "icons-home-white" : { - "name" : "icons-home-white", - "rule" : ".icons-home-white, .device-desktop .phabricator-action-view:hover .icons-home, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-home", - "hash" : "103dc5430ffd3a5a1c9460d1ec7fe390" - }, - "icons-image" : { - "name" : "icons-image", - "rule" : ".icons-image", - "hash" : "74b401bc7280b733bb8db5e05c604a46" - }, - "icons-image-grey" : { - "name" : "icons-image-grey", - "rule" : ".icons-image-grey", - "hash" : "de732c7cb12bdcf0e5789f4219025fdb" - }, - "icons-image-white" : { - "name" : "icons-image-white", - "rule" : ".icons-image-white, .device-desktop .phabricator-action-view:hover .icons-image, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-image", - "hash" : "f5335904fbc92dfe42f0f6d82c0ab718" - }, - "icons-like" : { - "name" : "icons-like", - "rule" : ".icons-like", - "hash" : "95f7080949554dfdc0543ca334a43574" - }, - "icons-like-grey" : { - "name" : "icons-like-grey", - "rule" : ".icons-like-grey", - "hash" : "7ad4b955bfdc233313796cc83167acd3" - }, - "icons-like-white" : { - "name" : "icons-like-white", - "rule" : ".icons-like-white, .device-desktop .phabricator-action-view:hover .icons-like, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-like", - "hash" : "0465339035bb3bc0eb2649c9e1f91fd6" - }, - "icons-link" : { - "name" : "icons-link", - "rule" : ".icons-link", - "hash" : "e29582e73b0f7ffc6f70e2dc82f4f6cf" - }, - "icons-link-grey" : { - "name" : "icons-link-grey", - "rule" : ".icons-link-grey", - "hash" : "0ab806b95cf230ba14793b78d4f88aaa" - }, - "icons-link-white" : { - "name" : "icons-link-white", - "rule" : ".icons-link-white, .device-desktop .phabricator-action-view:hover .icons-link, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-link", - "hash" : "77b91a595f24007ebeb492938efae34a" - }, - "icons-lint-info" : { - "name" : "icons-lint-info", - "rule" : ".icons-lint-info", - "hash" : "4b1b6d8fef8c579988d55c4d6598d5a1" - }, - "icons-lint-info-grey" : { - "name" : "icons-lint-info-grey", - "rule" : ".icons-lint-info-grey", - "hash" : "ee429b622234bffe66b9f15fd7a4522a" - }, - "icons-lint-info-white" : { - "name" : "icons-lint-info-white", - "rule" : ".icons-lint-info-white, .device-desktop .phabricator-action-view:hover .icons-lint-info, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-lint-info", - "hash" : "5bf95b49dda78bc78f98ca81dcaa88ef" - }, - "icons-lint-ok" : { - "name" : "icons-lint-ok", - "rule" : ".icons-lint-ok", - "hash" : "a54d302e96bbb3098f6635fc105891d7" - }, - "icons-lint-ok-grey" : { - "name" : "icons-lint-ok-grey", - "rule" : ".icons-lint-ok-grey", - "hash" : "38033eaf7099d305d854454cd7173d77" - }, - "icons-lint-ok-white" : { - "name" : "icons-lint-ok-white", - "rule" : ".icons-lint-ok-white, .device-desktop .phabricator-action-view:hover .icons-lint-ok, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-lint-ok", - "hash" : "58103f905dffb698b31a516000cee50d" - }, - "icons-lint-warning" : { - "name" : "icons-lint-warning", - "rule" : ".icons-lint-warning", - "hash" : "f81b7d73f4c7950f04bbf3d98395cf92" - }, - "icons-lint-warning-grey" : { - "name" : "icons-lint-warning-grey", - "rule" : ".icons-lint-warning-grey", - "hash" : "0c6d42c1553ddd41ddef16dc8ad26dd7" - }, - "icons-lint-warning-white" : { - "name" : "icons-lint-warning-white", - "rule" : ".icons-lint-warning-white, .device-desktop .phabricator-action-view:hover .icons-lint-warning, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-lint-warning", - "hash" : "0f4dc192c9c136447fc7108f8f124db8" - }, - "icons-lock" : { - "name" : "icons-lock", - "rule" : ".icons-lock", - "hash" : "3b9e9c334c7bf06bae829904e71fb42e" - }, - "icons-lock-grey" : { - "name" : "icons-lock-grey", - "rule" : ".icons-lock-grey", - "hash" : "a2a1aebe1dbfdcc3bc60fe492907e512" - }, - "icons-lock-white" : { - "name" : "icons-lock-white", - "rule" : ".icons-lock-white, .device-desktop .phabricator-action-view:hover .icons-lock, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-lock", - "hash" : "5813bd52f85bae662dd38dd6b1a32a60" - }, - "icons-love" : { - "name" : "icons-love", - "rule" : ".icons-love", - "hash" : "1d9343dfe4f31f35a98129bb820f8f70" - }, - "icons-love-grey" : { - "name" : "icons-love-grey", - "rule" : ".icons-love-grey", - "hash" : "b0aa69532698fc719dccda38d8b56829" - }, - "icons-love-white" : { - "name" : "icons-love-white", - "rule" : ".icons-love-white, .device-desktop .phabricator-action-view:hover .icons-love, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-love", - "hash" : "65591f2e20b95779aae3d35980e093f5" - }, - "icons-merge" : { - "name" : "icons-merge", - "rule" : ".icons-merge", - "hash" : "3ab92aba7c7e15ddadd08215507665e5" - }, - "icons-merge-grey" : { - "name" : "icons-merge-grey", - "rule" : ".icons-merge-grey", - "hash" : "599e8881d590d393c26e0894ae92374a" - }, - "icons-merge-white" : { - "name" : "icons-merge-white", - "rule" : ".icons-merge-white, .device-desktop .phabricator-action-view:hover .icons-merge, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-merge", - "hash" : "c14463222f2f72ef6e4cfea24cf19ac8" - }, - "icons-message" : { - "name" : "icons-message", - "rule" : ".icons-message", - "hash" : "2c9e5f8c97c0a8aff2507debdfc4b2eb" - }, - "icons-message-grey" : { - "name" : "icons-message-grey", - "rule" : ".icons-message-grey", - "hash" : "0e1689ec1e6aa084a145345e1d3aaa29" - }, - "icons-message-white" : { - "name" : "icons-message-white", - "rule" : ".icons-message-white, .device-desktop .phabricator-action-view:hover .icons-message, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-message", - "hash" : "fcbfde0adc3e8b35dc958becb3a58ca0" - }, - "icons-meta-mta" : { - "name" : "icons-meta-mta", - "rule" : ".icons-meta-mta", - "hash" : "c8b4bf1f8f412f9d00d4c15f933f7ad8" - }, - "icons-meta-mta-grey" : { - "name" : "icons-meta-mta-grey", - "rule" : ".icons-meta-mta-grey", - "hash" : "3094645fced02010379d28777614e02e" - }, - "icons-meta-mta-white" : { - "name" : "icons-meta-mta-white", - "rule" : ".icons-meta-mta-white, .device-desktop .phabricator-action-view:hover .icons-meta-mta, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-meta-mta", - "hash" : "a28fcf8fcdd8ea48121887229a930b3f" - }, - "icons-move" : { - "name" : "icons-move", - "rule" : ".icons-move", - "hash" : "57aa74bcafdd7aa48252b64a96b97cc0" - }, - "icons-move-grey" : { - "name" : "icons-move-grey", - "rule" : ".icons-move-grey", - "hash" : "7f5b89922fb2821e8cd585f207586be3" - }, - "icons-move-white" : { - "name" : "icons-move-white", - "rule" : ".icons-move-white, .device-desktop .phabricator-action-view:hover .icons-move, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-move", - "hash" : "e8d5332802c299f4ffa244091ca0d2f4" - }, - "icons-new" : { - "name" : "icons-new", - "rule" : ".icons-new", - "hash" : "a1093da650bf34b06ce3eb5858a0b690" - }, - "icons-new-grey" : { - "name" : "icons-new-grey", - "rule" : ".icons-new-grey", - "hash" : "8e68779e747c4254a6e39001be3b6417" - }, - "icons-new-white" : { - "name" : "icons-new-white", - "rule" : ".icons-new-white, .device-desktop .phabricator-action-view:hover .icons-new, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-new", - "hash" : "58d004330176465bf3f0ffe1fa5dea29" - }, - "icons-none" : { - "name" : "icons-none", - "rule" : ".icons-none", - "hash" : "62d022adcd678d325ea77f25f85c6256" - }, - "icons-none-grey" : { - "name" : "icons-none-grey", - "rule" : ".icons-none-grey", - "hash" : "f9cb85a0e7bba19ea05097c8e24c1e92" - }, - "icons-none-white" : { - "name" : "icons-none-white", - "rule" : ".icons-none-white, .device-desktop .phabricator-action-view:hover .icons-none, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-none", - "hash" : "d3a9680ac5eb860e3ccd131f43bc1fc2" - }, - "icons-perflab" : { - "name" : "icons-perflab", - "rule" : ".icons-perflab", - "hash" : "778efccfdd04b600ee32a5b4c0766d41" - }, - "icons-perflab-grey" : { - "name" : "icons-perflab-grey", - "rule" : ".icons-perflab-grey", - "hash" : "21974a9dafcf5a0fe4fe8e4571f454af" - }, - "icons-perflab-white" : { - "name" : "icons-perflab-white", - "rule" : ".icons-perflab-white, .device-desktop .phabricator-action-view:hover .icons-perflab, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-perflab", - "hash" : "0df59548a5457b0ad14221f423e5f076" - }, - "icons-preview" : { - "name" : "icons-preview", - "rule" : ".icons-preview", - "hash" : "2609f00411819035afaddb8ee8a479bc" - }, - "icons-preview-grey" : { - "name" : "icons-preview-grey", - "rule" : ".icons-preview-grey", - "hash" : "6fc0ddad110142b6d1ea5304c8eb0db3" - }, - "icons-preview-white" : { - "name" : "icons-preview-white", - "rule" : ".icons-preview-white, .device-desktop .phabricator-action-view:hover .icons-preview, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-preview", - "hash" : "583d874475402c09d5a07a9987fa7010" - }, - "icons-refresh" : { - "name" : "icons-refresh", - "rule" : ".icons-refresh", - "hash" : "65a52be4f92b5789887e4210b0bc068f" - }, - "icons-refresh-grey" : { - "name" : "icons-refresh-grey", - "rule" : ".icons-refresh-grey", - "hash" : "76e1d2922372d65710cff998eb0df5fc" - }, - "icons-refresh-white" : { - "name" : "icons-refresh-white", - "rule" : ".icons-refresh-white, .device-desktop .phabricator-action-view:hover .icons-refresh, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-refresh", - "hash" : "fa2e6930785778cf4b33b2c7801e0799" - }, - "icons-remove" : { - "name" : "icons-remove", - "rule" : ".icons-remove", - "hash" : "e3eb5751303b60dee572d3c3d58b3c62" - }, - "icons-remove-grey" : { - "name" : "icons-remove-grey", - "rule" : ".icons-remove-grey", - "hash" : "b9920281c9a3e19dd06eb65de7097f9b" - }, - "icons-remove-white" : { - "name" : "icons-remove-white", - "rule" : ".icons-remove-white, .device-desktop .phabricator-action-view:hover .icons-remove, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-remove", - "hash" : "7c3010fb4596d60360153e1b4f563d54" - }, - "icons-search" : { - "name" : "icons-search", - "rule" : ".icons-search", - "hash" : "9925542d944ac80893c083968c419122" - }, - "icons-search-grey" : { - "name" : "icons-search-grey", - "rule" : ".icons-search-grey", - "hash" : "ef578a051632428b2bc478f584c5e710" - }, - "icons-search-white" : { - "name" : "icons-search-white", - "rule" : ".icons-search-white, .device-desktop .phabricator-action-view:hover .icons-search, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-search", - "hash" : "36d2ea64eff865d5844c6b0d20e479d2" - }, - "icons-start-sandcastle" : { - "name" : "icons-start-sandcastle", - "rule" : ".icons-start-sandcastle", - "hash" : "ec9fe980b67e45c656f3ccef1ca77f8e" - }, - "icons-start-sandcastle-grey" : { - "name" : "icons-start-sandcastle-grey", - "rule" : ".icons-start-sandcastle-grey", - "hash" : "ff691f363c72e6a894c1c59949f80ebf" - }, - "icons-start-sandcastle-white" : { - "name" : "icons-start-sandcastle-white", - "rule" : ".icons-start-sandcastle-white, .device-desktop .phabricator-action-view:hover .icons-start-sandcastle, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-start-sandcastle", - "hash" : "e450750eb2390d8755d139e817afea37" - }, - "icons-tag" : { - "name" : "icons-tag", - "rule" : ".icons-tag", - "hash" : "f0a8eafada702126adbb87d66605950d" - }, - "icons-tag-grey" : { - "name" : "icons-tag-grey", - "rule" : ".icons-tag-grey", - "hash" : "b3f1cb29cfa6a2ac8b93ede5669bb59f" - }, - "icons-tag-white" : { - "name" : "icons-tag-white", - "rule" : ".icons-tag-white, .device-desktop .phabricator-action-view:hover .icons-tag, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-tag", - "hash" : "4a2f8b30fcc5cfad8d47137709e5ea4a" - }, - "icons-transcript" : { - "name" : "icons-transcript", - "rule" : ".icons-transcript", - "hash" : "faca2bcc0e762a78d1f2f9b511c58f55" - }, - "icons-transcript-grey" : { - "name" : "icons-transcript-grey", - "rule" : ".icons-transcript-grey", - "hash" : "c0fe7f6e9b306b870a1b414da0de4743" - }, - "icons-transcript-white" : { - "name" : "icons-transcript-white", - "rule" : ".icons-transcript-white, .device-desktop .phabricator-action-view:hover .icons-transcript, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-transcript", - "hash" : "7fff355a64cc625b90ede8a025ef79d6" - }, - "icons-undo" : { - "name" : "icons-undo", - "rule" : ".icons-undo", - "hash" : "53d714d08f86176054121d35c4b7767c" - }, - "icons-undo-grey" : { - "name" : "icons-undo-grey", - "rule" : ".icons-undo-grey", - "hash" : "caa0abaa26b8b601d0d6461227e1b937" - }, - "icons-undo-white" : { - "name" : "icons-undo-white", - "rule" : ".icons-undo-white, .device-desktop .phabricator-action-view:hover .icons-undo, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-undo", - "hash" : "b84c09647af16dc40068e18ff7b16259" - }, - "icons-unlock" : { - "name" : "icons-unlock", - "rule" : ".icons-unlock", - "hash" : "d538a48be073c223c36497c235a2d009" - }, - "icons-unlock-grey" : { - "name" : "icons-unlock-grey", - "rule" : ".icons-unlock-grey", - "hash" : "6ef964e38e4085d73974bdb35bc5b9a6" - }, - "icons-unlock-white" : { - "name" : "icons-unlock-white", - "rule" : ".icons-unlock-white, .device-desktop .phabricator-action-view:hover .icons-unlock, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-unlock", - "hash" : "4bb6ef8b729edb00f85a0ad348c8e199" - }, - "icons-unmerge" : { - "name" : "icons-unmerge", - "rule" : ".icons-unmerge", - "hash" : "9964316f79ccee26b51921b37247cf03" - }, - "icons-unmerge-grey" : { - "name" : "icons-unmerge-grey", - "rule" : ".icons-unmerge-grey", - "hash" : "6871ad2a40473510de495d70817c5f67" - }, - "icons-unmerge-white" : { - "name" : "icons-unmerge-white", - "rule" : ".icons-unmerge-white, .device-desktop .phabricator-action-view:hover .icons-unmerge, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-unmerge", - "hash" : "ab9c5cdac57461d6a903e58c27ec93c1" - }, - "icons-unpublish" : { - "name" : "icons-unpublish", - "rule" : ".icons-unpublish", - "hash" : "650363d129ee8e8fc081799762974b77" - }, - "icons-unpublish-grey" : { - "name" : "icons-unpublish-grey", - "rule" : ".icons-unpublish-grey", - "hash" : "d50a34ab878fe3d76039a6eca5f6f806" - }, - "icons-unpublish-white" : { - "name" : "icons-unpublish-white", - "rule" : ".icons-unpublish-white, .device-desktop .phabricator-action-view:hover .icons-unpublish, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-unpublish", - "hash" : "12e7cf6eefc9ac159cdeb47cfdde4aa3" - }, - "icons-upload" : { - "name" : "icons-upload", - "rule" : ".icons-upload", - "hash" : "a7a0b86a23843814f8ad98a85030170b" - }, - "icons-upload-grey" : { - "name" : "icons-upload-grey", - "rule" : ".icons-upload-grey", - "hash" : "c5ec0fcd4321811fff94d53121fc025f" - }, - "icons-upload-white" : { - "name" : "icons-upload-white", - "rule" : ".icons-upload-white, .device-desktop .phabricator-action-view:hover .icons-upload, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-upload", - "hash" : "e957fb2f8605218897bb71e17caaeb16" - }, - "icons-warning" : { - "name" : "icons-warning", - "rule" : ".icons-warning", - "hash" : "27b805e846abfa081f2548b29dc797f1" - }, - "icons-warning-grey" : { - "name" : "icons-warning-grey", - "rule" : ".icons-warning-grey", - "hash" : "ef7b213af8cf0d304ef1d2447f0ba2e0" - }, - "icons-warning-white" : { - "name" : "icons-warning-white", - "rule" : ".icons-warning-white, .device-desktop .phabricator-action-view:hover .icons-warning, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-warning", - "hash" : "8dac77f60d83285f82ab543782d5dfa3" - }, - "icons-world" : { - "name" : "icons-world", - "rule" : ".icons-world", - "hash" : "74589cec2eb953ad9f123ba453fe94bc" - }, - "icons-world-grey" : { - "name" : "icons-world-grey", - "rule" : ".icons-world-grey", - "hash" : "28d84600d47fd96aaab6614cd87e6440" - }, - "icons-world-white" : { - "name" : "icons-world-white", - "rule" : ".icons-world-white, .device-desktop .phabricator-action-view:hover .icons-world, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-world", - "hash" : "47723b84d57aedc684a27c7e2478cc01" - }, - "remarkup-assist-text_b" : { - "name" : "remarkup-assist-text_b", - "rule" : ".remarkup-assist-b", - "hash" : "ba8a8f8928f2f90e7acd024df8bdee3b" - }, - "remarkup-assist-text_chaos" : { - "name" : "remarkup-assist-text_chaos", - "rule" : ".remarkup-assist-chaos", - "hash" : "bb1aef83db3a29d6195c3645455a0612" - }, - "remarkup-assist-text_chaos_off" : { - "name" : "remarkup-assist-text_chaos_off", - "rule" : ".remarkup-control-chaos-mode .remarkup-assist-chaos", - "hash" : "fbc06cba91aa69d7e0c9fac1521a49b2" - }, - "remarkup-assist-text_code" : { - "name" : "remarkup-assist-text_code", - "rule" : ".remarkup-assist-code", - "hash" : "b8a03a1004074f0582e77eb4f916b00b" - }, - "remarkup-assist-text_help" : { - "name" : "remarkup-assist-text_help", - "rule" : ".remarkup-assist-help", - "hash" : "106f56bad2932f523cbf1a62ab12b681" - }, - "remarkup-assist-text_i" : { - "name" : "remarkup-assist-text_i", - "rule" : ".remarkup-assist-i", - "hash" : "d9b1a0629d40edd5d32d3e6e21ec1574" - }, - "remarkup-assist-text_image" : { - "name" : "remarkup-assist-text_image", - "rule" : ".remarkup-assist-image", - "hash" : "e97dc0b4c9a947a70b8fece9e443f230" - }, - "remarkup-assist-text_larger" : { - "name" : "remarkup-assist-text_larger", - "rule" : ".remarkup-assist-larger", - "hash" : "05909067a2513b9b664b313974643ce3" - }, - "remarkup-assist-text_meme" : { - "name" : "remarkup-assist-text_meme", - "rule" : ".remarkup-assist-meme", - "hash" : "3fa5e69cfc12cd5eba038b48f1efb6c5" - }, - "remarkup-assist-text_ol" : { - "name" : "remarkup-assist-text_ol", - "rule" : ".remarkup-assist-ol", - "hash" : "b1964f62cb2c3cd6ed12bb04522a22c7" - }, - "remarkup-assist-text_order" : { - "name" : "remarkup-assist-text_order", - "rule" : ".remarkup-assist-order", - "hash" : "2d7703bbc4fd398d0ea63b7ae01e78a8" - }, - "remarkup-assist-text_order_off" : { - "name" : "remarkup-assist-text_order_off", - "rule" : ".remarkup-control-order-mode .remarkup-assist-order", - "hash" : "62b739e644e55e5d34a7f5fa465e504a" - }, - "remarkup-assist-text_table" : { - "name" : "remarkup-assist-text_table", - "rule" : ".remarkup-assist-table", - "hash" : "95fffc501412b323fbdccc98f5bb595c" - }, - "remarkup-assist-text_tag" : { - "name" : "remarkup-assist-text_tag", - "rule" : ".remarkup-assist-tag", - "hash" : "49ed577b1081dd44f60325795468c8ad" - }, - "remarkup-assist-text_tt" : { - "name" : "remarkup-assist-text_tt", - "rule" : ".remarkup-assist-tt", - "hash" : "3c8753b5df23a2a48348cb4ef86b3c02" - }, - "remarkup-assist-text_ul" : { - "name" : "remarkup-assist-text_ul", - "rule" : ".remarkup-assist-ul", - "hash" : "6b1add427c45ed676b9b7f220f16513a" - } - }, - "scales" : [ - 1, - 2 - ], - "header" : "\/**\n * @provides sprite-icons-css\n * @generated\n *\/\n\n.sprite-icons {\n background-image: url(http://rsrc//image//sprite-icons.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-icons {\n background-image: url(http://rsrc//image//sprite-icons-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", - "type" : "standard" -} diff --git a/resources/sprite/manifest/login.json b/resources/sprite/manifest/login.json index 39f4b2f085..59312820e1 100644 --- a/resources/sprite/manifest/login.json +++ b/resources/sprite/manifest/login.json @@ -1,96 +1,116 @@ { - "version" : 1, - "sprites" : { - "login-Amazon" : { - "name" : "login-Amazon", - "rule" : ".login-Amazon", - "hash" : "5961e41c525ef46c88558616fcf23272" - }, - "login-Asana" : { - "name" : "login-Asana", - "rule" : ".login-Asana", - "hash" : "30df492eab339fa64c9ae9b21bb46a18" - }, - "login-Disqus" : { - "name" : "login-Disqus", - "rule" : ".login-Disqus", - "hash" : "5f46ac50a5d9d13245971c298f49e13b" - }, - "login-Dropbox" : { - "name" : "login-Dropbox", - "rule" : ".login-Dropbox", - "hash" : "572ab36301762414365b68c0bc185ac5" - }, - "login-Facebook" : { - "name" : "login-Facebook", - "rule" : ".login-Facebook", - "hash" : "2b1511f5b4d12076dd9086d1bb187b28" - }, - "login-Generic" : { - "name" : "login-Generic", - "rule" : ".login-Generic", - "hash" : "60d75c38668ffd6eea91a40e66186601" - }, - "login-Github" : { - "name" : "login-Github", - "rule" : ".login-Github", - "hash" : "633696beb8c1eaac642ce4955be917d8" - }, - "login-Google" : { - "name" : "login-Google", - "rule" : ".login-Google", - "hash" : "b7d3962a31df1e6c13e0a3c97c08f11d" - }, - "login-HTTP" : { - "name" : "login-HTTP", - "rule" : ".login-HTTP", - "hash" : "6fcf0f666c0f6f1e1cd8f397b41ed176" - }, - "login-Jira" : { - "name" : "login-Jira", - "rule" : ".login-Jira", - "hash" : "0ddadec77a95c1efc398886252ebeda9" - }, - "login-LDAP" : { - "name" : "login-LDAP", - "rule" : ".login-LDAP", - "hash" : "5b4e01ddf35cd40c8f061c90abc89b6c" - }, - "login-Linkedin" : { - "name" : "login-Linkedin", - "rule" : ".login-Linkedin", - "hash" : "0dd89825046fa4fd0fe402aa2cd55fd1" - }, - "login-Openid" : { - "name" : "login-Openid", - "rule" : ".login-Openid", - "hash" : "9267ffbb8d4e6dee409c4d8fa2d50c0a" - }, - "login-Phabricator" : { - "name" : "login-Phabricator", - "rule" : ".login-Phabricator", - "hash" : "fad258eb347a1ccf5800b0ee2d8e6e49" - }, - "login-TwitchTV" : { - "name" : "login-TwitchTV", - "rule" : ".login-TwitchTV", - "hash" : "dbaa3f5e58fceb86598b2951fc5f9508" - }, - "login-Twitter" : { - "name" : "login-Twitter", - "rule" : ".login-Twitter", - "hash" : "0b64983507a720b365474b778a966bab" - }, - "login-Yahoo" : { - "name" : "login-Yahoo", - "rule" : ".login-Yahoo", - "hash" : "1cc6fceee294045fe6d1c1d3aa31d2c1" + "version": 1, + "sprites": { + "login-Amazon": { + "name": "login-Amazon", + "rule": ".login-Amazon", + "hash": "e915cc22543027da014126a956a2b3a1" + }, + "login-Asana": { + "name": "login-Asana", + "rule": ".login-Asana", + "hash": "cfc35b62afb103c5d484a715071e3cc3" + }, + "login-Bitbucket": { + "name": "login-Bitbucket", + "rule": ".login-Bitbucket", + "hash": "32f7cf08badb1181f883c211eddd89f5" + }, + "login-Disqus": { + "name": "login-Disqus", + "rule": ".login-Disqus", + "hash": "77b29d56329a3c30b79d6b6673b0e39b" + }, + "login-Facebook": { + "name": "login-Facebook", + "rule": ".login-Facebook", + "hash": "1b12a5a5cfe103d4d96213cf7d1ce18a" + }, + "login-Generic": { + "name": "login-Generic", + "rule": ".login-Generic", + "hash": "c8a57930d9b2bca35adbd8e87b1d4a2f" + }, + "login-Github": { + "name": "login-Github", + "rule": ".login-Github", + "hash": "984f7d78e9c6f5e08da259ca319f6be3" + }, + "login-Google": { + "name": "login-Google", + "rule": ".login-Google", + "hash": "72e7b0e1005c92f059f4d5881592ee72" + }, + "login-HTTP": { + "name": "login-HTTP", + "rule": ".login-HTTP", + "hash": "4b2150566fd6c43c530ea56aa3c7feb4" + }, + "login-Jira": { + "name": "login-Jira", + "rule": ".login-Jira", + "hash": "454fab6635fbc3782380dbb1842a794c" + }, + "login-LDAP": { + "name": "login-LDAP", + "rule": ".login-LDAP", + "hash": "e31df2e9faf8ca0925ef93128a82fa7a" + }, + "login-MediaWiki": { + "name": "login-MediaWiki", + "rule": ".login-MediaWiki", + "hash": "68eba44e85ea942ecf14d3c08992a2e2" + }, + "login-PayPal": { + "name": "login-PayPal", + "rule": ".login-PayPal", + "hash": "dfa09f45369c93bb0fd82a333b0fe927" + }, + "login-Phabricator": { + "name": "login-Phabricator", + "rule": ".login-Phabricator", + "hash": "54f5ddae4b9d138c438ec00ed42544d2" + }, + "login-Slack": { + "name": "login-Slack", + "rule": ".login-Slack", + "hash": "fe0df2df040032b949aa05948b6bd986" + }, + "login-Stripe": { + "name": "login-Stripe", + "rule": ".login-Stripe", + "hash": "26a00cf2d548bbb9f57d1a6362e996f5" + }, + "login-TestPayment": { + "name": "login-TestPayment", + "rule": ".login-TestPayment", + "hash": "7a8b41cbac5edcde63aa64959fe30b7b" + }, + "login-TwitchTV": { + "name": "login-TwitchTV", + "rule": ".login-TwitchTV", + "hash": "02320cb010a226fb6505d5b31f1f0246" + }, + "login-Twitter": { + "name": "login-Twitter", + "rule": ".login-Twitter", + "hash": "5a60e22662a2f5c5c1bc036153f64a18" + }, + "login-WePay": { + "name": "login-WePay", + "rule": ".login-WePay", + "hash": "39a4c5ec26ee8400239b246761b83aa3" + }, + "login-WordPressCOM": { + "name": "login-WordPressCOM", + "rule": ".login-WordPressCOM", + "hash": "9eae4205dbed0c42a18ee4f8e0fa151b" } }, - "scales" : [ + "scales": [ 1, 2 ], - "header" : "\/**\n * @provides sprite-login-css\n * @generated\n *\/\n\n.sprite-login {\n background-image: url(http://rsrc//image//sprite-login.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-login {\n background-image: url(http://rsrc//image//sprite-login-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", - "type" : "standard" + "header": "/**\n * @provides sprite-login-css\n * @generated\n */\n\n.sprite-login {\n background-image: url(http://github.com/rsrc/image/sprite-login.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5),\nonly screen and (min-resolution: 1.5dppx) {\n .sprite-login {\n background-image: url(http://github.com/rsrc/image/sprite-login-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", + "type": "standard" } diff --git a/resources/sprite/manifest/menu.json b/resources/sprite/manifest/menu.json deleted file mode 100644 index 0c09028704..0000000000 --- a/resources/sprite/manifest/menu.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "app" : { - "name" : "app", - "rule" : ".menu-icon-app", - "hash" : "2602e3ab2968d60c7584682e6b25766b" - }, - "app_blue" : { - "name" : "app_blue", - "rule" : ".menu-icon-app-blue", - "hash" : "e4a998e14f21ae244254f4025324f636" - }, - "arrow-right" : { - "name" : "arrow-right", - "rule" : ".phabricator-crumb-divider", - "hash" : "ae2d24462b09e41b62a43b11f57f17af" - }, - "conf-hover" : { - "name" : "conf-hover", - "rule" : ".alert-notifications:hover .phabricator-main-menu-message-icon", - "hash" : "78795fbf2345fd8f54e66a3b3dea7bcd" - }, - "conf-off" : { - "name" : "conf-off", - "rule" : ".alert-notifications .phabricator-main-menu-message-icon", - "hash" : "85e76a1e5d717d7d7f0a4e4e92a0b543" - }, - "conf-unseen" : { - "name" : "conf-unseen", - "rule" : ".alert-notifications.message-unread .phabricator-main-menu-message-icon", - "hash" : "7edd6d68b36f2f46133eb3118f966c6b" - }, - "logo" : { - "name" : "logo", - "rule" : ".phabricator-main-menu-logo-image", - "hash" : "b03901ae5dff3ec840b88f8335819598" - }, - "new" : { - "name" : "new", - "rule" : ".menu-icon-new", - "hash" : "84cf453396e9fdb82fb965ac74cd86cc" - }, - "new_blue" : { - "name" : "new_blue", - "rule" : ".menu-icon-new-blue", - "hash" : "3cb927000c2bb3a11002377fe5fab9ec" - }, - "search" : { - "name" : "search", - "rule" : ".menu-icon-search", - "hash" : "f83c83dbe748b94a4853edb6d9d28288" - }, - "search_blue" : { - "name" : "search_blue", - "rule" : ".menu-icon-search-blue", - "hash" : "96119040bd1c621d1fde30520488c4b8" - }, - "seen_have_unread" : { - "name" : "seen_have_unread", - "rule" : ".alert-notifications:hover .phabricator-main-menu-alert-icon", - "hash" : "7742f97d26f025542d6f162346557871" - }, - "seen_read_all" : { - "name" : "seen_read_all", - "rule" : ".alert-notifications .phabricator-main-menu-alert-icon", - "hash" : "94d4fea01dbb666bb794feec56f783e5" - }, - "unseen_any" : { - "name" : "unseen_any", - "rule" : ".alert-notifications.alert-unread .phabricator-main-menu-alert-icon", - "hash" : "6c577a4c2207f9e2250ca3f09fb4fac3" - } - }, - "scales" : [ - 1, - 2 - ], - "header" : "\/**\n * @provides sprite-menu-css\n * @generated\n *\/\n\n.sprite-menu {\n background-image: url(http://rsrc//image//sprite-menu.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-menu {\n background-image: url(http://rsrc//image//sprite-menu-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", - "type" : "standard" -} diff --git a/resources/sprite/manifest/minicons.json b/resources/sprite/manifest/minicons.json deleted file mode 100644 index 34d3014a72..0000000000 --- a/resources/sprite/manifest/minicons.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "minicons-company-dark" : { - "name" : "minicons-company-dark", - "rule" : ".minicons-company-dark", - "hash" : "fbe746dfff63470103b6a28f52005795" - }, - "minicons-company-white" : { - "name" : "minicons-company-white", - "rule" : ".minicons-company-white", - "hash" : "6dcede529bc27cc3491d8de750d3fd52" - }, - "minicons-move-dark" : { - "name" : "minicons-move-dark", - "rule" : ".minicons-move-dark", - "hash" : "72ec71b4385b181a5c31bbc4ca5f33c6" - }, - "minicons-move-white" : { - "name" : "minicons-move-white", - "rule" : ".minicons-move-white", - "hash" : "6fcd2e10e216ef67c5b89d32ecff951f" - }, - "minicons-public-dark" : { - "name" : "minicons-public-dark", - "rule" : ".minicons-public-dark", - "hash" : "046d7814e36f9961400c82a9f13c7e00" - }, - "minicons-public-white" : { - "name" : "minicons-public-white", - "rule" : ".minicons-public-white", - "hash" : "da5c297550069789eae47b9137387c5d" - }, - "minicons-restricted-dark" : { - "name" : "minicons-restricted-dark", - "rule" : ".minicons-restricted-dark", - "hash" : "c04acaccae9ff70686d93f3c24557144" - }, - "minicons-restricted-white" : { - "name" : "minicons-restricted-white", - "rule" : ".minicons-restricted-white", - "hash" : "c9bac60de30a2c5bb937d4da83d87c16" - } - }, - "scales" : [ - 1, - 2 - ], - "header" : "\/**\n * @provides sprite-minicons-css\n * @generated\n *\/\n\n.sprite-minicons {\n background-image: url(http://rsrc//image//sprite-minicons.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-minicons {\n background-image: url(http://rsrc//image//sprite-minicons-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", - "type" : "standard" -} diff --git a/resources/sprite/manifest/payments.json b/resources/sprite/manifest/payments.json deleted file mode 100644 index 383727d4c5..0000000000 --- a/resources/sprite/manifest/payments.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "payments-americanexpress" : { - "name" : "payments-americanexpress", - "rule" : ".payments-americanexpress", - "hash" : "e0e61821824d30679d0938a8b8b997ca" - }, - "payments-discover" : { - "name" : "payments-discover", - "rule" : ".payments-discover", - "hash" : "64553bcdfde3b182949c9305ee4dda94" - }, - "payments-googlecheckout" : { - "name" : "payments-googlecheckout", - "rule" : ".payments-googlecheckout", - "hash" : "4cbbb6450489adbb91eca0e3573df03e" - }, - "payments-mastercard" : { - "name" : "payments-mastercard", - "rule" : ".payments-mastercard", - "hash" : "cbe041c4467075e439b529e582e2ec6a" - }, - "payments-paypal" : { - "name" : "payments-paypal", - "rule" : ".payments-paypal", - "hash" : "6fd9c4b1aba0d7bf25b1888b5524dd33" - }, - "payments-visa" : { - "name" : "payments-visa", - "rule" : ".payments-visa", - "hash" : "517115136f37bd5647a502f7130bd63a" - }, - "payments-worldpay" : { - "name" : "payments-worldpay", - "rule" : ".payments-worldpay", - "hash" : "f93c40f9f8a2df9418d29d8f1208c47c" - } - }, - "scales" : [ - 1 - ], - "header" : "\/**\n * @provides sprite-payments-css\n * @generated\n *\/\n\n.sprite-payments {\n background-image: url(http://rsrc//image//sprite-payments.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-payments {\n background-image: url(http://rsrc//image//sprite-payments-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", - "type" : "standard" -} diff --git a/resources/sprite/manifest/status.json b/resources/sprite/manifest/status.json deleted file mode 100644 index eb5bbda83a..0000000000 --- a/resources/sprite/manifest/status.json +++ /dev/null @@ -1,311 +0,0 @@ -{ - "version" : 1, - "sprites" : { - "status-accept-blue" : { - "name" : "status-accept-blue", - "rule" : ".status-accept-blue", - "hash" : "c3bde2e1361bcd7259825ecaf2d4b2ff" - }, - "status-accept-dark" : { - "name" : "status-accept-dark", - "rule" : ".status-accept-dark", - "hash" : "a2ec73e144ea598be15b8acb63f3c096" - }, - "status-accept-green" : { - "name" : "status-accept-green", - "rule" : ".status-accept-green", - "hash" : "cf0c2339a111f54adfdcc0de5c18be22" - }, - "status-accept-red" : { - "name" : "status-accept-red", - "rule" : ".status-accept-red", - "hash" : "1466a3ed72f63971e38e669715cf5b98" - }, - "status-accept-white" : { - "name" : "status-accept-white", - "rule" : ".status-accept-white", - "hash" : "8ecccf5e2ce6658d8a1e963e4be6f6e9" - }, - "status-add-blue" : { - "name" : "status-add-blue", - "rule" : ".status-add-blue", - "hash" : "8860efdd8f90eed700ae48595ace6b38" - }, - "status-add-dark" : { - "name" : "status-add-dark", - "rule" : ".status-add-dark", - "hash" : "38dc8634ccfe6fa30f467e97436e1a30" - }, - "status-add-green" : { - "name" : "status-add-green", - "rule" : ".status-add-green", - "hash" : "5610cd9924ad6b3461a20dd050ef4866" - }, - "status-add-red" : { - "name" : "status-add-red", - "rule" : ".status-add-red", - "hash" : "9e0abe2b6e37ef5a1a2522ad01002704" - }, - "status-add-white" : { - "name" : "status-add-white", - "rule" : ".status-add-white", - "hash" : "1a8ab412f40c569acdc709fb281fefde" - }, - "status-down-blue" : { - "name" : "status-down-blue", - "rule" : ".status-down-blue", - "hash" : "25baf216cd311f321656a5f3a327c38c" - }, - "status-down-dark" : { - "name" : "status-down-dark", - "rule" : ".status-down-dark", - "hash" : "bb82d18b729ac30956200b655eafeeb8" - }, - "status-down-green" : { - "name" : "status-down-green", - "rule" : ".status-down-green", - "hash" : "c29ad19910664ecc94e0d1fa99a0a6c0" - }, - "status-down-red" : { - "name" : "status-down-red", - "rule" : ".status-down-red", - "hash" : "644f0d38cad5cc6797fe81ed30b9bc6a" - }, - "status-down-white" : { - "name" : "status-down-white", - "rule" : ".status-down-white", - "hash" : "5bc0af6641ef545218ecced2d25e9a10" - }, - "status-info-blue" : { - "name" : "status-info-blue", - "rule" : ".status-info-blue", - "hash" : "2acc8c62d8963bec9ce632de60a4da41" - }, - "status-info-dark" : { - "name" : "status-info-dark", - "rule" : ".status-info-dark", - "hash" : "d96f44c17e67d7c0c10a400e6ff294f1" - }, - "status-info-green" : { - "name" : "status-info-green", - "rule" : ".status-info-green", - "hash" : "28fc83a1f5bee4ac39a0dcd52e180818" - }, - "status-info-red" : { - "name" : "status-info-red", - "rule" : ".status-info-red", - "hash" : "fc26e5509140d8e9a3305a39c44773f0" - }, - "status-info-white" : { - "name" : "status-info-white", - "rule" : ".status-info-white", - "hash" : "b70025f459685371f8397b61944bef7d" - }, - "status-left-blue" : { - "name" : "status-left-blue", - "rule" : ".status-left-blue", - "hash" : "cdec5d2617cb7fcfbfea336881d267f0" - }, - "status-left-dark" : { - "name" : "status-left-dark", - "rule" : ".status-left-dark", - "hash" : "83b58d1cde130deb01971888ad0bcfc1" - }, - "status-left-green" : { - "name" : "status-left-green", - "rule" : ".status-left-green", - "hash" : "6b34445f1a034e71432a5823bed1c4d7" - }, - "status-left-red" : { - "name" : "status-left-red", - "rule" : ".status-left-red", - "hash" : "38ebb75c0fbcf6fe96def6c2ab70b343" - }, - "status-left-white" : { - "name" : "status-left-white", - "rule" : ".status-left-white", - "hash" : "9e89400271b55590e610188d93671934" - }, - "status-minus-blue" : { - "name" : "status-minus-blue", - "rule" : ".status-minus-blue", - "hash" : "61ef81a9b78b4de4bf6303f8d51c86ef" - }, - "status-minus-dark" : { - "name" : "status-minus-dark", - "rule" : ".status-minus-dark", - "hash" : "db4ddb69a22c7f6f09669fe3c488c4f0" - }, - "status-minus-green" : { - "name" : "status-minus-green", - "rule" : ".status-minus-green", - "hash" : "9e5402f65601ced38a967d4e17b80f1c" - }, - "status-minus-red" : { - "name" : "status-minus-red", - "rule" : ".status-minus-red", - "hash" : "bcaf148bc842e398f08d8c01506bd5b6" - }, - "status-minus-white" : { - "name" : "status-minus-white", - "rule" : ".status-minus-white", - "hash" : "c5a3771452dda603fbaee87371044f5a" - }, - "status-open-blue" : { - "name" : "status-open-blue", - "rule" : ".status-open-blue", - "hash" : "9632bb52d5f24941202848c2e3d4488a" - }, - "status-open-dark" : { - "name" : "status-open-dark", - "rule" : ".status-open-dark", - "hash" : "ca38ff5fc8a327d96cd1bbc23043fbb4" - }, - "status-open-green" : { - "name" : "status-open-green", - "rule" : ".status-open-green", - "hash" : "b4a2c17594a5301e2bd52a9df71819d3" - }, - "status-open-red" : { - "name" : "status-open-red", - "rule" : ".status-open-red", - "hash" : "f92b1544978d691da6912f937df54273" - }, - "status-open-white" : { - "name" : "status-open-white", - "rule" : ".status-open-white", - "hash" : "169dc0e8f36444ea30163181f9c88dc2" - }, - "status-question-blue" : { - "name" : "status-question-blue", - "rule" : ".status-question-blue", - "hash" : "44ebbdbe059ca77ae4dc6a6b98de1ccf" - }, - "status-question-dark" : { - "name" : "status-question-dark", - "rule" : ".status-question-dark", - "hash" : "5fdd5f2b089f4481a39760a50224d8b2" - }, - "status-question-green" : { - "name" : "status-question-green", - "rule" : ".status-question-green", - "hash" : "326dfc6c1841410ce0f22d702c872c01" - }, - "status-question-red" : { - "name" : "status-question-red", - "rule" : ".status-question-red", - "hash" : "18dbec41627f8c047c4e736f84dacb33" - }, - "status-question-white" : { - "name" : "status-question-white", - "rule" : ".status-question-white", - "hash" : "5e7f546f978d1d0545cad127ea3bcf80" - }, - "status-reject-blue" : { - "name" : "status-reject-blue", - "rule" : ".status-reject-blue", - "hash" : "b0f51db6aa6ee85a24a1f4c13812d7ef" - }, - "status-reject-dark" : { - "name" : "status-reject-dark", - "rule" : ".status-reject-dark", - "hash" : "9b28c36f6cbd6d5d5731b971193a151e" - }, - "status-reject-green" : { - "name" : "status-reject-green", - "rule" : ".status-reject-green", - "hash" : "fc171843df97bcdc6e4679682b3b31e4" - }, - "status-reject-red" : { - "name" : "status-reject-red", - "rule" : ".status-reject-red", - "hash" : "6de0dd95a92d33bda228aaa9ba6deee5" - }, - "status-reject-white" : { - "name" : "status-reject-white", - "rule" : ".status-reject-white", - "hash" : "e709a3fb3081a395900deaef0591066c" - }, - "status-right-blue" : { - "name" : "status-right-blue", - "rule" : ".status-right-blue", - "hash" : "ca1cae1d93486785ec50458ba3b19082" - }, - "status-right-dark" : { - "name" : "status-right-dark", - "rule" : ".status-right-dark", - "hash" : "fb6600fd1775a8a4fb85709dc4f6c28c" - }, - "status-right-green" : { - "name" : "status-right-green", - "rule" : ".status-right-green", - "hash" : "9a52218e6c6d3968a05eb51865ed3cba" - }, - "status-right-red" : { - "name" : "status-right-red", - "rule" : ".status-right-red", - "hash" : "06bd9747ce4cc87282b2fb207c525f0c" - }, - "status-right-white" : { - "name" : "status-right-white", - "rule" : ".status-right-white", - "hash" : "be2ffb65a7799cd9a5e00c2334e378b2" - }, - "status-up-blue" : { - "name" : "status-up-blue", - "rule" : ".status-up-blue", - "hash" : "44fc24b3646e29c949b639157c315140" - }, - "status-up-dark" : { - "name" : "status-up-dark", - "rule" : ".status-up-dark", - "hash" : "459ed916291bfa905676ae0818bb2e1b" - }, - "status-up-green" : { - "name" : "status-up-green", - "rule" : ".status-up-green", - "hash" : "6a682e48fc2f240b19bd175be52c9256" - }, - "status-up-red" : { - "name" : "status-up-red", - "rule" : ".status-up-red", - "hash" : "0e38f6282e542470ecb68e55fad7eb76" - }, - "status-up-white" : { - "name" : "status-up-white", - "rule" : ".status-up-white", - "hash" : "ce80e291bc905b2692ad9f3ece7cf206" - }, - "status-warning-blue" : { - "name" : "status-warning-blue", - "rule" : ".status-warning-blue", - "hash" : "93f5e066a01a874adc2c120cca4bd1fc" - }, - "status-warning-dark" : { - "name" : "status-warning-dark", - "rule" : ".status-warning-dark", - "hash" : "273a519299d7063710452d21c0bc6406" - }, - "status-warning-green" : { - "name" : "status-warning-green", - "rule" : ".status-warning-green", - "hash" : "991514e5b75509b27fd68d21755b9fa6" - }, - "status-warning-red" : { - "name" : "status-warning-red", - "rule" : ".status-warning-red", - "hash" : "b15f61f314cbda5486d3aa21990153ae" - }, - "status-warning-white" : { - "name" : "status-warning-white", - "rule" : ".status-warning-white", - "hash" : "62ff8f6bf696e58f71eb4e1c6fe9b2e1" - } - }, - "scales" : [ - 1, - 2 - ], - "header" : "\/**\n * @provides sprite-status-css\n * @generated\n *\/\n\n.sprite-status {\n background-image: url(http://rsrc//image//sprite-status.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-status {\n background-image: url(http://rsrc//image//sprite-status-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", - "type" : "standard" -} diff --git a/resources/sprite/manifest/tokens.json b/resources/sprite/manifest/tokens.json index 471b47a6bf..c9768db11f 100644 --- a/resources/sprite/manifest/tokens.json +++ b/resources/sprite/manifest/tokens.json @@ -1,90 +1,131 @@ { - "version" : 1, - "sprites" : { - "tokens-coin-1" : { - "name" : "tokens-coin-1", - "rule" : ".tokens-coin-1", - "hash" : "144fe1689d96f1e32102c6963e38d419" - }, - "tokens-coin-2" : { - "name" : "tokens-coin-2", - "rule" : ".tokens-coin-2", - "hash" : "fb39ebba861cfd0e1770f0fefc617a20" - }, - "tokens-coin-3" : { - "name" : "tokens-coin-3", - "rule" : ".tokens-coin-3", - "hash" : "f67d4c69a97262b53db38214274fbade" - }, - "tokens-coin-4" : { - "name" : "tokens-coin-4", - "rule" : ".tokens-coin-4", - "hash" : "871f3130c0a00489454acdd1f1b14406" - }, - "tokens-heart-1" : { - "name" : "tokens-heart-1", - "rule" : ".tokens-heart-1", - "hash" : "312c32354b082fd54eb1611a114b8c89" - }, - "tokens-heart-2" : { - "name" : "tokens-heart-2", - "rule" : ".tokens-heart-2", - "hash" : "f23c6e814bc0c5140a6ec65d9522a4b2" - }, - "tokens-like-1" : { - "name" : "tokens-like-1", - "rule" : ".tokens-like-1", - "hash" : "810d7ff43284c9611dfc9d81b5010889" - }, - "tokens-like-2" : { - "name" : "tokens-like-2", - "rule" : ".tokens-like-2", - "hash" : "8d1f0de719ce3d9c126a698bc41bbb5b" - }, - "tokens-medal-1" : { - "name" : "tokens-medal-1", - "rule" : ".tokens-medal-1", - "hash" : "f565655bd55c8a62711295aa4d76d5c3" - }, - "tokens-medal-2" : { - "name" : "tokens-medal-2", - "rule" : ".tokens-medal-2", - "hash" : "3aa60b71c15cb3f9c88c02572ce5dbd8" - }, - "tokens-medal-3" : { - "name" : "tokens-medal-3", - "rule" : ".tokens-medal-3", - "hash" : "3e0edafb5b26b9f88019031b7738cf85" - }, - "tokens-medal-4" : { - "name" : "tokens-medal-4", - "rule" : ".tokens-medal-4", - "hash" : "20a31832833ba9b0ace59235bc39270b" - }, - "tokens-misc-1" : { - "name" : "tokens-misc-1", - "rule" : ".tokens-misc-1", - "hash" : "a35a19550f5786a255dd5247a5877063" - }, - "tokens-misc-2" : { - "name" : "tokens-misc-2", - "rule" : ".tokens-misc-2", - "hash" : "33a10020a1f62d3a103cefe22979d0e9" - }, - "tokens-misc-3" : { - "name" : "tokens-misc-3", - "rule" : ".tokens-misc-3", - "hash" : "ba1e7f3db3b0b58b93b92409b38fcf21" - }, - "tokens-misc-4" : { - "name" : "tokens-misc-4", - "rule" : ".tokens-misc-4", - "hash" : "8084934d0cdea6a07bb84c5f6c724ff5" + "version": 1, + "sprites": { + "tokens-coin-1": { + "name": "tokens-coin-1", + "rule": ".tokens-coin-1", + "hash": "5343d745423994c45c5fc689edc47d05" + }, + "tokens-coin-2": { + "name": "tokens-coin-2", + "rule": ".tokens-coin-2", + "hash": "9a94b5f925f3e6f8eed673d50fbfe148" + }, + "tokens-coin-3": { + "name": "tokens-coin-3", + "rule": ".tokens-coin-3", + "hash": "68db03ca248309a76cee97ada64239c6" + }, + "tokens-coin-4": { + "name": "tokens-coin-4", + "rule": ".tokens-coin-4", + "hash": "75832b7e42df9287b3c35c6afed12a93" + }, + "tokens-emoji-1": { + "name": "tokens-emoji-1", + "rule": ".tokens-emoji-1", + "hash": "17f57bdeb4078f9c05f1f037ccb1c162" + }, + "tokens-emoji-2": { + "name": "tokens-emoji-2", + "rule": ".tokens-emoji-2", + "hash": "6877c6e0c63522d5819531aaf4aba787" + }, + "tokens-emoji-3": { + "name": "tokens-emoji-3", + "rule": ".tokens-emoji-3", + "hash": "cc67534b0119d4cc385a93ed5aff86e4" + }, + "tokens-emoji-4": { + "name": "tokens-emoji-4", + "rule": ".tokens-emoji-4", + "hash": "f2a6febd638670962dfb5fdd76b23cfb" + }, + "tokens-emoji-5": { + "name": "tokens-emoji-5", + "rule": ".tokens-emoji-5", + "hash": "22bc23d162449fde492e0fd3eccc7301" + }, + "tokens-emoji-6": { + "name": "tokens-emoji-6", + "rule": ".tokens-emoji-6", + "hash": "e3689840f410ff1bbf365f6b06043d3f" + }, + "tokens-emoji-7": { + "name": "tokens-emoji-7", + "rule": ".tokens-emoji-7", + "hash": "a689b9fe7c9f6f300d757b5350e2cc4b" + }, + "tokens-emoji-8": { + "name": "tokens-emoji-8", + "rule": ".tokens-emoji-8", + "hash": "26570ef132caea33307e1e7574d754e8" + }, + "tokens-heart-1": { + "name": "tokens-heart-1", + "rule": ".tokens-heart-1", + "hash": "2d4812b2129a8eb05fcdbed1e9654422" + }, + "tokens-heart-2": { + "name": "tokens-heart-2", + "rule": ".tokens-heart-2", + "hash": "64cbdbfb0dc565f17b6f13b5e41bc000" + }, + "tokens-like-1": { + "name": "tokens-like-1", + "rule": ".tokens-like-1", + "hash": "1b3966d6e0e5d902b558fe3d76ed8a79" + }, + "tokens-like-2": { + "name": "tokens-like-2", + "rule": ".tokens-like-2", + "hash": "b74308407fdaa94e08492cfd9b44f2a2" + }, + "tokens-medal-1": { + "name": "tokens-medal-1", + "rule": ".tokens-medal-1", + "hash": "33d837e703091060c1892c402535eef0" + }, + "tokens-medal-2": { + "name": "tokens-medal-2", + "rule": ".tokens-medal-2", + "hash": "fa2f3b237d7616a6cb309718ad162d7a" + }, + "tokens-medal-3": { + "name": "tokens-medal-3", + "rule": ".tokens-medal-3", + "hash": "d7282911ba57373b54b4093986143f3e" + }, + "tokens-medal-4": { + "name": "tokens-medal-4", + "rule": ".tokens-medal-4", + "hash": "a107a334968d57314ec6a71620c45b99" + }, + "tokens-misc-1": { + "name": "tokens-misc-1", + "rule": ".tokens-misc-1", + "hash": "671ce03f62c7b0946482ec92d35b8aa3" + }, + "tokens-misc-2": { + "name": "tokens-misc-2", + "rule": ".tokens-misc-2", + "hash": "872353ba82e41512c3b54e5dc2aa3d43" + }, + "tokens-misc-3": { + "name": "tokens-misc-3", + "rule": ".tokens-misc-3", + "hash": "cdf9171ec6397b95ea9abe1edeaab359" + }, + "tokens-misc-4": { + "name": "tokens-misc-4", + "rule": ".tokens-misc-4", + "hash": "7371fa5ecde282e718b7a15b02ca51e8" } }, - "scales" : [ - 1 + "scales": [ + 1, + 2 ], - "header" : "\/**\n * @provides sprite-tokens-css\n * @generated\n *\/\n\n.sprite-tokens {\n background-image: url(http://rsrc//image//sprite-tokens.png);\n background-repeat: no-repeat;\n}\n\n\n", - "type" : "standard" + "header": "/**\n * @provides sprite-tokens-css\n * @generated\n */\n\n.sprite-tokens {\n background-image: url(http://github.com/rsrc/image/sprite-tokens.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5),\nonly screen and (min-resolution: 1.5dppx) {\n .sprite-tokens {\n background-image: url(http://github.com/rsrc/image/sprite-tokens-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n", + "type": "standard" } diff --git a/resources/sprite/menu_1x/app.png b/resources/sprite/menu_1x/app.png deleted file mode 100644 index 6e08281730..0000000000 Binary files a/resources/sprite/menu_1x/app.png and /dev/null differ diff --git a/resources/sprite/menu_1x/app_blue.png b/resources/sprite/menu_1x/app_blue.png deleted file mode 100644 index 6488fdf9ff..0000000000 Binary files a/resources/sprite/menu_1x/app_blue.png and /dev/null differ diff --git a/resources/sprite/menu_1x/arrow-right.png b/resources/sprite/menu_1x/arrow-right.png deleted file mode 100644 index 29d43457ce..0000000000 Binary files a/resources/sprite/menu_1x/arrow-right.png and /dev/null differ diff --git a/resources/sprite/menu_1x/bubble.png b/resources/sprite/menu_1x/bubble.png deleted file mode 100644 index a6c047cb42..0000000000 Binary files a/resources/sprite/menu_1x/bubble.png and /dev/null differ diff --git a/resources/sprite/menu_1x/conf-hover.png b/resources/sprite/menu_1x/conf-hover.png deleted file mode 100644 index 8a22a566f0..0000000000 Binary files a/resources/sprite/menu_1x/conf-hover.png and /dev/null differ diff --git a/resources/sprite/menu_1x/conf-off.png b/resources/sprite/menu_1x/conf-off.png deleted file mode 100644 index 9a3ed11873..0000000000 Binary files a/resources/sprite/menu_1x/conf-off.png and /dev/null differ diff --git a/resources/sprite/menu_1x/conf-unseen.png b/resources/sprite/menu_1x/conf-unseen.png deleted file mode 100644 index f7db9f2475..0000000000 Binary files a/resources/sprite/menu_1x/conf-unseen.png and /dev/null differ diff --git a/resources/sprite/menu_1x/logo.png b/resources/sprite/menu_1x/logo.png deleted file mode 100644 index 09931a2090..0000000000 Binary files a/resources/sprite/menu_1x/logo.png and /dev/null differ diff --git a/resources/sprite/menu_1x/new.png b/resources/sprite/menu_1x/new.png deleted file mode 100644 index d86f3ef83c..0000000000 Binary files a/resources/sprite/menu_1x/new.png and /dev/null differ diff --git a/resources/sprite/menu_1x/new_blue.png b/resources/sprite/menu_1x/new_blue.png deleted file mode 100644 index b0c10ec9f7..0000000000 Binary files a/resources/sprite/menu_1x/new_blue.png and /dev/null differ diff --git a/resources/sprite/menu_1x/round_bubble.png b/resources/sprite/menu_1x/round_bubble.png deleted file mode 100644 index 2d2fce1f37..0000000000 Binary files a/resources/sprite/menu_1x/round_bubble.png and /dev/null differ diff --git a/resources/sprite/menu_1x/search.png b/resources/sprite/menu_1x/search.png deleted file mode 100644 index e94deb538f..0000000000 Binary files a/resources/sprite/menu_1x/search.png and /dev/null differ diff --git a/resources/sprite/menu_1x/search_blue.png b/resources/sprite/menu_1x/search_blue.png deleted file mode 100644 index 560e885641..0000000000 Binary files a/resources/sprite/menu_1x/search_blue.png and /dev/null differ diff --git a/resources/sprite/menu_1x/seen_have_unread.png b/resources/sprite/menu_1x/seen_have_unread.png deleted file mode 100644 index 39085b5394..0000000000 Binary files a/resources/sprite/menu_1x/seen_have_unread.png and /dev/null differ diff --git a/resources/sprite/menu_1x/seen_read_all.png b/resources/sprite/menu_1x/seen_read_all.png deleted file mode 100644 index a891463faf..0000000000 Binary files a/resources/sprite/menu_1x/seen_read_all.png and /dev/null differ diff --git a/resources/sprite/menu_1x/unseen_any.png b/resources/sprite/menu_1x/unseen_any.png deleted file mode 100644 index 2b53598480..0000000000 Binary files a/resources/sprite/menu_1x/unseen_any.png and /dev/null differ diff --git a/resources/sprite/menu_2x/app.png b/resources/sprite/menu_2x/app.png deleted file mode 100644 index 5c6bb9c0a7..0000000000 Binary files a/resources/sprite/menu_2x/app.png and /dev/null differ diff --git a/resources/sprite/menu_2x/app_blue.png b/resources/sprite/menu_2x/app_blue.png deleted file mode 100644 index 7cef817817..0000000000 Binary files a/resources/sprite/menu_2x/app_blue.png and /dev/null differ diff --git a/resources/sprite/menu_2x/arrow-right.png b/resources/sprite/menu_2x/arrow-right.png deleted file mode 100644 index ae8784fa8c..0000000000 Binary files a/resources/sprite/menu_2x/arrow-right.png and /dev/null differ diff --git a/resources/sprite/menu_2x/bubble.png b/resources/sprite/menu_2x/bubble.png deleted file mode 100644 index f09dca68b2..0000000000 Binary files a/resources/sprite/menu_2x/bubble.png and /dev/null differ diff --git a/resources/sprite/menu_2x/conf-hover.png b/resources/sprite/menu_2x/conf-hover.png deleted file mode 100644 index d802f78ca8..0000000000 Binary files a/resources/sprite/menu_2x/conf-hover.png and /dev/null differ diff --git a/resources/sprite/menu_2x/conf-off.png b/resources/sprite/menu_2x/conf-off.png deleted file mode 100644 index 72581ceacd..0000000000 Binary files a/resources/sprite/menu_2x/conf-off.png and /dev/null differ diff --git a/resources/sprite/menu_2x/conf-unseen.png b/resources/sprite/menu_2x/conf-unseen.png deleted file mode 100644 index 9bc924acd5..0000000000 Binary files a/resources/sprite/menu_2x/conf-unseen.png and /dev/null differ diff --git a/resources/sprite/menu_2x/logo.png b/resources/sprite/menu_2x/logo.png deleted file mode 100644 index 885e8507f6..0000000000 Binary files a/resources/sprite/menu_2x/logo.png and /dev/null differ diff --git a/resources/sprite/menu_2x/new.png b/resources/sprite/menu_2x/new.png deleted file mode 100644 index 4b28987652..0000000000 Binary files a/resources/sprite/menu_2x/new.png and /dev/null differ diff --git a/resources/sprite/menu_2x/new_blue.png b/resources/sprite/menu_2x/new_blue.png deleted file mode 100644 index 5294204555..0000000000 Binary files a/resources/sprite/menu_2x/new_blue.png and /dev/null differ diff --git a/resources/sprite/menu_2x/round_bubble.png b/resources/sprite/menu_2x/round_bubble.png deleted file mode 100644 index 0837ba4b7e..0000000000 Binary files a/resources/sprite/menu_2x/round_bubble.png and /dev/null differ diff --git a/resources/sprite/menu_2x/search.png b/resources/sprite/menu_2x/search.png deleted file mode 100644 index 9d46a016cc..0000000000 Binary files a/resources/sprite/menu_2x/search.png and /dev/null differ diff --git a/resources/sprite/menu_2x/search_blue.png b/resources/sprite/menu_2x/search_blue.png deleted file mode 100644 index 55610afcbf..0000000000 Binary files a/resources/sprite/menu_2x/search_blue.png and /dev/null differ diff --git a/resources/sprite/menu_2x/seen_have_unread.png b/resources/sprite/menu_2x/seen_have_unread.png deleted file mode 100644 index 3de5320056..0000000000 Binary files a/resources/sprite/menu_2x/seen_have_unread.png and /dev/null differ diff --git a/resources/sprite/menu_2x/seen_read_all.png b/resources/sprite/menu_2x/seen_read_all.png deleted file mode 100644 index 6e52c89c99..0000000000 Binary files a/resources/sprite/menu_2x/seen_read_all.png and /dev/null differ diff --git a/resources/sprite/menu_2x/unseen_any.png b/resources/sprite/menu_2x/unseen_any.png deleted file mode 100644 index e792831a4f..0000000000 Binary files a/resources/sprite/menu_2x/unseen_any.png and /dev/null differ diff --git a/resources/sprite/minicons_dark_1x/company.png b/resources/sprite/minicons_dark_1x/company.png deleted file mode 100644 index eb8874c50d..0000000000 Binary files a/resources/sprite/minicons_dark_1x/company.png and /dev/null differ diff --git a/resources/sprite/minicons_dark_1x/move.png b/resources/sprite/minicons_dark_1x/move.png deleted file mode 100644 index b755fa8080..0000000000 Binary files a/resources/sprite/minicons_dark_1x/move.png and /dev/null differ diff --git a/resources/sprite/minicons_dark_1x/public.png b/resources/sprite/minicons_dark_1x/public.png deleted file mode 100644 index 8174e0159d..0000000000 Binary files a/resources/sprite/minicons_dark_1x/public.png and /dev/null differ diff --git a/resources/sprite/minicons_dark_1x/restricted.png b/resources/sprite/minicons_dark_1x/restricted.png deleted file mode 100644 index 53fb0610d3..0000000000 Binary files a/resources/sprite/minicons_dark_1x/restricted.png and /dev/null differ diff --git a/resources/sprite/minicons_dark_2x/company.png b/resources/sprite/minicons_dark_2x/company.png deleted file mode 100644 index 31f48e3c99..0000000000 Binary files a/resources/sprite/minicons_dark_2x/company.png and /dev/null differ diff --git a/resources/sprite/minicons_dark_2x/move.png b/resources/sprite/minicons_dark_2x/move.png deleted file mode 100644 index 0a0db37ce8..0000000000 Binary files a/resources/sprite/minicons_dark_2x/move.png and /dev/null differ diff --git a/resources/sprite/minicons_dark_2x/public.png b/resources/sprite/minicons_dark_2x/public.png deleted file mode 100644 index e6b26fc76a..0000000000 Binary files a/resources/sprite/minicons_dark_2x/public.png and /dev/null differ diff --git a/resources/sprite/minicons_dark_2x/restricted.png b/resources/sprite/minicons_dark_2x/restricted.png deleted file mode 100644 index d7d292d4b9..0000000000 Binary files a/resources/sprite/minicons_dark_2x/restricted.png and /dev/null differ diff --git a/resources/sprite/minicons_white_1x/company.png b/resources/sprite/minicons_white_1x/company.png deleted file mode 100644 index 27605dd584..0000000000 Binary files a/resources/sprite/minicons_white_1x/company.png and /dev/null differ diff --git a/resources/sprite/minicons_white_1x/move.png b/resources/sprite/minicons_white_1x/move.png deleted file mode 100644 index 6458f05bd5..0000000000 Binary files a/resources/sprite/minicons_white_1x/move.png and /dev/null differ diff --git a/resources/sprite/minicons_white_1x/public.png b/resources/sprite/minicons_white_1x/public.png deleted file mode 100644 index 4f70c3c3e2..0000000000 Binary files a/resources/sprite/minicons_white_1x/public.png and /dev/null differ diff --git a/resources/sprite/minicons_white_1x/restricted.png b/resources/sprite/minicons_white_1x/restricted.png deleted file mode 100644 index 7baecc8e1b..0000000000 Binary files a/resources/sprite/minicons_white_1x/restricted.png and /dev/null differ diff --git a/resources/sprite/minicons_white_2x/company.png b/resources/sprite/minicons_white_2x/company.png deleted file mode 100644 index 2ac076c934..0000000000 Binary files a/resources/sprite/minicons_white_2x/company.png and /dev/null differ diff --git a/resources/sprite/minicons_white_2x/move.png b/resources/sprite/minicons_white_2x/move.png deleted file mode 100644 index f0435544c5..0000000000 Binary files a/resources/sprite/minicons_white_2x/move.png and /dev/null differ diff --git a/resources/sprite/minicons_white_2x/public.png b/resources/sprite/minicons_white_2x/public.png deleted file mode 100644 index d94f60b379..0000000000 Binary files a/resources/sprite/minicons_white_2x/public.png and /dev/null differ diff --git a/resources/sprite/minicons_white_2x/restricted.png b/resources/sprite/minicons_white_2x/restricted.png deleted file mode 100644 index c3cab3ff8c..0000000000 Binary files a/resources/sprite/minicons_white_2x/restricted.png and /dev/null differ diff --git a/resources/sprite/payments_2x/americanexpress.png b/resources/sprite/payments_2x/americanexpress.png deleted file mode 100644 index 022b0a770a..0000000000 Binary files a/resources/sprite/payments_2x/americanexpress.png and /dev/null differ diff --git a/resources/sprite/payments_2x/discover.png b/resources/sprite/payments_2x/discover.png deleted file mode 100644 index 7c055b92bc..0000000000 Binary files a/resources/sprite/payments_2x/discover.png and /dev/null differ diff --git a/resources/sprite/payments_2x/googlecheckout.png b/resources/sprite/payments_2x/googlecheckout.png deleted file mode 100644 index da186abfd2..0000000000 Binary files a/resources/sprite/payments_2x/googlecheckout.png and /dev/null differ diff --git a/resources/sprite/payments_2x/mastercard.png b/resources/sprite/payments_2x/mastercard.png deleted file mode 100644 index 405a68f8c0..0000000000 Binary files a/resources/sprite/payments_2x/mastercard.png and /dev/null differ diff --git a/resources/sprite/payments_2x/paypal.png b/resources/sprite/payments_2x/paypal.png deleted file mode 100644 index c52765e1ea..0000000000 Binary files a/resources/sprite/payments_2x/paypal.png and /dev/null differ diff --git a/resources/sprite/payments_2x/visa.png b/resources/sprite/payments_2x/visa.png deleted file mode 100644 index a2d9661d26..0000000000 Binary files a/resources/sprite/payments_2x/visa.png and /dev/null differ diff --git a/resources/sprite/payments_2x/worldpay.png b/resources/sprite/payments_2x/worldpay.png deleted file mode 100644 index 9554293ace..0000000000 Binary files a/resources/sprite/payments_2x/worldpay.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_b.png b/resources/sprite/remarkup_1x/text_b.png deleted file mode 100644 index e57faa4b94..0000000000 Binary files a/resources/sprite/remarkup_1x/text_b.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_chaos.png b/resources/sprite/remarkup_1x/text_chaos.png deleted file mode 100644 index 2bbd6842c6..0000000000 Binary files a/resources/sprite/remarkup_1x/text_chaos.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_chaos_off.png b/resources/sprite/remarkup_1x/text_chaos_off.png deleted file mode 100644 index 2a9012d8d6..0000000000 Binary files a/resources/sprite/remarkup_1x/text_chaos_off.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_code.png b/resources/sprite/remarkup_1x/text_code.png deleted file mode 100644 index b22593d639..0000000000 Binary files a/resources/sprite/remarkup_1x/text_code.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_help.png b/resources/sprite/remarkup_1x/text_help.png deleted file mode 100644 index 67705517de..0000000000 Binary files a/resources/sprite/remarkup_1x/text_help.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_i.png b/resources/sprite/remarkup_1x/text_i.png deleted file mode 100644 index 8da29236bd..0000000000 Binary files a/resources/sprite/remarkup_1x/text_i.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_image.png b/resources/sprite/remarkup_1x/text_image.png deleted file mode 100644 index 7c90c5b08d..0000000000 Binary files a/resources/sprite/remarkup_1x/text_image.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_larger.png b/resources/sprite/remarkup_1x/text_larger.png deleted file mode 100644 index 957c1fa011..0000000000 Binary files a/resources/sprite/remarkup_1x/text_larger.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_meme.png b/resources/sprite/remarkup_1x/text_meme.png deleted file mode 100644 index eac9f5cd19..0000000000 Binary files a/resources/sprite/remarkup_1x/text_meme.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_ol.png b/resources/sprite/remarkup_1x/text_ol.png deleted file mode 100644 index 7691314d95..0000000000 Binary files a/resources/sprite/remarkup_1x/text_ol.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_order.png b/resources/sprite/remarkup_1x/text_order.png deleted file mode 100644 index 6bf10ca86c..0000000000 Binary files a/resources/sprite/remarkup_1x/text_order.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_order_off.png b/resources/sprite/remarkup_1x/text_order_off.png deleted file mode 100644 index 9651b180ef..0000000000 Binary files a/resources/sprite/remarkup_1x/text_order_off.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_table.png b/resources/sprite/remarkup_1x/text_table.png deleted file mode 100644 index 7319094f37..0000000000 Binary files a/resources/sprite/remarkup_1x/text_table.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_tag.png b/resources/sprite/remarkup_1x/text_tag.png deleted file mode 100644 index 1c3afedbe2..0000000000 Binary files a/resources/sprite/remarkup_1x/text_tag.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_tt.png b/resources/sprite/remarkup_1x/text_tt.png deleted file mode 100644 index 4f6ab59de3..0000000000 Binary files a/resources/sprite/remarkup_1x/text_tt.png and /dev/null differ diff --git a/resources/sprite/remarkup_1x/text_ul.png b/resources/sprite/remarkup_1x/text_ul.png deleted file mode 100644 index 336f916128..0000000000 Binary files a/resources/sprite/remarkup_1x/text_ul.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_b.png b/resources/sprite/remarkup_2x/text_b.png deleted file mode 100644 index 4a3e22488c..0000000000 Binary files a/resources/sprite/remarkup_2x/text_b.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_chaos.png b/resources/sprite/remarkup_2x/text_chaos.png deleted file mode 100644 index 076c17b114..0000000000 Binary files a/resources/sprite/remarkup_2x/text_chaos.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_chaos_off.png b/resources/sprite/remarkup_2x/text_chaos_off.png deleted file mode 100644 index 7b70a6b1a9..0000000000 Binary files a/resources/sprite/remarkup_2x/text_chaos_off.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_code.png b/resources/sprite/remarkup_2x/text_code.png deleted file mode 100644 index d38e61203e..0000000000 Binary files a/resources/sprite/remarkup_2x/text_code.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_help.png b/resources/sprite/remarkup_2x/text_help.png deleted file mode 100644 index e1289327ad..0000000000 Binary files a/resources/sprite/remarkup_2x/text_help.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_i.png b/resources/sprite/remarkup_2x/text_i.png deleted file mode 100644 index fda02acade..0000000000 Binary files a/resources/sprite/remarkup_2x/text_i.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_image.png b/resources/sprite/remarkup_2x/text_image.png deleted file mode 100644 index 1627c4cdea..0000000000 Binary files a/resources/sprite/remarkup_2x/text_image.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_larger.png b/resources/sprite/remarkup_2x/text_larger.png deleted file mode 100644 index 2e3df4c8fa..0000000000 Binary files a/resources/sprite/remarkup_2x/text_larger.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_meme.png b/resources/sprite/remarkup_2x/text_meme.png deleted file mode 100644 index 118c4a0fe4..0000000000 Binary files a/resources/sprite/remarkup_2x/text_meme.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_ol.png b/resources/sprite/remarkup_2x/text_ol.png deleted file mode 100644 index a68a5dac14..0000000000 Binary files a/resources/sprite/remarkup_2x/text_ol.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_order.png b/resources/sprite/remarkup_2x/text_order.png deleted file mode 100644 index d1360b3132..0000000000 Binary files a/resources/sprite/remarkup_2x/text_order.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_order_off.png b/resources/sprite/remarkup_2x/text_order_off.png deleted file mode 100644 index 9eb688a35a..0000000000 Binary files a/resources/sprite/remarkup_2x/text_order_off.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_table.png b/resources/sprite/remarkup_2x/text_table.png deleted file mode 100644 index d59c20b7a0..0000000000 Binary files a/resources/sprite/remarkup_2x/text_table.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_tag.png b/resources/sprite/remarkup_2x/text_tag.png deleted file mode 100644 index 570b29fd6c..0000000000 Binary files a/resources/sprite/remarkup_2x/text_tag.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_tt.png b/resources/sprite/remarkup_2x/text_tt.png deleted file mode 100644 index 68e07a2951..0000000000 Binary files a/resources/sprite/remarkup_2x/text_tt.png and /dev/null differ diff --git a/resources/sprite/remarkup_2x/text_ul.png b/resources/sprite/remarkup_2x/text_ul.png deleted file mode 100644 index f3e8869333..0000000000 Binary files a/resources/sprite/remarkup_2x/text_ul.png and /dev/null differ diff --git a/resources/sprite/status_1x/accept-blue.png b/resources/sprite/status_1x/accept-blue.png deleted file mode 100644 index c5aaaee5e7..0000000000 Binary files a/resources/sprite/status_1x/accept-blue.png and /dev/null differ diff --git a/resources/sprite/status_1x/accept-dark.png b/resources/sprite/status_1x/accept-dark.png deleted file mode 100644 index d9da80853e..0000000000 Binary files a/resources/sprite/status_1x/accept-dark.png and /dev/null differ diff --git a/resources/sprite/status_1x/accept-green.png b/resources/sprite/status_1x/accept-green.png deleted file mode 100644 index bc77971ab0..0000000000 Binary files a/resources/sprite/status_1x/accept-green.png and /dev/null differ diff --git a/resources/sprite/status_1x/accept-red.png b/resources/sprite/status_1x/accept-red.png deleted file mode 100644 index c9ffd1fbf9..0000000000 Binary files a/resources/sprite/status_1x/accept-red.png and /dev/null differ diff --git a/resources/sprite/status_1x/accept-white.png b/resources/sprite/status_1x/accept-white.png deleted file mode 100644 index baf7373e55..0000000000 Binary files a/resources/sprite/status_1x/accept-white.png and /dev/null differ diff --git a/resources/sprite/status_1x/add-blue.png b/resources/sprite/status_1x/add-blue.png deleted file mode 100644 index f71e265f56..0000000000 Binary files a/resources/sprite/status_1x/add-blue.png and /dev/null differ diff --git a/resources/sprite/status_1x/add-dark.png b/resources/sprite/status_1x/add-dark.png deleted file mode 100644 index 8a1d1125b0..0000000000 Binary files a/resources/sprite/status_1x/add-dark.png and /dev/null differ diff --git a/resources/sprite/status_1x/add-green.png b/resources/sprite/status_1x/add-green.png deleted file mode 100644 index 423d9914a0..0000000000 Binary files a/resources/sprite/status_1x/add-green.png and /dev/null differ diff --git a/resources/sprite/status_1x/add-red.png b/resources/sprite/status_1x/add-red.png deleted file mode 100644 index 6ba9509074..0000000000 Binary files a/resources/sprite/status_1x/add-red.png and /dev/null differ diff --git a/resources/sprite/status_1x/add-white.png b/resources/sprite/status_1x/add-white.png deleted file mode 100644 index 00907c2434..0000000000 Binary files a/resources/sprite/status_1x/add-white.png and /dev/null differ diff --git a/resources/sprite/status_1x/down-blue.png b/resources/sprite/status_1x/down-blue.png deleted file mode 100644 index 7694510ab2..0000000000 Binary files a/resources/sprite/status_1x/down-blue.png and /dev/null differ diff --git a/resources/sprite/status_1x/down-dark.png b/resources/sprite/status_1x/down-dark.png deleted file mode 100644 index 0266a88261..0000000000 Binary files a/resources/sprite/status_1x/down-dark.png and /dev/null differ diff --git a/resources/sprite/status_1x/down-green.png b/resources/sprite/status_1x/down-green.png deleted file mode 100644 index 44eee1688b..0000000000 Binary files a/resources/sprite/status_1x/down-green.png and /dev/null differ diff --git a/resources/sprite/status_1x/down-red.png b/resources/sprite/status_1x/down-red.png deleted file mode 100644 index 019699cc9e..0000000000 Binary files a/resources/sprite/status_1x/down-red.png and /dev/null differ diff --git a/resources/sprite/status_1x/down-white.png b/resources/sprite/status_1x/down-white.png deleted file mode 100644 index 8aa0498bfc..0000000000 Binary files a/resources/sprite/status_1x/down-white.png and /dev/null differ diff --git a/resources/sprite/status_1x/info-blue.png b/resources/sprite/status_1x/info-blue.png deleted file mode 100644 index c8d614ffde..0000000000 Binary files a/resources/sprite/status_1x/info-blue.png and /dev/null differ diff --git a/resources/sprite/status_1x/info-dark.png b/resources/sprite/status_1x/info-dark.png deleted file mode 100644 index d4a73ec2d4..0000000000 Binary files a/resources/sprite/status_1x/info-dark.png and /dev/null differ diff --git a/resources/sprite/status_1x/info-green.png b/resources/sprite/status_1x/info-green.png deleted file mode 100644 index 8ae658a401..0000000000 Binary files a/resources/sprite/status_1x/info-green.png and /dev/null differ diff --git a/resources/sprite/status_1x/info-red.png b/resources/sprite/status_1x/info-red.png deleted file mode 100644 index 61125d0eab..0000000000 Binary files a/resources/sprite/status_1x/info-red.png and /dev/null differ diff --git a/resources/sprite/status_1x/info-white.png b/resources/sprite/status_1x/info-white.png deleted file mode 100644 index e3e3a05b76..0000000000 Binary files a/resources/sprite/status_1x/info-white.png and /dev/null differ diff --git a/resources/sprite/status_1x/left-blue.png b/resources/sprite/status_1x/left-blue.png deleted file mode 100644 index c3c3fe15d3..0000000000 Binary files a/resources/sprite/status_1x/left-blue.png and /dev/null differ diff --git a/resources/sprite/status_1x/left-dark.png b/resources/sprite/status_1x/left-dark.png deleted file mode 100644 index 445d678c7d..0000000000 Binary files a/resources/sprite/status_1x/left-dark.png and /dev/null differ diff --git a/resources/sprite/status_1x/left-green.png b/resources/sprite/status_1x/left-green.png deleted file mode 100644 index 389f94a260..0000000000 Binary files a/resources/sprite/status_1x/left-green.png and /dev/null differ diff --git a/resources/sprite/status_1x/left-red.png b/resources/sprite/status_1x/left-red.png deleted file mode 100644 index d9556fed8d..0000000000 Binary files a/resources/sprite/status_1x/left-red.png and /dev/null differ diff --git a/resources/sprite/status_1x/left-white.png b/resources/sprite/status_1x/left-white.png deleted file mode 100644 index c02ae7a57b..0000000000 Binary files a/resources/sprite/status_1x/left-white.png and /dev/null differ diff --git a/resources/sprite/status_1x/minus-blue.png b/resources/sprite/status_1x/minus-blue.png deleted file mode 100644 index 7c45c6a42c..0000000000 Binary files a/resources/sprite/status_1x/minus-blue.png and /dev/null differ diff --git a/resources/sprite/status_1x/minus-dark.png b/resources/sprite/status_1x/minus-dark.png deleted file mode 100644 index e23ec95946..0000000000 Binary files a/resources/sprite/status_1x/minus-dark.png and /dev/null differ diff --git a/resources/sprite/status_1x/minus-green.png b/resources/sprite/status_1x/minus-green.png deleted file mode 100644 index 9245c2c0b9..0000000000 Binary files a/resources/sprite/status_1x/minus-green.png and /dev/null differ diff --git a/resources/sprite/status_1x/minus-red.png b/resources/sprite/status_1x/minus-red.png deleted file mode 100644 index 0b2838ae98..0000000000 Binary files a/resources/sprite/status_1x/minus-red.png and /dev/null differ diff --git a/resources/sprite/status_1x/minus-white.png b/resources/sprite/status_1x/minus-white.png deleted file mode 100644 index f806c33e7a..0000000000 Binary files a/resources/sprite/status_1x/minus-white.png and /dev/null differ diff --git a/resources/sprite/status_1x/open-blue.png b/resources/sprite/status_1x/open-blue.png deleted file mode 100644 index 0dc1658f0c..0000000000 Binary files a/resources/sprite/status_1x/open-blue.png and /dev/null differ diff --git a/resources/sprite/status_1x/open-dark.png b/resources/sprite/status_1x/open-dark.png deleted file mode 100644 index 6a03b21ecc..0000000000 Binary files a/resources/sprite/status_1x/open-dark.png and /dev/null differ diff --git a/resources/sprite/status_1x/open-green.png b/resources/sprite/status_1x/open-green.png deleted file mode 100644 index a9e09e71cc..0000000000 Binary files a/resources/sprite/status_1x/open-green.png and /dev/null differ diff --git a/resources/sprite/status_1x/open-red.png b/resources/sprite/status_1x/open-red.png deleted file mode 100644 index c45f11f247..0000000000 Binary files a/resources/sprite/status_1x/open-red.png and /dev/null differ diff --git a/resources/sprite/status_1x/open-white.png b/resources/sprite/status_1x/open-white.png deleted file mode 100644 index 8bd1d357b0..0000000000 Binary files a/resources/sprite/status_1x/open-white.png and /dev/null differ diff --git a/resources/sprite/status_1x/question-blue.png b/resources/sprite/status_1x/question-blue.png deleted file mode 100644 index bc2fe4a772..0000000000 Binary files a/resources/sprite/status_1x/question-blue.png and /dev/null differ diff --git a/resources/sprite/status_1x/question-dark.png b/resources/sprite/status_1x/question-dark.png deleted file mode 100644 index 5a77cebe3f..0000000000 Binary files a/resources/sprite/status_1x/question-dark.png and /dev/null differ diff --git a/resources/sprite/status_1x/question-green.png b/resources/sprite/status_1x/question-green.png deleted file mode 100644 index 9f34c1841c..0000000000 Binary files a/resources/sprite/status_1x/question-green.png and /dev/null differ diff --git a/resources/sprite/status_1x/question-red.png b/resources/sprite/status_1x/question-red.png deleted file mode 100644 index ff11aae3cc..0000000000 Binary files a/resources/sprite/status_1x/question-red.png and /dev/null differ diff --git a/resources/sprite/status_1x/question-white.png b/resources/sprite/status_1x/question-white.png deleted file mode 100644 index 216e3a5886..0000000000 Binary files a/resources/sprite/status_1x/question-white.png and /dev/null differ diff --git a/resources/sprite/status_1x/reject-blue.png b/resources/sprite/status_1x/reject-blue.png deleted file mode 100644 index f897017977..0000000000 Binary files a/resources/sprite/status_1x/reject-blue.png and /dev/null differ diff --git a/resources/sprite/status_1x/reject-dark.png b/resources/sprite/status_1x/reject-dark.png deleted file mode 100644 index ad504aa387..0000000000 Binary files a/resources/sprite/status_1x/reject-dark.png and /dev/null differ diff --git a/resources/sprite/status_1x/reject-green.png b/resources/sprite/status_1x/reject-green.png deleted file mode 100644 index ad76e62db2..0000000000 Binary files a/resources/sprite/status_1x/reject-green.png and /dev/null differ diff --git a/resources/sprite/status_1x/reject-red.png b/resources/sprite/status_1x/reject-red.png deleted file mode 100644 index 9105004062..0000000000 Binary files a/resources/sprite/status_1x/reject-red.png and /dev/null differ diff --git a/resources/sprite/status_1x/reject-white.png b/resources/sprite/status_1x/reject-white.png deleted file mode 100644 index 0caf704258..0000000000 Binary files a/resources/sprite/status_1x/reject-white.png and /dev/null differ diff --git a/resources/sprite/status_1x/right-blue.png b/resources/sprite/status_1x/right-blue.png deleted file mode 100644 index 71529b7504..0000000000 Binary files a/resources/sprite/status_1x/right-blue.png and /dev/null differ diff --git a/resources/sprite/status_1x/right-dark.png b/resources/sprite/status_1x/right-dark.png deleted file mode 100644 index bb13cf6512..0000000000 Binary files a/resources/sprite/status_1x/right-dark.png and /dev/null differ diff --git a/resources/sprite/status_1x/right-green.png b/resources/sprite/status_1x/right-green.png deleted file mode 100644 index fe6112d53f..0000000000 Binary files a/resources/sprite/status_1x/right-green.png and /dev/null differ diff --git a/resources/sprite/status_1x/right-red.png b/resources/sprite/status_1x/right-red.png deleted file mode 100644 index 7deab4df2d..0000000000 Binary files a/resources/sprite/status_1x/right-red.png and /dev/null differ diff --git a/resources/sprite/status_1x/right-white.png b/resources/sprite/status_1x/right-white.png deleted file mode 100644 index 78e1037014..0000000000 Binary files a/resources/sprite/status_1x/right-white.png and /dev/null differ diff --git a/resources/sprite/status_1x/up-blue.png b/resources/sprite/status_1x/up-blue.png deleted file mode 100644 index 5b9ad0bc76..0000000000 Binary files a/resources/sprite/status_1x/up-blue.png and /dev/null differ diff --git a/resources/sprite/status_1x/up-dark.png b/resources/sprite/status_1x/up-dark.png deleted file mode 100644 index 05e7fd15c5..0000000000 Binary files a/resources/sprite/status_1x/up-dark.png and /dev/null differ diff --git a/resources/sprite/status_1x/up-green.png b/resources/sprite/status_1x/up-green.png deleted file mode 100644 index c66ba2fd12..0000000000 Binary files a/resources/sprite/status_1x/up-green.png and /dev/null differ diff --git a/resources/sprite/status_1x/up-red.png b/resources/sprite/status_1x/up-red.png deleted file mode 100644 index ed73bffcd8..0000000000 Binary files a/resources/sprite/status_1x/up-red.png and /dev/null differ diff --git a/resources/sprite/status_1x/up-white.png b/resources/sprite/status_1x/up-white.png deleted file mode 100644 index d19bbf90f5..0000000000 Binary files a/resources/sprite/status_1x/up-white.png and /dev/null differ diff --git a/resources/sprite/status_1x/warning-blue.png b/resources/sprite/status_1x/warning-blue.png deleted file mode 100644 index c3cc0625d3..0000000000 Binary files a/resources/sprite/status_1x/warning-blue.png and /dev/null differ diff --git a/resources/sprite/status_1x/warning-dark.png b/resources/sprite/status_1x/warning-dark.png deleted file mode 100644 index 33de2b39ff..0000000000 Binary files a/resources/sprite/status_1x/warning-dark.png and /dev/null differ diff --git a/resources/sprite/status_1x/warning-green.png b/resources/sprite/status_1x/warning-green.png deleted file mode 100644 index df2d007d07..0000000000 Binary files a/resources/sprite/status_1x/warning-green.png and /dev/null differ diff --git a/resources/sprite/status_1x/warning-red.png b/resources/sprite/status_1x/warning-red.png deleted file mode 100644 index eefd44cc42..0000000000 Binary files a/resources/sprite/status_1x/warning-red.png and /dev/null differ diff --git a/resources/sprite/status_1x/warning-white.png b/resources/sprite/status_1x/warning-white.png deleted file mode 100644 index ce515d61e4..0000000000 Binary files a/resources/sprite/status_1x/warning-white.png and /dev/null differ diff --git a/resources/sprite/status_2x/accept-blue.png b/resources/sprite/status_2x/accept-blue.png deleted file mode 100644 index 6b1586deb4..0000000000 Binary files a/resources/sprite/status_2x/accept-blue.png and /dev/null differ diff --git a/resources/sprite/status_2x/accept-dark.png b/resources/sprite/status_2x/accept-dark.png deleted file mode 100644 index 587d9af04d..0000000000 Binary files a/resources/sprite/status_2x/accept-dark.png and /dev/null differ diff --git a/resources/sprite/status_2x/accept-green.png b/resources/sprite/status_2x/accept-green.png deleted file mode 100644 index 9f681f26bc..0000000000 Binary files a/resources/sprite/status_2x/accept-green.png and /dev/null differ diff --git a/resources/sprite/status_2x/accept-red.png b/resources/sprite/status_2x/accept-red.png deleted file mode 100644 index 509273d5bb..0000000000 Binary files a/resources/sprite/status_2x/accept-red.png and /dev/null differ diff --git a/resources/sprite/status_2x/accept-white.png b/resources/sprite/status_2x/accept-white.png deleted file mode 100644 index 39efb34925..0000000000 Binary files a/resources/sprite/status_2x/accept-white.png and /dev/null differ diff --git a/resources/sprite/status_2x/add-blue.png b/resources/sprite/status_2x/add-blue.png deleted file mode 100644 index 0edbb5db84..0000000000 Binary files a/resources/sprite/status_2x/add-blue.png and /dev/null differ diff --git a/resources/sprite/status_2x/add-dark.png b/resources/sprite/status_2x/add-dark.png deleted file mode 100644 index e3533fa0f7..0000000000 Binary files a/resources/sprite/status_2x/add-dark.png and /dev/null differ diff --git a/resources/sprite/status_2x/add-green.png b/resources/sprite/status_2x/add-green.png deleted file mode 100644 index 8eb93e897e..0000000000 Binary files a/resources/sprite/status_2x/add-green.png and /dev/null differ diff --git a/resources/sprite/status_2x/add-red.png b/resources/sprite/status_2x/add-red.png deleted file mode 100644 index e2ee8ba48d..0000000000 Binary files a/resources/sprite/status_2x/add-red.png and /dev/null differ diff --git a/resources/sprite/status_2x/add-white.png b/resources/sprite/status_2x/add-white.png deleted file mode 100644 index 71ad766187..0000000000 Binary files a/resources/sprite/status_2x/add-white.png and /dev/null differ diff --git a/resources/sprite/status_2x/down-blue.png b/resources/sprite/status_2x/down-blue.png deleted file mode 100644 index 185512d5cb..0000000000 Binary files a/resources/sprite/status_2x/down-blue.png and /dev/null differ diff --git a/resources/sprite/status_2x/down-dark.png b/resources/sprite/status_2x/down-dark.png deleted file mode 100644 index 5e6d2f48fd..0000000000 Binary files a/resources/sprite/status_2x/down-dark.png and /dev/null differ diff --git a/resources/sprite/status_2x/down-green.png b/resources/sprite/status_2x/down-green.png deleted file mode 100644 index 99a5ad61b3..0000000000 Binary files a/resources/sprite/status_2x/down-green.png and /dev/null differ diff --git a/resources/sprite/status_2x/down-red.png b/resources/sprite/status_2x/down-red.png deleted file mode 100644 index fc36c023dd..0000000000 Binary files a/resources/sprite/status_2x/down-red.png and /dev/null differ diff --git a/resources/sprite/status_2x/down-white.png b/resources/sprite/status_2x/down-white.png deleted file mode 100644 index 9a419a3a21..0000000000 Binary files a/resources/sprite/status_2x/down-white.png and /dev/null differ diff --git a/resources/sprite/status_2x/info-blue.png b/resources/sprite/status_2x/info-blue.png deleted file mode 100644 index 92933a4eb7..0000000000 Binary files a/resources/sprite/status_2x/info-blue.png and /dev/null differ diff --git a/resources/sprite/status_2x/info-dark.png b/resources/sprite/status_2x/info-dark.png deleted file mode 100644 index ab82a1951a..0000000000 Binary files a/resources/sprite/status_2x/info-dark.png and /dev/null differ diff --git a/resources/sprite/status_2x/info-green.png b/resources/sprite/status_2x/info-green.png deleted file mode 100644 index 5913448a32..0000000000 Binary files a/resources/sprite/status_2x/info-green.png and /dev/null differ diff --git a/resources/sprite/status_2x/info-red.png b/resources/sprite/status_2x/info-red.png deleted file mode 100644 index 3571889bbe..0000000000 Binary files a/resources/sprite/status_2x/info-red.png and /dev/null differ diff --git a/resources/sprite/status_2x/info-white.png b/resources/sprite/status_2x/info-white.png deleted file mode 100644 index 8ef1aa7c09..0000000000 Binary files a/resources/sprite/status_2x/info-white.png and /dev/null differ diff --git a/resources/sprite/status_2x/left-blue.png b/resources/sprite/status_2x/left-blue.png deleted file mode 100644 index 297f594d89..0000000000 Binary files a/resources/sprite/status_2x/left-blue.png and /dev/null differ diff --git a/resources/sprite/status_2x/left-dark.png b/resources/sprite/status_2x/left-dark.png deleted file mode 100644 index 34aef33b96..0000000000 Binary files a/resources/sprite/status_2x/left-dark.png and /dev/null differ diff --git a/resources/sprite/status_2x/left-green.png b/resources/sprite/status_2x/left-green.png deleted file mode 100644 index 54c91f81b5..0000000000 Binary files a/resources/sprite/status_2x/left-green.png and /dev/null differ diff --git a/resources/sprite/status_2x/left-red.png b/resources/sprite/status_2x/left-red.png deleted file mode 100644 index ba9aa0e110..0000000000 Binary files a/resources/sprite/status_2x/left-red.png and /dev/null differ diff --git a/resources/sprite/status_2x/left-white.png b/resources/sprite/status_2x/left-white.png deleted file mode 100644 index a102b2f88d..0000000000 Binary files a/resources/sprite/status_2x/left-white.png and /dev/null differ diff --git a/resources/sprite/status_2x/minus-blue.png b/resources/sprite/status_2x/minus-blue.png deleted file mode 100644 index 317ffed54f..0000000000 Binary files a/resources/sprite/status_2x/minus-blue.png and /dev/null differ diff --git a/resources/sprite/status_2x/minus-dark.png b/resources/sprite/status_2x/minus-dark.png deleted file mode 100644 index f72b136956..0000000000 Binary files a/resources/sprite/status_2x/minus-dark.png and /dev/null differ diff --git a/resources/sprite/status_2x/minus-green.png b/resources/sprite/status_2x/minus-green.png deleted file mode 100644 index ccb0efbb4a..0000000000 Binary files a/resources/sprite/status_2x/minus-green.png and /dev/null differ diff --git a/resources/sprite/status_2x/minus-red.png b/resources/sprite/status_2x/minus-red.png deleted file mode 100644 index f5e10318c6..0000000000 Binary files a/resources/sprite/status_2x/minus-red.png and /dev/null differ diff --git a/resources/sprite/status_2x/minus-white.png b/resources/sprite/status_2x/minus-white.png deleted file mode 100644 index ebcf13044e..0000000000 Binary files a/resources/sprite/status_2x/minus-white.png and /dev/null differ diff --git a/resources/sprite/status_2x/open-blue.png b/resources/sprite/status_2x/open-blue.png deleted file mode 100644 index 5a68c026f4..0000000000 Binary files a/resources/sprite/status_2x/open-blue.png and /dev/null differ diff --git a/resources/sprite/status_2x/open-dark.png b/resources/sprite/status_2x/open-dark.png deleted file mode 100644 index 2f06ccf4e9..0000000000 Binary files a/resources/sprite/status_2x/open-dark.png and /dev/null differ diff --git a/resources/sprite/status_2x/open-green.png b/resources/sprite/status_2x/open-green.png deleted file mode 100644 index 4e90c62d35..0000000000 Binary files a/resources/sprite/status_2x/open-green.png and /dev/null differ diff --git a/resources/sprite/status_2x/open-red.png b/resources/sprite/status_2x/open-red.png deleted file mode 100644 index 8c7fe4b8a0..0000000000 Binary files a/resources/sprite/status_2x/open-red.png and /dev/null differ diff --git a/resources/sprite/status_2x/open-white.png b/resources/sprite/status_2x/open-white.png deleted file mode 100644 index de5b7d226c..0000000000 Binary files a/resources/sprite/status_2x/open-white.png and /dev/null differ diff --git a/resources/sprite/status_2x/question-blue.png b/resources/sprite/status_2x/question-blue.png deleted file mode 100644 index d9fdd76b7a..0000000000 Binary files a/resources/sprite/status_2x/question-blue.png and /dev/null differ diff --git a/resources/sprite/status_2x/question-dark.png b/resources/sprite/status_2x/question-dark.png deleted file mode 100644 index c53f443d91..0000000000 Binary files a/resources/sprite/status_2x/question-dark.png and /dev/null differ diff --git a/resources/sprite/status_2x/question-green.png b/resources/sprite/status_2x/question-green.png deleted file mode 100644 index 5107b89154..0000000000 Binary files a/resources/sprite/status_2x/question-green.png and /dev/null differ diff --git a/resources/sprite/status_2x/question-red.png b/resources/sprite/status_2x/question-red.png deleted file mode 100644 index 068a369390..0000000000 Binary files a/resources/sprite/status_2x/question-red.png and /dev/null differ diff --git a/resources/sprite/status_2x/question-white.png b/resources/sprite/status_2x/question-white.png deleted file mode 100644 index c1caf7419f..0000000000 Binary files a/resources/sprite/status_2x/question-white.png and /dev/null differ diff --git a/resources/sprite/status_2x/reject-blue.png b/resources/sprite/status_2x/reject-blue.png deleted file mode 100644 index 8789cd9be2..0000000000 Binary files a/resources/sprite/status_2x/reject-blue.png and /dev/null differ diff --git a/resources/sprite/status_2x/reject-dark.png b/resources/sprite/status_2x/reject-dark.png deleted file mode 100644 index c1991c6eb9..0000000000 Binary files a/resources/sprite/status_2x/reject-dark.png and /dev/null differ diff --git a/resources/sprite/status_2x/reject-green.png b/resources/sprite/status_2x/reject-green.png deleted file mode 100644 index 7f49eebad0..0000000000 Binary files a/resources/sprite/status_2x/reject-green.png and /dev/null differ diff --git a/resources/sprite/status_2x/reject-red.png b/resources/sprite/status_2x/reject-red.png deleted file mode 100644 index e0f29d1bf3..0000000000 Binary files a/resources/sprite/status_2x/reject-red.png and /dev/null differ diff --git a/resources/sprite/status_2x/reject-white.png b/resources/sprite/status_2x/reject-white.png deleted file mode 100644 index ff7a314ae5..0000000000 Binary files a/resources/sprite/status_2x/reject-white.png and /dev/null differ diff --git a/resources/sprite/status_2x/right-blue.png b/resources/sprite/status_2x/right-blue.png deleted file mode 100644 index 81be3ae7e9..0000000000 Binary files a/resources/sprite/status_2x/right-blue.png and /dev/null differ diff --git a/resources/sprite/status_2x/right-dark.png b/resources/sprite/status_2x/right-dark.png deleted file mode 100644 index ae92e97193..0000000000 Binary files a/resources/sprite/status_2x/right-dark.png and /dev/null differ diff --git a/resources/sprite/status_2x/right-green.png b/resources/sprite/status_2x/right-green.png deleted file mode 100644 index d7290b18d5..0000000000 Binary files a/resources/sprite/status_2x/right-green.png and /dev/null differ diff --git a/resources/sprite/status_2x/right-red.png b/resources/sprite/status_2x/right-red.png deleted file mode 100644 index 3f1d48e223..0000000000 Binary files a/resources/sprite/status_2x/right-red.png and /dev/null differ diff --git a/resources/sprite/status_2x/right-white.png b/resources/sprite/status_2x/right-white.png deleted file mode 100644 index 0261cc0784..0000000000 Binary files a/resources/sprite/status_2x/right-white.png and /dev/null differ diff --git a/resources/sprite/status_2x/up-blue.png b/resources/sprite/status_2x/up-blue.png deleted file mode 100644 index ed96bd604a..0000000000 Binary files a/resources/sprite/status_2x/up-blue.png and /dev/null differ diff --git a/resources/sprite/status_2x/up-dark.png b/resources/sprite/status_2x/up-dark.png deleted file mode 100644 index 1f43a5a127..0000000000 Binary files a/resources/sprite/status_2x/up-dark.png and /dev/null differ diff --git a/resources/sprite/status_2x/up-green.png b/resources/sprite/status_2x/up-green.png deleted file mode 100644 index 4406e3496b..0000000000 Binary files a/resources/sprite/status_2x/up-green.png and /dev/null differ diff --git a/resources/sprite/status_2x/up-red.png b/resources/sprite/status_2x/up-red.png deleted file mode 100644 index 262c6730ec..0000000000 Binary files a/resources/sprite/status_2x/up-red.png and /dev/null differ diff --git a/resources/sprite/status_2x/up-white.png b/resources/sprite/status_2x/up-white.png deleted file mode 100644 index f59b378c14..0000000000 Binary files a/resources/sprite/status_2x/up-white.png and /dev/null differ diff --git a/resources/sprite/status_2x/warning-blue.png b/resources/sprite/status_2x/warning-blue.png deleted file mode 100644 index 5a88becb1e..0000000000 Binary files a/resources/sprite/status_2x/warning-blue.png and /dev/null differ diff --git a/resources/sprite/status_2x/warning-dark.png b/resources/sprite/status_2x/warning-dark.png deleted file mode 100644 index 4b1eb3dee8..0000000000 Binary files a/resources/sprite/status_2x/warning-dark.png and /dev/null differ diff --git a/resources/sprite/status_2x/warning-green.png b/resources/sprite/status_2x/warning-green.png deleted file mode 100644 index 3ec7ec00f6..0000000000 Binary files a/resources/sprite/status_2x/warning-green.png and /dev/null differ diff --git a/resources/sprite/status_2x/warning-red.png b/resources/sprite/status_2x/warning-red.png deleted file mode 100644 index ad3c2d036c..0000000000 Binary files a/resources/sprite/status_2x/warning-red.png and /dev/null differ diff --git a/resources/sprite/status_2x/warning-white.png b/resources/sprite/status_2x/warning-white.png deleted file mode 100644 index 52814bc4af..0000000000 Binary files a/resources/sprite/status_2x/warning-white.png and /dev/null differ diff --git a/resources/sprite/tokens_1x/coin-1.png b/resources/sprite/tokens_1x/coin-1.png index bb981e0e20..ec7b376f31 100644 Binary files a/resources/sprite/tokens_1x/coin-1.png and b/resources/sprite/tokens_1x/coin-1.png differ diff --git a/resources/sprite/tokens_1x/coin-2.png b/resources/sprite/tokens_1x/coin-2.png index be74169b1f..8a6bdb5dc5 100644 Binary files a/resources/sprite/tokens_1x/coin-2.png and b/resources/sprite/tokens_1x/coin-2.png differ diff --git a/resources/sprite/tokens_1x/coin-3.png b/resources/sprite/tokens_1x/coin-3.png index b0e65082dd..c89f3d5a53 100644 Binary files a/resources/sprite/tokens_1x/coin-3.png and b/resources/sprite/tokens_1x/coin-3.png differ diff --git a/resources/sprite/tokens_1x/coin-4.png b/resources/sprite/tokens_1x/coin-4.png index 21b82077a3..27cd25c15d 100644 Binary files a/resources/sprite/tokens_1x/coin-4.png and b/resources/sprite/tokens_1x/coin-4.png differ diff --git a/resources/sprite/tokens_1x/emoji-1.png b/resources/sprite/tokens_1x/emoji-1.png new file mode 100644 index 0000000000..dfc2ec784a Binary files /dev/null and b/resources/sprite/tokens_1x/emoji-1.png differ diff --git a/resources/sprite/tokens_1x/emoji-2.png b/resources/sprite/tokens_1x/emoji-2.png new file mode 100644 index 0000000000..124b5a84d1 Binary files /dev/null and b/resources/sprite/tokens_1x/emoji-2.png differ diff --git a/resources/sprite/tokens_1x/emoji-3.png b/resources/sprite/tokens_1x/emoji-3.png new file mode 100644 index 0000000000..8d3b9f10e0 Binary files /dev/null and b/resources/sprite/tokens_1x/emoji-3.png differ diff --git a/resources/sprite/tokens_1x/emoji-4.png b/resources/sprite/tokens_1x/emoji-4.png new file mode 100644 index 0000000000..92ff339ce2 Binary files /dev/null and b/resources/sprite/tokens_1x/emoji-4.png differ diff --git a/resources/sprite/tokens_1x/emoji-5.png b/resources/sprite/tokens_1x/emoji-5.png new file mode 100644 index 0000000000..66c746910d Binary files /dev/null and b/resources/sprite/tokens_1x/emoji-5.png differ diff --git a/resources/sprite/tokens_1x/emoji-6.png b/resources/sprite/tokens_1x/emoji-6.png new file mode 100644 index 0000000000..4509a81684 Binary files /dev/null and b/resources/sprite/tokens_1x/emoji-6.png differ diff --git a/resources/sprite/tokens_1x/emoji-7.png b/resources/sprite/tokens_1x/emoji-7.png new file mode 100644 index 0000000000..cb4780d99b Binary files /dev/null and b/resources/sprite/tokens_1x/emoji-7.png differ diff --git a/resources/sprite/tokens_1x/emoji-8.png b/resources/sprite/tokens_1x/emoji-8.png new file mode 100644 index 0000000000..eb50ae85cb Binary files /dev/null and b/resources/sprite/tokens_1x/emoji-8.png differ diff --git a/resources/sprite/tokens_1x/heart-1.png b/resources/sprite/tokens_1x/heart-1.png index 53e1013a58..65c469ea5d 100644 Binary files a/resources/sprite/tokens_1x/heart-1.png and b/resources/sprite/tokens_1x/heart-1.png differ diff --git a/resources/sprite/tokens_1x/heart-2.png b/resources/sprite/tokens_1x/heart-2.png index 88bc63982d..387be5eaf8 100644 Binary files a/resources/sprite/tokens_1x/heart-2.png and b/resources/sprite/tokens_1x/heart-2.png differ diff --git a/resources/sprite/tokens_1x/like-1.png b/resources/sprite/tokens_1x/like-1.png index e0a27d224e..dfb7cc2a90 100644 Binary files a/resources/sprite/tokens_1x/like-1.png and b/resources/sprite/tokens_1x/like-1.png differ diff --git a/resources/sprite/tokens_1x/like-2.png b/resources/sprite/tokens_1x/like-2.png index d4069f13eb..287a04d553 100644 Binary files a/resources/sprite/tokens_1x/like-2.png and b/resources/sprite/tokens_1x/like-2.png differ diff --git a/resources/sprite/tokens_1x/medal-1.png b/resources/sprite/tokens_1x/medal-1.png index 83c06af3ad..adb1dbfaf9 100644 Binary files a/resources/sprite/tokens_1x/medal-1.png and b/resources/sprite/tokens_1x/medal-1.png differ diff --git a/resources/sprite/tokens_1x/medal-2.png b/resources/sprite/tokens_1x/medal-2.png index 1f970d4007..ec0c3c5342 100644 Binary files a/resources/sprite/tokens_1x/medal-2.png and b/resources/sprite/tokens_1x/medal-2.png differ diff --git a/resources/sprite/tokens_1x/medal-3.png b/resources/sprite/tokens_1x/medal-3.png index ab60c071fd..7c9bf7bfe1 100644 Binary files a/resources/sprite/tokens_1x/medal-3.png and b/resources/sprite/tokens_1x/medal-3.png differ diff --git a/resources/sprite/tokens_1x/medal-4.png b/resources/sprite/tokens_1x/medal-4.png index e471b25647..ceb8bd255e 100644 Binary files a/resources/sprite/tokens_1x/medal-4.png and b/resources/sprite/tokens_1x/medal-4.png differ diff --git a/resources/sprite/tokens_1x/misc-1.png b/resources/sprite/tokens_1x/misc-1.png index 1d970631fa..9d7a74199b 100644 Binary files a/resources/sprite/tokens_1x/misc-1.png and b/resources/sprite/tokens_1x/misc-1.png differ diff --git a/resources/sprite/tokens_1x/misc-2.png b/resources/sprite/tokens_1x/misc-2.png index 70264e0682..773b38915a 100644 Binary files a/resources/sprite/tokens_1x/misc-2.png and b/resources/sprite/tokens_1x/misc-2.png differ diff --git a/resources/sprite/tokens_1x/misc-3.png b/resources/sprite/tokens_1x/misc-3.png index 1f1d12edc1..3f4e9c90db 100644 Binary files a/resources/sprite/tokens_1x/misc-3.png and b/resources/sprite/tokens_1x/misc-3.png differ diff --git a/resources/sprite/tokens_1x/misc-4.png b/resources/sprite/tokens_1x/misc-4.png index 2004a78417..956bb1bbaf 100644 Binary files a/resources/sprite/tokens_1x/misc-4.png and b/resources/sprite/tokens_1x/misc-4.png differ diff --git a/resources/sprite/tokens_2x/coin-1.png b/resources/sprite/tokens_2x/coin-1.png new file mode 100644 index 0000000000..6f73730ec0 Binary files /dev/null and b/resources/sprite/tokens_2x/coin-1.png differ diff --git a/resources/sprite/tokens_2x/coin-2.png b/resources/sprite/tokens_2x/coin-2.png new file mode 100644 index 0000000000..5c462eb73b Binary files /dev/null and b/resources/sprite/tokens_2x/coin-2.png differ diff --git a/resources/sprite/tokens_2x/coin-3.png b/resources/sprite/tokens_2x/coin-3.png new file mode 100644 index 0000000000..2b79bc3050 Binary files /dev/null and b/resources/sprite/tokens_2x/coin-3.png differ diff --git a/resources/sprite/tokens_2x/coin-4.png b/resources/sprite/tokens_2x/coin-4.png new file mode 100644 index 0000000000..10436a617c Binary files /dev/null and b/resources/sprite/tokens_2x/coin-4.png differ diff --git a/resources/sprite/tokens_2x/emoji-1.png b/resources/sprite/tokens_2x/emoji-1.png new file mode 100644 index 0000000000..ba8dfc6fa3 Binary files /dev/null and b/resources/sprite/tokens_2x/emoji-1.png differ diff --git a/resources/sprite/tokens_2x/emoji-2.png b/resources/sprite/tokens_2x/emoji-2.png new file mode 100644 index 0000000000..42ade697bd Binary files /dev/null and b/resources/sprite/tokens_2x/emoji-2.png differ diff --git a/resources/sprite/tokens_2x/emoji-3.png b/resources/sprite/tokens_2x/emoji-3.png new file mode 100644 index 0000000000..1a5cbc1947 Binary files /dev/null and b/resources/sprite/tokens_2x/emoji-3.png differ diff --git a/resources/sprite/tokens_2x/emoji-4.png b/resources/sprite/tokens_2x/emoji-4.png new file mode 100644 index 0000000000..5ac7e115ae Binary files /dev/null and b/resources/sprite/tokens_2x/emoji-4.png differ diff --git a/resources/sprite/tokens_2x/emoji-5.png b/resources/sprite/tokens_2x/emoji-5.png new file mode 100644 index 0000000000..4284870eda Binary files /dev/null and b/resources/sprite/tokens_2x/emoji-5.png differ diff --git a/resources/sprite/tokens_2x/emoji-6.png b/resources/sprite/tokens_2x/emoji-6.png new file mode 100644 index 0000000000..13771dd348 Binary files /dev/null and b/resources/sprite/tokens_2x/emoji-6.png differ diff --git a/resources/sprite/tokens_2x/emoji-7.png b/resources/sprite/tokens_2x/emoji-7.png new file mode 100644 index 0000000000..b7df3d7e95 Binary files /dev/null and b/resources/sprite/tokens_2x/emoji-7.png differ diff --git a/resources/sprite/tokens_2x/emoji-8.png b/resources/sprite/tokens_2x/emoji-8.png new file mode 100644 index 0000000000..f468e6112a Binary files /dev/null and b/resources/sprite/tokens_2x/emoji-8.png differ diff --git a/resources/sprite/tokens_2x/heart-1.png b/resources/sprite/tokens_2x/heart-1.png new file mode 100644 index 0000000000..baa1024882 Binary files /dev/null and b/resources/sprite/tokens_2x/heart-1.png differ diff --git a/resources/sprite/tokens_2x/heart-2.png b/resources/sprite/tokens_2x/heart-2.png new file mode 100644 index 0000000000..fabce4406b Binary files /dev/null and b/resources/sprite/tokens_2x/heart-2.png differ diff --git a/resources/sprite/tokens_2x/like-1.png b/resources/sprite/tokens_2x/like-1.png new file mode 100644 index 0000000000..4d4a4d6a9d Binary files /dev/null and b/resources/sprite/tokens_2x/like-1.png differ diff --git a/resources/sprite/tokens_2x/like-2.png b/resources/sprite/tokens_2x/like-2.png new file mode 100644 index 0000000000..4d41fa4975 Binary files /dev/null and b/resources/sprite/tokens_2x/like-2.png differ diff --git a/resources/sprite/tokens_2x/medal-1.png b/resources/sprite/tokens_2x/medal-1.png new file mode 100644 index 0000000000..9a07e5defe Binary files /dev/null and b/resources/sprite/tokens_2x/medal-1.png differ diff --git a/resources/sprite/tokens_2x/medal-2.png b/resources/sprite/tokens_2x/medal-2.png new file mode 100644 index 0000000000..4587141553 Binary files /dev/null and b/resources/sprite/tokens_2x/medal-2.png differ diff --git a/resources/sprite/tokens_2x/medal-3.png b/resources/sprite/tokens_2x/medal-3.png new file mode 100644 index 0000000000..2aa37023ce Binary files /dev/null and b/resources/sprite/tokens_2x/medal-3.png differ diff --git a/resources/sprite/tokens_2x/medal-4.png b/resources/sprite/tokens_2x/medal-4.png new file mode 100644 index 0000000000..1347eacb11 Binary files /dev/null and b/resources/sprite/tokens_2x/medal-4.png differ diff --git a/resources/sprite/tokens_2x/misc-1.png b/resources/sprite/tokens_2x/misc-1.png new file mode 100644 index 0000000000..956429d607 Binary files /dev/null and b/resources/sprite/tokens_2x/misc-1.png differ diff --git a/resources/sprite/tokens_2x/misc-2.png b/resources/sprite/tokens_2x/misc-2.png new file mode 100644 index 0000000000..9ebcc2fdbb Binary files /dev/null and b/resources/sprite/tokens_2x/misc-2.png differ diff --git a/resources/sprite/tokens_2x/misc-3.png b/resources/sprite/tokens_2x/misc-3.png new file mode 100644 index 0000000000..c40e5a28b3 Binary files /dev/null and b/resources/sprite/tokens_2x/misc-3.png differ diff --git a/resources/sprite/tokens_2x/misc-4.png b/resources/sprite/tokens_2x/misc-4.png new file mode 100644 index 0000000000..56b6220ec4 Binary files /dev/null and b/resources/sprite/tokens_2x/misc-4.png differ diff --git a/resources/sql/autopatches/20140104.harbormastercmd.sql b/resources/sql/autopatches/20140104.harbormastercmd.sql new file mode 100644 index 0000000000..8d4d2f5125 --- /dev/null +++ b/resources/sql/autopatches/20140104.harbormastercmd.sql @@ -0,0 +1,18 @@ +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildcommand ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + targetPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + command VARCHAR(128) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_target` (targetPHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_build + DROP cancelRequested; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildtarget + ADD targetStatus VARCHAR(64) NOT NULL COLLATE utf8_bin; + +UPDATE {$NAMESPACE}_harbormaster.harbormaster_buildtarget + SET targetStatus = 'target/pending' WHERE targetStatus = ''; diff --git a/resources/sql/autopatches/20140106.macromailkey.1.sql b/resources/sql/autopatches/20140106.macromailkey.1.sql new file mode 100644 index 0000000000..39bdc9aed4 --- /dev/null +++ b/resources/sql/autopatches/20140106.macromailkey.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_file.file_imagemacro + ADD mailKey VARCHAR(20) NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140106.macromailkey.2.php b/resources/sql/autopatches/20140106.macromailkey.2.php new file mode 100644 index 0000000000..a91e5a2c20 --- /dev/null +++ b/resources/sql/autopatches/20140106.macromailkey.2.php @@ -0,0 +1,23 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $macro) { + $id = $macro->getID(); + + echo pht('Populating macro %d...', $id)."\n"; + + if (!$macro->getMailKey()) { + queryfx( + $conn_w, + 'UPDATE %T SET mailKey = %s WHERE id = %d', + $table->getTableName(), + Filesystem::readRandomCharacters(20), + $id); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140108.ddbpname.1.sql b/resources/sql/autopatches/20140108.ddbpname.1.sql new file mode 100644 index 0000000000..3fe80875db --- /dev/null +++ b/resources/sql/autopatches/20140108.ddbpname.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_blueprint + ADD blueprintName VARCHAR(255) NOT NULL AFTER className; diff --git a/resources/sql/autopatches/20140108.ddbpname.2.php b/resources/sql/autopatches/20140108.ddbpname.2.php new file mode 100644 index 0000000000..3316f3df1d --- /dev/null +++ b/resources/sql/autopatches/20140108.ddbpname.2.php @@ -0,0 +1,23 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $blueprint) { + $id = $blueprint->getID(); + + echo pht('Populating blueprint %d...', $id)."\n"; + + if (!strlen($blueprint->getBlueprintName())) { + queryfx( + $conn_w, + 'UPDATE %T SET blueprintName = %s WHERE id = %d', + $table->getTableName(), + pht('Blueprint %s', $id), + $id); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140109.ddxactions.sql b/resources/sql/autopatches/20140109.ddxactions.sql new file mode 100644 index 0000000000..54e410021b --- /dev/null +++ b/resources/sql/autopatches/20140109.ddxactions.sql @@ -0,0 +1,21 @@ +CREATE TABLE {$NAMESPACE}_drydock.drydock_blueprinttransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140109.projectcolumnsdates.sql b/resources/sql/autopatches/20140109.projectcolumnsdates.sql new file mode 100644 index 0000000000..96dda544e4 --- /dev/null +++ b/resources/sql/autopatches/20140109.projectcolumnsdates.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_project.project_column + ADD dateCreated INT UNSIGNED NOT NULL; + +ALTER TABLE {$NAMESPACE}_project.project_column + ADD dateModified INT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20140113.legalpadsig.1.sql b/resources/sql/autopatches/20140113.legalpadsig.1.sql new file mode 100644 index 0000000000..52f0ccdd61 --- /dev/null +++ b/resources/sql/autopatches/20140113.legalpadsig.1.sql @@ -0,0 +1,8 @@ +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + ADD secretKey VARCHAR(20) NOT NULL COLLATE utf8_bin; + +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + ADD verified TINYINT(1) DEFAULT 0; + +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + ADD KEY `secretKey` (secretKey); diff --git a/resources/sql/autopatches/20140113.legalpadsig.2.php b/resources/sql/autopatches/20140113.legalpadsig.2.php new file mode 100644 index 0000000000..6c7b0131b2 --- /dev/null +++ b/resources/sql/autopatches/20140113.legalpadsig.2.php @@ -0,0 +1,23 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $sig) { + $id = $sig->getID(); + + echo pht('Populating signature %d...', $id)."\n"; + + if (!$sig->getSecretKey()) { + queryfx( + $conn_w, + 'UPDATE %T SET secretKey = %s WHERE id = %d', + $table->getTableName(), + Filesystem::readRandomCharacters(20), + $id); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140115.auth.1.id.sql b/resources/sql/autopatches/20140115.auth.1.id.sql new file mode 100644 index 0000000000..ba173c126a --- /dev/null +++ b/resources/sql/autopatches/20140115.auth.1.id.sql @@ -0,0 +1,8 @@ +ALTER TABLE {$NAMESPACE}_user.phabricator_session + DROP PRIMARY KEY; + +ALTER TABLE {$NAMESPACE}_user.phabricator_session + ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; + +ALTER TABLE {$NAMESPACE}_user.phabricator_session + ADD KEY `key_identity` (userPHID, type); diff --git a/resources/sql/autopatches/20140115.auth.2.expires.sql b/resources/sql/autopatches/20140115.auth.2.expires.sql new file mode 100644 index 0000000000..94b36af7da --- /dev/null +++ b/resources/sql/autopatches/20140115.auth.2.expires.sql @@ -0,0 +1,8 @@ +ALTER TABLE {$NAMESPACE}_user.phabricator_session + ADD sessionExpires INT UNSIGNED NOT NULL; + +UPDATE {$NAMESPACE}_user.phabricator_session + SET sessionExpires = UNIX_TIMESTAMP() + (60 * 60 * 24 * 30); + +ALTER TABLE {$NAMESPACE}_user.phabricator_session + ADD KEY `key_expires` (sessionExpires); diff --git a/resources/sql/autopatches/20140115.auth.3.unlimit.php b/resources/sql/autopatches/20140115.auth.3.unlimit.php new file mode 100644 index 0000000000..9e5bc7fed3 --- /dev/null +++ b/resources/sql/autopatches/20140115.auth.3.unlimit.php @@ -0,0 +1,26 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($session_table) as $session) { + $id = $session->getID(); + + echo pht('Migrating session %d...', $id)."\n"; + $old_type = $session->getType(); + $new_type = preg_replace('/-.*$/', '', $old_type); + + if ($old_type !== $new_type) { + queryfx( + $conn_w, + 'UPDATE %T SET type = %s WHERE id = %d', + $session_table->getTableName(), + $new_type, + $id); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140115.legalpadsigkey.sql b/resources/sql/autopatches/20140115.legalpadsigkey.sql new file mode 100644 index 0000000000..c02873bebc --- /dev/null +++ b/resources/sql/autopatches/20140115.legalpadsigkey.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + DROP KEY `key_document`; + +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + ADD KEY `key_document` (`documentPHID`,`signerPHID`, `documentVersion`); diff --git a/resources/sql/autopatches/20140116.reporefcursor.sql b/resources/sql/autopatches/20140116.reporefcursor.sql new file mode 100644 index 0000000000..e9593f7abc --- /dev/null +++ b/resources/sql/autopatches/20140116.reporefcursor.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_refcursor ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + repositoryPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + refType VARCHAR(32) NOT NULL COLLATE utf8_bin, + refNameHash VARCHAR(12) NOT NULL COLLATE latin1_bin, + refNameRaw LONGTEXT NOT NULL COLLATE latin1_bin, + refNameEncoding VARCHAR(16) COLLATE utf8_bin, + commitIdentifier VARCHAR(40) NOT NULL COLLATE utf8_bin, + + KEY `key_cursor` (repositoryPHID, refType, refNameHash) +) ENGINE=InnoDB, COLLATE=utf8_general_ci; diff --git a/resources/sql/autopatches/20140126.diff.1.parentrevisionid.sql b/resources/sql/autopatches/20140126.diff.1.parentrevisionid.sql new file mode 100644 index 0000000000..4468e240b4 --- /dev/null +++ b/resources/sql/autopatches/20140126.diff.1.parentrevisionid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_diff + DROP COLUMN parentRevisionID; diff --git a/resources/sql/autopatches/20140126.diff.2.repositoryphid.sql b/resources/sql/autopatches/20140126.diff.2.repositoryphid.sql new file mode 100644 index 0000000000..336c15f741 --- /dev/null +++ b/resources/sql/autopatches/20140126.diff.2.repositoryphid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_diff + ADD COLUMN repositoryPHID VARCHAR(64) COLLATE utf8_bin AFTER authorPHID; diff --git a/resources/sql/autopatches/20140130.dash.1.board.sql b/resources/sql/autopatches/20140130.dash.1.board.sql new file mode 100644 index 0000000000..51f82c02a5 --- /dev/null +++ b/resources/sql/autopatches/20140130.dash.1.board.sql @@ -0,0 +1,10 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + name VARCHAR(255) NOT NULL, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE=utf8_general_ci; diff --git a/resources/sql/autopatches/20140130.dash.2.panel.sql b/resources/sql/autopatches/20140130.dash.2.panel.sql new file mode 100644 index 0000000000..3176ed3f63 --- /dev/null +++ b/resources/sql/autopatches/20140130.dash.2.panel.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_panel ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + name VARCHAR(255) NOT NULL, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + properties LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE=utf8_general_ci; diff --git a/resources/sql/autopatches/20140130.dash.3.boardxaction.sql b/resources/sql/autopatches/20140130.dash.3.boardxaction.sql new file mode 100644 index 0000000000..a29a4f0e1b --- /dev/null +++ b/resources/sql/autopatches/20140130.dash.3.boardxaction.sql @@ -0,0 +1,21 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_transaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140130.dash.4.panelxaction.sql b/resources/sql/autopatches/20140130.dash.4.panelxaction.sql new file mode 100644 index 0000000000..cf36381416 --- /dev/null +++ b/resources/sql/autopatches/20140130.dash.4.panelxaction.sql @@ -0,0 +1,21 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_paneltransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140130.mail.1.retry.sql b/resources/sql/autopatches/20140130.mail.1.retry.sql new file mode 100644 index 0000000000..42ff5afab2 --- /dev/null +++ b/resources/sql/autopatches/20140130.mail.1.retry.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_metamta.metamta_mail + DROP COLUMN retryCount; diff --git a/resources/sql/autopatches/20140130.mail.2.next.sql b/resources/sql/autopatches/20140130.mail.2.next.sql new file mode 100644 index 0000000000..78e5693cf1 --- /dev/null +++ b/resources/sql/autopatches/20140130.mail.2.next.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_metamta.metamta_mail + DROP COLUMN nextRetry; diff --git a/resources/sql/autopatches/20140201.gc.1.mailsent.sql b/resources/sql/autopatches/20140201.gc.1.mailsent.sql new file mode 100644 index 0000000000..21254ca890 --- /dev/null +++ b/resources/sql/autopatches/20140201.gc.1.mailsent.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_metamta.metamta_mail + ADD KEY `key_created` (dateCreated); diff --git a/resources/sql/autopatches/20140201.gc.2.mailreceived.sql b/resources/sql/autopatches/20140201.gc.2.mailreceived.sql new file mode 100644 index 0000000000..e9de922182 --- /dev/null +++ b/resources/sql/autopatches/20140201.gc.2.mailreceived.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_metamta.metamta_receivedmail + ADD KEY `key_created` (dateCreated); diff --git a/resources/sql/autopatches/20140205.cal.1.rename.sql b/resources/sql/autopatches/20140205.cal.1.rename.sql new file mode 100644 index 0000000000..83622ae3ad --- /dev/null +++ b/resources/sql/autopatches/20140205.cal.1.rename.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user_status + RENAME {$NAMESPACE}_calendar.calendar_event; diff --git a/resources/sql/autopatches/20140205.cal.2.phid-col.sql b/resources/sql/autopatches/20140205.cal.2.phid-col.sql new file mode 100644 index 0000000000..3f1e10e423 --- /dev/null +++ b/resources/sql/autopatches/20140205.cal.2.phid-col.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD phid VARCHAR(64) NOT NULL COLLATE utf8_bin AFTER id; diff --git a/resources/sql/autopatches/20140205.cal.3.phid-mig.php b/resources/sql/autopatches/20140205.cal.3.phid-mig.php new file mode 100644 index 0000000000..7aff389d17 --- /dev/null +++ b/resources/sql/autopatches/20140205.cal.3.phid-mig.php @@ -0,0 +1,22 @@ +establishConnection('w'); + +echo pht('Assigning PHIDs to events...')."\n"; +foreach (new LiskMigrationIterator($table) as $event) { + $id = $event->getID(); + + echo pht('Updating event %d...', $id)."\n"; + if ($event->getPHID()) { + continue; + } + + queryfx( + $conn_w, + 'UPDATE %T SET phid = %s WHERE id = %d', + $table->getTableName(), + $table->generatePHID(), + $id); +} +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140205.cal.4.phid-key.sql b/resources/sql/autopatches/20140205.cal.4.phid-key.sql new file mode 100644 index 0000000000..cde0e10b78 --- /dev/null +++ b/resources/sql/autopatches/20140205.cal.4.phid-key.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD UNIQUE KEY `key_phid` (phid); diff --git a/resources/sql/autopatches/20140210.herald.rule-condition-mig.php b/resources/sql/autopatches/20140210.herald.rule-condition-mig.php new file mode 100644 index 0000000000..9a5e40ba0c --- /dev/null +++ b/resources/sql/autopatches/20140210.herald.rule-condition-mig.php @@ -0,0 +1,32 @@ +establishConnection('w'); + +echo pht( + "Migrating Herald conditions of type Herald rule from IDs to PHIDs...\n"); +foreach (new LiskMigrationIterator($table) as $condition) { + if ($condition->getFieldName() != HeraldAnotherRuleField::FIELDCONST) { + continue; + } + + $value = $condition->getValue(); + if (!is_numeric($value)) { + continue; + } + $id = $condition->getID(); + echo pht('Updating condition %s...', $id)."\n"; + + $rule = id(new HeraldRuleQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withIDs(array($value)) + ->executeOne(); + + queryfx( + $conn_w, + 'UPDATE %T SET value = %s WHERE id = %d', + $table->getTableName(), + json_encode($rule->getPHID()), + $id); +} +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140210.projcfield.1.blurb.php b/resources/sql/autopatches/20140210.projcfield.1.blurb.php new file mode 100644 index 0000000000..90c4242e8d --- /dev/null +++ b/resources/sql/autopatches/20140210.projcfield.1.blurb.php @@ -0,0 +1,25 @@ +establishConnection('w'); +$table_name = id(new PhabricatorProjectCustomFieldStorage())->getTableName(); + +$rows = new LiskRawMigrationIterator($conn_w, 'project_profile'); + +echo pht('Migrating project descriptions to custom storage...')."\n"; +foreach ($rows as $row) { + $phid = $row['projectPHID']; + + $desc = $row['blurb']; + if (strlen($desc)) { + queryfx( + $conn_w, + 'INSERT IGNORE INTO %T (objectPHID, fieldIndex, fieldValue) + VALUES (%s, %s, %s)', + $table_name, + $phid, + PhabricatorHash::digestForIndex('std:project:internal:description'), + $desc); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140210.projcfield.2.piccol.sql b/resources/sql/autopatches/20140210.projcfield.2.piccol.sql new file mode 100644 index 0000000000..08e1c11ed8 --- /dev/null +++ b/resources/sql/autopatches/20140210.projcfield.2.piccol.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD profileImagePHID VARCHAR(64) COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140210.projcfield.3.picmig.sql b/resources/sql/autopatches/20140210.projcfield.3.picmig.sql new file mode 100644 index 0000000000..0b9814035e --- /dev/null +++ b/resources/sql/autopatches/20140210.projcfield.3.picmig.sql @@ -0,0 +1,4 @@ +UPDATE {$NAMESPACE}_project.project proj, + {$NAMESPACE}_project.project_profile profile + SET proj.profileImagePHID = profile.profileImagePHID + WHERE proj.phid = profile.projectPHID; diff --git a/resources/sql/autopatches/20140210.projcfield.4.memmig.sql b/resources/sql/autopatches/20140210.projcfield.4.memmig.sql new file mode 100644 index 0000000000..f719f52a60 --- /dev/null +++ b/resources/sql/autopatches/20140210.projcfield.4.memmig.sql @@ -0,0 +1,8 @@ +/* These are here so `grep` will find them if we ever change things: */ + +/* PhabricatorProjectProjectHasMemberEdgeType::EDGECONST = 13 */ +/* PhabricatorObjectHasSubscriberEdgeType::EDGECONST = 21 */ + +INSERT IGNORE INTO {$NAMESPACE}_project.edge (src, type, dst, dateCreated) + SELECT src, 21, dst, dateCreated FROM {$NAMESPACE}_project.edge + WHERE type = 13; diff --git a/resources/sql/autopatches/20140210.projcfield.5.dropprofile.sql b/resources/sql/autopatches/20140210.projcfield.5.dropprofile.sql new file mode 100644 index 0000000000..ddaaa0eeeb --- /dev/null +++ b/resources/sql/autopatches/20140210.projcfield.5.dropprofile.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_project.project_profile; diff --git a/resources/sql/autopatches/20140211.dx.1.nullablechangesetid.sql b/resources/sql/autopatches/20140211.dx.1.nullablechangesetid.sql new file mode 100644 index 0000000000..3132bec7ab --- /dev/null +++ b/resources/sql/autopatches/20140211.dx.1.nullablechangesetid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_transaction_comment + CHANGE changesetID changesetID INT UNSIGNED; diff --git a/resources/sql/autopatches/20140211.dx.2.migcommenttext.php b/resources/sql/autopatches/20140211.dx.2.migcommenttext.php new file mode 100644 index 0000000000..7c531f51f8 --- /dev/null +++ b/resources/sql/autopatches/20140211.dx.2.migcommenttext.php @@ -0,0 +1,70 @@ +establishConnection('w'); +$rows = new LiskRawMigrationIterator($conn_w, 'differential_comment'); + +$content_source = PhabricatorContentSource::newForSource( + PhabricatorOldWorldContentSource::SOURCECONST)->serialize(); + +echo pht('Migrating Differential comment text to modern storage...')."\n"; +foreach ($rows as $row) { + $id = $row['id']; + echo pht('Migrating Differential comment %d...', $id)."\n"; + if (!strlen($row['content'])) { + echo pht('Comment has no text, continuing.')."\n"; + continue; + } + + $revision = id(new DifferentialRevision())->load($row['revisionID']); + if (!$revision) { + echo pht('Comment has no valid revision, continuing.')."\n"; + continue; + } + + $revision_phid = $revision->getPHID(); + + $dst_table = 'differential_inline_comment'; + + $xaction_phid = PhabricatorPHID::generateNewPHID( + PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST, + DifferentialRevisionPHIDType::TYPECONST); + + $comment_phid = PhabricatorPHID::generateNewPHID( + PhabricatorPHIDConstants::PHID_TYPE_XCMT, + DifferentialRevisionPHIDType::TYPECONST); + + queryfx( + $conn_w, + 'INSERT IGNORE INTO %T + (phid, transactionPHID, authorPHID, viewPolicy, editPolicy, + commentVersion, content, contentSource, isDeleted, + dateCreated, dateModified, revisionPHID, changesetID, + legacyCommentID) + VALUES (%s, %s, %s, %s, %s, + %d, %s, %s, %d, + %d, %d, %s, %nd, + %d)', + 'differential_transaction_comment', + + // phid, transactionPHID, authorPHID, viewPolicy, editPolicy + $comment_phid, + $xaction_phid, + $row['authorPHID'], + 'public', + $row['authorPHID'], + + // commentVersion, content, contentSource, isDeleted + 1, + $row['content'], + $content_source, + 0, + + // dateCreated, dateModified, revisionPHID, changesetID, legacyCommentID + $row['dateCreated'], + $row['dateModified'], + $revision_phid, + null, + $row['id']); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140211.dx.3.migsubscriptions.sql b/resources/sql/autopatches/20140211.dx.3.migsubscriptions.sql new file mode 100644 index 0000000000..1b0d3777a2 --- /dev/null +++ b/resources/sql/autopatches/20140211.dx.3.migsubscriptions.sql @@ -0,0 +1,10 @@ +/* For `grep`: */ + +/* PhabricatorObjectHasSubscriberEdgeType::EDGECONST = 21 */ + +INSERT IGNORE INTO {$NAMESPACE}_differential.edge (src, type, dst, seq) + SELECT rev.phid, 21, rel.objectPHID, rel.sequence + FROM {$NAMESPACE}_differential.differential_revision rev + JOIN {$NAMESPACE}_differential.differential_relationship rel + ON rev.id = rel.revisionID + WHERE relation = 'subd'; diff --git a/resources/sql/autopatches/20140211.dx.999.drop.relationships.sql b/resources/sql/autopatches/20140211.dx.999.drop.relationships.sql new file mode 100644 index 0000000000..464128f58c --- /dev/null +++ b/resources/sql/autopatches/20140211.dx.999.drop.relationships.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_differential.differential_relationship; diff --git a/resources/sql/autopatches/20140212.dx.1.armageddon.php b/resources/sql/autopatches/20140212.dx.1.armageddon.php new file mode 100644 index 0000000000..a7e978b559 --- /dev/null +++ b/resources/sql/autopatches/20140212.dx.1.armageddon.php @@ -0,0 +1,221 @@ +establishConnection('w'); +$rows = new LiskRawMigrationIterator($conn_w, 'differential_comment'); + +$content_source = PhabricatorContentSource::newForSource( + PhabricatorOldWorldContentSource::SOURCECONST)->serialize(); + +echo pht('Migrating Differential comments to modern storage...')."\n"; +foreach ($rows as $row) { + $id = $row['id']; + echo pht('Migrating comment %d...', $id)."\n"; + + $revision = id(new DifferentialRevision())->load($row['revisionID']); + if (!$revision) { + echo pht('No revision, continuing.')."\n"; + continue; + } + + $revision_phid = $revision->getPHID(); + + $comments = queryfx_all( + $conn_w, + 'SELECT * FROM %T WHERE legacyCommentID = %d', + 'differential_transaction_comment', + $id); + + $main_comments = array(); + $inline_comments = array(); + + foreach ($comments as $comment) { + if ($comment['changesetID']) { + $inline_comments[] = $comment; + } else { + $main_comments[] = $comment; + } + } + + $metadata = json_decode($row['metadata'], true); + if (!is_array($metadata)) { + $metadata = array(); + } + + $key_cc = 'added-ccs'; + $key_add_rev = 'added-reviewers'; + $key_rem_rev = 'removed-reviewers'; + $key_diff_id = 'diff-id'; + + $xactions = array(); + + // Build the main action transaction. + switch ($row['action']) { + case DifferentialAction::ACTION_COMMENT: + case DifferentialAction::ACTION_ADDREVIEWERS: + case DifferentialAction::ACTION_ADDCCS: + case DifferentialAction::ACTION_UPDATE: + case DifferentialTransaction::TYPE_INLINE: + // These actions will have their transactions created by other rules. + break; + default: + // Otherwise, this is a normal action (like an accept or reject). + $xactions[] = array( + 'type' => DifferentialTransaction::TYPE_ACTION, + 'old' => null, + 'new' => $row['action'], + ); + break; + } + + // Build the diff update transaction, if one exists. + $diff_id = idx($metadata, $key_diff_id); + if (!is_scalar($diff_id)) { + $diff_id = null; + } + + if ($diff_id || $row['action'] == DifferentialAction::ACTION_UPDATE) { + $xactions[] = array( + 'type' => DifferentialRevisionUpdateTransaction::TRANSACTIONTYPE, + 'old' => null, + 'new' => $diff_id, + ); + } + + // Build the add/remove reviewers transaction, if one exists. + $add_rev = idx($metadata, $key_add_rev, array()); + if (!is_array($add_rev)) { + $add_rev = array(); + } + $rem_rev = idx($metadata, $key_rem_rev, array()); + if (!is_array($rem_rev)) { + $rem_rev = array(); + } + + if ($add_rev || $rem_rev) { + $old = array(); + foreach ($rem_rev as $phid) { + if (!is_scalar($phid)) { + continue; + } + $old[$phid] = array( + 'src' => $revision_phid, + 'type' => DifferentialRevisionHasReviewerEdgeType::EDGECONST, + 'dst' => $phid, + ); + } + + $new = array(); + foreach ($add_rev as $phid) { + if (!is_scalar($phid)) { + continue; + } + $new[$phid] = array( + 'src' => $revision_phid, + 'type' => DifferentialRevisionHasReviewerEdgeType::EDGECONST, + 'dst' => $phid, + ); + } + + $xactions[] = array( + 'type' => PhabricatorTransactions::TYPE_EDGE, + 'old' => $old, + 'new' => $new, + 'meta' => array( + 'edge:type' => DifferentialRevisionHasReviewerEdgeType::EDGECONST, + ), + ); + } + + // Build the CC transaction, if one exists. + $add_cc = idx($metadata, $key_cc, array()); + if (!is_array($add_cc)) { + $add_cc = array(); + } + + if ($add_cc) { + $xactions[] = array( + 'type' => PhabricatorTransactions::TYPE_SUBSCRIBERS, + 'old' => array(), + 'new' => array_fuse($add_cc), + ); + } + + + // Build the main comment transaction. + foreach ($main_comments as $main) { + $xactions[] = array( + 'type' => PhabricatorTransactions::TYPE_COMMENT, + 'old' => null, + 'new' => null, + 'phid' => $main['transactionPHID'], + 'comment' => $main, + ); + } + + // Build inline comment transactions. + foreach ($inline_comments as $inline) { + $xactions[] = array( + 'type' => DifferentialTransaction::TYPE_INLINE, + 'old' => null, + 'new' => null, + 'phid' => $inline['transactionPHID'], + 'comment' => $inline, + ); + } + + foreach ($xactions as $xaction) { + // Generate a new PHID, if we don't already have one from the comment + // table. We pregenerated into the comment table to make this a little + // easier, so we only need to write to one table. + $xaction_phid = idx($xaction, 'phid'); + if (!$xaction_phid) { + $xaction_phid = PhabricatorPHID::generateNewPHID( + PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST, + DifferentialRevisionPHIDType::TYPECONST); + } + unset($xaction['phid']); + + $comment_phid = null; + $comment_version = 0; + if (idx($xaction, 'comment')) { + $comment_phid = $xaction['comment']['phid']; + $comment_version = 1; + } + + $old = idx($xaction, 'old'); + $new = idx($xaction, 'new'); + $meta = idx($xaction, 'meta', array()); + + queryfx( + $conn_w, + 'INSERT INTO %T (phid, authorPHID, objectPHID, viewPolicy, editPolicy, + commentPHID, commentVersion, transactionType, oldValue, newValue, + contentSource, metadata, dateCreated, dateModified) + VALUES (%s, %s, %s, %s, %s, %ns, %d, %s, %ns, %ns, %s, %s, %d, %d)', + 'differential_transaction', + + // PHID, authorPHID, objectPHID + $xaction_phid, + (string)$row['authorPHID'], + $revision_phid, + + // viewPolicy, editPolicy, commentPHID, commentVersion + 'public', + (string)$row['authorPHID'], + $comment_phid, + $comment_version, + + // transactionType, oldValue, newValue, contentSource, metadata + $xaction['type'], + json_encode($old), + json_encode($new), + $content_source, + json_encode($meta), + + // dates + $row['dateCreated'], + $row['dateModified']); + } + +} +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140214.clean.1.legacycommentid.sql b/resources/sql/autopatches/20140214.clean.1.legacycommentid.sql new file mode 100644 index 0000000000..2efb997183 --- /dev/null +++ b/resources/sql/autopatches/20140214.clean.1.legacycommentid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_transaction_comment + DROP COLUMN legacyCommentID; diff --git a/resources/sql/autopatches/20140214.clean.2.dropcomment.sql b/resources/sql/autopatches/20140214.clean.2.dropcomment.sql new file mode 100644 index 0000000000..e8cef208d0 --- /dev/null +++ b/resources/sql/autopatches/20140214.clean.2.dropcomment.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_differential.differential_comment; diff --git a/resources/sql/autopatches/20140214.clean.3.dropinline.sql b/resources/sql/autopatches/20140214.clean.3.dropinline.sql new file mode 100644 index 0000000000..58ad0210c1 --- /dev/null +++ b/resources/sql/autopatches/20140214.clean.3.dropinline.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_differential.differential_inlinecomment; diff --git a/resources/sql/autopatches/20140218.differentialdraft.sql b/resources/sql/autopatches/20140218.differentialdraft.sql new file mode 100644 index 0000000000..7421e08c98 --- /dev/null +++ b/resources/sql/autopatches/20140218.differentialdraft.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_differential.differential_draft( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + draftKey VARCHAR(64) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_unique` (objectPHID, authorPHID, draftKey) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140218.passwords.1.extend.sql b/resources/sql/autopatches/20140218.passwords.1.extend.sql new file mode 100644 index 0000000000..d1fbb3a519 --- /dev/null +++ b/resources/sql/autopatches/20140218.passwords.1.extend.sql @@ -0,0 +1,4 @@ +/* Extend from 32 characters to 128. */ + +ALTER TABLE {$NAMESPACE}_user.user + CHANGE passwordHash passwordHash VARCHAR(128) COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140218.passwords.2.prefix.sql b/resources/sql/autopatches/20140218.passwords.2.prefix.sql new file mode 100644 index 0000000000..175f81cd93 --- /dev/null +++ b/resources/sql/autopatches/20140218.passwords.2.prefix.sql @@ -0,0 +1,5 @@ +/* Mark all existing password hashes as "Iterated MD5". */ + +UPDATE {$NAMESPACE}_user.user + SET passwordHash = CONCAT('md5:', passwordHash) + WHERE LENGTH(passwordHash) > 0; diff --git a/resources/sql/autopatches/20140218.passwords.3.vcsextend.sql b/resources/sql/autopatches/20140218.passwords.3.vcsextend.sql new file mode 100644 index 0000000000..38753cc6d3 --- /dev/null +++ b/resources/sql/autopatches/20140218.passwords.3.vcsextend.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_vcspassword + CHANGE passwordHash passwordHash VARCHAR(128) COLLATE utf8_bin NOT NULL; diff --git a/resources/sql/autopatches/20140218.passwords.4.vcs.php b/resources/sql/autopatches/20140218.passwords.4.vcs.php new file mode 100644 index 0000000000..c811844c27 --- /dev/null +++ b/resources/sql/autopatches/20140218.passwords.4.vcs.php @@ -0,0 +1,13 @@ +establishConnection('w'); +$rows = new LiskRawMigrationIterator($conn_w, 'differential_auxiliaryfield'); + +echo pht('Modernizing Differential auxiliary field storage...')."\n"; + +$table_name = id(new DifferentialCustomFieldStorage())->getTableName(); +foreach ($rows as $row) { + $id = $row['id']; + echo pht('Migrating row %d...', $id)."\n"; + queryfx( + $conn_w, + 'INSERT IGNORE INTO %T (objectPHID, fieldIndex, fieldValue) + VALUES (%s, %s, %s)', + $table_name, + $row['revisionPHID'], + PhabricatorHash::digestForIndex($row['name']), + $row['value']); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140226.dxcustom.99.drop.sql b/resources/sql/autopatches/20140226.dxcustom.99.drop.sql new file mode 100644 index 0000000000..f8bbb2b6c5 --- /dev/null +++ b/resources/sql/autopatches/20140226.dxcustom.99.drop.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_differential.differential_auxiliaryfield; diff --git a/resources/sql/autopatches/20140228.dxcomment.1.sql b/resources/sql/autopatches/20140228.dxcomment.1.sql new file mode 100644 index 0000000000..a62de29fc9 --- /dev/null +++ b/resources/sql/autopatches/20140228.dxcomment.1.sql @@ -0,0 +1,4 @@ +/* Make this column nullable. */ + +ALTER TABLE {$NAMESPACE}_differential.differential_transaction_comment + CHANGE revisionPHID revisionPHID VARCHAR(64) COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140305.diviner.1.slugcol.sql b/resources/sql/autopatches/20140305.diviner.1.slugcol.sql new file mode 100644 index 0000000000..741cd8df45 --- /dev/null +++ b/resources/sql/autopatches/20140305.diviner.1.slugcol.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_diviner.diviner_livesymbol + ADD titleSlugHash CHAR(12) COLLATE latin1_bin AFTER title; diff --git a/resources/sql/autopatches/20140305.diviner.2.slugkey.sql b/resources/sql/autopatches/20140305.diviner.2.slugkey.sql new file mode 100644 index 0000000000..1316a69ccc --- /dev/null +++ b/resources/sql/autopatches/20140305.diviner.2.slugkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_diviner.diviner_livesymbol + ADD KEY `key_slug` (titleSlugHash); diff --git a/resources/sql/autopatches/20140311.mdroplegacy.sql b/resources/sql/autopatches/20140311.mdroplegacy.sql new file mode 100644 index 0000000000..ba8176c775 --- /dev/null +++ b/resources/sql/autopatches/20140311.mdroplegacy.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS {$NAMESPACE}_maniphest.maniphest_transaction_legacy; diff --git a/resources/sql/autopatches/20140314.projectcolumn.1.statuscol.sql b/resources/sql/autopatches/20140314.projectcolumn.1.statuscol.sql new file mode 100644 index 0000000000..d2357bef89 --- /dev/null +++ b/resources/sql/autopatches/20140314.projectcolumn.1.statuscol.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project_column + ADD COLUMN status INT UNSIGNED NOT NULL AFTER name; diff --git a/resources/sql/autopatches/20140314.projectcolumn.2.statuskey.sql b/resources/sql/autopatches/20140314.projectcolumn.2.statuskey.sql new file mode 100644 index 0000000000..b2d53548a0 --- /dev/null +++ b/resources/sql/autopatches/20140314.projectcolumn.2.statuskey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project_column + ADD KEY `key_status` (`projectPHID`,`status`,`sequence`); diff --git a/resources/sql/autopatches/20140317.mupdatedkey.sql b/resources/sql/autopatches/20140317.mupdatedkey.sql new file mode 100644 index 0000000000..404e753e83 --- /dev/null +++ b/resources/sql/autopatches/20140317.mupdatedkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + ADD KEY `key_dateModified` (dateModified); diff --git a/resources/sql/autopatches/20140321.harbor.1.bxaction.sql b/resources/sql/autopatches/20140321.harbor.1.bxaction.sql new file mode 100644 index 0000000000..1d65d2914a --- /dev/null +++ b/resources/sql/autopatches/20140321.harbor.1.bxaction.sql @@ -0,0 +1,21 @@ +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildsteptransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140321.mstatus.1.col.sql b/resources/sql/autopatches/20140321.mstatus.1.col.sql new file mode 100644 index 0000000000..df407e0908 --- /dev/null +++ b/resources/sql/autopatches/20140321.mstatus.1.col.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + CHANGE status status VARCHAR(12) NOT NULL COLLATE latin1_bin; diff --git a/resources/sql/autopatches/20140321.mstatus.2.mig.php b/resources/sql/autopatches/20140321.mstatus.2.mig.php new file mode 100644 index 0000000000..654ca7881c --- /dev/null +++ b/resources/sql/autopatches/20140321.mstatus.2.mig.php @@ -0,0 +1,95 @@ + 'open', + 1 => 'resolved', + 2 => 'wontfix', + 3 => 'invalid', + 4 => 'duplicate', + 5 => 'spite', +); + +$conn_w = id(new ManiphestTask())->establishConnection('w'); + +echo pht('Migrating tasks to new status constants...')."\n"; +foreach (new LiskMigrationIterator(new ManiphestTask()) as $task) { + $id = $task->getID(); + echo pht('Migrating %s...', "T{$id}")."\n"; + + $status = $task->getStatus(); + if (isset($status_map[$status])) { + queryfx( + $conn_w, + 'UPDATE %T SET status = %s WHERE id = %d', + $task->getTableName(), + $status_map[$status], + $id); + } +} + +echo pht('Done.')."\n"; + + +echo pht('Migrating task transactions to new status constants...')."\n"; +foreach (new LiskMigrationIterator(new ManiphestTransaction()) as $xaction) { + $id = $xaction->getID(); + echo pht('Migrating %d...', $id)."\n"; + + $xn_type = ManiphestTaskStatusTransaction::TRANSACTIONTYPE; + if ($xaction->getTransactionType() == $xn_type) { + $old = $xaction->getOldValue(); + if ($old !== null && isset($status_map[$old])) { + $old = $status_map[$old]; + } + + $new = $xaction->getNewValue(); + if (isset($status_map[$new])) { + $new = $status_map[$new]; + } + + queryfx( + $conn_w, + 'UPDATE %T SET oldValue = %s, newValue = %s WHERE id = %d', + $xaction->getTableName(), + json_encode($old), + json_encode($new), + $id); + } +} +echo pht('Done.')."\n"; + +$conn_w = id(new PhabricatorSavedQuery())->establishConnection('w'); + +echo pht('Migrating searches to new status constants...')."\n"; +foreach (new LiskMigrationIterator(new PhabricatorSavedQuery()) as $query) { + $id = $query->getID(); + echo pht('Migrating %d...', $id)."\n"; + + if ($query->getEngineClassName() !== 'ManiphestTaskSearchEngine') { + continue; + } + + $params = $query->getParameters(); + $statuses = idx($params, 'statuses', array()); + if ($statuses) { + $changed = false; + foreach ($statuses as $key => $status) { + if (isset($status_map[$status])) { + $statuses[$key] = $status_map[$status]; + $changed = true; + } + } + + if ($changed) { + $params['statuses'] = $statuses; + + queryfx( + $conn_w, + 'UPDATE %T SET parameters = %s WHERE id = %d', + $query->getTableName(), + json_encode($params), + $id); + } + } +} +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140323.harbor.1.renames.php b/resources/sql/autopatches/20140323.harbor.1.renames.php new file mode 100644 index 0000000000..8aab25d876 --- /dev/null +++ b/resources/sql/autopatches/20140323.harbor.1.renames.php @@ -0,0 +1,35 @@ +getTableName(), + id(new HarbormasterBuildTarget())->getTableName(), +); + +echo pht('Renaming Harbormaster classes...')."\n"; + +$conn_w = id(new HarbormasterBuildStep())->establishConnection('w'); +foreach ($names as $name) { + $old = $name; + $new = 'Harbormaster'.$name; + + echo pht('Renaming %s -> %s...', $old, $new)."\n"; + foreach ($tables as $table) { + queryfx( + $conn_w, + 'UPDATE %T SET className = %s WHERE className = %s', + $table, + $new, + $old); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140323.harbor.2.message.sql b/resources/sql/autopatches/20140323.harbor.2.message.sql new file mode 100644 index 0000000000..0181d8856d --- /dev/null +++ b/resources/sql/autopatches/20140323.harbor.2.message.sql @@ -0,0 +1,10 @@ +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildmessage ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + buildTargetPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + type VARCHAR(16) NOT NULL, + isConsumed BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_buildtarget` (buildTargetPHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140325.push.1.event.sql b/resources/sql/autopatches/20140325.push.1.event.sql new file mode 100644 index 0000000000..d6290f25f6 --- /dev/null +++ b/resources/sql/autopatches/20140325.push.1.event.sql @@ -0,0 +1,15 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_pushevent ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + repositoryPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + epoch INT UNSIGNED NOT NULL, + pusherPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + remoteAddress INT UNSIGNED, + remoteProtocol VARCHAR(32), + rejectCode INT UNSIGNED NOT NULL, + rejectDetails VARCHAR(64) COLLATE utf8_bin, + + UNIQUE KEY `key_phid` (phid), + KEY `key_repository` (repositoryPHID) + +) ENGINE=InnoDB, COLLATE=utf8_general_ci; diff --git a/resources/sql/autopatches/20140325.push.2.eventphid.sql b/resources/sql/autopatches/20140325.push.2.eventphid.sql new file mode 100644 index 0000000000..32d0136f65 --- /dev/null +++ b/resources/sql/autopatches/20140325.push.2.eventphid.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_pushlog + ADD pushEventPHID VARCHAR(64) NOT NULL COLLATE utf8_bin AFTER epoch; + +ALTER TABLE {$NAMESPACE}_repository.repository_pushlog + ADD KEY `key_event` (pushEventPHID); diff --git a/resources/sql/autopatches/20140325.push.3.groups.php b/resources/sql/autopatches/20140325.push.3.groups.php new file mode 100644 index 0000000000..8706da306a --- /dev/null +++ b/resources/sql/autopatches/20140325.push.3.groups.php @@ -0,0 +1,43 @@ +establishConnection('w'); + +echo pht('Adding transaction log event groups...')."\n"; + +$logs = queryfx_all( + $conn_w, + 'SELECT * FROM %T GROUP BY transactionKey ORDER BY id ASC', + 'repository_pushlog'); +foreach ($logs as $log) { + $id = $log['id']; + echo pht('Migrating log %d...', $id)."\n"; + if ($log['pushEventPHID']) { + continue; + } + + $event_phid = id(new PhabricatorRepositoryPushEvent())->generatePHID(); + + queryfx( + $conn_w, + 'INSERT INTO %T (phid, repositoryPHID, epoch, pusherPHID, remoteAddress, + remoteProtocol, rejectCode, rejectDetails) + VALUES (%s, %s, %d, %s, %d, %s, %d, %s)', + 'repository_pushevent', + $event_phid, + $log['repositoryPHID'], + $log['epoch'], + $log['pusherPHID'], + $log['remoteAddress'], + $log['remoteProtocol'], + $log['rejectCode'], + $log['rejectDetails']); + + queryfx( + $conn_w, + 'UPDATE %T SET pushEventPHID = %s WHERE transactionKey = %s', + 'repository_pushlog', + $event_phid, + $log['transactionKey']); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140325.push.4.prune.sql b/resources/sql/autopatches/20140325.push.4.prune.sql new file mode 100644 index 0000000000..c0e3a4a6bd --- /dev/null +++ b/resources/sql/autopatches/20140325.push.4.prune.sql @@ -0,0 +1,14 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_pushlog + DROP remoteAddress; + +ALTER TABLE {$NAMESPACE}_repository.repository_pushlog + DROP remoteProtocol; + +ALTER TABLE {$NAMESPACE}_repository.repository_pushlog + DROP transactionKey; + +ALTER TABLE {$NAMESPACE}_repository.repository_pushlog + DROP rejectCode; + +ALTER TABLE {$NAMESPACE}_repository.repository_pushlog + DROP rejectDetails; diff --git a/resources/sql/autopatches/20140326.project.1.colxaction.sql b/resources/sql/autopatches/20140326.project.1.colxaction.sql new file mode 100644 index 0000000000..c35bcb614a --- /dev/null +++ b/resources/sql/autopatches/20140326.project.1.colxaction.sql @@ -0,0 +1,21 @@ +CREATE TABLE {$NAMESPACE}_project.project_columntransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140328.releeph.1.productxaction.sql b/resources/sql/autopatches/20140328.releeph.1.productxaction.sql new file mode 100644 index 0000000000..b7db3cf9b2 --- /dev/null +++ b/resources/sql/autopatches/20140328.releeph.1.productxaction.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_releeph.releeph_projecttransaction + RENAME {$NAMESPACE}_releeph.releeph_producttransaction; diff --git a/resources/sql/autopatches/20140330.flagtext.sql b/resources/sql/autopatches/20140330.flagtext.sql new file mode 100644 index 0000000000..b4ba5e328e --- /dev/null +++ b/resources/sql/autopatches/20140330.flagtext.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_flag.flag + CHANGE note note LONGTEXT NOT NULL COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140402.actionlog.sql b/resources/sql/autopatches/20140402.actionlog.sql new file mode 100644 index 0000000000..057542e92b --- /dev/null +++ b/resources/sql/autopatches/20140402.actionlog.sql @@ -0,0 +1,12 @@ +CREATE TABLE {$NAMESPACE}_system.system_actionlog ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + actorHash CHAR(12) NOT NULL COLLATE latin1_bin, + actorIdentity VARCHAR(255) NOT NULL COLLATE utf8_bin, + action CHAR(32) NOT NULL COLLATE utf8_bin, + score DOUBLE NOT NULL, + epoch INT UNSIGNED NOT NULL, + + KEY `key_epoch` (epoch), + KEY `key_action` (actorHash, action, epoch) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140410.accountsecret.1.sql b/resources/sql/autopatches/20140410.accountsecret.1.sql new file mode 100644 index 0000000000..5b6b39e49c --- /dev/null +++ b/resources/sql/autopatches/20140410.accountsecret.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user + ADD accountSecret CHAR(64) NOT NULL COLLATE latin1_bin; diff --git a/resources/sql/autopatches/20140410.accountsecret.2.php b/resources/sql/autopatches/20140410.accountsecret.2.php new file mode 100644 index 0000000000..7d0cf7ad88 --- /dev/null +++ b/resources/sql/autopatches/20140410.accountsecret.2.php @@ -0,0 +1,21 @@ +getID(); + echo pht('Updating %d...', $id)."\n"; + + if (strlen($user->getAccountSecret())) { + continue; + } + + queryfx( + $user->establishConnection('w'), + 'UPDATE %T SET accountSecret = %s WHERE id = %d', + $user->getTableName(), + Filesystem::readRandomCharacters(64), + $id); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140416.harbor.1.sql b/resources/sql/autopatches/20140416.harbor.1.sql new file mode 100644 index 0000000000..0cc30cfdf1 --- /dev/null +++ b/resources/sql/autopatches/20140416.harbor.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildable + DROP buildStatus; diff --git a/resources/sql/autopatches/20140420.rel.1.objectphid.sql b/resources/sql/autopatches/20140420.rel.1.objectphid.sql new file mode 100644 index 0000000000..397b988d92 --- /dev/null +++ b/resources/sql/autopatches/20140420.rel.1.objectphid.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_releeph.releeph_request + ADD COLUMN requestedObjectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL; + +ALTER TABLE {$NAMESPACE}_releeph.releeph_request + ADD KEY `key_requestedObject` (requestedObjectPHID); diff --git a/resources/sql/autopatches/20140420.rel.2.objectmig.php b/resources/sql/autopatches/20140420.rel.2.objectmig.php new file mode 100644 index 0000000000..f54416a5b0 --- /dev/null +++ b/resources/sql/autopatches/20140420.rel.2.objectmig.php @@ -0,0 +1,45 @@ +getTableName(); +$conn_w = $pull_table->establishConnection('w'); + +echo pht('Setting object PHIDs for requests...')."\n"; +foreach (new LiskMigrationIterator($pull_table) as $pull) { + $id = $pull->getID(); + + echo pht('Migrating pull request %d...', $id)."\n"; + if ($pull->getRequestedObjectPHID()) { + // We already have a valid PHID, so skip this request. + continue; + } + + $commit_phids = $pull->getCommitPHIDs(); + if (count($commit_phids) != 1) { + // At the time this migration was written, all requests had exactly one + // commit. If a request has more than one, we don't have the information + // we need to process it. + continue; + } + + $commit_phid = head($commit_phids); + + $revision_phids = PhabricatorEdgeQuery::loadDestinationPHIDs( + $commit_phid, + DiffusionCommitHasRevisionEdgeType::EDGECONST); + + if ($revision_phids) { + $object_phid = head($revision_phids); + } else { + $object_phid = $commit_phid; + } + + queryfx( + $conn_w, + 'UPDATE %T SET requestedObjectPHID = %s WHERE id = %d', + $table_name, + $object_phid, + $id); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140421.slowvotecolumnsisclosed.sql b/resources/sql/autopatches/20140421.slowvotecolumnsisclosed.sql new file mode 100644 index 0000000000..2e48566562 --- /dev/null +++ b/resources/sql/autopatches/20140421.slowvotecolumnsisclosed.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_slowvote.slowvote_poll + ADD COLUMN isClosed BOOL NOT NULL; diff --git a/resources/sql/autopatches/20140423.session.1.hisec.sql b/resources/sql/autopatches/20140423.session.1.hisec.sql new file mode 100644 index 0000000000..4b49d1b563 --- /dev/null +++ b/resources/sql/autopatches/20140423.session.1.hisec.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.phabricator_session + ADD highSecurityUntil INT UNSIGNED; diff --git a/resources/sql/autopatches/20140427.mfactor.1.sql b/resources/sql/autopatches/20140427.mfactor.1.sql new file mode 100644 index 0000000000..c6d35f9234 --- /dev/null +++ b/resources/sql/autopatches/20140427.mfactor.1.sql @@ -0,0 +1,13 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_factorconfig ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + userPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + factorKey VARCHAR(64) NOT NULL COLLATE utf8_bin, + factorName LONGTEXT NOT NULL COLLATE utf8_general_ci, + factorSecret LONGTEXT NOT NULL COLLATE utf8_bin, + properties LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_user` (userPHID), + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140430.auth.1.partial.sql b/resources/sql/autopatches/20140430.auth.1.partial.sql new file mode 100644 index 0000000000..7f104ac8d6 --- /dev/null +++ b/resources/sql/autopatches/20140430.auth.1.partial.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.phabricator_session + ADD isPartial BOOL NOT NULL DEFAULT 0; diff --git a/resources/sql/autopatches/20140430.dash.1.paneltype.sql b/resources/sql/autopatches/20140430.dash.1.paneltype.sql new file mode 100644 index 0000000000..d90655cf98 --- /dev/null +++ b/resources/sql/autopatches/20140430.dash.1.paneltype.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_dashboard.dashboard_panel + ADD panelType VARCHAR(64) NOT NULL COLLATE utf8_bin AFTER name; diff --git a/resources/sql/autopatches/20140430.dash.2.edge.sql b/resources/sql/autopatches/20140430.dash.2.edge.sql new file mode 100644 index 0000000000..0e3ef01f60 --- /dev/null +++ b/resources/sql/autopatches/20140430.dash.2.edge.sql @@ -0,0 +1,15 @@ +CREATE TABLE {$NAMESPACE}_dashboard.edge ( + src VARCHAR(64) NOT NULL COLLATE utf8_bin, + type VARCHAR(64) NOT NULL COLLATE utf8_bin, + dst VARCHAR(64) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY (src, type, dateCreated, seq) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_dashboard.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE utf8_bin +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140501.passphraselockcredential.sql b/resources/sql/autopatches/20140501.passphraselockcredential.sql new file mode 100644 index 0000000000..c398afc1fe --- /dev/null +++ b/resources/sql/autopatches/20140501.passphraselockcredential.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_passphrase.passphrase_credential + ADD COLUMN isLocked BOOL NOT NULL; diff --git a/resources/sql/autopatches/20140501.remove.1.dlog.sql b/resources/sql/autopatches/20140501.remove.1.dlog.sql new file mode 100644 index 0000000000..526bcd87da --- /dev/null +++ b/resources/sql/autopatches/20140501.remove.1.dlog.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_system.system_destructionlog ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectClass VARCHAR(128) NOT NULL COLLATE utf8_bin, + rootLogID INT UNSIGNED, + objectPHID VARCHAR(64) COLLATE utf8_bin, + objectMonogram VARCHAR(64) COLLATE utf8_bin, + epoch INT UNSIGNED NOT NULL, + KEY `key_epoch` (epoch) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140507.smstable.sql b/resources/sql/autopatches/20140507.smstable.sql new file mode 100644 index 0000000000..ae3f329e3d --- /dev/null +++ b/resources/sql/autopatches/20140507.smstable.sql @@ -0,0 +1,12 @@ +CREATE TABLE {$NAMESPACE}_metamta.sms ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + providerShortName VARCHAR(16) NOT NULL COLLATE utf8_bin, + providerSMSID VARCHAR(40) NOT NULL COLLATE utf8_bin, + toNumber VARCHAR(20) NOT NULL COLLATE utf8_bin, + fromNumber VARCHAR(20) COLLATE utf8_bin, + body LONGTEXT NOT NULL COLLATE utf8_bin, + sendStatus VARCHAR(16) COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_provider` (providerSMSID, providerShortName) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140509.coverage.1.sql b/resources/sql/autopatches/20140509.coverage.1.sql new file mode 100644 index 0000000000..f8bf09dfe2 --- /dev/null +++ b/resources/sql/autopatches/20140509.coverage.1.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_coverage ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + branchID INT UNSIGNED NOT NULL, + commitID INT UNSIGNED NOT NULL, + pathID INT UNSIGNED NOT NULL, + coverage LONGTEXT NOT NULL COLLATE latin1_bin, + KEY `key_path` (branchID, pathID, commitID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140509.dashboardlayoutconfig.sql b/resources/sql/autopatches/20140509.dashboardlayoutconfig.sql new file mode 100644 index 0000000000..2ffb549f0a --- /dev/null +++ b/resources/sql/autopatches/20140509.dashboardlayoutconfig.sql @@ -0,0 +1,4 @@ +ALTER TABLE {$NAMESPACE}_dashboard.dashboard + ADD COLUMN layoutConfig LONGTEXT NOT NULL COLLATE utf8_bin AFTER name; + +UPDATE {$NAMESPACE}_dashboard.dashboard SET layoutConfig = '[]'; diff --git a/resources/sql/autopatches/20140512.dparents.1.sql b/resources/sql/autopatches/20140512.dparents.1.sql new file mode 100644 index 0000000000..5305e9625c --- /dev/null +++ b/resources/sql/autopatches/20140512.dparents.1.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_parents ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + childCommitID INT UNSIGNED NOT NULL, + parentCommitID INT UNSIGNED NOT NULL, + UNIQUE `key_child` (childCommitID, parentCommitID), + KEY `key_parent` (parentCommitID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140514.harbormasterbuildabletransaction.sql b/resources/sql/autopatches/20140514.harbormasterbuildabletransaction.sql new file mode 100644 index 0000000000..7a3a0325f4 --- /dev/null +++ b/resources/sql/autopatches/20140514.harbormasterbuildabletransaction.sql @@ -0,0 +1,43 @@ +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildabletransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildtransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140514.pholiomockclose.sql b/resources/sql/autopatches/20140514.pholiomockclose.sql new file mode 100644 index 0000000000..2a4c2768f7 --- /dev/null +++ b/resources/sql/autopatches/20140514.pholiomockclose.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_pholio.pholio_mock + ADD COLUMN status VARCHAR(12) NOT NULL COLLATE utf8_bin; + +UPDATE {$NAMESPACE}_pholio.pholio_mock + SET status = "open" WHERE status = ""; diff --git a/resources/sql/autopatches/20140515.trust-emails.sql b/resources/sql/autopatches/20140515.trust-emails.sql new file mode 100644 index 0000000000..8233f73542 --- /dev/null +++ b/resources/sql/autopatches/20140515.trust-emails.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_providerconfig + ADD `shouldTrustEmails` tinyint(1) NOT NULL DEFAULT 0 AFTER shouldAllowUnlink; diff --git a/resources/sql/autopatches/20140517.dxbinarycache.sql b/resources/sql/autopatches/20140517.dxbinarycache.sql new file mode 100644 index 0000000000..acf7162b65 --- /dev/null +++ b/resources/sql/autopatches/20140517.dxbinarycache.sql @@ -0,0 +1,4 @@ +TRUNCATE {$NAMESPACE}_differential.differential_changeset_parse_cache; + +ALTER TABLE {$NAMESPACE}_differential.differential_changeset_parse_cache + CHANGE cache cache LONGTEXT COLLATE latin1_bin NOT NULL; diff --git a/resources/sql/autopatches/20140518.dxmorebinarycache.sql b/resources/sql/autopatches/20140518.dxmorebinarycache.sql new file mode 100644 index 0000000000..27859bfd4b --- /dev/null +++ b/resources/sql/autopatches/20140518.dxmorebinarycache.sql @@ -0,0 +1,4 @@ +TRUNCATE {$NAMESPACE}_differential.differential_changeset_parse_cache; + +ALTER TABLE {$NAMESPACE}_differential.differential_changeset_parse_cache + CHANGE cache cache LONGBLOB NOT NULL; diff --git a/resources/sql/autopatches/20140519.dashboardinstall.sql b/resources/sql/autopatches/20140519.dashboardinstall.sql new file mode 100644 index 0000000000..71bd551e92 --- /dev/null +++ b/resources/sql/autopatches/20140519.dashboardinstall.sql @@ -0,0 +1,10 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_install ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + installerPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + applicationClass VARCHAR(64) NOT NULL COLLATE utf8_bin, + dashboardPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY (objectPHID, applicationClass) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140520.authtemptoken.sql b/resources/sql/autopatches/20140520.authtemptoken.sql new file mode 100644 index 0000000000..2d7a83ae7e --- /dev/null +++ b/resources/sql/autopatches/20140520.authtemptoken.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_temporarytoken ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + tokenType VARCHAR(64) NOT NULL COLLATE utf8_bin, + tokenExpires INT UNSIGNED NOT NULL, + tokenCode VARCHAR(64) NOT NULL COLLATE utf8_bin, + + UNIQUE KEY `key_token` (objectPHID, tokenType, tokenCode), + KEY `key_expires` (tokenExpires) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140521.projectslug.1.create.sql b/resources/sql/autopatches/20140521.projectslug.1.create.sql new file mode 100644 index 0000000000..f42558142a --- /dev/null +++ b/resources/sql/autopatches/20140521.projectslug.1.create.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_project.project_slug ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + projectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + slug VARCHAR(128) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_slug` (slug), + KEY `key_projectPHID` (projectPHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140521.projectslug.2.mig.php b/resources/sql/autopatches/20140521.projectslug.2.mig.php new file mode 100644 index 0000000000..e0ad4b5070 --- /dev/null +++ b/resources/sql/autopatches/20140521.projectslug.2.mig.php @@ -0,0 +1,36 @@ +getTableName(); +$conn_w = $project_table->establishConnection('w'); +$slug_table_name = id(new PhabricatorProjectSlug())->getTableName(); +$time = PhabricatorTime::getNow(); + +echo pht('Migrating projects to slugs...')."\n"; +foreach (new LiskMigrationIterator($project_table) as $project) { + $id = $project->getID(); + + echo pht('Migrating project %d...', $id)."\n"; + + $slug_text = PhabricatorSlug::normalizeProjectSlug($project->getName()); + $slug = id(new PhabricatorProjectSlug()) + ->loadOneWhere('slug = %s', $slug_text); + + if ($slug) { + echo pht('Already migrated %d... Continuing.', $id)."\n"; + continue; + } + + queryfx( + $conn_w, + 'INSERT INTO %T (projectPHID, slug, dateCreated, dateModified) '. + 'VALUES (%s, %s, %d, %d)', + $slug_table_name, + $project->getPHID(), + $slug_text, + $time, + $time); + echo pht('Migrated %d.', $id)."\n"; +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140522.projecticon.sql b/resources/sql/autopatches/20140522.projecticon.sql new file mode 100644 index 0000000000..66cf71ed72 --- /dev/null +++ b/resources/sql/autopatches/20140522.projecticon.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD COLUMN icon VARCHAR(32) NOT NULL COLLATE utf8_bin; + +UPDATE {$NAMESPACE}_project.project + SET icon = "fa-briefcase" WHERE icon = ""; diff --git a/resources/sql/autopatches/20140524.auth.mfa.cache.sql b/resources/sql/autopatches/20140524.auth.mfa.cache.sql new file mode 100644 index 0000000000..74d9d8304e --- /dev/null +++ b/resources/sql/autopatches/20140524.auth.mfa.cache.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user + ADD isEnrolledInMultiFactor BOOL NOT NULL DEFAULT 0; diff --git a/resources/sql/autopatches/20140525.hunkmodern.sql b/resources/sql/autopatches/20140525.hunkmodern.sql new file mode 100644 index 0000000000..dd865e4d4d --- /dev/null +++ b/resources/sql/autopatches/20140525.hunkmodern.sql @@ -0,0 +1,18 @@ +CREATE TABLE {$NAMESPACE}_differential.differential_hunk_modern ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + changesetID INT UNSIGNED NOT NULL, + oldOffset INT UNSIGNED NOT NULL, + oldLen INT UNSIGNED NOT NULL, + newOffset INT UNSIGNED NOT NULL, + newLen INT UNSIGNED NOT NULL, + dataType CHAR(4) NOT NULL COLLATE latin1_bin, + dataEncoding VARCHAR(16) COLLATE latin1_bin, + dataFormat CHAR(4) NOT NULL COLLATE latin1_bin, + data LONGBLOB NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + KEY `key_changeset` (changesetID), + KEY `key_created` (dateCreated) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140615.pholioedit.1.sql b/resources/sql/autopatches/20140615.pholioedit.1.sql new file mode 100644 index 0000000000..a3bcfe3e07 --- /dev/null +++ b/resources/sql/autopatches/20140615.pholioedit.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_pholio.pholio_mock + ADD editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140615.pholioedit.2.sql b/resources/sql/autopatches/20140615.pholioedit.2.sql new file mode 100644 index 0000000000..42824467ba --- /dev/null +++ b/resources/sql/autopatches/20140615.pholioedit.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_pholio.pholio_mock + SET editPolicy = authorPHID WHERE editPolicy = ''; diff --git a/resources/sql/autopatches/20140617.daemon.explicit-argv.sql b/resources/sql/autopatches/20140617.daemon.explicit-argv.sql new file mode 100644 index 0000000000..8b3a8a35a7 --- /dev/null +++ b/resources/sql/autopatches/20140617.daemon.explicit-argv.sql @@ -0,0 +1,3 @@ +ALTER TABLE {$NAMESPACE}_daemon.daemon_log + ADD COLUMN explicitArgv longtext CHARACTER SET utf8 + COLLATE utf8_bin NOT NULL AFTER argv; diff --git a/resources/sql/autopatches/20140617.daemonlog.sql b/resources/sql/autopatches/20140617.daemonlog.sql new file mode 100644 index 0000000000..5904af039c --- /dev/null +++ b/resources/sql/autopatches/20140617.daemonlog.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_daemon.daemon_log + ADD KEY (dateCreated); diff --git a/resources/sql/autopatches/20140624.projcolor.1.sql b/resources/sql/autopatches/20140624.projcolor.1.sql new file mode 100644 index 0000000000..73c1f82d9e --- /dev/null +++ b/resources/sql/autopatches/20140624.projcolor.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD color VARCHAR(32) NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140624.projcolor.2.sql b/resources/sql/autopatches/20140624.projcolor.2.sql new file mode 100644 index 0000000000..8ff9ffb1e4 --- /dev/null +++ b/resources/sql/autopatches/20140624.projcolor.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_project.project + SET color = 'blue' WHERE color = ''; diff --git a/resources/sql/autopatches/20140629.dasharchive.1.sql b/resources/sql/autopatches/20140629.dasharchive.1.sql new file mode 100644 index 0000000000..e6a10594aa --- /dev/null +++ b/resources/sql/autopatches/20140629.dasharchive.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_dashboard.dashboard_panel + ADD isArchived BOOL NOT NULL DEFAULT 0 AFTER editPolicy; diff --git a/resources/sql/autopatches/20140629.legalsig.1.sql b/resources/sql/autopatches/20140629.legalsig.1.sql new file mode 100644 index 0000000000..5efd1164f4 --- /dev/null +++ b/resources/sql/autopatches/20140629.legalsig.1.sql @@ -0,0 +1,7 @@ +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + ADD signerName VARCHAR(255) NOT NULL COLLATE utf8_general_ci + AFTER signerPHID; + +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + ADD signerEmail VARCHAR(255) NOT NULL COLLATE utf8_general_ci + AFTER signerName; diff --git a/resources/sql/autopatches/20140629.legalsig.2.php b/resources/sql/autopatches/20140629.legalsig.2.php new file mode 100644 index 0000000000..6ded26b9e0 --- /dev/null +++ b/resources/sql/autopatches/20140629.legalsig.2.php @@ -0,0 +1,17 @@ +establishConnection('w'); +foreach (new LiskMigrationIterator($table) as $signature) { + echo pht("Updating Legalpad signature %d...\n", $signature->getID()); + + $data = $signature->getSignatureData(); + + queryfx( + $conn_w, + 'UPDATE %T SET signerName = %s, signerEmail = %s WHERE id = %d', + $table->getTableName(), + (string)idx($data, 'name'), + (string)idx($data, 'email'), + $signature->getID()); +} diff --git a/resources/sql/autopatches/20140701.legalexemption.1.sql b/resources/sql/autopatches/20140701.legalexemption.1.sql new file mode 100644 index 0000000000..45ad89d77f --- /dev/null +++ b/resources/sql/autopatches/20140701.legalexemption.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + ADD isExemption BOOL NOT NULL DEFAULT 0 AFTER verified; diff --git a/resources/sql/autopatches/20140701.legalexemption.2.sql b/resources/sql/autopatches/20140701.legalexemption.2.sql new file mode 100644 index 0000000000..70e8b4cbe9 --- /dev/null +++ b/resources/sql/autopatches/20140701.legalexemption.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + ADD exemptionPHID VARCHAR(64) COLLATE utf8_bin AFTER isExemption; diff --git a/resources/sql/autopatches/20140703.legalcorp.1.sql b/resources/sql/autopatches/20140703.legalcorp.1.sql new file mode 100644 index 0000000000..abc86c7768 --- /dev/null +++ b/resources/sql/autopatches/20140703.legalcorp.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_document + ADD signatureType VARCHAR(4) NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140703.legalcorp.2.sql b/resources/sql/autopatches/20140703.legalcorp.2.sql new file mode 100644 index 0000000000..82fe9c8eac --- /dev/null +++ b/resources/sql/autopatches/20140703.legalcorp.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_legalpad.legalpad_document + SET signatureType = 'user' WHERE signatureType = ''; diff --git a/resources/sql/autopatches/20140703.legalcorp.3.sql b/resources/sql/autopatches/20140703.legalcorp.3.sql new file mode 100644 index 0000000000..be18b7f3ec --- /dev/null +++ b/resources/sql/autopatches/20140703.legalcorp.3.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + ADD signatureType VARCHAR(4) NOT NULL COLLATE utf8_bin AFTER documentVersion; diff --git a/resources/sql/autopatches/20140703.legalcorp.4.sql b/resources/sql/autopatches/20140703.legalcorp.4.sql new file mode 100644 index 0000000000..c05f000ee6 --- /dev/null +++ b/resources/sql/autopatches/20140703.legalcorp.4.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_legalpad.legalpad_documentsignature + SET signatureType = 'user' WHERE signatureType = ''; diff --git a/resources/sql/autopatches/20140703.legalcorp.5.sql b/resources/sql/autopatches/20140703.legalcorp.5.sql new file mode 100644 index 0000000000..b1e9ae76f1 --- /dev/null +++ b/resources/sql/autopatches/20140703.legalcorp.5.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_documentsignature + CHANGE signerPHID signerPHID VARCHAR(64) COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140704.harbormasterstep.1.sql b/resources/sql/autopatches/20140704.harbormasterstep.1.sql new file mode 100644 index 0000000000..318765a024 --- /dev/null +++ b/resources/sql/autopatches/20140704.harbormasterstep.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildstep + ADD name VARCHAR(255) COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140704.harbormasterstep.2.sql b/resources/sql/autopatches/20140704.harbormasterstep.2.sql new file mode 100644 index 0000000000..517d29baac --- /dev/null +++ b/resources/sql/autopatches/20140704.harbormasterstep.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildtarget + ADD name VARCHAR(255) COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140704.legalpreamble.1.sql b/resources/sql/autopatches/20140704.legalpreamble.1.sql new file mode 100644 index 0000000000..4ba1cde0e1 --- /dev/null +++ b/resources/sql/autopatches/20140704.legalpreamble.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_document + ADD preamble LONGTEXT NOT NULL COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140706.harbormasterdepend.1.php b/resources/sql/autopatches/20140706.harbormasterdepend.1.php new file mode 100644 index 0000000000..26bea1ad7f --- /dev/null +++ b/resources/sql/autopatches/20140706.harbormasterdepend.1.php @@ -0,0 +1,54 @@ +establishConnection('w'); +foreach (new LiskMigrationIterator($plan_table) as $plan) { + + echo pht( + "Migrating build plan %d: %s...\n", + $plan->getID(), + $plan->getName()); + + // Load all build steps in order using the step sequence. + $steps = queryfx_all( + $conn_w, + 'SELECT id FROM %T WHERE buildPlanPHID = %s ORDER BY sequence ASC;', + $step_table->getTableName(), + $plan->getPHID()); + + $previous_step = null; + foreach ($steps as $step) { + $id = $step['id']; + + $loaded_step = id(new HarbormasterBuildStep())->load($id); + + $depends_on = $loaded_step->getDetail('dependsOn'); + if ($depends_on !== null) { + // This plan already contains steps with depends_on set, so + // we skip since there's nothing to migrate. + break; + } + + if ($previous_step === null) { + $depends_on = array(); + } else { + $depends_on = array($previous_step->getPHID()); + } + + $loaded_step->setDetail('dependsOn', $depends_on); + queryfx( + $conn_w, + 'UPDATE %T SET details = %s WHERE id = %d', + $step_table->getTableName(), + json_encode($loaded_step->getDetails()), + $loaded_step->getID()); + + $previous_step = $loaded_step; + + echo pht( + " Migrated build step %d.\n", + $loaded_step->getID()); + } + +} diff --git a/resources/sql/autopatches/20140706.pedge.1.sql b/resources/sql/autopatches/20140706.pedge.1.sql new file mode 100644 index 0000000000..3dd049105c --- /dev/null +++ b/resources/sql/autopatches/20140706.pedge.1.sql @@ -0,0 +1,10 @@ +/* PhabricatorProjectObjectHasProjectEdgeType::EDGECONST = 41 */ +/* PhabricatorProjectProjectHasObjectEdgeType::EDGECONST = 42 */ + +INSERT IGNORE INTO {$NAMESPACE}_maniphest.edge (src, type, dst) + SELECT taskPHID, 41, projectPHID + FROM {$NAMESPACE}_maniphest.maniphest_taskproject; + +INSERT IGNORE INTO {$NAMESPACE}_project.edge (src, type, dst) + SELECT projectPHID, 42, taskPHID + FROM {$NAMESPACE}_maniphest.maniphest_taskproject; diff --git a/resources/sql/autopatches/20140711.pnames.1.sql b/resources/sql/autopatches/20140711.pnames.1.sql new file mode 100644 index 0000000000..9fce73a47e --- /dev/null +++ b/resources/sql/autopatches/20140711.pnames.1.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_project.project_datasourcetoken ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + projectID INT UNSIGNED NOT NULL, + token VARCHAR(128) NOT NULL COLLATE utf8_general_ci, + UNIQUE KEY (token, projectID), + KEY (projectID) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/resources/sql/autopatches/20140711.pnames.2.php b/resources/sql/autopatches/20140711.pnames.2.php new file mode 100644 index 0000000000..16030b5853 --- /dev/null +++ b/resources/sql/autopatches/20140711.pnames.2.php @@ -0,0 +1,11 @@ +getName(); + echo pht("Updating project '%d'...", $name)."\n"; + $project->updateDatasourceTokens(); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140711.workerpriority.sql b/resources/sql/autopatches/20140711.workerpriority.sql new file mode 100644 index 0000000000..3fabc545c3 --- /dev/null +++ b/resources/sql/autopatches/20140711.workerpriority.sql @@ -0,0 +1,11 @@ +ALTER TABLE {$NAMESPACE}_worker.worker_activetask + ADD COLUMN priority int unsigned NOT NULL; + +ALTER TABLE {$NAMESPACE}_worker.worker_activetask + ADD KEY (leaseOwner, priority, id); + +ALTER TABLE {$NAMESPACE}_worker.worker_archivetask + ADD COLUMN priority int unsigned NOT NULL; + +ALTER TABLE {$NAMESPACE}_worker.worker_archivetask + ADD KEY (leaseOwner, priority, id); diff --git a/resources/sql/autopatches/20140712.projcoluniq.sql b/resources/sql/autopatches/20140712.projcoluniq.sql new file mode 100644 index 0000000000..0b0030dd0a --- /dev/null +++ b/resources/sql/autopatches/20140712.projcoluniq.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_project.project_column + DROP KEY key_sequence; + +ALTER TABLE {$NAMESPACE}_project.project_column + ADD KEY key_sequence (projectPHID, sequence); diff --git a/resources/sql/autopatches/20140721.phortune.1.cart.sql b/resources/sql/autopatches/20140721.phortune.1.cart.sql new file mode 100644 index 0000000000..f1ddfd4d2e --- /dev/null +++ b/resources/sql/autopatches/20140721.phortune.1.cart.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_cart ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + accountPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_account` (accountPHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140721.phortune.2.purchase.sql b/resources/sql/autopatches/20140721.phortune.2.purchase.sql new file mode 100644 index 0000000000..b1f6de7ebd --- /dev/null +++ b/resources/sql/autopatches/20140721.phortune.2.purchase.sql @@ -0,0 +1,17 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_purchase ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + productPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + accountPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + cartPHID VARCHAR(64) COLLATE utf8_bin, + basePriceInCents INT NOT NULL, + quantity INT UNSIGNED NOT NULL, + totalPriceInCents INT NOT NULL, + status VARCHAR(32) NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_cart` (cartPHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140721.phortune.3.charge.sql b/resources/sql/autopatches/20140721.phortune.3.charge.sql new file mode 100644 index 0000000000..b75f05ff1a --- /dev/null +++ b/resources/sql/autopatches/20140721.phortune.3.charge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_charge ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + accountPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + cartPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + paymentMethodPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + amountInCents INT NOT NULL, + status VARCHAR(32) NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_cart` (cartPHID), + KEY `key_account` (accountPHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140721.phortune.4.cartstatus.sql b/resources/sql/autopatches/20140721.phortune.4.cartstatus.sql new file mode 100644 index 0000000000..fc18eb78dc --- /dev/null +++ b/resources/sql/autopatches/20140721.phortune.4.cartstatus.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_cart + ADD status VARCHAR(32) NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140721.phortune.5.cstatusdefault.sql b/resources/sql/autopatches/20140721.phortune.5.cstatusdefault.sql new file mode 100644 index 0000000000..1232164f46 --- /dev/null +++ b/resources/sql/autopatches/20140721.phortune.5.cstatusdefault.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_phortune.phortune_cart + SET status = 'cart:ready' WHERE status = ''; diff --git a/resources/sql/autopatches/20140721.phortune.6.onetimecharge.sql b/resources/sql/autopatches/20140721.phortune.6.onetimecharge.sql new file mode 100644 index 0000000000..4152efb0d0 --- /dev/null +++ b/resources/sql/autopatches/20140721.phortune.6.onetimecharge.sql @@ -0,0 +1,3 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_charge + ADD paymentProviderKey VARCHAR(128) NOT NULL COLLATE utf8_bin + AFTER cartPHID; diff --git a/resources/sql/autopatches/20140721.phortune.7.nullmethod.sql b/resources/sql/autopatches/20140721.phortune.7.nullmethod.sql new file mode 100644 index 0000000000..d843251bb0 --- /dev/null +++ b/resources/sql/autopatches/20140721.phortune.7.nullmethod.sql @@ -0,0 +1,4 @@ +/* Make this nullable to support one-time providers. */ + +ALTER TABLE {$NAMESPACE}_phortune.phortune_charge + CHANGE paymentMethodPHID paymentMethodPHID VARCHAR(64) COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140722.appname.php b/resources/sql/autopatches/20140722.appname.php new file mode 100644 index 0000000000..dd8e929357 --- /dev/null +++ b/resources/sql/autopatches/20140722.appname.php @@ -0,0 +1,127 @@ +getValue(); +$new_config = array(); + +if ($old_config) { + foreach ($old_config as $application => $uninstalled) { + $new_config[idx($map, $application, $application)] = $uninstalled; + } + + $config + ->setIsDeleted(0) + ->setValue($new_config) + ->save(); +} + + +/* -( phabricator.application-settings )----------------------------------- */ + +$config_key = 'phabricator.application-settings'; +echo pht('Migrating `%s` config...', $config_key)."\n"; + +$config = PhabricatorConfigEntry::loadConfigEntry($config_key); +$old_config = $config->getValue(); +$new_config = array(); + +if ($old_config) { + foreach ($old_config as $application => $settings) { + $application = preg_replace('/^PHID-APPS-/', '', $application); + $new_config['PHID-APPS-'.idx($map, $application, $application)] = $settings; + } + + $config + ->setIsDeleted(0) + ->setValue($new_config) + ->save(); +} diff --git a/resources/sql/autopatches/20140722.audit.1.xactions.sql b/resources/sql/autopatches/20140722.audit.1.xactions.sql new file mode 100644 index 0000000000..8c089e5ec7 --- /dev/null +++ b/resources/sql/autopatches/20140722.audit.1.xactions.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_audit.audit_transaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) COLLATE utf8_bin NOT NULL, + authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL, + oldValue LONGTEXT COLLATE utf8_bin NOT NULL, + newValue LONGTEXT COLLATE utf8_bin NOT NULL, + contentSource LONGTEXT COLLATE utf8_bin NOT NULL, + metadata LONGTEXT COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140722.audit.2.comments.sql b/resources/sql/autopatches/20140722.audit.2.comments.sql new file mode 100644 index 0000000000..75013ae567 --- /dev/null +++ b/resources/sql/autopatches/20140722.audit.2.comments.sql @@ -0,0 +1,29 @@ +CREATE TABLE {$NAMESPACE}_audit.audit_transaction_comment ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) COLLATE utf8_bin NOT NULL, + transactionPHID VARCHAR(64) COLLATE utf8_bin, + authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + commentVersion INT UNSIGNED NOT NULL, + content longtext COLLATE utf8_bin NOT NULL, + contentSource longtext COLLATE utf8_bin NOT NULL, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + commitPHID VARCHAR(64) COLLATE utf8_bin, + pathID INT UNSIGNED, + isNewFile BOOL NOT NULL, + lineNumber INT UNSIGNED NOT NULL, + lineLength INT UNSIGNED NOT NULL, + fixedState VARCHAR(12) COLLATE utf8_bin, + hasReplies BOOL NOT NULL, + replyToCommentPHID VARCHAR(64) COLLATE utf8_bin, + legacyCommentID INT UNSIGNED, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion), + KEY `key_path` (pathID), + KEY `key_draft` (authorPHID, transactionPHID), + KEY `key_commit` (commitPHID), + KEY `key_legacy` (legacyCommentID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140722.audit.3.miginlines.php b/resources/sql/autopatches/20140722.audit.3.miginlines.php new file mode 100644 index 0000000000..d816b534eb --- /dev/null +++ b/resources/sql/autopatches/20140722.audit.3.miginlines.php @@ -0,0 +1,76 @@ +establishConnection('w'); +$conn_w->openTransaction(); + +$src_table = 'audit_inlinecomment'; +$dst_table = 'audit_transaction_comment'; + +echo pht('Migrating Audit inline comments to new format...')."\n"; + +$content_source = PhabricatorContentSource::newForSource( + PhabricatorOldWorldContentSource::SOURCECONST)->serialize(); + +$rows = new LiskRawMigrationIterator($conn_w, $src_table); +foreach ($rows as $row) { + $id = $row['id']; + + echo pht('Migrating inline #%d...', $id); + + if ($row['auditCommentID']) { + $xaction_phid = PhabricatorPHID::generateNewPHID( + PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST, + PhabricatorRepositoryCommitPHIDType::TYPECONST); + } else { + $xaction_phid = null; + } + + $comment_phid = PhabricatorPHID::generateNewPHID( + PhabricatorPHIDConstants::PHID_TYPE_XCMT, + PhabricatorRepositoryCommitPHIDType::TYPECONST); + + queryfx( + $conn_w, + 'INSERT IGNORE INTO %T + (id, phid, transactionPHID, authorPHID, viewPolicy, editPolicy, + commentVersion, content, contentSource, isDeleted, + dateCreated, dateModified, commitPHID, pathID, + isNewFile, lineNumber, lineLength, hasReplies, legacyCommentID) + VALUES (%d, %s, %ns, %s, %s, %s, + %d, %s, %s, %d, + %d, %d, %s, %nd, + %d, %d, %d, %d, %nd)', + $dst_table, + + // id, phid, transactionPHID, authorPHID, viewPolicy, editPolicy + $row['id'], + $comment_phid, + $xaction_phid, + $row['authorPHID'], + 'public', + $row['authorPHID'], + + // commentVersion, content, contentSource, isDeleted + 1, + $row['content'], + $content_source, + 0, + + // dateCreated, dateModified, commitPHID, pathID + $row['dateCreated'], + $row['dateModified'], + $row['commitPHID'], + $row['pathID'], + + // isNewFile, lineNumber, lineLength, hasReplies, legacyCommentID + $row['isNewFile'], + $row['lineNumber'], + $row['lineLength'], + 0, + $row['auditCommentID']); + +} + +$conn_w->saveTransaction(); +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140722.audit.4.migtext.php b/resources/sql/autopatches/20140722.audit.4.migtext.php new file mode 100644 index 0000000000..c2a775058b --- /dev/null +++ b/resources/sql/autopatches/20140722.audit.4.migtext.php @@ -0,0 +1,60 @@ +establishConnection('w'); +$rows = new LiskRawMigrationIterator($conn_w, 'audit_comment'); + +$content_source = PhabricatorContentSource::newForSource( + PhabricatorOldWorldContentSource::SOURCECONST)->serialize(); + +echo pht('Migrating Audit comment text to modern storage...')."\n"; +foreach ($rows as $row) { + $id = $row['id']; + echo pht('Migrating Audit comment %d...', $id)."\n"; + if (!strlen($row['content'])) { + echo pht('Comment has no text, continuing.')."\n"; + continue; + } + + $xaction_phid = PhabricatorPHID::generateNewPHID( + PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST, + PhabricatorRepositoryCommitPHIDType::TYPECONST); + + $comment_phid = PhabricatorPHID::generateNewPHID( + PhabricatorPHIDConstants::PHID_TYPE_XCMT, + PhabricatorRepositoryCommitPHIDType::TYPECONST); + + queryfx( + $conn_w, + 'INSERT IGNORE INTO %T + (phid, transactionPHID, authorPHID, viewPolicy, editPolicy, + commentVersion, content, contentSource, isDeleted, + dateCreated, dateModified, commitPHID, pathID, + legacyCommentID) + VALUES (%s, %s, %s, %s, %s, + %d, %s, %s, %d, + %d, %d, %s, %nd, + %d)', + 'audit_transaction_comment', + + // phid, transactionPHID, authorPHID, viewPolicy, editPolicy + $comment_phid, + $xaction_phid, + $row['actorPHID'], + 'public', + $row['actorPHID'], + + // commentVersion, content, contentSource, isDeleted + 1, + $row['content'], + $content_source, + 0, + + // dateCreated, dateModified, commitPHID, pathID, legacyCommentID + $row['dateCreated'], + $row['dateModified'], + $row['targetPHID'], + null, + $row['id']); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140722.renameauth.php b/resources/sql/autopatches/20140722.renameauth.php new file mode 100644 index 0000000000..225031d2f1 --- /dev/null +++ b/resources/sql/autopatches/20140722.renameauth.php @@ -0,0 +1,34 @@ + 'PhabricatorAmazonAuthProvider', + 'PhabricatorAuthProviderOAuthAsana' => 'PhabricatorAsanaAuthProvider', + 'PhabricatorAuthProviderOAuth1Bitbucket' + => 'PhabricatorBitbucketAuthProvider', + 'PhabricatorAuthProviderOAuthDisqus' => 'PhabricatorDisqusAuthProvider', + 'PhabricatorAuthProviderOAuthFacebook' => 'PhabricatorFacebookAuthProvider', + 'PhabricatorAuthProviderOAuthGitHub' => 'PhabricatorGitHubAuthProvider', + 'PhabricatorAuthProviderOAuthGoogle' => 'PhabricatorGoogleAuthProvider', + 'PhabricatorAuthProviderOAuth1JIRA' => 'PhabricatorJIRAAuthProvider', + 'PhabricatorAuthProviderLDAP' => 'PhabricatorLDAPAuthProvider', + 'PhabricatorAuthProviderPassword' => 'PhabricatorPasswordAuthProvider', + 'PhabricatorAuthProviderPersona' => 'PhabricatorPersonaAuthProvider', + 'PhabricatorAuthProviderOAuthTwitch' => 'PhabricatorTwitchAuthProvider', + 'PhabricatorAuthProviderOAuth1Twitter' => 'PhabricatorTwitterAuthProvider', + 'PhabricatorAuthProviderOAuthWordPress' => 'PhabricatorWordPressAuthProvider', +); + +echo pht('Migrating auth providers...')."\n"; +$table = new PhabricatorAuthProviderConfig(); +$conn_w = $table->establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $provider) { + $provider_class = $provider->getProviderClass(); + + queryfx( + $conn_w, + 'UPDATE %T SET providerClass = %s WHERE id = %d', + $provider->getTableName(), + idx($map, $provider_class, $provider_class), + $provider->getID()); +} diff --git a/resources/sql/autopatches/20140723.apprenamexaction.sql b/resources/sql/autopatches/20140723.apprenamexaction.sql new file mode 100644 index 0000000000..e7939ba617 --- /dev/null +++ b/resources/sql/autopatches/20140723.apprenamexaction.sql @@ -0,0 +1,13 @@ +UPDATE {$NAMESPACE}_differential.differential_transaction + SET authorPHID = 'PHID-APPS-PhabricatorHeraldApplication' + WHERE authorPHID = 'PHID-APPS-PhabricatorApplicationHerald'; +UPDATE {$NAMESPACE}_maniphest.maniphest_transaction + SET authorPHID = 'PHID-APPS-PhabricatorHeraldApplication' + WHERE authorPHID = 'PHID-APPS-PhabricatorApplicationHerald'; +UPDATE {$NAMESPACE}_pholio.pholio_transaction + SET authorPHID = 'PHID-APPS-PhabricatorHeraldApplication' + WHERE authorPHID = 'PHID-APPS-PhabricatorApplicationHerald'; + +UPDATE {$NAMESPACE}_differential.differential_transaction + SET authorPHID = 'PHID-APPS-PhabricatorHarbormasterApplication' + WHERE authorPHID = 'PHID-APPS-PhabricatorApplicationHarbormaster'; diff --git a/resources/sql/autopatches/20140725.audit.1.migxactions.php b/resources/sql/autopatches/20140725.audit.1.migxactions.php new file mode 100644 index 0000000000..4eb0897aeb --- /dev/null +++ b/resources/sql/autopatches/20140725.audit.1.migxactions.php @@ -0,0 +1,149 @@ +establishConnection('w'); +$rows = new LiskRawMigrationIterator($conn_w, 'audit_comment'); + +$content_source = PhabricatorContentSource::newForSource( + PhabricatorOldWorldContentSource::SOURCECONST)->serialize(); + +echo pht('Migrating Audit comments to modern storage...')."\n"; +foreach ($rows as $row) { + $id = $row['id']; + echo pht('Migrating comment %d...', $id)."\n"; + + $comments = queryfx_all( + $conn_w, + 'SELECT * FROM %T WHERE legacyCommentID = %d', + 'audit_transaction_comment', + $id); + + $main_comments = array(); + $inline_comments = array(); + + foreach ($comments as $comment) { + if ($comment['pathID']) { + $inline_comments[] = $comment; + } else { + $main_comments[] = $comment; + } + } + + $metadata = json_decode($row['metadata'], true); + if (!is_array($metadata)) { + $metadata = array(); + } + + $xactions = array(); + + // Build the main action transaction. + switch ($row['action']) { + case PhabricatorAuditActionConstants::ADD_AUDITORS: + $phids = idx($metadata, 'added-auditors', array()); + $xactions[] = array( + 'type' => $row['action'], + 'old' => null, + 'new' => array_fuse($phids), + ); + break; + case PhabricatorAuditActionConstants::ADD_CCS: + $phids = idx($metadata, 'added-ccs', array()); + $xactions[] = array( + 'type' => $row['action'], + 'old' => null, + 'new' => array_fuse($phids), + ); + break; + case PhabricatorAuditActionConstants::COMMENT: + case PhabricatorAuditActionConstants::INLINE: + // These actions will have their transactions created by other rules. + break; + default: + // Otherwise, this is an accept/concern/etc action. + $xactions[] = array( + 'type' => PhabricatorAuditActionConstants::ACTION, + 'old' => null, + 'new' => $row['action'], + ); + break; + } + + + // Build the main comment transaction. + foreach ($main_comments as $main) { + $xactions[] = array( + 'type' => PhabricatorTransactions::TYPE_COMMENT, + 'old' => null, + 'new' => null, + 'phid' => $main['transactionPHID'], + 'comment' => $main, + ); + } + + // Build inline comment transactions. + foreach ($inline_comments as $inline) { + $xactions[] = array( + 'type' => PhabricatorAuditActionConstants::INLINE, + 'old' => null, + 'new' => null, + 'phid' => $inline['transactionPHID'], + 'comment' => $inline, + ); + } + + foreach ($xactions as $xaction) { + // Generate a new PHID, if we don't already have one from the comment + // table. We pregenerated into the comment table to make this a little + // easier, so we only need to write to one table. + $xaction_phid = idx($xaction, 'phid'); + if (!$xaction_phid) { + $xaction_phid = PhabricatorPHID::generateNewPHID( + PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST, + PhabricatorRepositoryCommitPHIDType::TYPECONST); + } + unset($xaction['phid']); + + $comment_phid = null; + $comment_version = 0; + if (idx($xaction, 'comment')) { + $comment_phid = $xaction['comment']['phid']; + $comment_version = 1; + } + + $old = idx($xaction, 'old'); + $new = idx($xaction, 'new'); + $meta = idx($xaction, 'meta', array()); + + queryfx( + $conn_w, + 'INSERT INTO %T (phid, authorPHID, objectPHID, viewPolicy, editPolicy, + commentPHID, commentVersion, transactionType, oldValue, newValue, + contentSource, metadata, dateCreated, dateModified) + VALUES (%s, %s, %s, %s, %s, %ns, %d, %s, %ns, %ns, %s, %s, %d, %d)', + 'audit_transaction', + + // PHID, authorPHID, objectPHID + $xaction_phid, + $row['actorPHID'], + $row['targetPHID'], + + // viewPolicy, editPolicy, commentPHID, commentVersion + 'public', + $row['actorPHID'], + $comment_phid, + $comment_version, + + // transactionType, oldValue, newValue, contentSource, metadata + $xaction['type'], + json_encode($old), + json_encode($new), + $content_source, + json_encode($meta), + + // dates + $row['dateCreated'], + $row['dateModified']); + } + +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140731.audit.1.subscribers.php b/resources/sql/autopatches/20140731.audit.1.subscribers.php new file mode 100644 index 0000000000..b452275295 --- /dev/null +++ b/resources/sql/autopatches/20140731.audit.1.subscribers.php @@ -0,0 +1,30 @@ +establishConnection('w'); + +echo pht('Migrating Audit subscribers to subscriptions...')."\n"; +foreach (new LiskMigrationIterator($table) as $request) { + $id = $request->getID(); + + echo pht("Migrating audit %d...\n", $id); + + if ($request->getAuditStatus() != 'cc') { + // This isn't a "subscriber", so skip it. + continue; + } + + queryfx( + $conn_w, + 'INSERT IGNORE INTO %T (src, type, dst) VALUES (%s, %d, %s)', + PhabricatorEdgeConfig::TABLE_NAME_EDGE, + $request->getCommitPHID(), + PhabricatorObjectHasSubscriberEdgeType::EDGECONST, + $request->getAuditorPHID()); + + + // Wipe the row. + $request->delete(); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140731.cancdn.php b/resources/sql/autopatches/20140731.cancdn.php new file mode 100644 index 0000000000..f4090b092c --- /dev/null +++ b/resources/sql/autopatches/20140731.cancdn.php @@ -0,0 +1,20 @@ +establishConnection('w'); +foreach (new LiskMigrationIterator($table) as $file) { + $id = $file->getID(); + echo pht('Updating flags for file %d...', $id)."\n"; + $meta = $file->getMetadata(); + if (!idx($meta, 'canCDN')) { + + $meta['canCDN'] = true; + + queryfx( + $conn_w, + 'UPDATE %T SET metadata = %s WHERE id = %d', + $table->getTableName(), + json_encode($meta), + $id); + } +} diff --git a/resources/sql/autopatches/20140731.harbormasterstepdesc.sql b/resources/sql/autopatches/20140731.harbormasterstepdesc.sql new file mode 100644 index 0000000000..8824727afb --- /dev/null +++ b/resources/sql/autopatches/20140731.harbormasterstepdesc.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildstep + ADD description LONGTEXT NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140805.boardcol.1.sql b/resources/sql/autopatches/20140805.boardcol.1.sql new file mode 100644 index 0000000000..e8099e50e5 --- /dev/null +++ b/resources/sql/autopatches/20140805.boardcol.1.sql @@ -0,0 +1,10 @@ +CREATE TABLE {$NAMESPACE}_project.project_columnposition ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + boardPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + columnPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + sequence INT UNSIGNED NOT NULL, + UNIQUE KEY (boardPHID, columnPHID, objectPHID), + KEY (objectPHID, boardPHID), + KEY (boardPHID, columnPHID, sequence) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140805.boardcol.2.php b/resources/sql/autopatches/20140805.boardcol.2.php new file mode 100644 index 0000000000..40d6c46ec2 --- /dev/null +++ b/resources/sql/autopatches/20140805.boardcol.2.php @@ -0,0 +1,53 @@ +establishConnection('w'); + +$rows = queryfx_all( + $conn_w, + 'SELECT src, dst FROM %T WHERE type = %d', + PhabricatorEdgeConfig::TABLE_NAME_EDGE, + $type_has_object); + +$cols = array(); +foreach ($rows as $row) { + $cols[$row['src']][] = $row['dst']; +} + +$sql = array(); +foreach ($cols as $col_phid => $obj_phids) { + echo pht("Migrating column '%s'...", $col_phid)."\n"; + $column = id(new PhabricatorProjectColumn())->loadOneWhere( + 'phid = %s', + $col_phid); + if (!$column) { + echo pht("Column '%s' does not exist.", $col_phid)."\n"; + continue; + } + + $sequence = 0; + foreach ($obj_phids as $obj_phid) { + $sql[] = qsprintf( + $conn_w, + '(%s, %s, %s, %d)', + $column->getProjectPHID(), + $column->getPHID(), + $obj_phid, + $sequence++); + } +} + +echo pht('Inserting rows...')."\n"; +foreach (PhabricatorLiskDAO::chunkSQL($sql) as $chunk) { + queryfx( + $conn_w, + 'INSERT INTO %T (boardPHID, columnPHID, objectPHID, sequence) + VALUES %LQ', + id(new PhabricatorProjectColumnPosition())->getTableName(), + $chunk); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140807.harbormastertargettime.sql b/resources/sql/autopatches/20140807.harbormastertargettime.sql new file mode 100644 index 0000000000..88b8c175f9 --- /dev/null +++ b/resources/sql/autopatches/20140807.harbormastertargettime.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildtarget + ADD dateStarted INT UNSIGNED NULL; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildtarget + ADD dateCompleted INT UNSIGNED NULL; diff --git a/resources/sql/autopatches/20140808.boardprop.1.sql b/resources/sql/autopatches/20140808.boardprop.1.sql new file mode 100644 index 0000000000..9325c148a4 --- /dev/null +++ b/resources/sql/autopatches/20140808.boardprop.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project_column + ADD properties LONGTEXT NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140808.boardprop.2.sql b/resources/sql/autopatches/20140808.boardprop.2.sql new file mode 100644 index 0000000000..d7716898dd --- /dev/null +++ b/resources/sql/autopatches/20140808.boardprop.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_project.project_column + SET properties = '{}' WHERE properties = ''; diff --git a/resources/sql/autopatches/20140808.boardprop.3.php b/resources/sql/autopatches/20140808.boardprop.3.php new file mode 100644 index 0000000000..947ce85f60 --- /dev/null +++ b/resources/sql/autopatches/20140808.boardprop.3.php @@ -0,0 +1,24 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $column) { + $id = $column->getID(); + + echo pht('Adjusting column %d...', $id)."\n"; + if ($column->getSequence() == 0) { + + $properties = $column->getProperties(); + $properties['isDefault'] = true; + + queryfx( + $conn_w, + 'UPDATE %T SET properties = %s WHERE id = %d', + $table->getTableName(), + json_encode($properties), + $id); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140811.blob.1.sql b/resources/sql/autopatches/20140811.blob.1.sql new file mode 100644 index 0000000000..059adc1df4 --- /dev/null +++ b/resources/sql/autopatches/20140811.blob.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_refcursor + CHANGE refNameRaw refNameRaw LONGBLOB NOT NULL; diff --git a/resources/sql/autopatches/20140811.blob.2.sql b/resources/sql/autopatches/20140811.blob.2.sql new file mode 100644 index 0000000000..f30d9d98c6 --- /dev/null +++ b/resources/sql/autopatches/20140811.blob.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_pushlog + CHANGE refNameRaw refNameRaw LONGBLOB; diff --git a/resources/sql/autopatches/20140812.projkey.1.sql b/resources/sql/autopatches/20140812.projkey.1.sql new file mode 100644 index 0000000000..c1726843ad --- /dev/null +++ b/resources/sql/autopatches/20140812.projkey.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD KEY `key_icon` (icon); diff --git a/resources/sql/autopatches/20140812.projkey.2.sql b/resources/sql/autopatches/20140812.projkey.2.sql new file mode 100644 index 0000000000..c48a54d4d8 --- /dev/null +++ b/resources/sql/autopatches/20140812.projkey.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD KEY `key_color` (color); diff --git a/resources/sql/autopatches/20140814.passphrasecredentialconduit.sql b/resources/sql/autopatches/20140814.passphrasecredentialconduit.sql new file mode 100644 index 0000000000..6dda0aaf6a --- /dev/null +++ b/resources/sql/autopatches/20140814.passphrasecredentialconduit.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_passphrase.passphrase_credential + ADD COLUMN allowConduit BOOL NOT NULL DEFAULT 0; diff --git a/resources/sql/autopatches/20140815.cancdncase.php b/resources/sql/autopatches/20140815.cancdncase.php new file mode 100644 index 0000000000..0e9cafaabd --- /dev/null +++ b/resources/sql/autopatches/20140815.cancdncase.php @@ -0,0 +1,27 @@ +establishConnection('w'); +foreach (new LiskMigrationIterator($table) as $file) { + $id = $file->getID(); + echo pht( + "Updating capitalization of %s property for file %d...\n", + 'canCDN', + $id); + $meta = $file->getMetadata(); + + if (isset($meta['cancdn'])) { + $meta['canCDN'] = $meta['cancdn']; + unset($meta['cancdn']); + + queryfx( + $conn_w, + 'UPDATE %T SET metadata = %s WHERE id = %d', + $table->getTableName(), + json_encode($meta), + $id); + } +} diff --git a/resources/sql/autopatches/20140818.harbormasterindex.1.sql b/resources/sql/autopatches/20140818.harbormasterindex.1.sql new file mode 100644 index 0000000000..4c72645d45 --- /dev/null +++ b/resources/sql/autopatches/20140818.harbormasterindex.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlog + ADD KEY `key_buildtarget` (buildTargetPHID); diff --git a/resources/sql/autopatches/20140821.harbormasterbuildgen.1.sql b/resources/sql/autopatches/20140821.harbormasterbuildgen.1.sql new file mode 100644 index 0000000000..a687146f60 --- /dev/null +++ b/resources/sql/autopatches/20140821.harbormasterbuildgen.1.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_build + ADD COLUMN `buildGeneration` INT UNSIGNED NOT NULL DEFAULT 0; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildtarget + ADD COLUMN `buildGeneration` INT UNSIGNED NOT NULL DEFAULT 0; diff --git a/resources/sql/autopatches/20140822.daemonenvhash.sql b/resources/sql/autopatches/20140822.daemonenvhash.sql new file mode 100644 index 0000000000..fb95ecec35 --- /dev/null +++ b/resources/sql/autopatches/20140822.daemonenvhash.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_daemon.daemon_log + ADD COLUMN `envHash` CHAR(40) NOT NULL DEFAULT '' AFTER `dateModified`; diff --git a/resources/sql/autopatches/20140902.almanacdevice.1.sql b/resources/sql/autopatches/20140902.almanacdevice.1.sql new file mode 100644 index 0000000000..712b2de7ff --- /dev/null +++ b/resources/sql/autopatches/20140902.almanacdevice.1.sql @@ -0,0 +1,18 @@ +CREATE TABLE {$NAMESPACE}_almanac.almanac_device ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + name VARCHAR(255) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE utf8_bin; + +CREATE TABLE {$NAMESPACE}_almanac.almanac_deviceproperty ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + devicePHID VARBINARY(64) NOT NULL, + `key` VARCHAR(128) NOT NULL COLLATE utf8_bin, + value LONGTEXT NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_device` (devicePHID, `key`) +) ENGINE=InnoDB, COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20140904.macroattach.php b/resources/sql/autopatches/20140904.macroattach.php new file mode 100644 index 0000000000..4c4f4e8494 --- /dev/null +++ b/resources/sql/autopatches/20140904.macroattach.php @@ -0,0 +1,26 @@ +getName(); + + echo pht("Linking macro '%s'...", $name)."\n"; + + $editor = new PhabricatorEdgeEditor(); + + $phids[] = $macro->getFilePHID(); + $phids[] = $macro->getAudioPHID(); + $phids = array_filter($phids); + + if ($phids) { + foreach ($phids as $phid) { + $editor->addEdge( + $macro->getPHID(), + 25, + $phid); + } + $editor->save(); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140911.fund.1.initiative.sql b/resources/sql/autopatches/20140911.fund.1.initiative.sql new file mode 100644 index 0000000000..8e170dbcb0 --- /dev/null +++ b/resources/sql/autopatches/20140911.fund.1.initiative.sql @@ -0,0 +1,15 @@ +CREATE TABLE {$NAMESPACE}_fund.fund_initiative ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + name VARCHAR(255) NOT NULL, + ownerPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + description LONGTEXT NOT NULL, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + status VARCHAR(32) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_status` (status), + KEY `key_owner` (ownerPHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140911.fund.2.xaction.sql b/resources/sql/autopatches/20140911.fund.2.xaction.sql new file mode 100644 index 0000000000..bfa3f9c3e2 --- /dev/null +++ b/resources/sql/autopatches/20140911.fund.2.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_fund.fund_initiativetransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) COLLATE utf8_bin NOT NULL, + authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL, + oldValue LONGTEXT COLLATE utf8_bin NOT NULL, + newValue LONGTEXT COLLATE utf8_bin NOT NULL, + contentSource LONGTEXT COLLATE utf8_bin NOT NULL, + metadata LONGTEXT COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140911.fund.3.edge.sql b/resources/sql/autopatches/20140911.fund.3.edge.sql new file mode 100644 index 0000000000..0dc5821762 --- /dev/null +++ b/resources/sql/autopatches/20140911.fund.3.edge.sql @@ -0,0 +1,15 @@ +CREATE TABLE {$NAMESPACE}_fund.edge ( + src VARCHAR(64) NOT NULL COLLATE utf8_bin, + type VARCHAR(64) NOT NULL COLLATE utf8_bin, + dst VARCHAR(64) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY (src, type, dateCreated, seq) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_fund.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE utf8_bin +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140911.fund.4.backer.sql b/resources/sql/autopatches/20140911.fund.4.backer.sql new file mode 100644 index 0000000000..1dd6815192 --- /dev/null +++ b/resources/sql/autopatches/20140911.fund.4.backer.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_fund.fund_backer ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + initiativePHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + backerPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + status VARCHAR(32) NOT NULL COLLATE utf8_bin, + amountInCents INT UNSIGNED NOT NULL, + properties LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_initiative` (initiativePHID), + KEY `key_backer` (backerPHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140911.fund.5.backxaction.sql b/resources/sql/autopatches/20140911.fund.5.backxaction.sql new file mode 100644 index 0000000000..e9b5acbc0c --- /dev/null +++ b/resources/sql/autopatches/20140911.fund.5.backxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_fund.fund_backertransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) COLLATE utf8_bin NOT NULL, + authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL, + oldValue LONGTEXT COLLATE utf8_bin NOT NULL, + newValue LONGTEXT COLLATE utf8_bin NOT NULL, + contentSource LONGTEXT COLLATE utf8_bin NOT NULL, + metadata LONGTEXT COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140914.betaproto.php b/resources/sql/autopatches/20140914.betaproto.php new file mode 100644 index 0000000000..849c5acb3b --- /dev/null +++ b/resources/sql/autopatches/20140914.betaproto.php @@ -0,0 +1,24 @@ +setIsDeleted(0) + ->setValue($old) + ->save(); + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20140917.project.canlock.sql b/resources/sql/autopatches/20140917.project.canlock.sql new file mode 100644 index 0000000000..e00b425d5b --- /dev/null +++ b/resources/sql/autopatches/20140917.project.canlock.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD isMembershipLocked TINYINT(1) NOT NULL DEFAULT 0 AFTER joinPolicy; diff --git a/resources/sql/autopatches/20140918.schema.1.dropaudit.sql b/resources/sql/autopatches/20140918.schema.1.dropaudit.sql new file mode 100644 index 0000000000..ee01e84883 --- /dev/null +++ b/resources/sql/autopatches/20140918.schema.1.dropaudit.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_audit.audit_comment; diff --git a/resources/sql/autopatches/20140918.schema.2.dropauditinline.sql b/resources/sql/autopatches/20140918.schema.2.dropauditinline.sql new file mode 100644 index 0000000000..692261cb3b --- /dev/null +++ b/resources/sql/autopatches/20140918.schema.2.dropauditinline.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_audit.audit_inlinecomment; diff --git a/resources/sql/autopatches/20140918.schema.3.wipecache.sql b/resources/sql/autopatches/20140918.schema.3.wipecache.sql new file mode 100644 index 0000000000..636f2ef3ea --- /dev/null +++ b/resources/sql/autopatches/20140918.schema.3.wipecache.sql @@ -0,0 +1 @@ +TRUNCATE TABLE {$NAMESPACE}_cache.cache_markupcache; diff --git a/resources/sql/autopatches/20140918.schema.4.cachetype.sql b/resources/sql/autopatches/20140918.schema.4.cachetype.sql new file mode 100644 index 0000000000..1ce047798a --- /dev/null +++ b/resources/sql/autopatches/20140918.schema.4.cachetype.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_cache.cache_markupcache + CHANGE cacheData cacheData LONGBLOB NOT NULL; diff --git a/resources/sql/autopatches/20140918.schema.5.slowvote.sql b/resources/sql/autopatches/20140918.schema.5.slowvote.sql new file mode 100644 index 0000000000..1830552c73 --- /dev/null +++ b/resources/sql/autopatches/20140918.schema.5.slowvote.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_slowvote.slowvote_comment; diff --git a/resources/sql/autopatches/20140919.schema.01.calstatus.sql b/resources/sql/autopatches/20140919.schema.01.calstatus.sql new file mode 100644 index 0000000000..0eb1907404 --- /dev/null +++ b/resources/sql/autopatches/20140919.schema.01.calstatus.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + CHANGE status status INT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20140919.schema.02.calname.sql b/resources/sql/autopatches/20140919.schema.02.calname.sql new file mode 100644 index 0000000000..49b5d6aee2 --- /dev/null +++ b/resources/sql/autopatches/20140919.schema.02.calname.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_holiday + CHANGE name name VARCHAR(64) NOT NULL COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20140919.schema.03.dropaux.sql b/resources/sql/autopatches/20140919.schema.03.dropaux.sql new file mode 100644 index 0000000000..c87dbbdeca --- /dev/null +++ b/resources/sql/autopatches/20140919.schema.03.dropaux.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_maniphest.maniphest_taskauxiliarystorage; diff --git a/resources/sql/autopatches/20140919.schema.04.droptaskproj.sql b/resources/sql/autopatches/20140919.schema.04.droptaskproj.sql new file mode 100644 index 0000000000..1415997b7d --- /dev/null +++ b/resources/sql/autopatches/20140919.schema.04.droptaskproj.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_maniphest.maniphest_taskproject; diff --git a/resources/sql/autopatches/20140926.schema.01.droprelev.sql b/resources/sql/autopatches/20140926.schema.01.droprelev.sql new file mode 100644 index 0000000000..7542e2b209 --- /dev/null +++ b/resources/sql/autopatches/20140926.schema.01.droprelev.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_releeph.releeph_event; diff --git a/resources/sql/autopatches/20140926.schema.02.droprelreqev.sql b/resources/sql/autopatches/20140926.schema.02.droprelreqev.sql new file mode 100644 index 0000000000..de0218ef2d --- /dev/null +++ b/resources/sql/autopatches/20140926.schema.02.droprelreqev.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_releeph.releeph_requestevent; diff --git a/resources/sql/autopatches/20140926.schema.03.dropldapinfo.sql b/resources/sql/autopatches/20140926.schema.03.dropldapinfo.sql new file mode 100644 index 0000000000..11c732d57b --- /dev/null +++ b/resources/sql/autopatches/20140926.schema.03.dropldapinfo.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_user.user_ldapinfo; diff --git a/resources/sql/autopatches/20140926.schema.04.dropoauthinfo.sql b/resources/sql/autopatches/20140926.schema.04.dropoauthinfo.sql new file mode 100644 index 0000000000..fb70d81d00 --- /dev/null +++ b/resources/sql/autopatches/20140926.schema.04.dropoauthinfo.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_user.user_oauthinfo; diff --git a/resources/sql/autopatches/20140926.schema.05.dropprojaffil.sql b/resources/sql/autopatches/20140926.schema.05.dropprojaffil.sql new file mode 100644 index 0000000000..fca4b35db3 --- /dev/null +++ b/resources/sql/autopatches/20140926.schema.05.dropprojaffil.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_project.project_affiliation; diff --git a/resources/sql/autopatches/20140926.schema.06.dropsubproject.sql b/resources/sql/autopatches/20140926.schema.06.dropsubproject.sql new file mode 100644 index 0000000000..9049f82329 --- /dev/null +++ b/resources/sql/autopatches/20140926.schema.06.dropsubproject.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_project.project_subproject; diff --git a/resources/sql/autopatches/20140926.schema.07.droppondcom.sql b/resources/sql/autopatches/20140926.schema.07.droppondcom.sql new file mode 100644 index 0000000000..d040e2b5bd --- /dev/null +++ b/resources/sql/autopatches/20140926.schema.07.droppondcom.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_ponder.ponder_comment; diff --git a/resources/sql/autopatches/20140927.schema.01.dropsearchq.sql b/resources/sql/autopatches/20140927.schema.01.dropsearchq.sql new file mode 100644 index 0000000000..69d40b5e04 --- /dev/null +++ b/resources/sql/autopatches/20140927.schema.01.dropsearchq.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_search.search_query; diff --git a/resources/sql/autopatches/20140927.schema.02.pholio1.sql b/resources/sql/autopatches/20140927.schema.02.pholio1.sql new file mode 100644 index 0000000000..65703f3fff --- /dev/null +++ b/resources/sql/autopatches/20140927.schema.02.pholio1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_pholio.pholio_transaction_comment + DROP KEY `key_draft`; diff --git a/resources/sql/autopatches/20140927.schema.03.pholio2.sql b/resources/sql/autopatches/20140927.schema.03.pholio2.sql new file mode 100644 index 0000000000..eaa728d29f --- /dev/null +++ b/resources/sql/autopatches/20140927.schema.03.pholio2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_pholio.pholio_transaction_comment + ADD UNIQUE KEY `key_draft` (authorPHID, imageID, transactionPHID); diff --git a/resources/sql/autopatches/20140927.schema.04.pholio3.sql b/resources/sql/autopatches/20140927.schema.04.pholio3.sql new file mode 100644 index 0000000000..03ec4b5bbe --- /dev/null +++ b/resources/sql/autopatches/20140927.schema.04.pholio3.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_pholio.pholio_transaction_comment + DROP COLUMN mockID; diff --git a/resources/sql/autopatches/20140927.schema.05.phragment1.sql b/resources/sql/autopatches/20140927.schema.05.phragment1.sql new file mode 100644 index 0000000000..505414d0e2 --- /dev/null +++ b/resources/sql/autopatches/20140927.schema.05.phragment1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phragment.phragment_snapshot + DROP COLUMN description; diff --git a/resources/sql/autopatches/20140927.schema.06.releeph1.sql b/resources/sql/autopatches/20140927.schema.06.releeph1.sql new file mode 100644 index 0000000000..e82be76165 --- /dev/null +++ b/resources/sql/autopatches/20140927.schema.06.releeph1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_releeph.releeph_request + DROP COLUMN summary; diff --git a/resources/sql/autopatches/20141001.schema.01.version.sql b/resources/sql/autopatches/20141001.schema.01.version.sql new file mode 100644 index 0000000000..2eef5f1f4d --- /dev/null +++ b/resources/sql/autopatches/20141001.schema.01.version.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS {$NAMESPACE}_meta_data.schema_version; diff --git a/resources/sql/autopatches/20141001.schema.02.taskmail.sql b/resources/sql/autopatches/20141001.schema.02.taskmail.sql new file mode 100644 index 0000000000..84c970ac1c --- /dev/null +++ b/resources/sql/autopatches/20141001.schema.02.taskmail.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_maniphest.maniphest_task + SET mailKey = SUBSTRING(mailKey, 1, 20) WHERE LENGTH(mailKey) > 20; diff --git a/resources/sql/autopatches/20141002.schema.01.liskcounter.sql b/resources/sql/autopatches/20141002.schema.01.liskcounter.sql new file mode 100644 index 0000000000..bf498f0a9d --- /dev/null +++ b/resources/sql/autopatches/20141002.schema.01.liskcounter.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_harbormaster.lisk_counter; diff --git a/resources/sql/autopatches/20141002.schema.02.draftnull.sql b/resources/sql/autopatches/20141002.schema.02.draftnull.sql new file mode 100644 index 0000000000..afd387d09d --- /dev/null +++ b/resources/sql/autopatches/20141002.schema.02.draftnull.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_draft.draft + MODIFY metadata LONGTEXT NOT NULL; diff --git a/resources/sql/autopatches/20141004.currency.01.sql b/resources/sql/autopatches/20141004.currency.01.sql new file mode 100644 index 0000000000..f91672fdad --- /dev/null +++ b/resources/sql/autopatches/20141004.currency.01.sql @@ -0,0 +1,4 @@ +TRUNCATE TABLE {$NAMESPACE}_fund.fund_backer; + +ALTER TABLE {$NAMESPACE}_fund.fund_backer + CHANGE amountInCents amountAsCurrency VARCHAR(64) NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20141004.currency.02.sql b/resources/sql/autopatches/20141004.currency.02.sql new file mode 100644 index 0000000000..90ba461dce --- /dev/null +++ b/resources/sql/autopatches/20141004.currency.02.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_account + DROP balanceInCents; diff --git a/resources/sql/autopatches/20141004.currency.03.sql b/resources/sql/autopatches/20141004.currency.03.sql new file mode 100644 index 0000000000..907e2a12f9 --- /dev/null +++ b/resources/sql/autopatches/20141004.currency.03.sql @@ -0,0 +1,4 @@ +TRUNCATE {$NAMESPACE}_phortune.phortune_charge; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_charge + CHANGE amountInCents amountAsCurrency VARCHAR(64) NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20141004.currency.04.sql b/resources/sql/autopatches/20141004.currency.04.sql new file mode 100644 index 0000000000..4db75c0c39 --- /dev/null +++ b/resources/sql/autopatches/20141004.currency.04.sql @@ -0,0 +1,13 @@ +TRUNCATE {$NAMESPACE}_phortune.phortune_product; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_product + DROP status; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_product + DROP billingIntervalInMonths; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_product + DROP trialPeriodInDays; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_product + CHANGE priceInCents priceAsCurrency VARCHAR(64) NOT NULL collate utf8_bin; diff --git a/resources/sql/autopatches/20141004.currency.05.sql b/resources/sql/autopatches/20141004.currency.05.sql new file mode 100644 index 0000000000..71f0338b3a --- /dev/null +++ b/resources/sql/autopatches/20141004.currency.05.sql @@ -0,0 +1,8 @@ +TRUNCATE {$NAMESPACE}_phortune.phortune_purchase; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_purchase + DROP totalPriceInCents; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_purchase + CHANGE basePriceInCents basePriceAsCurrency VARCHAR(64) + NOT NULL collate utf8_bin; diff --git a/resources/sql/autopatches/20141004.currency.06.sql b/resources/sql/autopatches/20141004.currency.06.sql new file mode 100644 index 0000000000..f214e38589 --- /dev/null +++ b/resources/sql/autopatches/20141004.currency.06.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_product + DROP productType; diff --git a/resources/sql/autopatches/20141004.harborliskcounter.sql b/resources/sql/autopatches/20141004.harborliskcounter.sql new file mode 100644 index 0000000000..6441feee56 --- /dev/null +++ b/resources/sql/autopatches/20141004.harborliskcounter.sql @@ -0,0 +1,4 @@ +CREATE TABLE `{$NAMESPACE}_harbormaster`.`lisk_counter` ( + counterName VARCHAR(64) COLLATE utf8_bin PRIMARY KEY, + counterValue BIGINT UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/resources/sql/autopatches/20141005.phortuneproduct.sql b/resources/sql/autopatches/20141005.phortuneproduct.sql new file mode 100644 index 0000000000..ac7aaa87f0 --- /dev/null +++ b/resources/sql/autopatches/20141005.phortuneproduct.sql @@ -0,0 +1,22 @@ +DROP TABLE {$NAMESPACE}_phortune.phortune_producttransaction; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_product + DROP productName; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_product + DROP priceAsCurrency; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_product + ADD productClassKey BINARY(12) NOT NULL; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_product + ADD productClass VARCHAR(128) NOT NULL COLLATE utf8_bin; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_product + ADD productRefKey BINARY(12) NOT NULL; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_product + ADD productRef VARCHAR(128) NOT NULL COLLATE utf8_bin; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_product + ADD UNIQUE KEY `key_product` (productClassKey, productRefKey); diff --git a/resources/sql/autopatches/20141006.phortunecart.sql b/resources/sql/autopatches/20141006.phortunecart.sql new file mode 100644 index 0000000000..faf04dd9e2 --- /dev/null +++ b/resources/sql/autopatches/20141006.phortunecart.sql @@ -0,0 +1,4 @@ +TRUNCATE TABLE {$NAMESPACE}_phortune.phortune_cart; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_cart + ADD cartClass VARCHAR(128) NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20141006.phortunemerchant.sql b/resources/sql/autopatches/20141006.phortunemerchant.sql new file mode 100644 index 0000000000..8f59688f75 --- /dev/null +++ b/resources/sql/autopatches/20141006.phortunemerchant.sql @@ -0,0 +1,10 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_merchant ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + name VARCHAR(255) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE=utf8_bin; diff --git a/resources/sql/autopatches/20141006.phortunemerchantx.sql b/resources/sql/autopatches/20141006.phortunemerchantx.sql new file mode 100644 index 0000000000..2129af3dfe --- /dev/null +++ b/resources/sql/autopatches/20141006.phortunemerchantx.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_merchanttransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) COLLATE utf8_bin NOT NULL, + authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL, + oldValue LONGTEXT COLLATE utf8_bin NOT NULL, + newValue LONGTEXT COLLATE utf8_bin NOT NULL, + contentSource LONGTEXT COLLATE utf8_bin NOT NULL, + metadata LONGTEXT COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20141007.fundmerchant.sql b/resources/sql/autopatches/20141007.fundmerchant.sql new file mode 100644 index 0000000000..f75afec46f --- /dev/null +++ b/resources/sql/autopatches/20141007.fundmerchant.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_fund.fund_initiative + ADD merchantPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20141007.fundrisks.sql b/resources/sql/autopatches/20141007.fundrisks.sql new file mode 100644 index 0000000000..3fbbd0816e --- /dev/null +++ b/resources/sql/autopatches/20141007.fundrisks.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_fund.fund_initiative + ADD risks LONGTEXT NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20141007.fundtotal.sql b/resources/sql/autopatches/20141007.fundtotal.sql new file mode 100644 index 0000000000..d9b2d2714c --- /dev/null +++ b/resources/sql/autopatches/20141007.fundtotal.sql @@ -0,0 +1,4 @@ +ALTER TABLE {$NAMESPACE}_fund.fund_initiative + ADD totalAsCurrency VARCHAR(64) NOT NULL COLLATE utf8_bin; + +UPDATE {$NAMESPACE}_fund.fund_initiative SET totalAsCurrency = '0.00 USD'; diff --git a/resources/sql/autopatches/20141007.phortunecartmerchant.sql b/resources/sql/autopatches/20141007.phortunecartmerchant.sql new file mode 100644 index 0000000000..930c31b854 --- /dev/null +++ b/resources/sql/autopatches/20141007.phortunecartmerchant.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_cart + ADD merchantPHID VARBINARY(64) NOT NULL; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_cart + ADD KEY `key_merchant` (merchantPHID); diff --git a/resources/sql/autopatches/20141007.phortunecharge.sql b/resources/sql/autopatches/20141007.phortunecharge.sql new file mode 100644 index 0000000000..a146adc196 --- /dev/null +++ b/resources/sql/autopatches/20141007.phortunecharge.sql @@ -0,0 +1,16 @@ +TRUNCATE TABLE {$NAMESPACE}_phortune.phortune_charge; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_charge + DROP paymentProviderKey; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_charge + ADD merchantPHID VARBINARY(64) NOT NULL; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_charge + ADD providerPHID VARBINARY(64) NOT NULL; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_charge + ADD KEY `key_merchant` (merchantPHID); + +ALTER TABLE {$NAMESPACE}_phortune.phortune_charge + ADD KEY `key_provider` (providerPHID); diff --git a/resources/sql/autopatches/20141007.phortunepayment.sql b/resources/sql/autopatches/20141007.phortunepayment.sql new file mode 100644 index 0000000000..6afb830589 --- /dev/null +++ b/resources/sql/autopatches/20141007.phortunepayment.sql @@ -0,0 +1,16 @@ +TRUNCATE TABLE {$NAMESPACE}_phortune.phortune_paymentmethod; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_paymentmethod + DROP providerType; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_paymentmethod + DROP providerDomain; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_paymentmethod + ADD merchantPHID VARBINARY(64) NOT NULL; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_paymentmethod + ADD providerPHID VARBINARY(64) NOT NULL; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_paymentmethod + ADD KEY `key_merchant` (merchantPHID, accountPHID); diff --git a/resources/sql/autopatches/20141007.phortuneprovider.sql b/resources/sql/autopatches/20141007.phortuneprovider.sql new file mode 100644 index 0000000000..c8f47f7485 --- /dev/null +++ b/resources/sql/autopatches/20141007.phortuneprovider.sql @@ -0,0 +1,12 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_paymentproviderconfig ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + merchantPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + providerClassKey BINARY(12) NOT NULL, + providerClass VARCHAR(128) NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_merchant` (merchantPHID, providerClassKey) +) ENGINE=InnoDB, COLLATE=utf8_bin; diff --git a/resources/sql/autopatches/20141007.phortuneproviderx.sql b/resources/sql/autopatches/20141007.phortuneproviderx.sql new file mode 100644 index 0000000000..0bc1f72896 --- /dev/null +++ b/resources/sql/autopatches/20141007.phortuneproviderx.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_paymentproviderconfigtransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) COLLATE utf8_bin NOT NULL, + authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL, + oldValue LONGTEXT COLLATE utf8_bin NOT NULL, + newValue LONGTEXT COLLATE utf8_bin NOT NULL, + contentSource LONGTEXT COLLATE utf8_bin NOT NULL, + metadata LONGTEXT COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20141008.phortunemerchdesc.sql b/resources/sql/autopatches/20141008.phortunemerchdesc.sql new file mode 100644 index 0000000000..06f5c00843 --- /dev/null +++ b/resources/sql/autopatches/20141008.phortunemerchdesc.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_merchant + ADD description LONGTEXT NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20141008.phortuneprovdis.sql b/resources/sql/autopatches/20141008.phortuneprovdis.sql new file mode 100644 index 0000000000..bf7fef0248 --- /dev/null +++ b/resources/sql/autopatches/20141008.phortuneprovdis.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_paymentproviderconfig + ADD isEnabled BOOL NOT NULL; + +UPDATE {$NAMESPACE}_phortune.phortune_paymentproviderconfig + SET isEnabled = 1; diff --git a/resources/sql/autopatches/20141008.phortunerefund.sql b/resources/sql/autopatches/20141008.phortunerefund.sql new file mode 100644 index 0000000000..225008cf72 --- /dev/null +++ b/resources/sql/autopatches/20141008.phortunerefund.sql @@ -0,0 +1,11 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_charge + ADD amountRefundedAsCurrency VARCHAR(64) NOT NULL COLLATE utf8_bin; + +UPDATE {$NAMESPACE}_phortune.phortune_charge + SET amountRefundedAsCurrency = '0.00 USD'; + +ALTER TABLE {$NAMESPACE}_phortune.phortune_charge + ADD refundingPHID VARBINARY(64); + +ALTER TABLE {$NAMESPACE}_phortune.phortune_charge + ADD refundedChargePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20141010.fundmailkey.sql b/resources/sql/autopatches/20141010.fundmailkey.sql new file mode 100644 index 0000000000..5e6fa8a83e --- /dev/null +++ b/resources/sql/autopatches/20141010.fundmailkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_fund.fund_initiative + ADD mailKey BINARY(20) NOT NULL; diff --git a/resources/sql/autopatches/20141011.phortunemerchedit.sql b/resources/sql/autopatches/20141011.phortunemerchedit.sql new file mode 100644 index 0000000000..ee1efcd20c --- /dev/null +++ b/resources/sql/autopatches/20141011.phortunemerchedit.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_merchant + DROP editPolicy; diff --git a/resources/sql/autopatches/20141012.phortunecartxaction.sql b/resources/sql/autopatches/20141012.phortunecartxaction.sql new file mode 100644 index 0000000000..9789377b37 --- /dev/null +++ b/resources/sql/autopatches/20141012.phortunecartxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_carttransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) COLLATE utf8_bin NOT NULL, + authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL, + oldValue LONGTEXT COLLATE utf8_bin NOT NULL, + newValue LONGTEXT COLLATE utf8_bin NOT NULL, + contentSource LONGTEXT COLLATE utf8_bin NOT NULL, + metadata LONGTEXT COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20141013.phortunecartkey.sql b/resources/sql/autopatches/20141013.phortunecartkey.sql new file mode 100644 index 0000000000..73c2425050 --- /dev/null +++ b/resources/sql/autopatches/20141013.phortunecartkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_cart + ADD mailKey BINARY(20) NOT NULL; diff --git a/resources/sql/autopatches/20141016.almanac.device.sql b/resources/sql/autopatches/20141016.almanac.device.sql new file mode 100644 index 0000000000..d309524fa0 --- /dev/null +++ b/resources/sql/autopatches/20141016.almanac.device.sql @@ -0,0 +1,22 @@ +TRUNCATE TABLE {$NAMESPACE}_almanac.almanac_device; + +ALTER TABLE {$NAMESPACE}_almanac.almanac_device + CHANGE name name VARCHAR(128) NOT NULL COLLATE utf8_bin; + +ALTER TABLE {$NAMESPACE}_almanac.almanac_device + ADD nameIndex BINARY(12) NOT NULL; + +ALTER TABLE {$NAMESPACE}_almanac.almanac_device + ADD mailKey BINARY(20) NOT NULL; + +ALTER TABLE {$NAMESPACE}_almanac.almanac_device + ADD UNIQUE KEY `key_name` (nameIndex); + +ALTER TABLE {$NAMESPACE}_almanac.almanac_device + ADD KEY `key_nametext` (name); + +ALTER TABLE {$NAMESPACE}_almanac.almanac_device + ADD viewPolicy VARBINARY(64) NOT NULL; + +ALTER TABLE {$NAMESPACE}_almanac.almanac_device + ADD editPolicy VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20141016.almanac.dxaction.sql b/resources/sql/autopatches/20141016.almanac.dxaction.sql new file mode 100644 index 0000000000..5600ec6276 --- /dev/null +++ b/resources/sql/autopatches/20141016.almanac.dxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_almanac.almanac_devicetransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) COLLATE utf8_bin NOT NULL, + authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL, + oldValue LONGTEXT COLLATE utf8_bin NOT NULL, + newValue LONGTEXT COLLATE utf8_bin NOT NULL, + contentSource LONGTEXT COLLATE utf8_bin NOT NULL, + metadata LONGTEXT COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20141016.almanac.interface.sql b/resources/sql/autopatches/20141016.almanac.interface.sql new file mode 100644 index 0000000000..a23450e1bd --- /dev/null +++ b/resources/sql/autopatches/20141016.almanac.interface.sql @@ -0,0 +1,13 @@ +CREATE TABLE {$NAMESPACE}_almanac.almanac_interface ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + devicePHID VARBINARY(64) NOT NULL, + networkPHID VARBINARY(64) NOT NULL, + address VARCHAR(128) NOT NULL COLLATE utf8_bin, + port INT UNSIGNED NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_location` (networkPHID, address, port), + KEY `key_device` (devicePHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20141016.almanac.network.sql b/resources/sql/autopatches/20141016.almanac.network.sql new file mode 100644 index 0000000000..d35ab3ea36 --- /dev/null +++ b/resources/sql/autopatches/20141016.almanac.network.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_almanac.almanac_network ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + name VARCHAR(128) NOT NULL COLLATE utf8_bin, + mailKey BINARY(20) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20141016.almanac.nxaction.sql b/resources/sql/autopatches/20141016.almanac.nxaction.sql new file mode 100644 index 0000000000..60a2679cf6 --- /dev/null +++ b/resources/sql/autopatches/20141016.almanac.nxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_almanac.almanac_networktransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) COLLATE utf8_bin NOT NULL, + authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL, + oldValue LONGTEXT COLLATE utf8_bin NOT NULL, + newValue LONGTEXT COLLATE utf8_bin NOT NULL, + contentSource LONGTEXT COLLATE utf8_bin NOT NULL, + metadata LONGTEXT COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20141016.almanac.service.sql b/resources/sql/autopatches/20141016.almanac.service.sql new file mode 100644 index 0000000000..7891dff409 --- /dev/null +++ b/resources/sql/autopatches/20141016.almanac.service.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_almanac.almanac_service ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + name VARCHAR(128) NOT NULL COLLATE utf8_bin, + nameIndex BINARY(12) NOT NULL, + mailKey BINARY(20) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_name` (nameIndex), + KEY `key_nametext` (name) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20141016.almanac.sxaction.sql b/resources/sql/autopatches/20141016.almanac.sxaction.sql new file mode 100644 index 0000000000..ea154f8b86 --- /dev/null +++ b/resources/sql/autopatches/20141016.almanac.sxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_almanac.almanac_servicetransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) COLLATE utf8_bin NOT NULL, + authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL, + oldValue LONGTEXT COLLATE utf8_bin NOT NULL, + newValue LONGTEXT COLLATE utf8_bin NOT NULL, + contentSource LONGTEXT COLLATE utf8_bin NOT NULL, + metadata LONGTEXT COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20141017.almanac.binding.sql b/resources/sql/autopatches/20141017.almanac.binding.sql new file mode 100644 index 0000000000..da02069b43 --- /dev/null +++ b/resources/sql/autopatches/20141017.almanac.binding.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_almanac.almanac_binding ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + servicePHID VARBINARY(64) NOT NULL, + devicePHID VARBINARY(64) NOT NULL, + interfacePHID VARBINARY(64) NOT NULL, + mailKey BINARY(20) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_service` (servicePHID, interfacePHID), + KEY `key_device` (devicePHID), + KEY `key_interface` (interfacePHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20141017.almanac.bxaction.sql b/resources/sql/autopatches/20141017.almanac.bxaction.sql new file mode 100644 index 0000000000..12cd214e4a --- /dev/null +++ b/resources/sql/autopatches/20141017.almanac.bxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_almanac.almanac_bindingtransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) COLLATE utf8_bin NOT NULL, + authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL, + oldValue LONGTEXT COLLATE utf8_bin NOT NULL, + newValue LONGTEXT COLLATE utf8_bin NOT NULL, + contentSource LONGTEXT COLLATE utf8_bin NOT NULL, + metadata LONGTEXT COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20141025.phriction.1.xaction.sql b/resources/sql/autopatches/20141025.phriction.1.xaction.sql new file mode 100644 index 0000000000..c2527cf1bc --- /dev/null +++ b/resources/sql/autopatches/20141025.phriction.1.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_phriction.phriction_transaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) COLLATE utf8_bin NOT NULL, + authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL, + commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL, + oldValue LONGTEXT COLLATE utf8_bin NOT NULL, + newValue LONGTEXT COLLATE utf8_bin NOT NULL, + contentSource LONGTEXT COLLATE utf8_bin NOT NULL, + metadata LONGTEXT COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/autopatches/20141025.phriction.2.xaction.sql b/resources/sql/autopatches/20141025.phriction.2.xaction.sql new file mode 100644 index 0000000000..ddbb4c5da9 --- /dev/null +++ b/resources/sql/autopatches/20141025.phriction.2.xaction.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_phriction.phriction_transaction_comment ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + transactionPHID VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + authorPHID VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + viewPolicy VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + editPolicy VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + contentSource LONGTEXT CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + isDeleted TINYINT(1) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 diff --git a/resources/sql/autopatches/20141025.phriction.mailkey.sql b/resources/sql/autopatches/20141025.phriction.mailkey.sql new file mode 100644 index 0000000000..7f0bd4d1f2 --- /dev/null +++ b/resources/sql/autopatches/20141025.phriction.mailkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_document + ADD mailKey VARCHAR(20) NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/autopatches/20141103.almanac.1.delprop.sql b/resources/sql/autopatches/20141103.almanac.1.delprop.sql new file mode 100644 index 0000000000..55fa77942d --- /dev/null +++ b/resources/sql/autopatches/20141103.almanac.1.delprop.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_almanac.almanac_deviceproperty; diff --git a/resources/sql/autopatches/20141103.almanac.2.addprop.sql b/resources/sql/autopatches/20141103.almanac.2.addprop.sql new file mode 100644 index 0000000000..a7a6ec9272 --- /dev/null +++ b/resources/sql/autopatches/20141103.almanac.2.addprop.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_almanac.almanac_property ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + fieldIndex BINARY(12) NOT NULL, + fieldName VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT}, + fieldValue LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + UNIQUE KEY `objectPHID` (objectPHID, fieldIndex) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20141104.almanac.3.edge.sql b/resources/sql/autopatches/20141104.almanac.3.edge.sql new file mode 100644 index 0000000000..31de2a5e12 --- /dev/null +++ b/resources/sql/autopatches/20141104.almanac.3.edge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_almanac.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_almanac.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20141105.ssh.1.rename.sql b/resources/sql/autopatches/20141105.ssh.1.rename.sql new file mode 100644 index 0000000000..3aaff9e4d7 --- /dev/null +++ b/resources/sql/autopatches/20141105.ssh.1.rename.sql @@ -0,0 +1 @@ +RENAME TABLE {$NAMESPACE}_user.user_sshkey TO {$NAMESPACE}_auth.auth_sshkey; diff --git a/resources/sql/autopatches/20141106.dropold.sql b/resources/sql/autopatches/20141106.dropold.sql new file mode 100644 index 0000000000..7716e90bf3 --- /dev/null +++ b/resources/sql/autopatches/20141106.dropold.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS {$NAMESPACE}_metamta.phid_type; diff --git a/resources/sql/autopatches/20141106.uniqdrafts.php b/resources/sql/autopatches/20141106.uniqdrafts.php new file mode 100644 index 0000000000..85b05f9ced --- /dev/null +++ b/resources/sql/autopatches/20141106.uniqdrafts.php @@ -0,0 +1,3 @@ +establishConnection('w'); + +echo pht('Populating Phriction policies.')."\n"; + +$default_view_policy = PhabricatorPolicies::POLICY_USER; +$default_edit_policy = PhabricatorPolicies::POLICY_USER; + +foreach (new LiskMigrationIterator($table) as $doc) { + $id = $doc->getID(); + + if ($doc->getViewPolicy() && $doc->getEditPolicy()) { + echo pht('Skipping document %d; already has policy set.', $id)."\n"; + continue; + } + + $new_view_policy = $default_view_policy; + $new_edit_policy = $default_edit_policy; + + // If this was previously a magical project wiki page (under projects/, but + // not projects/ itself) we need to apply the project policies. Otherwise, + // apply the default policies. + $slug = $doc->getSlug(); + $slug = PhabricatorSlug::normalize($slug); + $prefix = 'projects/'; + if (($slug != $prefix) && (strncmp($slug, $prefix, strlen($prefix)) === 0)) { + $parts = explode('/', $slug); + + $project_slug = $parts[1]; + $project_slug = PhabricatorSlug::normalizeProjectSlug($project_slug); + + $project_slugs = array($project_slug); + $project = id(new PhabricatorProjectQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withSlugs($project_slugs) + ->executeOne(); + + if ($project) { + $view_policy = nonempty($project->getViewPolicy(), $default_view_policy); + $edit_policy = nonempty($project->getEditPolicy(), $default_edit_policy); + + $new_view_policy = $view_policy; + $new_edit_policy = $edit_policy; + } + } + + echo pht('Migrating document %d to new policy...', $id)."\n"; + + queryfx( + $conn_w, + 'UPDATE %R SET viewPolicy = %s, editPolicy = %s + WHERE id = %d', + $table, + $new_view_policy, + $new_edit_policy, + $id); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20141107.phriction.popkeys.php b/resources/sql/autopatches/20141107.phriction.popkeys.php new file mode 100644 index 0000000000..31629c7fea --- /dev/null +++ b/resources/sql/autopatches/20141107.phriction.popkeys.php @@ -0,0 +1,29 @@ +establishConnection('w'); + +echo pht('Populating Phriction mailkeys.')."\n"; + +foreach (new LiskMigrationIterator($table) as $doc) { + $id = $doc->getID(); + + $key = $doc->getMailKey(); + if ((strlen($key) == 20) && (strpos($key, "\0") === false)) { + // To be valid, keys must have length 20 and not contain any null bytes. + // See T6487. + echo pht('Document has valid mailkey.')."\n"; + continue; + } else { + echo pht('Populating mailkey for document %d...', $id)."\n"; + $mail_key = Filesystem::readRandomCharacters(20); + queryfx( + $conn_w, + 'UPDATE %T SET mailKey = %s WHERE id = %d', + $table->getTableName(), + $mail_key, + $id); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20141107.ssh.1.colname.sql b/resources/sql/autopatches/20141107.ssh.1.colname.sql new file mode 100644 index 0000000000..af34fd7277 --- /dev/null +++ b/resources/sql/autopatches/20141107.ssh.1.colname.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + CHANGE userPHID objectPHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20141107.ssh.2.keyhash.sql b/resources/sql/autopatches/20141107.ssh.2.keyhash.sql new file mode 100644 index 0000000000..71c11edb16 --- /dev/null +++ b/resources/sql/autopatches/20141107.ssh.2.keyhash.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + DROP COLUMN keyHash; diff --git a/resources/sql/autopatches/20141107.ssh.3.keyindex.sql b/resources/sql/autopatches/20141107.ssh.3.keyindex.sql new file mode 100644 index 0000000000..8df02acfe5 --- /dev/null +++ b/resources/sql/autopatches/20141107.ssh.3.keyindex.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + ADD COLUMN keyIndex BINARY(12); diff --git a/resources/sql/autopatches/20141107.ssh.4.keymig.php b/resources/sql/autopatches/20141107.ssh.4.keymig.php new file mode 100644 index 0000000000..f3e2d3f098 --- /dev/null +++ b/resources/sql/autopatches/20141107.ssh.4.keymig.php @@ -0,0 +1,50 @@ +establishConnection('w'); + +echo pht('Updating SSH public key indexes...')."\n"; + +$keys = new LiskMigrationIterator($table); +foreach ($keys as $key) { + $id = $key->getID(); + + echo pht('Updating key %d...', $id)."\n"; + + try { + $hash = $key->toPublicKey()->getHash(); + } catch (Exception $ex) { + echo pht('Key has bad format! Removing key.')."\n"; + queryfx( + $conn_w, + 'DELETE FROM %T WHERE id = %d', + $table->getTableName(), + $id); + continue; + } + + $collision = queryfx_all( + $conn_w, + 'SELECT * FROM %T WHERE keyIndex = %s AND id < %d', + $table->getTableName(), + $hash, + $key->getID()); + if ($collision) { + echo pht('Key is a duplicate! Removing key.')."\n"; + queryfx( + $conn_w, + 'DELETE FROM %T WHERE id = %d', + $table->getTableName(), + $id); + continue; + } + + queryfx( + $conn_w, + 'UPDATE %T SET keyIndex = %s WHERE id = %d', + $table->getTableName(), + $hash, + $key->getID()); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20141107.ssh.5.indexnull.sql b/resources/sql/autopatches/20141107.ssh.5.indexnull.sql new file mode 100644 index 0000000000..c011ecc9fc --- /dev/null +++ b/resources/sql/autopatches/20141107.ssh.5.indexnull.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + CHANGE keyIndex keyIndex BINARY(12) NOT NULL; diff --git a/resources/sql/autopatches/20141107.ssh.6.indexkey.sql b/resources/sql/autopatches/20141107.ssh.6.indexkey.sql new file mode 100644 index 0000000000..967c813beb --- /dev/null +++ b/resources/sql/autopatches/20141107.ssh.6.indexkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + ADD UNIQUE KEY `key_unique` (keyIndex); diff --git a/resources/sql/autopatches/20141107.ssh.7.colnull.sql b/resources/sql/autopatches/20141107.ssh.7.colnull.sql new file mode 100644 index 0000000000..3182c2d9c7 --- /dev/null +++ b/resources/sql/autopatches/20141107.ssh.7.colnull.sql @@ -0,0 +1,23 @@ +UPDATE {$NAMESPACE}_auth.auth_sshkey + SET name = '' WHERE name IS NULL; + +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + CHANGE name name VARCHAR(255) COLLATE {$COLLATE_TEXT} NOT NULL; + +UPDATE {$NAMESPACE}_auth.auth_sshkey + SET keyType = '' WHERE keyType IS NULL; + +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + CHANGE keyType keyType VARCHAR(255) COLLATE {$COLLATE_TEXT} NOT NULL; + +UPDATE {$NAMESPACE}_auth.auth_sshkey + SET keyBody = '' WHERE keyBody IS NULL; + +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + CHANGE keyBody keyBody LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL; + +UPDATE {$NAMESPACE}_auth.auth_sshkey + SET keyComment = '' WHERE keyComment IS NULL; + +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + CHANGE keyComment keyComment VARCHAR(255) COLLATE {$COLLATE_TEXT} NOT NULL; diff --git a/resources/sql/autopatches/20141113.auditdupes.php b/resources/sql/autopatches/20141113.auditdupes.php new file mode 100644 index 0000000000..32a6586ca5 --- /dev/null +++ b/resources/sql/autopatches/20141113.auditdupes.php @@ -0,0 +1,22 @@ +establishConnection('w'); + +echo pht('Removing duplicate Audit requests...')."\n"; +$seen_audit_map = array(); +foreach (new LiskMigrationIterator($table) as $request) { + $commit_phid = $request->getCommitPHID(); + $auditor_phid = $request->getAuditorPHID(); + if (isset($seen_audit_map[$commit_phid][$auditor_phid])) { + $request->delete(); + } + + if (!isset($seen_audit_map[$commit_phid])) { + $seen_audit_map[$commit_phid] = array(); + } + + $seen_audit_map[$commit_phid][$auditor_phid] = 1; +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20141118.diffxaction.sql b/resources/sql/autopatches/20141118.diffxaction.sql new file mode 100644 index 0000000000..4ee0554131 --- /dev/null +++ b/resources/sql/autopatches/20141118.diffxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_differential.differential_difftransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64), + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20141119.commitpedge.sql b/resources/sql/autopatches/20141119.commitpedge.sql new file mode 100644 index 0000000000..bb5c1ec56c --- /dev/null +++ b/resources/sql/autopatches/20141119.commitpedge.sql @@ -0,0 +1,11 @@ +INSERT IGNORE INTO {$NAMESPACE}_repository.edge + (src, type, dst, dateCreated, seq) + SELECT src, 41, dst, dateCreated, seq + FROM {$NAMESPACE}_repository.edge + WHERE type = 15; + +INSERT IGNORE INTO {$NAMESPACE}_project.edge + (src, type, dst, dateCreated, seq) + SELECT src, 42, dst, dateCreated, seq + FROM {$NAMESPACE}_project.edge + WHERE type = 16; diff --git a/resources/sql/autopatches/20141119.differential.diff.policy.sql b/resources/sql/autopatches/20141119.differential.diff.policy.sql new file mode 100644 index 0000000000..b6c19c0dea --- /dev/null +++ b/resources/sql/autopatches/20141119.differential.diff.policy.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_diff + ADD viewPolicy VARBINARY(64) NOT NULL; + +UPDATE {$NAMESPACE}_differential.differential_diff + SET viewPolicy = 'users' WHERE viewPolicy = ''; diff --git a/resources/sql/autopatches/20141119.sshtrust.sql b/resources/sql/autopatches/20141119.sshtrust.sql new file mode 100644 index 0000000000..a75255b1c8 --- /dev/null +++ b/resources/sql/autopatches/20141119.sshtrust.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + ADD isTrusted BOOL NOT NULL; diff --git a/resources/sql/autopatches/20141123.taskpriority.1.sql b/resources/sql/autopatches/20141123.taskpriority.1.sql new file mode 100644 index 0000000000..b7790e711e --- /dev/null +++ b/resources/sql/autopatches/20141123.taskpriority.1.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_worker.worker_activetask + SET priority = 5000 - priority; diff --git a/resources/sql/autopatches/20141123.taskpriority.2.sql b/resources/sql/autopatches/20141123.taskpriority.2.sql new file mode 100644 index 0000000000..91b8979112 --- /dev/null +++ b/resources/sql/autopatches/20141123.taskpriority.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_worker.worker_archivetask + SET priority = 5000 - priority; diff --git a/resources/sql/autopatches/20141210.maniphestsubscribersmig.1.sql b/resources/sql/autopatches/20141210.maniphestsubscribersmig.1.sql new file mode 100644 index 0000000000..ca1fcd467a --- /dev/null +++ b/resources/sql/autopatches/20141210.maniphestsubscribersmig.1.sql @@ -0,0 +1,9 @@ +INSERT IGNORE INTO {$NAMESPACE}_maniphest.edge (src, type, dst) + SELECT taskPHID, 21, subscriberPHID + FROM {$NAMESPACE}_maniphest.maniphest_tasksubscriber + WHERE subscriberPHID != ''; + +INSERT IGNORE INTO {$NAMESPACE}_maniphest.edge (src, type, dst) + SELECT subscriberPHID, 22, taskPHID + FROM {$NAMESPACE}_maniphest.maniphest_tasksubscriber + WHERE subscriberPHID != ''; diff --git a/resources/sql/autopatches/20141210.maniphestsubscribersmig.2.sql b/resources/sql/autopatches/20141210.maniphestsubscribersmig.2.sql new file mode 100644 index 0000000000..d937524951 --- /dev/null +++ b/resources/sql/autopatches/20141210.maniphestsubscribersmig.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + DROP ccPHIDs; diff --git a/resources/sql/autopatches/20141210.reposervice.sql b/resources/sql/autopatches/20141210.reposervice.sql new file mode 100644 index 0000000000..554bc77b89 --- /dev/null +++ b/resources/sql/autopatches/20141210.reposervice.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository + ADD almanacServicePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20141212.conduittoken.sql b/resources/sql/autopatches/20141212.conduittoken.sql new file mode 100644 index 0000000000..d3abda89a6 --- /dev/null +++ b/resources/sql/autopatches/20141212.conduittoken.sql @@ -0,0 +1,12 @@ +CREATE TABLE {$NAMESPACE}_conduit.conduit_token ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + tokenType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + token VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + expires INT UNSIGNED, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_object` (objectPHID, tokenType), + UNIQUE KEY `key_token` (token), + KEY `key_expires` (expires) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20141215.almanacservicetype.sql b/resources/sql/autopatches/20141215.almanacservicetype.sql new file mode 100644 index 0000000000..55624a3018 --- /dev/null +++ b/resources/sql/autopatches/20141215.almanacservicetype.sql @@ -0,0 +1,8 @@ +ALTER TABLE {$NAMESPACE}_almanac.almanac_service + ADD serviceClass VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}; + +ALTER TABLE {$NAMESPACE}_almanac.almanac_service + ADD KEY `key_class` (serviceClass); + +UPDATE {$NAMESPACE}_almanac.almanac_service + SET serviceClass = 'AlmanacCustomServiceType' WHERE serviceClass = ''; diff --git a/resources/sql/autopatches/20141217.almanacdevicelock.sql b/resources/sql/autopatches/20141217.almanacdevicelock.sql new file mode 100644 index 0000000000..1cf00f60b4 --- /dev/null +++ b/resources/sql/autopatches/20141217.almanacdevicelock.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_almanac.almanac_device + ADD isLocked BOOL NOT NULL; diff --git a/resources/sql/autopatches/20141217.almanaclock.sql b/resources/sql/autopatches/20141217.almanaclock.sql new file mode 100644 index 0000000000..2b6c53deaa --- /dev/null +++ b/resources/sql/autopatches/20141217.almanaclock.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_almanac.almanac_service + ADD isLocked BOOL NOT NULL; diff --git a/resources/sql/autopatches/20141218.maniphestcctxn.php b/resources/sql/autopatches/20141218.maniphestcctxn.php new file mode 100644 index 0000000000..4ac3c62101 --- /dev/null +++ b/resources/sql/autopatches/20141218.maniphestcctxn.php @@ -0,0 +1,21 @@ +establishConnection('w'); + +echo pht( + "Converting Maniphest CC transactions to modern ". + "subscriber transactions...\n"); +foreach (new LiskMigrationIterator($table) as $txn) { + // ManiphestTransaction::TYPE_CCS + if ($txn->getTransactionType() == 'ccs') { + queryfx( + $conn_w, + 'UPDATE %T SET transactionType = %s WHERE id = %d', + $table->getTableName(), + PhabricatorTransactions::TYPE_SUBSCRIBERS, + $txn->getID()); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20141222.maniphestprojtxn.php b/resources/sql/autopatches/20141222.maniphestprojtxn.php new file mode 100644 index 0000000000..31aae8b986 --- /dev/null +++ b/resources/sql/autopatches/20141222.maniphestprojtxn.php @@ -0,0 +1,61 @@ +establishConnection('w'); + +echo pht( + "Converting Maniphest project transactions to modern edge transactions...\n"); +$metadata = array( + 'edge:type' => PhabricatorProjectObjectHasProjectEdgeType::EDGECONST, +); +foreach (new LiskMigrationIterator($table) as $txn) { + if ($txn->getTransactionType() != 'projects') { + continue; + } + + $old_value = mig20141222_build_edge_data( + $txn->getOldValue(), + $txn->getObjectPHID()); + + $new_value = mig20141222_build_edge_data( + $txn->getNewValue(), + $txn->getObjectPHID()); + + queryfx( + $conn_w, + 'UPDATE %T SET '. + 'transactionType = %s, oldValue = %s, newValue = %s, metaData = %s '. + 'WHERE id = %d', + $table->getTableName(), + PhabricatorTransactions::TYPE_EDGE, + json_encode($old_value), + json_encode($new_value), + json_encode($metadata), + $txn->getID()); +} + +echo pht('Done.')."\n"; + +function mig20141222_build_edge_data($project_phids, $task_phid) { + $edge_data = array(); + + // See T9464. If we didn't get a proper array value out of the transaction, + // just return an empty value so we can move forward. + if (!is_array($project_phids)) { + return $edge_data; + } + + foreach ($project_phids as $project_phid) { + if (!is_scalar($project_phid)) { + continue; + } + + $edge_data[$project_phid] = array( + 'src' => $task_phid, + 'type' => PhabricatorProjectObjectHasProjectEdgeType::EDGECONST, + 'dst' => $project_phid, + ); + } + + return $edge_data; +} diff --git a/resources/sql/autopatches/20141223.daemonloguser.sql b/resources/sql/autopatches/20141223.daemonloguser.sql new file mode 100644 index 0000000000..ee1f14ad0a --- /dev/null +++ b/resources/sql/autopatches/20141223.daemonloguser.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_daemon.daemon_log + ADD runningAsUser VARCHAR(255) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20141223.daemonobjectphid.sql b/resources/sql/autopatches/20141223.daemonobjectphid.sql new file mode 100644 index 0000000000..6f2856eb55 --- /dev/null +++ b/resources/sql/autopatches/20141223.daemonobjectphid.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_worker.worker_activetask + ADD objectPHID VARBINARY(64); + +ALTER TABLE {$NAMESPACE}_worker.worker_archivetask + ADD objectPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20141230.pasteeditpolicycolumn.sql b/resources/sql/autopatches/20141230.pasteeditpolicycolumn.sql new file mode 100644 index 0000000000..bd8f518e0d --- /dev/null +++ b/resources/sql/autopatches/20141230.pasteeditpolicycolumn.sql @@ -0,0 +1,3 @@ +ALTER TABLE `{$NAMESPACE}_pastebin`.`pastebin_paste` + ADD `editPolicy` VARBINARY(64) NOT NULL + AFTER `viewPolicy`; diff --git a/resources/sql/autopatches/20141230.pasteeditpolicyexisting.sql b/resources/sql/autopatches/20141230.pasteeditpolicyexisting.sql new file mode 100644 index 0000000000..6c731acf9b --- /dev/null +++ b/resources/sql/autopatches/20141230.pasteeditpolicyexisting.sql @@ -0,0 +1,2 @@ +UPDATE `{$NAMESPACE}_pastebin`.`pastebin_paste` SET editPolicy = authorPHID + WHERE editPolicy = ''; diff --git a/resources/sql/autopatches/20150102.policyname.php b/resources/sql/autopatches/20150102.policyname.php new file mode 100644 index 0000000000..cf94b918e7 --- /dev/null +++ b/resources/sql/autopatches/20150102.policyname.php @@ -0,0 +1,38 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $policy) { + $old_rules = $policy->getRules(); + $new_rules = array(); + + foreach ($old_rules as $rule) { + $existing_rule = $rule['rule']; + $rule['rule'] = idx($map, $existing_rule, $existing_rule); + $new_rules[] = $rule; + } + + queryfx( + $conn_w, + 'UPDATE %T SET rules = %s WHERE id = %d', + $table->getTableName(), + json_encode($new_rules), + $policy->getID()); +} diff --git a/resources/sql/autopatches/20150102.tasksubscriber.sql b/resources/sql/autopatches/20150102.tasksubscriber.sql new file mode 100644 index 0000000000..7bbd41f167 --- /dev/null +++ b/resources/sql/autopatches/20150102.tasksubscriber.sql @@ -0,0 +1 @@ +DROP TABLE `{$NAMESPACE}_maniphest`.`maniphest_tasksubscriber`; diff --git a/resources/sql/autopatches/20150105.conpsearch.sql b/resources/sql/autopatches/20150105.conpsearch.sql new file mode 100644 index 0000000000..78c8bcec30 --- /dev/null +++ b/resources/sql/autopatches/20150105.conpsearch.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_conpherence.conpherence_index ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + threadPHID VARBINARY(64) NOT NULL, + transactionPHID VARBINARY(64) NOT NULL, + previousTransactionPHID VARBINARY(64), + corpus longtext + CHARACTER SET {$CHARSET_FULLTEXT} + COLLATE {$COLLATE_FULLTEXT} + NOT NULL, + KEY `key_thread` (threadPHID), + UNIQUE KEY `key_transaction` (transactionPHID), + UNIQUE KEY `key_previous` (previousTransactionPHID), + FULLTEXT KEY `key_corpus` (corpus) +) ENGINE=MyISAM DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150114.oauthserver.client.policy.sql b/resources/sql/autopatches/20150114.oauthserver.client.policy.sql new file mode 100644 index 0000000000..8f46afc5c9 --- /dev/null +++ b/resources/sql/autopatches/20150114.oauthserver.client.policy.sql @@ -0,0 +1,11 @@ +ALTER TABLE {$NAMESPACE}_oauth_server.oauth_server_oauthserverclient + ADD viewPolicy VARBINARY(64) NOT NULL AFTER creatorPHID; + +UPDATE {$NAMESPACE}_oauth_server.oauth_server_oauthserverclient + SET viewPolicy = 'users' WHERE viewPolicy = ''; + +ALTER TABLE {$NAMESPACE}_oauth_server.oauth_server_oauthserverclient + ADD editPolicy VARBINARY(64) NOT NULL AFTER viewPolicy; + +UPDATE {$NAMESPACE}_oauth_server.oauth_server_oauthserverclient + SET editPolicy = creatorPHID WHERE viewPolicy = ''; diff --git a/resources/sql/autopatches/20150115.applicationemails.sql b/resources/sql/autopatches/20150115.applicationemails.sql new file mode 100644 index 0000000000..a39bd16534 --- /dev/null +++ b/resources/sql/autopatches/20150115.applicationemails.sql @@ -0,0 +1,12 @@ +CREATE TABLE {$NAMESPACE}_metamta.metamta_applicationemail ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + applicationPHID VARBINARY(64) NOT NULL, + address VARCHAR(128) NOT NULL COLLATE {$COLLATE_SORT}, + configData LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_application` (applicationPHID), + UNIQUE KEY `key_address` (address), + UNIQUE KEY `key_phid` (phid) +) ENGINE=MyISAM DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150115.trigger.1.sql b/resources/sql/autopatches/20150115.trigger.1.sql new file mode 100644 index 0000000000..e03759f161 --- /dev/null +++ b/resources/sql/autopatches/20150115.trigger.1.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_worker.worker_trigger ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + triggerVersion INT UNSIGNED NOT NULL, + clockClass VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + clockProperties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + actionClass VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + actionProperties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_trigger` (triggerVersion) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150115.trigger.2.sql b/resources/sql/autopatches/20150115.trigger.2.sql new file mode 100644 index 0000000000..164bc9858a --- /dev/null +++ b/resources/sql/autopatches/20150115.trigger.2.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_worker.worker_triggerevent ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + triggerID INT UNSIGNED NOT NULL, + lastEventEpoch INT UNSIGNED, + nextEventEpoch INT UNSIGNED, + UNIQUE KEY `key_trigger` (triggerID), + KEY `key_next` (nextEventEpoch) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150116.maniphestapplicationemails.php b/resources/sql/autopatches/20150116.maniphestapplicationemails.php new file mode 100644 index 0000000000..91430568ca --- /dev/null +++ b/resources/sql/autopatches/20150116.maniphestapplicationemails.php @@ -0,0 +1,20 @@ +setAddress($value) + ->setApplicationPHID($maniphest->getPHID()) + ->save(); + } catch (AphrontDuplicateKeyQueryException $ex) { + // Already migrated? + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20150120.maniphestdefaultauthor.php b/resources/sql/autopatches/20150120.maniphestdefaultauthor.php new file mode 100644 index 0000000000..352dd4cbbd --- /dev/null +++ b/resources/sql/autopatches/20150120.maniphestdefaultauthor.php @@ -0,0 +1,22 @@ +setViewer(PhabricatorUser::getOmnipotentUser()) + ->withApplicationPHIDs(array($maniphest->getPHID())) + ->execute(); + + foreach ($app_emails as $app_email) { + $app_email->setConfigValue($config_key, $value); + $app_email->save(); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20150124.subs.1.sql b/resources/sql/autopatches/20150124.subs.1.sql new file mode 100644 index 0000000000..07d60d5792 --- /dev/null +++ b/resources/sql/autopatches/20150124.subs.1.sql @@ -0,0 +1,20 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_subscription ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + accountPHID VARBINARY(64) NOT NULL, + merchantPHID VARBINARY(64) NOT NULL, + triggerPHID VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + subscriptionClassKey BINARY(12) NOT NULL, + subscriptionClass VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT}, + subscriptionRefKey BINARY(12) NOT NULL, + subscriptionRef VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT}, + status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + metadata LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_subscription` (subscriptionClassKey, subscriptionRefKey), + KEY `key_account` (accountPHID), + KEY `key_merchant` (merchantPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150129.pastefileapplicationemails.php b/resources/sql/autopatches/20150129.pastefileapplicationemails.php new file mode 100644 index 0000000000..80e92fb307 --- /dev/null +++ b/resources/sql/autopatches/20150129.pastefileapplicationemails.php @@ -0,0 +1,40 @@ +setAddress($value_files) + ->setApplicationPHID($files_app->getPHID()) + ->save(); + } catch (AphrontDuplicateKeyQueryException $ex) { + // Already migrated? + } +} + +$value_paste = PhabricatorEnv::getEnvConfigIfExists($key_paste); +$paste_app = new PhabricatorPasteApplication(); + +if ($value_paste) { + try { + PhabricatorMetaMTAApplicationEmail::initializeNewAppEmail( + PhabricatorUser::getOmnipotentUser()) + ->setAddress($value_paste) + ->setApplicationPHID($paste_app->getPHID()) + ->save(); + } catch (AphrontDuplicateKeyQueryException $ex) { + // Already migrated? + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20150130.phortune.1.subphid.sql b/resources/sql/autopatches/20150130.phortune.1.subphid.sql new file mode 100644 index 0000000000..f2eae091da --- /dev/null +++ b/resources/sql/autopatches/20150130.phortune.1.subphid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_cart + ADD subscriptionPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20150130.phortune.2.subkey.sql b/resources/sql/autopatches/20150130.phortune.2.subkey.sql new file mode 100644 index 0000000000..10d0225afc --- /dev/null +++ b/resources/sql/autopatches/20150130.phortune.2.subkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_cart + ADD KEY `key_subscription` (subscriptionPHID); diff --git a/resources/sql/autopatches/20150131.phortune.1.defaultpayment.sql b/resources/sql/autopatches/20150131.phortune.1.defaultpayment.sql new file mode 100644 index 0000000000..aa990fe0b9 --- /dev/null +++ b/resources/sql/autopatches/20150131.phortune.1.defaultpayment.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_subscription + ADD defaultPaymentMethodPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20150205.authprovider.autologin.sql b/resources/sql/autopatches/20150205.authprovider.autologin.sql new file mode 100644 index 0000000000..7fb0bbf255 --- /dev/null +++ b/resources/sql/autopatches/20150205.authprovider.autologin.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_providerconfig + ADD shouldAutoLogin TINYINT(1) NOT NULL DEFAULT '0'; diff --git a/resources/sql/autopatches/20150205.daemonenv.sql b/resources/sql/autopatches/20150205.daemonenv.sql new file mode 100644 index 0000000000..fccf6f0810 --- /dev/null +++ b/resources/sql/autopatches/20150205.daemonenv.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_daemon.daemon_log + ADD envInfo LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150209.invite.sql b/resources/sql/autopatches/20150209.invite.sql new file mode 100644 index 0000000000..edd42440a9 --- /dev/null +++ b/resources/sql/autopatches/20150209.invite.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_user.user_authinvite ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + authorPHID VARBINARY(64) NOT NULL, + emailAddress VARCHAR(128) NOT NULL COLLATE {$COLLATE_SORT}, + verificationHash BINARY(12) NOT NULL, + acceptedByPHID VARBINARY(64), + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_address` (emailAddress), + UNIQUE KEY `key_code` (verificationHash) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150209.oauthclient.trust.sql b/resources/sql/autopatches/20150209.oauthclient.trust.sql new file mode 100644 index 0000000000..5b4b8e4adf --- /dev/null +++ b/resources/sql/autopatches/20150209.oauthclient.trust.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_oauth_server.oauth_server_oauthserverclient + ADD isTrusted TINYINT(1) NOT NULL DEFAULT '0' AFTER creatorPHID; diff --git a/resources/sql/autopatches/20150210.invitephid.sql b/resources/sql/autopatches/20150210.invitephid.sql new file mode 100644 index 0000000000..eaa6bcd4f9 --- /dev/null +++ b/resources/sql/autopatches/20150210.invitephid.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_user.user_authinvite + ADD phid VARBINARY(64) NOT NULL; + +ALTER TABLE {$NAMESPACE}_user.user_authinvite + ADD UNIQUE KEY `key_phid` (phid); diff --git a/resources/sql/autopatches/20150212.legalpad.session.1.sql b/resources/sql/autopatches/20150212.legalpad.session.1.sql new file mode 100644 index 0000000000..7f7c5df79f --- /dev/null +++ b/resources/sql/autopatches/20150212.legalpad.session.1.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_user.phabricator_session + ADD signedLegalpadDocuments BOOL NOT NULL DEFAULT 0; + +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_document + ADD requireSignature BOOL NOT NULL DEFAULT 0; diff --git a/resources/sql/autopatches/20150212.legalpad.session.2.sql b/resources/sql/autopatches/20150212.legalpad.session.2.sql new file mode 100644 index 0000000000..a712c6001a --- /dev/null +++ b/resources/sql/autopatches/20150212.legalpad.session.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_legalpad.legalpad_document + ADD KEY `key_required` (requireSignature, dateModified); diff --git a/resources/sql/autopatches/20150219.scratch.nonmutable.sql b/resources/sql/autopatches/20150219.scratch.nonmutable.sql new file mode 100644 index 0000000000..96dc08a7ce --- /dev/null +++ b/resources/sql/autopatches/20150219.scratch.nonmutable.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_scratchtable + ADD nonmutableData VARCHAR(64) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150223.daemon.1.id.sql b/resources/sql/autopatches/20150223.daemon.1.id.sql new file mode 100644 index 0000000000..cd757cb817 --- /dev/null +++ b/resources/sql/autopatches/20150223.daemon.1.id.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_daemon.daemon_log + ADD daemonID VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150223.daemon.2.idlegacy.sql b/resources/sql/autopatches/20150223.daemon.2.idlegacy.sql new file mode 100644 index 0000000000..34583ad96f --- /dev/null +++ b/resources/sql/autopatches/20150223.daemon.2.idlegacy.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_daemon.daemon_log + SET daemonID = CONCAT('legacy-', id) WHERE daemonID = ''; diff --git a/resources/sql/autopatches/20150223.daemon.3.idkey.sql b/resources/sql/autopatches/20150223.daemon.3.idkey.sql new file mode 100644 index 0000000000..b9ad068291 --- /dev/null +++ b/resources/sql/autopatches/20150223.daemon.3.idkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_daemon.daemon_log + ADD UNIQUE KEY `key_daemonID` (daemonID); diff --git a/resources/sql/autopatches/20150312.filechunk.1.sql b/resources/sql/autopatches/20150312.filechunk.1.sql new file mode 100644 index 0000000000..c191f970d5 --- /dev/null +++ b/resources/sql/autopatches/20150312.filechunk.1.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_file.file_chunk ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + chunkHandle BINARY(12) NOT NULL, + byteStart BIGINT UNSIGNED NOT NULL, + byteEnd BIGINT UNSIGNED NOT NULL, + dataFilePHID VARBINARY(64), + KEY `key_file` (chunkhandle, byteStart, byteEnd), + KEY `key_data` (dataFilePHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150312.filechunk.2.sql b/resources/sql/autopatches/20150312.filechunk.2.sql new file mode 100644 index 0000000000..a6bb5bf8ad --- /dev/null +++ b/resources/sql/autopatches/20150312.filechunk.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_file.file + ADD isPartial BOOL NOT NULL DEFAULT 0; diff --git a/resources/sql/autopatches/20150312.filechunk.3.sql b/resources/sql/autopatches/20150312.filechunk.3.sql new file mode 100644 index 0000000000..82032692f8 --- /dev/null +++ b/resources/sql/autopatches/20150312.filechunk.3.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_file.file + ADD KEY `key_partial` (authorPHID, isPartial); diff --git a/resources/sql/autopatches/20150317.conpherence.isroom.1.sql b/resources/sql/autopatches/20150317.conpherence.isroom.1.sql new file mode 100644 index 0000000000..9cfdb5d0c1 --- /dev/null +++ b/resources/sql/autopatches/20150317.conpherence.isroom.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + ADD isRoom BOOL NOT NULL DEFAULT 0 AFTER title; diff --git a/resources/sql/autopatches/20150317.conpherence.isroom.2.sql b/resources/sql/autopatches/20150317.conpherence.isroom.2.sql new file mode 100644 index 0000000000..e298282813 --- /dev/null +++ b/resources/sql/autopatches/20150317.conpherence.isroom.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + ADD KEY `key_room` (isRoom, dateModified); diff --git a/resources/sql/autopatches/20150317.conpherence.policy.sql b/resources/sql/autopatches/20150317.conpherence.policy.sql new file mode 100644 index 0000000000..a593279a83 --- /dev/null +++ b/resources/sql/autopatches/20150317.conpherence.policy.sql @@ -0,0 +1,17 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + ADD viewPolicy VARBINARY(64) NOT NULL AFTER recentParticipantPHIDs; + +UPDATE {$NAMESPACE}_conpherence.conpherence_thread + SET viewPolicy = 'users' WHERE viewPolicy = ''; + +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + ADD editPolicy VARBINARY(64) NOT NULL AFTER viewPolicy; + +UPDATE {$NAMESPACE}_conpherence.conpherence_thread + SET editPolicy = 'users' WHERE editPolicy = ''; + +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + ADD joinPolicy VARBINARY(64) NOT NULL AFTER editPolicy; + +UPDATE {$NAMESPACE}_conpherence.conpherence_thread + SET joinPolicy = 'users' WHERE joinPolicy = ''; diff --git a/resources/sql/autopatches/20150410.nukeruleedit.sql b/resources/sql/autopatches/20150410.nukeruleedit.sql new file mode 100644 index 0000000000..29302c75b6 --- /dev/null +++ b/resources/sql/autopatches/20150410.nukeruleedit.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_herald.herald_ruleedit; diff --git a/resources/sql/autopatches/20150420.invoice.1.sql b/resources/sql/autopatches/20150420.invoice.1.sql new file mode 100644 index 0000000000..3986b344ad --- /dev/null +++ b/resources/sql/autopatches/20150420.invoice.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_cart + ADD isInvoice BOOL NOT NULL; diff --git a/resources/sql/autopatches/20150420.invoice.2.sql b/resources/sql/autopatches/20150420.invoice.2.sql new file mode 100644 index 0000000000..dfbe39de46 --- /dev/null +++ b/resources/sql/autopatches/20150420.invoice.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_phortune.phortune_cart + SET isInvoice = 1 WHERE subscriptionPHID IS NOT NULL; diff --git a/resources/sql/autopatches/20150425.isclosed.sql b/resources/sql/autopatches/20150425.isclosed.sql new file mode 100644 index 0000000000..3d8586b565 --- /dev/null +++ b/resources/sql/autopatches/20150425.isclosed.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_refcursor + ADD isClosed BOOL NOT NULL; diff --git a/resources/sql/autopatches/20150427.calendar.1.edge.sql b/resources/sql/autopatches/20150427.calendar.1.edge.sql new file mode 100644 index 0000000000..3c608e89db --- /dev/null +++ b/resources/sql/autopatches/20150427.calendar.1.edge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_calendar.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_calendar.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150427.calendar.1.xaction.sql b/resources/sql/autopatches/20150427.calendar.1.xaction.sql new file mode 100644 index 0000000000..0cdcfd0126 --- /dev/null +++ b/resources/sql/autopatches/20150427.calendar.1.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_calendar.calendar_eventtransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150427.calendar.2.xaction.sql b/resources/sql/autopatches/20150427.calendar.2.xaction.sql new file mode 100644 index 0000000000..0497f99d1b --- /dev/null +++ b/resources/sql/autopatches/20150427.calendar.2.xaction.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_calendar.calendar_eventtransaction_comment ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + transactionPHID VARBINARY(64) DEFAULT NULL, + authorPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + isDeleted TINYINT(1) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB COLLATE {$COLLATE_TEXT} diff --git a/resources/sql/autopatches/20150428.calendar.1.iscancelled.sql b/resources/sql/autopatches/20150428.calendar.1.iscancelled.sql new file mode 100644 index 0000000000..8b6d95dd67 --- /dev/null +++ b/resources/sql/autopatches/20150428.calendar.1.iscancelled.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD isCancelled BOOL NOT NULL; diff --git a/resources/sql/autopatches/20150428.calendar.1.name.sql b/resources/sql/autopatches/20150428.calendar.1.name.sql new file mode 100644 index 0000000000..7e5e8da6c9 --- /dev/null +++ b/resources/sql/autopatches/20150428.calendar.1.name.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD name LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL; diff --git a/resources/sql/autopatches/20150429.calendar.1.invitee.sql b/resources/sql/autopatches/20150429.calendar.1.invitee.sql new file mode 100644 index 0000000000..b39294b670 --- /dev/null +++ b/resources/sql/autopatches/20150429.calendar.1.invitee.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_calendar.`calendar_eventinvitee` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, + `eventPHID` varbinary(64) NOT NULL, + `inviteePHID` varbinary(64) NOT NULL, + `inviterPHID` varbinary(64) NOT NULL, + `status` VARCHAR(64) COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + UNIQUE KEY `key_event` (`eventPHID`, `inviteePHID`), + KEY `key_invitee` (`inviteePHID`) +) ENGINE=InnoDB COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150430.calendar.1.policies.sql b/resources/sql/autopatches/20150430.calendar.1.policies.sql new file mode 100644 index 0000000000..aa0bdff261 --- /dev/null +++ b/resources/sql/autopatches/20150430.calendar.1.policies.sql @@ -0,0 +1,11 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD viewPolicy varbinary(64) NOT NULL; + +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD editPolicy varbinary(64) NOT NULL; + +UPDATE {$NAMESPACE}_calendar.calendar_event + SET viewPolicy = 'users' WHERE viewPolicy = ''; + +UPDATE {$NAMESPACE}_calendar.calendar_event + SET editPolicy = userPHID; diff --git a/resources/sql/autopatches/20150430.multimeter.1.sql b/resources/sql/autopatches/20150430.multimeter.1.sql new file mode 100644 index 0000000000..5929d4e31f --- /dev/null +++ b/resources/sql/autopatches/20150430.multimeter.1.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_multimeter.multimeter_event ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + eventType INT UNSIGNED NOT NULL, + eventLabelID INT UNSIGNED NOT NULL, + resourceCost BIGINT NOT NULL, + sampleRate INT UNSIGNED NOT NULL, + eventContextID INT UNSIGNED NOT NULL, + eventHostID INT UNSIGNED NOT NULL, + eventViewerID INT UNSIGNED NOT NULL, + epoch INT UNSIGNED NOT NULL, + requestKey BINARY(12) NOT NULL, + KEY `key_request` (requestKey), + KEY `key_type` (eventType, epoch) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150430.multimeter.2.host.sql b/resources/sql/autopatches/20150430.multimeter.2.host.sql new file mode 100644 index 0000000000..779bde1198 --- /dev/null +++ b/resources/sql/autopatches/20150430.multimeter.2.host.sql @@ -0,0 +1,6 @@ +CREATE TABLE {$NAMESPACE}_multimeter.multimeter_host ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + name LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + nameHash BINARY(12) NOT NULL, + UNIQUE KEY `key_hash` (nameHash) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150430.multimeter.3.viewer.sql b/resources/sql/autopatches/20150430.multimeter.3.viewer.sql new file mode 100644 index 0000000000..5dfa5f18d5 --- /dev/null +++ b/resources/sql/autopatches/20150430.multimeter.3.viewer.sql @@ -0,0 +1,6 @@ +CREATE TABLE {$NAMESPACE}_multimeter.multimeter_viewer ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + name LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + nameHash BINARY(12) NOT NULL, + UNIQUE KEY `key_hash` (nameHash) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150430.multimeter.4.context.sql b/resources/sql/autopatches/20150430.multimeter.4.context.sql new file mode 100644 index 0000000000..8171bbefb3 --- /dev/null +++ b/resources/sql/autopatches/20150430.multimeter.4.context.sql @@ -0,0 +1,6 @@ +CREATE TABLE {$NAMESPACE}_multimeter.multimeter_context ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + name LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + nameHash BINARY(12) NOT NULL, + UNIQUE KEY `key_hash` (nameHash) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150430.multimeter.5.label.sql b/resources/sql/autopatches/20150430.multimeter.5.label.sql new file mode 100644 index 0000000000..c1da143456 --- /dev/null +++ b/resources/sql/autopatches/20150430.multimeter.5.label.sql @@ -0,0 +1,6 @@ +CREATE TABLE {$NAMESPACE}_multimeter.multimeter_label ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + name LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + nameHash BINARY(12) NOT NULL, + UNIQUE KEY `key_hash` (nameHash) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150501.calendar.1.reply.sql b/resources/sql/autopatches/20150501.calendar.1.reply.sql new file mode 100644 index 0000000000..1f0a450758 --- /dev/null +++ b/resources/sql/autopatches/20150501.calendar.1.reply.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD mailKey binary(20) NOT NULL; diff --git a/resources/sql/autopatches/20150501.calendar.2.reply.php b/resources/sql/autopatches/20150501.calendar.2.reply.php new file mode 100644 index 0000000000..2dab8268a6 --- /dev/null +++ b/resources/sql/autopatches/20150501.calendar.2.reply.php @@ -0,0 +1,21 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $event) { + $id = $event->getID(); + + echo pht('Populating event %d...', $id)."\n"; + + queryfx( + $conn_w, + 'UPDATE %T SET mailKey = %s WHERE id = %d', + $table->getTableName(), + Filesystem::readRandomCharacters(20), + $id); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20150501.conpherencepics.sql b/resources/sql/autopatches/20150501.conpherencepics.sql new file mode 100644 index 0000000000..a12464afb8 --- /dev/null +++ b/resources/sql/autopatches/20150501.conpherencepics.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + ADD imagePHIDs LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL AFTER title; + +UPDATE {$NAMESPACE}_conpherence.conpherence_thread + SET imagePHIDS = '[]'; diff --git a/resources/sql/autopatches/20150503.repositorysymbols.1.sql b/resources/sql/autopatches/20150503.repositorysymbols.1.sql new file mode 100644 index 0000000000..8b9799c104 --- /dev/null +++ b/resources/sql/autopatches/20150503.repositorysymbols.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_symbol + ADD repositoryPHID varbinary(64) NOT NULL AFTER arcanistProjectID; diff --git a/resources/sql/autopatches/20150503.repositorysymbols.2.php b/resources/sql/autopatches/20150503.repositorysymbols.2.php new file mode 100644 index 0000000000..35aa0aecec --- /dev/null +++ b/resources/sql/autopatches/20150503.repositorysymbols.2.php @@ -0,0 +1,6 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $event) { + $id = $event->getID(); + + if (strlen($event->getName()) == 0) { + echo pht('Renaming event %d...', $id)."\n"; + $viewer = PhabricatorUser::getOmnipotentUser(); + + // NOTE: This uses PeopleQuery directly, instead of HandleQuery, to avoid + // performing cache fills as a side effect; the caches were added by a + // later patch. See T8209. + $user = id(new PhabricatorPeopleQuery()) + ->setViewer($viewer) + ->withPHIDs(array($event->getHostPHID())) + ->executeOne(); + + if ($user) { + $new_name = $user->getUsername(); + } else { + $new_name = pht('Unnamed Event'); + } + + queryfx( + $conn_w, + 'UPDATE %T SET name = %s WHERE id = %d', + $table->getTableName(), + $new_name, + $id); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20150507.calendar.1.isallday.sql b/resources/sql/autopatches/20150507.calendar.1.isallday.sql new file mode 100644 index 0000000000..172015b1be --- /dev/null +++ b/resources/sql/autopatches/20150507.calendar.1.isallday.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD isAllDay BOOL NOT NULL; diff --git a/resources/sql/autopatches/20150513.user.cache.1.sql b/resources/sql/autopatches/20150513.user.cache.1.sql new file mode 100644 index 0000000000..f6bf6e1e6a --- /dev/null +++ b/resources/sql/autopatches/20150513.user.cache.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user + ADD profileImageCache VARCHAR(255) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150514.calendar.status.sql b/resources/sql/autopatches/20150514.calendar.status.sql new file mode 100644 index 0000000000..984205d99e --- /dev/null +++ b/resources/sql/autopatches/20150514.calendar.status.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + DROP status; diff --git a/resources/sql/autopatches/20150514.phame.blog.xaction.sql b/resources/sql/autopatches/20150514.phame.blog.xaction.sql new file mode 100644 index 0000000000..7d85c98082 --- /dev/null +++ b/resources/sql/autopatches/20150514.phame.blog.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_phame.phame_blogtransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150514.user.cache.2.sql b/resources/sql/autopatches/20150514.user.cache.2.sql new file mode 100644 index 0000000000..fc53324dc3 --- /dev/null +++ b/resources/sql/autopatches/20150514.user.cache.2.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_user.user + ADD availabilityCache VARCHAR(255) COLLATE {$COLLATE_TEXT}; + +ALTER TABLE {$NAMESPACE}_user.user + ADD availabilityCacheTTL INT UNSIGNED; diff --git a/resources/sql/autopatches/20150515.phame.post.xaction.sql b/resources/sql/autopatches/20150515.phame.post.xaction.sql new file mode 100644 index 0000000000..a39bf52fb7 --- /dev/null +++ b/resources/sql/autopatches/20150515.phame.post.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_phame.phame_posttransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150515.project.mailkey.1.sql b/resources/sql/autopatches/20150515.project.mailkey.1.sql new file mode 100644 index 0000000000..277fbdafda --- /dev/null +++ b/resources/sql/autopatches/20150515.project.mailkey.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD mailKey binary(20) NOT NULL; diff --git a/resources/sql/autopatches/20150515.project.mailkey.2.php b/resources/sql/autopatches/20150515.project.mailkey.2.php new file mode 100644 index 0000000000..358c57d96d --- /dev/null +++ b/resources/sql/autopatches/20150515.project.mailkey.2.php @@ -0,0 +1,18 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $project) { + $id = $project->getID(); + + echo pht('Adding mail key for project %d...', $id); + echo "\n"; + + queryfx( + $conn_w, + 'UPDATE %T SET mailKey = %s WHERE id = %d', + $table->getTableName(), + Filesystem::readRandomCharacters(20), + $id); +} diff --git a/resources/sql/autopatches/20150519.calendar.calendaricon.sql b/resources/sql/autopatches/20150519.calendar.calendaricon.sql new file mode 100644 index 0000000000..d91520df0a --- /dev/null +++ b/resources/sql/autopatches/20150519.calendar.calendaricon.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD COLUMN icon VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL; + +UPDATE {$NAMESPACE}_calendar.calendar_event + SET icon = "fa-calendar" WHERE icon = ""; diff --git a/resources/sql/autopatches/20150521.releephrepository.sql b/resources/sql/autopatches/20150521.releephrepository.sql new file mode 100644 index 0000000000..6626cb8730 --- /dev/null +++ b/resources/sql/autopatches/20150521.releephrepository.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_releeph.releeph_project + MODIFY arcanistProjectID int(10) unsigned NULL; diff --git a/resources/sql/autopatches/20150525.diff.hidden.1.sql b/resources/sql/autopatches/20150525.diff.hidden.1.sql new file mode 100644 index 0000000000..d6b3df6440 --- /dev/null +++ b/resources/sql/autopatches/20150525.diff.hidden.1.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_differential.differential_hiddencomment ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + userPHID VARBINARY(64) NOT NULL, + commentID INT UNSIGNED NOT NULL, + UNIQUE KEY `key_user` (userPHID, commentID), + KEY `key_comment` (commentID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150526.owners.mailkey.1.sql b/resources/sql/autopatches/20150526.owners.mailkey.1.sql new file mode 100644 index 0000000000..6e83129ec3 --- /dev/null +++ b/resources/sql/autopatches/20150526.owners.mailkey.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + ADD mailKey binary(20) NOT NULL; diff --git a/resources/sql/autopatches/20150526.owners.mailkey.2.php b/resources/sql/autopatches/20150526.owners.mailkey.2.php new file mode 100644 index 0000000000..c6bb5f8266 --- /dev/null +++ b/resources/sql/autopatches/20150526.owners.mailkey.2.php @@ -0,0 +1,18 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $package) { + $id = $package->getID(); + + echo pht('Adding mail key for package %d...', $id); + echo "\n"; + + queryfx( + $conn_w, + 'UPDATE %T SET mailKey = %s WHERE id = %d', + $table->getTableName(), + Filesystem::readRandomCharacters(20), + $id); +} diff --git a/resources/sql/autopatches/20150526.owners.xaction.sql b/resources/sql/autopatches/20150526.owners.xaction.sql new file mode 100644 index 0000000000..f25b3dfdb6 --- /dev/null +++ b/resources/sql/autopatches/20150526.owners.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_owners.owners_packagetransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150527.calendar.recurringevents.sql b/resources/sql/autopatches/20150527.calendar.recurringevents.sql new file mode 100644 index 0000000000..43fa15177b --- /dev/null +++ b/resources/sql/autopatches/20150527.calendar.recurringevents.sql @@ -0,0 +1,17 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD isRecurring BOOL NOT NULL; + +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD recurrenceFrequency LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL; + +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD recurrenceEndDate INT UNSIGNED; + +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD instanceOfEventPHID varbinary(64); + +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD sequenceIndex INT UNSIGNED; + +UPDATE {$NAMESPACE}_calendar.calendar_event + SET recurrenceFrequency = '[]' WHERE recurrenceFrequency = ''; diff --git a/resources/sql/autopatches/20150601.spaces.1.namespace.sql b/resources/sql/autopatches/20150601.spaces.1.namespace.sql new file mode 100644 index 0000000000..302e5e8277 --- /dev/null +++ b/resources/sql/autopatches/20150601.spaces.1.namespace.sql @@ -0,0 +1,12 @@ +CREATE TABLE {$NAMESPACE}_spaces.spaces_namespace ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + namespaceName VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + isDefaultNamespace BOOL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_default` (isDefaultNamespace) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150601.spaces.2.xaction.sql b/resources/sql/autopatches/20150601.spaces.2.xaction.sql new file mode 100644 index 0000000000..4222593c6b --- /dev/null +++ b/resources/sql/autopatches/20150601.spaces.2.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_spaces.spaces_namespacetransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64), + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + oldValue LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + newValue LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + contentSource LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + metadata LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150602.mlist.1.sql b/resources/sql/autopatches/20150602.mlist.1.sql new file mode 100644 index 0000000000..5479b972a6 --- /dev/null +++ b/resources/sql/autopatches/20150602.mlist.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user + ADD isMailingList BOOL NOT NULL; diff --git a/resources/sql/autopatches/20150602.mlist.2.php b/resources/sql/autopatches/20150602.mlist.2.php new file mode 100644 index 0000000000..26d08e6f89 --- /dev/null +++ b/resources/sql/autopatches/20150602.mlist.2.php @@ -0,0 +1,146 @@ +establishConnection('w'); +$lists = new LiskRawMigrationIterator($conn_w, 'metamta_mailinglist'); + +echo pht('Migrating mailing lists...')."\n"; + +foreach ($lists as $list) { + $name = $list['name']; + $email = $list['email']; + $uri = $list['uri']; + $old_phid = $list['phid']; + + $username = preg_replace('/[^a-zA-Z0-9_-]+/', '-', $name); + $username = preg_replace('/-{2,}/', '-', $username); + $username = trim($username, '-'); + if (!strlen($username)) { + $username = 'mailinglist'; + } + $username .= '-list'; + + $username_okay = false; + for ($suffix = 1; $suffix <= 9; $suffix++) { + if ($suffix == 1) { + $effective_username = $username; + } else { + $effective_username = $username.$suffix; + } + + $collision = id(new PhabricatorPeopleQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withUsernames(array($effective_username)) + ->executeOne(); + if (!$collision) { + $username_okay = true; + break; + } + } + + if (!$username_okay) { + echo pht( + 'Failed to migrate mailing list "%s": unable to generate a unique '. + 'username for it.', + $name)."\n"; + continue; + } + + $username = $effective_username; + if (!PhabricatorUser::validateUsername($username)) { + echo pht( + 'Failed to migrate mailing list "%s": unable to generate a valid '. + 'username for it.', + $name)."\n"; + continue; + } + + $address = id(new PhabricatorUserEmail())->loadOneWhere( + 'address = %s', + $email); + if ($address) { + echo pht( + 'Failed to migrate mailing list "%s": an existing user already '. + 'has the email address "%s".', + $name, + $email)."\n"; + continue; + } + + $user = id(new PhabricatorUser()) + ->setUsername($username) + ->setRealName(pht('Mailing List "%s"', $name)) + ->setIsApproved(1) + ->setIsMailingList(1); + + $email_object = id(new PhabricatorUserEmail()) + ->setAddress($email) + ->setIsVerified(1); + + try { + id(new PhabricatorUserEditor()) + ->setActor($user) + ->createNewUser($user, $email_object); + } catch (Exception $ex) { + echo pht( + 'Failed to migrate mailing list "%s": %s.', + $name, + $ex->getMessage())."\n"; + continue; + } + + $new_phid = $user->getPHID(); + + // NOTE: After the PHID type is removed we can't use any Edge code to + // modify edges. + + $edge_type = PhabricatorSubscribedToObjectEdgeType::EDGECONST; + $edge_inverse = PhabricatorObjectHasSubscriberEdgeType::EDGECONST; + + $map = PhabricatorPHIDType::getAllTypes(); + foreach ($map as $type => $spec) { + try { + $object = $spec->newObject(); + if (!$object) { + continue; + } + $object_conn_w = $object->establishConnection('w'); + queryfx( + $object_conn_w, + 'UPDATE %T SET dst = %s WHERE dst = %s AND type = %s', + PhabricatorEdgeConfig::TABLE_NAME_EDGE, + $new_phid, + $old_phid, + $edge_inverse); + } catch (Exception $ex) { + // Just ignore these; they're mostly tables not existing. + continue; + } + } + + try { + $dst_phids = queryfx_all( + $conn_w, + 'SELECT dst FROM %T WHERE src = %s AND type = %s', + PhabricatorEdgeConfig::TABLE_NAME_EDGE, + $old_phid, + $edge_type); + if ($dst_phids) { + $editor = new PhabricatorEdgeEditor(); + foreach ($dst_phids as $dst_phid) { + $editor->addEdge($new_phid, $edge_type, $dst_phid['dst']); + } + $editor->save(); + } + } catch (Exception $ex) { + echo pht( + 'Unable to migrate some inverse edges for mailing list "%s": %s.', + $name, + $ex->getMessage())."\n"; + continue; + } + + echo pht( + 'Migrated mailing list "%s" to mailing list user "%s".', + $name, + $user->getUsername())."\n"; +} diff --git a/resources/sql/autopatches/20150604.spaces.1.sql b/resources/sql/autopatches/20150604.spaces.1.sql new file mode 100644 index 0000000000..6fdfd66d82 --- /dev/null +++ b/resources/sql/autopatches/20150604.spaces.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_pastebin.pastebin_paste + ADD spacePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20150605.diviner.edges.sql b/resources/sql/autopatches/20150605.diviner.edges.sql new file mode 100644 index 0000000000..b0e1d61705 --- /dev/null +++ b/resources/sql/autopatches/20150605.diviner.edges.sql @@ -0,0 +1,17 @@ +CREATE TABLE {$NAMESPACE}_diviner.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + + PRIMARY KEY (src, type, dst), + KEY src (src, type, dateCreated, seq), + UNIQUE KEY key_dst (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_diviner.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150605.diviner.editPolicy.sql b/resources/sql/autopatches/20150605.diviner.editPolicy.sql new file mode 100644 index 0000000000..8c960a4f07 --- /dev/null +++ b/resources/sql/autopatches/20150605.diviner.editPolicy.sql @@ -0,0 +1,6 @@ +ALTER TABLE {$NAMESPACE}_diviner.diviner_livebook + ADD COLUMN editPolicy VARBINARY(64) NOT NULL AFTER viewPolicy; + +UPDATE {$NAMESPACE}_diviner.diviner_livebook + SET editPolicy = 'admin' + WHERE editPolicy = ''; diff --git a/resources/sql/autopatches/20150605.diviner.xaction.sql b/resources/sql/autopatches/20150605.diviner.xaction.sql new file mode 100644 index 0000000000..33f9b5d313 --- /dev/null +++ b/resources/sql/autopatches/20150605.diviner.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_diviner.diviner_livebooktransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY key_phid (phid), + KEY key_object (objectPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150606.mlist.1.php b/resources/sql/autopatches/20150606.mlist.1.php new file mode 100644 index 0000000000..5ba458b68d --- /dev/null +++ b/resources/sql/autopatches/20150606.mlist.1.php @@ -0,0 +1,152 @@ +establishConnection('r'); + +$rows = queryfx_all( + $conn_r, + 'SELECT phid, email FROM %T', + 'metamta_mailinglist'); +if (!$rows) { + echo pht('No mailing lists to migrate.')."\n"; + return; +} + +$list_map = array(); +foreach ($rows as $row) { + $list_map[phutil_utf8_strtolower($row['email'])] = $row['phid']; +} + +$emails = id(new PhabricatorUserEmail())->loadAllWhere( + 'address IN (%Ls)', + array_keys($list_map)); +if (!$emails) { + echo pht('No mailing lists match addresses.')."\n"; + return; +} + +// Create a map from old mailing list PHIDs to new user PHIDs. +$map = array(); +foreach ($emails as $email) { + $user_phid = $email->getUserPHID(); + if (!$user_phid) { + continue; + } + + $address = $email->getAddress(); + $address = phutil_utf8_strtolower($address); + if (isset($list_map[$address])) { + $map[$list_map[$address]] = $user_phid; + } +} + +if (!$map) { + echo pht('No mailing lists match users.')."\n"; + return; +} + +echo pht('Migrating Herald conditions which use mailing lists..')."\n"; + +$table = new HeraldCondition(); +$conn_w = $table->establishConnection('w'); +foreach (new LiskMigrationIterator($table) as $condition) { + $name = $condition->getFieldName(); + if ($name == 'cc') { + // Okay, we can migrate these. + } else { + // This is not a condition type which has mailing lists in its value, so + // don't try to migrate it. + continue; + } + + $value = $condition->getValue(); + if (!is_array($value)) { + // Only migrate PHID lists. + continue; + } + + foreach ($value as $v) { + if (!is_string($v)) { + // Only migrate PHID lists where all members are PHIDs. + continue 2; + } + } + + $new = array(); + $any_change = false; + foreach ($value as $v) { + if (isset($map[$v])) { + $new[] = $map[$v]; + $any_change = true; + } else { + $new[] = $v; + } + } + + if (!$any_change) { + continue; + } + + $id = $condition->getID(); + + queryfx( + $conn_w, + 'UPDATE %T SET value = %s WHERE id = %d', + $table->getTableName(), + json_encode($new), + $id); + + + echo pht('Updated mailing lists in Herald condition %d.', $id)."\n"; +} + +$table = new HeraldActionRecord(); +$conn_w = $table->establishConnection('w'); +foreach (new LiskMigrationIterator($table) as $action) { + $name = $action->getAction(); + if ($name == 'addcc' || $name == 'remcc') { + // Okay, we can migrate these. + } else { + // This is not an action type which has mailing lists in its targets, so + // don't try to migrate it. + continue; + } + + $value = $action->getTarget(); + if (!is_array($value)) { + // Only migrate PHID lists. + continue; + } + + foreach ($value as $v) { + if (!is_string($v)) { + // Only migrate PHID lists where all members are PHIDs. + continue 2; + } + } + + $new = array(); + $any_change = false; + foreach ($value as $v) { + if (isset($map[$v])) { + $new[] = $map[$v]; + $any_change = true; + } else { + $new[] = $v; + } + } + + if (!$any_change) { + continue; + } + + $id = $action->getID(); + + queryfx( + $conn_w, + 'UPDATE %T SET target = %s WHERE id = %d', + $table->getTableName(), + json_encode($new), + $id); + + echo pht('Updated mailing lists in Herald action %d.', $id)."\n"; +} diff --git a/resources/sql/autopatches/20150609.inline.sql b/resources/sql/autopatches/20150609.inline.sql new file mode 100644 index 0000000000..1c9765ac5f --- /dev/null +++ b/resources/sql/autopatches/20150609.inline.sql @@ -0,0 +1,4 @@ +/* This cleans up some errant transactions, see T8483. */ + +DELETE FROM {$NAMESPACE}_differential.differential_transaction + WHERE transactionType = 'core:inlinestate' AND newValue = 'null'; diff --git a/resources/sql/autopatches/20150609.spaces.1.pholio.sql b/resources/sql/autopatches/20150609.spaces.1.pholio.sql new file mode 100644 index 0000000000..903afb86da --- /dev/null +++ b/resources/sql/autopatches/20150609.spaces.1.pholio.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_pholio.pholio_mock + ADD spacePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20150609.spaces.2.maniphest.sql b/resources/sql/autopatches/20150609.spaces.2.maniphest.sql new file mode 100644 index 0000000000..d46b5e5908 --- /dev/null +++ b/resources/sql/autopatches/20150609.spaces.2.maniphest.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + ADD spacePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20150610.spaces.1.desc.sql b/resources/sql/autopatches/20150610.spaces.1.desc.sql new file mode 100644 index 0000000000..c62cd8aece --- /dev/null +++ b/resources/sql/autopatches/20150610.spaces.1.desc.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_spaces.spaces_namespace + ADD description LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL; diff --git a/resources/sql/autopatches/20150610.spaces.2.edge.sql b/resources/sql/autopatches/20150610.spaces.2.edge.sql new file mode 100644 index 0000000000..bc72ed2225 --- /dev/null +++ b/resources/sql/autopatches/20150610.spaces.2.edge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_spaces.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_spaces.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150610.spaces.3.archive.sql b/resources/sql/autopatches/20150610.spaces.3.archive.sql new file mode 100644 index 0000000000..8dd55959a3 --- /dev/null +++ b/resources/sql/autopatches/20150610.spaces.3.archive.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_spaces.spaces_namespace + ADD isArchived BOOL NOT NULL; diff --git a/resources/sql/autopatches/20150611.spaces.1.mailxaction.sql b/resources/sql/autopatches/20150611.spaces.1.mailxaction.sql new file mode 100644 index 0000000000..fe519f48ab --- /dev/null +++ b/resources/sql/autopatches/20150611.spaces.1.mailxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_metamta.metamta_applicationemailtransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150611.spaces.2.appmail.sql b/resources/sql/autopatches/20150611.spaces.2.appmail.sql new file mode 100644 index 0000000000..c846e4338f --- /dev/null +++ b/resources/sql/autopatches/20150611.spaces.2.appmail.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_metamta.metamta_applicationemail + ADD spacePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20150616.divinerrepository.sql b/resources/sql/autopatches/20150616.divinerrepository.sql new file mode 100644 index 0000000000..8e6875c7d9 --- /dev/null +++ b/resources/sql/autopatches/20150616.divinerrepository.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_diviner.diviner_livebook + ADD COLUMN repositoryPHID VARBINARY(64) AFTER name; + +ALTER TABLE {$NAMESPACE}_diviner.diviner_livesymbol + ADD COLUMN repositoryPHID VARBINARY(64) AFTER bookPHID; diff --git a/resources/sql/autopatches/20150617.harbor.1.lint.sql b/resources/sql/autopatches/20150617.harbor.1.lint.sql new file mode 100644 index 0000000000..ff23386509 --- /dev/null +++ b/resources/sql/autopatches/20150617.harbor.1.lint.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlintmessage ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + buildTargetPHID VARBINARY(64) NOT NULL, + path LONGTEXT NOT NULL, + line INT UNSIGNED, + characterOffset INT UNSIGNED, + code VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + severity VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + name VARCHAR(255) COLLATE {$COLLATE_TEXT} NOT NULL, + properties LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_target` (buildTargetPHID) +) ENGINE=INNODB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150617.harbor.2.unit.sql b/resources/sql/autopatches/20150617.harbor.2.unit.sql new file mode 100644 index 0000000000..3140947652 --- /dev/null +++ b/resources/sql/autopatches/20150617.harbor.2.unit.sql @@ -0,0 +1,13 @@ +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildunitmessage ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + buildTargetPHID VARBINARY(64) NOT NULL, + engine VARCHAR(255) COLLATE {$COLLATE_TEXT} NOT NULL, + namespace VARCHAR(255) COLLATE {$COLLATE_TEXT} NOT NULL, + name VARCHAR(255) COLLATE {$COLLATE_TEXT} NOT NULL, + result VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + duration DOUBLE, + properties LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_target` (buildTargetPHID) +) ENGINE=INNODB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150618.harbor.1.planauto.sql b/resources/sql/autopatches/20150618.harbor.1.planauto.sql new file mode 100644 index 0000000000..915006824c --- /dev/null +++ b/resources/sql/autopatches/20150618.harbor.1.planauto.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildplan + ADD planAutoKey VARCHAR(32) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150618.harbor.2.stepauto.sql b/resources/sql/autopatches/20150618.harbor.2.stepauto.sql new file mode 100644 index 0000000000..6b95c9db3d --- /dev/null +++ b/resources/sql/autopatches/20150618.harbor.2.stepauto.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildstep + ADD stepAutoKey VARCHAR(32) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150618.harbor.3.buildauto.sql b/resources/sql/autopatches/20150618.harbor.3.buildauto.sql new file mode 100644 index 0000000000..660577728f --- /dev/null +++ b/resources/sql/autopatches/20150618.harbor.3.buildauto.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_build + ADD planAutoKey VARCHAR(32) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150619.conpherencerooms.1.sql b/resources/sql/autopatches/20150619.conpherencerooms.1.sql new file mode 100644 index 0000000000..c7c5c56053 --- /dev/null +++ b/resources/sql/autopatches/20150619.conpherencerooms.1.sql @@ -0,0 +1,6 @@ +UPDATE {$NAMESPACE}_conpherence.conpherence_thread + SET + viewPolicy = 'obj.conpherence.members', + editPolicy = 'obj.conpherence.members', + joinPolicy = 'obj.conpherence.members' + WHERE isRoom = 0; diff --git a/resources/sql/autopatches/20150619.conpherencerooms.2.sql b/resources/sql/autopatches/20150619.conpherencerooms.2.sql new file mode 100644 index 0000000000..e6c54a0921 --- /dev/null +++ b/resources/sql/autopatches/20150619.conpherencerooms.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + DROP KEY `key_room`; diff --git a/resources/sql/autopatches/20150619.conpherencerooms.3.sql b/resources/sql/autopatches/20150619.conpherencerooms.3.sql new file mode 100644 index 0000000000..c4fb35b57c --- /dev/null +++ b/resources/sql/autopatches/20150619.conpherencerooms.3.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + DROP COLUMN isRoom; diff --git a/resources/sql/autopatches/20150621.phrase.1.sql b/resources/sql/autopatches/20150621.phrase.1.sql new file mode 100644 index 0000000000..323b2b2208 --- /dev/null +++ b/resources/sql/autopatches/20150621.phrase.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_passphrase.passphrase_credential + ADD authorPHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20150621.phrase.2.sql b/resources/sql/autopatches/20150621.phrase.2.sql new file mode 100644 index 0000000000..06fa7e2bf2 --- /dev/null +++ b/resources/sql/autopatches/20150621.phrase.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_passphrase.passphrase_credential + ADD spacePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20150622.bulk.1.job.sql b/resources/sql/autopatches/20150622.bulk.1.job.sql new file mode 100644 index 0000000000..a0cdb5d678 --- /dev/null +++ b/resources/sql/autopatches/20150622.bulk.1.job.sql @@ -0,0 +1,15 @@ +CREATE TABLE {$NAMESPACE}_worker.worker_bulkjob ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + jobTypeKey VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + status VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + parameters LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + size INT UNSIGNED NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_type` (jobTypeKey), + KEY `key_author` (authorPHID), + KEY `key_status` (status) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150622.bulk.2.task.sql b/resources/sql/autopatches/20150622.bulk.2.task.sql new file mode 100644 index 0000000000..f98c205180 --- /dev/null +++ b/resources/sql/autopatches/20150622.bulk.2.task.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_worker.worker_bulktask ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + bulkJobPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + status VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + data LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + KEY `key_job` (bulkJobPHID, status), + KEY `key_object` (objectPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150622.bulk.3.xaction.sql b/resources/sql/autopatches/20150622.bulk.3.xaction.sql new file mode 100644 index 0000000000..27aa2d5caf --- /dev/null +++ b/resources/sql/autopatches/20150622.bulk.3.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_worker.worker_bulkjobtransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150622.bulk.4.edge.sql b/resources/sql/autopatches/20150622.bulk.4.edge.sql new file mode 100644 index 0000000000..3d81a1bcf6 --- /dev/null +++ b/resources/sql/autopatches/20150622.bulk.4.edge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_worker.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_worker.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150622.metamta.1.phid-col.sql b/resources/sql/autopatches/20150622.metamta.1.phid-col.sql new file mode 100644 index 0000000000..9bdd1a005e --- /dev/null +++ b/resources/sql/autopatches/20150622.metamta.1.phid-col.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_metamta.metamta_mail + ADD phid VARBINARY(64) NOT NULL AFTER id; diff --git a/resources/sql/autopatches/20150622.metamta.2.phid-mig.php b/resources/sql/autopatches/20150622.metamta.2.phid-mig.php new file mode 100644 index 0000000000..35932a701b --- /dev/null +++ b/resources/sql/autopatches/20150622.metamta.2.phid-mig.php @@ -0,0 +1,22 @@ +establishConnection('w'); + +echo pht('Assigning PHIDs to mails...')."\n"; +foreach (new LiskMigrationIterator($table) as $mail) { + $id = $mail->getID(); + + echo pht('Updating mail %d...', $id)."\n"; + if ($mail->getPHID()) { + continue; + } + + queryfx( + $conn_w, + 'UPDATE %T SET phid = %s WHERE id = %d', + $table->getTableName(), + $table->generatePHID(), + $id); +} +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20150622.metamta.3.phid-key.sql b/resources/sql/autopatches/20150622.metamta.3.phid-key.sql new file mode 100644 index 0000000000..dae8d7e604 --- /dev/null +++ b/resources/sql/autopatches/20150622.metamta.3.phid-key.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_metamta.metamta_mail + ADD UNIQUE KEY `key_phid` (phid); diff --git a/resources/sql/autopatches/20150622.metamta.4.actor-phid-col.sql b/resources/sql/autopatches/20150622.metamta.4.actor-phid-col.sql new file mode 100644 index 0000000000..cc0bcb221a --- /dev/null +++ b/resources/sql/autopatches/20150622.metamta.4.actor-phid-col.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_metamta.metamta_mail + ADD actorPHID VARBINARY(64) AFTER phid; diff --git a/resources/sql/autopatches/20150622.metamta.5.actor-phid-mig.php b/resources/sql/autopatches/20150622.metamta.5.actor-phid-mig.php new file mode 100644 index 0000000000..d27e54098f --- /dev/null +++ b/resources/sql/autopatches/20150622.metamta.5.actor-phid-mig.php @@ -0,0 +1,27 @@ +establishConnection('w'); + +echo pht('Assigning actorPHIDs to mails...')."\n"; +foreach (new LiskMigrationIterator($table) as $mail) { + $id = $mail->getID(); + + echo pht('Updating mail %d...', $id)."\n"; + if ($mail->getActorPHID()) { + continue; + } + + $actor_phid = $mail->getFrom(); + if ($actor_phid === null) { + continue; + } + + queryfx( + $conn_w, + 'UPDATE %T SET actorPHID = %s WHERE id = %d', + $table->getTableName(), + $actor_phid, + $id); +} +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20150622.metamta.6.actor-phid-key.sql b/resources/sql/autopatches/20150622.metamta.6.actor-phid-key.sql new file mode 100644 index 0000000000..7b0bb0e867 --- /dev/null +++ b/resources/sql/autopatches/20150622.metamta.6.actor-phid-key.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_metamta.metamta_mail + ADD KEY `key_actorPHID` (actorPHID); diff --git a/resources/sql/autopatches/20150624.spaces.1.repo.sql b/resources/sql/autopatches/20150624.spaces.1.repo.sql new file mode 100644 index 0000000000..dbb1e23206 --- /dev/null +++ b/resources/sql/autopatches/20150624.spaces.1.repo.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository + ADD spacePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20150626.spaces.1.calendar.sql b/resources/sql/autopatches/20150626.spaces.1.calendar.sql new file mode 100644 index 0000000000..0560bc94fc --- /dev/null +++ b/resources/sql/autopatches/20150626.spaces.1.calendar.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD spacePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20150630.herald.1.sql b/resources/sql/autopatches/20150630.herald.1.sql new file mode 100644 index 0000000000..e06532f640 --- /dev/null +++ b/resources/sql/autopatches/20150630.herald.1.sql @@ -0,0 +1,5 @@ +# NOTE: This is a spelling correction. + +UPDATE {$NAMESPACE}_herald.herald_condition + SET fieldName = 'application-email' + WHERE fieldName = 'applicaton-email'; diff --git a/resources/sql/autopatches/20150630.herald.2.sql b/resources/sql/autopatches/20150630.herald.2.sql new file mode 100644 index 0000000000..3c5d6ee628 --- /dev/null +++ b/resources/sql/autopatches/20150630.herald.2.sql @@ -0,0 +1,30 @@ +# This converts old conditions which use common fields like "body" to new +# conditions which use modular rules like "Maniphest Task Description". + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'maniphest.task.title' + WHERE r.contentType = 'HeraldManiphestTaskAdapter' + AND c.fieldName = 'title'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'maniphest.task.description' + WHERE r.contentType = 'HeraldManiphestTaskAdapter' + AND c.fieldName = 'body'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'maniphest.task.author' + WHERE r.contentType = 'HeraldManiphestTaskAdapter' + AND c.fieldName = 'author'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'maniphest.task.assignee' + WHERE r.contentType = 'HeraldManiphestTaskAdapter' + AND c.fieldName = 'assignee'; diff --git a/resources/sql/autopatches/20150701.herald.1.sql b/resources/sql/autopatches/20150701.herald.1.sql new file mode 100644 index 0000000000..61817bb530 --- /dev/null +++ b/resources/sql/autopatches/20150701.herald.1.sql @@ -0,0 +1,20 @@ +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'pholio.mock.name' + WHERE r.contentType = 'HeraldPholioMockAdapter' + AND c.fieldName = 'title'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'pholio.mock.description' + WHERE r.contentType = 'HeraldPholioMockAdapter' + AND c.fieldName = 'body'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'pholio.mock.author' + WHERE r.contentType = 'HeraldPholioMockAdapter' + AND c.fieldName = 'author'; diff --git a/resources/sql/autopatches/20150701.herald.2.sql b/resources/sql/autopatches/20150701.herald.2.sql new file mode 100644 index 0000000000..e65cc2c971 --- /dev/null +++ b/resources/sql/autopatches/20150701.herald.2.sql @@ -0,0 +1,20 @@ +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'phriction.document.title' + WHERE r.contentType = 'PhrictionDocumentHeraldAdapter' + AND c.fieldName = 'title'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'phriction.document.content' + WHERE r.contentType = 'PhrictionDocumentHeraldAdapter' + AND c.fieldName = 'body'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'phriction.document.author' + WHERE r.contentType = 'PhrictionDocumentHeraldAdapter' + AND c.fieldName = 'author'; diff --git a/resources/sql/autopatches/20150702.spaces.1.slowvote.sql b/resources/sql/autopatches/20150702.spaces.1.slowvote.sql new file mode 100644 index 0000000000..54b7f90003 --- /dev/null +++ b/resources/sql/autopatches/20150702.spaces.1.slowvote.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_slowvote.slowvote_poll +ADD spacePHID varbinary(64); diff --git a/resources/sql/autopatches/20150706.herald.1.sql b/resources/sql/autopatches/20150706.herald.1.sql new file mode 100644 index 0000000000..04a402c5c0 --- /dev/null +++ b/resources/sql/autopatches/20150706.herald.1.sql @@ -0,0 +1,133 @@ +UPDATE {$NAMESPACE}_herald.herald_condition + SET fieldName = 'diffusion.commit.autoclose' + WHERE fieldName = 'repository-autoclose-branch'; + +UPDATE {$NAMESPACE}_herald.herald_condition + SET fieldName = 'diffusion.commit.package.audit' + WHERE fieldName = 'need-audit-for-package'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.affected' + WHERE r.contentType = 'commit' + AND c.fieldName = 'diff-file'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.author' + WHERE r.contentType = 'commit' + AND c.fieldName = 'author'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.branches' + WHERE r.contentType = 'commit' + AND c.fieldName = 'branches'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.committer' + WHERE r.contentType = 'commit' + AND c.fieldName = 'committer'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.diff.new' + WHERE r.contentType = 'commit' + AND c.fieldName = 'diff-added-content'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.diff' + WHERE r.contentType = 'commit' + AND c.fieldName = 'diff-content'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.diff.old' + WHERE r.contentType = 'commit' + AND c.fieldName = 'diff-removed-content'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.enormous' + WHERE r.contentType = 'commit' + AND c.fieldName = 'diff-enormous'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.message' + WHERE r.contentType = 'commit' + AND c.fieldName = 'body'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.package' + WHERE r.contentType = 'commit' + AND c.fieldName = 'affected-package'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.package.owners' + WHERE r.contentType = 'commit' + AND c.fieldName = 'affected-package-owner'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.repository' + WHERE r.contentType = 'commit' + AND c.fieldName = 'repository'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.repository.projects' + WHERE r.contentType = 'commit' + AND c.fieldName = 'repository-projects'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.reviewer' + WHERE r.contentType = 'commit' + AND c.fieldName = 'reviewer'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.revision.accepted' + WHERE r.contentType = 'commit' + AND c.fieldName = 'differential-accepted'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.revision' + WHERE r.contentType = 'commit' + AND c.fieldName = 'differential-revision'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.revision.subscribers' + WHERE r.contentType = 'commit' + AND c.fieldName = 'differential-ccs'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.commit.revision.reviewers' + WHERE r.contentType = 'commit' + AND c.fieldName = 'differential-reviewers'; diff --git a/resources/sql/autopatches/20150707.herald.1.sql b/resources/sql/autopatches/20150707.herald.1.sql new file mode 100644 index 0000000000..e8e12129d4 --- /dev/null +++ b/resources/sql/autopatches/20150707.herald.1.sql @@ -0,0 +1,55 @@ +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.diff.affected' + WHERE r.contentType = 'differential.diff' + AND c.fieldName = 'diff-file'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.diff.author' + WHERE r.contentType = 'differential.diff' + AND c.fieldName = 'author'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.diff.author.projects' + WHERE r.contentType = 'differential.diff' + AND c.fieldName = 'authorprojects'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.diff.new' + WHERE r.contentType = 'differential.diff' + AND c.fieldName = 'diff-added-content'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.diff.content' + WHERE r.contentType = 'differential.diff' + AND c.fieldName = 'diff-content'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.diff.old' + WHERE r.contentType = 'differential.diff' + AND c.fieldName = 'diff-removed-content'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.diff.repository' + WHERE r.contentType = 'differential.diff' + AND c.fieldName = 'repository'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.diff.repository.projects' + WHERE r.contentType = 'differential.diff' + AND c.fieldName = 'repository-projects'; diff --git a/resources/sql/autopatches/20150708.arcanistproject.sql b/resources/sql/autopatches/20150708.arcanistproject.sql new file mode 100644 index 0000000000..0dc4e5420f --- /dev/null +++ b/resources/sql/autopatches/20150708.arcanistproject.sql @@ -0,0 +1,10 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_diff + DROP COLUMN arcanistProjectPHID; + +ALTER TABLE {$NAMESPACE}_differential.differential_revision + DROP COLUMN arcanistProjectPHID; + +ALTER TABLE {$NAMESPACE}_releeph.releeph_project + DROP COLUMN arcanistProjectID; + +DROP TABLE {$NAMESPACE}_repository.repository_arcanistproject; diff --git a/resources/sql/autopatches/20150708.herald.1.sql b/resources/sql/autopatches/20150708.herald.1.sql new file mode 100644 index 0000000000..678fad4690 --- /dev/null +++ b/resources/sql/autopatches/20150708.herald.1.sql @@ -0,0 +1,90 @@ +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.diff.affected' + WHERE r.contentType = 'differential' + AND c.fieldName = 'diff-file'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.author' + WHERE r.contentType = 'differential' + AND c.fieldName = 'author'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.author.projects' + WHERE r.contentType = 'differential' + AND c.fieldName = 'authorprojects'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.diff.new' + WHERE r.contentType = 'differential' + AND c.fieldName = 'diff-added-content'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.diff.content' + WHERE r.contentType = 'differential' + AND c.fieldName = 'diff-content'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.diff.old' + WHERE r.contentType = 'differential' + AND c.fieldName = 'diff-removed-content'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.package' + WHERE r.contentType = 'differential' + AND c.fieldName = 'affected-package'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.repository' + WHERE r.contentType = 'differential' + AND c.fieldName = 'repository'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.repository.projects' + WHERE r.contentType = 'differential' + AND c.fieldName = 'repository-projects'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.reviewers' + WHERE r.contentType = 'differential' + AND c.fieldName = 'reviewers'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.summary' + WHERE r.contentType = 'differential' + AND c.fieldName = 'body'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.title' + WHERE r.contentType = 'differential' + AND c.fieldName = 'title'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'differential.revision.package.owners' + WHERE r.contentType = 'differential' + AND c.fieldName = 'affected-package-owner'; diff --git a/resources/sql/autopatches/20150708.herald.2.sql b/resources/sql/autopatches/20150708.herald.2.sql new file mode 100644 index 0000000000..ad59936728 --- /dev/null +++ b/resources/sql/autopatches/20150708.herald.2.sql @@ -0,0 +1,48 @@ +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.ref.type' + WHERE r.contentType = 'HeraldPreCommitRefAdapter' + AND c.fieldName = 'ref-type'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.ref.name' + WHERE r.contentType = 'HeraldPreCommitRefAdapter' + AND c.fieldName = 'ref-name'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.ref.change' + WHERE r.contentType = 'HeraldPreCommitRefAdapter' + AND c.fieldName = 'ref-change'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.ref.repository' + WHERE r.contentType = 'HeraldPreCommitRefAdapter' + AND c.fieldName = 'repository'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.ref.repository.projects' + WHERE r.contentType = 'HeraldPreCommitRefAdapter' + AND c.fieldName = 'repository-projects'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.ref.pusher' + WHERE r.contentType = 'HeraldPreCommitRefAdapter' + AND c.fieldName = 'pusher'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.ref.pusher.projects' + WHERE r.contentType = 'HeraldPreCommitRefAdapter' + AND c.fieldName = 'pusher-projects'; diff --git a/resources/sql/autopatches/20150708.herald.3.sql b/resources/sql/autopatches/20150708.herald.3.sql new file mode 100644 index 0000000000..2085941a7b --- /dev/null +++ b/resources/sql/autopatches/20150708.herald.3.sql @@ -0,0 +1,146 @@ +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.commit.message' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'body'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.commit.author' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'author'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.commit.author.raw' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'author-raw'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.commit.committer' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'committer'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.commit.committer.raw' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'committer-raw'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.commit.branches' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'branches'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.content.pusher' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'pusher'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.content.pusher.projects' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'pusher-projects'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.content.repository' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'repository'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.content.repository.projects' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'repository-projects'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.content.pusher.is-committer' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'pusher-is-committer'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.content.revision' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'differential-revision'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.content.revision.accepted' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'differential-accepted'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.content.revision.reviewers' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'differential-reviewers'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.content.revision.subscribers' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'differential-ccs'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.content.diff.enormous' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'diff-enormous'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.commit.affected' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'diff-file'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.commit.diff.content' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'diff-content'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.commit.diff.new' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'diff-added-content'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.commit.diff.old' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'diff-removed-content'; + +UPDATE {$NAMESPACE}_herald.herald_condition c + JOIN {$NAMESPACE}_herald.herald_rule r + ON c.ruleID = r.id + SET c.fieldName = 'diffusion.pre.content.merge' + WHERE r.contentType = 'HeraldPreCommitContentAdapter' + AND c.fieldName = 'is-merge-commit'; diff --git a/resources/sql/autopatches/20150712.badges.1.sql b/resources/sql/autopatches/20150712.badges.1.sql new file mode 100644 index 0000000000..f0b70049d9 --- /dev/null +++ b/resources/sql/autopatches/20150712.badges.1.sql @@ -0,0 +1,54 @@ +CREATE TABLE {$NAMESPACE}_badges.badges_badge ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + name VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + flavor VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + description LONGTEXT NOT NULL, + icon VARCHAR(255) NOT NULL, + quality VARCHAR(255) NOT NULL, + status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + creatorPHID varbinary(64) NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_creator` (creatorPHID, dateModified) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_badges.badges_transaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64), + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + oldValue LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + newValue LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + contentSource LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + metadata LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_badges.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_badges.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150714.spaces.countdown.1.sql b/resources/sql/autopatches/20150714.spaces.countdown.1.sql new file mode 100644 index 0000000000..1b07587331 --- /dev/null +++ b/resources/sql/autopatches/20150714.spaces.countdown.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_countdown.countdown +ADD spacePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20150717.herald.1.sql b/resources/sql/autopatches/20150717.herald.1.sql new file mode 100644 index 0000000000..aeb9f80301 --- /dev/null +++ b/resources/sql/autopatches/20150717.herald.1.sql @@ -0,0 +1,2 @@ +RENAME TABLE {$NAMESPACE}_herald.herald_action + TO {$NAMESPACE}_herald.herald_actionrecord; diff --git a/resources/sql/autopatches/20150719.countdown.1.sql b/resources/sql/autopatches/20150719.countdown.1.sql new file mode 100644 index 0000000000..72c039f4c2 --- /dev/null +++ b/resources/sql/autopatches/20150719.countdown.1.sql @@ -0,0 +1,36 @@ +CREATE TABLE {$NAMESPACE}_countdown.countdown_transaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64), + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + oldValue LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + newValue LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + contentSource LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + metadata LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_countdown.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_countdown.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150719.countdown.2.sql b/resources/sql/autopatches/20150719.countdown.2.sql new file mode 100644 index 0000000000..fbf7dfe235 --- /dev/null +++ b/resources/sql/autopatches/20150719.countdown.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_countdown.countdown +ADD editPolicy VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20150719.countdown.3.sql b/resources/sql/autopatches/20150719.countdown.3.sql new file mode 100644 index 0000000000..29c54fe666 --- /dev/null +++ b/resources/sql/autopatches/20150719.countdown.3.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_countdown.countdown + SET editPolicy = authorPHID WHERE editPolicy = ''; diff --git a/resources/sql/autopatches/20150721.phurl.1.url.sql b/resources/sql/autopatches/20150721.phurl.1.url.sql new file mode 100644 index 0000000000..05dcce2d03 --- /dev/null +++ b/resources/sql/autopatches/20150721.phurl.1.url.sql @@ -0,0 +1,10 @@ +CREATE TABLE {$NAMESPACE}_phurl.phurl_url ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + name VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + longURL VARCHAR(2047) NOT NULL COLLATE {$COLLATE_TEXT}, + description VARCHAR(2047) NOT NULL COLLATE {$COLLATE_TEXT}, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + spacePHID varbinary(64) DEFAULT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150721.phurl.2.xaction.sql b/resources/sql/autopatches/20150721.phurl.2.xaction.sql new file mode 100644 index 0000000000..84a4a6f4e8 --- /dev/null +++ b/resources/sql/autopatches/20150721.phurl.2.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_phurl.phurl_urltransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150721.phurl.3.xactioncomment.sql b/resources/sql/autopatches/20150721.phurl.3.xactioncomment.sql new file mode 100644 index 0000000000..f778c9596f --- /dev/null +++ b/resources/sql/autopatches/20150721.phurl.3.xactioncomment.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_phurl.phurl_urltransaction_comment ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + transactionPHID VARBINARY(64) DEFAULT NULL, + authorPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + isDeleted TINYINT(1) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB COLLATE {$COLLATE_TEXT} diff --git a/resources/sql/autopatches/20150721.phurl.4.url.sql b/resources/sql/autopatches/20150721.phurl.4.url.sql new file mode 100644 index 0000000000..6c29fba51a --- /dev/null +++ b/resources/sql/autopatches/20150721.phurl.4.url.sql @@ -0,0 +1,3 @@ +ALTER TABLE {$NAMESPACE}_phurl.phurl_url + ADD dateCreated int unsigned NOT NULL, + ADD dateModified int unsigned NOT NULL; diff --git a/resources/sql/autopatches/20150721.phurl.5.edge.sql b/resources/sql/autopatches/20150721.phurl.5.edge.sql new file mode 100644 index 0000000000..a2636d6a47 --- /dev/null +++ b/resources/sql/autopatches/20150721.phurl.5.edge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_phurl.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_phurl.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150721.phurl.6.alias.sql b/resources/sql/autopatches/20150721.phurl.6.alias.sql new file mode 100644 index 0000000000..1ed7717b50 --- /dev/null +++ b/resources/sql/autopatches/20150721.phurl.6.alias.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phurl.phurl_url + ADD alias VARCHAR(64) COLLATE {$COLLATE_SORT}; diff --git a/resources/sql/autopatches/20150721.phurl.7.authorphid.sql b/resources/sql/autopatches/20150721.phurl.7.authorphid.sql new file mode 100644 index 0000000000..a335f9e398 --- /dev/null +++ b/resources/sql/autopatches/20150721.phurl.7.authorphid.sql @@ -0,0 +1,6 @@ +ALTER TABLE {$NAMESPACE}_phurl.phurl_url + ADD authorPHID VARBINARY(64) NOT NULL; + +ALTER TABLE {$NAMESPACE}_phurl.phurl_url + CHANGE description description LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + CHANGE longURL longURL LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150722.dashboard.1.sql b/resources/sql/autopatches/20150722.dashboard.1.sql new file mode 100644 index 0000000000..1cd135e48c --- /dev/null +++ b/resources/sql/autopatches/20150722.dashboard.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_dashboard.dashboard + ADD status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150722.dashboard.2.sql b/resources/sql/autopatches/20150722.dashboard.2.sql new file mode 100644 index 0000000000..21a9a2ab88 --- /dev/null +++ b/resources/sql/autopatches/20150722.dashboard.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_dashboard.dashboard + SET status = 'open'; diff --git a/resources/sql/autopatches/20150723.countdown.1.sql b/resources/sql/autopatches/20150723.countdown.1.sql new file mode 100644 index 0000000000..d61f4d99d0 --- /dev/null +++ b/resources/sql/autopatches/20150723.countdown.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_countdown.countdown + ADD description LONGTEXT NOT NULL; diff --git a/resources/sql/autopatches/20150724.badges.comments.1.sql b/resources/sql/autopatches/20150724.badges.comments.1.sql new file mode 100644 index 0000000000..1f1579c201 --- /dev/null +++ b/resources/sql/autopatches/20150724.badges.comments.1.sql @@ -0,0 +1,18 @@ +CREATE TABLE {$NAMESPACE}_badges.badges_transaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL, + transactionPHID VARCHAR(64), + authorPHID VARCHAR(64) NOT NULL, + viewPolicy VARCHAR(64) NOT NULL, + editPolicy VARCHAR(64) NOT NULL, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + contentSource LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion) + +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150724.countdown.comments.1.sql b/resources/sql/autopatches/20150724.countdown.comments.1.sql new file mode 100644 index 0000000000..fc385bd184 --- /dev/null +++ b/resources/sql/autopatches/20150724.countdown.comments.1.sql @@ -0,0 +1,18 @@ +CREATE TABLE {$NAMESPACE}_countdown.countdown_transaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL, + transactionPHID VARCHAR(64), + authorPHID VARCHAR(64) NOT NULL, + viewPolicy VARCHAR(64) NOT NULL, + editPolicy VARCHAR(64) NOT NULL, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + contentSource LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion) + +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150725.badges.mailkey.1.sql b/resources/sql/autopatches/20150725.badges.mailkey.1.sql new file mode 100644 index 0000000000..5219a759b3 --- /dev/null +++ b/resources/sql/autopatches/20150725.badges.mailkey.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_badges.badges_badge + ADD mailKey binary(20) NOT NULL; diff --git a/resources/sql/autopatches/20150725.badges.mailkey.2.php b/resources/sql/autopatches/20150725.badges.mailkey.2.php new file mode 100644 index 0000000000..8231492478 --- /dev/null +++ b/resources/sql/autopatches/20150725.badges.mailkey.2.php @@ -0,0 +1,18 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $badge) { + $id = $badge->getID(); + + echo pht('Adding mail key for badge %d...', $id); + echo "\n"; + + queryfx( + $conn_w, + 'UPDATE %T SET mailKey = %s WHERE id = %d', + $table->getTableName(), + Filesystem::readRandomCharacters(20), + $id); +} diff --git a/resources/sql/autopatches/20150725.badges.viewpolicy.3.sql b/resources/sql/autopatches/20150725.badges.viewpolicy.3.sql new file mode 100644 index 0000000000..a5933f4ade --- /dev/null +++ b/resources/sql/autopatches/20150725.badges.viewpolicy.3.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_badges.badges_badge + DROP COLUMN viewPolicy; diff --git a/resources/sql/autopatches/20150725.countdown.mailkey.1.sql b/resources/sql/autopatches/20150725.countdown.mailkey.1.sql new file mode 100644 index 0000000000..c53441e1cb --- /dev/null +++ b/resources/sql/autopatches/20150725.countdown.mailkey.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_countdown.countdown + ADD mailKey binary(20) NOT NULL; diff --git a/resources/sql/autopatches/20150725.countdown.mailkey.2.php b/resources/sql/autopatches/20150725.countdown.mailkey.2.php new file mode 100644 index 0000000000..c07a763942 --- /dev/null +++ b/resources/sql/autopatches/20150725.countdown.mailkey.2.php @@ -0,0 +1,18 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $countdown) { + $id = $countdown->getID(); + + echo pht('Adding mail key for countdown %d...', $id); + echo "\n"; + + queryfx( + $conn_w, + 'UPDATE %T SET mailKey = %s WHERE id = %d', + $table->getTableName(), + Filesystem::readRandomCharacters(20), + $id); +} diff --git a/resources/sql/autopatches/20150725.slowvote.mailkey.1.sql b/resources/sql/autopatches/20150725.slowvote.mailkey.1.sql new file mode 100644 index 0000000000..00591afa56 --- /dev/null +++ b/resources/sql/autopatches/20150725.slowvote.mailkey.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_slowvote.slowvote_poll + ADD mailKey binary(20) NOT NULL; diff --git a/resources/sql/autopatches/20150725.slowvote.mailkey.2.php b/resources/sql/autopatches/20150725.slowvote.mailkey.2.php new file mode 100644 index 0000000000..fa6b2035df --- /dev/null +++ b/resources/sql/autopatches/20150725.slowvote.mailkey.2.php @@ -0,0 +1,18 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $slowvote) { + $id = $slowvote->getID(); + + echo pht('Adding mail key for Slowvote %d...', $id); + echo "\n"; + + queryfx( + $conn_w, + 'UPDATE %T SET mailKey = %s WHERE id = %d', + $table->getTableName(), + Filesystem::readRandomCharacters(20), + $id); +} diff --git a/resources/sql/autopatches/20150727.heraldaction.1.sql b/resources/sql/autopatches/20150727.heraldaction.1.sql new file mode 100644 index 0000000000..f4cbf19504 --- /dev/null +++ b/resources/sql/autopatches/20150727.heraldaction.1.sql @@ -0,0 +1,2 @@ +RENAME TABLE {$NAMESPACE}_herald.herald_actionrecord + TO {$NAMESPACE}_herald.herald_action; diff --git a/resources/sql/autopatches/20150730.herald.1.sql b/resources/sql/autopatches/20150730.herald.1.sql new file mode 100644 index 0000000000..e6e097f82c --- /dev/null +++ b/resources/sql/autopatches/20150730.herald.1.sql @@ -0,0 +1,27 @@ +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'subscribers.add' + WHERE r.ruleType != 'personal' + AND a.action = 'addcc'; + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'subscribers.self.add' + WHERE r.ruleType = 'personal' + AND a.action = 'addcc'; + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'subscribers.remove' + WHERE r.ruleType != 'personal' + AND a.action = 'remcc'; + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'subscribers.self.remove' + WHERE r.ruleType = 'personal' + AND a.action = 'remcc'; diff --git a/resources/sql/autopatches/20150730.herald.2.sql b/resources/sql/autopatches/20150730.herald.2.sql new file mode 100644 index 0000000000..3d0b5a0a05 --- /dev/null +++ b/resources/sql/autopatches/20150730.herald.2.sql @@ -0,0 +1,13 @@ +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'email.other' + WHERE r.ruleType != 'personal' + AND a.action = 'email'; + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'email.self' + WHERE r.ruleType = 'personal' + AND a.action = 'email'; diff --git a/resources/sql/autopatches/20150730.herald.3.sql b/resources/sql/autopatches/20150730.herald.3.sql new file mode 100644 index 0000000000..e9fcbff59b --- /dev/null +++ b/resources/sql/autopatches/20150730.herald.3.sql @@ -0,0 +1,11 @@ +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'projects.add' + WHERE a.action = 'addprojects'; + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'projects.remove' + WHERE a.action = 'removeprojects'; diff --git a/resources/sql/autopatches/20150730.herald.4.sql b/resources/sql/autopatches/20150730.herald.4.sql new file mode 100644 index 0000000000..1f5c35a851 --- /dev/null +++ b/resources/sql/autopatches/20150730.herald.4.sql @@ -0,0 +1,13 @@ +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'maniphest.assign.other' + WHERE r.ruleType != 'personal' + AND a.action = 'assigntask'; + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'maniphest.assign.self' + WHERE r.ruleType = 'personal' + AND a.action = 'assigntask'; diff --git a/resources/sql/autopatches/20150730.herald.5.sql b/resources/sql/autopatches/20150730.herald.5.sql new file mode 100644 index 0000000000..84c9eea3c5 --- /dev/null +++ b/resources/sql/autopatches/20150730.herald.5.sql @@ -0,0 +1,27 @@ +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'differential.reviewers.blocking' + WHERE r.ruleType != 'personal' + AND a.action = 'addreviewers'; + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'differential.reviewers.self.blocking' + WHERE r.ruleType = 'personal' + AND a.action = 'addreviewers'; + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'differential.reviewers.add' + WHERE r.ruleType != 'personal' + AND a.action = 'addblockingreviewers'; + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'differential.reviewers.self.add' + WHERE r.ruleType = 'personal' + AND a.action = 'addblockingreviewers'; diff --git a/resources/sql/autopatches/20150730.herald.6.sql b/resources/sql/autopatches/20150730.herald.6.sql new file mode 100644 index 0000000000..08188c6d4f --- /dev/null +++ b/resources/sql/autopatches/20150730.herald.6.sql @@ -0,0 +1,6 @@ +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'legalpad.require' + WHERE r.ruleType != 'personal' + AND a.action = 'signature'; diff --git a/resources/sql/autopatches/20150730.herald.7.sql b/resources/sql/autopatches/20150730.herald.7.sql new file mode 100644 index 0000000000..403a90ac26 --- /dev/null +++ b/resources/sql/autopatches/20150730.herald.7.sql @@ -0,0 +1,6 @@ +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'harbormaster.build' + WHERE r.ruleType != 'personal' + AND a.action = 'applybuildplans'; diff --git a/resources/sql/autopatches/20150803.herald.1.sql b/resources/sql/autopatches/20150803.herald.1.sql new file mode 100644 index 0000000000..21f462b8c8 --- /dev/null +++ b/resources/sql/autopatches/20150803.herald.1.sql @@ -0,0 +1,13 @@ +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'diffusion.auditors.add' + WHERE r.ruleType != 'personal' + AND a.action = 'audit'; + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'diffusion.auditors.self.add' + WHERE r.ruleType = 'personal' + AND a.action = 'audit'; diff --git a/resources/sql/autopatches/20150803.herald.2.sql b/resources/sql/autopatches/20150803.herald.2.sql new file mode 100644 index 0000000000..4d48bc03b6 --- /dev/null +++ b/resources/sql/autopatches/20150803.herald.2.sql @@ -0,0 +1,13 @@ +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'diffusion.block' + WHERE r.contentType != 'differential.diff' + AND a.action = 'block'; + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'differential.block' + WHERE r.contentType = 'differential.diff' + AND a.action = 'block'; diff --git a/resources/sql/autopatches/20150804.ponder.answer.mailkey.1.sql b/resources/sql/autopatches/20150804.ponder.answer.mailkey.1.sql new file mode 100644 index 0000000000..63ba3494f9 --- /dev/null +++ b/resources/sql/autopatches/20150804.ponder.answer.mailkey.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_ponder.ponder_answer + ADD mailKey binary(20) NOT NULL; diff --git a/resources/sql/autopatches/20150804.ponder.answer.mailkey.2.php b/resources/sql/autopatches/20150804.ponder.answer.mailkey.2.php new file mode 100644 index 0000000000..e643a5dab5 --- /dev/null +++ b/resources/sql/autopatches/20150804.ponder.answer.mailkey.2.php @@ -0,0 +1,18 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $answer) { + $id = $answer->getID(); + + echo pht('Adding mail key for Answer %d...', $id); + echo "\n"; + + queryfx( + $conn_w, + 'UPDATE %T SET mailKey = %s WHERE id = %d', + $table->getTableName(), + Filesystem::readRandomCharacters(20), + $id); +} diff --git a/resources/sql/autopatches/20150804.ponder.question.1.sql b/resources/sql/autopatches/20150804.ponder.question.1.sql new file mode 100644 index 0000000000..8ea3b2c34c --- /dev/null +++ b/resources/sql/autopatches/20150804.ponder.question.1.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_ponder.ponder_question + ADD editPolicy VARBINARY(64) NOT NULL; + +ALTER TABLE {$NAMESPACE}_ponder.ponder_question + ADD viewPolicy VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20150804.ponder.question.2.sql b/resources/sql/autopatches/20150804.ponder.question.2.sql new file mode 100644 index 0000000000..ddca10f753 --- /dev/null +++ b/resources/sql/autopatches/20150804.ponder.question.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_ponder.ponder_question + SET editPolicy = authorPHID WHERE editPolicy = ''; diff --git a/resources/sql/autopatches/20150804.ponder.question.3.sql b/resources/sql/autopatches/20150804.ponder.question.3.sql new file mode 100644 index 0000000000..0a359453ea --- /dev/null +++ b/resources/sql/autopatches/20150804.ponder.question.3.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_ponder.ponder_question + SET viewPolicy = 'users' WHERE viewPolicy = ''; diff --git a/resources/sql/autopatches/20150804.ponder.spaces.4.sql b/resources/sql/autopatches/20150804.ponder.spaces.4.sql new file mode 100644 index 0000000000..4282b8a509 --- /dev/null +++ b/resources/sql/autopatches/20150804.ponder.spaces.4.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_ponder.ponder_question + ADD spacePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20150805.paste.status.1.sql b/resources/sql/autopatches/20150805.paste.status.1.sql new file mode 100644 index 0000000000..c9b98bf58c --- /dev/null +++ b/resources/sql/autopatches/20150805.paste.status.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_pastebin.pastebin_paste + ADD status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150805.paste.status.2.sql b/resources/sql/autopatches/20150805.paste.status.2.sql new file mode 100644 index 0000000000..be2fe2c485 --- /dev/null +++ b/resources/sql/autopatches/20150805.paste.status.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_pastebin.pastebin_paste + SET status = 'active' WHERE status = ''; diff --git a/resources/sql/autopatches/20150806.ponder.answer.1.sql b/resources/sql/autopatches/20150806.ponder.answer.1.sql new file mode 100644 index 0000000000..9c684b4446 --- /dev/null +++ b/resources/sql/autopatches/20150806.ponder.answer.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_ponder.ponder_answer + DROP COLUMN contentSource; diff --git a/resources/sql/autopatches/20150806.ponder.editpolicy.2.sql b/resources/sql/autopatches/20150806.ponder.editpolicy.2.sql new file mode 100644 index 0000000000..954f1b450e --- /dev/null +++ b/resources/sql/autopatches/20150806.ponder.editpolicy.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_ponder.ponder_question + DROP COLUMN editPolicy; diff --git a/resources/sql/autopatches/20150806.ponder.status.1.sql b/resources/sql/autopatches/20150806.ponder.status.1.sql new file mode 100644 index 0000000000..b0307ca2dc --- /dev/null +++ b/resources/sql/autopatches/20150806.ponder.status.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_ponder.ponder_question + MODIFY status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150806.ponder.status.2.sql b/resources/sql/autopatches/20150806.ponder.status.2.sql new file mode 100644 index 0000000000..0827c5b106 --- /dev/null +++ b/resources/sql/autopatches/20150806.ponder.status.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_ponder.ponder_question + SET status = 'open' WHERE status = '0'; diff --git a/resources/sql/autopatches/20150806.ponder.status.3.sql b/resources/sql/autopatches/20150806.ponder.status.3.sql new file mode 100644 index 0000000000..fdd71a5b20 --- /dev/null +++ b/resources/sql/autopatches/20150806.ponder.status.3.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_ponder.ponder_question + SET status = 'resolved' WHERE status = '1'; diff --git a/resources/sql/autopatches/20150808.ponder.vote.1.sql b/resources/sql/autopatches/20150808.ponder.vote.1.sql new file mode 100644 index 0000000000..31ac0f8e96 --- /dev/null +++ b/resources/sql/autopatches/20150808.ponder.vote.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_ponder.ponder_question + DROP COLUMN heat; diff --git a/resources/sql/autopatches/20150808.ponder.vote.2.sql b/resources/sql/autopatches/20150808.ponder.vote.2.sql new file mode 100644 index 0000000000..d31e72885d --- /dev/null +++ b/resources/sql/autopatches/20150808.ponder.vote.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_ponder.ponder_question + DROP COLUMN voteCount; diff --git a/resources/sql/autopatches/20150812.ponder.answer.1.sql b/resources/sql/autopatches/20150812.ponder.answer.1.sql new file mode 100644 index 0000000000..1cad5667b9 --- /dev/null +++ b/resources/sql/autopatches/20150812.ponder.answer.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_ponder.ponder_answer + ADD status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150812.ponder.answer.2.sql b/resources/sql/autopatches/20150812.ponder.answer.2.sql new file mode 100644 index 0000000000..ded0b765d5 --- /dev/null +++ b/resources/sql/autopatches/20150812.ponder.answer.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_ponder.ponder_answer + SET status = 'visible' WHERE status = ''; diff --git a/resources/sql/autopatches/20150814.harbormater.artifact.phid.sql b/resources/sql/autopatches/20150814.harbormater.artifact.phid.sql new file mode 100644 index 0000000000..1f03268ff0 --- /dev/null +++ b/resources/sql/autopatches/20150814.harbormater.artifact.phid.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildartifact + ADD phid VARBINARY(64) NOT NULL AFTER id; + +UPDATE {$NAMESPACE}_harbormaster.harbormaster_buildartifact + SET phid = CONCAT('PHID-HMBA-', id) WHERE phid = ''; diff --git a/resources/sql/autopatches/20150815.owners.status.1.sql b/resources/sql/autopatches/20150815.owners.status.1.sql new file mode 100644 index 0000000000..591e9efeef --- /dev/null +++ b/resources/sql/autopatches/20150815.owners.status.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + ADD status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150815.owners.status.2.sql b/resources/sql/autopatches/20150815.owners.status.2.sql new file mode 100644 index 0000000000..8f8c05af06 --- /dev/null +++ b/resources/sql/autopatches/20150815.owners.status.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_owners.owners_package + SET status = 'active' WHERE status = ''; diff --git a/resources/sql/autopatches/20150823.nuance.queue.1.sql b/resources/sql/autopatches/20150823.nuance.queue.1.sql new file mode 100644 index 0000000000..bb7dbba88b --- /dev/null +++ b/resources/sql/autopatches/20150823.nuance.queue.1.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_nuance.nuance_queueitem; diff --git a/resources/sql/autopatches/20150823.nuance.queue.2.sql b/resources/sql/autopatches/20150823.nuance.queue.2.sql new file mode 100644 index 0000000000..ed906d42fe --- /dev/null +++ b/resources/sql/autopatches/20150823.nuance.queue.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_nuance.nuance_item + ADD queuePHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20150823.nuance.queue.3.sql b/resources/sql/autopatches/20150823.nuance.queue.3.sql new file mode 100644 index 0000000000..deb343a031 --- /dev/null +++ b/resources/sql/autopatches/20150823.nuance.queue.3.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_nuance.nuance_source + ADD defaultQueuePHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20150823.nuance.queue.4.sql b/resources/sql/autopatches/20150823.nuance.queue.4.sql new file mode 100644 index 0000000000..d782b9de98 --- /dev/null +++ b/resources/sql/autopatches/20150823.nuance.queue.4.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_nuance.nuance_item + DROP dateNuanced; diff --git a/resources/sql/autopatches/20150828.ponder.wiki.1.sql b/resources/sql/autopatches/20150828.ponder.wiki.1.sql new file mode 100644 index 0000000000..dbb8334de4 --- /dev/null +++ b/resources/sql/autopatches/20150828.ponder.wiki.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_ponder.ponder_question + ADD answerWiki LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL; diff --git a/resources/sql/autopatches/20150829.ponder.dupe.1.sql b/resources/sql/autopatches/20150829.ponder.dupe.1.sql new file mode 100644 index 0000000000..b5ba7f6538 --- /dev/null +++ b/resources/sql/autopatches/20150829.ponder.dupe.1.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_ponder.ponder_question + SET status = 'invalid' WHERE status = 'duplicate'; diff --git a/resources/sql/autopatches/20150904.herald.1.sql b/resources/sql/autopatches/20150904.herald.1.sql new file mode 100644 index 0000000000..17f945cc30 --- /dev/null +++ b/resources/sql/autopatches/20150904.herald.1.sql @@ -0,0 +1,52 @@ +/* The "20150730.herald.5.sql" patch incorrectly swapped blocking and + non-blocking "Add Reviewer" rules. This swaps back any rules which + were last modified before the patch was applied. */ + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'differential.reviewers.blocking.tmp' + WHERE a.action = 'differential.reviewers.add' + AND r.dateModified <= + (SELECT applied FROM {$NAMESPACE}_meta_data.patch_status + WHERE patch = 'phabricator:20150730.herald.5.sql'); + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'differential.reviewers.add' + WHERE a.action = 'differential.reviewers.blocking' + AND r.dateModified <= + (SELECT applied FROM {$NAMESPACE}_meta_data.patch_status + WHERE patch = 'phabricator:20150730.herald.5.sql'); + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'differential.reviewers.blocking' + WHERE a.action = 'differential.reviewers.blocking.tmp'; + + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'differential.reviewers.self.blocking.tmp' + WHERE a.action = 'differential.reviewers.self.add' + AND r.dateModified <= + (SELECT applied FROM {$NAMESPACE}_meta_data.patch_status + WHERE patch = 'phabricator:20150730.herald.5.sql'); + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'differential.reviewers.self.add' + WHERE a.action = 'differential.reviewers.self.blocking' + AND r.dateModified <= + (SELECT applied FROM {$NAMESPACE}_meta_data.patch_status + WHERE patch = 'phabricator:20150730.herald.5.sql'); + +UPDATE {$NAMESPACE}_herald.herald_action a + JOIN {$NAMESPACE}_herald.herald_rule r + ON a.ruleID = r.id + SET a.action = 'differential.reviewers.self.blocking' + WHERE a.action = 'differential.reviewers.self.blocking.tmp'; diff --git a/resources/sql/autopatches/20150906.mailinglist.sql b/resources/sql/autopatches/20150906.mailinglist.sql new file mode 100644 index 0000000000..4f349eadd4 --- /dev/null +++ b/resources/sql/autopatches/20150906.mailinglist.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_metamta.metamta_mailinglist; diff --git a/resources/sql/autopatches/20150910.owners.custom.1.sql b/resources/sql/autopatches/20150910.owners.custom.1.sql new file mode 100644 index 0000000000..112802a0b8 --- /dev/null +++ b/resources/sql/autopatches/20150910.owners.custom.1.sql @@ -0,0 +1,25 @@ +CREATE TABLE {$NAMESPACE}_owners.owners_customfieldstorage ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + fieldIndex BINARY(12) NOT NULL, + fieldValue LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + UNIQUE KEY (objectPHID, fieldIndex) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_owners.owners_customfieldstringindex ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + indexKey BINARY(12) NOT NULL, + indexValue LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + KEY `key_join` (objectPHID, indexKey, indexValue(64)), + KEY `key_find` (indexKey, indexValue(64)) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_owners.owners_customfieldnumericindex ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + indexKey BINARY(12) NOT NULL, + indexValue BIGINT NOT NULL, + KEY `key_join` (objectPHID, indexKey, indexValue), + KEY `key_find` (indexKey, indexValue) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150916.drydock.slotlocks.1.sql b/resources/sql/autopatches/20150916.drydock.slotlocks.1.sql new file mode 100644 index 0000000000..837566f1bf --- /dev/null +++ b/resources/sql/autopatches/20150916.drydock.slotlocks.1.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_drydock.drydock_slotlock ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ownerPHID VARBINARY(64) NOT NULL, + lockIndex BINARY(12) NOT NULL, + lockKey LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + UNIQUE KEY `key_lock` (lockIndex), + KEY `key_owner` (ownerPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150922.drydock.commands.1.sql b/resources/sql/autopatches/20150922.drydock.commands.1.sql new file mode 100644 index 0000000000..173fe861ac --- /dev/null +++ b/resources/sql/autopatches/20150922.drydock.commands.1.sql @@ -0,0 +1,10 @@ +CREATE TABLE {$NAMESPACE}_drydock.drydock_command ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + authorPHID VARBINARY(64) NOT NULL, + targetPHID VARBINARY(64) NOT NULL, + command VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + isConsumed BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_target` (targetPHID, isConsumed) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20150923.drydock.resourceid.1.sql b/resources/sql/autopatches/20150923.drydock.resourceid.1.sql new file mode 100644 index 0000000000..ad87d64669 --- /dev/null +++ b/resources/sql/autopatches/20150923.drydock.resourceid.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_lease + ADD resourcePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20150923.drydock.resourceid.2.sql b/resources/sql/autopatches/20150923.drydock.resourceid.2.sql new file mode 100644 index 0000000000..22f6d32d47 --- /dev/null +++ b/resources/sql/autopatches/20150923.drydock.resourceid.2.sql @@ -0,0 +1,5 @@ +UPDATE + {$NAMESPACE}_drydock.drydock_lease l, + {$NAMESPACE}_drydock.drydock_resource r + SET l.resourcePHID = r.phid + WHERE l.resourceID = r.id; diff --git a/resources/sql/autopatches/20150923.drydock.resourceid.3.sql b/resources/sql/autopatches/20150923.drydock.resourceid.3.sql new file mode 100644 index 0000000000..f3520fa510 --- /dev/null +++ b/resources/sql/autopatches/20150923.drydock.resourceid.3.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_lease + DROP resourceID; diff --git a/resources/sql/autopatches/20150923.drydock.taskid.1.sql b/resources/sql/autopatches/20150923.drydock.taskid.1.sql new file mode 100644 index 0000000000..cbd6a1dc02 --- /dev/null +++ b/resources/sql/autopatches/20150923.drydock.taskid.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_lease + DROP taskID; diff --git a/resources/sql/autopatches/20150924.drydock.disable.1.sql b/resources/sql/autopatches/20150924.drydock.disable.1.sql new file mode 100644 index 0000000000..6e5dafe5ec --- /dev/null +++ b/resources/sql/autopatches/20150924.drydock.disable.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_blueprint + ADD isDisabled BOOL NOT NULL; diff --git a/resources/sql/autopatches/20150924.drydock.status.1.sql b/resources/sql/autopatches/20150924.drydock.status.1.sql new file mode 100644 index 0000000000..dc8ec2bd22 --- /dev/null +++ b/resources/sql/autopatches/20150924.drydock.status.1.sql @@ -0,0 +1,39 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_lease + CHANGE status status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; + +UPDATE {$NAMESPACE}_drydock.drydock_lease + SET status = 'pending' WHERE status = '0'; + +UPDATE {$NAMESPACE}_drydock.drydock_lease + SET status = 'acquired' WHERE status = '5'; + +UPDATE {$NAMESPACE}_drydock.drydock_lease + SET status = 'active' WHERE status = '1'; + +UPDATE {$NAMESPACE}_drydock.drydock_lease + SET status = 'released' WHERE status = '2'; + +UPDATE {$NAMESPACE}_drydock.drydock_lease + SET status = 'broken' WHERE status = '3'; + +UPDATE {$NAMESPACE}_drydock.drydock_lease + SET status = 'destroyed' WHERE status = '4'; + + +ALTER TABLE {$NAMESPACE}_drydock.drydock_resource + CHANGE status status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; + +UPDATE {$NAMESPACE}_drydock.drydock_resource + SET status = 'pending' WHERE status = '0'; + +UPDATE {$NAMESPACE}_drydock.drydock_resource + SET status = 'active' WHERE status = '1'; + +UPDATE {$NAMESPACE}_drydock.drydock_resource + SET status = 'released' WHERE status = '2'; + +UPDATE {$NAMESPACE}_drydock.drydock_resource + SET status = 'broken' WHERE status = '3'; + +UPDATE {$NAMESPACE}_drydock.drydock_resource + SET status = 'destroyed' WHERE status = '4'; diff --git a/resources/sql/autopatches/20150928.drydock.rexpire.1.sql b/resources/sql/autopatches/20150928.drydock.rexpire.1.sql new file mode 100644 index 0000000000..9321b9c0e1 --- /dev/null +++ b/resources/sql/autopatches/20150928.drydock.rexpire.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_resource + ADD until INT UNSIGNED; diff --git a/resources/sql/autopatches/20150930.drydock.log.1.sql b/resources/sql/autopatches/20150930.drydock.log.1.sql new file mode 100644 index 0000000000..e84859b718 --- /dev/null +++ b/resources/sql/autopatches/20150930.drydock.log.1.sql @@ -0,0 +1,25 @@ +TRUNCATE {$NAMESPACE}_drydock.drydock_log; + +ALTER TABLE {$NAMESPACE}_drydock.drydock_log + DROP resourceID; + +ALTER TABLE {$NAMESPACE}_drydock.drydock_log + DROP leaseID; + +ALTER TABLE {$NAMESPACE}_drydock.drydock_log + DROP message; + +ALTER TABLE {$NAMESPACE}_drydock.drydock_log + ADD blueprintPHID VARBINARY(64); + +ALTER TABLE {$NAMESPACE}_drydock.drydock_log + ADD resourcePHID VARBINARY(64); + +ALTER TABLE {$NAMESPACE}_drydock.drydock_log + ADD leasePHID VARBINARY(64); + +ALTER TABLE {$NAMESPACE}_drydock.drydock_log + ADD type VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}; + +ALTER TABLE {$NAMESPACE}_drydock.drydock_log + ADD data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151001.drydock.rname.1.sql b/resources/sql/autopatches/20151001.drydock.rname.1.sql new file mode 100644 index 0000000000..3dbd66c579 --- /dev/null +++ b/resources/sql/autopatches/20151001.drydock.rname.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_resource + DROP name; diff --git a/resources/sql/autopatches/20151002.dashboard.status.1.sql b/resources/sql/autopatches/20151002.dashboard.status.1.sql new file mode 100644 index 0000000000..09b19ef1d8 --- /dev/null +++ b/resources/sql/autopatches/20151002.dashboard.status.1.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_dashboard.dashboard + SET status = 'active' WHERE status = 'open'; diff --git a/resources/sql/autopatches/20151002.harbormaster.bparam.1.sql b/resources/sql/autopatches/20151002.harbormaster.bparam.1.sql new file mode 100644 index 0000000000..0deb71c503 --- /dev/null +++ b/resources/sql/autopatches/20151002.harbormaster.bparam.1.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_build + ADD buildParameters LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL; + +UPDATE {$NAMESPACE}_harbormaster.harbormaster_build + SET buildParameters = '{}' WHERE buildParameters = ''; diff --git a/resources/sql/autopatches/20151009.drydock.auth.1.sql b/resources/sql/autopatches/20151009.drydock.auth.1.sql new file mode 100644 index 0000000000..8e68977492 --- /dev/null +++ b/resources/sql/autopatches/20151009.drydock.auth.1.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_drydock.drydock_authorization ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + blueprintPHID VARBINARY(64) NOT NULL, + blueprintAuthorizationState VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + objectPHID VARBINARY(64) NOT NULL, + objectAuthorizationState VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_unique` (objectPHID, blueprintPHID), + KEY `key_blueprint` (blueprintPHID, blueprintAuthorizationState), + KEY `key_object` (objectPHID, objectAuthorizationState) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151010.drydock.auth.2.sql b/resources/sql/autopatches/20151010.drydock.auth.2.sql new file mode 100644 index 0000000000..14c98b8b61 --- /dev/null +++ b/resources/sql/autopatches/20151010.drydock.auth.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_lease + ADD authorizingPHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20151013.drydock.op.1.sql b/resources/sql/autopatches/20151013.drydock.op.1.sql new file mode 100644 index 0000000000..e5fed58afd --- /dev/null +++ b/resources/sql/autopatches/20151013.drydock.op.1.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_drydock.drydock_repositoryoperation ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + repositoryPHID VARBINARY(64) NOT NULL, + repositoryTarget LONGBLOB NOT NULL, + operationType VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + operationState VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID), + KEY `key_repository` (repositoryPHID, operationState) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151023.harborpolicy.1.sql b/resources/sql/autopatches/20151023.harborpolicy.1.sql new file mode 100644 index 0000000000..516cd1af00 --- /dev/null +++ b/resources/sql/autopatches/20151023.harborpolicy.1.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildplan + ADD viewPolicy VARBINARY(64) NOT NULL; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildplan + ADD editPolicy VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20151023.harborpolicy.2.php b/resources/sql/autopatches/20151023.harborpolicy.2.php new file mode 100644 index 0000000000..133bcb6ee7 --- /dev/null +++ b/resources/sql/autopatches/20151023.harborpolicy.2.php @@ -0,0 +1,21 @@ +establishConnection('w'); + +$view_policy = PhabricatorPolicies::getMostOpenPolicy(); +queryfx( + $conn_w, + 'UPDATE %T SET viewPolicy = %s WHERE viewPolicy = %s', + $table->getTableName(), + $view_policy, + ''); + +$edit_policy = id(new PhabricatorHarbormasterApplication()) + ->getPolicy(HarbormasterCreatePlansCapability::CAPABILITY); +queryfx( + $conn_w, + 'UPDATE %T SET editPolicy = %s WHERE editPolicy = %s', + $table->getTableName(), + $edit_policy, + ''); diff --git a/resources/sql/autopatches/20151023.patchduration.sql b/resources/sql/autopatches/20151023.patchduration.sql new file mode 100644 index 0000000000..3e0c363931 --- /dev/null +++ b/resources/sql/autopatches/20151023.patchduration.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_meta_data.patch_status + ADD duration BIGINT UNSIGNED; diff --git a/resources/sql/autopatches/20151030.harbormaster.initiator.sql b/resources/sql/autopatches/20151030.harbormaster.initiator.sql new file mode 100644 index 0000000000..f8ba3f6757 --- /dev/null +++ b/resources/sql/autopatches/20151030.harbormaster.initiator.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_build + ADD COLUMN initiatorPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20151106.editengine.1.table.sql b/resources/sql/autopatches/20151106.editengine.1.table.sql new file mode 100644 index 0000000000..bda84d9443 --- /dev/null +++ b/resources/sql/autopatches/20151106.editengine.1.table.sql @@ -0,0 +1,17 @@ +CREATE TABLE {$NAMESPACE}_search.search_editengineconfiguration ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + engineKey VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + builtinKey VARCHAR(64) COLLATE {$COLLATE_TEXT}, + name VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + isDisabled BOOL NOT NULL DEFAULT 0, + isDefault BOOL NOT NULL DEFAULT 0, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_engine` (engineKey, builtinKey), + KEY `key_default` (engineKey, isDefault, isDisabled) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151106.editengine.2.xactions.sql b/resources/sql/autopatches/20151106.editengine.2.xactions.sql new file mode 100644 index 0000000000..36a9d7a769 --- /dev/null +++ b/resources/sql/autopatches/20151106.editengine.2.xactions.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_search.search_editengineconfigurationtransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151106.phame.post.mailkey.1.sql b/resources/sql/autopatches/20151106.phame.post.mailkey.1.sql new file mode 100644 index 0000000000..3e4846d909 --- /dev/null +++ b/resources/sql/autopatches/20151106.phame.post.mailkey.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_post + ADD mailKey binary(20) NOT NULL; diff --git a/resources/sql/autopatches/20151106.phame.post.mailkey.2.php b/resources/sql/autopatches/20151106.phame.post.mailkey.2.php new file mode 100644 index 0000000000..5c9942665d --- /dev/null +++ b/resources/sql/autopatches/20151106.phame.post.mailkey.2.php @@ -0,0 +1,18 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $post) { + $id = $post->getID(); + + echo pht('Adding mail key for Post %d...', $id); + echo "\n"; + + queryfx( + $conn_w, + 'UPDATE %T SET mailKey = %s WHERE id = %d', + $table->getTableName(), + Filesystem::readRandomCharacters(20), + $id); +} diff --git a/resources/sql/autopatches/20151107.phame.blog.mailkey.1.sql b/resources/sql/autopatches/20151107.phame.blog.mailkey.1.sql new file mode 100644 index 0000000000..764f50766c --- /dev/null +++ b/resources/sql/autopatches/20151107.phame.blog.mailkey.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + ADD mailKey binary(20) NOT NULL; diff --git a/resources/sql/autopatches/20151107.phame.blog.mailkey.2.php b/resources/sql/autopatches/20151107.phame.blog.mailkey.2.php new file mode 100644 index 0000000000..c6f316aa47 --- /dev/null +++ b/resources/sql/autopatches/20151107.phame.blog.mailkey.2.php @@ -0,0 +1,18 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $blog) { + $id = $blog->getID(); + + echo pht('Adding mail key for Blog %d...', $id); + echo "\n"; + + queryfx( + $conn_w, + 'UPDATE %T SET mailKey = %s WHERE id = %d', + $table->getTableName(), + Filesystem::readRandomCharacters(20), + $id); +} diff --git a/resources/sql/autopatches/20151108.phame.blog.joinpolicy.sql b/resources/sql/autopatches/20151108.phame.blog.joinpolicy.sql new file mode 100644 index 0000000000..54aea48bbf --- /dev/null +++ b/resources/sql/autopatches/20151108.phame.blog.joinpolicy.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + DROP joinPolicy; diff --git a/resources/sql/autopatches/20151108.xhpast.stderr.sql b/resources/sql/autopatches/20151108.xhpast.stderr.sql new file mode 100644 index 0000000000..1721505658 --- /dev/null +++ b/resources/sql/autopatches/20151108.xhpast.stderr.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_xhpastview.xhpastview_parsetree + ADD returnCode INT NOT NULL AFTER input; + +ALTER TABLE {$NAMESPACE}_xhpastview.xhpastview_parsetree + ADD stderr longtext NOT NULL AFTER stdout; diff --git a/resources/sql/autopatches/20151109.phame.post.comments.1.sql b/resources/sql/autopatches/20151109.phame.post.comments.1.sql new file mode 100644 index 0000000000..8a36a0d3a7 --- /dev/null +++ b/resources/sql/autopatches/20151109.phame.post.comments.1.sql @@ -0,0 +1,18 @@ +CREATE TABLE {$NAMESPACE}_phame.phame_posttransaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL, + transactionPHID VARCHAR(64), + authorPHID VARCHAR(64) NOT NULL, + viewPolicy VARCHAR(64) NOT NULL, + editPolicy VARCHAR(64) NOT NULL, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + contentSource LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion) + +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151109.repository.coverage.1.sql b/resources/sql/autopatches/20151109.repository.coverage.1.sql new file mode 100644 index 0000000000..cebea0177c --- /dev/null +++ b/resources/sql/autopatches/20151109.repository.coverage.1.sql @@ -0,0 +1,8 @@ +USE {$NAMESPACE}_repository; +DELETE x FROM repository_coverage x +LEFT JOIN repository_coverage y + ON x.branchID = y.branchID + AND x.commitID = y.commitID + AND x.pathID = y.pathID + AND y.id > x.id + WHERE y.id IS NOT NULL; diff --git a/resources/sql/autopatches/20151109.xhpast.db.1.sql b/resources/sql/autopatches/20151109.xhpast.db.1.sql new file mode 100644 index 0000000000..acf8b36297 --- /dev/null +++ b/resources/sql/autopatches/20151109.xhpast.db.1.sql @@ -0,0 +1,2 @@ +RENAME TABLE {$NAMESPACE}_xhpastview.xhpastview_parsetree + TO {$NAMESPACE}_xhpast.xhpast_parsetree; diff --git a/resources/sql/autopatches/20151109.xhpast.db.2.sql b/resources/sql/autopatches/20151109.xhpast.db.2.sql new file mode 100644 index 0000000000..a4a79bdced --- /dev/null +++ b/resources/sql/autopatches/20151109.xhpast.db.2.sql @@ -0,0 +1 @@ +DROP DATABASE {$NAMESPACE}_xhpastview; diff --git a/resources/sql/autopatches/20151110.daemonenvhash.sql b/resources/sql/autopatches/20151110.daemonenvhash.sql new file mode 100644 index 0000000000..bde4b21741 --- /dev/null +++ b/resources/sql/autopatches/20151110.daemonenvhash.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_daemon.daemon_log + DROP COLUMN envHash; + +ALTER TABLE {$NAMESPACE}_daemon.daemon_log + DROP COLUMN envInfo; diff --git a/resources/sql/autopatches/20151111.phame.blog.archive.1.sql b/resources/sql/autopatches/20151111.phame.blog.archive.1.sql new file mode 100644 index 0000000000..c7e5898e66 --- /dev/null +++ b/resources/sql/autopatches/20151111.phame.blog.archive.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + ADD status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151111.phame.blog.archive.2.sql b/resources/sql/autopatches/20151111.phame.blog.archive.2.sql new file mode 100644 index 0000000000..ee9ad1e4c7 --- /dev/null +++ b/resources/sql/autopatches/20151111.phame.blog.archive.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_phame.phame_blog + SET status = 'active' WHERE status = ''; diff --git a/resources/sql/autopatches/20151112.herald.edge.sql b/resources/sql/autopatches/20151112.herald.edge.sql new file mode 100644 index 0000000000..db71dfbd79 --- /dev/null +++ b/resources/sql/autopatches/20151112.herald.edge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_herald.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_herald.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151116.owners.edge.sql b/resources/sql/autopatches/20151116.owners.edge.sql new file mode 100644 index 0000000000..6d100eacd1 --- /dev/null +++ b/resources/sql/autopatches/20151116.owners.edge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_owners.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_owners.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151128.phame.blog.picture.1.sql b/resources/sql/autopatches/20151128.phame.blog.picture.1.sql new file mode 100644 index 0000000000..1db4ca8393 --- /dev/null +++ b/resources/sql/autopatches/20151128.phame.blog.picture.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + ADD profileImagePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20151130.phurl.mailkey.1.sql b/resources/sql/autopatches/20151130.phurl.mailkey.1.sql new file mode 100644 index 0000000000..67e9e25586 --- /dev/null +++ b/resources/sql/autopatches/20151130.phurl.mailkey.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phurl.phurl_url + ADD mailKey binary(20) NOT NULL; diff --git a/resources/sql/autopatches/20151130.phurl.mailkey.2.php b/resources/sql/autopatches/20151130.phurl.mailkey.2.php new file mode 100644 index 0000000000..93c7e7a4d2 --- /dev/null +++ b/resources/sql/autopatches/20151130.phurl.mailkey.2.php @@ -0,0 +1,18 @@ +establishConnection('w'); +$iterator = new LiskMigrationIterator($table); +foreach ($iterator as $url) { + $id = $url->getID(); + + echo pht('Adding mail key for Phurl %d...', $id); + echo "\n"; + + queryfx( + $conn_w, + 'UPDATE %T SET mailKey = %s WHERE id = %d', + $table->getTableName(), + Filesystem::readRandomCharacters(20), + $id); +} diff --git a/resources/sql/autopatches/20151202.versioneddraft.1.sql b/resources/sql/autopatches/20151202.versioneddraft.1.sql new file mode 100644 index 0000000000..2ad4332732 --- /dev/null +++ b/resources/sql/autopatches/20151202.versioneddraft.1.sql @@ -0,0 +1,10 @@ +CREATE TABLE {$NAMESPACE}_draft.draft_versioneddraft ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + version INT UNSIGNED NOT NULL, + properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_object` (objectPHID, authorPHID, version) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151207.editengine.1.sql b/resources/sql/autopatches/20151207.editengine.1.sql new file mode 100644 index 0000000000..5111ec99ed --- /dev/null +++ b/resources/sql/autopatches/20151207.editengine.1.sql @@ -0,0 +1,11 @@ +ALTER TABLE {$NAMESPACE}_search.search_editengineconfiguration + DROP editPolicy; + +ALTER TABLE {$NAMESPACE}_search.search_editengineconfiguration + ADD isEdit BOOL NOT NULL; + +ALTER TABLE {$NAMESPACE}_search.search_editengineconfiguration + ADD createOrder INT UNSIGNED NOT NULL; + +ALTER TABLE {$NAMESPACE}_search.search_editengineconfiguration + ADD editOrder INT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20151210.land.1.refphid.sql b/resources/sql/autopatches/20151210.land.1.refphid.sql new file mode 100644 index 0000000000..5e29b9575e --- /dev/null +++ b/resources/sql/autopatches/20151210.land.1.refphid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_refcursor + ADD phid VARBINARY(64) NOT NULL AFTER id; diff --git a/resources/sql/autopatches/20151210.land.2.refphid.php b/resources/sql/autopatches/20151210.land.2.refphid.php new file mode 100644 index 0000000000..4d8a95a79b --- /dev/null +++ b/resources/sql/autopatches/20151210.land.2.refphid.php @@ -0,0 +1,17 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $cursor) { + if (strlen($cursor->getPHID())) { + continue; + } + + queryfx( + $conn_w, + 'UPDATE %T SET phid = %s WHERE id = %d', + $table->getTableName(), + $table->generatePHID(), + $cursor->getID()); +} diff --git a/resources/sql/autopatches/20151215.phame.1.autotitle.sql b/resources/sql/autopatches/20151215.phame.1.autotitle.sql new file mode 100644 index 0000000000..b7cc98a2a4 --- /dev/null +++ b/resources/sql/autopatches/20151215.phame.1.autotitle.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_post + DROP KEY phameTitle; + +ALTER TABLE {$NAMESPACE}_phame.phame_post + CHANGE phameTitle phameTitle VARCHAR(64) COLLATE {$COLLATE_SORT}; diff --git a/resources/sql/autopatches/20151218.key.1.keyphid.sql b/resources/sql/autopatches/20151218.key.1.keyphid.sql new file mode 100644 index 0000000000..568572c1ba --- /dev/null +++ b/resources/sql/autopatches/20151218.key.1.keyphid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + ADD phid VARBINARY(64) NOT NULL AFTER id; diff --git a/resources/sql/autopatches/20151218.key.2.keyphid.php b/resources/sql/autopatches/20151218.key.2.keyphid.php new file mode 100644 index 0000000000..eb732742ca --- /dev/null +++ b/resources/sql/autopatches/20151218.key.2.keyphid.php @@ -0,0 +1,17 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $cursor) { + if (strlen($cursor->getPHID())) { + continue; + } + + queryfx( + $conn_w, + 'UPDATE %T SET phid = %s WHERE id = %d', + $table->getTableName(), + $table->generatePHID(), + $cursor->getID()); +} diff --git a/resources/sql/autopatches/20151219.proj.01.prislug.sql b/resources/sql/autopatches/20151219.proj.01.prislug.sql new file mode 100644 index 0000000000..8001dd756c --- /dev/null +++ b/resources/sql/autopatches/20151219.proj.01.prislug.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD COLUMN primarySlug VARCHAR(128) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151219.proj.02.prislugkey.sql b/resources/sql/autopatches/20151219.proj.02.prislugkey.sql new file mode 100644 index 0000000000..a1dbf6ff99 --- /dev/null +++ b/resources/sql/autopatches/20151219.proj.02.prislugkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD UNIQUE KEY `key_primaryslug` (primarySlug); diff --git a/resources/sql/autopatches/20151219.proj.03.copyslug.sql b/resources/sql/autopatches/20151219.proj.03.copyslug.sql new file mode 100644 index 0000000000..2b954c6cdc --- /dev/null +++ b/resources/sql/autopatches/20151219.proj.03.copyslug.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_project.project + SET primarySlug = TRIM(TRAILING "/" FROM phrictionSlug); diff --git a/resources/sql/autopatches/20151219.proj.04.dropslugkey.sql b/resources/sql/autopatches/20151219.proj.04.dropslugkey.sql new file mode 100644 index 0000000000..bfe1f2eb4b --- /dev/null +++ b/resources/sql/autopatches/20151219.proj.04.dropslugkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + DROP KEY `phrictionSlug`; diff --git a/resources/sql/autopatches/20151219.proj.05.dropslug.sql b/resources/sql/autopatches/20151219.proj.05.dropslug.sql new file mode 100644 index 0000000000..924f31ff95 --- /dev/null +++ b/resources/sql/autopatches/20151219.proj.05.dropslug.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + DROP COLUMN phrictionSlug; diff --git a/resources/sql/autopatches/20151219.proj.06.defaultpolicy.php b/resources/sql/autopatches/20151219.proj.06.defaultpolicy.php new file mode 100644 index 0000000000..e3548d026c --- /dev/null +++ b/resources/sql/autopatches/20151219.proj.06.defaultpolicy.php @@ -0,0 +1,28 @@ +getPolicy(ProjectDefaultViewCapability::CAPABILITY); +$edit_policy = $app->getPolicy(ProjectDefaultEditCapability::CAPABILITY); +$join_policy = $app->getPolicy(ProjectDefaultJoinCapability::CAPABILITY); + +$table = new PhabricatorProject(); +$conn_w = $table->establishConnection('w'); + +queryfx( + $conn_w, + 'UPDATE %T SET viewPolicy = %s WHERE viewPolicy IS NULL', + $table->getTableName(), + $view_policy); + +queryfx( + $conn_w, + 'UPDATE %T SET editPolicy = %s WHERE editPolicy IS NULL', + $table->getTableName(), + $edit_policy); + +queryfx( + $conn_w, + 'UPDATE %T SET joinPolicy = %s WHERE joinPolicy IS NULL', + $table->getTableName(), + $join_policy); diff --git a/resources/sql/autopatches/20151219.proj.07.viewnull.sql b/resources/sql/autopatches/20151219.proj.07.viewnull.sql new file mode 100644 index 0000000000..0e5539fc21 --- /dev/null +++ b/resources/sql/autopatches/20151219.proj.07.viewnull.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + CHANGE viewPolicy viewPolicy VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20151219.proj.08.editnull.sql b/resources/sql/autopatches/20151219.proj.08.editnull.sql new file mode 100644 index 0000000000..362e72bf4f --- /dev/null +++ b/resources/sql/autopatches/20151219.proj.08.editnull.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + CHANGE editPolicy editPolicy VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20151219.proj.09.joinnull.sql b/resources/sql/autopatches/20151219.proj.09.joinnull.sql new file mode 100644 index 0000000000..9517ed54f7 --- /dev/null +++ b/resources/sql/autopatches/20151219.proj.09.joinnull.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + CHANGE joinPolicy joinPolicy VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20151219.proj.10.subcolumns.sql b/resources/sql/autopatches/20151219.proj.10.subcolumns.sql new file mode 100644 index 0000000000..ea6725a8ab --- /dev/null +++ b/resources/sql/autopatches/20151219.proj.10.subcolumns.sql @@ -0,0 +1,17 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD parentProjectPHID VARBINARY(64); + +ALTER TABLE {$NAMESPACE}_project.project + ADD hasWorkboard BOOL NOT NULL; + +ALTER TABLE {$NAMESPACE}_project.project + ADD hasMilestones BOOL NOT NULL; + +ALTER TABLE {$NAMESPACE}_project.project + ADD hasSubprojects BOOL NOT NULL; + +ALTER TABLE {$NAMESPACE}_project.project + ADD milestoneNumber INT UNSIGNED; + +ALTER TABLE {$NAMESPACE}_project.project + ADD UNIQUE KEY `key_milestone` (parentProjectPHID, milestoneNumber); diff --git a/resources/sql/autopatches/20151219.proj.11.subprojectphids.sql b/resources/sql/autopatches/20151219.proj.11.subprojectphids.sql new file mode 100644 index 0000000000..4e51b1358d --- /dev/null +++ b/resources/sql/autopatches/20151219.proj.11.subprojectphids.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + DROP subprojectPHIDs; diff --git a/resources/sql/autopatches/20151221.search.1.version.sql b/resources/sql/autopatches/20151221.search.1.version.sql new file mode 100644 index 0000000000..dca993f1ce --- /dev/null +++ b/resources/sql/autopatches/20151221.search.1.version.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_search.search_indexversion ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + objectPHID VARBINARY(64) NOT NULL, + extensionKey VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + version VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT}, + UNIQUE KEY `key_object` (objectPHID, extensionKey) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151221.search.2.ownersngrams.sql b/resources/sql/autopatches/20151221.search.2.ownersngrams.sql new file mode 100644 index 0000000000..028d9e22f1 --- /dev/null +++ b/resources/sql/autopatches/20151221.search.2.ownersngrams.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_owners.owners_name_ngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_object` (objectID), + KEY `key_ngram` (ngram, objectID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20151221.search.3.reindex.php b/resources/sql/autopatches/20151221.search.3.reindex.php new file mode 100644 index 0000000000..623ba7bf6a --- /dev/null +++ b/resources/sql/autopatches/20151221.search.3.reindex.php @@ -0,0 +1,3 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $project) { + $path = $project->getProjectPath(); + $key = $project->getProjectPathKey(); + + if (strlen($path) && ($key !== "\0\0\0\0")) { + continue; + } + + $path_key = PhabricatorHash::digestForIndex($project->getPHID()); + $path_key = substr($path_key, 0, 4); + + queryfx( + $conn_w, + 'UPDATE %T SET projectPath = %s, projectPathKey = %s WHERE id = %d', + $project->getTableName(), + $path_key, + $path_key, + $project->getID()); +} diff --git a/resources/sql/autopatches/20151223.proj.06.uniq.sql b/resources/sql/autopatches/20151223.proj.06.uniq.sql new file mode 100644 index 0000000000..2e28c18dbe --- /dev/null +++ b/resources/sql/autopatches/20151223.proj.06.uniq.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD UNIQUE KEY `key_pathkey` (projectPathKey); diff --git a/resources/sql/autopatches/20151226.reop.1.sql b/resources/sql/autopatches/20151226.reop.1.sql new file mode 100644 index 0000000000..4daca60aeb --- /dev/null +++ b/resources/sql/autopatches/20151226.reop.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_repositoryoperation + ADD isDismissed BOOL NOT NULL; diff --git a/resources/sql/autopatches/20151227.proj.01.materialize.sql b/resources/sql/autopatches/20151227.proj.01.materialize.sql new file mode 100644 index 0000000000..ceac969e8f --- /dev/null +++ b/resources/sql/autopatches/20151227.proj.01.materialize.sql @@ -0,0 +1,6 @@ +/* PhabricatorProjectProjectHasMemberEdgeType::EDGECONST = 13 */ +/* PhabricatorProjectMaterializedMemberEdgeType::EDGECONST = 60 */ + +INSERT IGNORE INTO {$NAMESPACE}_project.edge (src, type, dst, dateCreated) + SELECT src, 60, dst, dateCreated FROM {$NAMESPACE}_project.edge + WHERE type = 13; diff --git a/resources/sql/autopatches/20151231.proj.01.icon.php b/resources/sql/autopatches/20151231.proj.01.icon.php new file mode 100644 index 0000000000..501614df3d --- /dev/null +++ b/resources/sql/autopatches/20151231.proj.01.icon.php @@ -0,0 +1,34 @@ + 'project', + 'fa-tags' => 'tag', + 'fa-lock' => 'policy', + 'fa-users' => 'group', + + 'fa-folder' => 'folder', + 'fa-calendar' => 'timeline', + 'fa-flag-checkered' => 'goal', + 'fa-truck' => 'release', + + 'fa-bug' => 'bugs', + 'fa-trash-o' => 'cleanup', + 'fa-umbrella' => 'umbrella', + 'fa-envelope' => 'communication', + + 'fa-building' => 'organization', + 'fa-cloud' => 'infrastructure', + 'fa-credit-card' => 'account', + 'fa-flask' => 'experimental', +); + +$table = new PhabricatorProject(); +$conn_w = $table->establishConnection('w'); +foreach ($icon_map as $old_icon => $new_key) { + queryfx( + $conn_w, + 'UPDATE %T SET icon = %s WHERE icon = %s', + $table->getTableName(), + $new_key, + $old_icon); +} diff --git a/resources/sql/autopatches/20160102.badges.award.sql b/resources/sql/autopatches/20160102.badges.award.sql new file mode 100644 index 0000000000..d637c93650 --- /dev/null +++ b/resources/sql/autopatches/20160102.badges.award.sql @@ -0,0 +1,10 @@ +CREATE TABLE {$NAMESPACE}_badges.badges_award ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + badgePHID VARBINARY(64) NOT NULL, + recipientPHID VARBINARY(64) NOT NULL, + awarderPHID varbinary(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_badge` (badgePHID, recipientPHID), + KEY `key_recipient` (recipientPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160110.repo.01.slug.sql b/resources/sql/autopatches/20160110.repo.01.slug.sql new file mode 100644 index 0000000000..af755ed78e --- /dev/null +++ b/resources/sql/autopatches/20160110.repo.01.slug.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_repository.repository + ADD repositorySlug VARCHAR(64) COLLATE {$COLLATE_SORT}; + +ALTER TABLE {$NAMESPACE}_repository.repository + ADD UNIQUE KEY `key_slug` (repositorySlug); diff --git a/resources/sql/autopatches/20160110.repo.02.slug.php b/resources/sql/autopatches/20160110.repo.02.slug.php new file mode 100644 index 0000000000..8655311df9 --- /dev/null +++ b/resources/sql/autopatches/20160110.repo.02.slug.php @@ -0,0 +1,49 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $repository) { + $slug = $repository->getRepositorySlug(); + + if ($slug !== null) { + continue; + } + + $clone_name = $repository->getDetail('clone-name'); + + if (!strlen($clone_name)) { + continue; + } + + if (!PhabricatorRepository::isValidRepositorySlug($clone_name)) { + echo tsprintf( + "%s\n", + pht( + 'Repository "%s" has a "Clone/Checkout As" name which is no longer '. + 'valid ("%s"). You can edit the repository to give it a new, valid '. + 'short name.', + $repository->getDisplayName(), + $clone_name)); + continue; + } + + try { + queryfx( + $conn_w, + 'UPDATE %T SET repositorySlug = %s WHERE id = %d', + $table->getTableName(), + $clone_name, + $repository->getID()); + } catch (AphrontDuplicateKeyQueryException $ex) { + echo tsprintf( + "%s\n", + pht( + 'Repository "%s" has a duplicate "Clone/Checkout As" name ("%s"). '. + 'Each name must now be unique. You can edit the repository to give '. + 'it a new, unique short name.', + $repository->getDisplayName(), + $clone_name)); + } + +} diff --git a/resources/sql/autopatches/20160111.repo.01.slugx.sql b/resources/sql/autopatches/20160111.repo.01.slugx.sql new file mode 100644 index 0000000000..41be6517d0 --- /dev/null +++ b/resources/sql/autopatches/20160111.repo.01.slugx.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_repository.repository_transaction + SET transactionType = 'repo:slug' WHERE transactionType = 'repo:clone-name'; diff --git a/resources/sql/autopatches/20160112.repo.01.uri.sql b/resources/sql/autopatches/20160112.repo.01.uri.sql new file mode 100644 index 0000000000..0dc925b10a --- /dev/null +++ b/resources/sql/autopatches/20160112.repo.01.uri.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_uriindex ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + repositoryPHID VARBINARY(64) NOT NULL, + repositoryURI LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_repository` (repositoryPHID), + KEY `key_uri` (repositoryURI(128)) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160112.repo.02.uri.index.php b/resources/sql/autopatches/20160112.repo.02.uri.index.php new file mode 100644 index 0000000000..e9cd061361 --- /dev/null +++ b/resources/sql/autopatches/20160112.repo.02.uri.index.php @@ -0,0 +1,4 @@ +establishConnection('w'); + +$panel_table = id(new PhabricatorProfileMenuItemConfiguration()); +$panel_conn = $panel_table->establishConnection('w'); + +foreach (new LiskMigrationIterator($project_table) as $project) { + $columns = queryfx_all( + $conn_w, + 'SELECT * FROM %T WHERE projectPHID = %s', + id(new PhabricatorProjectColumn())->getTableName(), + $project->getPHID()); + + // This project has no columns, so we don't need to change anything. + if (!$columns) { + continue; + } + + // This project has columns, so set its workboard flag. + queryfx( + $conn_w, + 'UPDATE %T SET hasWorkboard = 1 WHERE id = %d', + $project->getTableName(), + $project->getID()); + + // Try to set the default menu item to "Workboard". + $config = queryfx_all( + $panel_conn, + 'SELECT * FROM %T WHERE profilePHID = %s', + $panel_table->getTableName(), + $project->getPHID()); + + // There are already some settings, so don't touch them. + if ($config) { + continue; + } + + queryfx( + $panel_conn, + 'INSERT INTO %T + (phid, profilePHID, panelKey, builtinKey, visibility, panelProperties, + panelOrder, dateCreated, dateModified) + VALUES (%s, %s, %s, %s, %s, %s, %d, %d, %d)', + $panel_table->getTableName(), + $panel_table->generatePHID(), + $project->getPHID(), + PhabricatorProjectWorkboardProfileMenuItem::MENUITEMKEY, + PhabricatorProject::ITEM_WORKBOARD, + PhabricatorProfileMenuItemConfiguration::VISIBILITY_DEFAULT, + '{}', + 2, + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); +} diff --git a/resources/sql/autopatches/20160124.people.1.icon.sql b/resources/sql/autopatches/20160124.people.1.icon.sql new file mode 100644 index 0000000000..7cd96658d9 --- /dev/null +++ b/resources/sql/autopatches/20160124.people.1.icon.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user_profile + ADD icon VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160124.people.2.icondefault.sql b/resources/sql/autopatches/20160124.people.2.icondefault.sql new file mode 100644 index 0000000000..bf7dd24886 --- /dev/null +++ b/resources/sql/autopatches/20160124.people.2.icondefault.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_user.user_profile + SET icon = 'person' WHERE icon = ''; diff --git a/resources/sql/autopatches/20160128.repo.1.pull.sql b/resources/sql/autopatches/20160128.repo.1.pull.sql new file mode 100644 index 0000000000..4a8ec89480 --- /dev/null +++ b/resources/sql/autopatches/20160128.repo.1.pull.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_pullevent ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + repositoryPHID VARBINARY(64), + epoch INT UNSIGNED NOT NULL, + pullerPHID VARBINARY(64), + remoteAddress INT UNSIGNED, + remoteProtocol VARCHAR(32) COLLATE {$COLLATE_TEXT}, + resultType VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + resultCode INT UNSIGNED NOT NULL, + properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_repository` (repositoryPHID), + KEY `key_epoch` (epoch) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160201.revision.properties.1.sql b/resources/sql/autopatches/20160201.revision.properties.1.sql new file mode 100644 index 0000000000..2ab60b2ce9 --- /dev/null +++ b/resources/sql/autopatches/20160201.revision.properties.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_revision +ADD properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160201.revision.properties.2.sql b/resources/sql/autopatches/20160201.revision.properties.2.sql new file mode 100644 index 0000000000..41d3234abe --- /dev/null +++ b/resources/sql/autopatches/20160201.revision.properties.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_differential.differential_revision +SET properties = '{}' WHERE properties = ''; diff --git a/resources/sql/autopatches/20160202.board.1.proxy.sql b/resources/sql/autopatches/20160202.board.1.proxy.sql new file mode 100644 index 0000000000..a3e5965f26 --- /dev/null +++ b/resources/sql/autopatches/20160202.board.1.proxy.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project_column + ADD proxyPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20160202.ipv6.1.sql b/resources/sql/autopatches/20160202.ipv6.1.sql new file mode 100644 index 0000000000..d6a3ee5ccc --- /dev/null +++ b/resources/sql/autopatches/20160202.ipv6.1.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_pullevent + CHANGE remoteAddress remoteAddress VARBINARY(64); + +ALTER TABLE {$NAMESPACE}_repository.repository_pushevent + CHANGE remoteAddress remoteAddress VARBINARY(64); diff --git a/resources/sql/autopatches/20160202.ipv6.2.php b/resources/sql/autopatches/20160202.ipv6.2.php new file mode 100644 index 0000000000..50def09444 --- /dev/null +++ b/resources/sql/autopatches/20160202.ipv6.2.php @@ -0,0 +1,39 @@ +establishConnection('w'); + +$log_types = array($pull, $push); +foreach ($log_types as $log) { + foreach (new LiskMigrationIterator($log) as $row) { + $addr = $row->getRemoteAddress(); + + $addr = (string)$addr; + if (!strlen($addr)) { + continue; + } + + if (!ctype_digit($addr)) { + continue; + } + + if (!(int)$addr) { + continue; + } + + $ip = long2ip($addr); + if (!is_string($ip) || !strlen($ip)) { + continue; + } + + $id = $row->getID(); + queryfx( + $conn_w, + 'UPDATE %T SET remoteAddress = %s WHERE id = %d', + $log->getTableName(), + $ip, + $id); + } +} diff --git a/resources/sql/autopatches/20160206.cover.1.sql b/resources/sql/autopatches/20160206.cover.1.sql new file mode 100644 index 0000000000..1e8b473a5e --- /dev/null +++ b/resources/sql/autopatches/20160206.cover.1.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + ADD properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; + +UPDATE {$NAMESPACE}_maniphest.maniphest_task + SET properties = '{}' WHERE properties = ''; diff --git a/resources/sql/autopatches/20160208.task.1.sql b/resources/sql/autopatches/20160208.task.1.sql new file mode 100644 index 0000000000..786107666c --- /dev/null +++ b/resources/sql/autopatches/20160208.task.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + DROP projectPHIDs; diff --git a/resources/sql/autopatches/20160208.task.2.sql b/resources/sql/autopatches/20160208.task.2.sql new file mode 100644 index 0000000000..d0889ca92d --- /dev/null +++ b/resources/sql/autopatches/20160208.task.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + DROP attached; diff --git a/resources/sql/autopatches/20160208.task.3.sql b/resources/sql/autopatches/20160208.task.3.sql new file mode 100644 index 0000000000..9fae66d8df --- /dev/null +++ b/resources/sql/autopatches/20160208.task.3.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + ADD points DOUBLE; diff --git a/resources/sql/autopatches/20160212.proj.1.sql b/resources/sql/autopatches/20160212.proj.1.sql new file mode 100644 index 0000000000..7d8c19b0b1 --- /dev/null +++ b/resources/sql/autopatches/20160212.proj.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160212.proj.2.sql b/resources/sql/autopatches/20160212.proj.2.sql new file mode 100644 index 0000000000..f6f793aec4 --- /dev/null +++ b/resources/sql/autopatches/20160212.proj.2.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_project.project + SET properties = '{}' WHERE properties = ''; diff --git a/resources/sql/autopatches/20160215.owners.policy.1.sql b/resources/sql/autopatches/20160215.owners.policy.1.sql new file mode 100644 index 0000000000..ae63906781 --- /dev/null +++ b/resources/sql/autopatches/20160215.owners.policy.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + ADD viewPolicy VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20160215.owners.policy.2.sql b/resources/sql/autopatches/20160215.owners.policy.2.sql new file mode 100644 index 0000000000..f55b61a9ff --- /dev/null +++ b/resources/sql/autopatches/20160215.owners.policy.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + ADD editPolicy VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20160215.owners.policy.3.sql b/resources/sql/autopatches/20160215.owners.policy.3.sql new file mode 100644 index 0000000000..9d3ae9f112 --- /dev/null +++ b/resources/sql/autopatches/20160215.owners.policy.3.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_owners.owners_package + SET viewPolicy = 'users' WHERE viewPolicy = ''; diff --git a/resources/sql/autopatches/20160215.owners.policy.4.sql b/resources/sql/autopatches/20160215.owners.policy.4.sql new file mode 100644 index 0000000000..e108a6da9c --- /dev/null +++ b/resources/sql/autopatches/20160215.owners.policy.4.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_owners.owners_package + SET editPolicy = 'users' WHERE editPolicy = ''; diff --git a/resources/sql/autopatches/20160218.callsigns.1.sql b/resources/sql/autopatches/20160218.callsigns.1.sql new file mode 100644 index 0000000000..09d1dd5a1b --- /dev/null +++ b/resources/sql/autopatches/20160218.callsigns.1.sql @@ -0,0 +1,4 @@ +/* Make callsigns nullable, and thus optional. */ + +ALTER TABLE {$NAMESPACE}_repository.repository + CHANGE callsign callsign VARCHAR(32) COLLATE {$COLLATE_SORT}; diff --git a/resources/sql/autopatches/20160221.almanac.1.devicen.sql b/resources/sql/autopatches/20160221.almanac.1.devicen.sql new file mode 100644 index 0000000000..c098173f25 --- /dev/null +++ b/resources/sql/autopatches/20160221.almanac.1.devicen.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_almanac.almanac_devicename_ngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_object` (objectID), + KEY `key_ngram` (ngram, objectID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160221.almanac.2.devicei.php b/resources/sql/autopatches/20160221.almanac.2.devicei.php new file mode 100644 index 0000000000..623ba7bf6a --- /dev/null +++ b/resources/sql/autopatches/20160221.almanac.2.devicei.php @@ -0,0 +1,3 @@ +establishConnection('w'); + +// We're going to JSON-encode the value in each row: previously rows stored +// plain strings, but now they store JSON, so we need to update them. + +foreach (new LiskMigrationIterator($table) as $property) { + $key = $property->getFieldName(); + + $current_row = queryfx_one( + $conn_w, + 'SELECT fieldValue FROM %T WHERE id = %d', + $table->getTableName(), + $property->getID()); + + if (!$current_row) { + continue; + } + + queryfx( + $conn_w, + 'UPDATE %T SET fieldValue = %s WHERE id = %d', + $table->getTableName(), + phutil_json_encode($current_row['fieldValue']), + $property->getID()); +} diff --git a/resources/sql/autopatches/20160223.almanac.1.bound.sql b/resources/sql/autopatches/20160223.almanac.1.bound.sql new file mode 100644 index 0000000000..3e30fa458a --- /dev/null +++ b/resources/sql/autopatches/20160223.almanac.1.bound.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_almanac.almanac_device + ADD isBoundToClusterService BOOL NOT NULL; diff --git a/resources/sql/autopatches/20160223.almanac.2.lockbind.sql b/resources/sql/autopatches/20160223.almanac.2.lockbind.sql new file mode 100644 index 0000000000..93f5e8b0b5 --- /dev/null +++ b/resources/sql/autopatches/20160223.almanac.2.lockbind.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_almanac.almanac_device + SET isBoundToClusterService = isLocked; diff --git a/resources/sql/autopatches/20160223.almanac.3.devicelock.sql b/resources/sql/autopatches/20160223.almanac.3.devicelock.sql new file mode 100644 index 0000000000..fdb879fe28 --- /dev/null +++ b/resources/sql/autopatches/20160223.almanac.3.devicelock.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_almanac.almanac_device + DROP isLocked; diff --git a/resources/sql/autopatches/20160223.almanac.4.servicelock.sql b/resources/sql/autopatches/20160223.almanac.4.servicelock.sql new file mode 100644 index 0000000000..e716054c0c --- /dev/null +++ b/resources/sql/autopatches/20160223.almanac.4.servicelock.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_almanac.almanac_service + DROP isLocked; diff --git a/resources/sql/autopatches/20160223.paste.fileedges.php b/resources/sql/autopatches/20160223.paste.fileedges.php new file mode 100644 index 0000000000..73254e1eb3 --- /dev/null +++ b/resources/sql/autopatches/20160223.paste.fileedges.php @@ -0,0 +1,11 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $service) { + + $new_type = null; + try { + $old_type = $service->getServiceType(); + $object = newv($old_type, array()); + $new_type = $object->getServiceTypeConstant(); + } catch (Exception $ex) { + continue; + } + + if (!$new_type) { + continue; + } + + queryfx( + $conn_w, + 'UPDATE %T SET serviceType = %s WHERE id = %d', + $table->getTableName(), + $new_type, + $service->getID()); +} diff --git a/resources/sql/autopatches/20160227.harbormaster.1.plann.sql b/resources/sql/autopatches/20160227.harbormaster.1.plann.sql new file mode 100644 index 0000000000..4c0b4f48b3 --- /dev/null +++ b/resources/sql/autopatches/20160227.harbormaster.1.plann.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildplanname_ngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_object` (objectID), + KEY `key_ngram` (ngram, objectID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160227.harbormaster.2.plani.php b/resources/sql/autopatches/20160227.harbormaster.2.plani.php new file mode 100644 index 0000000000..623ba7bf6a --- /dev/null +++ b/resources/sql/autopatches/20160227.harbormaster.2.plani.php @@ -0,0 +1,3 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $xaction) { + $type = $xaction->getTransactionType(); + $id = $xaction->getID(); + + // This is an old ManiphestTransaction::TYPE_COLUMN. It did not do anything + // on its own and was hidden from the UI, so we're just going to remove it. + if ($type == 'column') { + queryfx( + $conn_w, + 'DELETE FROM %T WHERE id = %d', + $table->getTableName(), + $id); + continue; + } + + // This is an old ManiphestTransaction::TYPE_PROJECT_COLUMN. It moved + // tasks between board columns; we're going to replace it with a modern + // PhabricatorTransactions::TYPE_COLUMNS transaction. + if ($type == 'projectcolumn') { + try { + $new = $xaction->getNewValue(); + if (!$new || !is_array($new)) { + continue; + } + + $column_phids = idx($new, 'columnPHIDs'); + if (!is_array($column_phids) || !$column_phids) { + continue; + } + + $column_phid = head($column_phids); + if (!$column_phid) { + continue; + } + + $board_phid = idx($new, 'projectPHID'); + if (!$board_phid) { + continue; + } + + $before_phid = idx($new, 'beforePHID'); + $after_phid = idx($new, 'afterPHID'); + + $old = $xaction->getOldValue(); + if ($old && is_array($old)) { + $from_phids = idx($old, 'columnPHIDs'); + $from_phids = array_values($from_phids); + } else { + $from_phids = array(); + } + + $replacement = array( + 'columnPHID' => $column_phid, + 'boardPHID' => $board_phid, + 'fromColumnPHIDs' => $from_phids, + ); + + if ($before_phid) { + $replacement['beforePHID'] = $before_phid; + } else if ($after_phid) { + $replacement['afterPHID'] = $after_phid; + } + + queryfx( + $conn_w, + 'UPDATE %T SET transactionType = %s, oldValue = %s, newValue = %s + WHERE id = %d', + $table->getTableName(), + PhabricatorTransactions::TYPE_COLUMNS, + 'null', + phutil_json_encode(array($replacement)), + $id); + } catch (Exception $ex) { + // If anything went awry, just move on. + } + } + + +} diff --git a/resources/sql/autopatches/20160411.repo.1.version.sql b/resources/sql/autopatches/20160411.repo.1.version.sql new file mode 100644 index 0000000000..bd0db5f5ce --- /dev/null +++ b/resources/sql/autopatches/20160411.repo.1.version.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_workingcopyversion ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + repositoryPHID VARBINARY(64) NOT NULL, + devicePHID VARBINARY(64) NOT NULL, + repositoryVersion INT UNSIGNED NOT NULL, + isWriting BOOL NOT NULL, + UNIQUE KEY `key_workingcopy` (repositoryPHID, devicePHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160418.repouri.1.sql b/resources/sql/autopatches/20160418.repouri.1.sql new file mode 100644 index 0000000000..89f48b4291 --- /dev/null +++ b/resources/sql/autopatches/20160418.repouri.1.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_uri ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + repositoryPHID VARBINARY(64) NOT NULL, + uri VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + builtinProtocol VARCHAR(32) COLLATE {$COLLATE_TEXT}, + builtinIdentifier VARCHAR(32) COLLATE {$COLLATE_TEXT}, + ioType VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + displayType VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + isDisabled BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_builtin` (repositoryPHID, builtinProtocol, builtinIdentifier) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160418.repouri.2.sql b/resources/sql/autopatches/20160418.repouri.2.sql new file mode 100644 index 0000000000..03884a3dfc --- /dev/null +++ b/resources/sql/autopatches/20160418.repouri.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_uri + ADD credentialPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20160418.repoversion.1.sql b/resources/sql/autopatches/20160418.repoversion.1.sql new file mode 100644 index 0000000000..e80e4322d0 --- /dev/null +++ b/resources/sql/autopatches/20160418.repoversion.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_workingcopyversion + ADD writeProperties LONGTEXT COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160419.pushlog.1.sql b/resources/sql/autopatches/20160419.pushlog.1.sql new file mode 100644 index 0000000000..3625f5860e --- /dev/null +++ b/resources/sql/autopatches/20160419.pushlog.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_pushlog + ADD devicePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20160424.locks.1.sql b/resources/sql/autopatches/20160424.locks.1.sql new file mode 100644 index 0000000000..0edea13689 --- /dev/null +++ b/resources/sql/autopatches/20160424.locks.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_workingcopyversion + ADD lockOwner VARCHAR(255) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160426.searchedge.sql b/resources/sql/autopatches/20160426.searchedge.sql new file mode 100644 index 0000000000..630f9759ae --- /dev/null +++ b/resources/sql/autopatches/20160426.searchedge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_search.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_search.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160428.repo.1.urixaction.sql b/resources/sql/autopatches/20160428.repo.1.urixaction.sql new file mode 100644 index 0000000000..54d50dfeb7 --- /dev/null +++ b/resources/sql/autopatches/20160428.repo.1.urixaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_uritransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160503.repo.01.lpath.sql b/resources/sql/autopatches/20160503.repo.01.lpath.sql new file mode 100644 index 0000000000..437dfb1317 --- /dev/null +++ b/resources/sql/autopatches/20160503.repo.01.lpath.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository + ADD localPath VARCHAR(128) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160503.repo.02.lpathkey.sql b/resources/sql/autopatches/20160503.repo.02.lpathkey.sql new file mode 100644 index 0000000000..b630d87c26 --- /dev/null +++ b/resources/sql/autopatches/20160503.repo.02.lpathkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository + ADD UNIQUE KEY `key_local` (localPath); diff --git a/resources/sql/autopatches/20160503.repo.03.lpathmigrate.php b/resources/sql/autopatches/20160503.repo.03.lpathmigrate.php new file mode 100644 index 0000000000..d810b074c9 --- /dev/null +++ b/resources/sql/autopatches/20160503.repo.03.lpathmigrate.php @@ -0,0 +1,57 @@ +establishConnection('w'); + +$default_path = PhabricatorEnv::getEnvConfig('repository.default-local-path'); +$default_path = rtrim($default_path, '/'); + +foreach (new LiskMigrationIterator($table) as $repository) { + $local_path = $repository->getLocalPath(); + if (strlen($local_path)) { + // Repository already has a modern, unique local path. + continue; + } + + $local_path = $repository->getDetail('local-path'); + if (!strlen($local_path)) { + // Repository does not have a local path using the older format. + continue; + } + + $random = Filesystem::readRandomCharacters(8); + + // Try the configured path first, then a default path, then a path with some + // random noise. + $paths = array( + $local_path, + $default_path.'/'.$repository->getID().'/', + $default_path.'/'.$repository->getID().'-'.$random.'/', + ); + + foreach ($paths as $path) { + // Set, then get the path to normalize it. + $repository->setLocalPath($path); + $path = $repository->getLocalPath(); + + try { + queryfx( + $conn_w, + 'UPDATE %T SET localPath = %s WHERE id = %d', + $table->getTableName(), + $path, + $repository->getID()); + + echo tsprintf( + "%s\n", + pht( + 'Assigned repository "%s" to local path "%s".', + $repository->getDisplayName(), + $path)); + + break; + } catch (AphrontDuplicateKeyQueryException $ex) { + // Ignore, try the next one. + } + } +} diff --git a/resources/sql/autopatches/20160503.repo.04.mirrormigrate.php b/resources/sql/autopatches/20160503.repo.04.mirrormigrate.php new file mode 100644 index 0000000000..9613e43542 --- /dev/null +++ b/resources/sql/autopatches/20160503.repo.04.mirrormigrate.php @@ -0,0 +1,38 @@ +establishConnection('w'); + +$mirrors = queryfx_all( + $conn_w, + 'SELECT * FROM %T', + 'repository_mirror'); + +foreach ($mirrors as $mirror) { + $repository_phid = $mirror['repositoryPHID']; + $uri = $mirror['remoteURI']; + + $already_exists = id(new PhabricatorRepositoryURI())->loadOneWhere( + 'repositoryPHID = %s AND uri = %s', + $repository_phid, + $uri); + if ($already_exists) { + // Decline to migrate stuff that looks like it was already migrated. + continue; + } + + $new_uri = PhabricatorRepositoryURI::initializeNewURI() + ->setIOType(PhabricatorRepositoryURI::IO_MIRROR) + ->setRepositoryPHID($repository_phid) + ->setURI($uri) + ->setCredentialPHID($mirror['credentialPHID']) + ->setDateCreated($mirror['dateCreated']) + ->setDateModified($mirror['dateModified']) + ->save(); + + echo tsprintf( + "%s\n", + pht( + 'Migrated mirror "%s".', + $uri)); +} diff --git a/resources/sql/autopatches/20160503.repo.05.urimigrate.php b/resources/sql/autopatches/20160503.repo.05.urimigrate.php new file mode 100644 index 0000000000..d48afd4f66 --- /dev/null +++ b/resources/sql/autopatches/20160503.repo.05.urimigrate.php @@ -0,0 +1,82 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $repository) { + $uris = array(); + + $serve_http = $repository->getDetail('serve-over-http'); + $http_io = PhabricatorRepositoryURI::IO_DEFAULT; + $disable_http = false; + switch ($serve_http) { + case 'readwrite': + break; + case 'readonly': + $http_io = PhabricatorRepositoryURI::IO_READ; + break; + case 'off': + default: + $disable_http = true; + break; + } + + $serve_ssh = $repository->getDetail('serve-over-ssh'); + $ssh_io = PhabricatorRepositoryURI::IO_DEFAULT; + $disable_ssh = false; + switch ($serve_ssh) { + case 'readwrite': + break; + case 'readonly': + $ssh_io = PhabricatorRepositoryURI::IO_READ; + break; + case 'off': + default: + $disable_ssh = true; + break; + } + + $uris = $repository->newBuiltinURIs(); + + foreach ($uris as $uri) { + $builtin_protocol = $uri->getBuiltinProtocol(); + if ($builtin_protocol == PhabricatorRepositoryURI::BUILTIN_PROTOCOL_SSH) { + $uri->setIsDisabled((int)$disable_ssh); + $uri->setIoType($ssh_io); + } else { + $uri->setIsDisabled((int)$disable_http); + $uri->setIoType($http_io); + } + } + + if (!$repository->isHosted()) { + $remote_uri = $repository->getDetail('remote-uri'); + if (strlen($remote_uri)) { + $uris[] = PhabricatorRepositoryURI::initializeNewURI() + ->setRepositoryPHID($repository->getPHID()) + ->attachRepository($repository) + ->setURI($remote_uri) + ->setCredentialPHID($repository->getCredentialPHID()) + ->setIOType(PhabricatorRepositoryURI::IO_OBSERVE); + } + } + + foreach ($uris as $uri) { + $already_exists = id(new PhabricatorRepositoryURI())->loadOneWhere( + 'repositoryPHID = %s AND uri = %s LIMIT 1', + $repository->getPHID(), + $uri->getURI()); + if ($already_exists) { + continue; + } + + $uri->save(); + + echo tsprintf( + "%s\n", + pht( + 'Migrated URI "%s" for repository "%s".', + $uri->getURI(), + $repository->getDisplayName())); + } +} diff --git a/resources/sql/autopatches/20160510.repo.01.uriindex.php b/resources/sql/autopatches/20160510.repo.01.uriindex.php new file mode 100644 index 0000000000..191985af47 --- /dev/null +++ b/resources/sql/autopatches/20160510.repo.01.uriindex.php @@ -0,0 +1,10 @@ +setViewer(PhabricatorUser::getOmnipotentUser()) + ->needURIs(true) + ->execute(); + +foreach ($repos as $repo) { + $repo->updateURIIndex(); +} diff --git a/resources/sql/autopatches/20160513.owners.01.autoreview.sql b/resources/sql/autopatches/20160513.owners.01.autoreview.sql new file mode 100644 index 0000000000..8b3d6e5819 --- /dev/null +++ b/resources/sql/autopatches/20160513.owners.01.autoreview.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + ADD autoReview VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160513.owners.02.autoreviewnone.sql b/resources/sql/autopatches/20160513.owners.02.autoreviewnone.sql new file mode 100644 index 0000000000..d5c8a184e5 --- /dev/null +++ b/resources/sql/autopatches/20160513.owners.02.autoreviewnone.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_owners.owners_package + SET autoReview = 'none' WHERE autoReview = ''; diff --git a/resources/sql/autopatches/20160516.owners.01.dominion.sql b/resources/sql/autopatches/20160516.owners.01.dominion.sql new file mode 100644 index 0000000000..2fa4b0cae3 --- /dev/null +++ b/resources/sql/autopatches/20160516.owners.01.dominion.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + ADD dominion VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160516.owners.02.dominionstrong.sql b/resources/sql/autopatches/20160516.owners.02.dominionstrong.sql new file mode 100644 index 0000000000..60177c554e --- /dev/null +++ b/resources/sql/autopatches/20160516.owners.02.dominionstrong.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_owners.owners_package + SET dominion = 'strong' WHERE dominion = ''; diff --git a/resources/sql/autopatches/20160517.oauth.01.edge.sql b/resources/sql/autopatches/20160517.oauth.01.edge.sql new file mode 100644 index 0000000000..7881d89251 --- /dev/null +++ b/resources/sql/autopatches/20160517.oauth.01.edge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_oauth_server.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_oauth_server.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160518.ssh.01.activecol.sql b/resources/sql/autopatches/20160518.ssh.01.activecol.sql new file mode 100644 index 0000000000..09c3e16df1 --- /dev/null +++ b/resources/sql/autopatches/20160518.ssh.01.activecol.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + ADD isActive BOOL; diff --git a/resources/sql/autopatches/20160518.ssh.02.activeval.sql b/resources/sql/autopatches/20160518.ssh.02.activeval.sql new file mode 100644 index 0000000000..c70f91492c --- /dev/null +++ b/resources/sql/autopatches/20160518.ssh.02.activeval.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_auth.auth_sshkey + SET isActive = 1; diff --git a/resources/sql/autopatches/20160518.ssh.03.activekey.sql b/resources/sql/autopatches/20160518.ssh.03.activekey.sql new file mode 100644 index 0000000000..a6775edf92 --- /dev/null +++ b/resources/sql/autopatches/20160518.ssh.03.activekey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_sshkey + ADD UNIQUE KEY `key_activeunique` (keyIndex, isActive); diff --git a/resources/sql/autopatches/20160519.ssh.01.xaction.sql b/resources/sql/autopatches/20160519.ssh.01.xaction.sql new file mode 100644 index 0000000000..8b6ddc62cd --- /dev/null +++ b/resources/sql/autopatches/20160519.ssh.01.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_sshkeytransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160531.pref.01.xaction.sql b/resources/sql/autopatches/20160531.pref.01.xaction.sql new file mode 100644 index 0000000000..0ff33f4b59 --- /dev/null +++ b/resources/sql/autopatches/20160531.pref.01.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_user.user_preferencestransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160531.pref.02.datecreatecol.sql b/resources/sql/autopatches/20160531.pref.02.datecreatecol.sql new file mode 100644 index 0000000000..5f583fc972 --- /dev/null +++ b/resources/sql/autopatches/20160531.pref.02.datecreatecol.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user_preferences + ADD dateCreated INT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20160531.pref.03.datemodcol.sql b/resources/sql/autopatches/20160531.pref.03.datemodcol.sql new file mode 100644 index 0000000000..bd9ebc96f7 --- /dev/null +++ b/resources/sql/autopatches/20160531.pref.03.datemodcol.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user_preferences + ADD dateModified INT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20160531.pref.04.datecreateval.sql b/resources/sql/autopatches/20160531.pref.04.datecreateval.sql new file mode 100644 index 0000000000..fcaa8e0e0d --- /dev/null +++ b/resources/sql/autopatches/20160531.pref.04.datecreateval.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_user.user_preferences + SET dateCreated = UNIX_TIMESTAMP() WHERE dateCreated = 0; diff --git a/resources/sql/autopatches/20160531.pref.05.datemodval.sql b/resources/sql/autopatches/20160531.pref.05.datemodval.sql new file mode 100644 index 0000000000..8571509782 --- /dev/null +++ b/resources/sql/autopatches/20160531.pref.05.datemodval.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_user.user_preferences + SET dateModified = UNIX_TIMESTAMP() WHERE dateModified = 0; diff --git a/resources/sql/autopatches/20160531.pref.06.phidcol.sql b/resources/sql/autopatches/20160531.pref.06.phidcol.sql new file mode 100644 index 0000000000..ff6ac80010 --- /dev/null +++ b/resources/sql/autopatches/20160531.pref.06.phidcol.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user_preferences + ADD phid VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20160531.pref.07.phidval.php b/resources/sql/autopatches/20160531.pref.07.phidval.php new file mode 100644 index 0000000000..d5cb614c09 --- /dev/null +++ b/resources/sql/autopatches/20160531.pref.07.phidval.php @@ -0,0 +1,17 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $row) { + if ($row->getPHID() !== '') { + continue; + } + + queryfx( + $conn_w, + 'UPDATE %T SET phid = %s WHERE id = %d', + $table->getTableName(), + $table->generatePHID(), + $row->getID()); +} diff --git a/resources/sql/autopatches/20160601.user.01.cache.sql b/resources/sql/autopatches/20160601.user.01.cache.sql new file mode 100644 index 0000000000..bb3386b02e --- /dev/null +++ b/resources/sql/autopatches/20160601.user.01.cache.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_user.user_cache ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + userPHID VARBINARY(64) NOT NULL, + cacheIndex BINARY(12) NOT NULL, + cacheKey VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + cacheData LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + cacheType VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + UNIQUE KEY `key_usercache` (userPHID, cacheIndex), + KEY `key_cachekey` (cacheIndex), + KEY `key_cachetype` (cacheType) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160601.user.02.copyprefs.php b/resources/sql/autopatches/20160601.user.02.copyprefs.php new file mode 100644 index 0000000000..9edbc11794 --- /dev/null +++ b/resources/sql/autopatches/20160601.user.02.copyprefs.php @@ -0,0 +1,59 @@ +establishConnection('w'); +$table_name = $table->getTableName(); +$prefs_table = new PhabricatorUserPreferences(); + +foreach (new LiskRawMigrationIterator($conn_w, $table_name) as $row) { + $phid = $row['phid']; + + $pref_row = queryfx_one( + $conn_w, + 'SELECT preferences FROM %T WHERE userPHID = %s', + $prefs_table->getTableName(), + $phid); + + if ($pref_row) { + try { + $prefs = phutil_json_decode($pref_row['preferences']); + } catch (Exception $ex) { + $prefs = array(); + } + } else { + $prefs = array(); + } + + $zone = $row['timezoneIdentifier']; + if (strlen($zone)) { + $prefs[PhabricatorTimezoneSetting::SETTINGKEY] = $zone; + } + + $pronoun = $row['sex']; + if (strlen($pronoun)) { + $prefs[PhabricatorPronounSetting::SETTINGKEY] = $pronoun; + } + + $translation = $row['translation']; + if (strlen($translation)) { + $prefs[PhabricatorTranslationSetting::SETTINGKEY] = $translation; + } + + if ($prefs) { + queryfx( + $conn_w, + 'INSERT INTO %T (phid, userPHID, preferences, dateModified, dateCreated) + VALUES (%s, %s, %s, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()) + ON DUPLICATE KEY UPDATE preferences = VALUES(preferences)', + $prefs_table->getTableName(), + $prefs_table->generatePHID(), + $phid, + phutil_json_encode($prefs)); + } +} + +$prefs_key = PhabricatorUserPreferencesCacheType::KEY_PREFERENCES; +PhabricatorUserCache::clearCacheForAllUsers($prefs_key); diff --git a/resources/sql/autopatches/20160601.user.03.removetime.sql b/resources/sql/autopatches/20160601.user.03.removetime.sql new file mode 100644 index 0000000000..0ccaf77cd8 --- /dev/null +++ b/resources/sql/autopatches/20160601.user.03.removetime.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user + DROP COLUMN timezoneIdentifier; diff --git a/resources/sql/autopatches/20160601.user.04.removetranslation.sql b/resources/sql/autopatches/20160601.user.04.removetranslation.sql new file mode 100644 index 0000000000..273223c317 --- /dev/null +++ b/resources/sql/autopatches/20160601.user.04.removetranslation.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user + DROP COLUMN translation; diff --git a/resources/sql/autopatches/20160601.user.05.removesex.sql b/resources/sql/autopatches/20160601.user.05.removesex.sql new file mode 100644 index 0000000000..5b121f3864 --- /dev/null +++ b/resources/sql/autopatches/20160601.user.05.removesex.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user + DROP COLUMN sex; diff --git a/resources/sql/autopatches/20160603.user.01.removedcenabled.sql b/resources/sql/autopatches/20160603.user.01.removedcenabled.sql new file mode 100644 index 0000000000..92d6c354e3 --- /dev/null +++ b/resources/sql/autopatches/20160603.user.01.removedcenabled.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user + DROP COLUMN consoleEnabled; diff --git a/resources/sql/autopatches/20160603.user.02.removedctab.sql b/resources/sql/autopatches/20160603.user.02.removedctab.sql new file mode 100644 index 0000000000..fea865908b --- /dev/null +++ b/resources/sql/autopatches/20160603.user.02.removedctab.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user + DROP COLUMN consoleTab; diff --git a/resources/sql/autopatches/20160603.user.03.removedcvisible.sql b/resources/sql/autopatches/20160603.user.03.removedcvisible.sql new file mode 100644 index 0000000000..6cf5149f42 --- /dev/null +++ b/resources/sql/autopatches/20160603.user.03.removedcvisible.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user + DROP COLUMN consoleVisible; diff --git a/resources/sql/autopatches/20160604.user.01.stringmailprefs.php b/resources/sql/autopatches/20160604.user.01.stringmailprefs.php new file mode 100644 index 0000000000..791177d8a3 --- /dev/null +++ b/resources/sql/autopatches/20160604.user.01.stringmailprefs.php @@ -0,0 +1,47 @@ +establishConnection('w'); + +// Convert "Mail Format", "Re Prefix" and "Vary Subjects" mail settings to +// string constants to avoid weird stuff where we store "true" and "false" as +// strings in the database. + +// Each of these keys will be converted to the first value if present and +// truthy, or the second value if present and falsey. +$remap = array( + 'html-emails' => array('html', 'text'), + 're-prefix' => array('re', 'none'), + 'vary-subject' => array('vary', 'static'), +); + +foreach (new LiskMigrationIterator($table) as $row) { + $dict = $row->getPreferences(); + + $should_update = false; + foreach ($remap as $key => $value) { + if (isset($dict[$key])) { + if ($dict[$key]) { + $dict[$key] = $value[0]; + } else { + $dict[$key] = $value[1]; + } + $should_update = true; + } + } + + if (!$should_update) { + continue; + } + + queryfx( + $conn_w, + 'UPDATE %T SET preferences = %s WHERE id = %d', + $table->getTableName(), + phutil_json_encode($dict), + $row->getID()); +} + +$prefs_key = PhabricatorUserPreferencesCacheType::KEY_PREFERENCES; +PhabricatorUserCache::clearCacheForAllUsers($prefs_key); diff --git a/resources/sql/autopatches/20160604.user.02.removeimagecache.sql b/resources/sql/autopatches/20160604.user.02.removeimagecache.sql new file mode 100644 index 0000000000..92de984709 --- /dev/null +++ b/resources/sql/autopatches/20160604.user.02.removeimagecache.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user + DROP COLUMN profileImageCache; diff --git a/resources/sql/autopatches/20160605.user.01.prefnulluser.sql b/resources/sql/autopatches/20160605.user.01.prefnulluser.sql new file mode 100644 index 0000000000..e592c4c82f --- /dev/null +++ b/resources/sql/autopatches/20160605.user.01.prefnulluser.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user_preferences + CHANGE userPHID userPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20160605.user.02.prefbuiltin.sql b/resources/sql/autopatches/20160605.user.02.prefbuiltin.sql new file mode 100644 index 0000000000..46b8db6580 --- /dev/null +++ b/resources/sql/autopatches/20160605.user.02.prefbuiltin.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user_preferences + ADD builtinKey VARCHAR(32) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160605.user.03.builtinunique.sql b/resources/sql/autopatches/20160605.user.03.builtinunique.sql new file mode 100644 index 0000000000..ea13010fb8 --- /dev/null +++ b/resources/sql/autopatches/20160605.user.03.builtinunique.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user_preferences + ADD UNIQUE KEY `key_builtin` (builtinKey); diff --git a/resources/sql/autopatches/20160616.phame.blog.header.1.sql b/resources/sql/autopatches/20160616.phame.blog.header.1.sql new file mode 100644 index 0000000000..d2764d964c --- /dev/null +++ b/resources/sql/autopatches/20160616.phame.blog.header.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + ADD headerImagePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20160616.repo.01.oldref.sql b/resources/sql/autopatches/20160616.repo.01.oldref.sql new file mode 100644 index 0000000000..63bced8aab --- /dev/null +++ b/resources/sql/autopatches/20160616.repo.01.oldref.sql @@ -0,0 +1,6 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_oldref ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + repositoryPHID VARBINARY(64) NOT NULL, + commitIdentifier VARCHAR(40) NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_repository` (repositoryPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160617.harbormaster.01.arelease.sql b/resources/sql/autopatches/20160617.harbormaster.01.arelease.sql new file mode 100644 index 0000000000..6f067d1549 --- /dev/null +++ b/resources/sql/autopatches/20160617.harbormaster.01.arelease.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildartifact + ADD isReleased BOOL NOT NULL; diff --git a/resources/sql/autopatches/20160618.phame.blog.subtitle.sql b/resources/sql/autopatches/20160618.phame.blog.subtitle.sql new file mode 100644 index 0000000000..1ea6572bb0 --- /dev/null +++ b/resources/sql/autopatches/20160618.phame.blog.subtitle.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + ADD subtitle VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160620.phame.blog.parentdomain.2.sql b/resources/sql/autopatches/20160620.phame.blog.parentdomain.2.sql new file mode 100644 index 0000000000..3ad4b0d040 --- /dev/null +++ b/resources/sql/autopatches/20160620.phame.blog.parentdomain.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + ADD parentDomain VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160620.phame.blog.parentsite.1.sql b/resources/sql/autopatches/20160620.phame.blog.parentsite.1.sql new file mode 100644 index 0000000000..cfb4f157b1 --- /dev/null +++ b/resources/sql/autopatches/20160620.phame.blog.parentsite.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + ADD parentSite VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160623.phame.blog.fulldomain.1.sql b/resources/sql/autopatches/20160623.phame.blog.fulldomain.1.sql new file mode 100644 index 0000000000..96fc3b27ba --- /dev/null +++ b/resources/sql/autopatches/20160623.phame.blog.fulldomain.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + ADD domainFullURI VARCHAR(128) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160623.phame.blog.fulldomain.2.sql b/resources/sql/autopatches/20160623.phame.blog.fulldomain.2.sql new file mode 100644 index 0000000000..a323333c85 --- /dev/null +++ b/resources/sql/autopatches/20160623.phame.blog.fulldomain.2.sql @@ -0,0 +1,3 @@ +UPDATE {$NAMESPACE}_phame.phame_blog + SET domainFullURI = CONCAT('http://', domain, '/') + WHERE domain IS NOT NULL; diff --git a/resources/sql/autopatches/20160623.phame.blog.fulldomain.3.sql b/resources/sql/autopatches/20160623.phame.blog.fulldomain.3.sql new file mode 100644 index 0000000000..05f6009de1 --- /dev/null +++ b/resources/sql/autopatches/20160623.phame.blog.fulldomain.3.sql @@ -0,0 +1,3 @@ +UPDATE {$NAMESPACE}_phame.phame_blogtransaction + SET transactionType = 'phame.blog.full.domain' + WHERE transactionType = 'phame.blog.domain'; diff --git a/resources/sql/autopatches/20160706.phame.blog.parentdomain.2.sql b/resources/sql/autopatches/20160706.phame.blog.parentdomain.2.sql new file mode 100644 index 0000000000..0fa4f17197 --- /dev/null +++ b/resources/sql/autopatches/20160706.phame.blog.parentdomain.2.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + MODIFY parentDomain VARCHAR(128) NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160706.phame.blog.parentsite.1.sql b/resources/sql/autopatches/20160706.phame.blog.parentsite.1.sql new file mode 100644 index 0000000000..6c2f2e2483 --- /dev/null +++ b/resources/sql/autopatches/20160706.phame.blog.parentsite.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + MODIFY parentSite VARCHAR(128) NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160707.calendar.01.stub.sql b/resources/sql/autopatches/20160707.calendar.01.stub.sql new file mode 100644 index 0000000000..b872f17eeb --- /dev/null +++ b/resources/sql/autopatches/20160707.calendar.01.stub.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD isStub BOOL NOT NULL; diff --git a/resources/sql/autopatches/20160711.files.01.builtin.sql b/resources/sql/autopatches/20160711.files.01.builtin.sql new file mode 100644 index 0000000000..d8849ec053 --- /dev/null +++ b/resources/sql/autopatches/20160711.files.01.builtin.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_file.file + ADD builtinKey VARCHAR(64) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160711.files.02.builtinkey.sql b/resources/sql/autopatches/20160711.files.02.builtinkey.sql new file mode 100644 index 0000000000..3551f6c3cd --- /dev/null +++ b/resources/sql/autopatches/20160711.files.02.builtinkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_file.file + ADD UNIQUE KEY `key_builtin` (builtinKey); diff --git a/resources/sql/autopatches/20160713.event.01.host.sql b/resources/sql/autopatches/20160713.event.01.host.sql new file mode 100644 index 0000000000..d1a6dd643b --- /dev/null +++ b/resources/sql/autopatches/20160713.event.01.host.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + CHANGE userPHID hostPHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20160715.event.01.alldayfrom.sql b/resources/sql/autopatches/20160715.event.01.alldayfrom.sql new file mode 100644 index 0000000000..269345b3d9 --- /dev/null +++ b/resources/sql/autopatches/20160715.event.01.alldayfrom.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD allDayDateFrom INT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20160715.event.02.alldayto.sql b/resources/sql/autopatches/20160715.event.02.alldayto.sql new file mode 100644 index 0000000000..7038274487 --- /dev/null +++ b/resources/sql/autopatches/20160715.event.02.alldayto.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + ADD allDayDateTo INT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20160715.event.03.allday.php b/resources/sql/autopatches/20160715.event.03.allday.php new file mode 100644 index 0000000000..4c2d73a368 --- /dev/null +++ b/resources/sql/autopatches/20160715.event.03.allday.php @@ -0,0 +1,3 @@ +establishConnection('w'); + +echo pht( + "Restructuring calendar invite transactions...\n"); + +foreach (new LiskMigrationIterator($table) as $txn) { + $type = PhabricatorCalendarEventInviteTransaction::TRANSACTIONTYPE; + if ($txn->getTransactionType() != $type) { + continue; + } + + $old_value = array_keys($txn->getOldValue()); + + $orig_new = $txn->getNewValue(); + $status_uninvited = 'uninvited'; + foreach ($orig_new as $key => $status) { + if ($status == $status_uninvited) { + unset($orig_new[$key]); + } + } + $new_value = array_keys($orig_new); + + queryfx( + $conn_w, + 'UPDATE %T SET '. + 'oldValue = %s, newValue = %s'. + 'WHERE id = %d', + $table->getTableName(), + phutil_json_encode($old_value), + phutil_json_encode($new_value), + $txn->getID()); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/autopatches/20160721.pack.01.pub.sql b/resources/sql/autopatches/20160721.pack.01.pub.sql new file mode 100644 index 0000000000..b123740920 --- /dev/null +++ b/resources/sql/autopatches/20160721.pack.01.pub.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_packages.packages_publisher ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + name VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + publisherKey VARCHAR(64) NOT NULL COLLATE {$COLLATE_SORT}, + editPolicy VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_publisher` (publisherKey) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160721.pack.02.pubxaction.sql b/resources/sql/autopatches/20160721.pack.02.pubxaction.sql new file mode 100644 index 0000000000..f42f5ba742 --- /dev/null +++ b/resources/sql/autopatches/20160721.pack.02.pubxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_packages.packages_publishertransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160721.pack.03.edge.sql b/resources/sql/autopatches/20160721.pack.03.edge.sql new file mode 100644 index 0000000000..d735df50a3 --- /dev/null +++ b/resources/sql/autopatches/20160721.pack.03.edge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_packages.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_packages.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160721.pack.04.pkg.sql b/resources/sql/autopatches/20160721.pack.04.pkg.sql new file mode 100644 index 0000000000..c5f427f1c0 --- /dev/null +++ b/resources/sql/autopatches/20160721.pack.04.pkg.sql @@ -0,0 +1,13 @@ +CREATE TABLE {$NAMESPACE}_packages.packages_package ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + name VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + publisherPHID VARBINARY(64) NOT NULL, + packageKey VARCHAR(64) NOT NULL COLLATE {$COLLATE_SORT}, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_package` (publisherPHID, packageKey) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160721.pack.05.pkgxaction.sql b/resources/sql/autopatches/20160721.pack.05.pkgxaction.sql new file mode 100644 index 0000000000..7fd82569de --- /dev/null +++ b/resources/sql/autopatches/20160721.pack.05.pkgxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_packages.packages_packagetransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160721.pack.06.version.sql b/resources/sql/autopatches/20160721.pack.06.version.sql new file mode 100644 index 0000000000..8ca2870f78 --- /dev/null +++ b/resources/sql/autopatches/20160721.pack.06.version.sql @@ -0,0 +1,10 @@ +CREATE TABLE {$NAMESPACE}_packages.packages_version ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + name VARCHAR(64) NOT NULL COLLATE {$COLLATE_SORT}, + packagePHID VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_package` (packagePHID, name) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160721.pack.07.versionxaction.sql b/resources/sql/autopatches/20160721.pack.07.versionxaction.sql new file mode 100644 index 0000000000..706460b025 --- /dev/null +++ b/resources/sql/autopatches/20160721.pack.07.versionxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_packages.packages_versiontransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160722.pack.01.pubngrams.sql b/resources/sql/autopatches/20160722.pack.01.pubngrams.sql new file mode 100644 index 0000000000..956ec58e8b --- /dev/null +++ b/resources/sql/autopatches/20160722.pack.01.pubngrams.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_packages.packages_publishername_ngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_object` (objectID), + KEY `key_ngram` (ngram, objectID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160722.pack.02.pkgngrams.sql b/resources/sql/autopatches/20160722.pack.02.pkgngrams.sql new file mode 100644 index 0000000000..514482539a --- /dev/null +++ b/resources/sql/autopatches/20160722.pack.02.pkgngrams.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_packages.packages_packagename_ngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_object` (objectID), + KEY `key_ngram` (ngram, objectID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160722.pack.03.versionngrams.sql b/resources/sql/autopatches/20160722.pack.03.versionngrams.sql new file mode 100644 index 0000000000..a5f85f546b --- /dev/null +++ b/resources/sql/autopatches/20160722.pack.03.versionngrams.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_packages.packages_versionname_ngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_object` (objectID), + KEY `key_ngram` (ngram, objectID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160810.commit.01.summarylength.sql b/resources/sql/autopatches/20160810.commit.01.summarylength.sql new file mode 100644 index 0000000000..366f0948cd --- /dev/null +++ b/resources/sql/autopatches/20160810.commit.01.summarylength.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_commit + CHANGE summary summary VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160824.connectionlog.sql b/resources/sql/autopatches/20160824.connectionlog.sql new file mode 100644 index 0000000000..499fc71845 --- /dev/null +++ b/resources/sql/autopatches/20160824.connectionlog.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_conduit.conduit_connectionlog; diff --git a/resources/sql/autopatches/20160824.repohint.01.hint.sql b/resources/sql/autopatches/20160824.repohint.01.hint.sql new file mode 100644 index 0000000000..f29f2d1c5d --- /dev/null +++ b/resources/sql/autopatches/20160824.repohint.01.hint.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_commithint ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + repositoryPHID VARBINARY(64) NOT NULL, + oldCommitIdentifier VARCHAR(40) NOT NULL COLLATE {$COLLATE_TEXT}, + newCommitIdentifier VARCHAR(40) COLLATE {$COLLATE_TEXT}, + hintType VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + UNIQUE KEY `key_old` (repositoryPHID, oldCommitIdentifier) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160824.repohint.02.movebad.php b/resources/sql/autopatches/20160824.repohint.02.movebad.php new file mode 100644 index 0000000000..4127892f73 --- /dev/null +++ b/resources/sql/autopatches/20160824.repohint.02.movebad.php @@ -0,0 +1,39 @@ +establishConnection('w'); + +$rows = queryfx_all( + $conn, + 'SELECT fullCommitName FROM repository_badcommit'); + +$viewer = PhabricatorUser::getOmnipotentUser(); + +foreach ($rows as $row) { + $identifier = $row['fullCommitName']; + + $commit = id(new DiffusionCommitQuery()) + ->setViewer($viewer) + ->withIdentifiers(array($identifier)) + ->executeOne(); + + if (!$commit) { + echo tsprintf( + "%s\n", + pht( + 'Skipped hint for "%s", this is not a valid commit.', + $identifier)); + } else { + PhabricatorRepositoryCommitHint::updateHint( + $commit->getRepository()->getPHID(), + $commit->getCommitIdentifier(), + null, + PhabricatorRepositoryCommitHint::HINT_UNREADABLE); + + echo tsprintf( + "%s\n", + pht( + 'Updated commit hint for "%s".', + $identifier)); + } +} diff --git a/resources/sql/autopatches/20160824.repohint.03.nukebad.sql b/resources/sql/autopatches/20160824.repohint.03.nukebad.sql new file mode 100644 index 0000000000..88364aeef3 --- /dev/null +++ b/resources/sql/autopatches/20160824.repohint.03.nukebad.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_repository.repository_badcommit; diff --git a/resources/sql/autopatches/20160825.ponder.sql b/resources/sql/autopatches/20160825.ponder.sql new file mode 100644 index 0000000000..73be3a781e --- /dev/null +++ b/resources/sql/autopatches/20160825.ponder.sql @@ -0,0 +1,7 @@ +/* Removes Ponder vote data. */ + +DELETE FROM {$NAMESPACE}_ponder.edge + WHERE type IN (17, 18, 19, 20); + +DELETE FROM {$NAMESPACE}_user.edge + WHERE type IN (17, 18, 19, 20); diff --git a/resources/sql/autopatches/20160829.pastebin.01.language.sql b/resources/sql/autopatches/20160829.pastebin.01.language.sql new file mode 100644 index 0000000000..b29a9d0bc5 --- /dev/null +++ b/resources/sql/autopatches/20160829.pastebin.01.language.sql @@ -0,0 +1,3 @@ +/* Allow this column to be nullable (null means we'll try to autodetect) */ +ALTER TABLE {$NAMESPACE}_pastebin.pastebin_paste MODIFY language VARCHAR(64) + COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160829.pastebin.02.language.sql b/resources/sql/autopatches/20160829.pastebin.02.language.sql new file mode 100644 index 0000000000..b6876c6c69 --- /dev/null +++ b/resources/sql/autopatches/20160829.pastebin.02.language.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_pastebin.pastebin_paste SET language = NULL + WHERE language = ''; diff --git a/resources/sql/autopatches/20160913.conpherence.topic.1.sql b/resources/sql/autopatches/20160913.conpherence.topic.1.sql new file mode 100644 index 0000000000..186a5b5c58 --- /dev/null +++ b/resources/sql/autopatches/20160913.conpherence.topic.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + ADD topic VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160919.repo.messagecount.sql b/resources/sql/autopatches/20160919.repo.messagecount.sql new file mode 100644 index 0000000000..a28bbb1e7e --- /dev/null +++ b/resources/sql/autopatches/20160919.repo.messagecount.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_statusmessage + ADD messageCount INT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20160919.repo.messagedefault.sql b/resources/sql/autopatches/20160919.repo.messagedefault.sql new file mode 100644 index 0000000000..0c8b84d44a --- /dev/null +++ b/resources/sql/autopatches/20160919.repo.messagedefault.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_statusmessage + CHANGE messageCount messageCount INT UNSIGNED NOT NULL DEFAULT 0; diff --git a/resources/sql/autopatches/20160921.fileexternalrequest.sql b/resources/sql/autopatches/20160921.fileexternalrequest.sql new file mode 100644 index 0000000000..4c1beaab9e --- /dev/null +++ b/resources/sql/autopatches/20160921.fileexternalrequest.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_file.file_externalrequest ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + filePHID VARBINARY(64), + ttl INT UNSIGNED NOT NULL, + uri LONGTEXT NOT NULL, + uriIndex BINARY(12) NOT NULL, + isSuccessful BOOL NOT NULL, + responseMessage LONGTEXT, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_uriindex` (uriIndex), + KEY `key_ttl` (ttl), + KEY `key_file` (filePHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20160927.phurl.ngrams.php b/resources/sql/autopatches/20160927.phurl.ngrams.php new file mode 100644 index 0000000000..623ba7bf6a --- /dev/null +++ b/resources/sql/autopatches/20160927.phurl.ngrams.php @@ -0,0 +1,3 @@ +establishConnection('w'); +$table_name = 'calendar_event'; + +// Long ago, "All Day" events were stored with a start and end date set to +// the earliest possible start and end seconds for the corresponding days. We +// then moved to store all day events with their "date" epochs as UTC, separate +// from individual event times. Both systems were later replaced with use of +// CalendarDateTime. +$zone_min = new DateTimeZone('Pacific/Midway'); +$zone_max = new DateTimeZone('Pacific/Kiritimati'); +$zone_utc = new DateTimeZone('UTC'); + +foreach (new LiskRawMigrationIterator($conn, $table_name) as $row) { + $parameters = phutil_json_decode($row['parameters']); + if (isset($parameters['startDateTime'])) { + // This event has already been migrated. + continue; + } + + $is_all_day = $row['isAllDay']; + + if (empty($row['allDayDateFrom'])) { + // No "allDayDateFrom" means this is an old event which was never migrated + // by the earlier "20160715.event.03.allday.php" migration. The dateFrom + // and dateTo will be minimum and maximum earthly seconds for the event. We + // convert them to UTC if they were in extreme timezones. + $epoch_min = $row['dateFrom']; + $epoch_max = $row['dateTo']; + + if ($is_all_day) { + $date_min = new DateTime('@'.$epoch_min); + $date_max = new DateTime('@'.$epoch_max); + + $date_min->setTimeZone($zone_min); + $date_min->modify('+2 days'); + $date_max->setTimeZone($zone_max); + $date_max->modify('-2 days'); + + $string_min = $date_min->format('Y-m-d'); + $string_max = $date_max->format('Y-m-d 23:59:00'); + + $utc_min = id(new DateTime($string_min, $zone_utc))->format('U'); + $utc_max = id(new DateTime($string_max, $zone_utc))->format('U'); + } else { + $utc_min = $epoch_min; + $utc_max = $epoch_max; + } + } else { + // This is an event which was migrated already. We can pick the correct + // epoch timestamps based on the "isAllDay" flag. + if ($is_all_day) { + $utc_min = $row['allDayDateFrom']; + $utc_max = $row['allDayDateTo']; + } else { + $utc_min = $row['dateFrom']; + $utc_max = $row['dateTo']; + } + } + + $utc_until = $row['recurrenceEndDate']; + + $start_datetime = PhutilCalendarAbsoluteDateTime::newFromEpoch($utc_min); + if ($is_all_day) { + $start_datetime->setIsAllDay(true); + } + + $end_datetime = PhutilCalendarAbsoluteDateTime::newFromEpoch($utc_max); + if ($is_all_day) { + $end_datetime->setIsAllDay(true); + } + + if ($utc_until) { + $until_datetime = PhutilCalendarAbsoluteDateTime::newFromEpoch($utc_until); + } else { + $until_datetime = null; + } + + $parameters['startDateTime'] = $start_datetime->toDictionary(); + $parameters['endDateTime'] = $end_datetime->toDictionary(); + if ($until_datetime) { + $parameters['untilDateTime'] = $until_datetime->toDictionary(); + } + + queryfx( + $conn, + 'UPDATE %T SET parameters = %s WHERE id = %d', + $table_name, + phutil_json_encode($parameters), + $row['id']); +} + +// Generate UTC epochs for all events. We can't readily do this one at a +// time because instance UTC epochs rely on having the parent event. +$viewer = PhabricatorUser::getOmnipotentUser(); + +$all_events = id(new PhabricatorCalendarEventQuery()) + ->setViewer($viewer) + ->execute(); +foreach ($all_events as $event) { + if ($event->getUTCInitialEpoch()) { + // Already migrated. + continue; + } + + try { + $event->updateUTCEpochs(); + } catch (Exception $ex) { + continue; + } + + queryfx( + $conn, + 'UPDATE %T SET + utcInitialEpoch = %d, + utcUntilEpoch = %nd, + utcInstanceEpoch = %nd WHERE id = %d', + $table_name, + $event->getUTCInitialEpoch(), + $event->getUTCUntilEpoch(), + $event->getUTCInstanceEpoch(), + $event->getID()); +} diff --git a/resources/sql/autopatches/20161005.cal.01.rrules.php b/resources/sql/autopatches/20161005.cal.01.rrules.php new file mode 100644 index 0000000000..e2e61ba30a --- /dev/null +++ b/resources/sql/autopatches/20161005.cal.01.rrules.php @@ -0,0 +1,44 @@ +establishConnection('w'); +$table_name = 'calendar_event'; + +foreach (new LiskRawMigrationIterator($conn, $table_name) as $row) { + $parameters = phutil_json_decode($row['parameters']); + if (isset($parameters['recurrenceRule'])) { + // This event has already been migrated. + continue; + } + + if (!$row['isRecurring']) { + continue; + } + + $old_rule = $row['recurrenceFrequency']; + if (!$old_rule) { + continue; + } + + try { + $frequency = phutil_json_decode($old_rule); + if ($frequency) { + $frequency_rule = $frequency['rule']; + $frequency_rule = phutil_utf8_strtoupper($frequency_rule); + + $rrule = id(new PhutilCalendarRecurrenceRule()) + ->setFrequency($frequency_rule); + } + } catch (Exception $ex) { + continue; + } + + $parameters['recurrenceRule'] = $rrule->toDictionary(); + + queryfx( + $conn, + 'UPDATE %T SET parameters = %s WHERE id = %d', + $table_name, + phutil_json_encode($parameters), + $row['id']); +} diff --git a/resources/sql/autopatches/20161005.cal.02.export.sql b/resources/sql/autopatches/20161005.cal.02.export.sql new file mode 100644 index 0000000000..bd1c031165 --- /dev/null +++ b/resources/sql/autopatches/20161005.cal.02.export.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_calendar.calendar_export ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + name LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + authorPHID VARBINARY(64) NOT NULL, + policyMode VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + queryKey VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + secretKey BINARY(20) NOT NULL, + isDisabled BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_author` (authorPHID), + UNIQUE KEY `key_secret` (secretKey) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20161005.cal.03.exportxaction.sql b/resources/sql/autopatches/20161005.cal.03.exportxaction.sql new file mode 100644 index 0000000000..1161534015 --- /dev/null +++ b/resources/sql/autopatches/20161005.cal.03.exportxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_calendar.calendar_exporttransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20161005.conpherence.image.1.sql b/resources/sql/autopatches/20161005.conpherence.image.1.sql new file mode 100644 index 0000000000..17950986b8 --- /dev/null +++ b/resources/sql/autopatches/20161005.conpherence.image.1.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + ADD profileImagePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20161005.conpherence.image.2.php b/resources/sql/autopatches/20161005.conpherence.image.2.php new file mode 100644 index 0000000000..8bad4b55e7 --- /dev/null +++ b/resources/sql/autopatches/20161005.conpherence.image.2.php @@ -0,0 +1,4 @@ +establishConnection('w'); + +$txn_table = new PhabricatorDashboardTransaction(); +$txn_conn = $table->establishConnection('r'); + +echo pht("Building Dashboard authorPHIDs...\n"); + +foreach (new LiskMigrationIterator($table) as $dashboard) { + + if ($dashboard->getAuthorPHID()) { + continue; + } + + $author_row = queryfx_one( + $txn_conn, + 'SELECT authorPHID FROM %T WHERE objectPHID = %s ORDER BY id ASC LIMIT 1', + $txn_table->getTableName(), + $dashboard->getPHID()); + + if (!$author_row) { + $author_phid = id(new PhabricatorDashboardApplication())->getPHID(); + } else { + $author_phid = $author_row['authorPHID']; + } + + queryfx( + $conn_w, + 'UPDATE %T SET authorPHID = %s WHERE id = %d', + $table->getTableName(), + $author_phid, + $dashboard->getID()); +} + +echo pht("Done\n"); diff --git a/resources/sql/autopatches/20161211.menu.01.itemkey.sql b/resources/sql/autopatches/20161211.menu.01.itemkey.sql new file mode 100644 index 0000000000..71bfe257f0 --- /dev/null +++ b/resources/sql/autopatches/20161211.menu.01.itemkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_search.search_profilepanelconfiguration + CHANGE panelKey menuItemKey VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20161211.menu.02.itemprops.sql b/resources/sql/autopatches/20161211.menu.02.itemprops.sql new file mode 100644 index 0000000000..cb9e296d42 --- /dev/null +++ b/resources/sql/autopatches/20161211.menu.02.itemprops.sql @@ -0,0 +1,3 @@ +ALTER TABLE {$NAMESPACE}_search.search_profilepanelconfiguration + CHANGE panelProperties menuItemProperties + LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20161211.menu.03.order.sql b/resources/sql/autopatches/20161211.menu.03.order.sql new file mode 100644 index 0000000000..01291ad4c6 --- /dev/null +++ b/resources/sql/autopatches/20161211.menu.03.order.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_search.search_profilepanelconfiguration + CHANGE panelOrder menuItemOrder INT UNSIGNED; diff --git a/resources/sql/autopatches/20161212.dashboardpanel.01.author.sql b/resources/sql/autopatches/20161212.dashboardpanel.01.author.sql new file mode 100644 index 0000000000..00c52d19cb --- /dev/null +++ b/resources/sql/autopatches/20161212.dashboardpanel.01.author.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_dashboard.dashboard_panel + ADD authorPHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20161212.dashboardpanel.02.author.php b/resources/sql/autopatches/20161212.dashboardpanel.02.author.php new file mode 100644 index 0000000000..bc87aef91c --- /dev/null +++ b/resources/sql/autopatches/20161212.dashboardpanel.02.author.php @@ -0,0 +1,39 @@ +establishConnection('w'); + +$txn_table = new PhabricatorDashboardPanelTransaction(); +$txn_conn = $table->establishConnection('r'); + +echo pht("Building Dashboard Panel authorPHIDs...\n"); + +foreach (new LiskMigrationIterator($table) as $panel) { + + if ($panel->getAuthorPHID()) { + continue; + } + + $panel_row = queryfx_one( + $txn_conn, + 'SELECT authorPHID FROM %T WHERE objectPHID = %s ORDER BY id ASC LIMIT 1', + $txn_table->getTableName(), + $panel->getPHID()); + + if (!$panel_row) { + $author_phid = id(new PhabricatorDashboardApplication())->getPHID(); + } else { + $author_phid = $panel_row['authorPHID']; + } + + queryfx( + $conn_w, + 'UPDATE %T SET authorPHID = %s WHERE id = %d', + $table->getTableName(), + $author_phid, + $panel->getID()); +} + +echo pht("Done\n"); diff --git a/resources/sql/autopatches/20161212.dashboards.01.icon.sql b/resources/sql/autopatches/20161212.dashboards.01.icon.sql new file mode 100644 index 0000000000..e2783ab5bc --- /dev/null +++ b/resources/sql/autopatches/20161212.dashboards.01.icon.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_dashboard.dashboard + ADD icon VARCHAR(32) NOT NULL; + +UPDATE {$NAMESPACE}_dashboard.dashboard + SET icon = 'fa-dashboard'; diff --git a/resources/sql/autopatches/20161213.diff.01.hunks.php b/resources/sql/autopatches/20161213.diff.01.hunks.php new file mode 100644 index 0000000000..a3863275f1 --- /dev/null +++ b/resources/sql/autopatches/20161213.diff.01.hunks.php @@ -0,0 +1,39 @@ +establishConnection('w'); +$src_table = 'differential_hunk'; +$dst_table = 'differential_hunk_modern'; + +echo tsprintf( + "%s\n", + pht('Migrating old hunks...')); + +foreach (new LiskRawMigrationIterator($conn, $src_table) as $row) { + queryfx( + $conn, + 'INSERT INTO %T + (changesetID, oldOffset, oldLen, newOffset, newLen, + dataType, dataEncoding, dataFormat, data, + dateCreated, dateModified) + VALUES + (%d, %d, %d, %d, %d, + %s, %s, %s, %s, + %d, %d)', + $dst_table, + $row['changesetID'], + $row['oldOffset'], + $row['oldLen'], + $row['newOffset'], + $row['newLen'], + DifferentialHunk::DATATYPE_TEXT, + 'utf8', + DifferentialHunk::DATAFORMAT_RAW, + // In rare cases, this could be NULL. See T12090. + (string)$row['changes'], + $row['dateCreated'], + $row['dateModified']); +} + +echo tsprintf( + "%s\n", + pht('Done.')); diff --git a/resources/sql/autopatches/20161216.dashboard.ngram.01.sql b/resources/sql/autopatches/20161216.dashboard.ngram.01.sql new file mode 100644 index 0000000000..8fd237fe82 --- /dev/null +++ b/resources/sql/autopatches/20161216.dashboard.ngram.01.sql @@ -0,0 +1,15 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_dashboard_ngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_object` (objectID), + KEY `key_ngram` (ngram, objectID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_dashboardpanel_ngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_object` (objectID), + KEY `key_ngram` (ngram, objectID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20161216.dashboard.ngram.02.php b/resources/sql/autopatches/20161216.dashboard.ngram.02.php new file mode 100644 index 0000000000..623ba7bf6a --- /dev/null +++ b/resources/sql/autopatches/20161216.dashboard.ngram.02.php @@ -0,0 +1,3 @@ +establishConnection('w'); + +queryfx( + $conn_w, + 'DELETE FROM %T WHERE menuItemKey = "motivator"', + $table->getTableName()); diff --git a/resources/sql/autopatches/20170131.dashboard.personal.01.php b/resources/sql/autopatches/20170131.dashboard.personal.01.php new file mode 100644 index 0000000000..af62c017e8 --- /dev/null +++ b/resources/sql/autopatches/20170131.dashboard.personal.01.php @@ -0,0 +1,45 @@ +establishConnection('r'); +$table_name = 'dashboard_install'; + +$search_table = new PhabricatorProfileMenuItemConfiguration(); +$search_conn = $search_table->establishConnection('w'); +$search_table_name = 'search_profilepanelconfiguration'; + +$viewer = PhabricatorUser::getOmnipotentUser(); +$profile_phid = id(new PhabricatorHomeApplication())->getPHID(); +$menu_item_key = PhabricatorDashboardProfileMenuItem::MENUITEMKEY; + +foreach (new LiskRawMigrationIterator($conn, $table_name) as $install) { + + $dashboard_phid = $install['dashboardPHID']; + $new_phid = id(new PhabricatorProfileMenuItemConfiguration())->generatePHID(); + $menu_item_properties = json_encode( + array('dashboardPHID' => $dashboard_phid, 'name' => '')); + + $custom_phid = $install['objectPHID']; + if ($custom_phid == 'dashboard:default') { + $custom_phid = null; + } + + $menu_item_order = 0; + + queryfx( + $search_conn, + 'INSERT INTO %T (phid, profilePHID, menuItemKey, menuItemProperties, '. + 'visibility, dateCreated, dateModified, menuItemOrder, customPHID) VALUES '. + '(%s, %s, %s, %s, %s, %d, %d, %d, %ns)', + $search_table_name, + $new_phid, + $profile_phid, + $menu_item_key, + $menu_item_properties, + 'visible', + PhabricatorTime::getNow(), + PhabricatorTime::getNow(), + $menu_item_order, + $custom_phid); + +} diff --git a/resources/sql/autopatches/20170301.subtype.01.col.sql b/resources/sql/autopatches/20170301.subtype.01.col.sql new file mode 100644 index 0000000000..318021f9d0 --- /dev/null +++ b/resources/sql/autopatches/20170301.subtype.01.col.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_search.search_editengineconfiguration + ADD subtype VARCHAR(64) COLLATE {$COLLATE_TEXT} NOT NULL; diff --git a/resources/sql/autopatches/20170301.subtype.02.default.sql b/resources/sql/autopatches/20170301.subtype.02.default.sql new file mode 100644 index 0000000000..e1baedc013 --- /dev/null +++ b/resources/sql/autopatches/20170301.subtype.02.default.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_search.search_editengineconfiguration + SET subtype = 'default' WHERE subtype = ''; diff --git a/resources/sql/autopatches/20170301.subtype.03.taskcol.sql b/resources/sql/autopatches/20170301.subtype.03.taskcol.sql new file mode 100644 index 0000000000..7c4f6c9412 --- /dev/null +++ b/resources/sql/autopatches/20170301.subtype.03.taskcol.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + ADD subtype VARCHAR(64) COLLATE {$COLLATE_TEXT} NOT NULL; diff --git a/resources/sql/autopatches/20170301.subtype.04.taskdefault.sql b/resources/sql/autopatches/20170301.subtype.04.taskdefault.sql new file mode 100644 index 0000000000..7189bdb26e --- /dev/null +++ b/resources/sql/autopatches/20170301.subtype.04.taskdefault.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_maniphest.maniphest_task + SET subtype = 'default' WHERE subtype = ''; diff --git a/resources/sql/autopatches/20170303.people.01.avatar.sql b/resources/sql/autopatches/20170303.people.01.avatar.sql new file mode 100644 index 0000000000..7f447f208c --- /dev/null +++ b/resources/sql/autopatches/20170303.people.01.avatar.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_user.user + ADD defaultProfileImagePHID VARBINARY(64); + +ALTER TABLE {$NAMESPACE}_user.user + ADD defaultProfileImageVersion VARCHAR(64) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170313.reviewers.01.sql b/resources/sql/autopatches/20170313.reviewers.01.sql new file mode 100644 index 0000000000..4b243b6f6f --- /dev/null +++ b/resources/sql/autopatches/20170313.reviewers.01.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_differential.differential_reviewer ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + revisionPHID VARBINARY(64) NOT NULL, + reviewerPHID VARBINARY(64) NOT NULL, + reviewerStatus VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_revision` (revisionPHID, reviewerPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170316.rawfiles.01.php b/resources/sql/autopatches/20170316.rawfiles.01.php new file mode 100644 index 0000000000..df2fa93c9a --- /dev/null +++ b/resources/sql/autopatches/20170316.rawfiles.01.php @@ -0,0 +1,53 @@ +establishConnection('w'); +$viewer = PhabricatorUser::getOmnipotentUser(); + +$iterator = new LiskRawMigrationIterator( + $conn, + $table->getTableName()); + +echo tsprintf( + "%s\n", + pht('Purging old raw changeset file caches...')); + +$keys = array( + 'raw:new:phid', + 'raw:old:phid', +); + +foreach ($iterator as $changeset) { + try { + $metadata = phutil_json_decode($changeset['metadata']); + + $phids = array(); + foreach ($keys as $key) { + if (isset($metadata[$key])) { + $phids[] = $metadata[$key]; + } + } + + foreach ($phids as $phid) { + $file = id(new PhabricatorFileQuery()) + ->setViewer($viewer) + ->withPHIDs(array($phid)) + ->executeOne(); + if ($file) { + id(new PhabricatorDestructionEngine()) + ->destroyObject($file); + } + } + + // NOTE: We don't bother updating the changeset record itself: we already + // regenerate the cache properly if the stored value isn't valid. + + } catch (Exception $ex) { + // Just move on if we run into trouble. + } +} diff --git a/resources/sql/autopatches/20170320.reviewers.01.lastaction.sql b/resources/sql/autopatches/20170320.reviewers.01.lastaction.sql new file mode 100644 index 0000000000..41b8051275 --- /dev/null +++ b/resources/sql/autopatches/20170320.reviewers.01.lastaction.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_reviewer + ADD lastActionDiffPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20170320.reviewers.02.lastcomment.sql b/resources/sql/autopatches/20170320.reviewers.02.lastcomment.sql new file mode 100644 index 0000000000..c430d86064 --- /dev/null +++ b/resources/sql/autopatches/20170320.reviewers.02.lastcomment.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_reviewer + ADD lastCommentDiffPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20170320.reviewers.03.migrate.php b/resources/sql/autopatches/20170320.reviewers.03.migrate.php new file mode 100644 index 0000000000..04abb5c141 --- /dev/null +++ b/resources/sql/autopatches/20170320.reviewers.03.migrate.php @@ -0,0 +1,125 @@ +establishConnection('w'); + +// Previously "DifferentialRevisionHasReviewerEdgeType::EDGECONST". +$edge_type = 35; + +// NOTE: We can't use normal migration iterators for edges because they don't +// have an "id" column. For now, try just loading the whole result set: the +// actual size of the rows is small. If we run into issues, we could write an +// EdgeIterator. +$every_edge = queryfx_all( + $conn, + 'SELECT * FROM %T edge LEFT JOIN %T data ON edge.dataID = data.id + WHERE edge.type = %d', + $table_name, + $data_name, + $edge_type); + +foreach ($every_edge as $edge) { + if ($edge['type'] != $edge_type) { + // Ignore edges which aren't "reviewers", like subscribers. + continue; + } + + try { + $data = phutil_json_decode($edge['data']); + $data = idx($data, 'data'); + } catch (Exception $ex) { + // Just ignore any kind of issue with the edge data, we'll use a default + // below. + $data = null; + } + + if (!$data) { + $data = array( + 'status' => 'added', + ); + } + + $status = idx($data, 'status'); + + $diff_phid = null; + + // NOTE: At one point, the code to populate "diffID" worked correctly, but + // it seems to have later been broken. Salvage it if we can, and look up + // the corresponding diff PHID. + $diff_id = idx($data, 'diffID'); + if ($diff_id) { + $row = queryfx_one( + $conn, + 'SELECT phid FROM %T WHERE id = %d', + $diff_table->getTableName(), + $diff_id); + if ($row) { + $diff_phid = $row['phid']; + } + } + + if (!$diff_phid) { + // If the status is "accepted" or "rejected", look up the current diff + // PHID so we can distinguish between "accepted" and "accepted older". + switch ($status) { + case 'accepted': + case 'rejected': + case 'commented': + $row = queryfx_one( + $conn, + 'SELECT diff.phid FROM %T diff JOIN %T revision + ON diff.revisionID = revision.id + WHERE revision.phid = %s + ORDER BY diff.id DESC LIMIT 1', + $diff_table->getTableName(), + $table->getTableName(), + $edge['src']); + if ($row) { + $diff_phid = $row['phid']; + } + break; + } + } + + // We now represent some states (like "Commented" and "Accepted Older") as + // a primary state plus an extra flag, instead of making "Commented" a + // primary state. Map old states to new states and flags. + + if ($status == 'commented') { + $status = 'added'; + $comment_phid = $diff_phid; + $action_phid = null; + } else { + $comment_phid = null; + $action_phid = $diff_phid; + } + + if ($status == 'accepted-older') { + $status = 'accepted'; + } + + if ($status == 'rejected-older') { + $status = 'rejected'; + } + + queryfx( + $conn, + 'INSERT INTO %T (revisionPHID, reviewerPHID, reviewerStatus, + lastActionDiffPHID, lastCommentDiffPHID, dateCreated, dateModified) + VALUES (%s, %s, %s, %ns, %ns, %d, %d) + ON DUPLICATE KEY UPDATE dateCreated = VALUES(dateCreated)', + $reviewer_table->getTableName(), + $edge['src'], + $edge['dst'], + $status, + $action_phid, + $comment_phid, + $edge['dateCreated'], + $edge['dateCreated']); +} diff --git a/resources/sql/autopatches/20170322.reviewers.04.actor.sql b/resources/sql/autopatches/20170322.reviewers.04.actor.sql new file mode 100644 index 0000000000..27b46848a7 --- /dev/null +++ b/resources/sql/autopatches/20170322.reviewers.04.actor.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_reviewer + ADD lastActorPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20170328.reviewers.01.void.sql b/resources/sql/autopatches/20170328.reviewers.01.void.sql new file mode 100644 index 0000000000..b46cb9351d --- /dev/null +++ b/resources/sql/autopatches/20170328.reviewers.01.void.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_reviewer + ADD voidedPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20170404.files.retroactive-content-hash.sql b/resources/sql/autopatches/20170404.files.retroactive-content-hash.sql new file mode 100644 index 0000000000..7c4eb0f013 --- /dev/null +++ b/resources/sql/autopatches/20170404.files.retroactive-content-hash.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_file.file + CHANGE contentHash contentHash BINARY(64); diff --git a/resources/sql/autopatches/20170406.hmac.01.keystore.sql b/resources/sql/autopatches/20170406.hmac.01.keystore.sql new file mode 100644 index 0000000000..f7de1c9efa --- /dev/null +++ b/resources/sql/autopatches/20170406.hmac.01.keystore.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_hmackey ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + keyName VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + keyValue VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_name` (keyName) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170410.calendar.01.repair.php b/resources/sql/autopatches/20170410.calendar.01.repair.php new file mode 100644 index 0000000000..7d0000e581 --- /dev/null +++ b/resources/sql/autopatches/20170410.calendar.01.repair.php @@ -0,0 +1,42 @@ +establishConnection('w'); +$table_name = $table->getTableName(); + +$viewer = PhabricatorUser::getOmnipotentUser(); +$all_events = id(new PhabricatorCalendarEventQuery()) + ->setViewer($viewer) + ->execute(); +foreach ($all_events as $event) { + $id = $event->getID(); + + if (!$event->getInstanceOfEventPHID()) { + // Not a child event, so no instance epoch. + continue; + } + + if ($event->getUTCInstanceEpoch()) { + // Already has an instance epoch. + continue; + } + + try { + $event->updateUTCEpochs(); + } catch (Exception $ex) { + phlog($ex); + continue; + } + + queryfx( + $conn, + 'UPDATE %T SET utcInstanceEpoch = %nd WHERE id = %d', + $table_name, + $event->getUTCInstanceEpoch(), + $id); +} diff --git a/resources/sql/autopatches/20170412.conpherence.01.picturecrop.sql b/resources/sql/autopatches/20170412.conpherence.01.picturecrop.sql new file mode 100644 index 0000000000..760a19f119 --- /dev/null +++ b/resources/sql/autopatches/20170412.conpherence.01.picturecrop.sql @@ -0,0 +1,2 @@ +DELETE FROM {$NAMESPACE}_conpherence.conpherence_transaction + WHERE transactionType = 'picture-crop'; diff --git a/resources/sql/autopatches/20170413.conpherence.01.recentparty.sql b/resources/sql/autopatches/20170413.conpherence.01.recentparty.sql new file mode 100644 index 0000000000..996a058c5b --- /dev/null +++ b/resources/sql/autopatches/20170413.conpherence.01.recentparty.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread + DROP COLUMN recentParticipantPHIDs; diff --git a/resources/sql/autopatches/20170417.files.ngrams.sql b/resources/sql/autopatches/20170417.files.ngrams.sql new file mode 100644 index 0000000000..988b183323 --- /dev/null +++ b/resources/sql/autopatches/20170417.files.ngrams.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_file.file_filename_ngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + KEY `key_object` (objectID), + KEY `key_ngram` (ngram, objectID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170418.1.application.01.xaction.sql b/resources/sql/autopatches/20170418.1.application.01.xaction.sql new file mode 100644 index 0000000000..70868ef2f4 --- /dev/null +++ b/resources/sql/autopatches/20170418.1.application.01.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_application.application_applicationtransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170418.1.application.02.edge.sql b/resources/sql/autopatches/20170418.1.application.02.edge.sql new file mode 100644 index 0000000000..a8f3e1e332 --- /dev/null +++ b/resources/sql/autopatches/20170418.1.application.02.edge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_application.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_application.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170418.files.isDeleted.sql b/resources/sql/autopatches/20170418.files.isDeleted.sql new file mode 100644 index 0000000000..1349e3cbc7 --- /dev/null +++ b/resources/sql/autopatches/20170418.files.isDeleted.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_file.file + ADD isDeleted BOOL NOT NULL DEFAULT 0; diff --git a/resources/sql/autopatches/20170419.app.01.table.sql b/resources/sql/autopatches/20170419.app.01.table.sql new file mode 100644 index 0000000000..257e0b3eb8 --- /dev/null +++ b/resources/sql/autopatches/20170419.app.01.table.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_application.application_application ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170419.thread.01.behind.sql b/resources/sql/autopatches/20170419.thread.01.behind.sql new file mode 100644 index 0000000000..08d27337fd --- /dev/null +++ b/resources/sql/autopatches/20170419.thread.01.behind.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_participant + DROP behindTransactionPHID; diff --git a/resources/sql/autopatches/20170419.thread.02.status.sql b/resources/sql/autopatches/20170419.thread.02.status.sql new file mode 100644 index 0000000000..5f854a4b96 --- /dev/null +++ b/resources/sql/autopatches/20170419.thread.02.status.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_participant + DROP participationStatus; diff --git a/resources/sql/autopatches/20170419.thread.03.touched.sql b/resources/sql/autopatches/20170419.thread.03.touched.sql new file mode 100644 index 0000000000..f6fee00272 --- /dev/null +++ b/resources/sql/autopatches/20170419.thread.03.touched.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_participant + DROP dateTouched; diff --git a/resources/sql/autopatches/20170424.user.01.verify.php b/resources/sql/autopatches/20170424.user.01.verify.php new file mode 100644 index 0000000000..d2bbacd3e0 --- /dev/null +++ b/resources/sql/autopatches/20170424.user.01.verify.php @@ -0,0 +1,34 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $user) { + // Ignore users who are verified. + if ($user->getIsEmailVerified()) { + continue; + } + + // Ignore unverified users with missing (rare) or unverified (common) + // primary emails: it's correct that their accounts are not verified. + $primary = $user->loadPrimaryEmail(); + if (!$primary) { + continue; + } + + if (!$primary->getIsVerified()) { + continue; + } + + queryfx( + $conn, + 'UPDATE %T SET isEmailVerified = 1 WHERE id = %d', + $table->getTableName(), + $user->getID()); + + echo tsprintf( + "%s\n", + pht( + 'Corrected account verification state for user "%s".', + $user->getUsername())); +} diff --git a/resources/sql/autopatches/20170427.owners.01.long.sql b/resources/sql/autopatches/20170427.owners.01.long.sql new file mode 100644 index 0000000000..01a463f52a --- /dev/null +++ b/resources/sql/autopatches/20170427.owners.01.long.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + DROP originalName; diff --git a/resources/sql/autopatches/20170504.1.slowvote.shuffle.sql b/resources/sql/autopatches/20170504.1.slowvote.shuffle.sql new file mode 100644 index 0000000000..5797f3fd5c --- /dev/null +++ b/resources/sql/autopatches/20170504.1.slowvote.shuffle.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_slowvote.slowvote_poll + MODIFY shuffle BOOL NOT NULL DEFAULT 0; diff --git a/resources/sql/autopatches/20170522.nuance.01.itemkey.sql b/resources/sql/autopatches/20170522.nuance.01.itemkey.sql new file mode 100644 index 0000000000..75118205ce --- /dev/null +++ b/resources/sql/autopatches/20170522.nuance.01.itemkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_nuance.nuance_item + MODIFY itemKey VARCHAR(64) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170524.nuance.01.command.sql b/resources/sql/autopatches/20170524.nuance.01.command.sql new file mode 100644 index 0000000000..529756e748 --- /dev/null +++ b/resources/sql/autopatches/20170524.nuance.01.command.sql @@ -0,0 +1,8 @@ +ALTER TABLE {$NAMESPACE}_nuance.nuance_itemcommand + ADD dateCreated INT UNSIGNED NOT NULL; + +ALTER TABLE {$NAMESPACE}_nuance.nuance_itemcommand + ADD dateModified INT UNSIGNED NOT NULL; + +ALTER TABLE {$NAMESPACE}_nuance.nuance_itemcommand + ADD queuePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20170524.nuance.02.commandstatus.sql b/resources/sql/autopatches/20170524.nuance.02.commandstatus.sql new file mode 100644 index 0000000000..14f57af053 --- /dev/null +++ b/resources/sql/autopatches/20170524.nuance.02.commandstatus.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_nuance.nuance_itemcommand + ADD status VARCHAR(64) NOT NULL; + +UPDATE {$NAMESPACE}_nuance.nuance_itemcommand + SET status = 'done' WHERE status = ''; diff --git a/resources/sql/autopatches/20170526.dropdifferentialdrafts.sql b/resources/sql/autopatches/20170526.dropdifferentialdrafts.sql new file mode 100644 index 0000000000..057bcb0d90 --- /dev/null +++ b/resources/sql/autopatches/20170526.dropdifferentialdrafts.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_differential.differential_draft; diff --git a/resources/sql/autopatches/20170526.milestones.php b/resources/sql/autopatches/20170526.milestones.php new file mode 100644 index 0000000000..623ba7bf6a --- /dev/null +++ b/resources/sql/autopatches/20170526.milestones.php @@ -0,0 +1,3 @@ +getTransactionType(); + + if ($txn_type == 'mergedinto') { + // dupe handling as implemented in D10427, which creates a specific txn + $add_edges[] = array( + 'src' => $txn->getObjectPHID(), + 'dst' => $txn->getNewValue(), + ); + } else if ($txn_type == 'status' && $txn->getNewValue() == 'duplicate') { + // dupe handling as originally implemented, which just changes the status + // and adds a comment + $src_phid = $txn->getObjectPHID(); + + // get all the comment transactions associated with this task + $viewer = PhabricatorUser::getOmnipotentUser(); + $comment_txns = id(new ManiphestTransactionQuery()) + ->setViewer($viewer) + ->withObjectPHIDs(array($src_phid)) + ->needComments(true) + ->execute(); + + // check each comment, looking for the "Merged Into" message + foreach ($comment_txns as $comment_txn) { + if ($comment_txn->hasComment()) { + $comment = $comment_txn->getComment()->getContent(); + $pattern = '/^\xE2\x9C\x98 Merged into T(\d+)\.$/'; + $matches = array(); + + if (preg_match($pattern, $comment, $matches)) { + $dst_task = id(new ManiphestTaskQuery()) + ->setViewer($viewer) + ->withIDs(array($matches[1])) + ->executeOne(); + + if ($dst_task) { + $dst_phid = $dst_task->getPHID(); + $add_edges[] = array( + 'src' => $src_phid, + 'dst' => $dst_phid, + ); + } + } + } + } + } +} + +if ($add_edges) { + foreach ($add_edges as $edge) { + $src_phid = $edge['src']; + $dst_phid = $edge['dst']; + + $type = ManiphestTaskIsDuplicateOfTaskEdgeType::EDGECONST; + try { + $editor = id(new PhabricatorEdgeEditor()) + ->addEdge($src_phid, $type, $dst_phid) + ->save(); + } catch (PhabricatorEdgeCycleException $ex) { + // Some earlier or later merge made this invalid, just skip it. + } + } +} diff --git a/resources/sql/autopatches/20170612.repository.image.01.sql b/resources/sql/autopatches/20170612.repository.image.01.sql new file mode 100644 index 0000000000..662c398855 --- /dev/null +++ b/resources/sql/autopatches/20170612.repository.image.01.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository + ADD profileImagePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20170614.taskstatus.sql b/resources/sql/autopatches/20170614.taskstatus.sql new file mode 100644 index 0000000000..2543632093 --- /dev/null +++ b/resources/sql/autopatches/20170614.taskstatus.sql @@ -0,0 +1,4 @@ +/* Extend from 12 characters to 64. */ + +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + CHANGE status status VARCHAR(64) COLLATE {$COLLATE_TEXT} NOT NULL; diff --git a/resources/sql/autopatches/20170725.legalpad.date.01.sql b/resources/sql/autopatches/20170725.legalpad.date.01.sql new file mode 100644 index 0000000000..a091220894 --- /dev/null +++ b/resources/sql/autopatches/20170725.legalpad.date.01.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_legalpad.legalpad_documentbody + SET dateCreated = dateModified; diff --git a/resources/sql/autopatches/20170811.differential.01.status.php b/resources/sql/autopatches/20170811.differential.01.status.php new file mode 100644 index 0000000000..9d57d033af --- /dev/null +++ b/resources/sql/autopatches/20170811.differential.01.status.php @@ -0,0 +1,48 @@ +" +// control with hard-coded status groups for status selection to using a +// tokenizer with status functions. + +$table = new PhabricatorSavedQuery(); +$conn = $table->establishConnection('w'); + +$status_map = array( + 'status-open' => array('open()'), + 'status-closed' => array('closed()'), + + 'status-accepted' => array('accepted'), + 'status-needs-review' => array('needs-review'), + 'status-needs-revision' => array('needs-revision'), + 'status-abandoned' => array('abandoned'), +); + +foreach (new LiskMigrationIterator($table) as $query) { + if ($query->getEngineClassName() !== 'DifferentialRevisionSearchEngine') { + // This isn't a revision query. + continue; + } + + $parameters = $query->getParameters(); + $status = idx($parameters, 'status'); + + if (!$status) { + // This query didn't specify a "status" value. + continue; + } + + if (!isset($status_map[$status])) { + // The "status" value is unknown, or does not correspond to a + // modern "status" constraint. + continue; + } + + $parameters['statuses'] = $status_map[$status]; + + queryfx( + $conn, + 'UPDATE %T SET parameters = %s WHERE id = %d', + $table->getTableName(), + phutil_json_encode($parameters), + $query->getID()); +} diff --git a/resources/sql/autopatches/20170811.differential.02.modernstatus.sql b/resources/sql/autopatches/20170811.differential.02.modernstatus.sql new file mode 100644 index 0000000000..a305206411 --- /dev/null +++ b/resources/sql/autopatches/20170811.differential.02.modernstatus.sql @@ -0,0 +1,17 @@ +UPDATE {$NAMESPACE}_differential.differential_revision + SET status = "needs-review" WHERE status = "0"; + +UPDATE {$NAMESPACE}_differential.differential_revision + SET status = "needs-revision" WHERE status = "1"; + +UPDATE {$NAMESPACE}_differential.differential_revision + SET status = "accepted" WHERE status = "2"; + +UPDATE {$NAMESPACE}_differential.differential_revision + SET status = "published" WHERE status = "3"; + +UPDATE {$NAMESPACE}_differential.differential_revision + SET status = "abandoned" WHERE status = "4"; + +UPDATE {$NAMESPACE}_differential.differential_revision + SET status = "changes-planned" WHERE status = "5"; diff --git a/resources/sql/autopatches/20170811.differential.03.modernxaction.php b/resources/sql/autopatches/20170811.differential.03.modernxaction.php new file mode 100644 index 0000000000..e84e3ce95b --- /dev/null +++ b/resources/sql/autopatches/20170811.differential.03.modernxaction.php @@ -0,0 +1,38 @@ + 'needs-review', + '1' => 'needs-revision', + '2' => 'accepted', + '3' => 'published', + '4' => 'abandoned', + '5' => 'changes-planned', +); + +$table = new DifferentialTransaction(); +$conn = $table->establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $xaction) { + $type = $xaction->getTransactionType(); + + if (($type != 'differential:status') && + ($type != 'differential.revision.status')) { + continue; + } + + $old = $xaction->getOldValue(); + $new = $xaction->getNewValue(); + + $old = idx($map, $old, $old); + $new = idx($map, $new, $new); + + queryfx( + $conn, + 'UPDATE %T SET transactionType = %s, oldValue = %s, newValue = %s + WHERE id = %d', + $table->getTableName(), + 'differential.revision.status', + json_encode($old), + json_encode($new), + $xaction->getID()); +} diff --git a/resources/sql/autopatches/20170814.search.01.qconfig.sql b/resources/sql/autopatches/20170814.search.01.qconfig.sql new file mode 100644 index 0000000000..7914336dc4 --- /dev/null +++ b/resources/sql/autopatches/20170814.search.01.qconfig.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_search.search_namedqueryconfig ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + engineClassName VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT}, + scopePHID VARBINARY(64) NOT NULL, + properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_scope` (engineClassName, scopePHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170820.phame.01.post.views.sql b/resources/sql/autopatches/20170820.phame.01.post.views.sql new file mode 100644 index 0000000000..f5f72294f6 --- /dev/null +++ b/resources/sql/autopatches/20170820.phame.01.post.views.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_post + ADD views INTEGER NOT NULL; diff --git a/resources/sql/autopatches/20170820.phame.02.post.views.sql b/resources/sql/autopatches/20170820.phame.02.post.views.sql new file mode 100644 index 0000000000..00b9b29203 --- /dev/null +++ b/resources/sql/autopatches/20170820.phame.02.post.views.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_phame.phame_post + SET views = 0; diff --git a/resources/sql/autopatches/20170824.search.01.saved.php b/resources/sql/autopatches/20170824.search.01.saved.php new file mode 100644 index 0000000000..ab1485ebd5 --- /dev/null +++ b/resources/sql/autopatches/20170824.search.01.saved.php @@ -0,0 +1,46 @@ +establishConnection('w'); + +$config_table = new PhabricatorNamedQueryConfig(); + +foreach (new LiskMigrationIterator($table) as $named_query) { + + // If this isn't a builtin query, it isn't changing. Leave it alone. + if (!$named_query->getIsBuiltin()) { + continue; + } + + // If the user reordered things but left a builtin query at the top, pin + // the query before we remove the row. + if ($named_query->getSequence() == 1) { + queryfx( + $conn, + 'INSERT IGNORE INTO %T + (engineClassName, scopePHID, properties, dateCreated, dateModified) + VALUES + (%s, %s, %s, %d, %d)', + $config_table->getTableName(), + $named_query->getEngineClassName(), + $named_query->getUserPHID(), + phutil_json_encode( + array( + PhabricatorNamedQueryConfig::PROPERTY_PINNED => + $named_query->getQueryKey(), + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); + } + + $named_query->delete(); +} diff --git a/resources/sql/autopatches/20170825.phame.01.post.views.sql b/resources/sql/autopatches/20170825.phame.01.post.views.sql new file mode 100644 index 0000000000..5cb5c9c7b6 --- /dev/null +++ b/resources/sql/autopatches/20170825.phame.01.post.views.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_post + DROP COLUMN views; diff --git a/resources/sql/autopatches/20170828.ferret.01.taskdoc.sql b/resources/sql/autopatches/20170828.ferret.01.taskdoc.sql new file mode 100644 index 0000000000..8cb6835602 --- /dev/null +++ b/resources/sql/autopatches/20170828.ferret.01.taskdoc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_maniphest.maniphest_task_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170828.ferret.02.taskfield.sql b/resources/sql/autopatches/20170828.ferret.02.taskfield.sql new file mode 100644 index 0000000000..5528feec8f --- /dev/null +++ b/resources/sql/autopatches/20170828.ferret.02.taskfield.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_maniphest.maniphest_task_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170828.ferret.03.taskngrams.sql b/resources/sql/autopatches/20170828.ferret.03.taskngrams.sql new file mode 100644 index 0000000000..a7b5180642 --- /dev/null +++ b/resources/sql/autopatches/20170828.ferret.03.taskngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_maniphest.maniphest_task_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170830.ferret.01.unique.sql b/resources/sql/autopatches/20170830.ferret.01.unique.sql new file mode 100644 index 0000000000..f76c5050e8 --- /dev/null +++ b/resources/sql/autopatches/20170830.ferret.01.unique.sql @@ -0,0 +1,4 @@ +TRUNCATE TABLE {$NAMESPACE}_maniphest.maniphest_task_ffield; + +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task_ffield + ADD UNIQUE KEY `key_documentfield` (documentID, fieldKey); diff --git a/resources/sql/autopatches/20170830.ferret.02.term.sql b/resources/sql/autopatches/20170830.ferret.02.term.sql new file mode 100644 index 0000000000..81a619d85d --- /dev/null +++ b/resources/sql/autopatches/20170830.ferret.02.term.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task_ffield + ADD termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}; diff --git a/resources/sql/autopatches/20170905.ferret.01.diff.doc.sql b/resources/sql/autopatches/20170905.ferret.01.diff.doc.sql new file mode 100644 index 0000000000..9fdadbf11c --- /dev/null +++ b/resources/sql/autopatches/20170905.ferret.01.diff.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_differential.differential_revision_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170905.ferret.02.diff.field.sql b/resources/sql/autopatches/20170905.ferret.02.diff.field.sql new file mode 100644 index 0000000000..ff5f065a39 --- /dev/null +++ b/resources/sql/autopatches/20170905.ferret.02.diff.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_differential.differential_revision_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170905.ferret.03.diff.ngrams.sql b/resources/sql/autopatches/20170905.ferret.03.diff.ngrams.sql new file mode 100644 index 0000000000..ec12354e38 --- /dev/null +++ b/resources/sql/autopatches/20170905.ferret.03.diff.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_differential.differential_revision_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.01.user.doc.sql b/resources/sql/autopatches/20170907.ferret.01.user.doc.sql new file mode 100644 index 0000000000..39496a0de0 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.01.user.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_user.user_user_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.02.user.field.sql b/resources/sql/autopatches/20170907.ferret.02.user.field.sql new file mode 100644 index 0000000000..3179e58e5b --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.02.user.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_user.user_user_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.03.user.ngrams.sql b/resources/sql/autopatches/20170907.ferret.03.user.ngrams.sql new file mode 100644 index 0000000000..2105a7b7af --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.03.user.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_user.user_user_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.04.fund.doc.sql b/resources/sql/autopatches/20170907.ferret.04.fund.doc.sql new file mode 100644 index 0000000000..a7f8324594 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.04.fund.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_fund.fund_initiative_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.05.fund.field.sql b/resources/sql/autopatches/20170907.ferret.05.fund.field.sql new file mode 100644 index 0000000000..b8c544c2a7 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.05.fund.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_fund.fund_initiative_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.06.fund.ngrams.sql b/resources/sql/autopatches/20170907.ferret.06.fund.ngrams.sql new file mode 100644 index 0000000000..a509087bae --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.06.fund.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_fund.fund_initiative_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.07.passphrase.doc.sql b/resources/sql/autopatches/20170907.ferret.07.passphrase.doc.sql new file mode 100644 index 0000000000..6787528d0e --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.07.passphrase.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_passphrase.passphrase_credential_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.08.passphrase.field.sql b/resources/sql/autopatches/20170907.ferret.08.passphrase.field.sql new file mode 100644 index 0000000000..6dc62d477e --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.08.passphrase.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_passphrase.passphrase_credential_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.09.passphrase.ngrams.sql b/resources/sql/autopatches/20170907.ferret.09.passphrase.ngrams.sql new file mode 100644 index 0000000000..2b64beb7ed --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.09.passphrase.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_passphrase.passphrase_credential_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.10.owners.doc.sql b/resources/sql/autopatches/20170907.ferret.10.owners.doc.sql new file mode 100644 index 0000000000..aaaa36623b --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.10.owners.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_owners.owners_package_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.11.owners.field.sql b/resources/sql/autopatches/20170907.ferret.11.owners.field.sql new file mode 100644 index 0000000000..ebd72806f4 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.11.owners.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_owners.owners_package_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.12.owners.ngrams.sql b/resources/sql/autopatches/20170907.ferret.12.owners.ngrams.sql new file mode 100644 index 0000000000..0f8c6865bf --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.12.owners.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_owners.owners_package_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.13.blog.doc.sql b/resources/sql/autopatches/20170907.ferret.13.blog.doc.sql new file mode 100644 index 0000000000..d75232fae1 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.13.blog.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_phame.phame_blog_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.14.blog.field.sql b/resources/sql/autopatches/20170907.ferret.14.blog.field.sql new file mode 100644 index 0000000000..9982914229 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.14.blog.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_phame.phame_blog_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.15.blog.ngrams.sql b/resources/sql/autopatches/20170907.ferret.15.blog.ngrams.sql new file mode 100644 index 0000000000..b20bb8fcbb --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.15.blog.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_phame.phame_blog_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.16.post.doc.sql b/resources/sql/autopatches/20170907.ferret.16.post.doc.sql new file mode 100644 index 0000000000..9f9155aa49 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.16.post.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_phame.phame_post_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.17.post.field.sql b/resources/sql/autopatches/20170907.ferret.17.post.field.sql new file mode 100644 index 0000000000..26d729d05d --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.17.post.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_phame.phame_post_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.18.post.ngrams.sql b/resources/sql/autopatches/20170907.ferret.18.post.ngrams.sql new file mode 100644 index 0000000000..18e534e948 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.18.post.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_phame.phame_post_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.19.project.doc.sql b/resources/sql/autopatches/20170907.ferret.19.project.doc.sql new file mode 100644 index 0000000000..26272439cf --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.19.project.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_project.project_project_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.20.project.field.sql b/resources/sql/autopatches/20170907.ferret.20.project.field.sql new file mode 100644 index 0000000000..36514eb55d --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.20.project.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_project.project_project_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.21.project.ngrams.sql b/resources/sql/autopatches/20170907.ferret.21.project.ngrams.sql new file mode 100644 index 0000000000..dec12b0e56 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.21.project.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_project.project_project_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.22.phriction.doc.sql b/resources/sql/autopatches/20170907.ferret.22.phriction.doc.sql new file mode 100644 index 0000000000..9de7124255 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.22.phriction.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_phriction.phriction_document_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.23.phriction.field.sql b/resources/sql/autopatches/20170907.ferret.23.phriction.field.sql new file mode 100644 index 0000000000..0fc5b959d1 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.23.phriction.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_phriction.phriction_document_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.24.phriction.ngrams.sql b/resources/sql/autopatches/20170907.ferret.24.phriction.ngrams.sql new file mode 100644 index 0000000000..abbb90a1e4 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.24.phriction.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_phriction.phriction_document_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.25.event.doc.sql b/resources/sql/autopatches/20170907.ferret.25.event.doc.sql new file mode 100644 index 0000000000..d7298fad31 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.25.event.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_calendar.calendar_event_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.26.event.field.sql b/resources/sql/autopatches/20170907.ferret.26.event.field.sql new file mode 100644 index 0000000000..2ec76c3511 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.26.event.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_calendar.calendar_event_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.27.event.ngrams.sql b/resources/sql/autopatches/20170907.ferret.27.event.ngrams.sql new file mode 100644 index 0000000000..e802e2d97e --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.27.event.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_calendar.calendar_event_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.28.mock.doc.sql b/resources/sql/autopatches/20170907.ferret.28.mock.doc.sql new file mode 100644 index 0000000000..eb80ef3937 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.28.mock.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_pholio.pholio_mock_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.29.mock.field.sql b/resources/sql/autopatches/20170907.ferret.29.mock.field.sql new file mode 100644 index 0000000000..0cb0e97d05 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.29.mock.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_pholio.pholio_mock_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.30.mock.ngrams.sql b/resources/sql/autopatches/20170907.ferret.30.mock.ngrams.sql new file mode 100644 index 0000000000..e343ccf83b --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.30.mock.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_pholio.pholio_mock_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.31.repo.doc.sql b/resources/sql/autopatches/20170907.ferret.31.repo.doc.sql new file mode 100644 index 0000000000..4f37de60be --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.31.repo.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_repository_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.32.repo.field.sql b/resources/sql/autopatches/20170907.ferret.32.repo.field.sql new file mode 100644 index 0000000000..c7d75eb29d --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.32.repo.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_repository_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.33.repo.ngrams.sql b/resources/sql/autopatches/20170907.ferret.33.repo.ngrams.sql new file mode 100644 index 0000000000..db7ad4f3a0 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.33.repo.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_repository_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.34.commit.doc.sql b/resources/sql/autopatches/20170907.ferret.34.commit.doc.sql new file mode 100644 index 0000000000..9c275b09b7 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.34.commit.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_commit_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.35.commit.field.sql b/resources/sql/autopatches/20170907.ferret.35.commit.field.sql new file mode 100644 index 0000000000..c2520b693b --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.35.commit.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_commit_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170907.ferret.36.commit.ngrams.sql b/resources/sql/autopatches/20170907.ferret.36.commit.ngrams.sql new file mode 100644 index 0000000000..32ed2275c3 --- /dev/null +++ b/resources/sql/autopatches/20170907.ferret.36.commit.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_commit_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170912.ferret.01.activity.php b/resources/sql/autopatches/20170912.ferret.01.activity.php new file mode 100644 index 0000000000..cafd60c928 --- /dev/null +++ b/resources/sql/autopatches/20170912.ferret.01.activity.php @@ -0,0 +1,19 @@ +loadAllWhere('1 = 1 LIMIT 1'); +if (!$users) { + return; +} + +try { + id(new PhabricatorConfigManualActivity()) + ->setActivityType(PhabricatorConfigManualActivity::TYPE_REINDEX) + ->save(); +} catch (AphrontDuplicateKeyQueryException $ex) { + // If we've already noted that this activity is required, just move on. +} diff --git a/resources/sql/autopatches/20170914.ref.01.position.sql b/resources/sql/autopatches/20170914.ref.01.position.sql new file mode 100644 index 0000000000..2d0a505d17 --- /dev/null +++ b/resources/sql/autopatches/20170914.ref.01.position.sql @@ -0,0 +1,6 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_refposition ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + cursorID INT UNSIGNED NOT NULL, + commitIdentifier VARCHAR(40) NOT NULL COLLATE {$COLLATE_TEXT}, + isClosed BOOL NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20170915.ref.01.migrate.php b/resources/sql/autopatches/20170915.ref.01.migrate.php new file mode 100644 index 0000000000..21102fa4ab --- /dev/null +++ b/resources/sql/autopatches/20170915.ref.01.migrate.php @@ -0,0 +1,71 @@ +establishConnection('w'); + +$map = array(); +foreach (new LiskMigrationIterator($table) as $ref) { + $repository_phid = $ref->getRepositoryPHID(); + $ref_type = $ref->getRefType(); + $ref_hash = $ref->getRefNameHash(); + + $ref_key = "{$repository_phid}/{$ref_type}/{$ref_hash}"; + + if (!isset($map[$ref_key])) { + $map[$ref_key] = array( + 'id' => $ref->getID(), + 'type' => $ref_type, + 'hash' => $ref_hash, + 'repositoryPHID' => $repository_phid, + 'positions' => array(), + ); + } + + // NOTE: When this migration runs, the table will have "commitIdentifier" and + // "isClosed" fields. Later, it won't. Since they'll be removed, we can't + // rely on being able to access them via the object. Instead, run a separate + // raw query to read them. + + $row = queryfx_one( + $conn, + 'SELECT commitIdentifier, isClosed FROM %T WHERE id = %d', + $ref->getTableName(), + $ref->getID()); + + $map[$ref_key]['positions'][] = array( + 'identifier' => $row['commitIdentifier'], + 'isClosed' => (int)$row['isClosed'], + ); +} + +// Now, write all the position rows. +$position_table = new PhabricatorRepositoryRefPosition(); +foreach ($map as $ref_key => $spec) { + $id = $spec['id']; + foreach ($spec['positions'] as $position) { + queryfx( + $conn, + 'INSERT IGNORE INTO %T (cursorID, commitIdentifier, isClosed) + VALUES (%d, %s, %d)', + $position_table->getTableName(), + $id, + $position['identifier'], + $position['isClosed']); + } +} + +// Finally, delete all the redundant RefCursor rows (rows with the same name) +// so we can add proper unique keys in the next migration. +foreach ($map as $ref_key => $spec) { + queryfx( + $conn, + 'DELETE FROM %T WHERE refType = %s + AND refNameHash = %s + AND repositoryPHID = %s + AND id != %d', + $table->getTableName(), + $spec['type'], + $spec['hash'], + $spec['repositoryPHID'], + $spec['id']); +} diff --git a/resources/sql/autopatches/20170915.ref.02.drop.id.sql b/resources/sql/autopatches/20170915.ref.02.drop.id.sql new file mode 100644 index 0000000000..177fde3b6a --- /dev/null +++ b/resources/sql/autopatches/20170915.ref.02.drop.id.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_refcursor + DROP COLUMN commitIdentifier; diff --git a/resources/sql/autopatches/20170915.ref.03.drop.closed.sql b/resources/sql/autopatches/20170915.ref.03.drop.closed.sql new file mode 100644 index 0000000000..927ee04b65 --- /dev/null +++ b/resources/sql/autopatches/20170915.ref.03.drop.closed.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_refcursor + DROP COLUMN isClosed; diff --git a/resources/sql/autopatches/20170915.ref.04.uniq.sql b/resources/sql/autopatches/20170915.ref.04.uniq.sql new file mode 100644 index 0000000000..0bef69fc4a --- /dev/null +++ b/resources/sql/autopatches/20170915.ref.04.uniq.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_refcursor + ADD UNIQUE KEY `key_ref` (repositoryPHID, refType, refNameHash); diff --git a/resources/sql/autopatches/20170918.ref.01.position.php b/resources/sql/autopatches/20170918.ref.01.position.php new file mode 100644 index 0000000000..f95eb8d406 --- /dev/null +++ b/resources/sql/autopatches/20170918.ref.01.position.php @@ -0,0 +1,52 @@ +establishConnection('w'); +$key_name = 'key_position'; + +try { + queryfx( + $conn, + 'ALTER TABLE %T DROP KEY %T', + $table->getTableName(), + $key_name); +} catch (AphrontQueryException $ex) { + // This key may or may not exist, depending on exactly when the install + // ran previous migrations and adjustments. We're just dropping it if it + // does exist. + + // We're doing this first (outside of the lock) because the MySQL + // documentation says "if you ALTER TABLE a locked table, it may become + // unlocked". +} + +queryfx( + $conn, + 'LOCK TABLES %T WRITE', + $table->getTableName()); + +$seen = array(); +foreach (new LiskMigrationIterator($table) as $position) { + $cursor_id = $position->getCursorID(); + $hash = $position->getCommitIdentifier(); + + // If this is the first copy of this row we've seen, mark it as seen and + // move on. + if (empty($seen[$cursor_id][$hash])) { + $seen[$cursor_id][$hash] = true; + continue; + } + + // Otherwise, get rid of this row as it duplicates a row we saw previously. + $position->delete(); +} + +queryfx( + $conn, + 'ALTER TABLE %T ADD UNIQUE KEY %T (cursorID, commitIdentifier)', + $table->getTableName(), + $key_name); + +queryfx( + $conn, + 'UNLOCK TABLES'); diff --git a/resources/sql/autopatches/20171002.cngram.01.maniphest.sql b/resources/sql/autopatches/20171002.cngram.01.maniphest.sql new file mode 100644 index 0000000000..9b275f5b45 --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.01.maniphest.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_maniphest.maniphest_task_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.02.event.sql b/resources/sql/autopatches/20171002.cngram.02.event.sql new file mode 100644 index 0000000000..a071fdcd19 --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.02.event.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_calendar.calendar_event_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.03.revision.sql b/resources/sql/autopatches/20171002.cngram.03.revision.sql new file mode 100644 index 0000000000..40c2450598 --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.03.revision.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_differential.differential_revision_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.04.fund.sql b/resources/sql/autopatches/20171002.cngram.04.fund.sql new file mode 100644 index 0000000000..34975ce4fb --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.04.fund.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_fund.fund_initiative_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.05.owners.sql b/resources/sql/autopatches/20171002.cngram.05.owners.sql new file mode 100644 index 0000000000..e98d29f87c --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.05.owners.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_owners.owners_package_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.06.passphrase.sql b/resources/sql/autopatches/20171002.cngram.06.passphrase.sql new file mode 100644 index 0000000000..f9afa9ad87 --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.06.passphrase.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_passphrase.passphrase_credential_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.07.blog.sql b/resources/sql/autopatches/20171002.cngram.07.blog.sql new file mode 100644 index 0000000000..34001c3608 --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.07.blog.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_phame.phame_blog_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.08.post.sql b/resources/sql/autopatches/20171002.cngram.08.post.sql new file mode 100644 index 0000000000..9a9c70867e --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.08.post.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_phame.phame_post_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.09.pholio.sql b/resources/sql/autopatches/20171002.cngram.09.pholio.sql new file mode 100644 index 0000000000..6e8b8f8dcc --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.09.pholio.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_pholio.pholio_mock_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.10.phriction.sql b/resources/sql/autopatches/20171002.cngram.10.phriction.sql new file mode 100644 index 0000000000..ed31dc30ba --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.10.phriction.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_phriction.phriction_document_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.11.project.sql b/resources/sql/autopatches/20171002.cngram.11.project.sql new file mode 100644 index 0000000000..9c11235ba7 --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.11.project.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_project.project_project_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.12.user.sql b/resources/sql/autopatches/20171002.cngram.12.user.sql new file mode 100644 index 0000000000..3e8499aaa6 --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.12.user.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_user.user_user_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.13.repository.sql b/resources/sql/autopatches/20171002.cngram.13.repository.sql new file mode 100644 index 0000000000..e406c44edf --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.13.repository.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_repository_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171002.cngram.14.commit.sql b/resources/sql/autopatches/20171002.cngram.14.commit.sql new file mode 100644 index 0000000000..48c1a02594 --- /dev/null +++ b/resources/sql/autopatches/20171002.cngram.14.commit.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_commit_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171026.ferret.01.ponder.doc.sql b/resources/sql/autopatches/20171026.ferret.01.ponder.doc.sql new file mode 100644 index 0000000000..38c86a4134 --- /dev/null +++ b/resources/sql/autopatches/20171026.ferret.01.ponder.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_ponder.ponder_question_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171026.ferret.02.ponder.field.sql b/resources/sql/autopatches/20171026.ferret.02.ponder.field.sql new file mode 100644 index 0000000000..871f0d8f5b --- /dev/null +++ b/resources/sql/autopatches/20171026.ferret.02.ponder.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_ponder.ponder_question_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171026.ferret.03.ponder.ngrams.sql b/resources/sql/autopatches/20171026.ferret.03.ponder.ngrams.sql new file mode 100644 index 0000000000..3d2a3024b8 --- /dev/null +++ b/resources/sql/autopatches/20171026.ferret.03.ponder.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_ponder.ponder_question_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171026.ferret.04.ponder.cngrams.sql b/resources/sql/autopatches/20171026.ferret.04.ponder.cngrams.sql new file mode 100644 index 0000000000..49b66e0d39 --- /dev/null +++ b/resources/sql/autopatches/20171026.ferret.04.ponder.cngrams.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_ponder.ponder_question_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20171026.ferret.05.ponder.index.php b/resources/sql/autopatches/20171026.ferret.05.ponder.index.php new file mode 100644 index 0000000000..623ba7bf6a --- /dev/null +++ b/resources/sql/autopatches/20171026.ferret.05.ponder.index.php @@ -0,0 +1,3 @@ +establishConnection('w'); +$diff_table = new DifferentialDiff(); + +foreach (new LiskMigrationIterator($table) as $revision) { + $revision_id = $revision->getID(); + + $diff_row = queryfx_one( + $conn, + 'SELECT phid FROM %T WHERE revisionID = %d ORDER BY id DESC LIMIT 1', + $diff_table->getTableName(), + $revision_id); + + if ($diff_row) { + queryfx( + $conn, + 'UPDATE %T SET activeDiffPHID = %s WHERE id = %d', + $table->getTableName(), + $diff_row['phid'], + $revision_id); + } +} diff --git a/resources/sql/autopatches/20180119.bulk.01.silent.sql b/resources/sql/autopatches/20180119.bulk.01.silent.sql new file mode 100644 index 0000000000..b426de953d --- /dev/null +++ b/resources/sql/autopatches/20180119.bulk.01.silent.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_worker.worker_bulkjob + ADD isSilent BOOL NOT NULL; diff --git a/resources/sql/autopatches/20180120.auth.01.password.sql b/resources/sql/autopatches/20180120.auth.01.password.sql new file mode 100644 index 0000000000..679d50c5b1 --- /dev/null +++ b/resources/sql/autopatches/20180120.auth.01.password.sql @@ -0,0 +1,10 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_password ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + passwordType VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + passwordHash VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT}, + isRevoked BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180120.auth.02.passwordxaction.sql b/resources/sql/autopatches/20180120.auth.02.passwordxaction.sql new file mode 100644 index 0000000000..1d4f075b87 --- /dev/null +++ b/resources/sql/autopatches/20180120.auth.02.passwordxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_passwordtransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180120.auth.03.vcsdata.sql b/resources/sql/autopatches/20180120.auth.03.vcsdata.sql new file mode 100644 index 0000000000..0cf73f84d9 --- /dev/null +++ b/resources/sql/autopatches/20180120.auth.03.vcsdata.sql @@ -0,0 +1,6 @@ +INSERT INTO {$NAMESPACE}_auth.auth_password + (objectPHID, phid, passwordType, passwordHash, isRevoked, + dateCreated, dateModified) + SELECT userPHID, CONCAT('XVCS', id), 'vcs', passwordHash, 0, + dateCreated, dateModified + FROM {$NAMESPACE}_repository.repository_vcspassword; diff --git a/resources/sql/autopatches/20180120.auth.04.vcsphid.php b/resources/sql/autopatches/20180120.auth.04.vcsphid.php new file mode 100644 index 0000000000..0a5dd0f067 --- /dev/null +++ b/resources/sql/autopatches/20180120.auth.04.vcsphid.php @@ -0,0 +1,24 @@ +establishConnection('w'); + +$password_type = PhabricatorAuthPasswordPHIDType::TYPECONST; + +foreach (new LiskMigrationIterator($table) as $row) { + if (phid_get_type($row->getPHID()) == $password_type) { + continue; + } + + $new_phid = $row->generatePHID(); + + queryfx( + $conn, + 'UPDATE %T SET phid = %s WHERE id = %d', + $table->getTableName(), + $new_phid, + $row->getID()); +} diff --git a/resources/sql/autopatches/20180121.auth.01.vcsnuke.sql b/resources/sql/autopatches/20180121.auth.01.vcsnuke.sql new file mode 100644 index 0000000000..b106a2ddd7 --- /dev/null +++ b/resources/sql/autopatches/20180121.auth.01.vcsnuke.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_repository.repository_vcspassword; diff --git a/resources/sql/autopatches/20180121.auth.02.passsalt.sql b/resources/sql/autopatches/20180121.auth.02.passsalt.sql new file mode 100644 index 0000000000..78ee953ea4 --- /dev/null +++ b/resources/sql/autopatches/20180121.auth.02.passsalt.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_password + ADD passwordSalt VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180121.auth.03.accountdata.sql b/resources/sql/autopatches/20180121.auth.03.accountdata.sql new file mode 100644 index 0000000000..cbb4dc2a50 --- /dev/null +++ b/resources/sql/autopatches/20180121.auth.03.accountdata.sql @@ -0,0 +1,7 @@ +INSERT INTO {$NAMESPACE}_auth.auth_password + (objectPHID, phid, passwordType, passwordHash, passwordSalt, isRevoked, + dateCreated, dateModified) + SELECT phid, CONCAT('XACCOUNT', id), 'account', passwordHash, passwordSalt, 0, + dateCreated, dateModified + FROM {$NAMESPACE}_user.user + WHERE passwordHash != ''; diff --git a/resources/sql/autopatches/20180121.auth.04.accountphid.php b/resources/sql/autopatches/20180121.auth.04.accountphid.php new file mode 100644 index 0000000000..e0ebc04f4b --- /dev/null +++ b/resources/sql/autopatches/20180121.auth.04.accountphid.php @@ -0,0 +1,24 @@ +establishConnection('w'); + +$password_type = PhabricatorAuthPasswordPHIDType::TYPECONST; + +foreach (new LiskMigrationIterator($table) as $row) { + if (phid_get_type($row->getPHID()) == $password_type) { + continue; + } + + $new_phid = $row->generatePHID(); + + queryfx( + $conn, + 'UPDATE %T SET phid = %s WHERE id = %d', + $table->getTableName(), + $new_phid, + $row->getID()); +} diff --git a/resources/sql/autopatches/20180121.auth.05.accountnuke.sql b/resources/sql/autopatches/20180121.auth.05.accountnuke.sql new file mode 100644 index 0000000000..c8dc50bcf2 --- /dev/null +++ b/resources/sql/autopatches/20180121.auth.05.accountnuke.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_user.user + DROP passwordSalt; + +ALTER TABLE {$NAMESPACE}_user.user + DROP passwordHash; diff --git a/resources/sql/autopatches/20180121.auth.06.legacydigest.sql b/resources/sql/autopatches/20180121.auth.06.legacydigest.sql new file mode 100644 index 0000000000..af9c7990d0 --- /dev/null +++ b/resources/sql/autopatches/20180121.auth.06.legacydigest.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_password + ADD legacyDigestFormat VARCHAR(32) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180121.auth.07.marklegacy.sql b/resources/sql/autopatches/20180121.auth.07.marklegacy.sql new file mode 100644 index 0000000000..798757d348 --- /dev/null +++ b/resources/sql/autopatches/20180121.auth.07.marklegacy.sql @@ -0,0 +1,4 @@ +UPDATE {$NAMESPACE}_auth.auth_password + SET legacyDigestFormat = 'v1' + WHERE passwordType IN ('vcs', 'account') + AND legacyDigestFormat IS NULL; diff --git a/resources/sql/autopatches/20180124.herald.01.repetition.sql b/resources/sql/autopatches/20180124.herald.01.repetition.sql new file mode 100644 index 0000000000..31f1477e01 --- /dev/null +++ b/resources/sql/autopatches/20180124.herald.01.repetition.sql @@ -0,0 +1,26 @@ +/* This column was previously "uint32?" with these values: + + 1: run every time + 0: run only the first time + +*/ + +UPDATE {$NAMESPACE}_herald.herald_rule + SET repetitionPolicy = '1' + WHERE repetitionPolicy IS NULL; + +ALTER TABLE {$NAMESPACE}_herald.herald_rule + CHANGE repetitionPolicy + repetitionPolicy VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; + +/* If the old value was "0", the new value is "first". */ + +UPDATE {$NAMESPACE}_herald.herald_rule + SET repetitionPolicy = 'first' + WHERE repetitionPolicy = '0'; + +/* If the old value was anything else, the new value is "every". */ + +UPDATE {$NAMESPACE}_herald.herald_rule + SET repetitionPolicy = 'every' + WHERE repetitionPolicy NOT IN ('first', '0'); diff --git a/resources/sql/autopatches/20180207.mail.01.task.sql b/resources/sql/autopatches/20180207.mail.01.task.sql new file mode 100644 index 0000000000..f04b90c809 --- /dev/null +++ b/resources/sql/autopatches/20180207.mail.01.task.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + DROP originalTitle; diff --git a/resources/sql/autopatches/20180207.mail.02.revision.sql b/resources/sql/autopatches/20180207.mail.02.revision.sql new file mode 100644 index 0000000000..881efbcc94 --- /dev/null +++ b/resources/sql/autopatches/20180207.mail.02.revision.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_revision + DROP originalTitle; diff --git a/resources/sql/autopatches/20180207.mail.03.mock.sql b/resources/sql/autopatches/20180207.mail.03.mock.sql new file mode 100644 index 0000000000..360d7cf9a7 --- /dev/null +++ b/resources/sql/autopatches/20180207.mail.03.mock.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_pholio.pholio_mock + DROP originalName; diff --git a/resources/sql/autopatches/20180208.maniphest.01.close.sql b/resources/sql/autopatches/20180208.maniphest.01.close.sql new file mode 100644 index 0000000000..856300e9ba --- /dev/null +++ b/resources/sql/autopatches/20180208.maniphest.01.close.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + ADD closedEpoch INT UNSIGNED; + +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + ADD closerPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20180208.maniphest.02.populate.php b/resources/sql/autopatches/20180208.maniphest.02.populate.php new file mode 100644 index 0000000000..4b4e549574 --- /dev/null +++ b/resources/sql/autopatches/20180208.maniphest.02.populate.php @@ -0,0 +1,66 @@ +establishConnection('w'); +$viewer = PhabricatorUser::getOmnipotentUser(); + +foreach (new LiskMigrationIterator($table) as $task) { + if ($task->getClosedEpoch()) { + // Task already has a closed date. + continue; + } + + $status = $task->getStatus(); + if (!ManiphestTaskStatus::isClosedStatus($status)) { + // Task isn't closed. + continue; + } + + // Look through the transactions from newest to oldest until we find one + // where the task was closed. A merge also counts as a close, even though + // it doesn't currently produce a separate transaction. + + $type_status = ManiphestTaskStatusTransaction::TRANSACTIONTYPE; + $type_merge = ManiphestTaskMergedIntoTransaction::TRANSACTIONTYPE; + + $xactions = id(new ManiphestTransactionQuery()) + ->setViewer($viewer) + ->withObjectPHIDs(array($task->getPHID())) + ->needHandles(false) + ->withTransactionTypes( + array( + $type_merge, + $type_status, + )) + ->execute(); + foreach ($xactions as $xaction) { + $old = $xaction->getOldValue(); + $new = $xaction->getNewValue(); + + $type = $xaction->getTransactionType(); + + // If this is a status change, but is not a close, don't use it. + // (We always use merges, even though it's possible to merge a task which + // was previously closed: we can't tell when this happens very easily.) + if ($type === $type_status) { + if (!ManiphestTaskStatus::isClosedStatus($new)) { + continue; + } + + if ($old && ManiphestTaskStatus::isClosedStatus($old)) { + continue; + } + } + + queryfx( + $conn, + 'UPDATE %T SET closedEpoch = %d, closerPHID = %ns + WHERE id = %d', + $table->getTableName(), + $xaction->getDateCreated(), + $xaction->getAuthorPHID(), + $task->getID()); + + break; + } +} diff --git a/resources/sql/autopatches/20180209.hook.01.hook.sql b/resources/sql/autopatches/20180209.hook.01.hook.sql new file mode 100644 index 0000000000..58b79227a1 --- /dev/null +++ b/resources/sql/autopatches/20180209.hook.01.hook.sql @@ -0,0 +1,12 @@ +CREATE TABLE {$NAMESPACE}_herald.herald_webhook ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + name VARCHAR(128) NOT NULL COLLATE {$COLLATE_TEXT}, + webhookURI VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + hmacKey VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180209.hook.02.hookxaction.sql b/resources/sql/autopatches/20180209.hook.02.hookxaction.sql new file mode 100644 index 0000000000..8da594f6bd --- /dev/null +++ b/resources/sql/autopatches/20180209.hook.02.hookxaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_herald.herald_webhooktransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180209.hook.03.hookrequest.sql b/resources/sql/autopatches/20180209.hook.03.hookrequest.sql new file mode 100644 index 0000000000..f20b3a549d --- /dev/null +++ b/resources/sql/autopatches/20180209.hook.03.hookrequest.sql @@ -0,0 +1,12 @@ +CREATE TABLE {$NAMESPACE}_herald.herald_webhookrequest ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + webhookPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + lastRequestResult VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + lastRequestEpoch INT UNSIGNED NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180210.hunk.01.droplegacy.sql b/resources/sql/autopatches/20180210.hunk.01.droplegacy.sql new file mode 100644 index 0000000000..129d3927d8 --- /dev/null +++ b/resources/sql/autopatches/20180210.hunk.01.droplegacy.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_differential.differential_hunk; diff --git a/resources/sql/autopatches/20180210.hunk.02.renamemodern.sql b/resources/sql/autopatches/20180210.hunk.02.renamemodern.sql new file mode 100644 index 0000000000..d341fbedf2 --- /dev/null +++ b/resources/sql/autopatches/20180210.hunk.02.renamemodern.sql @@ -0,0 +1,2 @@ +RENAME TABLE {$NAMESPACE}_differential.differential_hunk_modern + TO {$NAMESPACE}_differential.differential_hunk; diff --git a/resources/sql/autopatches/20180212.harbor.01.receiver.sql b/resources/sql/autopatches/20180212.harbor.01.receiver.sql new file mode 100644 index 0000000000..84e9611db2 --- /dev/null +++ b/resources/sql/autopatches/20180212.harbor.01.receiver.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildmessage + CHANGE buildTargetPHID receiverPHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20180214.harbor.01.aborted.php b/resources/sql/autopatches/20180214.harbor.01.aborted.php new file mode 100644 index 0000000000..365f375dc6 --- /dev/null +++ b/resources/sql/autopatches/20180214.harbor.01.aborted.php @@ -0,0 +1,28 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $buildable) { + if ($buildable->getBuildableStatus() !== 'building') { + continue; + } + + $aborted = queryfx_one( + $conn, + 'SELECT * FROM %T WHERE buildablePHID = %s AND buildStatus = %s + LIMIT 1', + id(new HarbormasterBuild())->getTableName(), + $buildable->getPHID(), + 'aborted'); + if (!$aborted) { + continue; + } + + queryfx( + $conn, + 'UPDATE %T SET buildableStatus = %s WHERE id = %d', + $table->getTableName(), + 'failed', + $buildable->getID()); +} diff --git a/resources/sql/autopatches/20180215.phriction.01.phidcol.sql b/resources/sql/autopatches/20180215.phriction.01.phidcol.sql new file mode 100644 index 0000000000..658b05d9e1 --- /dev/null +++ b/resources/sql/autopatches/20180215.phriction.01.phidcol.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_content + ADD phid VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20180215.phriction.02.phidvalues.php b/resources/sql/autopatches/20180215.phriction.02.phidvalues.php new file mode 100644 index 0000000000..c0a55cac85 --- /dev/null +++ b/resources/sql/autopatches/20180215.phriction.02.phidvalues.php @@ -0,0 +1,17 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $row) { + if (strlen($row->getPHID())) { + continue; + } + + queryfx( + $conn, + 'UPDATE %T SET phid = %s WHERE id = %d', + $table->getTableName(), + $table->generatePHID(), + $row->getID()); +} diff --git a/resources/sql/autopatches/20180215.phriction.03.descempty.sql b/resources/sql/autopatches/20180215.phriction.03.descempty.sql new file mode 100644 index 0000000000..c41df5285a --- /dev/null +++ b/resources/sql/autopatches/20180215.phriction.03.descempty.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_phriction.phriction_content + SET description = '' WHERE description IS NULL; diff --git a/resources/sql/autopatches/20180215.phriction.04.descnull.sql b/resources/sql/autopatches/20180215.phriction.04.descnull.sql new file mode 100644 index 0000000000..3ff017cd64 --- /dev/null +++ b/resources/sql/autopatches/20180215.phriction.04.descnull.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_content + CHANGE description description LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180215.phriction.05.statustext.sql b/resources/sql/autopatches/20180215.phriction.05.statustext.sql new file mode 100644 index 0000000000..756f7ac968 --- /dev/null +++ b/resources/sql/autopatches/20180215.phriction.05.statustext.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_document + CHANGE status status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180215.phriction.06.statusvalue.sql b/resources/sql/autopatches/20180215.phriction.06.statusvalue.sql new file mode 100644 index 0000000000..381de77643 --- /dev/null +++ b/resources/sql/autopatches/20180215.phriction.06.statusvalue.sql @@ -0,0 +1,11 @@ +UPDATE {$NAMESPACE}_phriction.phriction_document + SET status = 'active' WHERE status = '0'; + +UPDATE {$NAMESPACE}_phriction.phriction_document + SET status = 'deleted' WHERE status = '1'; + +UPDATE {$NAMESPACE}_phriction.phriction_document + SET status = 'moved' WHERE status = '2'; + +UPDATE {$NAMESPACE}_phriction.phriction_document + SET status = 'stub' WHERE status = '3'; diff --git a/resources/sql/autopatches/20180218.fact.01.dim.key.sql b/resources/sql/autopatches/20180218.fact.01.dim.key.sql new file mode 100644 index 0000000000..3a81915026 --- /dev/null +++ b/resources/sql/autopatches/20180218.fact.01.dim.key.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_fact.fact_keydimension ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + factKey VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + UNIQUE KEY `key_factkey` (factKey) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180218.fact.02.dim.obj.sql b/resources/sql/autopatches/20180218.fact.02.dim.obj.sql new file mode 100644 index 0000000000..6b38062b29 --- /dev/null +++ b/resources/sql/autopatches/20180218.fact.02.dim.obj.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_fact.fact_objectdimension ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + UNIQUE KEY `key_object` (objectPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180218.fact.03.data.int.sql b/resources/sql/autopatches/20180218.fact.03.data.int.sql new file mode 100644 index 0000000000..d93d546733 --- /dev/null +++ b/resources/sql/autopatches/20180218.fact.03.data.int.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_fact.fact_intdatapoint ( + id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + keyID INT UNSIGNED NOT NULL, + objectID INT UNSIGNED NOT NULL, + dimensionID INT UNSIGNED, + value BIGINT SIGNED NOT NULL, + epoch INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180222.log.01.filephid.sql b/resources/sql/autopatches/20180222.log.01.filephid.sql new file mode 100644 index 0000000000..a7ef2f2b3e --- /dev/null +++ b/resources/sql/autopatches/20180222.log.01.filephid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlog + ADD filePHID VARBINARY(64); diff --git a/resources/sql/autopatches/20180223.log.01.bytelength.sql b/resources/sql/autopatches/20180223.log.01.bytelength.sql new file mode 100644 index 0000000000..a4c3505628 --- /dev/null +++ b/resources/sql/autopatches/20180223.log.01.bytelength.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlog + ADD byteLength BIGINT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20180223.log.02.chunkformat.sql b/resources/sql/autopatches/20180223.log.02.chunkformat.sql new file mode 100644 index 0000000000..a15676a952 --- /dev/null +++ b/resources/sql/autopatches/20180223.log.02.chunkformat.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlog + ADD chunkFormat VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180223.log.03.chunkdefault.sql b/resources/sql/autopatches/20180223.log.03.chunkdefault.sql new file mode 100644 index 0000000000..2a1f2c812b --- /dev/null +++ b/resources/sql/autopatches/20180223.log.03.chunkdefault.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_harbormaster.harbormaster_buildlog + SET chunkFormat = 'text' WHERE chunkFormat = ''; diff --git a/resources/sql/autopatches/20180223.log.04.linemap.sql b/resources/sql/autopatches/20180223.log.04.linemap.sql new file mode 100644 index 0000000000..75ed27cf7c --- /dev/null +++ b/resources/sql/autopatches/20180223.log.04.linemap.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlog + ADD lineMap LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180223.log.05.linemapdefault.sql b/resources/sql/autopatches/20180223.log.05.linemapdefault.sql new file mode 100644 index 0000000000..59b4dc9a62 --- /dev/null +++ b/resources/sql/autopatches/20180223.log.05.linemapdefault.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_harbormaster.harbormaster_buildlog + SET lineMap = '[]' WHERE lineMap = ''; diff --git a/resources/sql/autopatches/20180228.log.01.offset.sql b/resources/sql/autopatches/20180228.log.01.offset.sql new file mode 100644 index 0000000000..db20fc292e --- /dev/null +++ b/resources/sql/autopatches/20180228.log.01.offset.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlogchunk + ADD headOffset BIGINT UNSIGNED NOT NULL; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlogchunk + ADD tailOffset BIGINT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20180305.lock.01.locklog.sql b/resources/sql/autopatches/20180305.lock.01.locklog.sql new file mode 100644 index 0000000000..fa10c21c07 --- /dev/null +++ b/resources/sql/autopatches/20180305.lock.01.locklog.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_daemon.daemon_locklog ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + lockName VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + lockReleased INT UNSIGNED, + lockParameters LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + lockContext LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180306.opath.01.digest.sql b/resources/sql/autopatches/20180306.opath.01.digest.sql new file mode 100644 index 0000000000..2418366fc5 --- /dev/null +++ b/resources/sql/autopatches/20180306.opath.01.digest.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_path + ADD pathIndex BINARY(12) NOT NULL; diff --git a/resources/sql/autopatches/20180306.opath.02.digestpopulate.php b/resources/sql/autopatches/20180306.opath.02.digestpopulate.php new file mode 100644 index 0000000000..a6b817fc46 --- /dev/null +++ b/resources/sql/autopatches/20180306.opath.02.digestpopulate.php @@ -0,0 +1,19 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $path) { + $index = PhabricatorHash::digestForIndex($path->getPath()); + + if ($index === $path->getPathIndex()) { + continue; + } + + queryfx( + $conn, + 'UPDATE %T SET pathIndex = %s WHERE id = %d', + $table->getTableName(), + $index, + $path->getID()); +} diff --git a/resources/sql/autopatches/20180306.opath.03.purge.php b/resources/sql/autopatches/20180306.opath.03.purge.php new file mode 100644 index 0000000000..91a15e2a58 --- /dev/null +++ b/resources/sql/autopatches/20180306.opath.03.purge.php @@ -0,0 +1,22 @@ +establishConnection('w'); + +$seen = array(); +foreach (new LiskMigrationIterator($table) as $path) { + $package_id = $path->getPackageID(); + $repository_phid = $path->getRepositoryPHID(); + $path_index = $path->getPathIndex(); + + if (!isset($seen[$package_id][$repository_phid][$path_index])) { + $seen[$package_id][$repository_phid][$path_index] = true; + continue; + } + + queryfx( + $conn, + 'DELETE FROM %T WHERE id = %d', + $table->getTableName(), + $path->getID()); +} diff --git a/resources/sql/autopatches/20180306.opath.04.unique.sql b/resources/sql/autopatches/20180306.opath.04.unique.sql new file mode 100644 index 0000000000..2349533b1f --- /dev/null +++ b/resources/sql/autopatches/20180306.opath.04.unique.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_path + ADD UNIQUE KEY `key_path` (packageID, repositoryPHID, pathIndex); diff --git a/resources/sql/autopatches/20180306.opath.05.longpath.sql b/resources/sql/autopatches/20180306.opath.05.longpath.sql new file mode 100644 index 0000000000..79ff2f7a7f --- /dev/null +++ b/resources/sql/autopatches/20180306.opath.05.longpath.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_path + CHANGE path path LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180306.opath.06.pathdisplay.sql b/resources/sql/autopatches/20180306.opath.06.pathdisplay.sql new file mode 100644 index 0000000000..b9b336ecd7 --- /dev/null +++ b/resources/sql/autopatches/20180306.opath.06.pathdisplay.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_path + ADD pathDisplay LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180306.opath.07.copypaths.sql b/resources/sql/autopatches/20180306.opath.07.copypaths.sql new file mode 100644 index 0000000000..74ebecfa9a --- /dev/null +++ b/resources/sql/autopatches/20180306.opath.07.copypaths.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_owners.owners_path + SET pathDisplay = path WHERE pathDisplay = ''; diff --git a/resources/sql/autopatches/20180309.owners.01.primaryowner.sql b/resources/sql/autopatches/20180309.owners.01.primaryowner.sql new file mode 100644 index 0000000000..a5eb4368f2 --- /dev/null +++ b/resources/sql/autopatches/20180309.owners.01.primaryowner.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + DROP primaryOwnerPHID; diff --git a/resources/sql/autopatches/20180312.reviewers.01.options.sql b/resources/sql/autopatches/20180312.reviewers.01.options.sql new file mode 100644 index 0000000000..159426614d --- /dev/null +++ b/resources/sql/autopatches/20180312.reviewers.01.options.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_reviewer + ADD options LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180312.reviewers.02.optionsdefault.sql b/resources/sql/autopatches/20180312.reviewers.02.optionsdefault.sql new file mode 100644 index 0000000000..d509011f73 --- /dev/null +++ b/resources/sql/autopatches/20180312.reviewers.02.optionsdefault.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_differential.differential_reviewer + SET options = '{}' WHERE options = ''; diff --git a/resources/sql/autopatches/20180322.lock.01.identifier.sql b/resources/sql/autopatches/20180322.lock.01.identifier.sql new file mode 100644 index 0000000000..b115a691fa --- /dev/null +++ b/resources/sql/autopatches/20180322.lock.01.identifier.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_pushevent + ADD requestIdentifier VARBINARY(12); + +ALTER TABLE {$NAMESPACE}_repository.repository_pushevent + ADD UNIQUE KEY `key_request` (requestIdentifier); diff --git a/resources/sql/autopatches/20180322.lock.02.wait.sql b/resources/sql/autopatches/20180322.lock.02.wait.sql new file mode 100644 index 0000000000..cba7cc64d0 --- /dev/null +++ b/resources/sql/autopatches/20180322.lock.02.wait.sql @@ -0,0 +1,8 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_pushevent + ADD writeWait BIGINT UNSIGNED; + +ALTER TABLE {$NAMESPACE}_repository.repository_pushevent + ADD readWait BIGINT UNSIGNED; + +ALTER TABLE {$NAMESPACE}_repository.repository_pushevent + ADD hostWait BIGINT UNSIGNED; diff --git a/resources/sql/autopatches/20180326.lock.03.nonunique.sql b/resources/sql/autopatches/20180326.lock.03.nonunique.sql new file mode 100644 index 0000000000..9e12d7e864 --- /dev/null +++ b/resources/sql/autopatches/20180326.lock.03.nonunique.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_pushevent + DROP KEY `key_request`; diff --git a/resources/sql/autopatches/20180403.draft.01.broadcast.php b/resources/sql/autopatches/20180403.draft.01.broadcast.php new file mode 100644 index 0000000000..b237894c90 --- /dev/null +++ b/resources/sql/autopatches/20180403.draft.01.broadcast.php @@ -0,0 +1,20 @@ +establishConnection('w'); + +$drafts = $table->loadAllWhere( + 'status = %s', + DifferentialRevisionStatus::DRAFT); +foreach ($drafts as $draft) { + $properties = $draft->getProperties(); + + $properties[DifferentialRevision::PROPERTY_SHOULD_BROADCAST] = false; + + queryfx( + $conn, + 'UPDATE %T SET properties = %s WHERE id = %d', + id(new DifferentialRevision())->getTableName(), + phutil_json_encode($properties), + $draft->getID()); +} diff --git a/resources/sql/autopatches/20180410.almanac.01.iface.xaction.sql b/resources/sql/autopatches/20180410.almanac.01.iface.xaction.sql new file mode 100644 index 0000000000..5f0dec18aa --- /dev/null +++ b/resources/sql/autopatches/20180410.almanac.01.iface.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_almanac.almanac_interfacetransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180418.alamanc.interface.unique.php b/resources/sql/autopatches/20180418.alamanc.interface.unique.php new file mode 100644 index 0000000000..0ad4fbea12 --- /dev/null +++ b/resources/sql/autopatches/20180418.alamanc.interface.unique.php @@ -0,0 +1,85 @@ +establishConnection('w'); + +queryfx( + $interface_conn, + 'LOCK TABLES %T WRITE, %T WRITE', + $interface_table->getTableName(), + $binding_table->getTableName()); + +$seen = array(); +foreach (new LiskMigrationIterator($interface_table) as $interface) { + $device = $interface->getDevicePHID(); + $network = $interface->getNetworkPHID(); + $address = $interface->getAddress(); + $port = $interface->getPort(); + $key = "{$device}/{$network}/{$address}/{$port}"; + + // If this is the first copy of this row we've seen, mark it as seen and + // move on. + if (empty($seen[$key])) { + $seen[$key] = $interface->getID(); + continue; + } + + $survivor = queryfx_one( + $interface_conn, + 'SELECT * FROM %T WHERE id = %d', + $interface_table->getTableName(), + $seen[$key]); + + $bindings = queryfx_all( + $interface_conn, + 'SELECT * FROM %T WHERE interfacePHID = %s', + $binding_table->getTableName(), + $interface->getPHID()); + + // Repoint bindings to the survivor. + foreach ($bindings as $binding) { + // Check if there's already a binding to the survivor. + $existing = queryfx_one( + $interface_conn, + 'SELECT * FROM %T WHERE interfacePHID = %s and devicePHID = %s and '. + 'servicePHID = %s', + $binding_table->getTableName(), + $survivor['phid'], + $binding['devicePHID'], + $binding['servicePHID']); + + if (!$existing) { + // Reattach this binding to the survivor. + queryfx( + $interface_conn, + 'UPDATE %T SET interfacePHID = %s WHERE id = %d', + $binding_table->getTableName(), + $survivor['phid'], + $binding['id']); + } else { + // Binding to survivor already exists. Remove this now-redundant binding. + queryfx( + $interface_conn, + 'DELETE FROM %T WHERE id = %d', + $binding_table->getTableName(), + $binding['id']); + } + } + + queryfx( + $interface_conn, + 'DELETE FROM %T WHERE id = %d', + $interface_table->getTableName(), + $interface->getID()); +} + +queryfx( + $interface_conn, + 'ALTER TABLE %T ADD UNIQUE KEY `key_unique` '. + '(devicePHID, networkPHID, address, port)', + $interface_table->getTableName()); + +queryfx( + $interface_conn, + 'UNLOCK TABLES'); diff --git a/resources/sql/autopatches/20180418.almanac.network.unique.php b/resources/sql/autopatches/20180418.almanac.network.unique.php new file mode 100644 index 0000000000..c81c59823e --- /dev/null +++ b/resources/sql/autopatches/20180418.almanac.network.unique.php @@ -0,0 +1,46 @@ +establishConnection('w'); + +queryfx( + $conn, + 'LOCK TABLES %T WRITE', + $table->getTableName()); + +$seen = array(); +foreach (new LiskMigrationIterator($table) as $network) { + $name = $network->getName(); + + // If this is the first copy of this row we've seen, mark it as seen and + // move on. + if (empty($seen[$name])) { + $seen[$name] = 1; + continue; + } + + // Otherwise, rename this row. + while (true) { + $new_name = $name.'-'.$seen[$name]; + if (empty($seen[$new_name])) { + $network->setName($new_name); + try { + $network->save(); + break; + } catch (AphrontDuplicateKeyQueryException $ex) { + // New name is a dupe of a network we haven't seen yet. + } + } + $seen[$name]++; + } + $seen[$new_name] = 1; +} + +queryfx( + $conn, + 'ALTER TABLE %T ADD UNIQUE KEY `key_name` (name)', + $table->getTableName()); + +queryfx( + $conn, + 'UNLOCK TABLES'); diff --git a/resources/sql/autopatches/20180419.phlux.edges.sql b/resources/sql/autopatches/20180419.phlux.edges.sql new file mode 100644 index 0000000000..1a63aa4d1f --- /dev/null +++ b/resources/sql/autopatches/20180419.phlux.edges.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_phlux.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_phlux.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180423.mail.01.properties.sql b/resources/sql/autopatches/20180423.mail.01.properties.sql new file mode 100644 index 0000000000..d4fc008023 --- /dev/null +++ b/resources/sql/autopatches/20180423.mail.01.properties.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_metamta.metamta_mailproperties ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + mailProperties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_object` (objectPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180430.repo_identity.sql b/resources/sql/autopatches/20180430.repo_identity.sql new file mode 100644 index 0000000000..1d81d5c970 --- /dev/null +++ b/resources/sql/autopatches/20180430.repo_identity.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_identity ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + automaticGuessedUserPHID VARBINARY(64) DEFAULT NULL, + manuallySetUserPHID VARBINARY(64) DEFAULT NULL, + currentEffectiveUserPHID VARBINARY(64) DEFAULT NULL, + identityNameHash BINARY(12) NOT NULL, + identityNameRaw LONGBLOB NOT NULL, + identityNameEncoding VARCHAR(16) DEFAULT NULL COLLATE {$COLLATE_TEXT}, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_identity` (identityNameHash) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180504.owners.01.mailkey.php b/resources/sql/autopatches/20180504.owners.01.mailkey.php new file mode 100644 index 0000000000..c1b5550f9f --- /dev/null +++ b/resources/sql/autopatches/20180504.owners.01.mailkey.php @@ -0,0 +1,26 @@ +establishConnection('w'); +$packages_name = $packages_table->getTableName(); + +$properties_table = new PhabricatorMetaMTAMailProperties(); +$conn = $properties_table->establishConnection('w'); + +$iterator = new LiskRawMigrationIterator($packages_conn, $packages_name); +foreach ($iterator as $package) { + queryfx( + $conn, + 'INSERT IGNORE INTO %T + (objectPHID, mailProperties, dateCreated, dateModified) + VALUES + (%s, %s, %d, %d)', + $properties_table->getTableName(), + $package['phid'], + phutil_json_encode( + array( + 'mailKey' => $package['mailKey'], + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); +} diff --git a/resources/sql/autopatches/20180504.owners.02.rmkey.sql b/resources/sql/autopatches/20180504.owners.02.rmkey.sql new file mode 100644 index 0000000000..5b8f240307 --- /dev/null +++ b/resources/sql/autopatches/20180504.owners.02.rmkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + DROP mailKey; diff --git a/resources/sql/autopatches/20180504.owners.03.properties.sql b/resources/sql/autopatches/20180504.owners.03.properties.sql new file mode 100644 index 0000000000..d7a90ed1c5 --- /dev/null +++ b/resources/sql/autopatches/20180504.owners.03.properties.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + ADD properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180504.owners.04.default.sql b/resources/sql/autopatches/20180504.owners.04.default.sql new file mode 100644 index 0000000000..c4c7ff044d --- /dev/null +++ b/resources/sql/autopatches/20180504.owners.04.default.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_owners.owners_package + SET properties = '{}' WHERE properties = ''; diff --git a/resources/sql/autopatches/20180504.repo_identity.author.sql b/resources/sql/autopatches/20180504.repo_identity.author.sql new file mode 100644 index 0000000000..95859a6203 --- /dev/null +++ b/resources/sql/autopatches/20180504.repo_identity.author.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_identity + ADD COLUMN authorPHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20180504.repo_identity.xaction.sql b/resources/sql/autopatches/20180504.repo_identity.xaction.sql new file mode 100644 index 0000000000..4b4e1f2a23 --- /dev/null +++ b/resources/sql/autopatches/20180504.repo_identity.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_identitytransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL, + oldValue LONGTEXT NOT NULL, + newValue LONGTEXT NOT NULL, + contentSource LONGTEXT NOT NULL, + metadata LONGTEXT NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180509.repo_identity.commits.sql b/resources/sql/autopatches/20180509.repo_identity.commits.sql new file mode 100644 index 0000000000..cc3ed299b6 --- /dev/null +++ b/resources/sql/autopatches/20180509.repo_identity.commits.sql @@ -0,0 +1,3 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_commit + ADD COLUMN authorIdentityPHID VARBINARY(64) DEFAULT NULL, + ADD COLUMN committerIdentityPHID VARBINARY(64) DEFAULT NULL; diff --git a/resources/sql/autopatches/20180730.phriction.01.spaces.sql b/resources/sql/autopatches/20180730.phriction.01.spaces.sql new file mode 100644 index 0000000000..6d3e007258 --- /dev/null +++ b/resources/sql/autopatches/20180730.phriction.01.spaces.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_document + ADD spacePHID VARBINARY(64) DEFAULT NULL; diff --git a/resources/sql/autopatches/20180730.project.01.spaces.sql b/resources/sql/autopatches/20180730.project.01.spaces.sql new file mode 100644 index 0000000000..927ff3b677 --- /dev/null +++ b/resources/sql/autopatches/20180730.project.01.spaces.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD COLUMN spacePHID VARBINARY(64) DEFAULT NULL; diff --git a/resources/sql/autopatches/20180809.repo_identities.activity.php b/resources/sql/autopatches/20180809.repo_identities.activity.php new file mode 100644 index 0000000000..e1077d4ddb --- /dev/null +++ b/resources/sql/autopatches/20180809.repo_identities.activity.php @@ -0,0 +1,20 @@ +loadAllWhere('authorIdentityPHID IS NULL LIMIT 1'); + +if (!$commits) { + return; +} + +try { + id(new PhabricatorConfigManualActivity()) + ->setActivityType(PhabricatorConfigManualActivity::TYPE_IDENTITIES) + ->save(); +} catch (AphrontDuplicateKeyQueryException $ex) { + // If we've already noted that this activity is required, just move on. +} diff --git a/resources/sql/autopatches/20180827.drydock.01.acquired.sql b/resources/sql/autopatches/20180827.drydock.01.acquired.sql new file mode 100644 index 0000000000..55948391c9 --- /dev/null +++ b/resources/sql/autopatches/20180827.drydock.01.acquired.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_lease + ADD acquiredEpoch INT UNSIGNED; diff --git a/resources/sql/autopatches/20180827.drydock.02.activated.sql b/resources/sql/autopatches/20180827.drydock.02.activated.sql new file mode 100644 index 0000000000..552f7b6b24 --- /dev/null +++ b/resources/sql/autopatches/20180827.drydock.02.activated.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_lease + ADD activatedEpoch INT UNSIGNED; diff --git a/resources/sql/autopatches/20180828.phriction.01.contentphid.sql b/resources/sql/autopatches/20180828.phriction.01.contentphid.sql new file mode 100644 index 0000000000..cf3d78ebdf --- /dev/null +++ b/resources/sql/autopatches/20180828.phriction.01.contentphid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_document + ADD contentPHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20180828.phriction.02.documentphid.sql b/resources/sql/autopatches/20180828.phriction.02.documentphid.sql new file mode 100644 index 0000000000..c15b4b17b8 --- /dev/null +++ b/resources/sql/autopatches/20180828.phriction.02.documentphid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_content + ADD documentPHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20180828.phriction.03.editedepoch.sql b/resources/sql/autopatches/20180828.phriction.03.editedepoch.sql new file mode 100644 index 0000000000..eae31fc0ba --- /dev/null +++ b/resources/sql/autopatches/20180828.phriction.03.editedepoch.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_document + ADD editedEpoch INT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20180828.phriction.04.migrate.php b/resources/sql/autopatches/20180828.phriction.04.migrate.php new file mode 100644 index 0000000000..461eae2dad --- /dev/null +++ b/resources/sql/autopatches/20180828.phriction.04.migrate.php @@ -0,0 +1,57 @@ +establishConnection('w'); + +$document_iterator = new LiskRawMigrationIterator( + $conn, + $document_table->getTableName()); +foreach ($document_iterator as $row) { + $content_id = $row['contentID']; + + $content_row = queryfx_one( + $conn, + 'SELECT phid, dateCreated FROM %T WHERE id = %d', + $content_table->getTableName(), + $content_id); + + if (!$content_row) { + continue; + } + + queryfx( + $conn, + 'UPDATE %T SET contentPHID = %s, editedEpoch = %d WHERE id = %d', + $document_table->getTableName(), + $content_row['phid'], + $content_row['dateCreated'], + $row['id']); +} + +$content_iterator = new LiskRawMigrationIterator( + $conn, + $content_table->getTableName()); +foreach ($content_iterator as $row) { + $document_id = $row['documentID']; + + $document_row = queryfx_one( + $conn, + 'SELECT phid FROM %T WHERE id = %d', + $document_table->getTableName(), + $document_id); + if (!$document_row) { + continue; + } + + queryfx( + $conn, + 'UPDATE %T SET documentPHID = %s WHERE id = %d', + $content_table->getTableName(), + $document_row['phid'], + $row['id']); +} diff --git a/resources/sql/autopatches/20180828.phriction.05.contentid.sql b/resources/sql/autopatches/20180828.phriction.05.contentid.sql new file mode 100644 index 0000000000..d6cba741a3 --- /dev/null +++ b/resources/sql/autopatches/20180828.phriction.05.contentid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_document + DROP contentID; diff --git a/resources/sql/autopatches/20180828.phriction.06.c.documentid.php b/resources/sql/autopatches/20180828.phriction.06.c.documentid.php new file mode 100644 index 0000000000..474643d620 --- /dev/null +++ b/resources/sql/autopatches/20180828.phriction.06.c.documentid.php @@ -0,0 +1,20 @@ +establishConnection('w'); + +try { + queryfx( + $conn, + 'ALTER TABLE %T DROP KEY documentID', + $table->getTableName()); +} catch (AphrontQueryException $ex) { + // Ignore. +} diff --git a/resources/sql/autopatches/20180828.phriction.06.documentid.sql b/resources/sql/autopatches/20180828.phriction.06.documentid.sql new file mode 100644 index 0000000000..2323154b3e --- /dev/null +++ b/resources/sql/autopatches/20180828.phriction.06.documentid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_content + DROP documentID; diff --git a/resources/sql/autopatches/20180828.phriction.07.c.documentuniq.sql b/resources/sql/autopatches/20180828.phriction.07.c.documentuniq.sql new file mode 100644 index 0000000000..d086cc6141 --- /dev/null +++ b/resources/sql/autopatches/20180828.phriction.07.c.documentuniq.sql @@ -0,0 +1 @@ +DELETE FROM {$NAMESPACE}_phriction.phriction_content WHERE documentPHID = ''; diff --git a/resources/sql/autopatches/20180828.phriction.07.documentkey.sql b/resources/sql/autopatches/20180828.phriction.07.documentkey.sql new file mode 100644 index 0000000000..aea3c97130 --- /dev/null +++ b/resources/sql/autopatches/20180828.phriction.07.documentkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_content + ADD UNIQUE KEY `key_version` (documentPHID, version); diff --git a/resources/sql/autopatches/20180829.phriction.01.mailkey.php b/resources/sql/autopatches/20180829.phriction.01.mailkey.php new file mode 100644 index 0000000000..cb85a3c5ef --- /dev/null +++ b/resources/sql/autopatches/20180829.phriction.01.mailkey.php @@ -0,0 +1,26 @@ +establishConnection('w'); +$document_name = $document_table->getTableName(); + +$properties_table = new PhabricatorMetaMTAMailProperties(); +$conn = $properties_table->establishConnection('w'); + +$iterator = new LiskRawMigrationIterator($document_conn, $document_name); +foreach ($iterator as $row) { + queryfx( + $conn, + 'INSERT IGNORE INTO %T + (objectPHID, mailProperties, dateCreated, dateModified) + VALUES + (%s, %s, %d, %d)', + $properties_table->getTableName(), + $row['phid'], + phutil_json_encode( + array( + 'mailKey' => $row['mailKey'], + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); +} diff --git a/resources/sql/autopatches/20180829.phriction.02.rmkey.sql b/resources/sql/autopatches/20180829.phriction.02.rmkey.sql new file mode 100644 index 0000000000..8199287db7 --- /dev/null +++ b/resources/sql/autopatches/20180829.phriction.02.rmkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_document + DROP mailKey; diff --git a/resources/sql/autopatches/20180830.phriction.01.maxversion.sql b/resources/sql/autopatches/20180830.phriction.01.maxversion.sql new file mode 100644 index 0000000000..f6f24e8333 --- /dev/null +++ b/resources/sql/autopatches/20180830.phriction.01.maxversion.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phriction.phriction_document + ADD maxVersion INT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20180830.phriction.02.maxes.php b/resources/sql/autopatches/20180830.phriction.02.maxes.php new file mode 100644 index 0000000000..97abf010db --- /dev/null +++ b/resources/sql/autopatches/20180830.phriction.02.maxes.php @@ -0,0 +1,30 @@ +establishConnection('w'); + +$iterator = new LiskRawMigrationIterator( + $conn, + $document_table->getTableName()); +foreach ($iterator as $row) { + $content = queryfx_one( + $conn, + 'SELECT MAX(version) max FROM %T WHERE documentPHID = %s', + $content_table->getTableName(), + $row['phid']); + if (!$content) { + continue; + } + + queryfx( + $conn, + 'UPDATE %T SET maxVersion = %d WHERE id = %d', + $document_table->getTableName(), + $content['max'], + $row['id']); +} diff --git a/resources/sql/autopatches/20180910.audit.01.searches.php b/resources/sql/autopatches/20180910.audit.01.searches.php new file mode 100644 index 0000000000..f68e76fe45 --- /dev/null +++ b/resources/sql/autopatches/20180910.audit.01.searches.php @@ -0,0 +1,54 @@ +establishConnection('w'); + +$status_map = array( + 0 => 'none', + 1 => 'needs-audit', + 2 => 'concern-raised', + 3 => 'partially-audited', + 4 => 'audited', + 5 => 'needs-verification', +); + +foreach (new LiskMigrationIterator($table) as $query) { + if ($query->getEngineClassName() !== 'PhabricatorCommitSearchEngine') { + continue; + } + + $parameters = $query->getParameters(); + $status = idx($parameters, 'statuses'); + + if (!$status) { + // No saved "status" constraint. + continue; + } + + if (!is_array($status)) { + // Saved constraint isn't a list. + continue; + } + + // Migrate old integer values to new string values. + $old_status = $status; + foreach ($status as $key => $value) { + if (is_numeric($value)) { + $status[$key] = $status_map[$value]; + } + } + + if ($status === $old_status) { + // Nothing changed. + continue; + } + + $parameters['statuses'] = $status; + + queryfx( + $conn, + 'UPDATE %T SET parameters = %s WHERE id = %d', + $table->getTableName(), + phutil_json_encode($parameters), + $query->getID()); +} diff --git a/resources/sql/autopatches/20180910.audit.02.string.sql b/resources/sql/autopatches/20180910.audit.02.string.sql new file mode 100644 index 0000000000..4caa4a1724 --- /dev/null +++ b/resources/sql/autopatches/20180910.audit.02.string.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_commit + CHANGE auditStatus auditStatus VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20180910.audit.03.status.php b/resources/sql/autopatches/20180910.audit.03.status.php new file mode 100644 index 0000000000..ab42d196f0 --- /dev/null +++ b/resources/sql/autopatches/20180910.audit.03.status.php @@ -0,0 +1,22 @@ +establishConnection('w'); + +$status_map = array( + 0 => 'none', + 1 => 'needs-audit', + 2 => 'concern-raised', + 3 => 'partially-audited', + 4 => 'audited', + 5 => 'needs-verification', +); + +foreach ($status_map as $old_status => $new_status) { + queryfx( + $conn, + 'UPDATE %R SET auditStatus = %s WHERE auditStatus = %s', + $table, + $new_status, + $old_status); +} diff --git a/resources/sql/autopatches/20180910.audit.04.xactions.php b/resources/sql/autopatches/20180910.audit.04.xactions.php new file mode 100644 index 0000000000..1ecf9ef320 --- /dev/null +++ b/resources/sql/autopatches/20180910.audit.04.xactions.php @@ -0,0 +1,48 @@ +establishConnection('w'); + +$status_map = array( + 0 => 'none', + 1 => 'needs-audit', + 2 => 'concern-raised', + 3 => 'partially-audited', + 4 => 'audited', + 5 => 'needs-verification', +); + +$state_type = DiffusionCommitStateTransaction::TRANSACTIONTYPE; + +foreach (new LiskMigrationIterator($table) as $xaction) { + if ($xaction->getTransactionType() !== $state_type) { + continue; + } + + $old_value = $xaction->getOldValue(); + $new_value = $xaction->getNewValue(); + + $any_change = false; + + if (isset($status_map[$old_value])) { + $old_value = $status_map[$old_value]; + $any_change = true; + } + + if (isset($status_map[$new_value])) { + $new_value = $status_map[$new_value]; + $any_change = true; + } + + if (!$any_change) { + continue; + } + + queryfx( + $conn, + 'UPDATE %T SET oldValue = %s, newValue = %s WHERE id = %d', + $table->getTableName(), + phutil_json_encode($old_value), + phutil_json_encode($new_value), + $xaction->getID()); +} diff --git a/resources/sql/autopatches/20180914.audit.01.mailkey.php b/resources/sql/autopatches/20180914.audit.01.mailkey.php new file mode 100644 index 0000000000..60926857ee --- /dev/null +++ b/resources/sql/autopatches/20180914.audit.01.mailkey.php @@ -0,0 +1,34 @@ +establishConnection('w'); +$commit_name = $commit_table->getTableName(); + +$properties_table = new PhabricatorMetaMTAMailProperties(); +$conn = $properties_table->establishConnection('w'); + +$iterator = new LiskRawMigrationIterator($commit_conn, $commit_name); +$chunks = new PhutilChunkedIterator($iterator, 100); +foreach ($chunks as $chunk) { + $sql = array(); + foreach ($chunk as $commit) { + $sql[] = qsprintf( + $conn, + '(%s, %s, %d, %d)', + $commit['phid'], + phutil_json_encode( + array( + 'mailKey' => $commit['mailKey'], + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); + } + + queryfx( + $conn, + 'INSERT IGNORE INTO %R + (objectPHID, mailProperties, dateCreated, dateModified) + VALUES %LQ', + $properties_table, + $sql); +} diff --git a/resources/sql/autopatches/20180914.audit.02.rmkey.sql b/resources/sql/autopatches/20180914.audit.02.rmkey.sql new file mode 100644 index 0000000000..3187da4258 --- /dev/null +++ b/resources/sql/autopatches/20180914.audit.02.rmkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_commit + DROP mailKey; diff --git a/resources/sql/autopatches/20180914.drydock.01.operationphid.sql b/resources/sql/autopatches/20180914.drydock.01.operationphid.sql new file mode 100644 index 0000000000..bdfe02b0df --- /dev/null +++ b/resources/sql/autopatches/20180914.drydock.01.operationphid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_log + ADD operationPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20181024.drydock.01.commandprops.sql b/resources/sql/autopatches/20181024.drydock.01.commandprops.sql new file mode 100644 index 0000000000..e808146b02 --- /dev/null +++ b/resources/sql/autopatches/20181024.drydock.01.commandprops.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_drydock.drydock_command + ADD properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20181024.drydock.02.commanddefaults.sql b/resources/sql/autopatches/20181024.drydock.02.commanddefaults.sql new file mode 100644 index 0000000000..2c336dc40e --- /dev/null +++ b/resources/sql/autopatches/20181024.drydock.02.commanddefaults.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_drydock.drydock_command + SET properties = '{}' WHERE properties = ''; diff --git a/resources/sql/autopatches/20181031.board.01.queryreset.php b/resources/sql/autopatches/20181031.board.01.queryreset.php new file mode 100644 index 0000000000..781cf456ce --- /dev/null +++ b/resources/sql/autopatches/20181031.board.01.queryreset.php @@ -0,0 +1,50 @@ +establishConnection('w'); + +$iterator = new LiskMigrationIterator($table); +$search_engine = id(new ManiphestTaskSearchEngine()) + ->setViewer($viewer); + +foreach ($iterator as $project) { + $default_filter = $project->getDefaultWorkboardFilter(); + if (!strlen($default_filter)) { + continue; + } + + if ($search_engine->isBuiltinQuery($default_filter)) { + continue; + } + + $saved = id(new PhabricatorSavedQueryQuery()) + ->setViewer($viewer) + ->withQueryKeys(array($default_filter)) + ->executeOne(); + if ($saved) { + continue; + } + + $properties = $project->getProperties(); + unset($properties['workboard.filter.default']); + + queryfx( + $conn, + 'UPDATE %T SET properties = %s WHERE id = %d', + $table->getTableName(), + phutil_json_encode($properties), + $project->getID()); + + echo tsprintf( + "%s\n", + pht( + 'Project ("%s") had an invalid query saved as a default workboard '. + 'query. The query has been reset. See T13208.', + $project->getDisplayName())); +} diff --git a/resources/sql/autopatches/20181106.repo.01.sync.sql b/resources/sql/autopatches/20181106.repo.01.sync.sql new file mode 100644 index 0000000000..3302ad8ff1 --- /dev/null +++ b/resources/sql/autopatches/20181106.repo.01.sync.sql @@ -0,0 +1,14 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_syncevent ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + repositoryPHID VARBINARY(64) NOT NULL, + epoch INT UNSIGNED NOT NULL, + devicePHID VARBINARY(64) NOT NULL, + fromDevicePHID VARBINARY(64) NOT NULL, + deviceVersion INT UNSIGNED, + fromDeviceVersion INT UNSIGNED, + resultType VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + resultCode INT UNSIGNED NOT NULL, + syncWait BIGINT UNSIGNED NOT NULL, + properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20181106.repo.02.hook.sql b/resources/sql/autopatches/20181106.repo.02.hook.sql new file mode 100644 index 0000000000..be06923044 --- /dev/null +++ b/resources/sql/autopatches/20181106.repo.02.hook.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_pushevent + ADD hookWait BIGINT UNSIGNED; diff --git a/resources/sql/autopatches/20181213.auth.01.sessionphid.sql b/resources/sql/autopatches/20181213.auth.01.sessionphid.sql new file mode 100644 index 0000000000..34b5aa5bf6 --- /dev/null +++ b/resources/sql/autopatches/20181213.auth.01.sessionphid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.phabricator_session + ADD phid VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20181213.auth.02.populatephid.php b/resources/sql/autopatches/20181213.auth.02.populatephid.php new file mode 100644 index 0000000000..314eaf87a3 --- /dev/null +++ b/resources/sql/autopatches/20181213.auth.02.populatephid.php @@ -0,0 +1,18 @@ +establishConnection('w'); + +foreach ($iterator as $session) { + if (strlen($session->getPHID())) { + continue; + } + + queryfx( + $conn, + 'UPDATE %R SET phid = %s WHERE id = %d', + $table, + $session->generatePHID(), + $session->getID()); +} diff --git a/resources/sql/autopatches/20181213.auth.03.phidkey.sql b/resources/sql/autopatches/20181213.auth.03.phidkey.sql new file mode 100644 index 0000000000..6bc11b3e55 --- /dev/null +++ b/resources/sql/autopatches/20181213.auth.03.phidkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.phabricator_session + ADD UNIQUE KEY `key_phid` (phid); diff --git a/resources/sql/autopatches/20181213.auth.04.longerhashes.sql b/resources/sql/autopatches/20181213.auth.04.longerhashes.sql new file mode 100644 index 0000000000..2bffb4c4a8 --- /dev/null +++ b/resources/sql/autopatches/20181213.auth.04.longerhashes.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.phabricator_session + CHANGE sessionKey sessionKey VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20181213.auth.05.longerloghashes.sql b/resources/sql/autopatches/20181213.auth.05.longerloghashes.sql new file mode 100644 index 0000000000..dc8638d91c --- /dev/null +++ b/resources/sql/autopatches/20181213.auth.05.longerloghashes.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user_log + CHANGE session session VARBINARY(64); diff --git a/resources/sql/autopatches/20181213.auth.06.challenge.sql b/resources/sql/autopatches/20181213.auth.06.challenge.sql new file mode 100644 index 0000000000..0e5eeb35f0 --- /dev/null +++ b/resources/sql/autopatches/20181213.auth.06.challenge.sql @@ -0,0 +1,12 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_challenge ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + userPHID VARBINARY(64) NOT NULL, + factorPHID VARBINARY(64) NOT NULL, + sessionPHID VARBINARY(64) NOT NULL, + challengeKey VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + challengeTTL INT UNSIGNED NOT NULL, + properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20181214.auth.01.workflowkey.sql b/resources/sql/autopatches/20181214.auth.01.workflowkey.sql new file mode 100644 index 0000000000..538778e218 --- /dev/null +++ b/resources/sql/autopatches/20181214.auth.01.workflowkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_challenge + ADD workflowKey VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20181217.auth.01.digest.sql b/resources/sql/autopatches/20181217.auth.01.digest.sql new file mode 100644 index 0000000000..8e30143e8f --- /dev/null +++ b/resources/sql/autopatches/20181217.auth.01.digest.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_challenge + ADD responseDigest VARCHAR(255) COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20181217.auth.02.ttl.sql b/resources/sql/autopatches/20181217.auth.02.ttl.sql new file mode 100644 index 0000000000..c8e883dbea --- /dev/null +++ b/resources/sql/autopatches/20181217.auth.02.ttl.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_challenge + ADD responseTTL INT UNSIGNED; diff --git a/resources/sql/autopatches/20181217.auth.03.completed.sql b/resources/sql/autopatches/20181217.auth.03.completed.sql new file mode 100644 index 0000000000..22ca6e21ff --- /dev/null +++ b/resources/sql/autopatches/20181217.auth.03.completed.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_challenge + ADD isCompleted BOOL NOT NULL; diff --git a/resources/sql/autopatches/20181218.pholio.01.imageauthor.sql b/resources/sql/autopatches/20181218.pholio.01.imageauthor.sql new file mode 100644 index 0000000000..4ff0a16258 --- /dev/null +++ b/resources/sql/autopatches/20181218.pholio.01.imageauthor.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_pholio.pholio_image + ADD authorPHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20181219.pholio.01.imagephid.sql b/resources/sql/autopatches/20181219.pholio.01.imagephid.sql new file mode 100644 index 0000000000..870cddd950 --- /dev/null +++ b/resources/sql/autopatches/20181219.pholio.01.imagephid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_pholio.pholio_image + ADD mockPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20181219.pholio.02.imagemigrate.php b/resources/sql/autopatches/20181219.pholio.02.imagemigrate.php new file mode 100644 index 0000000000..f1fc1b3c37 --- /dev/null +++ b/resources/sql/autopatches/20181219.pholio.02.imagemigrate.php @@ -0,0 +1,35 @@ +establishConnection('w'); +$iterator = new LiskRawMigrationIterator($conn, $image->getTableName()); + +foreach ($iterator as $image_row) { + if ($image_row['mockPHID']) { + continue; + } + + $mock_id = $image_row['mockID']; + + $mock_row = queryfx_one( + $conn, + 'SELECT phid FROM %R WHERE id = %d', + $mock, + $mock_id); + + if (!$mock_row) { + continue; + } + + queryfx( + $conn, + 'UPDATE %R SET mockPHID = %s WHERE id = %d', + $image, + $mock_row['phid'], + $image_row['id']); +} diff --git a/resources/sql/autopatches/20181219.pholio.03.imageid.sql b/resources/sql/autopatches/20181219.pholio.03.imageid.sql new file mode 100644 index 0000000000..3a3cb029ac --- /dev/null +++ b/resources/sql/autopatches/20181219.pholio.03.imageid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_pholio.pholio_image + DROP mockID; diff --git a/resources/sql/autopatches/20181220.pholio.01.mailkey.php b/resources/sql/autopatches/20181220.pholio.01.mailkey.php new file mode 100644 index 0000000000..37dcfd1434 --- /dev/null +++ b/resources/sql/autopatches/20181220.pholio.01.mailkey.php @@ -0,0 +1,28 @@ +establishConnection('w'); + +$properties_table = new PhabricatorMetaMTAMailProperties(); +$conn = $properties_table->establishConnection('w'); + +$iterator = new LiskRawMigrationIterator( + $mock_conn, + $mock_table->getTableName()); + +foreach ($iterator as $row) { + queryfx( + $conn, + 'INSERT IGNORE INTO %T + (objectPHID, mailProperties, dateCreated, dateModified) + VALUES + (%s, %s, %d, %d)', + $properties_table->getTableName(), + $row['phid'], + phutil_json_encode( + array( + 'mailKey' => $row['mailKey'], + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); +} diff --git a/resources/sql/autopatches/20181220.pholio.02.dropmailkey.sql b/resources/sql/autopatches/20181220.pholio.02.dropmailkey.sql new file mode 100644 index 0000000000..a71bc5dc69 --- /dev/null +++ b/resources/sql/autopatches/20181220.pholio.02.dropmailkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_pholio.pholio_mock + DROP mailKey; diff --git a/resources/sql/autopatches/20181228.auth.01.provider.sql b/resources/sql/autopatches/20181228.auth.01.provider.sql new file mode 100644 index 0000000000..4ffd23c846 --- /dev/null +++ b/resources/sql/autopatches/20181228.auth.01.provider.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_factorprovider ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + providerFactorKey VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20181228.auth.02.xaction.sql b/resources/sql/autopatches/20181228.auth.02.xaction.sql new file mode 100644 index 0000000000..c595cdd8fc --- /dev/null +++ b/resources/sql/autopatches/20181228.auth.02.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_factorprovidertransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL, + oldValue LONGTEXT NOT NULL, + newValue LONGTEXT NOT NULL, + contentSource LONGTEXT NOT NULL, + metadata LONGTEXT NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20181228.auth.03.name.sql b/resources/sql/autopatches/20181228.auth.03.name.sql new file mode 100644 index 0000000000..856c10287d --- /dev/null +++ b/resources/sql/autopatches/20181228.auth.03.name.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_factorprovider + ADD name VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190101.sms.01.drop.sql b/resources/sql/autopatches/20190101.sms.01.drop.sql new file mode 100644 index 0000000000..b233f7ab78 --- /dev/null +++ b/resources/sql/autopatches/20190101.sms.01.drop.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_metamta.sms; diff --git a/resources/sql/autopatches/20190115.mfa.01.provider.sql b/resources/sql/autopatches/20190115.mfa.01.provider.sql new file mode 100644 index 0000000000..52e818f8d8 --- /dev/null +++ b/resources/sql/autopatches/20190115.mfa.01.provider.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_factorconfig + ADD factorProviderPHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20190115.mfa.02.migrate.php b/resources/sql/autopatches/20190115.mfa.02.migrate.php new file mode 100644 index 0000000000..95a60789c3 --- /dev/null +++ b/resources/sql/autopatches/20190115.mfa.02.migrate.php @@ -0,0 +1,72 @@ +establishConnection('w'); + +$provider_table = new PhabricatorAuthFactorProvider(); +$provider_phid = null; +$iterator = new LiskRawMigrationIterator($conn, $table->getTableName()); +$totp_key = 'totp'; +foreach ($iterator as $row) { + + // This wasn't a TOTP factor, so skip it. + if ($row['factorKey'] !== $totp_key) { + continue; + } + + // This factor already has an associated provider. + if (strlen($row['factorProviderPHID'])) { + continue; + } + + // Find (or create) a suitable TOTP provider. Note that we can't "save()" + // an object or this migration will break if the object ever gets new + // columns; just INSERT the raw fields instead. + + if ($provider_phid === null) { + $provider_row = queryfx_one( + $conn, + 'SELECT phid FROM %R WHERE providerFactorKey = %s LIMIT 1', + $provider_table, + $totp_key); + + if ($provider_row) { + $provider_phid = $provider_row['phid']; + } else { + $provider_phid = $provider_table->generatePHID(); + queryfx( + $conn, + 'INSERT INTO %R + (phid, providerFactorKey, name, status, properties, + dateCreated, dateModified) + VALUES (%s, %s, %s, %s, %s, %d, %d)', + $provider_table, + $provider_phid, + $totp_key, + '', + 'active', + '{}', + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); + } + } + + queryfx( + $conn, + 'UPDATE %R SET factorProviderPHID = %s WHERE id = %d', + $table, + $provider_phid, + $row['id']); +} diff --git a/resources/sql/autopatches/20190115.mfa.03.factorkey.sql b/resources/sql/autopatches/20190115.mfa.03.factorkey.sql new file mode 100644 index 0000000000..619787a838 --- /dev/null +++ b/resources/sql/autopatches/20190115.mfa.03.factorkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_factorconfig + DROP factorKey; diff --git a/resources/sql/autopatches/20190116.contact.01.number.sql b/resources/sql/autopatches/20190116.contact.01.number.sql new file mode 100644 index 0000000000..14e2b78d1d --- /dev/null +++ b/resources/sql/autopatches/20190116.contact.01.number.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_contactnumber ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + contactNumber VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + uniqueKey BINARY(12), + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190116.contact.02.xaction.sql b/resources/sql/autopatches/20190116.contact.02.xaction.sql new file mode 100644 index 0000000000..bd0d361bc5 --- /dev/null +++ b/resources/sql/autopatches/20190116.contact.02.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_contactnumbertransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL, + oldValue LONGTEXT NOT NULL, + newValue LONGTEXT NOT NULL, + contentSource LONGTEXT NOT NULL, + metadata LONGTEXT NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190116.phortune.01.billing.sql b/resources/sql/autopatches/20190116.phortune.01.billing.sql new file mode 100644 index 0000000000..77d00e220e --- /dev/null +++ b/resources/sql/autopatches/20190116.phortune.01.billing.sql @@ -0,0 +1,3 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_account + ADD billingName VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + ADD billingAddress LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190117.authmessage.01.message.sql b/resources/sql/autopatches/20190117.authmessage.01.message.sql new file mode 100644 index 0000000000..9f4afa2646 --- /dev/null +++ b/resources/sql/autopatches/20190117.authmessage.01.message.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_message ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + messageKey VARCHAR(64) NOT NULL COLLATE {$COLLATE_TEXT}, + messageText LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190117.authmessage.02.xaction.sql b/resources/sql/autopatches/20190117.authmessage.02.xaction.sql new file mode 100644 index 0000000000..944de129a0 --- /dev/null +++ b/resources/sql/autopatches/20190117.authmessage.02.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_auth.auth_messagetransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL, + oldValue LONGTEXT NOT NULL, + newValue LONGTEXT NOT NULL, + contentSource LONGTEXT NOT NULL, + metadata LONGTEXT NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190121.contact.01.primary.sql b/resources/sql/autopatches/20190121.contact.01.primary.sql new file mode 100644 index 0000000000..84a7570679 --- /dev/null +++ b/resources/sql/autopatches/20190121.contact.01.primary.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_auth.auth_contactnumber + ADD isPrimary BOOL NOT NULL; diff --git a/resources/sql/autopatches/20190127.project.01.subtype.sql b/resources/sql/autopatches/20190127.project.01.subtype.sql new file mode 100644 index 0000000000..107f9202d4 --- /dev/null +++ b/resources/sql/autopatches/20190127.project.01.subtype.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project + ADD subtype VARCHAR(64) COLLATE {$COLLATE_TEXT} NOT NULL; diff --git a/resources/sql/autopatches/20190127.project.02.default.sql b/resources/sql/autopatches/20190127.project.02.default.sql new file mode 100644 index 0000000000..1a74506cf7 --- /dev/null +++ b/resources/sql/autopatches/20190127.project.02.default.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_project.project + SET subtype = 'default' WHERE subtype = ''; diff --git a/resources/sql/autopatches/20190129.project.01.spaces.php b/resources/sql/autopatches/20190129.project.01.spaces.php new file mode 100644 index 0000000000..845b4ff25d --- /dev/null +++ b/resources/sql/autopatches/20190129.project.01.spaces.php @@ -0,0 +1,18 @@ +establishConnection('w'); +$table_name = $table->getTableName(); + +foreach (new LiskRawMigrationIterator($conn, $table_name) as $project_row) { + queryfx( + $conn, + 'UPDATE %R SET spacePHID = %ns + WHERE parentProjectPHID = %s AND milestoneNumber IS NOT NULL', + $table, + $project_row['spacePHID'], + $project_row['phid']); +} diff --git a/resources/sql/autopatches/20190206.external.01.legalpad.sql b/resources/sql/autopatches/20190206.external.01.legalpad.sql new file mode 100644 index 0000000000..8afa9dd9ff --- /dev/null +++ b/resources/sql/autopatches/20190206.external.01.legalpad.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_legalpad.legalpad_documentsignature + SET signerPHID = NULL WHERE signerPHID LIKE 'PHID-XUSR-%'; diff --git a/resources/sql/autopatches/20190206.external.02.email.sql b/resources/sql/autopatches/20190206.external.02.email.sql new file mode 100644 index 0000000000..14f5f4791f --- /dev/null +++ b/resources/sql/autopatches/20190206.external.02.email.sql @@ -0,0 +1,2 @@ +DELETE FROM {$NAMESPACE}_user.user_externalaccount + WHERE accountType = 'email'; diff --git a/resources/sql/autopatches/20190206.external.03.providerphid.sql b/resources/sql/autopatches/20190206.external.03.providerphid.sql new file mode 100644 index 0000000000..0b2f498e02 --- /dev/null +++ b/resources/sql/autopatches/20190206.external.03.providerphid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user_externalaccount + ADD providerConfigPHID VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20190206.external.04.providerlink.php b/resources/sql/autopatches/20190206.external.04.providerlink.php new file mode 100644 index 0000000000..e4a2e2d4bf --- /dev/null +++ b/resources/sql/autopatches/20190206.external.04.providerlink.php @@ -0,0 +1,36 @@ +establishConnection('w'); +$table_name = $account_table->getTableName(); + +$config_table = new PhabricatorAuthProviderConfig(); +$config_conn = $config_table->establishConnection('w'); + +foreach (new LiskRawMigrationIterator($account_conn, $table_name) as $row) { + if (strlen($row['providerConfigPHID'])) { + continue; + } + + $config_row = queryfx_one( + $config_conn, + 'SELECT phid + FROM %R + WHERE providerType = %s AND providerDomain = %s + LIMIT 1', + $config_table, + $row['accountType'], + $row['accountDomain']); + if (!$config_row) { + continue; + } + + queryfx( + $account_conn, + 'UPDATE %R + SET providerConfigPHID = %s + WHERE id = %d', + $account_table, + $config_row['phid'], + $row['id']); +} diff --git a/resources/sql/autopatches/20190207.packages.01.state.sql b/resources/sql/autopatches/20190207.packages.01.state.sql new file mode 100644 index 0000000000..0e74f269ba --- /dev/null +++ b/resources/sql/autopatches/20190207.packages.01.state.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + ADD auditingState VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190207.packages.02.migrate.sql b/resources/sql/autopatches/20190207.packages.02.migrate.sql new file mode 100644 index 0000000000..60bf364ac1 --- /dev/null +++ b/resources/sql/autopatches/20190207.packages.02.migrate.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_owners.owners_package + SET auditingState = IF(auditingEnabled = 0, 'none', 'audit'); diff --git a/resources/sql/autopatches/20190207.packages.03.drop.sql b/resources/sql/autopatches/20190207.packages.03.drop.sql new file mode 100644 index 0000000000..24d0ce1a4f --- /dev/null +++ b/resources/sql/autopatches/20190207.packages.03.drop.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + DROP auditingEnabled; diff --git a/resources/sql/autopatches/20190207.packages.04.xactions.php b/resources/sql/autopatches/20190207.packages.04.xactions.php new file mode 100644 index 0000000000..5a8609166e --- /dev/null +++ b/resources/sql/autopatches/20190207.packages.04.xactions.php @@ -0,0 +1,41 @@ +establishConnection('w'); +$iterator = new LiskRawMigrationIterator($conn, $table->getTableName()); + +// Migrate "Auditing State" transactions for Owners Packages from old values +// (which were "0" or "1", as JSON integer literals, without quotes) to new +// values (which are JSON strings, with quotes). + +foreach ($iterator as $row) { + if ($row['transactionType'] !== 'owners.auditing') { + continue; + } + + $old_value = (int)$row['oldValue']; + $new_value = (int)$row['newValue']; + + if (!$old_value) { + $old_value = 'none'; + } else { + $old_value = 'audit'; + } + + if (!$new_value) { + $new_value = 'none'; + } else { + $new_value = 'audit'; + } + + $old_value = phutil_json_encode($old_value); + $new_value = phutil_json_encode($new_value); + + queryfx( + $conn, + 'UPDATE %R SET oldValue = %s, newValue = %s WHERE id = %d', + $table, + $old_value, + $new_value, + $row['id']); +} diff --git a/resources/sql/autopatches/20190215.daemons.01.dropdataid.php b/resources/sql/autopatches/20190215.daemons.01.dropdataid.php new file mode 100644 index 0000000000..05cc4adfee --- /dev/null +++ b/resources/sql/autopatches/20190215.daemons.01.dropdataid.php @@ -0,0 +1,21 @@ +establishConnection('w'); + +try { + queryfx( + $conn, + 'ALTER TABLE %R DROP KEY %T', + $table, + 'dataID'); +} catch (AphrontQueryException $ex) { + // Ignore. +} diff --git a/resources/sql/autopatches/20190215.daemons.02.nulldataid.sql b/resources/sql/autopatches/20190215.daemons.02.nulldataid.sql new file mode 100644 index 0000000000..19be602efe --- /dev/null +++ b/resources/sql/autopatches/20190215.daemons.02.nulldataid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_worker.worker_activetask + CHANGE dataID dataID INT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20190215.harbor.01.stringindex.sql b/resources/sql/autopatches/20190215.harbor.01.stringindex.sql new file mode 100644 index 0000000000..e94b240bab --- /dev/null +++ b/resources/sql/autopatches/20190215.harbor.01.stringindex.sql @@ -0,0 +1,6 @@ +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_string ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + stringIndex BINARY(12) NOT NULL, + stringValue LONGTEXT NOT NULL, + UNIQUE KEY `key_string` (stringIndex) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190215.harbor.02.stringcol.sql b/resources/sql/autopatches/20190215.harbor.02.stringcol.sql new file mode 100644 index 0000000000..acfdb0f869 --- /dev/null +++ b/resources/sql/autopatches/20190215.harbor.02.stringcol.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildunitmessage + ADD nameIndex BINARY(12) NOT NULL; diff --git a/resources/sql/autopatches/20190220.daemon_worker.completed.01.sql b/resources/sql/autopatches/20190220.daemon_worker.completed.01.sql new file mode 100644 index 0000000000..37f5a89bba --- /dev/null +++ b/resources/sql/autopatches/20190220.daemon_worker.completed.01.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_worker.worker_archivetask + ADD archivedEpoch INT UNSIGNED NULL; diff --git a/resources/sql/autopatches/20190220.daemon_worker.completed.02.sql b/resources/sql/autopatches/20190220.daemon_worker.completed.02.sql new file mode 100644 index 0000000000..f0040576a9 --- /dev/null +++ b/resources/sql/autopatches/20190220.daemon_worker.completed.02.sql @@ -0,0 +1,3 @@ +ALTER TABLE {$NAMESPACE}_worker.worker_activetask + ADD dateCreated int unsigned NOT NULL, + ADD dateModified int unsigned NOT NULL; diff --git a/resources/sql/autopatches/20190226.harbor.01.planprops.sql b/resources/sql/autopatches/20190226.harbor.01.planprops.sql new file mode 100644 index 0000000000..324139669e --- /dev/null +++ b/resources/sql/autopatches/20190226.harbor.01.planprops.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildplan + ADD properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190226.harbor.02.planvalue.sql b/resources/sql/autopatches/20190226.harbor.02.planvalue.sql new file mode 100644 index 0000000000..b1929abf59 --- /dev/null +++ b/resources/sql/autopatches/20190226.harbor.02.planvalue.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_harbormaster.harbormaster_buildplan + SET properties = '{}' WHERE properties = ''; diff --git a/resources/sql/autopatches/20190307.herald.01.comments.sql b/resources/sql/autopatches/20190307.herald.01.comments.sql new file mode 100644 index 0000000000..ff9cb9af88 --- /dev/null +++ b/resources/sql/autopatches/20190307.herald.01.comments.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_herald.herald_ruletransaction_comment; diff --git a/resources/sql/autopatches/20190312.triggers.01.trigger.sql b/resources/sql/autopatches/20190312.triggers.01.trigger.sql new file mode 100644 index 0000000000..301a3a62cd --- /dev/null +++ b/resources/sql/autopatches/20190312.triggers.01.trigger.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_project.project_trigger ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + name VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + editPolicy VARBINARY(64) NOT NULL, + ruleset LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190312.triggers.02.xaction.sql b/resources/sql/autopatches/20190312.triggers.02.xaction.sql new file mode 100644 index 0000000000..1a6034c4b1 --- /dev/null +++ b/resources/sql/autopatches/20190312.triggers.02.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_project.project_triggertransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL, + oldValue LONGTEXT NOT NULL, + newValue LONGTEXT NOT NULL, + contentSource LONGTEXT NOT NULL, + metadata LONGTEXT NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190312.triggers.03.triggerphid.sql b/resources/sql/autopatches/20190312.triggers.03.triggerphid.sql new file mode 100644 index 0000000000..271d679cfa --- /dev/null +++ b/resources/sql/autopatches/20190312.triggers.03.triggerphid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_project.project_column + ADD triggerPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20190322.triggers.01.usage.sql b/resources/sql/autopatches/20190322.triggers.01.usage.sql new file mode 100644 index 0000000000..643ebbbfff --- /dev/null +++ b/resources/sql/autopatches/20190322.triggers.01.usage.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_project.project_triggerusage ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + triggerPHID VARBINARY(64) NOT NULL, + examplePHID VARBINARY(64), + columnCount INT UNSIGNED NOT NULL, + activeColumnCount INT UNSIGNED NOT NULL, + UNIQUE KEY `key_trigger` (triggerPHID) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190329.portals.01.create.sql b/resources/sql/autopatches/20190329.portals.01.create.sql new file mode 100644 index 0000000000..d7d1e6138f --- /dev/null +++ b/resources/sql/autopatches/20190329.portals.01.create.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_portal ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + name VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT}, + status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190329.portals.02.xaction.sql b/resources/sql/autopatches/20190329.portals.02.xaction.sql new file mode 100644 index 0000000000..057df69e2d --- /dev/null +++ b/resources/sql/autopatches/20190329.portals.02.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_portaltransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL, + oldValue LONGTEXT NOT NULL, + newValue LONGTEXT NOT NULL, + contentSource LONGTEXT NOT NULL, + metadata LONGTEXT NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190410.portals.01.ferret.doc.sql b/resources/sql/autopatches/20190410.portals.01.ferret.doc.sql new file mode 100644 index 0000000000..984f3196f9 --- /dev/null +++ b/resources/sql/autopatches/20190410.portals.01.ferret.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_portal_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190410.portals.02.ferret.field.sql b/resources/sql/autopatches/20190410.portals.02.ferret.field.sql new file mode 100644 index 0000000000..af02b8f0d6 --- /dev/null +++ b/resources/sql/autopatches/20190410.portals.02.ferret.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_portal_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190410.portals.03.ferret.ngrams.sql b/resources/sql/autopatches/20190410.portals.03.ferret.ngrams.sql new file mode 100644 index 0000000000..37a5fc80ab --- /dev/null +++ b/resources/sql/autopatches/20190410.portals.03.ferret.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_portal_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190410.portals.04.ferret.cngrams.sql b/resources/sql/autopatches/20190410.portals.04.ferret.cngrams.sql new file mode 100644 index 0000000000..678af664bf --- /dev/null +++ b/resources/sql/autopatches/20190410.portals.04.ferret.cngrams.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_portal_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190412.dashboard.01.panels.php b/resources/sql/autopatches/20190412.dashboard.01.panels.php new file mode 100644 index 0000000000..dad132356b --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.01.panels.php @@ -0,0 +1,81 @@ +establishConnection('r'); +$table_name = $dashboard_table->getTableName(); + +$rows = new LiskRawMigrationIterator($conn, $table_name); +foreach ($rows as $row) { + $config = $row['layoutConfig']; + + try { + $config = phutil_json_decode($config); + } catch (Exception $ex) { + $config = array(); + } + + if (!is_array($config)) { + $config = array(); + } + + $panels = idx($config, 'panelLocations'); + if (!is_array($panels)) { + $panels = array(); + } + + if (idx($config, 'layoutMode') === 'layout-mode-full') { + $column_map = array( + 0 => 'main', + ); + } else { + $column_map = array( + 0 => 'left', + 1 => 'right', + ); + } + + $panel_list = array(); + foreach ($panels as $column_idx => $panel_phids) { + $column_key = idx($column_map, $column_idx, 'unknown'); + foreach ($panel_phids as $panel_phid) { + $panel_list[] = array( + 'panelKey' => Filesystem::readRandomCharacters(8), + 'columnKey' => $column_key, + 'panelPHID' => $panel_phid, + ); + } + } + unset($config['panelLocations']); + $config['panels'] = $panel_list; + + queryfx( + $conn, + 'UPDATE %R SET layoutConfig = %s WHERE id = %d', + $dashboard_table, + phutil_json_encode($config), + $row['id']); +} diff --git a/resources/sql/autopatches/20190412.dashboard.02.install.sql b/resources/sql/autopatches/20190412.dashboard.02.install.sql new file mode 100644 index 0000000000..be3363d5c3 --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.02.install.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS {$NAMESPACE}_dashboard.dashboard_install; diff --git a/resources/sql/autopatches/20190412.dashboard.03.dashngrams.sql b/resources/sql/autopatches/20190412.dashboard.03.dashngrams.sql new file mode 100644 index 0000000000..2f1b572a8b --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.03.dashngrams.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS {$NAMESPACE}_dashboard.dashboard_dashboard_ngrams; diff --git a/resources/sql/autopatches/20190412.dashboard.04.panelngrams.sql b/resources/sql/autopatches/20190412.dashboard.04.panelngrams.sql new file mode 100644 index 0000000000..e06d817c6e --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.04.panelngrams.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS {$NAMESPACE}_dashboard.dashboard_dashboardpanel_ngrams; diff --git a/resources/sql/autopatches/20190412.dashboard.05.dferret.doc.sql b/resources/sql/autopatches/20190412.dashboard.05.dferret.doc.sql new file mode 100644 index 0000000000..2073a5b578 --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.05.dferret.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_dashboard_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190412.dashboard.06.dferret.field.sql b/resources/sql/autopatches/20190412.dashboard.06.dferret.field.sql new file mode 100644 index 0000000000..b8845f5686 --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.06.dferret.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_dashboard_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190412.dashboard.07.dferret.ngrams.sql b/resources/sql/autopatches/20190412.dashboard.07.dferret.ngrams.sql new file mode 100644 index 0000000000..3279e7dc27 --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.07.dferret.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_dashboard_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190412.dashboard.08.dferret.cngrams.sql b/resources/sql/autopatches/20190412.dashboard.08.dferret.cngrams.sql new file mode 100644 index 0000000000..0ee815d175 --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.08.dferret.cngrams.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_dashboard_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190412.dashboard.09.pferret.doc.sql b/resources/sql/autopatches/20190412.dashboard.09.pferret.doc.sql new file mode 100644 index 0000000000..827a4245ed --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.09.pferret.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_panel_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190412.dashboard.10.pferret.field.sql b/resources/sql/autopatches/20190412.dashboard.10.pferret.field.sql new file mode 100644 index 0000000000..f63521d87b --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.10.pferret.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_panel_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190412.dashboard.11.pferret.ngrams.sql b/resources/sql/autopatches/20190412.dashboard.11.pferret.ngrams.sql new file mode 100644 index 0000000000..a197ec0272 --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.11.pferret.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_panel_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190412.dashboard.12.pferret.cngrams.sql b/resources/sql/autopatches/20190412.dashboard.12.pferret.cngrams.sql new file mode 100644 index 0000000000..95426fcf1d --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.12.pferret.cngrams.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_dashboard.dashboard_panel_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190412.dashboard.13.rebuild.php b/resources/sql/autopatches/20190412.dashboard.13.rebuild.php new file mode 100644 index 0000000000..04b8d0e275 --- /dev/null +++ b/resources/sql/autopatches/20190412.dashboard.13.rebuild.php @@ -0,0 +1,9 @@ +addEdge($cart->getAccountPHID(), $edge_type, $cart->getMerchantPHID()) + ->save(); +} diff --git a/resources/sql/autopatches/20190815.account.02.subscriptions.php b/resources/sql/autopatches/20190815.account.02.subscriptions.php new file mode 100644 index 0000000000..38db05b0ef --- /dev/null +++ b/resources/sql/autopatches/20190815.account.02.subscriptions.php @@ -0,0 +1,10 @@ +addEdge($sub->getAccountPHID(), $edge_type, $sub->getMerchantPHID()) + ->save(); +} diff --git a/resources/sql/autopatches/20190816.payment.01.xaction.sql b/resources/sql/autopatches/20190816.payment.01.xaction.sql new file mode 100644 index 0000000000..22d7baae7e --- /dev/null +++ b/resources/sql/autopatches/20190816.payment.01.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_paymentmethodtransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL, + oldValue LONGTEXT NOT NULL, + newValue LONGTEXT NOT NULL, + contentSource LONGTEXT NOT NULL, + metadata LONGTEXT NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190816.subscription.01.xaction.sql b/resources/sql/autopatches/20190816.subscription.01.xaction.sql new file mode 100644 index 0000000000..8866ce3a57 --- /dev/null +++ b/resources/sql/autopatches/20190816.subscription.01.xaction.sql @@ -0,0 +1,19 @@ +CREATE TABLE {$NAMESPACE}_phortune.phortune_subscriptiontransaction ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + authorPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewPolicy VARBINARY(64) NOT NULL, + editPolicy VARBINARY(64) NOT NULL, + commentPHID VARBINARY(64) DEFAULT NULL, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL, + oldValue LONGTEXT NOT NULL, + newValue LONGTEXT NOT NULL, + contentSource LONGTEXT NOT NULL, + metadata LONGTEXT NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20190822.merchant.01.view.sql b/resources/sql/autopatches/20190822.merchant.01.view.sql new file mode 100644 index 0000000000..cb609f054e --- /dev/null +++ b/resources/sql/autopatches/20190822.merchant.01.view.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phortune.phortune_merchant + DROP viewPolicy; diff --git a/resources/sql/autopatches/20190909.herald.01.rebuild.php b/resources/sql/autopatches/20190909.herald.01.rebuild.php new file mode 100644 index 0000000000..76126b9337 --- /dev/null +++ b/resources/sql/autopatches/20190909.herald.01.rebuild.php @@ -0,0 +1,5 @@ +establishConnection('w'); + +$iterator = new LiskRawMigrationIterator($conn, $table->getTableName()); +foreach ($iterator as $row) { + $name = $row['identityNameRaw']; + $name = phutil_utf8ize($name); + + $email = new PhutilEmailAddress($name); + $address = $email->getAddress(); + + try { + queryfx( + $conn, + 'UPDATE %R SET emailAddress = %ns WHERE id = %d', + $table, + $address, + $row['id']); + } catch (Exception $ex) { + // We may occasionally run into issues with binary or very long addresses. + // Just skip over them. + continue; + } +} diff --git a/resources/sql/autopatches/20191113.identity.03.unassigned.sql b/resources/sql/autopatches/20191113.identity.03.unassigned.sql new file mode 100644 index 0000000000..768ca1d909 --- /dev/null +++ b/resources/sql/autopatches/20191113.identity.03.unassigned.sql @@ -0,0 +1,3 @@ +UPDATE {$NAMESPACE}_repository.repository_identity + SET currentEffectiveUserPHID = NULL + WHERE currentEffectiveUserPHID = 'unassigned()'; diff --git a/resources/sql/autopatches/20191114.email.01.phid.sql b/resources/sql/autopatches/20191114.email.01.phid.sql new file mode 100644 index 0000000000..3851d6e0ec --- /dev/null +++ b/resources/sql/autopatches/20191114.email.01.phid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_user.user_email + ADD phid VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20191114.email.02.populate.php b/resources/sql/autopatches/20191114.email.02.populate.php new file mode 100644 index 0000000000..96ef13ea58 --- /dev/null +++ b/resources/sql/autopatches/20191114.email.02.populate.php @@ -0,0 +1,18 @@ +establishConnection('w'); + +$iterator = new LiskRawMigrationIterator($conn, $table->getTableName()); +foreach ($iterator as $row) { + $phid = $row['phid']; + + if (!strlen($phid)) { + queryfx( + $conn, + 'UPDATE %R SET phid = %s WHERE id = %d', + $table, + $table->generatePHID(), + $row['id']); + } +} diff --git a/resources/sql/autopatches/20200220.xaccount.01.sql b/resources/sql/autopatches/20200220.xaccount.01.sql new file mode 100644 index 0000000000..dc3a4ec330 --- /dev/null +++ b/resources/sql/autopatches/20200220.xaccount.01.sql @@ -0,0 +1,10 @@ +CREATE TABLE {$NAMESPACE}_user.user_externalaccountidentifier ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARBINARY(64) NOT NULL, + externalAccountPHID VARBINARY(64) NOT NULL, + providerConfigPHID VARBINARY(64) NOT NULL, + identifierHash BINARY(12) NOT NULL, + identifierRaw LONGTEXT NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20200222.xident.01.migrate.php b/resources/sql/autopatches/20200222.xident.01.migrate.php new file mode 100644 index 0000000000..dacf6a7fe0 --- /dev/null +++ b/resources/sql/autopatches/20200222.xident.01.migrate.php @@ -0,0 +1,40 @@ +establishConnection('w'); +$table_name = $account_table->getTableName(); + +$iterator = new LiskRawMigrationIterator($conn, $table_name); +foreach ($iterator as $account_row) { + // We don't need to migrate "accountID" values for "password" accounts, + // since these were dummy values in the first place and are no longer + // read or written after D21014. (There would be no harm in writing these + // rows, but it's easy to skip them.) + + if ($account_row['accountType'] === 'password') { + continue; + } + + $account_id = $account_row['accountID']; + if (!strlen($account_id)) { + continue; + } + + queryfx( + $conn, + 'INSERT IGNORE INTO %R ( + phid, externalAccountPHID, providerConfigPHID, + identifierHash, identifierRaw, + dateCreated, dateModified) + VALUES (%s, %s, %s, %s, %s, %d, %d)', + $identifier_table, + $identifier_table->generatePHID(), + $account_row['phid'], + $account_row['providerConfigPHID'], + PhabricatorHash::digestForIndex($account_id), + $account_id, + $account_row['dateCreated'], + $account_row['dateModified']); +} diff --git a/resources/sql/autopatches/20200222.xident.02.dropkey.php b/resources/sql/autopatches/20200222.xident.02.dropkey.php new file mode 100644 index 0000000000..5aaea1ed4d --- /dev/null +++ b/resources/sql/autopatches/20200222.xident.02.dropkey.php @@ -0,0 +1,21 @@ +", which is obsolete. The application now violates +// this key, so make sure it gets dropped. + +// There's no "IF EXISTS" modifier for "ALTER TABLE" so run this as a PHP patch +// instead of an SQL patch. + +$table = new PhabricatorExternalAccount(); +$conn = $table->establishConnection('w'); + +try { + queryfx( + $conn, + 'ALTER TABLE %R DROP KEY %T', + $table, + 'account_details'); +} catch (AphrontQueryException $ex) { + // Ignore. +} diff --git a/resources/sql/autopatches/20200416.paste.01.ferret.doc.sql b/resources/sql/autopatches/20200416.paste.01.ferret.doc.sql new file mode 100644 index 0000000000..65b687f176 --- /dev/null +++ b/resources/sql/autopatches/20200416.paste.01.ferret.doc.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_paste.paste_paste_fdocument ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + isClosed BOOL NOT NULL, + authorPHID VARBINARY(64), + ownerPHID VARBINARY(64), + epochCreated INT UNSIGNED NOT NULL, + epochModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20200416.paste.02.ferret.field.sql b/resources/sql/autopatches/20200416.paste.02.ferret.field.sql new file mode 100644 index 0000000000..98a92ad9f0 --- /dev/null +++ b/resources/sql/autopatches/20200416.paste.02.ferret.field.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_paste.paste_paste_ffield ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + fieldKey VARCHAR(4) NOT NULL COLLATE {$COLLATE_TEXT}, + rawCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + termCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT}, + normalCorpus LONGTEXT NOT NULL COLLATE {$COLLATE_SORT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20200416.paste.03.ferret.ngrams.sql b/resources/sql/autopatches/20200416.paste.03.ferret.ngrams.sql new file mode 100644 index 0000000000..be4c93b2a6 --- /dev/null +++ b/resources/sql/autopatches/20200416.paste.03.ferret.ngrams.sql @@ -0,0 +1,5 @@ +CREATE TABLE {$NAMESPACE}_paste.paste_paste_fngrams ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + documentID INT UNSIGNED NOT NULL, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20200416.paste.04.ferret.cngrams.sql b/resources/sql/autopatches/20200416.paste.04.ferret.cngrams.sql new file mode 100644 index 0000000000..51b3c05027 --- /dev/null +++ b/resources/sql/autopatches/20200416.paste.04.ferret.cngrams.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_paste.paste_paste_fngrams_common ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + ngram CHAR(3) NOT NULL COLLATE {$COLLATE_TEXT}, + needsCollection BOOL NOT NULL, + UNIQUE KEY `key_ngram` (ngram), + KEY `key_collect` (needsCollection) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20200417.viewstate.01.storage.sql b/resources/sql/autopatches/20200417.viewstate.01.storage.sql new file mode 100644 index 0000000000..4fc5e3fa80 --- /dev/null +++ b/resources/sql/autopatches/20200417.viewstate.01.storage.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_differential.differential_viewstate ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + viewerPHID VARBINARY(64) NOT NULL, + objectPHID VARBINARY(64) NOT NULL, + viewState LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_viewer` (viewerPHID, objectPHID) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20200428.inline.01.differential.column.sql b/resources/sql/autopatches/20200428.inline.01.differential.column.sql new file mode 100644 index 0000000000..d825565000 --- /dev/null +++ b/resources/sql/autopatches/20200428.inline.01.differential.column.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_transaction_comment + ADD attributes LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20200428.inline.02.diffusion.column.sql b/resources/sql/autopatches/20200428.inline.02.diffusion.column.sql new file mode 100644 index 0000000000..ac567b9a8e --- /dev/null +++ b/resources/sql/autopatches/20200428.inline.02.diffusion.column.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_audit.audit_transaction_comment + ADD attributes LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20200428.inline.03.differential.value.sql b/resources/sql/autopatches/20200428.inline.03.differential.value.sql new file mode 100644 index 0000000000..dfa420a8ac --- /dev/null +++ b/resources/sql/autopatches/20200428.inline.03.differential.value.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_differential.differential_transaction_comment + SET attributes = '{}' WHERE attributes = ''; diff --git a/resources/sql/autopatches/20200428.inline.04.diffusion.value.sql b/resources/sql/autopatches/20200428.inline.04.diffusion.value.sql new file mode 100644 index 0000000000..3fb10d7f2b --- /dev/null +++ b/resources/sql/autopatches/20200428.inline.04.diffusion.value.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_audit.audit_transaction_comment + SET attributes = '{}' WHERE attributes = ''; diff --git a/resources/sql/autopatches/20200520.inline.01.remcache.sql b/resources/sql/autopatches/20200520.inline.01.remcache.sql new file mode 100644 index 0000000000..356bf5a5a5 --- /dev/null +++ b/resources/sql/autopatches/20200520.inline.01.remcache.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_differential.differential_changeset_parse_cache; diff --git a/resources/sql/autopatches/20200520.inline.02.addcache.sql b/resources/sql/autopatches/20200520.inline.02.addcache.sql new file mode 100644 index 0000000000..7b9ed64aac --- /dev/null +++ b/resources/sql/autopatches/20200520.inline.02.addcache.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_differential.differential_changeset_parse_cache ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + cacheIndex BINARY(12) NOT NULL, + cache LONGBLOB NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + UNIQUE KEY `key_cacheIndex` (cacheIndex) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20200520.inline.03.dropcommit.sql b/resources/sql/autopatches/20200520.inline.03.dropcommit.sql new file mode 100644 index 0000000000..a757a8a0a7 --- /dev/null +++ b/resources/sql/autopatches/20200520.inline.03.dropcommit.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS {$NAMESPACE}_differential.differential_commit; diff --git a/resources/sql/autopatches/20210122.queuecontainer.01.sql b/resources/sql/autopatches/20210122.queuecontainer.01.sql new file mode 100644 index 0000000000..29d761f075 --- /dev/null +++ b/resources/sql/autopatches/20210122.queuecontainer.01.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_worker.worker_activetask + ADD containerPHID VARBINARY(64); + +ALTER TABLE {$NAMESPACE}_worker.worker_archivetask + ADD containerPHID VARBINARY(64); diff --git a/resources/sql/autopatches/20210215.changeset.01.phid.sql b/resources/sql/autopatches/20210215.changeset.01.phid.sql new file mode 100644 index 0000000000..25cab7805a --- /dev/null +++ b/resources/sql/autopatches/20210215.changeset.01.phid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_changeset + ADD phid VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20210215.changeset.02.phid-populate.php b/resources/sql/autopatches/20210215.changeset.02.phid-populate.php new file mode 100644 index 0000000000..93f886c7b0 --- /dev/null +++ b/resources/sql/autopatches/20210215.changeset.02.phid-populate.php @@ -0,0 +1,79 @@ +establishConnection('w'); +$table_name = $changeset_table->getTableName(); + +$chunk_size = 4096; + +$temporary_table = 'tmp_20210215_changeset_id_map'; + +try { + queryfx( + $conn, + 'CREATE TEMPORARY TABLE %T ( + changeset_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + changeset_phid VARBINARY(64) NOT NULL)', + $temporary_table); +} catch (AphrontAccessDeniedQueryException $ex) { + throw new PhutilProxyException( + pht( + 'Failed to "CREATE TEMPORARY TABLE". You may need to "GRANT" the '. + 'current MySQL user this permission.'), + $ex); +} + +$table_iterator = id(new LiskRawMigrationIterator($conn, $table_name)) + ->setPageSize($chunk_size); + +$chunk_iterator = new PhutilChunkedIterator($table_iterator, $chunk_size); +foreach ($chunk_iterator as $chunk) { + + $map = array(); + foreach ($chunk as $changeset_row) { + $phid = $changeset_row['phid']; + + if (strlen($phid)) { + continue; + } + + $phid = PhabricatorPHID::generateNewPHID($phid_type); + $id = $changeset_row['id']; + + $map[(int)$id] = $phid; + } + + if (!$map) { + continue; + } + + $sql = array(); + foreach ($map as $changeset_id => $changeset_phid) { + $sql[] = qsprintf( + $conn, + '(%d, %s)', + $changeset_id, + $changeset_phid); + } + + queryfx( + $conn, + 'TRUNCATE TABLE %T', + $temporary_table); + + queryfx( + $conn, + 'INSERT INTO %T (changeset_id, changeset_phid) VALUES %LQ', + $temporary_table, + $sql); + + queryfx( + $conn, + 'UPDATE %T c JOIN %T x ON c.id = x.changeset_id + SET c.phid = x.changeset_phid', + $table_name, + $temporary_table); +} diff --git a/resources/sql/autopatches/20210216.index.01.version.sql b/resources/sql/autopatches/20210216.index.01.version.sql new file mode 100644 index 0000000000..d24162891a --- /dev/null +++ b/resources/sql/autopatches/20210216.index.01.version.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_search.search_indexversion + ADD indexVersion BINARY(12) NOT NULL; diff --git a/resources/sql/autopatches/20210216.index.02.epoch.sql b/resources/sql/autopatches/20210216.index.02.epoch.sql new file mode 100644 index 0000000000..4e96ded075 --- /dev/null +++ b/resources/sql/autopatches/20210216.index.02.epoch.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_search.search_indexversion + ADD indexEpoch INT UNSIGNED NOT NULL; diff --git a/resources/sql/autopatches/20210309.auditors.01.status.sql b/resources/sql/autopatches/20210309.auditors.01.status.sql new file mode 100644 index 0000000000..731ce3ca44 --- /dev/null +++ b/resources/sql/autopatches/20210309.auditors.01.status.sql @@ -0,0 +1,5 @@ +UPDATE {$NAMESPACE}_repository.repository_auditrequest + SET auditStatus = 'accepted' WHERE auditStatus = 'closed'; + +DELETE FROM {$NAMESPACE}_repository.repository_auditrequest + WHERE auditStatus IN ('', 'cc', 'audit-not-required'); diff --git a/resources/sql/autopatches/20210315.affectedpath.01.epoch.sql b/resources/sql/autopatches/20210315.affectedpath.01.epoch.sql new file mode 100644 index 0000000000..80c337fd94 --- /dev/null +++ b/resources/sql/autopatches/20210315.affectedpath.01.epoch.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_affectedpath + DROP epoch; diff --git a/resources/sql/autopatches/20210315.affectedpath.02.repositoryid.sql b/resources/sql/autopatches/20210315.affectedpath.02.repositoryid.sql new file mode 100644 index 0000000000..1975b7c071 --- /dev/null +++ b/resources/sql/autopatches/20210315.affectedpath.02.repositoryid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_affectedpath + CHANGE repositoryID repositoryID INT UNSIGNED; diff --git a/resources/sql/autopatches/20210316.almanac.01.device-mailkey.php b/resources/sql/autopatches/20210316.almanac.01.device-mailkey.php new file mode 100644 index 0000000000..7c10d1ae76 --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.01.device-mailkey.php @@ -0,0 +1,28 @@ +establishConnection('w'); + +$properties_table = new PhabricatorMetaMTAMailProperties(); +$conn = $properties_table->establishConnection('w'); + +$iterator = new LiskRawMigrationIterator( + $device_conn, + $device_table->getTableName()); + +foreach ($iterator as $row) { + queryfx( + $conn, + 'INSERT IGNORE INTO %R + (objectPHID, mailProperties, dateCreated, dateModified) + VALUES + (%s, %s, %d, %d)', + $properties_table, + $row['phid'], + phutil_json_encode( + array( + 'mailKey' => $row['mailKey'], + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); +} diff --git a/resources/sql/autopatches/20210316.almanac.02.device-dropmailkey.sql b/resources/sql/autopatches/20210316.almanac.02.device-dropmailkey.sql new file mode 100644 index 0000000000..47079ef296 --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.02.device-dropmailkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_almanac.almanac_device + DROP mailKey; diff --git a/resources/sql/autopatches/20210316.almanac.03.device-status.sql b/resources/sql/autopatches/20210316.almanac.03.device-status.sql new file mode 100644 index 0000000000..08618acb8f --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.03.device-status.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_almanac.almanac_device + ADD status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20210316.almanac.04.device-status-value.sql b/resources/sql/autopatches/20210316.almanac.04.device-status-value.sql new file mode 100644 index 0000000000..659bc7850f --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.04.device-status-value.sql @@ -0,0 +1,2 @@ +UPDATE {$NAMESPACE}_almanac.almanac_device + SET status = 'active' WHERE status = ''; diff --git a/resources/sql/autopatches/20210316.almanac.05.service-mailkey.php b/resources/sql/autopatches/20210316.almanac.05.service-mailkey.php new file mode 100644 index 0000000000..33318eb663 --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.05.service-mailkey.php @@ -0,0 +1,28 @@ +establishConnection('w'); + +$properties_table = new PhabricatorMetaMTAMailProperties(); +$conn = $properties_table->establishConnection('w'); + +$iterator = new LiskRawMigrationIterator( + $service_conn, + $service_table->getTableName()); + +foreach ($iterator as $row) { + queryfx( + $conn, + 'INSERT IGNORE INTO %R + (objectPHID, mailProperties, dateCreated, dateModified) + VALUES + (%s, %s, %d, %d)', + $properties_table, + $row['phid'], + phutil_json_encode( + array( + 'mailKey' => $row['mailKey'], + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); +} diff --git a/resources/sql/autopatches/20210316.almanac.06.service-dropmailkey.sql b/resources/sql/autopatches/20210316.almanac.06.service-dropmailkey.sql new file mode 100644 index 0000000000..b9966eddf9 --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.06.service-dropmailkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_almanac.almanac_service + DROP mailKey; diff --git a/resources/sql/autopatches/20210316.almanac.07.binding-mailkey.php b/resources/sql/autopatches/20210316.almanac.07.binding-mailkey.php new file mode 100644 index 0000000000..84c1725876 --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.07.binding-mailkey.php @@ -0,0 +1,28 @@ +establishConnection('w'); + +$properties_table = new PhabricatorMetaMTAMailProperties(); +$conn = $properties_table->establishConnection('w'); + +$iterator = new LiskRawMigrationIterator( + $binding_conn, + $binding_table->getTableName()); + +foreach ($iterator as $row) { + queryfx( + $conn, + 'INSERT IGNORE INTO %R + (objectPHID, mailProperties, dateCreated, dateModified) + VALUES + (%s, %s, %d, %d)', + $properties_table, + $row['phid'], + phutil_json_encode( + array( + 'mailKey' => $row['mailKey'], + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); +} diff --git a/resources/sql/autopatches/20210316.almanac.08.binding-dropmailkey.sql b/resources/sql/autopatches/20210316.almanac.08.binding-dropmailkey.sql new file mode 100644 index 0000000000..ebcf31254d --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.08.binding-dropmailkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_almanac.almanac_binding + DROP mailKey; diff --git a/resources/sql/autopatches/20210316.almanac.09.namespace-mailkey.php b/resources/sql/autopatches/20210316.almanac.09.namespace-mailkey.php new file mode 100644 index 0000000000..261181324e --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.09.namespace-mailkey.php @@ -0,0 +1,28 @@ +establishConnection('w'); + +$properties_table = new PhabricatorMetaMTAMailProperties(); +$conn = $properties_table->establishConnection('w'); + +$iterator = new LiskRawMigrationIterator( + $namespace_conn, + $namespace_table->getTableName()); + +foreach ($iterator as $row) { + queryfx( + $conn, + 'INSERT IGNORE INTO %R + (objectPHID, mailProperties, dateCreated, dateModified) + VALUES + (%s, %s, %d, %d)', + $properties_table, + $row['phid'], + phutil_json_encode( + array( + 'mailKey' => $row['mailKey'], + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); +} diff --git a/resources/sql/autopatches/20210316.almanac.10.namespace-dropmailkey.sql b/resources/sql/autopatches/20210316.almanac.10.namespace-dropmailkey.sql new file mode 100644 index 0000000000..867c42fbc2 --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.10.namespace-dropmailkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_almanac.almanac_namespace + DROP mailKey; diff --git a/resources/sql/autopatches/20210316.almanac.11.network-mailkey.php b/resources/sql/autopatches/20210316.almanac.11.network-mailkey.php new file mode 100644 index 0000000000..1ece4e2353 --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.11.network-mailkey.php @@ -0,0 +1,28 @@ +establishConnection('w'); + +$properties_table = new PhabricatorMetaMTAMailProperties(); +$conn = $properties_table->establishConnection('w'); + +$iterator = new LiskRawMigrationIterator( + $network_conn, + $network_table->getTableName()); + +foreach ($iterator as $row) { + queryfx( + $conn, + 'INSERT IGNORE INTO %R + (objectPHID, mailProperties, dateCreated, dateModified) + VALUES + (%s, %s, %d, %d)', + $properties_table, + $row['phid'], + phutil_json_encode( + array( + 'mailKey' => $row['mailKey'], + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); +} diff --git a/resources/sql/autopatches/20210316.almanac.12.network-dropmailkey.sql b/resources/sql/autopatches/20210316.almanac.12.network-dropmailkey.sql new file mode 100644 index 0000000000..266f1250f0 --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.12.network-dropmailkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_almanac.almanac_network + DROP mailKey; diff --git a/resources/sql/autopatches/20210316.almanac.13.event-mailkey.php b/resources/sql/autopatches/20210316.almanac.13.event-mailkey.php new file mode 100644 index 0000000000..7436ce3591 --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.13.event-mailkey.php @@ -0,0 +1,28 @@ +establishConnection('w'); + +$properties_table = new PhabricatorMetaMTAMailProperties(); +$conn = $properties_table->establishConnection('w'); + +$iterator = new LiskRawMigrationIterator( + $event_conn, + $event_table->getTableName()); + +foreach ($iterator as $row) { + queryfx( + $conn, + 'INSERT IGNORE INTO %R + (objectPHID, mailProperties, dateCreated, dateModified) + VALUES + (%s, %s, %d, %d)', + $properties_table, + $row['phid'], + phutil_json_encode( + array( + 'mailKey' => $row['mailKey'], + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); +} diff --git a/resources/sql/autopatches/20210316.almanac.14.event-dropmailkey.sql b/resources/sql/autopatches/20210316.almanac.14.event-dropmailkey.sql new file mode 100644 index 0000000000..8a7e2de519 --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.14.event-dropmailkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_calendar.calendar_event + DROP mailKey; diff --git a/resources/sql/autopatches/20210316.almanac.15.intiative-mailkey.php b/resources/sql/autopatches/20210316.almanac.15.intiative-mailkey.php new file mode 100644 index 0000000000..03215ef78f --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.15.intiative-mailkey.php @@ -0,0 +1,28 @@ +establishConnection('w'); + +$properties_table = new PhabricatorMetaMTAMailProperties(); +$conn = $properties_table->establishConnection('w'); + +$iterator = new LiskRawMigrationIterator( + $initiative_conn, + $initiative_table->getTableName()); + +foreach ($iterator as $row) { + queryfx( + $conn, + 'INSERT IGNORE INTO %R + (objectPHID, mailProperties, dateCreated, dateModified) + VALUES + (%s, %s, %d, %d)', + $properties_table, + $row['phid'], + phutil_json_encode( + array( + 'mailKey' => $row['mailKey'], + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); +} diff --git a/resources/sql/autopatches/20210316.almanac.16.initiative-dropmailkey.sql b/resources/sql/autopatches/20210316.almanac.16.initiative-dropmailkey.sql new file mode 100644 index 0000000000..9de5e9c224 --- /dev/null +++ b/resources/sql/autopatches/20210316.almanac.16.initiative-dropmailkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_fund.fund_initiative + DROP mailKey; diff --git a/resources/sql/autopatches/20210625.owners.01.authority.sql b/resources/sql/autopatches/20210625.owners.01.authority.sql new file mode 100644 index 0000000000..96c36e7701 --- /dev/null +++ b/resources/sql/autopatches/20210625.owners.01.authority.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_owners.owners_package + ADD authorityMode VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20210625.owners.02.authority-default.sql b/resources/sql/autopatches/20210625.owners.02.authority-default.sql new file mode 100644 index 0000000000..98cd939777 --- /dev/null +++ b/resources/sql/autopatches/20210625.owners.02.authority-default.sql @@ -0,0 +1,3 @@ +UPDATE {$NAMESPACE}_owners.owners_package + SET authorityMode = 'strong' + WHERE authorityMode = ''; diff --git a/resources/sql/autopatches/20210713.harborcommand.01.migrate.sql b/resources/sql/autopatches/20210713.harborcommand.01.migrate.sql new file mode 100644 index 0000000000..7acf3b33c8 --- /dev/null +++ b/resources/sql/autopatches/20210713.harborcommand.01.migrate.sql @@ -0,0 +1,4 @@ +INSERT IGNORE INTO {$NAMESPACE}_harbormaster.harbormaster_buildmessage + (authorPHID, receiverPHID, type, isConsumed, dateCreated, dateModified) + SELECT authorPHID, targetPHID, command, 0, dateCreated, dateModified + FROM {$NAMESPACE}_harbormaster.harbormaster_buildcommand; diff --git a/resources/sql/autopatches/20210713.harborcommand.02.drop.sql b/resources/sql/autopatches/20210713.harborcommand.02.drop.sql new file mode 100644 index 0000000000..0d04376c13 --- /dev/null +++ b/resources/sql/autopatches/20210713.harborcommand.02.drop.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS {$NAMESPACE}_harbormaster.harbormaster_buildcommand; diff --git a/resources/sql/autopatches/20210715.harborcommand.01.xactions.php b/resources/sql/autopatches/20210715.harborcommand.01.xactions.php new file mode 100644 index 0000000000..05cd6d4744 --- /dev/null +++ b/resources/sql/autopatches/20210715.harborcommand.01.xactions.php @@ -0,0 +1,34 @@ +establishConnection('w'); +$row_iterator = new LiskRawMigrationIterator( + $xactions_conn, + $xactions_table->getTableName()); + +$map = array( + '"pause"' => 'message/pause', + '"abort"' => 'message/abort', + '"resume"' => 'message/resume', + '"restart"' => 'message/restart', +); + +foreach ($row_iterator as $row) { + if ($row['transactionType'] !== 'harbormaster:build:command') { + continue; + } + + $raw_value = $row['newValue']; + + if (isset($map[$raw_value])) { + queryfx( + $xactions_conn, + 'UPDATE %R SET transactionType = %s WHERE id = %d', + $xactions_table, + $map[$raw_value], + $row['id']); + } +} diff --git a/resources/sql/autopatches/20220401.phameinteract.01.sql b/resources/sql/autopatches/20220401.phameinteract.01.sql new file mode 100644 index 0000000000..cb8121887f --- /dev/null +++ b/resources/sql/autopatches/20220401.phameinteract.01.sql @@ -0,0 +1,5 @@ +UPDATE {$NAMESPACE}_phame.phame_blog + SET editPolicy = 'admin' WHERE editPolicy IS NULL; + +ALTER TABLE {$NAMESPACE}_phame.phame_blog + CHANGE editPolicy editPolicy VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20220401.phameinteract.02.sql b/resources/sql/autopatches/20220401.phameinteract.02.sql new file mode 100644 index 0000000000..057c02d30e --- /dev/null +++ b/resources/sql/autopatches/20220401.phameinteract.02.sql @@ -0,0 +1,5 @@ +UPDATE {$NAMESPACE}_phame.phame_blog + SET viewPolicy = 'admin' WHERE viewPolicy IS NULL; + +ALTER TABLE {$NAMESPACE}_phame.phame_blog + CHANGE viewPolicy viewPolicy VARBINARY(64) NOT NULL; diff --git a/resources/sql/autopatches/20220401.phameinteract.03.sql b/resources/sql/autopatches/20220401.phameinteract.03.sql new file mode 100644 index 0000000000..d5ac27b2ef --- /dev/null +++ b/resources/sql/autopatches/20220401.phameinteract.03.sql @@ -0,0 +1,6 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_blog + ADD interactPolicy VARBINARY(64) NOT NULL; + +UPDATE {$NAMESPACE}_phame.phame_blog + SET interactPolicy = 'users' + WHERE interactPolicy = ''; diff --git a/resources/sql/autopatches/20220401.phameinteract.04.postinteract.sql b/resources/sql/autopatches/20220401.phameinteract.04.postinteract.sql new file mode 100644 index 0000000000..723a1ff69c --- /dev/null +++ b/resources/sql/autopatches/20220401.phameinteract.04.postinteract.sql @@ -0,0 +1,6 @@ +ALTER TABLE {$NAMESPACE}_phame.phame_post + ADD interactPolicy VARBINARY(64) NOT NULL; + +UPDATE {$NAMESPACE}_phame.phame_post + SET interactPolicy = 'obj.phame.blog' + WHERE interactPolicy = ''; diff --git a/resources/sql/autopatches/20220510.file.01.attach.sql b/resources/sql/autopatches/20220510.file.01.attach.sql new file mode 100644 index 0000000000..3ca8bacac4 --- /dev/null +++ b/resources/sql/autopatches/20220510.file.01.attach.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_file.file_attachment ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARBINARY(64) NOT NULL, + filePHID VARBINARY(64) NOT NULL, + attacherPHID VARBINARY(64), + attachmentMode VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20220519.file.02.migrate.sql b/resources/sql/autopatches/20220519.file.02.migrate.sql new file mode 100644 index 0000000000..89d2d30a82 --- /dev/null +++ b/resources/sql/autopatches/20220519.file.02.migrate.sql @@ -0,0 +1,7 @@ +INSERT IGNORE INTO {$NAMESPACE}_file.file_attachment + (objectPHID, filePHID, attachmentMode, attacherPHID, + dateCreated, dateModified) + SELECT dst, src, 'attach', null, dateCreated, dateCreated + FROM {$NAMESPACE}_file.edge + WHERE type = 26 + ORDER BY dateCreated ASC; diff --git a/resources/sql/autopatches/20220525.slowvote.01.mailkey.php b/resources/sql/autopatches/20220525.slowvote.01.mailkey.php new file mode 100644 index 0000000000..ed0355e105 --- /dev/null +++ b/resources/sql/autopatches/20220525.slowvote.01.mailkey.php @@ -0,0 +1,28 @@ +establishConnection('w'); + +$properties_table = new PhabricatorMetaMTAMailProperties(); +$conn = $properties_table->establishConnection('w'); + +$iterator = new LiskRawMigrationIterator( + $poll_conn, + $poll_table->getTableName()); + +foreach ($iterator as $row) { + queryfx( + $conn, + 'INSERT IGNORE INTO %R + (objectPHID, mailProperties, dateCreated, dateModified) + VALUES + (%s, %s, %d, %d)', + $properties_table, + $row['phid'], + phutil_json_encode( + array( + 'mailKey' => $row['mailKey'], + )), + PhabricatorTime::getNow(), + PhabricatorTime::getNow()); +} diff --git a/resources/sql/autopatches/20220525.slowvote.02.mailkey-drop.sql b/resources/sql/autopatches/20220525.slowvote.02.mailkey-drop.sql new file mode 100644 index 0000000000..54e65fd14c --- /dev/null +++ b/resources/sql/autopatches/20220525.slowvote.02.mailkey-drop.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_slowvote.slowvote_poll + DROP mailKey; diff --git a/resources/sql/autopatches/20220525.slowvote.03.response-type.sql b/resources/sql/autopatches/20220525.slowvote.03.response-type.sql new file mode 100644 index 0000000000..8cefc4d578 --- /dev/null +++ b/resources/sql/autopatches/20220525.slowvote.03.response-type.sql @@ -0,0 +1,3 @@ +ALTER TABLE {$NAMESPACE}_slowvote.slowvote_poll + CHANGE responseVisibility + responseVisibility VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20220525.slowvote.04.response-value.sql b/resources/sql/autopatches/20220525.slowvote.04.response-value.sql new file mode 100644 index 0000000000..b76bcdb784 --- /dev/null +++ b/resources/sql/autopatches/20220525.slowvote.04.response-value.sql @@ -0,0 +1,8 @@ +UPDATE {$NAMESPACE}_slowvote.slowvote_poll + SET responseVisibility = 'visible' WHERE responseVisibility = '0'; + +UPDATE {$NAMESPACE}_slowvote.slowvote_poll + SET responseVisibility = 'voters' WHERE responseVisibility = '1'; + +UPDATE {$NAMESPACE}_slowvote.slowvote_poll + SET responseVisibility = 'owner' WHERE responseVisibility = '2'; diff --git a/resources/sql/autopatches/20220525.slowvote.05.response-xactions.sql b/resources/sql/autopatches/20220525.slowvote.05.response-xactions.sql new file mode 100644 index 0000000000..7e819d5893 --- /dev/null +++ b/resources/sql/autopatches/20220525.slowvote.05.response-xactions.sql @@ -0,0 +1,23 @@ +UPDATE {$NAMESPACE}_slowvote.slowvote_transaction + SET oldValue = '"visible"' WHERE + transactionType = 'vote:responses' AND oldValue IN ('0', '"0"'); + +UPDATE {$NAMESPACE}_slowvote.slowvote_transaction + SET newValue = '"visible"' WHERE + transactionType = 'vote:responses' AND newValue IN ('0', '"0"'); + +UPDATE {$NAMESPACE}_slowvote.slowvote_transaction + SET oldValue = '"voters"' WHERE + transactionType = 'vote:responses' AND oldValue IN ('1', '"1"'); + +UPDATE {$NAMESPACE}_slowvote.slowvote_transaction + SET newValue = '"voters"' WHERE + transactionType = 'vote:responses' AND newValue IN ('1', '"1"'); + +UPDATE {$NAMESPACE}_slowvote.slowvote_transaction + SET oldValue = '"owner"' WHERE + transactionType = 'vote:responses' AND oldValue IN ('2', '"2"'); + +UPDATE {$NAMESPACE}_slowvote.slowvote_transaction + SET newValue = '"owner"' WHERE + transactionType = 'vote:responses' AND newValue IN ('2', '"2"'); diff --git a/resources/sql/autopatches/20220525.slowvote.06.method-type.sql b/resources/sql/autopatches/20220525.slowvote.06.method-type.sql new file mode 100644 index 0000000000..e2af0643bc --- /dev/null +++ b/resources/sql/autopatches/20220525.slowvote.06.method-type.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_slowvote.slowvote_poll + CHANGE method method VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20220525.slowvote.07.method-value.sql b/resources/sql/autopatches/20220525.slowvote.07.method-value.sql new file mode 100644 index 0000000000..04d0f6f430 --- /dev/null +++ b/resources/sql/autopatches/20220525.slowvote.07.method-value.sql @@ -0,0 +1,5 @@ +UPDATE {$NAMESPACE}_slowvote.slowvote_poll + SET method = 'plurality' WHERE method = '0'; + +UPDATE {$NAMESPACE}_slowvote.slowvote_poll + SET method = 'approval' WHERE method = '1'; diff --git a/resources/sql/autopatches/20220525.slowvote.08.status-type.sql b/resources/sql/autopatches/20220525.slowvote.08.status-type.sql new file mode 100644 index 0000000000..e8575fc50a --- /dev/null +++ b/resources/sql/autopatches/20220525.slowvote.08.status-type.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_slowvote.slowvote_poll + CHANGE isClosed status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT}; diff --git a/resources/sql/autopatches/20220525.slowvote.09.status-value.sql b/resources/sql/autopatches/20220525.slowvote.09.status-value.sql new file mode 100644 index 0000000000..686e663af7 --- /dev/null +++ b/resources/sql/autopatches/20220525.slowvote.09.status-value.sql @@ -0,0 +1,5 @@ +UPDATE {$NAMESPACE}_slowvote.slowvote_poll + SET status = 'open' WHERE status = '0'; + +UPDATE {$NAMESPACE}_slowvote.slowvote_poll + SET status = 'closed' WHERE status = '1'; diff --git a/resources/sql/autopatches/20220525.slowvote.10.status-xactions.sql b/resources/sql/autopatches/20220525.slowvote.10.status-xactions.sql new file mode 100644 index 0000000000..fd06f9ebb2 --- /dev/null +++ b/resources/sql/autopatches/20220525.slowvote.10.status-xactions.sql @@ -0,0 +1,19 @@ +UPDATE {$NAMESPACE}_slowvote.slowvote_transaction + SET transactionType = 'vote:status' + WHERE transactionType = 'vote:close'; + +UPDATE {$NAMESPACE}_slowvote.slowvote_transaction + SET oldValue = '"open"' WHERE + transactionType = 'vote:status' AND oldValue IN ('0', '"0"', 'false'); + +UPDATE {$NAMESPACE}_slowvote.slowvote_transaction + SET newValue = '"open"' WHERE + transactionType = 'vote:status' AND newValue IN ('0', '"0"', 'false'); + +UPDATE {$NAMESPACE}_slowvote.slowvote_transaction + SET oldValue = '"closed"' WHERE + transactionType = 'vote:status' AND oldValue IN ('1', '"1"', 'true'); + +UPDATE {$NAMESPACE}_slowvote.slowvote_transaction + SET newValue = '"closed"' WHERE + transactionType = 'vote:status' AND newValue IN ('1', '"1"', 'true'); diff --git a/resources/sql/patches/000.project.sql b/resources/sql/patches/000.project.sql index 6013c6c30d..794eb2737f 100644 --- a/resources/sql/patches/000.project.sql +++ b/resources/sql/patches/000.project.sql @@ -1,7 +1,6 @@ - create table {$NAMESPACE}_project.project ( id int unsigned not null auto_increment primary key, - name varchar(255) not null, + name varchar(255) COLLATE `binary` not null, unique key (name), phid varchar(64) binary not null, authorPHID varchar(64) binary not null, @@ -28,4 +27,3 @@ create table {$NAMESPACE}_project.project_affiliation ( dateCreated int unsigned not null, dateModified int unsigned not null ); - diff --git a/resources/sql/patches/0000.legacy.sql b/resources/sql/patches/0000.legacy.sql index f1c179d3f1..fc02040ee3 100644 --- a/resources/sql/patches/0000.legacy.sql +++ b/resources/sql/patches/0000.legacy.sql @@ -1,9 +1,3 @@ - - - - - - /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; diff --git a/resources/sql/patches/002.oauth.sql b/resources/sql/patches/002.oauth.sql index bacd1872a6..24cce576a0 100644 --- a/resources/sql/patches/002.oauth.sql +++ b/resources/sql/patches/002.oauth.sql @@ -1,8 +1,8 @@ create table {$NAMESPACE}_user.user_oauthinfo ( id int unsigned not null auto_increment primary key, userID int unsigned not null, - oauthProvider varchar(255) not null, - oauthUID varchar(255) not null, + oauthProvider varchar(255) COLLATE `binary` not null, + oauthUID varchar(255) COLLATE `binary` not null, unique key (userID, oauthProvider), unique key (oauthProvider, oauthUID), dateCreated int unsigned not null, @@ -15,4 +15,4 @@ insert into {$NAMESPACE}_user.user_oauthinfo FROM {$NAMESPACE}_user.user WHERE facebookUID is not null; -alter table {$NAMESPACE}_user.user drop facebookUID; \ No newline at end of file +alter table {$NAMESPACE}_user.user drop facebookUID; diff --git a/resources/sql/patches/004.daemonrepos.sql b/resources/sql/patches/004.daemonrepos.sql index f3e472bc4b..9e46210ca3 100644 --- a/resources/sql/patches/004.daemonrepos.sql +++ b/resources/sql/patches/004.daemonrepos.sql @@ -23,6 +23,6 @@ create table {$NAMESPACE}_timeline.timeline_eventdata ( ); create table {$NAMESPACE}_timeline.timeline_cursor ( - name varchar(255) not null primary key, + name varchar(255) COLLATE `binary` not null primary key, position int unsigned not null -); \ No newline at end of file +); diff --git a/resources/sql/patches/005.workers.sql b/resources/sql/patches/005.workers.sql index 29d402f20f..08b116dc85 100644 --- a/resources/sql/patches/005.workers.sql +++ b/resources/sql/patches/005.workers.sql @@ -1,5 +1,3 @@ - - create table {$NAMESPACE}_worker.worker_task ( id int unsigned not null auto_increment primary key, taskClass varchar(255) not null, @@ -7,8 +5,8 @@ create table {$NAMESPACE}_worker.worker_task ( leaseExpires int unsigned, priority bigint unsigned not null, failureCount int unsigned not null, - key(taskClass), - key(leaseOwner), + key(taskClass(128)), + key(leaseOwner(128)), key(leaseExpires) ); diff --git a/resources/sql/patches/006.repository.sql b/resources/sql/patches/006.repository.sql index b391925d11..7f79867b50 100644 --- a/resources/sql/patches/006.repository.sql +++ b/resources/sql/patches/006.repository.sql @@ -4,7 +4,7 @@ create table {$NAMESPACE}_repository.repository_commitdata ( authorName varchar(255) not null, commitMessage longblob not null, unique key (commitID), - key (authorName) + key (authorName(128)) ); ALTER TABLE {$NAMESPACE}_worker.worker_task drop priority; diff --git a/resources/sql/patches/007.daemonlog.sql b/resources/sql/patches/007.daemonlog.sql index 15529ee848..ce1daee490 100644 --- a/resources/sql/patches/007.daemonlog.sql +++ b/resources/sql/patches/007.daemonlog.sql @@ -1,5 +1,3 @@ - - create table {$NAMESPACE}_daemon.daemon_log ( id int unsigned not null auto_increment primary key, daemon varchar(255) not null, diff --git a/resources/sql/patches/009.repo_summary.sql b/resources/sql/patches/009.repo_summary.sql index c5ab4e3021..0509b68d80 100644 --- a/resources/sql/patches/009.repo_summary.sql +++ b/resources/sql/patches/009.repo_summary.sql @@ -4,4 +4,4 @@ CREATE TABLE {$NAMESPACE}_repository.`repository_summary` ( `lastCommitID` int(10) unsigned NOT NULL, `epoch` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`repositoryID`) -); \ No newline at end of file +); diff --git a/resources/sql/patches/010.herald.sql b/resources/sql/patches/010.herald.sql index 59deb29485..1a28ce262e 100644 --- a/resources/sql/patches/010.herald.sql +++ b/resources/sql/patches/010.herald.sql @@ -1,5 +1,3 @@ - - CREATE TABLE {$NAMESPACE}_herald.herald_action ( id int unsigned not null auto_increment primary key, ruleID int unsigned not null, @@ -9,7 +7,7 @@ CREATE TABLE {$NAMESPACE}_herald.herald_action ( CREATE TABLE {$NAMESPACE}_herald.herald_rule ( id int unsigned not null auto_increment primary key, - name varchar(255) not null, + name varchar(255) COLLATE `binary` not null, authorPHID varchar(64) binary not null, contentType varchar(255) not null, mustMatchAll bool not null, diff --git a/resources/sql/patches/011.badcommit.sql b/resources/sql/patches/011.badcommit.sql index 76a8255417..a9c0853126 100644 --- a/resources/sql/patches/011.badcommit.sql +++ b/resources/sql/patches/011.badcommit.sql @@ -1,4 +1,4 @@ CREATE TABLE {$NAMESPACE}_repository.repository_badcommit ( - fullCommitName varchar(255) binary not null primary key, + fullCommitName varchar(255) COLLATE `binary` not null primary key, description longblob not null -); \ No newline at end of file +); diff --git a/resources/sql/patches/012.dropphidtype.sql b/resources/sql/patches/012.dropphidtype.sql index 340a64fccb..53e0e1e937 100644 --- a/resources/sql/patches/012.dropphidtype.sql +++ b/resources/sql/patches/012.dropphidtype.sql @@ -1 +1 @@ -/* This database was later removed entirely. */ \ No newline at end of file +/* This database was later removed entirely. */ diff --git a/resources/sql/patches/016.userrealnameindex.sql b/resources/sql/patches/016.userrealnameindex.sql index 616f062869..58f1235b9c 100644 --- a/resources/sql/patches/016.userrealnameindex.sql +++ b/resources/sql/patches/016.userrealnameindex.sql @@ -1 +1 @@ -ALTER TABLE {$NAMESPACE}_user.user ADD key (realName); \ No newline at end of file +ALTER TABLE {$NAMESPACE}_user.user ADD key (realName); diff --git a/resources/sql/patches/018.owners.sql b/resources/sql/patches/018.owners.sql index c5fe3b9251..de7dde64d0 100644 --- a/resources/sql/patches/018.owners.sql +++ b/resources/sql/patches/018.owners.sql @@ -1,10 +1,8 @@ - - CREATE TABLE {$NAMESPACE}_owners.owners_package ( id int unsigned not null auto_increment primary key, phid varchar(64) binary not null, unique key(phid), - name varchar(255) not null, + name varchar(255) COLLATE `binary` not null, unique key(name), description text not null, primaryOwnerPHID varchar(64) binary diff --git a/resources/sql/patches/019.arcprojects.sql b/resources/sql/patches/019.arcprojects.sql index e6e0405268..ac3ab8828a 100644 --- a/resources/sql/patches/019.arcprojects.sql +++ b/resources/sql/patches/019.arcprojects.sql @@ -2,7 +2,7 @@ CREATE TABLE {$NAMESPACE}_repository.repository_arcanistproject ( id int unsigned not null auto_increment primary key, phid varchar(64) binary not null, unique key(phid), - name varchar(255) not null, + name varchar(255) COLLATE `binary` not null, unique key (name), repositoryID int unsigned ); diff --git a/resources/sql/patches/020.pathcapital.sql b/resources/sql/patches/020.pathcapital.sql index 7c825ca5fb..fd4ffd6672 100644 --- a/resources/sql/patches/020.pathcapital.sql +++ b/resources/sql/patches/020.pathcapital.sql @@ -1,2 +1,2 @@ ALTER TABLE {$NAMESPACE}_differential.differential_diff - CHANGE sourceControlpath sourceControlPath varchar(255); \ No newline at end of file + CHANGE sourceControlpath sourceControlPath varchar(255); diff --git a/resources/sql/patches/021.xhpastview.sql b/resources/sql/patches/021.xhpastview.sql index bb517ed949..875fe0636d 100644 --- a/resources/sql/patches/021.xhpastview.sql +++ b/resources/sql/patches/021.xhpastview.sql @@ -1,4 +1,3 @@ - CREATE TABLE {$NAMESPACE}_xhpastview.xhpastview_parsetree ( id int unsigned not null auto_increment primary key, authorPHID varchar(64) binary, diff --git a/resources/sql/patches/024.mlistkeys.sql b/resources/sql/patches/024.mlistkeys.sql index 4ccf515d35..1063584dd5 100644 --- a/resources/sql/patches/024.mlistkeys.sql +++ b/resources/sql/patches/024.mlistkeys.sql @@ -3,4 +3,3 @@ ALTER TABLE {$NAMESPACE}_metamta.metamta_mailinglist ALTER TABLE {$NAMESPACE}_metamta.metamta_mailinglist ADD UNIQUE KEY (name); - diff --git a/resources/sql/patches/025.commentopt.sql b/resources/sql/patches/025.commentopt.sql index 2c0ee9cd76..0892515aa3 100644 --- a/resources/sql/patches/025.commentopt.sql +++ b/resources/sql/patches/025.commentopt.sql @@ -1,2 +1,2 @@ ALTER TABLE {$NAMESPACE}_differential.differential_inlinecomment - ADD KEY (revisionID, authorPHID); \ No newline at end of file + ADD KEY (revisionID, authorPHID); diff --git a/resources/sql/patches/026.diffpropkey.sql b/resources/sql/patches/026.diffpropkey.sql index c4d3fb7ce5..40bb69aa94 100644 --- a/resources/sql/patches/026.diffpropkey.sql +++ b/resources/sql/patches/026.diffpropkey.sql @@ -1,3 +1,2 @@ ALTER TABLE {$NAMESPACE}_differential.differential_diffproperty ADD UNIQUE KEY (diffID, name); - diff --git a/resources/sql/patches/028.systemagent.sql b/resources/sql/patches/028.systemagent.sql index bce57aa443..e8e23618cc 100644 --- a/resources/sql/patches/028.systemagent.sql +++ b/resources/sql/patches/028.systemagent.sql @@ -1,2 +1,2 @@ ALTER TABLE {$NAMESPACE}_user.user - ADD isSystemAgent bool not null default 0; \ No newline at end of file + ADD isSystemAgent bool not null default 0; diff --git a/resources/sql/patches/034.savedheader.sql b/resources/sql/patches/034.savedheader.sql index d7425a5c3d..cb626f20f2 100644 --- a/resources/sql/patches/034.savedheader.sql +++ b/resources/sql/patches/034.savedheader.sql @@ -1,4 +1,4 @@ CREATE TABLE {$NAMESPACE}_herald.herald_savedheader ( phid varchar(64) binary not null primary key, header varchar(255) not null -) ENGINE=InnoDB; \ No newline at end of file +) ENGINE=InnoDB; diff --git a/resources/sql/patches/035.proxyimage.sql b/resources/sql/patches/035.proxyimage.sql index 78564aa43d..425506bcf4 100644 --- a/resources/sql/patches/035.proxyimage.sql +++ b/resources/sql/patches/035.proxyimage.sql @@ -1,6 +1,6 @@ CREATE TABLE {$NAMESPACE}_file.file_proxyimage ( id int unsigned not null primary key auto_increment, - uri varchar(255) binary not null, + uri varchar(255) COLLATE `binary` not null, unique key(uri), filePHID varchar(64) binary not null ) ENGINE=InnoDB; diff --git a/resources/sql/patches/036.mailkey.sql b/resources/sql/patches/036.mailkey.sql index 6edf512a71..06e05ec64a 100644 --- a/resources/sql/patches/036.mailkey.sql +++ b/resources/sql/patches/036.mailkey.sql @@ -16,4 +16,4 @@ CREATE TABLE {$NAMESPACE}_metamta.metamta_receivedmail ( message longblob, dateCreated int unsigned not null, dateModified int unsigned not null -) engine=innodb; \ No newline at end of file +) engine=innodb; diff --git a/resources/sql/patches/040.transform.sql b/resources/sql/patches/040.transform.sql index 0f35801d43..bb47b810a1 100644 --- a/resources/sql/patches/040.transform.sql +++ b/resources/sql/patches/040.transform.sql @@ -1,7 +1,7 @@ CREATE TABLE {$NAMESPACE}_file.file_transformedfile ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, - originalPHID varchar(64) BINARY NOT NULL, - transform varchar(255) BINARY NOT NULL, + originalPHID varchar(64) COLLATE `binary` NOT NULL, + transform varchar(255) COLLATE `binary` NOT NULL, unique key (originalPHID, transform), transformedPHID varchar(64) BINARY NOT NULL, key (transformedPHID), diff --git a/resources/sql/patches/043.pastebin.sql b/resources/sql/patches/043.pastebin.sql index 5e62159474..7d4de868cb 100644 --- a/resources/sql/patches/043.pastebin.sql +++ b/resources/sql/patches/043.pastebin.sql @@ -1,5 +1,3 @@ - - CREATE TABLE {$NAMESPACE}_pastebin.pastebin_paste ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, diff --git a/resources/sql/patches/044.countdown.sql b/resources/sql/patches/044.countdown.sql index 540ab236d0..e25bb876b2 100644 --- a/resources/sql/patches/044.countdown.sql +++ b/resources/sql/patches/044.countdown.sql @@ -1,5 +1,3 @@ - - CREATE TABLE {$NAMESPACE}_countdown.countdown_timer ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, diff --git a/resources/sql/patches/047.projectstatus.sql b/resources/sql/patches/047.projectstatus.sql index 56a19a4a98..b0e563cf77 100644 --- a/resources/sql/patches/047.projectstatus.sql +++ b/resources/sql/patches/047.projectstatus.sql @@ -1,2 +1,2 @@ ALTER TABLE {$NAMESPACE}_project.project - ADD status varchar(32) not null; \ No newline at end of file + ADD status varchar(32) not null; diff --git a/resources/sql/patches/049.projectowner.sql b/resources/sql/patches/049.projectowner.sql index 98bf55bf57..894166b13a 100644 --- a/resources/sql/patches/049.projectowner.sql +++ b/resources/sql/patches/049.projectowner.sql @@ -1,2 +1,2 @@ ALTER TABLE {$NAMESPACE}_project.project_affiliation - ADD isOwner bool NOT NULL; \ No newline at end of file + ADD isOwner bool NOT NULL; diff --git a/resources/sql/patches/052.pastelanguage.sql b/resources/sql/patches/052.pastelanguage.sql index 1bfdac0b1f..b517f2dd80 100644 --- a/resources/sql/patches/052.pastelanguage.sql +++ b/resources/sql/patches/052.pastelanguage.sql @@ -1,2 +1,2 @@ ALTER TABLE {$NAMESPACE}_pastebin.pastebin_paste - ADD COLUMN language VARCHAR(64) NOT NULL; \ No newline at end of file + ADD COLUMN language VARCHAR(64) NOT NULL; diff --git a/resources/sql/patches/053.feed.sql b/resources/sql/patches/053.feed.sql index 96ae6ed0f7..46ad0b4042 100644 --- a/resources/sql/patches/053.feed.sql +++ b/resources/sql/patches/053.feed.sql @@ -1,5 +1,3 @@ - - CREATE TABLE {$NAMESPACE}_feed.feed_storydata ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, phid VARCHAR(64) BINARY NOT NULL, diff --git a/resources/sql/patches/055.add_author_to_files.sql b/resources/sql/patches/055.add_author_to_files.sql index b43a1c01d9..5c0f541c57 100644 --- a/resources/sql/patches/055.add_author_to_files.sql +++ b/resources/sql/patches/055.add_author_to_files.sql @@ -1,3 +1,3 @@ ALTER TABLE {$NAMESPACE}_file.file ADD COLUMN authorPHID VARCHAR(64) BINARY, - ADD KEY (authorPHID); \ No newline at end of file + ADD KEY (authorPHID); diff --git a/resources/sql/patches/056.slowvote.sql b/resources/sql/patches/056.slowvote.sql index 8a2912bd47..1d9064118d 100644 --- a/resources/sql/patches/056.slowvote.sql +++ b/resources/sql/patches/056.slowvote.sql @@ -1,5 +1,3 @@ - - CREATE TABLE {$NAMESPACE}_slowvote.slowvote_poll ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, question VARCHAR(255) NOT NULL, @@ -41,4 +39,4 @@ CREATE TABLE {$NAMESPACE}_slowvote.slowvote_choice ( KEY (authorPHID), dateCreated INT UNSIGNED NOT NULL, dateModified INT UNSIGNED NOT NULL -); \ No newline at end of file +); diff --git a/resources/sql/patches/057.parsecache.sql b/resources/sql/patches/057.parsecache.sql index 796fa4592d..5254e3e6e1 100644 --- a/resources/sql/patches/057.parsecache.sql +++ b/resources/sql/patches/057.parsecache.sql @@ -4,4 +4,4 @@ ALTER TABLE {$NAMESPACE}_differential.differential_changeset_parse_cache ADD dateCreated INT UNSIGNED NOT NULL; ALTER TABLE {$NAMESPACE}_differential.differential_changeset_parse_cache - ADD KEY (dateCreated); \ No newline at end of file + ADD KEY (dateCreated); diff --git a/resources/sql/patches/058.missingkeys.sql b/resources/sql/patches/058.missingkeys.sql index 51d2e10aa2..dbb7f8404d 100644 --- a/resources/sql/patches/058.missingkeys.sql +++ b/resources/sql/patches/058.missingkeys.sql @@ -8,4 +8,4 @@ ALTER TABLE {$NAMESPACE}_herald.herald_condition ADD KEY (ruleID); ALTER TABLE {$NAMESPACE}_herald.herald_action - ADD KEY (ruleID); \ No newline at end of file + ADD KEY (ruleID); diff --git a/resources/sql/patches/059.engines.php b/resources/sql/patches/059.engines.php index 5fdb3ea2ec..96e28b7a31 100644 --- a/resources/sql/patches/059.engines.php +++ b/resources/sql/patches/059.engines.php @@ -15,17 +15,18 @@ return; } -echo "There are ".count($tables)." tables using the MyISAM engine. These will ". - "now be converted to InnoDB. This process may take a few minutes, please ". - "be patient.\n"; +echo pht( + "There are %d tables using the MyISAM engine. These will now be converted ". + "to InnoDB. This process may take a few minutes, please be patient.\n", + count($tables)); foreach ($tables as $table) { $name = $table['db'].'.'.$table['tbl']; - echo "Converting {$name}...\n"; + echo pht('Converting %s...', $name)."\n"; queryfx( $conn, - "ALTER TABLE %T.%T ENGINE=InnoDB", + 'ALTER TABLE %T.%T ENGINE=InnoDB', $table['db'], $table['tbl']); } -echo "Done!\n"; +echo pht('Done!')."\n"; diff --git a/resources/sql/patches/060.phriction.sql b/resources/sql/patches/060.phriction.sql index 97a330575c..1e352caea9 100644 --- a/resources/sql/patches/060.phriction.sql +++ b/resources/sql/patches/060.phriction.sql @@ -1,5 +1,3 @@ - - CREATE TABLE {$NAMESPACE}_phriction.phriction_document ( id INT UNSIGNED NOT NULL, phid VARCHAR(64) BINARY NOT NULL, diff --git a/resources/sql/patches/061.phrictioncontent.sql b/resources/sql/patches/061.phrictioncontent.sql index 958bba3f86..9756cd1dd2 100644 --- a/resources/sql/patches/061.phrictioncontent.sql +++ b/resources/sql/patches/061.phrictioncontent.sql @@ -15,8 +15,8 @@ CREATE TABLE {$NAMESPACE}_phriction.phriction_content ( KEY (authorPHID), title VARCHAR(512) NOT NULL, slug VARCHAR(512) NOT NULL, - KEY (slug), + KEY (slug(128)), content LONGBLOB NOT NULL, dateCreated INT UNSIGNED NOT NULL, dateModified INT UNSIGNED NOT NULL -) ENGINE=InnoDB; \ No newline at end of file +) ENGINE=InnoDB; diff --git a/resources/sql/patches/062.phrictionmenu.sql b/resources/sql/patches/062.phrictionmenu.sql index 9ce4021be1..bcc80bf648 100644 --- a/resources/sql/patches/062.phrictionmenu.sql +++ b/resources/sql/patches/062.phrictionmenu.sql @@ -1,3 +1,3 @@ /* Older versions incorrectly computed the depth for the root page. */ UPDATE {$NAMESPACE}_phriction.phriction_document - SET depth = 0 where slug = '/'; \ No newline at end of file + SET depth = 0 where slug = '/'; diff --git a/resources/sql/patches/063.pasteforks.sql b/resources/sql/patches/063.pasteforks.sql index 978b2c16e4..63a5ef70b5 100644 --- a/resources/sql/patches/063.pasteforks.sql +++ b/resources/sql/patches/063.pasteforks.sql @@ -1,3 +1,3 @@ ALTER TABLE {$NAMESPACE}_pastebin.pastebin_paste ADD COLUMN parentPHID VARCHAR(64) BINARY, - ADD KEY (parentPHID); \ No newline at end of file + ADD KEY (parentPHID); diff --git a/resources/sql/patches/064.subprojects.sql b/resources/sql/patches/064.subprojects.sql index 0baebc8ae8..688e8baaac 100644 --- a/resources/sql/patches/064.subprojects.sql +++ b/resources/sql/patches/064.subprojects.sql @@ -8,4 +8,4 @@ CREATE TABLE {$NAMESPACE}_project.project_subproject ( subprojectPHID varchar(64) BINARY NOT NULL, PRIMARY KEY (subprojectPHID, projectPHID), UNIQUE KEY (projectPHID, subprojectPHID) -) ENGINE=InnoDB; \ No newline at end of file +) ENGINE=InnoDB; diff --git a/resources/sql/patches/065.sshkeys.sql b/resources/sql/patches/065.sshkeys.sql index 0fb7e1d33b..a16c3319e4 100644 --- a/resources/sql/patches/065.sshkeys.sql +++ b/resources/sql/patches/065.sshkeys.sql @@ -4,9 +4,9 @@ CREATE TABLE {$NAMESPACE}_user.user_sshkey ( key (userPHID), name varchar(255), keyType varchar(255), - keyBody varchar(32768) BINARY, + keyBody LONGBLOB, unique key (keyBody(128)), keyComment varchar(255), dateCreated INT UNSIGNED NOT NULL, dateModified INT UNSIGNED NOT NULL -) ENGINE=InnoDB; \ No newline at end of file +) ENGINE=InnoDB; diff --git a/resources/sql/patches/067.preferences.sql b/resources/sql/patches/067.preferences.sql index 4623688e52..9db23c5475 100644 --- a/resources/sql/patches/067.preferences.sql +++ b/resources/sql/patches/067.preferences.sql @@ -1 +1 @@ -/* This used to be a "directory" update. */; \ No newline at end of file +/* This used to be a "directory" update. */; diff --git a/resources/sql/patches/068.maniphestauxiliarystorage.sql b/resources/sql/patches/068.maniphestauxiliarystorage.sql index 429d0dac97..17c94f9516 100644 --- a/resources/sql/patches/068.maniphestauxiliarystorage.sql +++ b/resources/sql/patches/068.maniphestauxiliarystorage.sql @@ -1,9 +1,9 @@ -create table {$NAMESPACE}_maniphest.maniphest_taskauxiliarystorage +create table {$NAMESPACE}_maniphest.maniphest_taskauxiliarystorage (id int unsigned not null auto_increment primary key, - taskPHID varchar(64) binary not null, - name varchar(255) not null, - value varchar(255) not null, + taskPHID varchar(64) binary not null, + name varchar(255) COLLATE `binary` not null, + value varchar(255) not null, unique key (taskPHID,name), dateCreated int unsigned not null, dateModified int unsigned not null) - ENGINE = InnoDB; \ No newline at end of file + ENGINE = InnoDB; diff --git a/resources/sql/patches/076.indexedlanguages.sql b/resources/sql/patches/076.indexedlanguages.sql index 1d3069f1d9..6ff83f73ad 100644 --- a/resources/sql/patches/076.indexedlanguages.sql +++ b/resources/sql/patches/076.indexedlanguages.sql @@ -1,4 +1,4 @@ ALTER TABLE {$NAMESPACE}_repository.repository_arcanistproject ADD symbolIndexLanguages LONGBLOB NOT NULL; ALTER TABLE {$NAMESPACE}_repository.repository_arcanistproject - ADD symbolIndexProjects LONGBLOB NOT NULL; \ No newline at end of file + ADD symbolIndexProjects LONGBLOB NOT NULL; diff --git a/resources/sql/patches/078.nametoken.sql b/resources/sql/patches/078.nametoken.sql index dae0f2089c..2dfc88b23e 100644 --- a/resources/sql/patches/078.nametoken.sql +++ b/resources/sql/patches/078.nametoken.sql @@ -1,6 +1,6 @@ CREATE TABLE {$NAMESPACE}_user.user_nametoken ( token VARCHAR(255) NOT NULL, userID INT UNSIGNED NOT NULL, - KEY (token), + KEY (token(128)), key (userID) ) ENGINE=InnoDB; diff --git a/resources/sql/patches/079.nametokenindex.php b/resources/sql/patches/079.nametokenindex.php index f8b74ee39d..e0f607e0b7 100644 --- a/resources/sql/patches/079.nametokenindex.php +++ b/resources/sql/patches/079.nametokenindex.php @@ -1,18 +1,18 @@ openTransaction(); $table->beginReadLocking(); $users = $table->loadAll(); -echo count($users)." users to index"; +echo pht('%d users to index', count($users)); foreach ($users as $user) { $user->updateNameTokens(); - echo "."; + echo '.'; } $table->endReadLocking(); $table->saveTransaction(); -echo "\nDone.\n"; +echo "\n".pht('Done.')."\n"; diff --git a/resources/sql/patches/080.filekeys.sql b/resources/sql/patches/080.filekeys.sql index 2d8a35a02f..31e559012a 100644 --- a/resources/sql/patches/080.filekeys.sql +++ b/resources/sql/patches/080.filekeys.sql @@ -1,2 +1,2 @@ ALTER TABLE {$NAMESPACE}_file.file - ADD secretKey VARCHAR(20) BINARY; \ No newline at end of file + ADD secretKey VARCHAR(20) BINARY; diff --git a/resources/sql/patches/081.filekeys.php b/resources/sql/patches/081.filekeys.php index 1a4a3851fe..c129e80918 100644 --- a/resources/sql/patches/081.filekeys.php +++ b/resources/sql/patches/081.filekeys.php @@ -1,12 +1,12 @@ openTransaction(); $table->beginReadLocking(); $files = $table->loadAllWhere('secretKey IS NULL'); -echo count($files).' files to generate keys for'; +echo pht('%d files to generate keys for', count($files)); foreach ($files as $file) { queryfx( $file->establishConnection('w'), @@ -19,4 +19,4 @@ $table->endReadLocking(); $table->saveTransaction(); -echo "\nDone.\n"; +echo "\n".pht('Done.')."\n"; diff --git a/resources/sql/patches/086.formeraffil.sql b/resources/sql/patches/086.formeraffil.sql index 2394a10aa9..b2f44a5b65 100644 --- a/resources/sql/patches/086.formeraffil.sql +++ b/resources/sql/patches/086.formeraffil.sql @@ -1 +1 @@ -ALTER TABLE {$NAMESPACE}_project.project_affiliation DROP status; \ No newline at end of file +ALTER TABLE {$NAMESPACE}_project.project_affiliation DROP status; diff --git a/resources/sql/patches/087.phrictiondelete.sql b/resources/sql/patches/087.phrictiondelete.sql index b07c5358ff..384960bc87 100644 --- a/resources/sql/patches/087.phrictiondelete.sql +++ b/resources/sql/patches/087.phrictiondelete.sql @@ -5,4 +5,4 @@ ALTER TABLE {$NAMESPACE}_phriction.phriction_content ADD changeType INT UNSIGNED NOT NULL DEFAULT 0; ALTER TABLE {$NAMESPACE}_phriction.phriction_content - ADD changeRef INT UNSIGNED DEFAULT NULL; \ No newline at end of file + ADD changeRef INT UNSIGNED DEFAULT NULL; diff --git a/resources/sql/patches/088.audit.sql b/resources/sql/patches/088.audit.sql index ea93e1c928..63ace7f88c 100644 --- a/resources/sql/patches/088.audit.sql +++ b/resources/sql/patches/088.audit.sql @@ -1,5 +1,3 @@ - - ALTER TABLE {$NAMESPACE}_owners.owners_packagecommitrelationship ADD COLUMN `auditStatus` varchar(64) NOT NULL, ADD COLUMN `auditReasons` longtext NOT NULL, diff --git a/resources/sql/patches/090.forceuniqueprojectnames.php b/resources/sql/patches/090.forceuniqueprojectnames.php index 1bd5255886..486856c1c3 100644 --- a/resources/sql/patches/090.forceuniqueprojectnames.php +++ b/resources/sql/patches/090.forceuniqueprojectnames.php @@ -1,6 +1,6 @@ openTransaction(); $table->beginReadLocking(); @@ -10,13 +10,14 @@ $slug_map = array(); foreach ($projects as $project) { - $project->setPhrictionSlug($project->getName()); - $slug = $project->getPhrictionSlug(); - if ($slug == '/') { + $slug = PhabricatorSlug::normalizeProjectSlug($project->getName()); + + if (!strlen($slug)) { $project_id = $project->getID(); - echo "Project #{$project_id} doesn't have a meaningful name...\n"; - $project->setName(trim('Unnamed Project '.$project->getName())); + echo pht("Project #%d doesn't have a meaningful name...", $project_id)."\n"; + $project->setName(trim(pht('Unnamed Project %s', $project->getName()))); } + $slug_map[$slug][] = $project->getID(); } @@ -25,15 +26,18 @@ if (count($similar) <= 1) { continue; } - echo "Too many projects are similar to '{$slug}'...\n"; + echo pht("Too many projects are similar to '%s'...", $slug)."\n"; foreach (array_slice($similar, 1, null, true) as $key => $project_id) { $project = $projects[$project_id]; $old_name = $project->getName(); $new_name = rename_project($project, $projects); - echo "Renaming project #{$project_id} ". - "from '{$old_name}' to '{$new_name}'.\n"; + echo pht( + "Renaming project #%d from '%s' to '%s'.\n", + $project_id, + $old_name, + $new_name); $project->setName($new_name); } } @@ -44,10 +48,10 @@ foreach ($update as $key => $project) { $id = $project->getID(); $name = $project->getName(); - $project->setPhrictionSlug($name); - $slug = $project->getPhrictionSlug(); - echo "Updating project #{$id} '{$name}' ({$slug})..."; + $slug = PhabricatorSlug::normalizeProjectSlug($name).'/'; + + echo pht("Updating project #%d '%s' (%s)... ", $id, $name, $slug); try { queryfx( $project->establishConnection('w'), @@ -57,22 +61,23 @@ $slug, $project->getID()); unset($update[$key]); - echo "okay.\n"; - } catch (AphrontQueryDuplicateKeyException $ex) { - echo "failed, will retry.\n"; + echo pht('OKAY')."\n"; + } catch (AphrontDuplicateKeyQueryException $ex) { + echo pht('Failed, will retry.')."\n"; } } if (count($update) == $size) { throw new Exception( - "Failed to make any progress while updating projects. Schema upgrade ". - "has failed. Go manually fix your project names to be unique (they are ". - "probably ridiculous?) and then try again."); + pht( + 'Failed to make any progress while updating projects. Schema upgrade '. + 'has failed. Go manually fix your project names to be unique '. + '(they are probably ridiculous?) and then try again.')); } } $table->endReadLocking(); $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; /** @@ -83,15 +88,17 @@ function rename_project($project, $projects) { $suffix = 2; while (true) { $new_name = $project->getName().' ('.$suffix.')'; - $project->setPhrictionSlug($new_name); - $new_slug = $project->getPhrictionSlug(); + + $new_slug = PhabricatorSlug::normalizeProjectSlug($new_name).'/'; $okay = true; foreach ($projects as $other) { if ($other->getID() == $project->getID()) { continue; } - if ($other->getPhrictionSlug() == $new_slug) { + + $other_slug = PhabricatorSlug::normalizeProjectSlug($other->getName()); + if ($other_slug == $new_slug) { $okay = false; break; } diff --git a/resources/sql/patches/092.dropgithubnotification.sql b/resources/sql/patches/092.dropgithubnotification.sql index 9fcfa76629..95a24fa6b8 100644 --- a/resources/sql/patches/092.dropgithubnotification.sql +++ b/resources/sql/patches/092.dropgithubnotification.sql @@ -1 +1 @@ -DROP TABLE {$NAMESPACE}_repository.repository_githubnotification; \ No newline at end of file +DROP TABLE {$NAMESPACE}_repository.repository_githubnotification; diff --git a/resources/sql/patches/093.gitremotes.php b/resources/sql/patches/093.gitremotes.php index 7af320bf89..5817919e24 100644 --- a/resources/sql/patches/093.gitremotes.php +++ b/resources/sql/patches/093.gitremotes.php @@ -1,6 +1,6 @@ openTransaction(); @@ -30,8 +30,13 @@ $id = $repo['id']; $name = $repo['name']; - echo "Updating default branch for repository #{$id} '{$name}' from ". - "'{$old}' to '{$new}' to remove the explicit remote.\n"; + echo pht( + "Updating default branch for repository #%d '%s' from ". + "'%s' to '%s' to remove the explicit remote.\n", + $id, + $name, + $old, + $new); queryfx( $conn_w, 'UPDATE %T SET details = %s WHERE id = %d', @@ -41,4 +46,4 @@ } $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/095.directory.sql b/resources/sql/patches/095.directory.sql index 4623688e52..9db23c5475 100644 --- a/resources/sql/patches/095.directory.sql +++ b/resources/sql/patches/095.directory.sql @@ -1 +1 @@ -/* This used to be a "directory" update. */; \ No newline at end of file +/* This used to be a "directory" update. */; diff --git a/resources/sql/patches/097.heraldruletypes.sql b/resources/sql/patches/097.heraldruletypes.sql index b975403737..a38fb99423 100644 --- a/resources/sql/patches/097.heraldruletypes.sql +++ b/resources/sql/patches/097.heraldruletypes.sql @@ -1,2 +1,2 @@ ALTER TABLE {$NAMESPACE}_herald.herald_rule ADD ruleType varchar(255) not null DEFAULT 'global'; -CREATE INDEX IDX_RULE_TYPE on {$NAMESPACE}_herald.herald_rule (ruleType); \ No newline at end of file +CREATE INDEX IDX_RULE_TYPE on {$NAMESPACE}_herald.herald_rule (ruleType(128)); diff --git a/resources/sql/patches/098.heraldruletypemigration.php b/resources/sql/patches/098.heraldruletypemigration.php index 9340455b2e..896f2353f3 100644 --- a/resources/sql/patches/098.heraldruletypemigration.php +++ b/resources/sql/patches/098.heraldruletypemigration.php @@ -1,6 +1,6 @@ openTransaction(); $table->beginReadLocking(); @@ -41,11 +41,11 @@ $rule->getRuleType(), $rule->getID()); - echo "Setting rule '" . $rule->getName() . "' to personal. "; + echo pht("Setting rule '%s' to personal.", $rule->getName())."\n"; } } } $table->endReadLocking(); $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/099.drydock.sql b/resources/sql/patches/099.drydock.sql index 87187f8bf7..74ae726a25 100644 --- a/resources/sql/patches/099.drydock.sql +++ b/resources/sql/patches/099.drydock.sql @@ -1,5 +1,3 @@ - - CREATE TABLE {$NAMESPACE}_drydock.drydock_resource ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, phid VARCHAR(64) BINARY NOT NULL, diff --git a/resources/sql/patches/102.heraldcleanup.php b/resources/sql/patches/102.heraldcleanup.php index 22f198df86..f7f58131ea 100644 --- a/resources/sql/patches/102.heraldcleanup.php +++ b/resources/sql/patches/102.heraldcleanup.php @@ -1,39 +1,8 @@ openTransaction(); -$table->beginReadLocking(); +// Once, this migration deleted some unnecessary rows written by Herald before +// January 2012. These rows don't hurt anything, they just cluttered up the +// database a bit. -$rules = $table->loadAll(); -foreach ($rules as $key => $rule) { - $first_policy = HeraldRepetitionPolicyConfig::toInt( - HeraldRepetitionPolicyConfig::FIRST); - if ($rule->getRepetitionPolicy() != $first_policy) { - unset($rules[$key]); - } -} - -$conn_w = $table->establishConnection('w'); - -$clause = ''; -if ($rules) { - $clause = qsprintf( - $conn_w, - 'WHERE ruleID NOT IN (%Ld)', - mpull($rules, 'getID')); -} - -echo "This may take a moment"; -do { - queryfx( - $conn_w, - 'DELETE FROM %T %Q LIMIT 1000', - HeraldRule::TABLE_RULE_APPLIED, - $clause); - echo "."; -} while ($conn_w->getAffectedRows()); - -$table->endReadLocking(); -$table->saveTransaction(); -echo "\nDone.\n"; +// The migration was removed in January 2018 to make maintenance on rule +// repetition policies easier. diff --git a/resources/sql/patches/106.chatlog.sql b/resources/sql/patches/106.chatlog.sql index 419420f410..bbb9be945e 100644 --- a/resources/sql/patches/106.chatlog.sql +++ b/resources/sql/patches/106.chatlog.sql @@ -1,4 +1,3 @@ - CREATE TABLE {$NAMESPACE}_chatlog.chatlog_event ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, channel VARCHAR(64) BINARY NOT NULL, diff --git a/resources/sql/patches/107.oauthserver.sql b/resources/sql/patches/107.oauthserver.sql index c2f1ae92cc..2865535af1 100644 --- a/resources/sql/patches/107.oauthserver.sql +++ b/resources/sql/patches/107.oauthserver.sql @@ -1,5 +1,3 @@ - - CREATE TABLE `{$NAMESPACE}_oauth_server`.`oauth_server_oauthserverclient` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `phid` varchar(64) BINARY NOT NULL, @@ -48,4 +46,3 @@ CREATE TABLE `{$NAMESPACE}_oauth_server`.`oauth_server_oauthserveraccesstoken` ( PRIMARY KEY (`id`), UNIQUE KEY `token` (`token`) ) ENGINE=InnoDB; - diff --git a/resources/sql/patches/108.oauthscope.sql b/resources/sql/patches/108.oauthscope.sql index f17a296956..e7d8155572 100644 --- a/resources/sql/patches/108.oauthscope.sql +++ b/resources/sql/patches/108.oauthscope.sql @@ -3,4 +3,3 @@ ALTER TABLE `{$NAMESPACE}_oauth_server`.`oauth_server_oauthclientauthorization` ALTER TABLE `{$NAMESPACE}_oauth_server`.`oauth_server_oauthserveraccesstoken` DROP `dateExpires`; - diff --git a/resources/sql/patches/109.oauthclientphidkey.sql b/resources/sql/patches/109.oauthclientphidkey.sql index 5570043612..90ea7f4288 100644 --- a/resources/sql/patches/109.oauthclientphidkey.sql +++ b/resources/sql/patches/109.oauthclientphidkey.sql @@ -1,3 +1,2 @@ ALTER TABLE `{$NAMESPACE}_oauth_server`.`oauth_server_oauthserverclient` ADD KEY `creatorPHID` (`creatorPHID`) - diff --git a/resources/sql/patches/110.commitaudit.sql b/resources/sql/patches/110.commitaudit.sql index 4fffa055a8..9c051ee1ca 100644 --- a/resources/sql/patches/110.commitaudit.sql +++ b/resources/sql/patches/110.commitaudit.sql @@ -8,4 +8,4 @@ ALTER TABLE {$NAMESPACE}_repository.repository_commit ADD auditStatus INT UNSIGNED NOT NULL; ALTER TABLE {$NAMESPACE}_repository.repository_commit - ADD KEY (authorPHID, auditStatus, epoch); \ No newline at end of file + ADD KEY (authorPHID, auditStatus, epoch); diff --git a/resources/sql/patches/111.commitauditmigration.php b/resources/sql/patches/111.commitauditmigration.php index 489a07d789..935317b577 100644 --- a/resources/sql/patches/111.commitauditmigration.php +++ b/resources/sql/patches/111.commitauditmigration.php @@ -1,6 +1,6 @@ openTransaction(); @@ -31,10 +31,10 @@ } $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; -echo "Updating old commit mailKeys...\n"; +echo pht('Updating old commit %s...', 'mailKeys')."\n"; $table->openTransaction(); $commits = queryfx_all( @@ -55,4 +55,4 @@ } $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/112.oauthaccesscoderedirecturi.sql b/resources/sql/patches/112.oauthaccesscoderedirecturi.sql index 6131d63aca..56f258453e 100644 --- a/resources/sql/patches/112.oauthaccesscoderedirecturi.sql +++ b/resources/sql/patches/112.oauthaccesscoderedirecturi.sql @@ -1,3 +1,2 @@ ALTER TABLE `{$NAMESPACE}_oauth_server`.`oauth_server_oauthserverauthorizationcode` ADD `redirectURI` varchar(255) NOT NULL - diff --git a/resources/sql/patches/116.utf8-backup-first-expect-wait.sql b/resources/sql/patches/116.utf8-backup-first-expect-wait.sql index 7d463b6dc4..eda5573641 100644 --- a/resources/sql/patches/116.utf8-backup-first-expect-wait.sql +++ b/resources/sql/patches/116.utf8-backup-first-expect-wait.sql @@ -1123,6 +1123,3 @@ ALTER TABLE `{$NAMESPACE}_xhpastview`.`xhpastview_parsetree` MODIFY `authorPHID` varchar(64) COLLATE utf8_bin, MODIFY `input` longtext COLLATE utf8_bin NOT NULL, MODIFY `stdout` longtext COLLATE utf8_bin NOT NULL; - - - diff --git a/resources/sql/patches/117.repositorydescription.php b/resources/sql/patches/117.repositorydescription.php index 18ee4a463f..692a783358 100644 --- a/resources/sql/patches/117.repositorydescription.php +++ b/resources/sql/patches/117.repositorydescription.php @@ -2,5 +2,5 @@ $conn = id(new PhabricatorRepository())->establishConnection('w'); if (queryfx_one($conn, "SHOW COLUMNS FROM `repository` LIKE 'description'")) { - queryfx($conn, "ALTER TABLE `repository` DROP `description`"); + queryfx($conn, 'ALTER TABLE `repository` DROP `description`'); } diff --git a/resources/sql/patches/120.noop.sql b/resources/sql/patches/120.noop.sql index b730eaa0d3..a8ab6db8fd 100644 --- a/resources/sql/patches/120.noop.sql +++ b/resources/sql/patches/120.noop.sql @@ -1,2 +1,2 @@ /* Do nothing, patch 121 got committed before there was a patch 120. */ -SELECT 1; \ No newline at end of file +SELECT 1; diff --git a/resources/sql/patches/122.flag.sql b/resources/sql/patches/122.flag.sql index 6b666a6855..7f66669930 100644 --- a/resources/sql/patches/122.flag.sql +++ b/resources/sql/patches/122.flag.sql @@ -1,5 +1,3 @@ - - CREATE TABLE {$NAMESPACE}_flag.flag ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, ownerPHID varchar(64) COLLATE utf8_bin NOT NULL, @@ -13,4 +11,4 @@ CREATE TABLE {$NAMESPACE}_flag.flag ( UNIQUE KEY (ownerPHID, type, objectPHID), KEY (objectPHID) -) ENGINE=InnoDB; \ No newline at end of file +) ENGINE=InnoDB; diff --git a/resources/sql/patches/124.subpriority.sql b/resources/sql/patches/124.subpriority.sql index 2133b6e574..cd826a1efc 100644 --- a/resources/sql/patches/124.subpriority.sql +++ b/resources/sql/patches/124.subpriority.sql @@ -7,5 +7,3 @@ ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task /* Seed the subpriority column with reasonable values that keep order stable. */ UPDATE {$NAMESPACE}_maniphest.maniphest_task SET subpriority = (UNIX_TIMESTAMP() - dateModified); - - diff --git a/resources/sql/patches/128.phabricatorcom.sql b/resources/sql/patches/128.phabricatorcom.sql index 4623688e52..9db23c5475 100644 --- a/resources/sql/patches/128.phabricatorcom.sql +++ b/resources/sql/patches/128.phabricatorcom.sql @@ -1 +1 @@ -/* This used to be a "directory" update. */; \ No newline at end of file +/* This used to be a "directory" update. */; diff --git a/resources/sql/patches/131.migraterevisionquery.php b/resources/sql/patches/131.migraterevisionquery.php index 027edbaeb3..c3f97a04a5 100644 --- a/resources/sql/patches/131.migraterevisionquery.php +++ b/resources/sql/patches/131.migraterevisionquery.php @@ -1,35 +1,3 @@ openTransaction(); -$table->beginReadLocking(); -$conn_w = $table->establishConnection('w'); - -echo "Migrating revisions"; -do { - $revisions = $table->loadAllWhere('branchName IS NULL LIMIT 1000'); - - foreach ($revisions as $revision) { - echo "."; - - $diff = $revision->loadActiveDiff(); - if (!$diff) { - continue; - } - - $branch_name = $diff->getBranch(); - $arc_project_phid = $diff->getArcanistProjectPHID(); - - queryfx( - $conn_w, - 'UPDATE %T SET branchName = %s, arcanistProjectPHID = %s WHERE id = %d', - $table->getTableName(), - $branch_name, - $arc_project_phid, - $revision->getID()); - } -} while (count($revisions) == 1000); - -$table->endReadLocking(); -$table->saveTransaction(); -echo "\nDone.\n"; +// This migration has been dropped, see T7604 for details. diff --git a/resources/sql/patches/132.phame.sql b/resources/sql/patches/132.phame.sql index e56de6fe91..be513ea050 100644 --- a/resources/sql/patches/132.phame.sql +++ b/resources/sql/patches/132.phame.sql @@ -1,5 +1,3 @@ - - CREATE TABLE `{$NAMESPACE}_phame`.`phame_post` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `phid` VARCHAR(64) BINARY NOT NULL COLLATE utf8_bin, diff --git a/resources/sql/patches/133.imagemacro.sql b/resources/sql/patches/133.imagemacro.sql index 01852c6b48..1477fd879f 100644 --- a/resources/sql/patches/133.imagemacro.sql +++ b/resources/sql/patches/133.imagemacro.sql @@ -1,2 +1,2 @@ -ALTER IGNORE TABLE `{$NAMESPACE}_file`.`file_imagemacro` - ADD UNIQUE `name` (`name`); +ALTER TABLE `{$NAMESPACE}_file`.`file_imagemacro` + ADD UNIQUE KEY `name` (`name`); diff --git a/resources/sql/patches/20121209.pholioxactions.sql b/resources/sql/patches/20121209.pholioxactions.sql index 70f2280057..ab302801ba 100644 --- a/resources/sql/patches/20121209.pholioxactions.sql +++ b/resources/sql/patches/20121209.pholioxactions.sql @@ -48,4 +48,3 @@ CREATE TABLE {$NAMESPACE}_pholio.pholio_transaction_comment ( UNIQUE KEY `key_draft` (authorPHID, mockID, transactionPHID) ) ENGINE=InnoDB, COLLATE utf8_general_ci; - diff --git a/resources/sql/patches/20121209.xmacromigrate.php b/resources/sql/patches/20121209.xmacromigrate.php index 0372faafa7..bdd9fc1276 100644 --- a/resources/sql/patches/20121209.xmacromigrate.php +++ b/resources/sql/patches/20121209.xmacromigrate.php @@ -1,6 +1,6 @@ openTransaction(); @@ -9,7 +9,7 @@ continue; } - echo "."; + echo '.'; queryfx( $macro->establishConnection('w'), @@ -20,4 +20,4 @@ } $table->saveTransaction(); -echo "\nDone.\n"; +echo "\n".pht('Done.')."\n"; diff --git a/resources/sql/patches/20130111.conpherence.sql b/resources/sql/patches/20130111.conpherence.sql index bea6b1820e..519271771b 100644 --- a/resources/sql/patches/20130111.conpherence.sql +++ b/resources/sql/patches/20130111.conpherence.sql @@ -1,4 +1,3 @@ - CREATE TABLE {$NAMESPACE}_conpherence.conpherence_thread ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, phid VARCHAR(64) NOT NULL COLLATE utf8_bin, @@ -80,4 +79,3 @@ CREATE TABLE {$NAMESPACE}_conpherence.conpherence_transaction_comment ( UNIQUE KEY `key_draft` (authorPHID, conpherencePHID, transactionPHID) ) ENGINE=InnoDB, COLLATE utf8_general_ci; - diff --git a/resources/sql/patches/20130127.altheraldtranscript.sql b/resources/sql/patches/20130127.altheraldtranscript.sql index 5b59c4d40b..2f3f916df0 100644 --- a/resources/sql/patches/20130127.altheraldtranscript.sql +++ b/resources/sql/patches/20130127.altheraldtranscript.sql @@ -1,3 +1,2 @@ ALTER TABLE `{$NAMESPACE}_herald`.`herald_transcript` DROP `psth`; - diff --git a/resources/sql/patches/20130131.conpherencepics.sql b/resources/sql/patches/20130131.conpherencepics.sql index 421291225f..0b22a89967 100644 --- a/resources/sql/patches/20130131.conpherencepics.sql +++ b/resources/sql/patches/20130131.conpherencepics.sql @@ -1,6 +1,6 @@ -ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread +ALTER TABLE {$NAMESPACE}_conpherence.conpherence_thread DROP imagePHID, ADD imagePHIDs LONGTEXT COLLATE utf8_bin NOT NULL AFTER title; -UPDATE {$NAMESPACE}_conpherence.conpherence_thread +UPDATE {$NAMESPACE}_conpherence.conpherence_thread SET imagePHIDs = '{}' WHERE imagePHIDs = ''; diff --git a/resources/sql/patches/20130201.revisionunsubscribed.php b/resources/sql/patches/20130201.revisionunsubscribed.php index b15379893b..904fe1cc86 100644 --- a/resources/sql/patches/20130201.revisionunsubscribed.php +++ b/resources/sql/patches/20130201.revisionunsubscribed.php @@ -1,6 +1,6 @@ openTransaction(); @@ -11,7 +11,7 @@ 'SELECT id, phid, unsubscribed FROM differential_revision'); foreach ($revs as $rev) { - echo "."; + echo '.'; $unsubscribed = json_decode($rev['unsubscribed']); if (!$unsubscribed) { @@ -19,15 +19,14 @@ } $editor = new PhabricatorEdgeEditor(); - $editor->setSuppressEvents(true); foreach ($unsubscribed as $user_phid => $_) { $editor->addEdge( $rev['phid'], - PhabricatorEdgeConfig::TYPE_OBJECT_HAS_UNSUBSCRIBER, + PhabricatorObjectHasUnsubscriberEdgeType::EDGECONST , $user_phid); } $editor->save(); } $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130214.chatlogchannel.sql b/resources/sql/patches/20130214.chatlogchannel.sql index a28b1d0a4b..6bb0a777ac 100644 --- a/resources/sql/patches/20130214.chatlogchannel.sql +++ b/resources/sql/patches/20130214.chatlogchannel.sql @@ -1,4 +1,3 @@ - CREATE TABLE {$NAMESPACE}_chatlog.chatlog_channel ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, serviceName VARCHAR(64) COLLATE utf8_bin NOT NULL, diff --git a/resources/sql/patches/20130215.phabricatorfileaddttl.sql b/resources/sql/patches/20130215.phabricatorfileaddttl.sql index d8c3cbf8b3..eece5414e8 100644 --- a/resources/sql/patches/20130215.phabricatorfileaddttl.sql +++ b/resources/sql/patches/20130215.phabricatorfileaddttl.sql @@ -1,3 +1,3 @@ -ALTER TABLE {$NAMESPACE}_file.file - ADD ttl INT(10) UNSIGNED DEFAULT NULL, +ALTER TABLE {$NAMESPACE}_file.file + ADD ttl INT(10) UNSIGNED DEFAULT NULL, ADD KEY key_ttl (ttl); diff --git a/resources/sql/patches/20130218.updatechannelid.php b/resources/sql/patches/20130218.updatechannelid.php index b8b6d8c416..cf60544a3b 100644 --- a/resources/sql/patches/20130218.updatechannelid.php +++ b/resources/sql/patches/20130218.updatechannelid.php @@ -1,6 +1,6 @@ saveTransaction(); $channel_table->saveTransaction(); -echo "\nDone.\n"; +echo "\n".pht('Done.')."\n"; diff --git a/resources/sql/patches/20130219.commitsummarymig.php b/resources/sql/patches/20130219.commitsummarymig.php index a09534ef47..f47016804d 100644 --- a/resources/sql/patches/20130219.commitsummarymig.php +++ b/resources/sql/patches/20130219.commitsummarymig.php @@ -1,25 +1,31 @@ establishConnection('w'); +$commits = new LiskMigrationIterator($table); foreach ($commits as $commit) { - echo 'Filling Commit #'.$commit->getID()."\n"; + echo pht('Filling Commit #%d', $commit->getID())."\n"; if (strlen($commit->getSummary())) { continue; } - $data = $commit->loadOneRelative( - new PhabricatorRepositoryCommitData(), - 'commitID'); + $data = id(new PhabricatorRepositoryCommitData())->loadOneWhere( + 'commitID = %d', + $commit->getID()); if (!$data) { continue; } - $commit->setSummary($data->getSummary()); - $commit->save(); + queryfx( + $conn_w, + 'UPDATE %T SET summary = %s WHERE id = %d', + $commit->getTableName(), + $data->getSummary(), + $commit->getID()); } -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130317.phrictionedge.sql b/resources/sql/patches/20130317.phrictionedge.sql index fdeed8f178..802d259bcb 100644 --- a/resources/sql/patches/20130317.phrictionedge.sql +++ b/resources/sql/patches/20130317.phrictionedge.sql @@ -13,4 +13,3 @@ CREATE TABLE {$NAMESPACE}_phriction.edgedata ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, data LONGTEXT NOT NULL COLLATE utf8_bin ) ENGINE=InnoDB, COLLATE utf8_general_ci; - diff --git a/resources/sql/patches/20130320.phlux.sql b/resources/sql/patches/20130320.phlux.sql index fc3db93a42..07e6fd9949 100644 --- a/resources/sql/patches/20130320.phlux.sql +++ b/resources/sql/patches/20130320.phlux.sql @@ -29,4 +29,3 @@ CREATE TABLE {$NAMESPACE}_phlux.phlux_transaction ( UNIQUE KEY `key_phid` (phid), KEY `key_object` (objectPHID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; - diff --git a/resources/sql/patches/20130322.phortune.sql b/resources/sql/patches/20130322.phortune.sql index 5105716972..5a9447aab0 100644 --- a/resources/sql/patches/20130322.phortune.sql +++ b/resources/sql/patches/20130322.phortune.sql @@ -43,4 +43,3 @@ CREATE TABLE {$NAMESPACE}_phortune.edgedata ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, data LONGTEXT NOT NULL COLLATE utf8_bin ) ENGINE=InnoDB DEFAULT CHARSET=utf8; - diff --git a/resources/sql/patches/20130403.conpherencecachemig.php b/resources/sql/patches/20130403.conpherencecachemig.php index ffc50006c0..cad9fc626d 100644 --- a/resources/sql/patches/20130403.conpherencecachemig.php +++ b/resources/sql/patches/20130403.conpherencecachemig.php @@ -1,6 +1,7 @@ openTransaction(); @@ -10,7 +11,7 @@ $conpherences = new LiskMigrationIterator($table); foreach ($conpherences as $conpherence) { - echo 'Migrating conpherence #'.$conpherence->getID()."\n"; + echo pht('Migrating conpherence #%d', $conpherence->getID())."\n"; $participants = id(new ConpherenceParticipant()) ->loadAllWhere('conpherencePHID = %s', $conpherence->getPHID()); @@ -61,4 +62,4 @@ } $table->saveTransaction(); -echo "\nDone.\n"; +echo "\n".pht('Done.')."\n"; diff --git a/resources/sql/patches/20130409.commitdrev.php b/resources/sql/patches/20130409.commitdrev.php index 300b282380..a264e8edeb 100644 --- a/resources/sql/patches/20130409.commitdrev.php +++ b/resources/sql/patches/20130409.commitdrev.php @@ -1,14 +1,16 @@ setSuppressEvents(true); +$editor = new PhabricatorEdgeEditor(); $commit_table->establishConnection('w'); $edges = 0; foreach (new LiskMigrationIterator($commit_table) as $commit) { - $data = $commit->loadOneRelative($data_table, 'commitID'); + $data = $data_table->loadOneWhere( + 'commitID = %d', + $commit->getID()); if (!$data) { continue; } @@ -18,16 +20,16 @@ continue; } - $commit_drev = PhabricatorEdgeConfig::TYPE_COMMIT_HAS_DREV; + $commit_drev = DiffusionCommitHasRevisionEdgeType::EDGECONST; $editor->addEdge($commit->getPHID(), $commit_drev, $revision_phid); $edges++; if ($edges % 256 == 0) { - echo "."; + echo '.'; $editor->save(); - $editor = id(new PhabricatorEdgeEditor())->setSuppressEvents(true); + $editor = new PhabricatorEdgeEditor(); } } -echo "."; +echo '.'; $editor->save(); -echo "\nDone.\n"; +echo "\n".pht('Done.')."\n"; diff --git a/resources/sql/patches/20130417.externalaccount.sql b/resources/sql/patches/20130417.externalaccount.sql index 0d87db0afb..806117709a 100644 --- a/resources/sql/patches/20130417.externalaccount.sql +++ b/resources/sql/patches/20130417.externalaccount.sql @@ -1,4 +1,3 @@ - CREATE TABLE {$NAMESPACE}_user.externalaccount ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, phid VARCHAR(64) COLLATE utf8_bin NOT NULL UNIQUE KEY, diff --git a/resources/sql/patches/20130502.countdownrevamp2.php b/resources/sql/patches/20130502.countdownrevamp2.php index f4fc96413d..04d998dab9 100644 --- a/resources/sql/patches/20130502.countdownrevamp2.php +++ b/resources/sql/patches/20130502.countdownrevamp2.php @@ -1,6 +1,6 @@ openTransaction(); @@ -9,7 +9,7 @@ continue; } - echo "."; + echo '.'; queryfx( $countdown->establishConnection('w'), @@ -20,4 +20,4 @@ } $table->saveTransaction(); -echo "\nDone.\n"; +echo "\n".pht('Done.')."\n"; diff --git a/resources/sql/patches/20130507.releephrqmailkeypop.php b/resources/sql/patches/20130507.releephrqmailkeypop.php index 49c1bc6495..016381dc58 100644 --- a/resources/sql/patches/20130507.releephrqmailkeypop.php +++ b/resources/sql/patches/20130507.releephrqmailkeypop.php @@ -1,6 +1,6 @@ openTransaction(); @@ -17,11 +17,11 @@ $rq->getTableName(), Filesystem::readRandomCharacters(20), $id); - echo("Generated Key\n"); + echo pht('Generated Key')."\n"; } else { echo "-\n"; } } $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130508.releephtransactionsmig.php b/resources/sql/patches/20130508.releephtransactionsmig.php index 9aaf109ec2..c5203cf9b6 100644 --- a/resources/sql/patches/20130508.releephtransactionsmig.php +++ b/resources/sql/patches/20130508.releephtransactionsmig.php @@ -1,131 +1,8 @@ openTransaction(); -$table->beginReadLocking(); - -foreach (new LiskMigrationIterator($table) as $rq) { - printf("RQ%d:", $rq->getID()); - - $intents_cursor = array(); - $last_pick_status = null; - $last_commit_id = null; - - foreach ($rq->loadEvents() as $event) { - $author = $event->getActorPHID(); - $details = $event->getDetails(); - - $content_source = PhabricatorContentSource::newForSource( - PhabricatorContentSource::SOURCE_UNKNOWN, - array('ReleephRequestEventID' => $event->getID())); - - $xaction = id(new ReleephRequestTransaction()) - ->setObjectPHID($rq->getPHID()) - ->setAuthorPHID($author) - ->setContentSource($content_source) - ->setDateCreated($event->getDateCreated()) - ->setDateModified($event->getDateModified()) - ->setViewPolicy(PhabricatorPolicies::POLICY_PUBLIC) - ->setEditPolicy($author); - - printf(" %s(#%d)", $event->getType(), $event->getID()); - - switch ($event->getType()) { - case ReleephRequestEvent::TYPE_COMMENT: - $xaction - ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) - ->save(); // to generate a PHID - $comment = id(new ReleephRequestTransactionComment()) - ->setAuthorPHID($author) - ->setTransactionPHID($xaction->getPHID()) - ->setViewPolicy(PhabricatorPolicies::POLICY_PUBLIC) - ->setEditPolicy($author) - ->setCommentVersion(1) - ->setContent($event->getComment()) - ->setContentSource($content_source) - ->save(); - $xaction - ->setCommentPHID($comment->getPHID()) - ->setCommentVersion(1); - break; - - case ReleephRequestEvent::TYPE_STATUS: - // Ignore STATUS events; these are legacy events that we no longer - // support anyway! - continue 2; - - case ReleephRequestEvent::TYPE_USER_INTENT: - $old_intent = idx($intents_cursor, $author); - $new_intent = $event->getDetail('newIntent'); - $xaction - ->setTransactionType(ReleephRequestTransaction::TYPE_USER_INTENT) - ->setMetadataValue('isAuthoritative', $event->getDetail('wasPusher')) - ->setOldValue($old_intent) - ->setNewValue($new_intent); - $intents_cursor[$author] = $new_intent; - break; - - case ReleephRequestEvent::TYPE_PICK_STATUS: - $new_pick_status = $event->getDetail('newPickStatus'); - $xaction - ->setTransactionType(ReleephRequestTransaction::TYPE_PICK_STATUS) - ->setOldValue($last_pick_status) - ->setNewValue($new_pick_status); - $last_pick_status = $new_pick_status; - break; - - case ReleephRequestEvent::TYPE_COMMIT: - $new_commit_id = $event->getDetail('newCommitIdentifier'); - $xaction - ->setTransactionType(ReleephRequestTransaction::TYPE_COMMIT) - ->setMetadataValue('action', $event->getDetail('action')) - ->setOldValue($last_commit_id) - ->setNewValue($new_commit_id); - $last_commit_id = $new_commit_id; - break; - - case ReleephRequestEvent::TYPE_DISCOVERY: - $xaction - ->setTransactionType(ReleephRequestTransaction::TYPE_DISCOVERY) - ->setNewValue($event->getDetail('newCommitPHID')); - break; - - case ReleephRequestEvent::TYPE_CREATE: - $xaction - ->setTransactionType(ReleephRequestTransaction::TYPE_REQUEST) - ->setOldValue(null) - ->setNewValue($rq->getRequestCommitPHID()); - break; - - case ReleephRequestEvent::TYPE_MANUAL_ACTION: - $xaction - ->setTransactionType( - ReleephRequestTransaction::TYPE_MANUAL_IN_BRANCH); - switch ($event->getDetail('action')) { - case 'pick': - $xaction->setNewValue(1); - break; - - case 'revert': - $xaction->setNewValue(0); - break; - } - break; - - default: - throw new Exception(sprintf( - "Unhandled ReleephRequestEvent type '%s' in RQ%d", - $event->getType(), - $rq->getID())); - } - - $xaction->save(); - } - echo("\n"); -} - -$table->endReadLocking(); -$table->saveTransaction(); -echo "Done.\n"; +echo pht('(This migration is obsolete.)')."\n"; diff --git a/resources/sql/patches/20130519.diviner.sql b/resources/sql/patches/20130519.diviner.sql index fc746bb354..7adc386baa 100644 --- a/resources/sql/patches/20130519.diviner.sql +++ b/resources/sql/patches/20130519.diviner.sql @@ -34,5 +34,3 @@ CREATE TABLE {$NAMESPACE}_diviner.diviner_liveatom ( atomData LONGTEXT NOT NULL COLLATE utf8_bin, UNIQUE KEY (symbolPHID) ) ENGINE=InnoDB, DEFAULT CHARSET = utf8; - - diff --git a/resources/sql/patches/20130529.macroauthormig.php b/resources/sql/patches/20130529.macroauthormig.php index 89f10e29c8..f642f392c8 100644 --- a/resources/sql/patches/20130529.macroauthormig.php +++ b/resources/sql/patches/20130529.macroauthormig.php @@ -1,8 +1,8 @@ getID()."\n"; + echo pht('Macro #%d', $macro->getID())."\n"; if ($macro->getAuthorPHID()) { // Already have an author; skip it. @@ -36,4 +36,4 @@ $macro->getID()); } -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130530.sessionhash.php b/resources/sql/patches/20130530.sessionhash.php index 4efbe5feec..1e09ee32fd 100644 --- a/resources/sql/patches/20130530.sessionhash.php +++ b/resources/sql/patches/20130530.sessionhash.php @@ -1,22 +1,7 @@ openTransaction(); -$conn = $table->establishConnection('w'); - -$sessions = queryfx_all( - $conn, - 'SELECT userPHID, type, sessionKey FROM %T FOR UPDATE', - PhabricatorUser::SESSION_TABLE); - -foreach ($sessions as $session) { - queryfx( - $conn, - 'UPDATE %T SET sessionKey = %s WHERE userPHID = %s AND type = %s', - PhabricatorUser::SESSION_TABLE, - PhabricatorHash::digest($session['sessionKey']), - $session['userPHID'], - $session['type']); -} - -$table->saveTransaction(); +// See T13225. Long ago, this upgraded session key storage from unhashed to +// HMAC-SHA1 here. We later upgraded storage to HMAC-SHA256, so this is initial +// upgrade is now fairly pointless. Dropping this migration entirely only logs +// users out of installs that waited more than 5 years to upgrade, which seems +// like a reasonable behavior. diff --git a/resources/sql/patches/20130606.userxactions.sql b/resources/sql/patches/20130606.userxactions.sql index 3d266e826c..5659c5e56c 100644 --- a/resources/sql/patches/20130606.userxactions.sql +++ b/resources/sql/patches/20130606.userxactions.sql @@ -19,5 +19,3 @@ CREATE TABLE {$NAMESPACE}_user.user_transaction ( KEY `key_object` (objectPHID) ) ENGINE=InnoDB, COLLATE utf8_general_ci; - - diff --git a/resources/sql/patches/20130611.migrateoauth.php b/resources/sql/patches/20130611.migrateoauth.php index 468ee78ff4..9d1490c5c1 100644 --- a/resources/sql/patches/20130611.migrateoauth.php +++ b/resources/sql/patches/20130611.migrateoauth.php @@ -1,66 +1,14 @@ establishConnection('w'); $table_name = 'user_oauthinfo'; -$conn_w = $table->establishConnection('w'); - -$xaccount = new PhabricatorExternalAccount(); - -echo "Migrating OAuth to ExternalAccount...\n"; -$domain_map = array( - 'disqus' => 'disqus.com', - 'facebook' => 'facebook.com', - 'github' => 'github.com', - 'google' => 'google.com', -); - -try { - $phabricator_oauth_uri = new PhutilURI( - PhabricatorEnv::getEnvConfig('phabricator.oauth-uri')); - $domain_map['phabricator'] = $phabricator_oauth_uri->getDomain(); -} catch (Exception $ex) { - // Ignore; this likely indicates that we have removed `phabricator.oauth-uri` - // in some future diff. +foreach (new LiskRawMigrationIterator($conn, $table_name) as $row) { + throw new Exception( + pht( + 'This database has ancient OAuth account data and is too old to '. + 'upgrade directly to a modern software version. Upgrade to a version '. + 'released between June 2013 and February 2019 first, then upgrade to '. + 'a modern version.')); } - -$rows = queryfx_all( - $conn_w, - 'SELECT * FROM user_oauthinfo'); -foreach ($rows as $row) { - echo "Migrating row ID #".$row['id'].".\n"; - $user = id(new PhabricatorUser())->loadOneWhere( - 'id = %d', - $row['userID']); - if (!$user) { - echo "Bad user ID!\n"; - continue; - } - - $domain = idx($domain_map, $row['oauthProvider']); - if (empty($domain)) { - echo "Unknown OAuth provider!\n"; - continue; - } - - - $xaccount = id(new PhabricatorExternalAccount()) - ->setUserPHID($user->getPHID()) - ->setAccountType($row['oauthProvider']) - ->setAccountDomain($domain) - ->setAccountID($row['oauthUID']) - ->setAccountURI($row['accountURI']) - ->setUsername($row['accountName']) - ->setDateCreated($row['dateCreated']); - - try { - $xaccount->save(); - } catch (Exception $ex) { - phlog($ex); - } -} - -echo "Done.\n"; diff --git a/resources/sql/patches/20130611.nukeldap.php b/resources/sql/patches/20130611.nukeldap.php index ee97bb64ab..70a3a3fec4 100644 --- a/resources/sql/patches/20130611.nukeldap.php +++ b/resources/sql/patches/20130611.nukeldap.php @@ -1,41 +1,14 @@ establishConnection('w'); $table_name = 'user_ldapinfo'; -$conn_w = $table->establishConnection('w'); - -$xaccount = new PhabricatorExternalAccount(); - -echo "Migrating LDAP to ExternalAccount...\n"; - -$rows = queryfx_all($conn_w, 'SELECT * FROM %T', $table_name); -foreach ($rows as $row) { - echo "Migrating row ID #".$row['id'].".\n"; - $user = id(new PhabricatorUser())->loadOneWhere( - 'id = %d', - $row['userID']); - if (!$user) { - echo "Bad user ID!\n"; - continue; - } - - $xaccount = id(new PhabricatorExternalAccount()) - ->setUserPHID($user->getPHID()) - ->setAccountType('ldap') - ->setAccountDomain('self') - ->setAccountID($row['ldapUsername']) - ->setUsername($row['ldapUsername']) - ->setDateCreated($row['dateCreated']); - - try { - $xaccount->save(); - } catch (Exception $ex) { - phlog($ex); - } +foreach (new LiskRawMigrationIterator($conn, $table_name) as $row) { + throw new Exception( + pht( + 'This database has ancient LDAP account data and is too old to upgrade '. + 'directly to a modern version of the software. Upgrade to a version '. + 'released between June 2013 and February 2019 first, then upgrade to a '. + 'modern version.')); } - -echo "Done.\n"; diff --git a/resources/sql/patches/20130619.authconf.php b/resources/sql/patches/20130619.authconf.php index 7f194282a5..ab0378ee64 100644 --- a/resources/sql/patches/20130619.authconf.php +++ b/resources/sql/patches/20130619.authconf.php @@ -1,7 +1,7 @@ array( + 'PhabricatorLDAPAuthProvider' => array( 'enabled' => 'ldap.auth-enabled', 'registration' => true, 'type' => 'ldap', @@ -16,7 +16,7 @@ 'type' => 'disqus', 'domain' => 'disqus.com', ), - 'PhabricatorAuthProviderOAuthFacebook' => array( + 'PhabricatorFacebookAuthProvider' => array( 'enabled' => 'facebook.auth-enabled', 'registration' => 'facebook.registration-enabled', 'permanent' => 'facebook.auth-permanent', @@ -43,9 +43,9 @@ 'type' => 'google', 'domain' => 'google.com', ), - 'PhabricatorAuthProviderPassword' => array( + 'PhabricatorPasswordAuthProvider' => array( 'enabled' => 'auth.password-auth-enabled', - 'enabled-default' => true, + 'enabled-default' => false, 'registration' => false, 'type' => 'password', 'domain' => 'self', @@ -60,11 +60,11 @@ $enabled_default); if (!$enabled) { - echo pht("Skipping %s (not enabled).\n", $provider_class); + echo pht('Skipping %s (not enabled).', $provider_class)."\n"; // This provider was not previously enabled, so we can skip migrating it. continue; } else { - echo pht("Migrating %s...\n", $provider_class); + echo pht('Migrating %s...', $provider_class)."\n"; } $registration_key = idx($spec, 'registration'); @@ -105,40 +105,42 @@ } switch ($provider_class) { - case 'PhabricatorAuthProviderOAuthFacebook': + case 'PhabricatorFacebookAuthProvider': $config->setProperty( - PhabricatorAuthProviderOAuthFacebook::KEY_REQUIRE_SECURE, + PhabricatorFacebookAuthProvider::KEY_REQUIRE_SECURE, (int)PhabricatorEnv::getEnvConfigIfExists( 'facebook.require-https-auth')); break; - case 'PhabricatorAuthProviderLDAP': + case 'PhabricatorLDAPAuthProvider': $ldap_map = array( - PhabricatorAuthProviderLDAP::KEY_HOSTNAME + PhabricatorLDAPAuthProvider::KEY_HOSTNAME => 'ldap.hostname', - PhabricatorAuthProviderLDAP::KEY_PORT + PhabricatorLDAPAuthProvider::KEY_PORT => 'ldap.port', - PhabricatorAuthProviderLDAP::KEY_DISTINGUISHED_NAME + PhabricatorLDAPAuthProvider::KEY_DISTINGUISHED_NAME => 'ldap.base_dn', - PhabricatorAuthProviderLDAP::KEY_SEARCH_ATTRIBUTE + PhabricatorLDAPAuthProvider::KEY_SEARCH_ATTRIBUTES => 'ldap.search_attribute', - PhabricatorAuthProviderLDAP::KEY_USERNAME_ATTRIBUTE + PhabricatorLDAPAuthProvider::KEY_USERNAME_ATTRIBUTE => 'ldap.username-attribute', - PhabricatorAuthProviderLDAP::KEY_REALNAME_ATTRIBUTES + PhabricatorLDAPAuthProvider::KEY_REALNAME_ATTRIBUTES => 'ldap.real_name_attributes', - PhabricatorAuthProviderLDAP::KEY_VERSION + PhabricatorLDAPAuthProvider::KEY_VERSION => 'ldap.version', - PhabricatorAuthProviderLDAP::KEY_REFERRALS + PhabricatorLDAPAuthProvider::KEY_REFERRALS => 'ldap.referrals', - PhabricatorAuthProviderLDAP::KEY_START_TLS + PhabricatorLDAPAuthProvider::KEY_START_TLS => 'ldap.start-tls', - PhabricatorAuthProviderLDAP::KEY_ANONYMOUS_USERNAME + PhabricatorLDAPAuthProvider::KEY_ANONYMOUS_USERNAME => 'ldap.anonymous-user-name', - PhabricatorAuthProviderLDAP::KEY_ANONYMOUS_PASSWORD + PhabricatorLDAPAuthProvider::KEY_ANONYMOUS_PASSWORD => 'ldap.anonymous-user-password', - PhabricatorAuthProviderLDAP::KEY_SEARCH_FIRST + // Update the old "search first" setting to the newer but similar + // "always search" setting. + PhabricatorLDAPAuthProvider::KEY_ALWAYS_SEARCH => 'ldap.search-first', - PhabricatorAuthProviderLDAP::KEY_ACTIVEDIRECTORY_DOMAIN + PhabricatorLDAPAuthProvider::KEY_ACTIVEDIRECTORY_DOMAIN => 'ldap.activedirectory_domain', ); @@ -159,4 +161,4 @@ $config->save(); } -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130620.diffxactions.sql b/resources/sql/patches/20130620.diffxactions.sql index 7b63f895f6..bd88123b35 100644 --- a/resources/sql/patches/20130620.diffxactions.sql +++ b/resources/sql/patches/20130620.diffxactions.sql @@ -48,4 +48,3 @@ CREATE TABLE {$NAMESPACE}_differential.differential_transaction_comment ( UNIQUE KEY `key_draft` (authorPHID, revisionPHID, transactionPHID) ) ENGINE=InnoDB, COLLATE utf8_general_ci; - diff --git a/resources/sql/patches/20130622.doorkeeper.sql b/resources/sql/patches/20130622.doorkeeper.sql index 80329f03d5..6125e613cc 100644 --- a/resources/sql/patches/20130622.doorkeeper.sql +++ b/resources/sql/patches/20130622.doorkeeper.sql @@ -32,4 +32,3 @@ CREATE TABLE {$NAMESPACE}_doorkeeper.edgedata ( id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, data LONGTEXT NOT NULL COLLATE utf8_bin ) ENGINE=InnoDB, COLLATE utf8_general_ci; - diff --git a/resources/sql/patches/20130628.legalpadv0.sql b/resources/sql/patches/20130628.legalpadv0.sql index fa843f18d9..723e25c552 100644 --- a/resources/sql/patches/20130628.legalpadv0.sql +++ b/resources/sql/patches/20130628.legalpadv0.sql @@ -101,4 +101,3 @@ CREATE TABLE {$NAMESPACE}_legalpad.legalpad_transaction_comment ( UNIQUE KEY `key_draft` (authorPHID, documentID, transactionPHID) ) ENGINE=InnoDB, COLLATE utf8_general_ci; - diff --git a/resources/sql/patches/20130703.legalpaddocdenorm.php b/resources/sql/patches/20130703.legalpaddocdenorm.php index 9492e26bc8..61056ceb23 100644 --- a/resources/sql/patches/20130703.legalpaddocdenorm.php +++ b/resources/sql/patches/20130703.legalpaddocdenorm.php @@ -1,7 +1,9 @@ openTransaction(); @@ -9,14 +11,14 @@ $updated = false; $id = $document->getID(); - echo "Document {$id}: "; + echo pht('Document %d: ', $id); if (!$document->getTitle()) { $document_body = id(new LegalpadDocumentBody()) ->loadOneWhere('phid = %s', $document->getDocumentBodyPHID()); $title = $document_body->getTitle(); $document->setTitle($title); $updated = true; - echo "Added title: $title\n"; + echo pht('Added title: %s', $title)."\n"; } else { echo "-\n"; } @@ -24,14 +26,14 @@ if (!$document->getContributorCount() || !$document->getRecentContributorPHIDs()) { $updated = true; - $type = PhabricatorEdgeConfig::TYPE_OBJECT_HAS_CONTRIBUTOR; + $type = PhabricatorObjectHasContributorEdgeType::EDGECONST; $contributors = PhabricatorEdgeQuery::loadDestinationPHIDs( $document->getPHID(), $type); $document->setRecentContributorPHIDs(array_slice($contributors, 0, 3)); - echo "Added recent contributor phids.\n"; + echo pht('Added recent contributor PHIDs.')."\n"; $document->setContributorCount(count($contributors)); - echo "Added contributor count.\n"; + echo pht('Added contributor count.')."\n"; } if (!$updated) { @@ -43,4 +45,4 @@ } $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130711.pholioimageobsolete.php b/resources/sql/patches/20130711.pholioimageobsolete.php index 738f82085e..a0f805c69b 100644 --- a/resources/sql/patches/20130711.pholioimageobsolete.php +++ b/resources/sql/patches/20130711.pholioimageobsolete.php @@ -1,6 +1,6 @@ openTransaction(); @@ -9,7 +9,7 @@ continue; } - echo "."; + echo '.'; queryfx( $image->establishConnection('w'), @@ -20,4 +20,4 @@ } $table->saveTransaction(); -echo "\nDone.\n"; +echo "\n".pht('Done.')."\n"; diff --git a/resources/sql/patches/20130711.trimrealnames.php b/resources/sql/patches/20130711.trimrealnames.php index c422565b32..a5d2ef2c40 100644 --- a/resources/sql/patches/20130711.trimrealnames.php +++ b/resources/sql/patches/20130711.trimrealnames.php @@ -3,18 +3,18 @@ $table = new PhabricatorUser(); $conn_w = $table->establishConnection('w'); -echo "Trimming trailing whitespace from user real names...\n"; +echo pht('Trimming trailing whitespace from user real names...')."\n"; foreach (new LiskMigrationIterator($table) as $user) { $id = $user->getID(); $real = $user->getRealName(); $trim = rtrim($real); if ($trim == $real) { - echo "User {$id} is already trim.\n"; + echo pht('User %d is already trim.', $id)."\n"; continue; } - echo "Trimming user {$id} from '{$real}' to '{$trim}'.\n"; + echo pht("Trimming user %d from '%s' to '%s'.", $id, $real, $trim)."\n"; qsprintf( $conn_w, 'UPDATE %T SET realName = %s WHERE id = %d', @@ -23,4 +23,4 @@ $id); } -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130715.votecomments.php b/resources/sql/patches/20130715.votecomments.php index c4a30fa276..1066126318 100644 --- a/resources/sql/patches/20130715.votecomments.php +++ b/resources/sql/patches/20130715.votecomments.php @@ -1,6 +1,6 @@ setViewer($viewer) ->withIDs(array($poll_id)) ->executeOne(); if (!$poll) { - echo "No poll.\n"; + echo pht('No poll.')."\n"; continue; } @@ -36,19 +36,18 @@ ->withPHIDs(array($author_phid)) ->executeOne(); if (!$user) { - echo "No user.\n"; + echo pht('No user.')."\n"; continue; } $comment_phid = PhabricatorPHID::generateNewPHID( PhabricatorPHIDConstants::PHID_TYPE_XCMT); $xaction_phid = PhabricatorPHID::generateNewPHID( - PhabricatorApplicationTransactionPHIDTypeTransaction::TYPECONST, - PhabricatorSlowvotePHIDTypePoll::TYPECONST); + PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST, + PhabricatorSlowvotePollPHIDType::TYPECONST); - $source = PhabricatorContentSource::newForSource( - PhabricatorContentSource::SOURCE_LEGACY, - array())->serialize(); + $content_source = PhabricatorContentSource::newForSource( + PhabricatorOldWorldContentSource::SOURCECONST)->serialize(); queryfx( $conn_w, @@ -98,4 +97,4 @@ $conn_w->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130716.archivememberlessprojects.php b/resources/sql/patches/20130716.archivememberlessprojects.php index aca6f51db7..bd5671cba3 100644 --- a/resources/sql/patches/20130716.archivememberlessprojects.php +++ b/resources/sql/patches/20130716.archivememberlessprojects.php @@ -1,18 +1,17 @@ openTransaction(); foreach (new LiskMigrationIterator($table) as $project) { - $members = PhabricatorEdgeQuery::loadDestinationPHIDs( $project->getPHID(), - PhabricatorEdgeConfig::TYPE_PROJ_MEMBER); + PhabricatorProjectProjectHasMemberEdgeType::EDGECONST); if (count($members)) { - echo sprintf( + echo pht( 'Project "%s" has %d members; skipping.', $project->getName(), count($members)), "\n"; @@ -20,13 +19,13 @@ } if ($project->getStatus() == PhabricatorProjectStatus::STATUS_ARCHIVED) { - echo sprintf( + echo pht( 'Project "%s" already archived; skipping.', $project->getName()), "\n"; continue; } - echo sprintf('Archiving project "%s"...', $project->getName()), "\n"; + echo pht('Archiving project "%s"...', $project->getName())."\n"; queryfx( $table->establishConnection('w'), 'UPDATE %T SET status = %s WHERE id = %d', @@ -36,4 +35,4 @@ } $table->saveTransaction(); -echo "\nDone.\n"; +echo "\n".pht('Done.')."\n"; diff --git a/resources/sql/patches/20130723.taskstarttime.sql b/resources/sql/patches/20130723.taskstarttime.sql index eee39b8e82..2ca759db1e 100644 --- a/resources/sql/patches/20130723.taskstarttime.sql +++ b/resources/sql/patches/20130723.taskstarttime.sql @@ -3,4 +3,3 @@ ALTER TABLE {$NAMESPACE}_worker.worker_activetask ALTER TABLE {$NAMESPACE}_worker.worker_activetask ADD KEY `key_failuretime` (`failureTime`); - diff --git a/resources/sql/patches/20130726.ponderxactions.sql b/resources/sql/patches/20130726.ponderxactions.sql index a3caf75d75..107eae2c16 100644 --- a/resources/sql/patches/20130726.ponderxactions.sql +++ b/resources/sql/patches/20130726.ponderxactions.sql @@ -79,4 +79,3 @@ CREATE TABLE {$NAMESPACE}_ponder.ponder_answertransaction_comment ( UNIQUE KEY `key_version` (transactionPHID, commentVersion) ) ENGINE=InnoDB, COLLATE utf8_general_ci; - diff --git a/resources/sql/patches/20130728.ponderunique.php b/resources/sql/patches/20130728.ponderunique.php index 94a45ae786..2facd4e3f0 100644 --- a/resources/sql/patches/20130728.ponderunique.php +++ b/resources/sql/patches/20130728.ponderunique.php @@ -2,7 +2,7 @@ $map = array(); -echo "Merging duplicate answers by authors...\n"; +echo pht('Merging duplicate answers by authors...')."\n"; $atable = new PonderAnswer(); $conn_w = $atable->establishConnection('w'); @@ -14,14 +14,14 @@ $qid = $answer->getQuestionID(); $author_phid = $answer->getAuthorPHID(); - echo "Processing answer ID #{$aid}...\n"; + echo pht('Processing answer ID #%d...', $aid)."\n"; if (empty($map[$qid][$author_phid])) { - echo "Answer is unique.\n"; + echo pht('Answer is unique.')."\n"; $map[$qid][$author_phid] = $answer; continue; } else { - echo "Merging answer.\n"; + echo pht('Merging answer.')."\n"; $target = $map[$qid][$author_phid]; queryfx( $conn_w, @@ -55,4 +55,4 @@ } $conn_w->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130728.ponderxcomment.php b/resources/sql/patches/20130728.ponderxcomment.php index ebced3865d..9a7413e351 100644 --- a/resources/sql/patches/20130728.ponderxcomment.php +++ b/resources/sql/patches/20130728.ponderxcomment.php @@ -6,32 +6,32 @@ $conn_w = $qtable->establishConnection('w'); $conn_w->openTransaction(); -echo "Migrating Ponder comments to ApplicationTransactions...\n"; +echo pht('Migrating Ponder comments to %s...', 'ApplicationTransactions')."\n"; $rows = new LiskRawMigrationIterator($conn_w, 'ponder_comment'); foreach ($rows as $row) { $id = $row['id']; - echo "Migrating {$id}...\n"; + echo pht('Migrating %d...', $id)."\n"; $type = phid_get_type($row['targetPHID']); switch ($type) { - case PonderPHIDTypeQuestion::TYPECONST: + case PonderQuestionPHIDType::TYPECONST: $table_obj = $qtable; $comment_obj = new PonderQuestionTransactionComment(); break; - case PonderPHIDTypeAnswer::TYPECONST: + case PonderAnswerPHIDType::TYPECONST: $table_obj = $atable; $comment_obj = new PonderAnswerTransactionComment(); break; } $comment_phid = PhabricatorPHID::generateNewPHID( - PhabricatorApplicationTransactionPHIDTypeTransaction::TYPECONST, + PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST, $type); $xaction_phid = PhabricatorPHID::generateNewPHID( - PhabricatorApplicationTransactionPHIDTypeTransaction::TYPECONST, + PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST, $type); queryfx( @@ -49,8 +49,7 @@ 1, $row['content'], PhabricatorContentSource::newForSource( - PhabricatorContentSource::SOURCE_LEGACY, - array())->serialize(), + PhabricatorOldWorldContentSource::SOURCECONST)->serialize(), 0, $row['dateCreated'], $row['dateModified']); @@ -73,8 +72,7 @@ 'null', 'null', PhabricatorContentSource::newForSource( - PhabricatorContentSource::SOURCE_LEGACY, - array())->serialize(), + PhabricatorOldWorldContentSource::SOURCECONST)->serialize(), '[]', $row['dateCreated'], $row['dateModified']); @@ -83,4 +81,4 @@ $conn_w->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130731.releephcutpointidentifier.sql b/resources/sql/patches/20130731.releephcutpointidentifier.sql new file mode 100644 index 0000000000..a7eb4ff38d --- /dev/null +++ b/resources/sql/patches/20130731.releephcutpointidentifier.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_releeph.releeph_branch + DROP cutPointCommitIdentifier; diff --git a/resources/sql/patches/20130731.releephproject.sql b/resources/sql/patches/20130731.releephproject.sql new file mode 100644 index 0000000000..a208df452d --- /dev/null +++ b/resources/sql/patches/20130731.releephproject.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_releeph.releeph_project + DROP projectID; diff --git a/resources/sql/patches/20130731.releephrepoid.sql b/resources/sql/patches/20130731.releephrepoid.sql new file mode 100644 index 0000000000..d4220892ec --- /dev/null +++ b/resources/sql/patches/20130731.releephrepoid.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_releeph.releeph_project + DROP repositoryID; diff --git a/resources/sql/patches/20130801.pastexactions.php b/resources/sql/patches/20130801.pastexactions.php index b04edddda5..9d3d2c2853 100644 --- a/resources/sql/patches/20130801.pastexactions.php +++ b/resources/sql/patches/20130801.pastexactions.php @@ -1,48 +1,5 @@ establishConnection('w'); -$conn_w->openTransaction(); - -echo "Adding transactions for existing paste objects...\n"; - -$rows = new LiskRawMigrationIterator($conn_w, 'pastebin_paste'); -foreach ($rows as $row) { - - $id = $row['id']; - echo "Adding transactions for paste id {$id}...\n"; - - $xaction_phid = PhabricatorPHID::generateNewPHID( - PhabricatorApplicationTransactionPHIDTypeTransaction::TYPECONST); - - queryfx( - $conn_w, - 'INSERT INTO %T (phid, authorPHID, objectPHID, viewPolicy, editPolicy, - transactionType, oldValue, newValue, - contentSource, metadata, dateCreated, dateModified, - commentVersion) - VALUES (%s, %s, %s, %s, %s, %s, %ns, %ns, %s, %s, %d, %d, %d)', - $x_table->getTableName(), - $xaction_phid, - $row['authorPHID'], - $row['phid'], - 'public', - $row['authorPHID'], - PhabricatorPasteTransaction::TYPE_CREATE, - 'null', - $row['filePHID'], - PhabricatorContentSource::newForSource( - PhabricatorContentSource::SOURCE_LEGACY, - array())->serialize(), - '[]', - $row['dateCreated'], - $row['dateCreated'], - 0); - -} - -$conn_w->saveTransaction(); - -echo "Done.\n"; +// Long ago, this migration populated initial "create" transactions for old +// pastes from before transactions came into existence. It was removed after +// about three years. diff --git a/resources/sql/patches/20130802.heraldphids.php b/resources/sql/patches/20130802.heraldphids.php index 52f9de2729..726a335d1f 100644 --- a/resources/sql/patches/20130802.heraldphids.php +++ b/resources/sql/patches/20130802.heraldphids.php @@ -3,11 +3,11 @@ $table = new HeraldRule(); $conn_w = $table->establishConnection('w'); -echo "Assigning PHIDs to Herald Rules...\n"; +echo pht('Assigning PHIDs to Herald Rules...')."\n"; foreach (new LiskMigrationIterator(new HeraldRule()) as $rule) { $id = $rule->getID(); - echo "Rule {$id}.\n"; + echo pht('Rule %d.', $id)."\n"; if ($rule->getPHID()) { continue; @@ -17,8 +17,8 @@ $conn_w, 'UPDATE %T SET phid = %s WHERE id = %d', $table->getTableName(), - PhabricatorPHID::generateNewPHID(HeraldPHIDTypeRule::TYPECONST), + PhabricatorPHID::generateNewPHID(HeraldRulePHIDType::TYPECONST), $rule->getID()); } -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130805.pastemailkeypop.php b/resources/sql/patches/20130805.pastemailkeypop.php index afc98a70cc..bb2d51ded5 100644 --- a/resources/sql/patches/20130805.pastemailkeypop.php +++ b/resources/sql/patches/20130805.pastemailkeypop.php @@ -1,6 +1,6 @@ openTransaction(); @@ -17,11 +17,11 @@ $paste->getTableName(), Filesystem::readRandomCharacters(20), $id); - echo("Generated Key\n"); + echo pht('Generated Key')."\n"; } else { echo "-\n"; } } $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130814.usercustom.sql b/resources/sql/patches/20130814.usercustom.sql new file mode 100644 index 0000000000..d967dd5203 --- /dev/null +++ b/resources/sql/patches/20130814.usercustom.sql @@ -0,0 +1,7 @@ +CREATE TABLE {$NAMESPACE}_user.user_configuredcustomfieldstorage ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + fieldIndex CHAR(12) NOT NULL COLLATE utf8_bin, + fieldValue LONGTEXT NOT NULL, + UNIQUE KEY (objectPHID, fieldIndex) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20130820.file-mailkey-populate.php b/resources/sql/patches/20130820.file-mailkey-populate.php new file mode 100644 index 0000000000..2cf6371c4d --- /dev/null +++ b/resources/sql/patches/20130820.file-mailkey-populate.php @@ -0,0 +1,38 @@ +getTableName(); + +$conn_w = $table->establishConnection('w'); +$conn_w->openTransaction(); + +$sql = array(); +foreach (new LiskRawMigrationIterator($conn_w, 'file') as $row) { + // NOTE: MySQL requires that the INSERT specify all columns which don't + // have default values when configured in strict mode. This query will + // never actually insert rows, but we need to hand it values anyway. + + $sql[] = qsprintf( + $conn_w, + '(%d, %s, 0, 0, 0, 0, 0, 0, 0, 0)', + $row['id'], + Filesystem::readRandomCharacters(20)); +} + +if ($sql) { + foreach (PhabricatorLiskDAO::chunkSQL($sql) as $chunk) { + queryfx( + $conn_w, + 'INSERT INTO %T + (id, mailKey, phid, byteSize, storageEngine, storageFormat, + storageHandle, dateCreated, dateModified, metadata) VALUES %LQ '. + 'ON DUPLICATE KEY UPDATE mailKey = VALUES(mailKey)', + $table_name, + $chunk); + } +} + +$table->saveTransaction(); +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130820.filemailkey.sql b/resources/sql/patches/20130820.filemailkey.sql new file mode 100644 index 0000000000..7daa46a609 --- /dev/null +++ b/resources/sql/patches/20130820.filemailkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_file.file + ADD `mailKey` varchar(20) NOT NULL; diff --git a/resources/sql/patches/20130820.filexactions.sql b/resources/sql/patches/20130820.filexactions.sql new file mode 100644 index 0000000000..5febdc2710 --- /dev/null +++ b/resources/sql/patches/20130820.filexactions.sql @@ -0,0 +1,41 @@ +CREATE TABLE {$NAMESPACE}_file.file_transaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_file.file_transaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + transactionPHID VARCHAR(64) COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion), + UNIQUE KEY `key_draft` (authorPHID, transactionPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20130820.releephxactions.sql b/resources/sql/patches/20130820.releephxactions.sql new file mode 100644 index 0000000000..c90057ef6f --- /dev/null +++ b/resources/sql/patches/20130820.releephxactions.sql @@ -0,0 +1,43 @@ +CREATE TABLE {$NAMESPACE}_releeph.releeph_projecttransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_releeph.releeph_branchtransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20130826.divinernode.sql b/resources/sql/patches/20130826.divinernode.sql new file mode 100644 index 0000000000..265a7769b5 --- /dev/null +++ b/resources/sql/patches/20130826.divinernode.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_diviner.diviner_livesymbol + ADD nodeHash VARCHAR(64) COLLATE utf8_bin; + +ALTER TABLE {$NAMESPACE}_diviner.diviner_livesymbol + ADD UNIQUE KEY (nodeHash); diff --git a/resources/sql/patches/20130912.maniphest.1.touch.sql b/resources/sql/patches/20130912.maniphest.1.touch.sql new file mode 100644 index 0000000000..a44802246c --- /dev/null +++ b/resources/sql/patches/20130912.maniphest.1.touch.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS {$NAMESPACE}_maniphest.maniphest_touch; diff --git a/resources/sql/patches/20130912.maniphest.2.created.sql b/resources/sql/patches/20130912.maniphest.2.created.sql new file mode 100644 index 0000000000..dbd259d903 --- /dev/null +++ b/resources/sql/patches/20130912.maniphest.2.created.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + ADD KEY `key_dateCreated` (dateCreated); diff --git a/resources/sql/patches/20130912.maniphest.3.nameindex.sql b/resources/sql/patches/20130912.maniphest.3.nameindex.sql new file mode 100644 index 0000000000..a02764ec38 --- /dev/null +++ b/resources/sql/patches/20130912.maniphest.3.nameindex.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_maniphest.maniphest_nameindex ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + indexedObjectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + indexedObjectName VARCHAR(128) NOT NULL, + + UNIQUE KEY `key_phid` (indexedObjectPHID), + KEY `key_name` (indexedObjectName) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20130912.maniphest.4.fillindex.php b/resources/sql/patches/20130912.maniphest.4.fillindex.php new file mode 100644 index 0000000000..4dfaff8eb4 --- /dev/null +++ b/resources/sql/patches/20130912.maniphest.4.fillindex.php @@ -0,0 +1,5 @@ +establishConnection('w'); +$table_name = id(new ManiphestCustomFieldStorage())->getTableName(); + +$rows = new LiskRawMigrationIterator($conn_w, 'maniphest_taskauxiliarystorage'); + +echo pht('Migrating custom storage for Maniphest fields...')."\n"; +foreach ($rows as $row) { + $phid = $row['taskPHID']; + $name = $row['name']; + + echo pht('Migrating %s / %s...', $phid, $name)."\n"; + + queryfx( + $conn_w, + 'INSERT IGNORE INTO %T (objectPHID, fieldIndex, fieldValue) + VALUES (%s, %s, %s)', + $table_name, + $phid, + PhabricatorHash::digestForIndex('std:maniphest:'.$name), + $row['value']); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130915.maniphestqdrop.sql b/resources/sql/patches/20130915.maniphestqdrop.sql new file mode 100644 index 0000000000..a9f54884d2 --- /dev/null +++ b/resources/sql/patches/20130915.maniphestqdrop.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS {$NAMESPACE}_maniphest.maniphest_savedquery; diff --git a/resources/sql/patches/20130919.mfieldconf.php b/resources/sql/patches/20130919.mfieldconf.php new file mode 100644 index 0000000000..c79521acbc --- /dev/null +++ b/resources/sql/patches/20130919.mfieldconf.php @@ -0,0 +1,66 @@ + $spec) { + $new_spec = array(); + + foreach ($spec as $key => $value) { + switch ($key) { + case 'label': + $new_spec['name'] = $value; + break; + case 'required': + case 'default': + case 'caption': + case 'options': + $new_spec[$key] = $value; + break; + case 'checkbox-label': + $new_spec['strings']['edit.checkbox'] = $value; + break; + case 'checkbox-value': + $new_spec['strings']['view.yes'] = $value; + break; + case 'type': + switch ($value) { + case 'string': + $value = 'text'; + break; + case 'user': + $value = 'users'; + $new_spec['limit'] = 1; + break; + } + $new_spec['type'] = $value; + break; + case 'copy': + $new_spec['copy'] = $value; + break; + } + } + + $new[$field_key] = $new_spec; +} + +PhabricatorConfigEntry::loadConfigEntry($new_key) + ->setIsDeleted(0) + ->setValue($new) + ->save(); + +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130920.repokeyspolicy.sql b/resources/sql/patches/20130920.repokeyspolicy.sql new file mode 100644 index 0000000000..6614d2594d --- /dev/null +++ b/resources/sql/patches/20130920.repokeyspolicy.sql @@ -0,0 +1,20 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_summary + ADD KEY `key_epoch` (epoch); + +ALTER TABLE {$NAMESPACE}_repository.repository + ADD KEY `key_name` (name); + +ALTER TABLE {$NAMESPACE}_repository.repository + ADD KEY `key_vcs` (versionControlSystem); + +ALTER TABLE {$NAMESPACE}_repository.repository + ADD viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin; + +ALTER TABLE {$NAMESPACE}_repository.repository + ADD editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin; + +UPDATE {$NAMESPACE}_repository.repository + SET viewPolicy = 'users' WHERE viewPolicy = ''; + +UPDATE {$NAMESPACE}_repository.repository + SET editPolicy = 'admin' WHERE editPolicy = ''; diff --git a/resources/sql/patches/20130921.mtransactions.sql b/resources/sql/patches/20130921.mtransactions.sql new file mode 100644 index 0000000000..312f44513c --- /dev/null +++ b/resources/sql/patches/20130921.mtransactions.sql @@ -0,0 +1,41 @@ +CREATE TABLE {$NAMESPACE}_maniphest.maniphest_transactionpro ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_maniphest.maniphest_transaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + transactionPHID VARCHAR(64) COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion), + UNIQUE KEY `key_draft` (authorPHID, transactionPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20130921.xmigratemaniphest.php b/resources/sql/patches/20130921.xmigratemaniphest.php new file mode 100644 index 0000000000..2f7f5952ce --- /dev/null +++ b/resources/sql/patches/20130921.xmigratemaniphest.php @@ -0,0 +1,148 @@ +establishConnection('w'); + +$rows = new LiskRawMigrationIterator($conn_w, 'maniphest_transaction'); +$conn_w->openTransaction(); + +// NOTE: These were the correct table names at the time of this patch. +$xaction_table_name = 'maniphest_transactionpro'; +$comment_table_name = 'maniphest_transaction_comment'; + +foreach ($rows as $row) { + $row_id = $row['id']; + $task_id = $row['taskID']; + + echo pht('Migrating row %d (%s)...', $row_id, "T{$task_id}")."\n"; + + $task_row = queryfx_one( + $conn_w, + 'SELECT phid FROM %T WHERE id = %d', + $task_table->getTableName(), + $task_id); + if (!$task_row) { + echo pht('Skipping, no such task.')."\n"; + continue; + } + + $task_phid = $task_row['phid']; + + $has_comment = strlen(trim($row['comments'])); + + $xaction_type = $row['transactionType']; + $xaction_old = $row['oldValue']; + $xaction_new = $row['newValue']; + $xaction_source = idx($row, 'contentSource', ''); + $xaction_meta = $row['metadata']; + + // Convert "aux" (auxiliary field) transactions to proper CustomField + // transactions. The formats are very similar, except that the type constant + // is different and the auxiliary key should be prefixed. + if ($xaction_type == 'aux') { + $xaction_meta = @json_decode($xaction_meta, true); + $xaction_meta = nonempty($xaction_meta, array()); + + $xaction_type = PhabricatorTransactions::TYPE_CUSTOMFIELD; + + $aux_key = idx($xaction_meta, 'aux:key'); + if (!preg_match('/^std:maniphest:/', $aux_key)) { + $aux_key = 'std:maniphest:'.$aux_key; + } + + $xaction_meta = array( + 'customfield:key' => $aux_key, + ); + + $xaction_meta = json_encode($xaction_meta); + } + + // If this transaction did something other than just leaving a comment, + // insert a new transaction for that action. If there was a comment (or + // a comment in addition to an action) we'll insert that below. + if ($row['transactionType'] != 'comment') { + $xaction_phid = PhabricatorPHID::generateNewPHID( + PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST, + ManiphestTaskPHIDType::TYPECONST); + + queryfx( + $conn_w, + 'INSERT INTO %T (phid, authorPHID, objectPHID, viewPolicy, editPolicy, + commentPHID, commentVersion, transactionType, oldValue, newValue, + contentSource, metadata, dateCreated, dateModified) + VALUES (%s, %s, %s, %s, %s, %s, %d, %s, %ns, %ns, %s, %s, %d, %d)', + $xaction_table_name, + $xaction_phid, + $row['authorPHID'], + $task_phid, + 'public', + $row['authorPHID'], + null, + 0, + $xaction_type, + $xaction_old, + $xaction_new, + $xaction_source, + $xaction_meta, + $row['dateCreated'], + $row['dateModified']); + } + + // Now, if the old transaction has a comment, we insert an explicit new + // transaction for it. + if ($has_comment) { + $comment_phid = PhabricatorPHID::generateNewPHID( + PhabricatorPHIDConstants::PHID_TYPE_XCMT, + ManiphestTaskPHIDType::TYPECONST); + $comment_version = 1; + + $comment_xaction_phid = PhabricatorPHID::generateNewPHID( + PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST, + ManiphestTaskPHIDType::TYPECONST); + + // Insert the comment data. + queryfx( + $conn_w, + 'INSERT INTO %T (phid, transactionPHID, authorPHID, viewPolicy, + editPolicy, commentVersion, content, contentSource, isDeleted, + dateCreated, dateModified) + VALUES (%s, %s, %s, %s, %s, %d, %s, %s, %d, %d, %d)', + $comment_table_name, + $comment_phid, + $comment_xaction_phid, + $row['authorPHID'], + 'public', + $row['authorPHID'], + $comment_version, + $row['comments'], + $xaction_source, + 0, + $row['dateCreated'], + $row['dateModified']); + + queryfx( + $conn_w, + 'INSERT INTO %T (phid, authorPHID, objectPHID, viewPolicy, editPolicy, + commentPHID, commentVersion, transactionType, oldValue, newValue, + contentSource, metadata, dateCreated, dateModified) + VALUES (%s, %s, %s, %s, %s, %s, %d, %s, %ns, %ns, %s, %s, %d, %d)', + $xaction_table_name, + $comment_xaction_phid, + $row['authorPHID'], + $task_phid, + 'public', + $row['authorPHID'], + $comment_phid, + $comment_version, + PhabricatorTransactions::TYPE_COMMENT, + $xaction_old, + $xaction_new, + $xaction_source, + $xaction_meta, + $row['dateCreated'], + $row['dateModified']); + } +} + +$conn_w->saveTransaction(); +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130923.mrename.sql b/resources/sql/patches/20130923.mrename.sql new file mode 100644 index 0000000000..bbf53a90a6 --- /dev/null +++ b/resources/sql/patches/20130923.mrename.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_transaction + RENAME {$NAMESPACE}_maniphest.maniphest_transaction_legacy; + +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_transactionpro + RENAME {$NAMESPACE}_maniphest.maniphest_transaction; diff --git a/resources/sql/patches/20130924.mdraftkey.sql b/resources/sql/patches/20130924.mdraftkey.sql new file mode 100644 index 0000000000..677b97246d --- /dev/null +++ b/resources/sql/patches/20130924.mdraftkey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_transaction_comment + DROP KEY `key_draft`; diff --git a/resources/sql/patches/20130925.mpolicy.sql b/resources/sql/patches/20130925.mpolicy.sql new file mode 100644 index 0000000000..c81d745e2e --- /dev/null +++ b/resources/sql/patches/20130925.mpolicy.sql @@ -0,0 +1,11 @@ +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + ADD viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin; + +ALTER TABLE {$NAMESPACE}_maniphest.maniphest_task + ADD editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin; + +UPDATE {$NAMESPACE}_maniphest.maniphest_task + SET viewPolicy = 'users' WHERE viewPolicy = ''; + +UPDATE {$NAMESPACE}_maniphest.maniphest_task + SET editPolicy = 'users' WHERE editPolicy = ''; diff --git a/resources/sql/patches/20130925.xpolicy.sql b/resources/sql/patches/20130925.xpolicy.sql new file mode 100644 index 0000000000..374a67543f --- /dev/null +++ b/resources/sql/patches/20130925.xpolicy.sql @@ -0,0 +1,17 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_revision + ADD viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin; + +ALTER TABLE {$NAMESPACE}_differential.differential_revision + ADD editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin; + +UPDATE {$NAMESPACE}_differential.differential_revision + SET viewPolicy = 'users' WHERE viewPolicy = ''; + +UPDATE {$NAMESPACE}_differential.differential_revision + SET editPolicy = 'users' WHERE editPolicy = ''; + +ALTER TABLE {$NAMESPACE}_differential.differential_revision + ADD repositoryPHID VARCHAR(64) COLLATE utf8_bin; + +ALTER TABLE {$NAMESPACE}_differential.differential_revision + ADD KEY (repositoryPHID); diff --git a/resources/sql/patches/20130926.dcustom.sql b/resources/sql/patches/20130926.dcustom.sql new file mode 100644 index 0000000000..d81bdab0ff --- /dev/null +++ b/resources/sql/patches/20130926.dcustom.sql @@ -0,0 +1,29 @@ +CREATE TABLE {$NAMESPACE}_differential.differential_customfieldstorage ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + fieldIndex CHAR(12) NOT NULL COLLATE utf8_bin, + fieldValue LONGTEXT NOT NULL, + UNIQUE KEY (objectPHID, fieldIndex) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_differential.differential_customfieldstringindex ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + indexKey VARCHAR(12) NOT NULL COLLATE utf8_bin, + indexValue LONGTEXT NOT NULL COLLATE utf8_general_ci, + + KEY `key_join` (objectPHID, indexKey, indexValue(64)), + KEY `key_find` (indexKey, indexValue(64)) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_differential.differential_customfieldnumericindex ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + indexKey VARCHAR(12) NOT NULL COLLATE utf8_bin, + indexValue BIGINT NOT NULL, + + KEY `key_join` (objectPHID, indexKey, indexValue), + KEY `key_find` (indexKey, indexValue) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20130926.dinkeys.sql b/resources/sql/patches/20130926.dinkeys.sql new file mode 100644 index 0000000000..7d7caf8b87 --- /dev/null +++ b/resources/sql/patches/20130926.dinkeys.sql @@ -0,0 +1,14 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_transaction_comment + DROP KEY `key_draft`; + +ALTER TABLE {$NAMESPACE}_differential.differential_transaction_comment + ADD KEY `key_changeset` (changesetID); + +ALTER TABLE {$NAMESPACE}_differential.differential_transaction_comment + ADD KEY `key_draft` (authorPHID, transactionPHID); + +ALTER TABLE {$NAMESPACE}_differential.differential_transaction_comment + ADD KEY `key_revision` (revisionPHID); + +ALTER TABLE {$NAMESPACE}_differential.differential_transaction_comment + ADD KEY `key_legacy` (legacyCommentID); diff --git a/resources/sql/patches/20130926.dinline.php b/resources/sql/patches/20130926.dinline.php new file mode 100644 index 0000000000..7b67adc9b7 --- /dev/null +++ b/resources/sql/patches/20130926.dinline.php @@ -0,0 +1,89 @@ +establishConnection('w'); +$conn_w->openTransaction(); + +$src_table = 'differential_inlinecomment'; +$dst_table = 'differential_transaction_comment'; + +echo pht('Migrating Differential inline comments to new format...')."\n"; + +$content_source = PhabricatorContentSource::newForSource( + PhabricatorOldWorldContentSource::SOURCECONST)->serialize(); + +$rows = new LiskRawMigrationIterator($conn_w, $src_table); +foreach ($rows as $row) { + $id = $row['id']; + + $revision_id = $row['revisionID']; + + echo pht('Migrating inline #%d (%s)...', $id, "D{$revision_id}")."\n"; + + $revision_row = queryfx_one( + $conn_w, + 'SELECT phid FROM %T WHERE id = %d', + $revision_table->getTableName(), + $revision_id); + if (!$revision_row) { + continue; + } + + $revision_phid = $revision_row['phid']; + + if ($row['commentID']) { + $xaction_phid = PhabricatorPHID::generateNewPHID( + PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST, + DifferentialRevisionPHIDType::TYPECONST); + } else { + $xaction_phid = null; + } + + $comment_phid = PhabricatorPHID::generateNewPHID( + PhabricatorPHIDConstants::PHID_TYPE_XCMT, + DifferentialRevisionPHIDType::TYPECONST); + + queryfx( + $conn_w, + 'INSERT IGNORE INTO %T + (id, phid, transactionPHID, authorPHID, viewPolicy, editPolicy, + commentVersion, content, contentSource, isDeleted, + dateCreated, dateModified, revisionPHID, changesetID, + isNewFile, lineNumber, lineLength, hasReplies, legacyCommentID) + VALUES (%d, %s, %ns, %s, %s, %s, + %d, %s, %s, %d, + %d, %d, %s, %nd, + %d, %d, %d, %d, %nd)', + $dst_table, + + // id, phid, transactionPHID, authorPHID, viewPolicy, editPolicy + $row['id'], + $comment_phid, + $xaction_phid, + $row['authorPHID'], + 'public', + $row['authorPHID'], + + // commentVersion, content, contentSource, isDeleted + 1, + $row['content'], + $content_source, + 0, + + // dateCreated, dateModified, revisionPHID, changesetID + $row['dateCreated'], + $row['dateModified'], + $revision_phid, + $row['changesetID'], + + // isNewFile, lineNumber, lineLength, hasReplies, legacyCommentID + $row['isNewFile'], + $row['lineNumber'], + $row['lineLength'], + 0, + $row['commentID']); + +} + +$conn_w->saveTransaction(); +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20130927.audiomacro.sql b/resources/sql/patches/20130927.audiomacro.sql new file mode 100644 index 0000000000..accb4a335c --- /dev/null +++ b/resources/sql/patches/20130927.audiomacro.sql @@ -0,0 +1,8 @@ +ALTER TABLE {$NAMESPACE}_file.file_imagemacro + ADD audioPHID VARCHAR(64) COLLATE utf8_bin; + +ALTER TABLE {$NAMESPACE}_file.file_imagemacro + ADD audioBehavior VARCHAR(64) NOT NULL COLLATE utf8_bin; + +UPDATE {$NAMESPACE}_file.file_imagemacro + SET audioBehavior = 'audio:none' WHERE audioBehavior = ''; diff --git a/resources/sql/patches/20130929.filepolicy.sql b/resources/sql/patches/20130929.filepolicy.sql new file mode 100644 index 0000000000..85646a42f8 --- /dev/null +++ b/resources/sql/patches/20130929.filepolicy.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_file.file + ADD viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin; + +UPDATE {$NAMESPACE}_file.file + SET viewPolicy = 'users' WHERE viewPolicy = ''; diff --git a/resources/sql/patches/20131004.dxedgekey.sql b/resources/sql/patches/20131004.dxedgekey.sql new file mode 100644 index 0000000000..82bc066e4e --- /dev/null +++ b/resources/sql/patches/20131004.dxedgekey.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.edge + ADD UNIQUE KEY `key_dst` (dst, type, src); diff --git a/resources/sql/patches/20131004.dxreviewers.php b/resources/sql/patches/20131004.dxreviewers.php new file mode 100644 index 0000000000..75a2ba53c1 --- /dev/null +++ b/resources/sql/patches/20131004.dxreviewers.php @@ -0,0 +1,50 @@ +establishConnection('w'); + +// NOTE: We migrate by revision because the relationship table doesn't have +// an "id" column. + +foreach (new LiskMigrationIterator($table) as $revision) { + $revision_id = $revision->getID(); + $revision_phid = $revision->getPHID(); + + echo pht('Migrating reviewers for %s...', "D{$revision_id}")."\n"; + + $reviewer_phids = queryfx_all( + $conn_w, + 'SELECT objectPHID FROM %T WHERE revisionID = %d + AND relation = %s ORDER BY sequence', + 'differential_relationship', + $revision_id, + 'revw'); + $reviewer_phids = ipull($reviewer_phids, 'objectPHID'); + + if (!$reviewer_phids) { + continue; + } + + $editor = new PhabricatorEdgeEditor(); + foreach ($reviewer_phids as $dst) { + if (phid_get_type($dst) == PhabricatorPHIDConstants::PHID_TYPE_UNKNOWN) { + // At least one old install ran into some issues here. Skip the row if we + // can't figure out what the destination PHID is. + continue; + } + + $editor->addEdge( + $revision_phid, + DifferentialRevisionHasReviewerEdgeType::EDGECONST, + $dst, + array( + 'data' => array( + 'status' => DifferentialReviewerStatus::STATUS_ADDED, + ), + )); + } + + $editor->save(); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20131006.hdisable.sql b/resources/sql/patches/20131006.hdisable.sql new file mode 100644 index 0000000000..c7afca13d8 --- /dev/null +++ b/resources/sql/patches/20131006.hdisable.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_herald.herald_rule + ADD isDisabled INT UNSIGNED NOT NULL DEFAULT 0; diff --git a/resources/sql/patches/20131010.pstorage.sql b/resources/sql/patches/20131010.pstorage.sql new file mode 100644 index 0000000000..ec5c757b99 --- /dev/null +++ b/resources/sql/patches/20131010.pstorage.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_policy.policy ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + rules LONGTEXT NOT NULL COLLATE utf8_bin, + defaultAction VARCHAR(32) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY (phid) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131015.cpolicy.sql b/resources/sql/patches/20131015.cpolicy.sql new file mode 100644 index 0000000000..8f32a55c9a --- /dev/null +++ b/resources/sql/patches/20131015.cpolicy.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_countdown.countdown + ADD viewPolicy VARCHAR(64) NOT NULL; + +UPDATE {$NAMESPACE}_countdown.countdown + SET viewPolicy = 'users' WHERE viewPolicy = ''; diff --git a/resources/sql/patches/20131020.col1.sql b/resources/sql/patches/20131020.col1.sql new file mode 100644 index 0000000000..fb1a1a948b --- /dev/null +++ b/resources/sql/patches/20131020.col1.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_project.project_column ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + name VARCHAR(255) NOT NULL, + sequence INT UNSIGNED NOT NULL, + projectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + UNIQUE KEY `key_sequence` (projectPHID, sequence), + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131020.harbormaster.sql b/resources/sql/patches/20131020.harbormaster.sql new file mode 100644 index 0000000000..eb7ffe4d2a --- /dev/null +++ b/resources/sql/patches/20131020.harbormaster.sql @@ -0,0 +1,74 @@ +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildable ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + buildablePHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + containerPHID VARCHAR(64) COLLATE utf8_bin, + buildStatus VARCHAR(32) NOT NULL COLLATE utf8_bin, + buildableStatus VARCHAR(32) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_buildable` (buildablePHID), + KEY `key_container` (containerPHID), + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildartifact ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + buildablePHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + artifactType VARCHAR(32) NOT NULL COLLATE utf8_bin, + artifactIndex VARCHAR(12) NOT NULL COLLATE utf8_bin, + artifactKey VARCHAR(255) NOT NULL COLLATE utf8_bin, + artifactData LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_artifact` (buildablePHID, artifactType, artifactIndex), + UNIQUE KEY `key_artifact_type` (artifactType, artifactIndex), + KEY `key_garbagecollect` (artifactType, dateCreated) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildplan ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + name VARCHAR(255) NOT NULL, + planStatus VARCHAR(32) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_status` (planStatus) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildplantransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_build ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + buildablePHID varchar(64) NOT NULL COLLATE utf8_bin, + buildPlanPHID varchar(64) NOT NULL COLLATE utf8_bin, + buildStatus VARCHAR(32) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_buildable` (buildablePHID), + KEY `key_plan` (buildPlanPHID), + KEY `key_status` (buildStatus) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131020.pcustom.sql b/resources/sql/patches/20131020.pcustom.sql new file mode 100644 index 0000000000..cf8efab13d --- /dev/null +++ b/resources/sql/patches/20131020.pcustom.sql @@ -0,0 +1,29 @@ +CREATE TABLE {$NAMESPACE}_project.project_customfieldstorage ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + fieldIndex CHAR(12) NOT NULL COLLATE utf8_bin, + fieldValue LONGTEXT NOT NULL, + UNIQUE KEY (objectPHID, fieldIndex) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_project.project_customfieldstringindex ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + indexKey VARCHAR(12) NOT NULL COLLATE utf8_bin, + indexValue LONGTEXT NOT NULL COLLATE utf8_general_ci, + + KEY `key_join` (objectPHID, indexKey, indexValue(64)), + KEY `key_find` (indexKey, indexValue(64)) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_project.project_customfieldnumericindex ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + indexKey VARCHAR(12) NOT NULL COLLATE utf8_bin, + indexValue BIGINT NOT NULL, + + KEY `key_join` (objectPHID, indexKey, indexValue), + KEY `key_find` (indexKey, indexValue) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131020.pxaction.sql b/resources/sql/patches/20131020.pxaction.sql new file mode 100644 index 0000000000..aaed5126d5 --- /dev/null +++ b/resources/sql/patches/20131020.pxaction.sql @@ -0,0 +1,24 @@ +RENAME TABLE {$NAMESPACE}_project.project_transaction + TO {$NAMESPACE}_project.project_legacytransaction; + +CREATE TABLE {$NAMESPACE}_project.project_transaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131020.pxactionmig.php b/resources/sql/patches/20131020.pxactionmig.php new file mode 100644 index 0000000000..9a7b82f3e8 --- /dev/null +++ b/resources/sql/patches/20131020.pxactionmig.php @@ -0,0 +1,91 @@ +establishConnection('w'); +$conn_w->openTransaction(); + +$src_table = 'project_legacytransaction'; +$dst_table = 'project_transaction'; + +echo pht('Migrating Project transactions to new format...')."\n"; + +$content_source = PhabricatorContentSource::newForSource( + PhabricatorOldWorldContentSource::SOURCECONST)->serialize(); + +$rows = new LiskRawMigrationIterator($conn_w, $src_table); +foreach ($rows as $row) { + $id = $row['id']; + + $project_id = $row['projectID']; + + echo pht('Migrating transaction #%d (Project %d)...', $id, $project_id)."\n"; + + $project_row = queryfx_one( + $conn_w, + 'SELECT phid FROM %T WHERE id = %d', + $project_table->getTableName(), + $project_id); + if (!$project_row) { + continue; + } + + $project_phid = $project_row['phid']; + + $type_map = array( + 'name' => PhabricatorProjectNameTransaction::TRANSACTIONTYPE, + 'members' => PhabricatorProjectTransaction::TYPE_MEMBERS, + 'status' => PhabricatorProjectStatusTransaction::TRANSACTIONTYPE, + 'canview' => PhabricatorTransactions::TYPE_VIEW_POLICY, + 'canedit' => PhabricatorTransactions::TYPE_EDIT_POLICY, + 'canjoin' => PhabricatorTransactions::TYPE_JOIN_POLICY, + ); + + $new_type = idx($type_map, $row['transactionType']); + if (!$new_type) { + continue; + } + + $xaction_phid = PhabricatorPHID::generateNewPHID( + PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST, + PhabricatorProjectProjectPHIDType::TYPECONST); + + queryfx( + $conn_w, + 'INSERT IGNORE INTO %T + (phid, authorPHID, objectPHID, + viewPolicy, editPolicy, commentPHID, commentVersion, transactionType, + oldValue, newValue, contentSource, metadata, + dateCreated, dateModified) + VALUES + (%s, %s, %s, + %s, %s, %ns, %d, %s, + %s, %s, %s, %s, + %d, %d)', + $dst_table, + + // PHID, Author, Object + $xaction_phid, + $row['authorPHID'], + $project_phid, + + // View, Edit, Comment, Version, Type + 'public', + $row['authorPHID'], + null, + 0, + $new_type, + + // Old, New, Source, Meta, + $row['oldValue'], + $row['newValue'], + $content_source, + '{}', + + // Created, Modified + $row['dateCreated'], + $row['dateModified']); + +} + +$conn_w->saveTransaction(); +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20131025.repopush.sql b/resources/sql/patches/20131025.repopush.sql new file mode 100644 index 0000000000..22f60c3cef --- /dev/null +++ b/resources/sql/patches/20131025.repopush.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_repository.repository + ADD COLUMN pushPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin; + +UPDATE {$NAMESPACE}_repository.repository + SET pushPolicy = 'users' WHERE pushPolicy = ''; diff --git a/resources/sql/patches/20131026.commitstatus.sql b/resources/sql/patches/20131026.commitstatus.sql new file mode 100644 index 0000000000..373fbddf3c --- /dev/null +++ b/resources/sql/patches/20131026.commitstatus.sql @@ -0,0 +1,8 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_commit + ADD COLUMN importStatus INT UNSIGNED NOT NULL COLLATE utf8_bin; + +UPDATE {$NAMESPACE}_repository.repository_commit + SET importStatus = 15; + +ALTER TABLE {$NAMESPACE}_repository.repository_commit + ADD KEY (repositoryID, importStatus); diff --git a/resources/sql/patches/20131030.repostatusmessage.sql b/resources/sql/patches/20131030.repostatusmessage.sql new file mode 100644 index 0000000000..17ee068368 --- /dev/null +++ b/resources/sql/patches/20131030.repostatusmessage.sql @@ -0,0 +1,9 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_statusmessage ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + repositoryID INT UNSIGNED NOT NULL, + statusType VARCHAR(32) NOT NULL COLLATE utf8_bin, + statusCode VARCHAR(32) NOT NULL COLLATE utf8_bin, + parameters LONGTEXT NOT NULL, + epoch INT UNSIGNED NOT NULL, + UNIQUE KEY (repositoryID, statusType) +) ENGINE=InnoDB, CHARSET utf8; diff --git a/resources/sql/patches/20131031.vcspassword.sql b/resources/sql/patches/20131031.vcspassword.sql new file mode 100644 index 0000000000..017600625c --- /dev/null +++ b/resources/sql/patches/20131031.vcspassword.sql @@ -0,0 +1,8 @@ +CREATE TABLE {$NAMESPACE}_repository.repository_vcspassword ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + userPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + passwordHash VARCHAR(50) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (userPHID) +) ENGINE=InnoDB, CHARSET utf8; diff --git a/resources/sql/patches/20131105.buildstep.sql b/resources/sql/patches/20131105.buildstep.sql new file mode 100644 index 0000000000..714e9a3088 --- /dev/null +++ b/resources/sql/patches/20131105.buildstep.sql @@ -0,0 +1,11 @@ +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildstep ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + buildPlanPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + className VARCHAR(255) NOT NULL COLLATE utf8_bin, + details LONGTEXT CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_plan` (buildPlanPHID), + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131106.diffphid.1.col.sql b/resources/sql/patches/20131106.diffphid.1.col.sql new file mode 100644 index 0000000000..d0a4fd5538 --- /dev/null +++ b/resources/sql/patches/20131106.diffphid.1.col.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_diff + ADD phid VARCHAR(64) NOT NULL COLLATE utf8_bin AFTER id; diff --git a/resources/sql/patches/20131106.diffphid.2.mig.php b/resources/sql/patches/20131106.diffphid.2.mig.php new file mode 100644 index 0000000000..7976c910eb --- /dev/null +++ b/resources/sql/patches/20131106.diffphid.2.mig.php @@ -0,0 +1,47 @@ +establishConnection('w'); + +$size = 1000; + +$row_iter = id(new LiskMigrationIterator($diff_table))->setPageSize($size); +$chunk_iter = new PhutilChunkedIterator($row_iter, $size); + +foreach ($chunk_iter as $chunk) { + $sql = array(); + + foreach ($chunk as $diff) { + $id = $diff->getID(); + echo pht('Migrating diff ID %d...', $id)."\n"; + + $phid = $diff->getPHID(); + if (strlen($phid)) { + continue; + } + + $type_diff = DifferentialDiffPHIDType::TYPECONST; + $new_phid = PhabricatorPHID::generateNewPHID($type_diff); + + $sql[] = qsprintf( + $conn_w, + '(%d, %s)', + $id, + $new_phid); + } + + if (!$sql) { + continue; + } + + foreach (PhabricatorLiskDAO::chunkSQL($sql) as $sql_chunk) { + queryfx( + $conn_w, + 'INSERT IGNORE INTO %T (id, phid) VALUES %LQ + ON DUPLICATE KEY UPDATE phid = VALUES(phid)', + $diff_table->getTableName(), + $sql_chunk); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20131106.diffphid.3.key.sql b/resources/sql/patches/20131106.diffphid.3.key.sql new file mode 100644 index 0000000000..63d68dd89b --- /dev/null +++ b/resources/sql/patches/20131106.diffphid.3.key.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_differential.differential_diff + ADD UNIQUE KEY `key_phid` (phid); diff --git a/resources/sql/patches/20131106.nuance-v0.sql b/resources/sql/patches/20131106.nuance-v0.sql new file mode 100644 index 0000000000..8041b70ac6 --- /dev/null +++ b/resources/sql/patches/20131106.nuance-v0.sql @@ -0,0 +1,259 @@ +CREATE TABLE {$NAMESPACE}_nuance.nuance_item ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + ownerPHID VARCHAR(64) COLLATE utf8_bin, + requestorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + sourcePHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + sourceLabel VARCHAR(255), + status INT UNSIGNED NOT NULL, + data longtext NOT NULL COLLATE utf8_bin, + mailKey VARCHAR(20) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + dateNuanced INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_source` (sourcePHID, status, dateNuanced, id), + KEY `key_owner` (ownerPHID, status, dateNuanced, id), + KEY `key_contacter` (requestorPHID, status, dateNuanced, id) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_itemtransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_itemtransaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + transactionPHID VARCHAR(64) COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_source ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + name VARCHAR(255), + type INT UNSIGNED NOT NULL, + data longtext NOT NULL COLLATE utf8_bin, + mailKey VARCHAR(20) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL, + editPolicy VARCHAR(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_type` (type, dateModified) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_sourcetransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_sourcetransaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + transactionPHID VARCHAR(64) COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_queue ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + name VARCHAR(255), + mailKey VARCHAR(20) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL, + editPolicy VARCHAR(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_queuetransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_queuetransaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + transactionPHID VARCHAR(64) COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_queueitem ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + queuePHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + itemPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + itemStatus INT UNSIGNED NOT NULL, + itemDateNuanced INT UNSIGNED NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_one_per_queue` (itemPHID, queuePHID), + KEY `key_queue` (queuePHID, itemStatus, itemDateNuanced, id) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_requestor ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + data longtext NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_requestortransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_requestortransaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + transactionPHID VARCHAR(64) COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_requestorsource ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + requestorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + sourcePHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + sourceKey VARCHAR(128) NOT NULL COLLATE utf8_bin, + data LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_requestor` (requestorPHID, id), + KEY `key_source` (sourcePHID, id), + UNIQUE KEY `key_source_key` (sourcePHID, sourceKey) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.edge ( + src VARCHAR(64) NOT NULL COLLATE utf8_bin, + type VARCHAR(64) NOT NULL COLLATE utf8_bin, + dst VARCHAR(64) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY (src, type, dateCreated, seq) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE utf8_bin +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131107.buildlog.sql b/resources/sql/patches/20131107.buildlog.sql new file mode 100644 index 0000000000..e761b46c9a --- /dev/null +++ b/resources/sql/patches/20131107.buildlog.sql @@ -0,0 +1,26 @@ +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlog ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + buildPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + buildStepPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + logSource VARCHAR(255) NULL COLLATE utf8_bin, + logType VARCHAR(255) NULL COLLATE utf8_bin, + duration INT UNSIGNED NULL, + live BOOLEAN NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_build` (buildPHID, buildStepPHID), + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_build +ADD COLUMN cancelRequested BOOLEAN NOT NULL; + +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlogchunk ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + logID INT UNSIGNED NOT NULL COLLATE utf8_bin, + encoding VARCHAR(30) NOT NULL COLLATE utf8_bin, + size LONG NULL, + chunk LONGBLOB NOT NULL, + KEY `key_log` (logID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131112.userverified.1.col.sql b/resources/sql/patches/20131112.userverified.1.col.sql new file mode 100644 index 0000000000..0612e79825 --- /dev/null +++ b/resources/sql/patches/20131112.userverified.1.col.sql @@ -0,0 +1,10 @@ +ALTER TABLE {$NAMESPACE}_user.user + ADD isEmailVerified INT UNSIGNED NOT NULL; + +ALTER TABLE {$NAMESPACE}_user.user + ADD isApproved INT UNSIGNED NOT NULL; + +ALTER TABLE {$NAMESPACE}_user.user + ADD KEY `key_approved` (isApproved); + +UPDATE {$NAMESPACE}_user.user SET isApproved = 1; diff --git a/resources/sql/patches/20131112.userverified.2.mig.php b/resources/sql/patches/20131112.userverified.2.mig.php new file mode 100644 index 0000000000..a8c231ec20 --- /dev/null +++ b/resources/sql/patches/20131112.userverified.2.mig.php @@ -0,0 +1,33 @@ +establishConnection('w'); + +foreach (new LiskMigrationIterator($table) as $user) { + $username = $user->getUsername(); + echo pht('Migrating %s...', $username)."\n"; + if ($user->getIsEmailVerified()) { + // Email already verified. + continue; + } + + $primary = $user->loadPrimaryEmail(); + if (!$primary) { + // No primary email. + continue; + } + + if (!$primary->getIsVerified()) { + // Primary email not verified. + continue; + } + + // Primary email is verified, so mark the account as verified. + queryfx( + $conn_w, + 'UPDATE %T SET isEmailVerified = 1 WHERE id = %d', + $table->getTableName(), + $user->getID()); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20131118.ownerorder.php b/resources/sql/patches/20131118.ownerorder.php new file mode 100644 index 0000000000..a3a5659946 --- /dev/null +++ b/resources/sql/patches/20131118.ownerorder.php @@ -0,0 +1,42 @@ +establishConnection('w'); + +$user_table = new PhabricatorUser(); +$user_conn = $user_table->establishConnection('r'); + +foreach (new LiskMigrationIterator($table) as $task) { + $id = $task->getID(); + + echo pht('Checking task %s...', "T{$id}")."\n"; + $owner_phid = $task->getOwnerPHID(); + + if (!$owner_phid && !$task->getOwnerOrdering()) { + // No owner and no ordering; we're all set. + continue; + } + + $owner_row = queryfx_one( + $user_conn, + 'SELECT * FROM %T WHERE phid = %s', + $user_table->getTableName(), + $owner_phid); + + if ($owner_row) { + $value = $owner_row['userName']; + } else { + $value = null; + } + + if ($value !== $task->getOwnerOrdering()) { + queryfx( + $conn_w, + 'UPDATE %T SET ownerOrdering = %ns WHERE id = %d', + $table->getTableName(), + $value, + $task->getID()); + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20131119.passphrase.sql b/resources/sql/patches/20131119.passphrase.sql new file mode 100644 index 0000000000..3e1761867c --- /dev/null +++ b/resources/sql/patches/20131119.passphrase.sql @@ -0,0 +1,46 @@ +CREATE TABLE {$NAMESPACE}_passphrase.passphrase_credential ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + name VARCHAR(255) NOT NULL, + credentialType VARCHAR(64) NOT NULL COLLATE utf8_bin, + providesType VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + description LONGTEXT NOT NULL COLLATE utf8_bin, + username VARCHAR(255) NOT NULL, + secretID INT UNSIGNED, + isDestroyed BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_type` (credentialType), + KEY `key_provides` (providesType), + UNIQUE KEY `key_secret` (secretID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_passphrase.passphrase_secret ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + secretData LONGBLOB NOT NULL +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_passphrase.passphrase_credentialtransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131120.nuancesourcetype.sql b/resources/sql/patches/20131120.nuancesourcetype.sql new file mode 100644 index 0000000000..14133e605e --- /dev/null +++ b/resources/sql/patches/20131120.nuancesourcetype.sql @@ -0,0 +1,11 @@ +ALTER TABLE {$NAMESPACE}_nuance.nuance_source + DROP KEY key_type; + +ALTER TABLE {$NAMESPACE}_nuance.nuance_source + DROP COLUMN type; + +ALTER TABLE {$NAMESPACE}_nuance.nuance_source + ADD type VARCHAR(32) NOT NULL COLLATE utf8_bin AFTER name; + +ALTER TABLE {$NAMESPACE}_nuance.nuance_source + ADD KEY `key_type` (type, dateModified); diff --git a/resources/sql/patches/20131121.passphraseedge.sql b/resources/sql/patches/20131121.passphraseedge.sql new file mode 100644 index 0000000000..38cfdb0453 --- /dev/null +++ b/resources/sql/patches/20131121.passphraseedge.sql @@ -0,0 +1,15 @@ +CREATE TABLE {$NAMESPACE}_passphrase.edge ( + src VARCHAR(64) NOT NULL COLLATE utf8_bin, + type VARCHAR(64) NOT NULL COLLATE utf8_bin, + dst VARCHAR(64) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY (src, type, dateCreated, seq) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_passphrase.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE utf8_bin +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131121.repocredentials.1.col.sql b/resources/sql/patches/20131121.repocredentials.1.col.sql new file mode 100644 index 0000000000..9471c7189b --- /dev/null +++ b/resources/sql/patches/20131121.repocredentials.1.col.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository + ADD credentialPHID VARCHAR(64) COLLATE utf8_bin; diff --git a/resources/sql/patches/20131121.repocredentials.2.mig.php b/resources/sql/patches/20131121.repocredentials.2.mig.php new file mode 100644 index 0000000000..a8cd6e5029 --- /dev/null +++ b/resources/sql/patches/20131121.repocredentials.2.mig.php @@ -0,0 +1,7 @@ +establishConnection('w'); +$viewer = PhabricatorUser::getOmnipotentUser(); + +// Since HarbormasterBuildStepQuery has been updated to handle the +// correct order, we can't use the built in database access. + +foreach (new LiskMigrationIterator($table) as $plan) { + $planname = $plan->getName(); + echo pht('Migrating steps in %s...', $planname)."\n"; + + $rows = queryfx_all( + $conn_w, + 'SELECT id, sequence FROM harbormaster_buildstep '. + 'WHERE buildPlanPHID = %s '. + 'ORDER BY id ASC', + $plan->getPHID()); + + $sequence = 1; + foreach ($rows as $row) { + $id = $row['id']; + $existing = $row['sequence']; + if ($existing != 0) { + echo " - ".pht('%d (already migrated)...', $id)."\n"; + continue; + } + echo " - ".pht('%d to position %s...', $id, $sequence)."\n"; + queryfx( + $conn_w, + 'UPDATE harbormaster_buildstep '. + 'SET sequence = %d '. + 'WHERE id = %d', + $sequence, + $id); + $sequence++; + } +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20131205.buildtargets.sql b/resources/sql/patches/20131205.buildtargets.sql new file mode 100644 index 0000000000..cf8e33af08 --- /dev/null +++ b/resources/sql/patches/20131205.buildtargets.sql @@ -0,0 +1,32 @@ +CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildtarget ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + buildPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + buildStepPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + className VARCHAR(255) NOT NULL COLLATE utf8_bin, + details LONGTEXT CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + variables LONGTEXT CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_build` (buildPHID, buildStepPHID), + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +TRUNCATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlog; +TRUNCATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlogchunk; +TRUNCATE TABLE {$NAMESPACE}_harbormaster.harbormaster_buildartifact; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlog +DROP COLUMN buildPHID; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlog +DROP COLUMN buildStepPHID; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildartifact +DROP COLUMN buildablePHID; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildlog +ADD COLUMN buildTargetPHID VARCHAR(64) NOT NULL COLLATE utf8_bin; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildartifact +ADD COLUMN buildTargetPHID VARCHAR(64) NOT NULL COLLATE utf8_bin; diff --git a/resources/sql/patches/20131206.phragment.sql b/resources/sql/patches/20131206.phragment.sql new file mode 100644 index 0000000000..21d3dfd148 --- /dev/null +++ b/resources/sql/patches/20131206.phragment.sql @@ -0,0 +1,24 @@ +CREATE TABLE {$NAMESPACE}_phragment.phragment_fragment ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + path VARCHAR(254) NOT NULL COLLATE utf8_bin, + depth INT UNSIGNED NOT NULL, + latestVersionPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_path` (path) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_phragment.phragment_fragmentversion ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + sequence INT UNSIGNED NOT NULL, + fragmentPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + filePHID VARCHAR(64) NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_version` (fragmentPHID, sequence) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131206.phragmentnull.sql b/resources/sql/patches/20131206.phragmentnull.sql new file mode 100644 index 0000000000..01dbd9bfe3 --- /dev/null +++ b/resources/sql/patches/20131206.phragmentnull.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_phragment.phragment_fragment +MODIFY latestVersionPHID VARCHAR(64) NULL; diff --git a/resources/sql/patches/20131208.phragmentsnapshot.sql b/resources/sql/patches/20131208.phragmentsnapshot.sql new file mode 100644 index 0000000000..ccf9f9b184 --- /dev/null +++ b/resources/sql/patches/20131208.phragmentsnapshot.sql @@ -0,0 +1,21 @@ +CREATE TABLE {$NAMESPACE}_phragment.phragment_snapshot ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + primaryFragmentPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + name VARCHAR(192) NOT NULL COLLATE utf8_bin, + description LONGTEXT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_name` (primaryFragmentPHID, name) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_phragment.phragment_snapshotchild ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, + snapshotPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + fragmentPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + fragmentVersionPHID VARCHAR(64) NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_child` (snapshotPHID, fragmentPHID, fragmentVersionPHID) +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131211.phragmentedges.sql b/resources/sql/patches/20131211.phragmentedges.sql new file mode 100644 index 0000000000..51eead5c5d --- /dev/null +++ b/resources/sql/patches/20131211.phragmentedges.sql @@ -0,0 +1,15 @@ +CREATE TABLE {$NAMESPACE}_phragment.edge ( + src VARCHAR(64) NOT NULL COLLATE utf8_bin, + type VARCHAR(64) NOT NULL COLLATE utf8_bin, + dst VARCHAR(64) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY (src, type, dateCreated, seq) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_phragment.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE utf8_bin +) ENGINE=InnoDB, COLLATE utf8_general_ci; diff --git a/resources/sql/patches/20131217.pushlogphid.1.col.sql b/resources/sql/patches/20131217.pushlogphid.1.col.sql new file mode 100644 index 0000000000..d52daa2b27 --- /dev/null +++ b/resources/sql/patches/20131217.pushlogphid.1.col.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_pushlog + ADD phid VARCHAR(64) NOT NULL COLLATE utf8_bin AFTER id; diff --git a/resources/sql/patches/20131217.pushlogphid.2.mig.php b/resources/sql/patches/20131217.pushlogphid.2.mig.php new file mode 100644 index 0000000000..5b253e2289 --- /dev/null +++ b/resources/sql/patches/20131217.pushlogphid.2.mig.php @@ -0,0 +1,20 @@ +establishConnection('w'); + +echo pht('Assigning PHIDs to push logs...')."\n"; + +$logs = new LiskMigrationIterator($table); +foreach ($logs as $log) { + $id = $log->getID(); + echo pht('Updating %s...', $id)."\n"; + queryfx( + $conn_w, + 'UPDATE %T SET phid = %s WHERE id = %d', + $table->getTableName(), + $log->generatePHID(), + $id); +} + +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/20131217.pushlogphid.3.key.sql b/resources/sql/patches/20131217.pushlogphid.3.key.sql new file mode 100644 index 0000000000..6e618cb5c6 --- /dev/null +++ b/resources/sql/patches/20131217.pushlogphid.3.key.sql @@ -0,0 +1,2 @@ +ALTER TABLE {$NAMESPACE}_repository.repository_pushlog + ADD UNIQUE KEY `key_phid` (phid); diff --git a/resources/sql/patches/20131219.pxdrop.sql b/resources/sql/patches/20131219.pxdrop.sql new file mode 100644 index 0000000000..c4c2e3d035 --- /dev/null +++ b/resources/sql/patches/20131219.pxdrop.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_project.project_legacytransaction; diff --git a/resources/sql/patches/20131224.harbormanual.sql b/resources/sql/patches/20131224.harbormanual.sql new file mode 100644 index 0000000000..0ce5aba968 --- /dev/null +++ b/resources/sql/patches/20131224.harbormanual.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildable + ADD isManualBuildable BOOL NOT NULL; + +ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildable + ADD KEY `key_manual` (isManualBuildable); diff --git a/resources/sql/patches/20131227.heraldobject.sql b/resources/sql/patches/20131227.heraldobject.sql new file mode 100644 index 0000000000..04f886d9df --- /dev/null +++ b/resources/sql/patches/20131227.heraldobject.sql @@ -0,0 +1,5 @@ +ALTER TABLE {$NAMESPACE}_herald.herald_rule + ADD triggerObjectPHID VARCHAR(64) COLLATE utf8_bin; + +ALTER TABLE {$NAMESPACE}_herald.herald_rule + ADD KEY `key_trigger` (triggerObjectPHID); diff --git a/resources/sql/patches/20131231.dropshortcut.sql b/resources/sql/patches/20131231.dropshortcut.sql new file mode 100644 index 0000000000..fe507ba9ab --- /dev/null +++ b/resources/sql/patches/20131231.dropshortcut.sql @@ -0,0 +1 @@ +DROP TABLE {$NAMESPACE}_repository.repository_shortcut; diff --git a/resources/sql/patches/20131302.maniphestvalue.sql b/resources/sql/patches/20131302.maniphestvalue.sql index 43f703a06d..bfcb9336f9 100644 --- a/resources/sql/patches/20131302.maniphestvalue.sql +++ b/resources/sql/patches/20131302.maniphestvalue.sql @@ -1,3 +1,2 @@ ALTER TABLE {$NAMESPACE}_maniphest.maniphest_taskauxiliarystorage MODIFY value LONGTEXT COLLATE utf8_bin; - diff --git a/resources/sql/patches/emailtableport.php b/resources/sql/patches/emailtableport.php index ba46e70916..d70f3341ff 100644 --- a/resources/sql/patches/emailtableport.php +++ b/resources/sql/patches/emailtableport.php @@ -1,6 +1,6 @@ openTransaction(); @@ -19,7 +19,7 @@ // NOTE: Grandfather all existing email in as primary / verified. We generate // verification codes because they are used for password resets, etc. - echo "Migrating '{$phid}'...\n"; + echo pht("Migrating '%s'...", $phid)."\n"; queryfx( $conn, 'INSERT INTO %T (userPHID, address, verificationCode, isVerified, isPrimary) @@ -31,4 +31,4 @@ } $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/emailtableremove.sql b/resources/sql/patches/emailtableremove.sql index be31125fec..9712d660dc 100644 --- a/resources/sql/patches/emailtableremove.sql +++ b/resources/sql/patches/emailtableremove.sql @@ -1 +1 @@ -ALTER TABLE {$NAMESPACE}_user.user DROP email; \ No newline at end of file +ALTER TABLE {$NAMESPACE}_user.user DROP email; diff --git a/resources/sql/patches/legalpad-mailkey-populate.php b/resources/sql/patches/legalpad-mailkey-populate.php index e754ab2757..8aa2c593df 100644 --- a/resources/sql/patches/legalpad-mailkey-populate.php +++ b/resources/sql/patches/legalpad-mailkey-populate.php @@ -1,13 +1,13 @@ openTransaction(); foreach (new LiskMigrationIterator($table) as $document) { $id = $document->getID(); - echo "Document {$id}: "; + echo pht('Document %s: ', $id); if (!$document->getMailKey()) { queryfx( $document->establishConnection('w'), @@ -15,11 +15,11 @@ $document->getTableName(), Filesystem::readRandomCharacters(20), $id); - echo "Generated Key\n"; + echo pht('Generated Key')."\n"; } else { echo "-\n"; } } $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/liskcounters.php b/resources/sql/patches/liskcounters.php index 489747575f..198ed13742 100644 --- a/resources/sql/patches/liskcounters.php +++ b/resources/sql/patches/liskcounters.php @@ -1,6 +1,6 @@ openTransaction(); foreach (new LiskMigrationIterator($table) as $rev) { $id = $rev->getID(); - echo "Revision {$id}: "; + echo pht('Revision %d: ', $id); - $deps = $rev->getAttachedPHIDs(DifferentialPHIDTypeRevision::TYPECONST); + $deps = $rev->getAttachedPHIDs(DifferentialRevisionPHIDType::TYPECONST); if (!$deps) { echo "-\n"; continue; } $editor = new PhabricatorEdgeEditor(); - $editor->setSuppressEvents(true); foreach ($deps as $dep) { $editor->addEdge( $rev->getPHID(), - PhabricatorEdgeConfig::TYPE_DREV_DEPENDS_ON_DREV, + DifferentialRevisionDependsOnRevisionEdgeType::EDGECONST, $dep); } $editor->save(); - echo "OKAY\n"; + echo pht('OKAY')."\n"; } $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/migrate-maniphest-dependencies.php b/resources/sql/patches/migrate-maniphest-dependencies.php index 51f1c944e9..1c607edd1d 100644 --- a/resources/sql/patches/migrate-maniphest-dependencies.php +++ b/resources/sql/patches/migrate-maniphest-dependencies.php @@ -1,30 +1,3 @@ openTransaction(); - -foreach (new LiskMigrationIterator($table) as $task) { - $id = $task->getID(); - echo "Task {$id}: "; - - $deps = $task->getAttachedPHIDs(ManiphestPHIDTypeTask::TYPECONST); - if (!$deps) { - echo "-\n"; - continue; - } - - $editor = new PhabricatorEdgeEditor(); - $editor->setSuppressEvents(true); - foreach ($deps as $dep) { - $editor->addEdge( - $task->getPHID(), - PhabricatorEdgeConfig::TYPE_TASK_DEPENDS_ON_TASK, - $dep); - } - $editor->save(); - echo "OKAY\n"; -} - -$table->saveTransaction(); -echo "Done.\n"; +// From 2013-2016, this migration moved dependent tasks to edges. diff --git a/resources/sql/patches/migrate-maniphest-revisions.php b/resources/sql/patches/migrate-maniphest-revisions.php index 788da47e92..26d44299f6 100644 --- a/resources/sql/patches/migrate-maniphest-revisions.php +++ b/resources/sql/patches/migrate-maniphest-revisions.php @@ -1,29 +1,3 @@ establishConnection('w'); - -foreach (new LiskMigrationIterator($table) as $task) { - $id = $task->getID(); - echo "Task {$id}: "; - - $revs = $task->getAttachedPHIDs(DifferentialPHIDTypeRevision::TYPECONST); - if (!$revs) { - echo "-\n"; - continue; - } - - $editor = new PhabricatorEdgeEditor(); - $editor->setSuppressEvents(true); - foreach ($revs as $rev) { - $editor->addEdge( - $task->getPHID(), - PhabricatorEdgeConfig::TYPE_TASK_HAS_RELATED_DREV, - $rev); - } - $editor->save(); - echo "OKAY\n"; -} - -echo "Done.\n"; +// From 2013-2016, this migration moved revisions attached to tasks to edges. diff --git a/resources/sql/patches/migrate-project-edges.php b/resources/sql/patches/migrate-project-edges.php index f64fa40efd..277cf8b155 100644 --- a/resources/sql/patches/migrate-project-edges.php +++ b/resources/sql/patches/migrate-project-edges.php @@ -1,12 +1,12 @@ establishConnection('w'); foreach (new LiskMigrationIterator($table) as $proj) { $id = $proj->getID(); - echo "Project {$id}: "; + echo pht('Project %d: ', $id); $members = queryfx_all( $proj->establishConnection('w'), @@ -22,15 +22,14 @@ $members = ipull($members, 'userPHID'); $editor = new PhabricatorEdgeEditor(); - $editor->setSuppressEvents(true); foreach ($members as $user_phid) { $editor->addEdge( $proj->getPHID(), - PhabricatorEdgeConfig::TYPE_PROJ_MEMBER, + PhabricatorProjectProjectHasMemberEdgeType::EDGECONST, $user_phid); } $editor->save(); - echo "OKAY\n"; + echo pht('OKAY')."\n"; } -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/phameblog.sql b/resources/sql/patches/phameblog.sql index b54d76c8ed..74ae9c8f89 100644 --- a/resources/sql/patches/phameblog.sql +++ b/resources/sql/patches/phameblog.sql @@ -28,4 +28,3 @@ CREATE TABLE {$NAMESPACE}_phame.edgedata ( ALTER TABLE {$NAMESPACE}_phame.phame_post ADD KEY `instancePosts` (`visibility`, `datePublished`, `id`); - diff --git a/resources/sql/patches/phamedomain.sql b/resources/sql/patches/phamedomain.sql index 066fa37e46..1feddd7ab4 100644 --- a/resources/sql/patches/phamedomain.sql +++ b/resources/sql/patches/phamedomain.sql @@ -1,4 +1,4 @@ ALTER TABLE `{$NAMESPACE}_phame`.`phame_blog` - ADD COLUMN `domain` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin + ADD COLUMN `domain` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin AFTER `description`, ADD UNIQUE KEY (`domain`); diff --git a/resources/sql/patches/phamepolicy.sql b/resources/sql/patches/phamepolicy.sql index d48bdf2223..be86021e4e 100644 --- a/resources/sql/patches/phamepolicy.sql +++ b/resources/sql/patches/phamepolicy.sql @@ -15,4 +15,3 @@ ALTER TABLE `{$NAMESPACE}_phame`.`phame_blog` UPDATE `{$NAMESPACE}_phame`.`phame_blog` SET joinPolicy = 'users' WHERE joinPolicy IS NULL; - diff --git a/resources/sql/patches/phiddrop.sql b/resources/sql/patches/phiddrop.sql index 53c95e5c20..6f3c3344d2 100644 --- a/resources/sql/patches/phiddrop.sql +++ b/resources/sql/patches/phiddrop.sql @@ -1 +1 @@ -DROP DATABASE IF EXISTS {$NAMESPACE}_phid; \ No newline at end of file +DROP DATABASE IF EXISTS {$NAMESPACE}_phid; diff --git a/resources/sql/patches/ponder-comments.sql b/resources/sql/patches/ponder-comments.sql index 1f21bfc3e6..b93092f67b 100644 --- a/resources/sql/patches/ponder-comments.sql +++ b/resources/sql/patches/ponder-comments.sql @@ -8,4 +8,4 @@ CREATE TABLE `{$NAMESPACE}_ponder`.`ponder_comment` ( PRIMARY KEY (`id`), KEY `authorPHID` (`authorPHID`), KEY `targetPHID` (`targetPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/resources/sql/patches/ponder-mailkey-populate.php b/resources/sql/patches/ponder-mailkey-populate.php index bdae8f83a0..5d2c77fff4 100644 --- a/resources/sql/patches/ponder-mailkey-populate.php +++ b/resources/sql/patches/ponder-mailkey-populate.php @@ -1,13 +1,13 @@ openTransaction(); foreach (new LiskMigrationIterator($table) as $question) { $id = $question->getID(); - echo "Question {$id}: "; + echo pht('Question %d: ', $id); if (!$question->getMailKey()) { queryfx( $question->establishConnection('w'), @@ -15,11 +15,11 @@ $question->getTableName(), Filesystem::readRandomCharacters(20), $id); - echo "Generated Key\n"; + echo pht('Generated Key')."\n"; } else { echo "-\n"; } } $table->saveTransaction(); -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/resources/sql/patches/ponder.sql b/resources/sql/patches/ponder.sql index 86e36a075b..868dbe66ce 100644 --- a/resources/sql/patches/ponder.sql +++ b/resources/sql/patches/ponder.sql @@ -47,4 +47,4 @@ CREATE TABLE `{$NAMESPACE}_ponder`.`edgedata` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/resources/sql/quickstart.sql b/resources/sql/quickstart.sql index 3439af6d4e..b2796d31e6 100644 --- a/resources/sql/quickstart.sql +++ b/resources/sql/quickstart.sql @@ -1,2184 +1,10211 @@ -CREATE DATABASE `{$NAMESPACE}_audit` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_audit`; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_almanac` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_almanac`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; -CREATE TABLE `audit_comment` ( +CREATE TABLE `almanac_binding` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `targetPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `actorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `servicePHID` varbinary(64) NOT NULL, + `devicePHID` varbinary(64) NOT NULL, + `interfacePHID` varbinary(64) NOT NULL, + `mailKey` binary(20) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `action` varchar(64) NOT NULL, - `content` longtext NOT NULL, - `metadata` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `isDisabled` tinyint(1) NOT NULL, PRIMARY KEY (`id`), - KEY `targetPHID` (`targetPHID`,`actorPHID`,`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_service` (`servicePHID`,`interfacePHID`), + KEY `key_device` (`devicePHID`), + KEY `key_interface` (`interfacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_almanac`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `audit_inlinecomment` ( +CREATE TABLE `almanac_bindingtransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `commitPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `pathID` int(10) unsigned NOT NULL, - `auditCommentID` int(10) unsigned DEFAULT NULL, - `isNewFile` tinyint(1) NOT NULL, - `lineNumber` int(10) unsigned NOT NULL, - `lineLength` int(10) unsigned NOT NULL, - `content` longtext CHARACTER SET utf8 COLLATE utf8_bin, - `cache` longtext CHARACTER SET utf8 COLLATE utf8_bin, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - KEY `commitPHID` (`commitPHID`,`pathID`), - KEY `authorPHID` (`authorPHID`,`commitPHID`,`auditCommentID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; -CREATE DATABASE `{$NAMESPACE}_cache` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_cache`; +USE `{$NAMESPACE}_almanac`; -CREATE TABLE `cache_general` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `cacheKeyHash` char(12) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `cacheKey` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `cacheFormat` varchar(16) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `cacheData` longblob NOT NULL, - `cacheCreated` int(10) unsigned NOT NULL, - `cacheExpires` int(10) unsigned DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `key_cacheKeyHash` (`cacheKeyHash`), - KEY `key_cacheCreated` (`cacheCreated`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `cache_markupcache` ( +CREATE TABLE `almanac_device` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `cacheKey` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `cacheData` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `metadata` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `name` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `nameIndex` binary(12) NOT NULL, + `mailKey` binary(20) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `isBoundToClusterService` tinyint(1) NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `cacheKey` (`cacheKey`), - KEY `dateCreated` (`dateCreated`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_name` (`nameIndex`), + KEY `key_nametext` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE DATABASE `{$NAMESPACE}_calendar` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_calendar`; + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; -CREATE TABLE `calendar_holiday` ( +CREATE TABLE `almanac_devicename_ngrams` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `day` date NOT NULL, - `name` varchar(50) NOT NULL, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `day` (`day`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE DATABASE `{$NAMESPACE}_chatlog` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_chatlog`; + SET NAMES utf8 ; -CREATE TABLE `chatlog_event` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `almanac_devicetransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `channel` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `epoch` int(10) unsigned NOT NULL, - `author` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `type` varchar(4) NOT NULL, - `message` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `loggedByPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - KEY `channel` (`channel`,`epoch`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE DATABASE `{$NAMESPACE}_conduit` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_conduit`; + SET NAMES utf8 ; -CREATE TABLE `conduit_certificatetoken` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `almanac_interface` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `token` varchar(64) DEFAULT NULL, + `phid` varbinary(64) NOT NULL, + `devicePHID` varbinary(64) NOT NULL, + `networkPHID` varbinary(64) NOT NULL, + `address` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `port` int(10) unsigned NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `userPHID` (`userPHID`), - UNIQUE KEY `token` (`token`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_unique` (`devicePHID`,`networkPHID`,`address`,`port`), + KEY `key_location` (`networkPHID`,`address`,`port`), + KEY `key_device` (`devicePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE TABLE `conduit_connectionlog` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `client` varchar(255) DEFAULT NULL, - `clientVersion` varchar(255) DEFAULT NULL, - `clientDescription` varchar(255) DEFAULT NULL, - `username` varchar(255) DEFAULT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `conduit_methodcalllog` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `connectionID` bigint(20) unsigned DEFAULT NULL, - `method` varchar(255) NOT NULL, - `error` varchar(255) NOT NULL, - `duration` bigint(20) unsigned NOT NULL, +CREATE TABLE `almanac_interfacetransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE DATABASE `{$NAMESPACE}_config` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_config`; + SET NAMES utf8 ; -CREATE TABLE `config_entry` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `almanac_namespace` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `namespace` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `configKey` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `value` longtext NOT NULL, - `isDeleted` tinyint(1) NOT NULL, + `phid` varbinary(64) NOT NULL, + `name` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `nameIndex` binary(12) NOT NULL, + `mailKey` binary(20) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`), - UNIQUE KEY `key_name` (`namespace`,`configKey`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_nameindex` (`nameIndex`), + KEY `key_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE TABLE `config_transaction` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `almanac_namespacename_ngrams` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `objectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `viewPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `editPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `commentPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `commentVersion` int(10) unsigned NOT NULL, - `transactionType` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `oldValue` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `newValue` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `contentSource` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `key_phid` (`phid`), - KEY `key_object` (`objectPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE DATABASE `{$NAMESPACE}_countdown` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_countdown`; + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; -CREATE TABLE `countdown_timer` ( +CREATE TABLE `almanac_namespacetransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `title` varchar(255) NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `datepoint` int(10) unsigned NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE DATABASE `{$NAMESPACE}_daemon` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_daemon`; + SET NAMES utf8 ; -CREATE TABLE `daemon_log` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `almanac_network` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `daemon` varchar(255) NOT NULL, - `host` varchar(255) NOT NULL, - `pid` int(10) unsigned NOT NULL, - `argv` varchar(512) NOT NULL, + `phid` varbinary(64) NOT NULL, + `name` varchar(128) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `mailKey` binary(20) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `status` varchar(8) NOT NULL, PRIMARY KEY (`id`), - KEY `status` (`status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE TABLE `daemon_logevent` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `almanac_networkname_ngrams` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `logID` int(10) unsigned NOT NULL, - `logType` varchar(4) NOT NULL, - `message` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `epoch` int(10) unsigned NOT NULL, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - KEY `logID` (`logID`,`epoch`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE DATABASE `{$NAMESPACE}_differential` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_differential`; - -CREATE TABLE `differential_affectedpath` ( - `repositoryID` int(10) unsigned NOT NULL, - `pathID` int(10) unsigned NOT NULL, - `epoch` int(10) unsigned NOT NULL, - `revisionID` int(10) unsigned NOT NULL, - KEY `repositoryID` (`repositoryID`,`pathID`,`epoch`), - KEY `revisionID` (`revisionID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `differential_auxiliaryfield` ( +CREATE TABLE `almanac_networktransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `revisionPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `value` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `revisionPHID` (`revisionPHID`,`name`), - KEY `name` (`name`,`value`(64)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE TABLE `differential_changeset` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `almanac_property` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `diffID` int(10) unsigned NOT NULL, - `oldFile` varchar(255) DEFAULT NULL, - `filename` varchar(255) NOT NULL, - `awayPaths` longtext CHARACTER SET utf8 COLLATE utf8_bin, - `changeType` int(10) unsigned NOT NULL, - `fileType` int(10) unsigned NOT NULL, - `metadata` longtext CHARACTER SET utf8 COLLATE utf8_bin, - `oldProperties` longtext CHARACTER SET utf8 COLLATE utf8_bin, - `newProperties` longtext CHARACTER SET utf8 COLLATE utf8_bin, - `addLines` int(10) unsigned NOT NULL, - `delLines` int(10) unsigned NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `fieldIndex` binary(12) NOT NULL, + `fieldName` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `fieldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - KEY `diffID` (`diffID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `objectPHID` (`objectPHID`,`fieldIndex`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE TABLE `differential_changeset_parse_cache` ( - `id` int(10) unsigned NOT NULL, - `cache` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`), - KEY `dateCreated` (`dateCreated`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `differential_comment` ( +CREATE TABLE `almanac_service` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `revisionID` int(10) unsigned NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `action` varchar(64) NOT NULL, - `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `name` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `nameIndex` binary(12) NOT NULL, + `mailKey` binary(20) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `cache` longtext CHARACTER SET utf8 COLLATE utf8_bin, - `metadata` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `contentSource` varchar(255) DEFAULT NULL, + `serviceType` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - KEY `revisionID` (`revisionID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_name` (`nameIndex`), + KEY `key_nametext` (`name`), + KEY `key_servicetype` (`serviceType`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE TABLE `differential_commit` ( - `revisionID` int(10) unsigned NOT NULL, - `commitPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`revisionID`,`commitPHID`), - UNIQUE KEY `commitPHID` (`commitPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `differential_diff` ( +CREATE TABLE `almanac_servicename_ngrams` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `revisionID` int(10) unsigned DEFAULT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `sourceMachine` varchar(255) DEFAULT NULL, - `sourcePath` varchar(255) DEFAULT NULL, - `sourceControlSystem` varchar(64) DEFAULT NULL, - `sourceControlBaseRevision` varchar(255) DEFAULT NULL, - `sourceControlPath` varchar(255) DEFAULT NULL, - `lintStatus` int(10) unsigned NOT NULL, - `unitStatus` int(10) unsigned NOT NULL, - `lineCount` int(10) unsigned NOT NULL, - `branch` varchar(255) DEFAULT NULL, - `bookmark` varchar(255) DEFAULT NULL, - `parentRevisionID` int(10) unsigned DEFAULT NULL, - `arcanistProjectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `creationMethod` varchar(255) DEFAULT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - `description` varchar(255) DEFAULT NULL, - `repositoryUUID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - KEY `revisionID` (`revisionID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE TABLE `differential_diffproperty` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `almanac_servicetransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `diffID` int(10) unsigned NOT NULL, - `name` varchar(255) NOT NULL, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `diffID` (`diffID`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_almanac`; -CREATE TABLE `differential_hunk` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `changesetID` int(10) unsigned NOT NULL, - `changes` longtext CHARACTER SET utf8 COLLATE utf8_bin, - `oldOffset` int(10) unsigned NOT NULL, - `oldLen` int(10) unsigned NOT NULL, - `newOffset` int(10) unsigned NOT NULL, - `newLen` int(10) unsigned NOT NULL, + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`), - KEY `changesetID` (`changesetID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_almanac`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `differential_inlinecomment` ( +CREATE TABLE `edgedata` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `revisionID` int(10) unsigned NOT NULL, - `commentID` int(10) unsigned DEFAULT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `changesetID` int(10) unsigned NOT NULL, - `isNewFile` tinyint(1) NOT NULL, - `lineNumber` int(10) unsigned NOT NULL, - `lineLength` int(10) unsigned NOT NULL, - `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_application` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_application`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `application_application` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `cache` longtext CHARACTER SET utf8 COLLATE utf8_bin, PRIMARY KEY (`id`), - KEY `changesetID` (`changesetID`), - KEY `commentID` (`commentID`), - KEY `revisionID` (`revisionID`,`authorPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_application`; -CREATE TABLE `differential_relationship` ( - `revisionID` int(10) unsigned NOT NULL, - `relation` varchar(4) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `objectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `sequence` int(10) unsigned NOT NULL, - `reasonPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - PRIMARY KEY (`revisionID`,`relation`,`objectPHID`), - KEY `objectPHID` (`objectPHID`,`relation`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `differential_revision` ( +CREATE TABLE `application_applicationtransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `title` varchar(255) NOT NULL, - `originalTitle` varchar(255) NOT NULL, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `status` varchar(32) NOT NULL, - `summary` longtext NOT NULL, - `testPlan` text NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `lastReviewerPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `dateCommitted` int(10) unsigned DEFAULT NULL, - `lineCount` int(10) unsigned DEFAULT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `attached` longtext NOT NULL, - `unsubscribed` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `mailKey` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `branchName` varchar(255) DEFAULT NULL, - `arcanistProjectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - KEY `authorPHID` (`authorPHID`,`status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_application`; -CREATE TABLE `differential_revisionhash` ( - `revisionID` int(10) unsigned NOT NULL, - `type` char(4) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `hash` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - KEY `type` (`type`,`hash`), - KEY `revisionID` (`revisionID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; CREATE TABLE `edge` ( - `src` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `src` varbinary(64) NOT NULL, `type` int(10) unsigned NOT NULL, - `dst` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `dst` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `seq` int(10) unsigned NOT NULL, `dataID` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), KEY `src` (`src`,`type`,`dateCreated`,`seq`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_application`; + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `edgedata` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_audit` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE DATABASE `{$NAMESPACE}_draft` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_draft`; +USE `{$NAMESPACE}_audit`; -CREATE TABLE `draft` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `audit_transaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `draftKey` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `draft` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `metadata` longtext, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `authorPHID` (`authorPHID`,`draftKey`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_audit`; -CREATE DATABASE `{$NAMESPACE}_drydock` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_drydock`; + SET NAMES utf8 ; -CREATE TABLE `drydock_lease` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `audit_transaction_comment` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `resourceID` int(10) unsigned DEFAULT NULL, - `status` int(10) unsigned NOT NULL, - `until` int(10) unsigned DEFAULT NULL, - `ownerPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `attributes` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `taskID` int(10) unsigned DEFAULT NULL, - `resourceType` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `commitPHID` varbinary(64) DEFAULT NULL, + `pathID` int(10) unsigned DEFAULT NULL, + `isNewFile` tinyint(1) NOT NULL, + `lineNumber` int(10) unsigned NOT NULL, + `lineLength` int(10) unsigned NOT NULL, + `fixedState` varchar(12) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `hasReplies` tinyint(1) NOT NULL, + `replyToCommentPHID` varbinary(64) DEFAULT NULL, + `legacyCommentID` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`), + KEY `key_path` (`pathID`), + KEY `key_draft` (`authorPHID`,`transactionPHID`), + KEY `key_commit` (`commitPHID`), + KEY `key_legacy` (`legacyCommentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_auth` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE TABLE `drydock_log` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `resourceID` int(10) unsigned DEFAULT NULL, - `leaseID` int(10) unsigned DEFAULT NULL, - `epoch` int(10) unsigned NOT NULL, - `message` longtext NOT NULL, - PRIMARY KEY (`id`), - KEY `resourceID` (`resourceID`,`epoch`), - KEY `leaseID` (`leaseID`,`epoch`), - KEY `epoch` (`epoch`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +USE `{$NAMESPACE}_auth`; + SET NAMES utf8 ; -CREATE TABLE `drydock_resource` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `auth_challenge` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(255) NOT NULL, - `ownerPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `status` int(10) unsigned NOT NULL, - `blueprintClass` varchar(255) NOT NULL, - `type` varchar(64) NOT NULL, - `attributes` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `capabilities` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `userPHID` varbinary(64) NOT NULL, + `factorPHID` varbinary(64) NOT NULL, + `sessionPHID` varbinary(64) NOT NULL, + `challengeKey` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `challengeTTL` int(10) unsigned NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `workflowKey` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `responseDigest` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `responseTTL` int(10) unsigned DEFAULT NULL, + `isCompleted` tinyint(1) NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - + UNIQUE KEY `key_phid` (`phid`), + KEY `key_issued` (`userPHID`,`challengeTTL`), + KEY `key_collection` (`challengeTTL`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; -CREATE DATABASE `{$NAMESPACE}_fact` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_fact`; +USE `{$NAMESPACE}_auth`; -CREATE TABLE `fact_aggregate` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `factType` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `objectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `valueX` bigint(20) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `factType` (`factType`,`objectPHID`), - KEY `factType_2` (`factType`,`valueX`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `fact_cursor` ( +CREATE TABLE `auth_contactnumber` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `position` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `contactNumber` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `uniqueKey` binary(12) DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `isPrimary` tinyint(1) NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_unique` (`uniqueKey`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; -CREATE TABLE `fact_raw` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `factType` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `objectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `objectA` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `valueX` bigint(20) NOT NULL, - `valueY` bigint(20) NOT NULL, - `epoch` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`), - KEY `objectPHID` (`objectPHID`), - KEY `factType` (`factType`,`epoch`), - KEY `factType_2` (`factType`,`objectA`,`epoch`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +USE `{$NAMESPACE}_auth`; + SET NAMES utf8 ; -CREATE DATABASE `{$NAMESPACE}_feed` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_feed`; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `feed_storydata` ( +CREATE TABLE `auth_contactnumbertransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `chronologicalKey` bigint(20) unsigned NOT NULL, - `storyType` varchar(64) NOT NULL, - `storyData` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `chronologicalKey` (`chronologicalKey`), - UNIQUE KEY `phid` (`phid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_auth`; -CREATE TABLE `feed_storynotification` ( - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `primaryObjectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `chronologicalKey` bigint(20) unsigned NOT NULL, - `hasViewed` tinyint(1) NOT NULL, - UNIQUE KEY `userPHID` (`userPHID`,`chronologicalKey`), - KEY `userPHID_2` (`userPHID`,`hasViewed`,`primaryObjectPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `feed_storyreference` ( - `objectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `chronologicalKey` bigint(20) unsigned NOT NULL, - UNIQUE KEY `objectPHID` (`objectPHID`,`chronologicalKey`), - KEY `chronologicalKey` (`chronologicalKey`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE DATABASE `{$NAMESPACE}_file` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_file`; - -CREATE TABLE `edge` ( - `src` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `type` int(10) unsigned NOT NULL, - `dst` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, +CREATE TABLE `auth_factorconfig` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `userPHID` varbinary(64) NOT NULL, + `factorName` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `factorSecret` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, - `seq` int(10) unsigned NOT NULL, - `dataID` int(10) unsigned DEFAULT NULL, - PRIMARY KEY (`src`,`type`,`dst`), - KEY `src` (`src`,`type`,`dateCreated`,`seq`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + `dateModified` int(10) unsigned NOT NULL, + `factorProviderPHID` varbinary(64) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_user` (`userPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_auth`; -CREATE TABLE `edgedata` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `file` ( +CREATE TABLE `auth_factorprovider` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(255) DEFAULT NULL, - `mimeType` varchar(255) DEFAULT NULL, - `byteSize` bigint(20) unsigned NOT NULL, - `storageEngine` varchar(32) NOT NULL, - `storageFormat` varchar(32) NOT NULL, - `storageHandle` varchar(255) NOT NULL, + `phid` varbinary(64) NOT NULL, + `providerFactorKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `secretKey` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `contentHash` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `metadata` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - KEY `authorPHID` (`authorPHID`), - KEY `contentHash` (`contentHash`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_auth`; -CREATE TABLE `file_imagemacro` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `auth_factorprovidertransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `filePHID` varchar(64) NOT NULL, - `name` varchar(255) NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `isDisabled` tinyint(1) NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`), UNIQUE KEY `key_phid` (`phid`), - KEY `key_disabled` (`isDisabled`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_auth`; -CREATE TABLE `file_storageblob` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `auth_hmackey` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longblob NOT NULL, + `keyName` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `keyValue` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + PRIMARY KEY (`id`), + UNIQUE KEY `key_name` (`keyName`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_auth`; -CREATE TABLE `file_transformedfile` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `auth_message` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `originalPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `transform` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `transformedPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `messageKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `messageText` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `originalPHID` (`originalPHID`,`transform`), - KEY `transformedPHID` (`transformedPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_type` (`messageKey`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_auth`; -CREATE TABLE `macro_transaction` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `auth_messagetransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `objectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `viewPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `editPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `commentPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, `commentVersion` int(10) unsigned NOT NULL, - `transactionType` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `oldValue` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `newValue` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `contentSource` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `transactionType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`), KEY `key_object` (`objectPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_auth`; -CREATE TABLE `macro_transaction_comment` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `auth_password` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `transactionPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `viewPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `editPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `commentVersion` int(10) unsigned NOT NULL, - `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `contentSource` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `isDeleted` tinyint(1) NOT NULL, + `phid` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `passwordType` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `passwordHash` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isRevoked` tinyint(1) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `passwordSalt` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `legacyDigestFormat` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`), - UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_role` (`objectPHID`,`passwordType`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_auth`; -CREATE DATABASE `{$NAMESPACE}_flag` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_flag`; + SET NAMES utf8 ; -CREATE TABLE `flag` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `auth_passwordtransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `ownerPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `type` varchar(4) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `objectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `reasonPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `color` int(10) unsigned NOT NULL, - `note` varchar(255) DEFAULT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `ownerPHID` (`ownerPHID`,`type`,`objectPHID`), - KEY `objectPHID` (`objectPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_auth`; -CREATE DATABASE `{$NAMESPACE}_harbormaster` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_harbormaster`; + SET NAMES utf8 ; -CREATE TABLE `edge` ( - `src` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `type` int(10) unsigned NOT NULL, - `dst` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `auth_providerconfig` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `providerClass` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `providerType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `providerDomain` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isEnabled` tinyint(1) NOT NULL, + `shouldAllowLogin` tinyint(1) NOT NULL, + `shouldAllowRegistration` tinyint(1) NOT NULL, + `shouldAllowLink` tinyint(1) NOT NULL, + `shouldAllowUnlink` tinyint(1) NOT NULL, + `shouldTrustEmails` tinyint(1) NOT NULL DEFAULT '0', + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, - `seq` int(10) unsigned NOT NULL, - `dataID` int(10) unsigned DEFAULT NULL, - PRIMARY KEY (`src`,`type`,`dst`), - KEY `src` (`src`,`type`,`dateCreated`,`seq`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + `dateModified` int(10) unsigned NOT NULL, + `shouldAutoLogin` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_provider` (`providerType`,`providerDomain`), + KEY `key_class` (`providerClass`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_auth`; -CREATE TABLE `edgedata` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `harbormaster_object` ( +CREATE TABLE `auth_providerconfigtransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(255) DEFAULT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_auth`; -CREATE TABLE `harbormaster_scratchtable` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `auth_sshkey` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `keyType` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `keyBody` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `keyComment` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `keyIndex` binary(12) NOT NULL, + `isTrusted` tinyint(1) NOT NULL, + `isActive` tinyint(1) DEFAULT NULL, PRIMARY KEY (`id`), - KEY `data` (`data`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_activeunique` (`keyIndex`,`isActive`), + KEY `key_object` (`objectPHID`), + KEY `key_active` (`isActive`,`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_auth`; -CREATE TABLE `lisk_counter` ( - `counterName` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `counterValue` bigint(20) unsigned NOT NULL, - PRIMARY KEY (`counterName`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE DATABASE `{$NAMESPACE}_herald` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_herald`; +CREATE TABLE `auth_sshkeytransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; -CREATE TABLE `herald_action` ( +USE `{$NAMESPACE}_auth`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `auth_temporarytoken` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `ruleID` int(10) unsigned NOT NULL, - `action` varchar(255) NOT NULL, - `target` text NOT NULL, + `tokenResource` varbinary(64) NOT NULL, + `tokenType` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `tokenExpires` int(10) unsigned NOT NULL, + `tokenCode` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `userPHID` varbinary(64) DEFAULT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - KEY `ruleID` (`ruleID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_token` (`tokenResource`,`tokenType`,`tokenCode`), + KEY `key_expires` (`tokenExpires`), + KEY `key_user` (`userPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_badges` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE TABLE `herald_condition` ( +USE `{$NAMESPACE}_badges`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `badges_award` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `ruleID` int(10) unsigned NOT NULL, - `fieldName` varchar(255) NOT NULL, - `fieldCondition` varchar(255) NOT NULL, - `value` text NOT NULL, + `badgePHID` varbinary(64) NOT NULL, + `recipientPHID` varbinary(64) NOT NULL, + `awarderPHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - KEY `ruleID` (`ruleID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_badge` (`badgePHID`,`recipientPHID`), + KEY `key_recipient` (`recipientPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_badges`; -CREATE TABLE `herald_rule` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `badges_badge` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `contentType` varchar(255) NOT NULL, - `mustMatchAll` tinyint(1) NOT NULL, - `configVersion` int(10) unsigned NOT NULL DEFAULT '1', + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `flavor` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `description` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `icon` varchar(255) COLLATE {$COLLATE_TEXT} NOT NULL, + `quality` int(10) unsigned NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `repetitionPolicy` int(10) unsigned DEFAULT NULL, - `ruleType` varchar(255) NOT NULL DEFAULT 'global', + `editPolicy` varbinary(64) NOT NULL, + `creatorPHID` varbinary(64) NOT NULL, + `mailKey` binary(20) NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `authorPHID` (`authorPHID`,`name`), - KEY `IDX_RULE_TYPE` (`ruleType`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_creator` (`creatorPHID`,`dateModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_badges`; -CREATE TABLE `herald_ruleapplied` ( - `ruleID` int(10) unsigned NOT NULL, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`ruleID`,`phid`), - KEY `phid` (`phid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `herald_ruleedit` ( +CREATE TABLE `badges_badgename_ngrams` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `ruleID` int(10) unsigned NOT NULL, - `editorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_badges`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `badges_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `ruleName` varchar(255) NOT NULL, - `action` varchar(32) NOT NULL, PRIMARY KEY (`id`), - KEY `ruleID` (`ruleID`,`dateCreated`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_badges`; -CREATE TABLE `herald_savedheader` ( - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `header` varchar(255) NOT NULL, - PRIMARY KEY (`phid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `herald_transcript` ( +CREATE TABLE `badges_transaction_comment` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `time` int(10) unsigned NOT NULL, - `host` varchar(255) NOT NULL, - `psth` varchar(255) NOT NULL, - `duration` float NOT NULL, - `objectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `dryRun` tinyint(1) NOT NULL, - `objectTranscript` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `ruleTranscripts` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `conditionTranscripts` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `applyTranscripts` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `garbageCollected` tinyint(1) NOT NULL DEFAULT '0', + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - KEY `objectPHID` (`objectPHID`), - KEY `garbageCollected` (`garbageCollected`,`time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_badges`; -CREATE DATABASE `{$NAMESPACE}_maniphest` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_maniphest`; + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `edge` ( - `src` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `src` varbinary(64) NOT NULL, `type` int(10) unsigned NOT NULL, - `dst` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `dst` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `seq` int(10) unsigned NOT NULL, `dataID` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), KEY `src` (`src`,`type`,`dateCreated`,`seq`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_badges`; + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `edgedata` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_cache` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE TABLE `maniphest_savedquery` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `queryKey` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(128) NOT NULL, - `isDefault` tinyint(1) NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, +USE `{$NAMESPACE}_cache`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `cache_general` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `cacheKeyHash` binary(12) NOT NULL, + `cacheKey` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `cacheFormat` varchar(16) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `cacheData` longblob NOT NULL, + `cacheCreated` int(10) unsigned NOT NULL, + `cacheExpires` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`), - KEY `userPHID` (`userPHID`,`name`), - KEY `userPHID_2` (`userPHID`,`isDefault`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_cacheKeyHash` (`cacheKeyHash`), + KEY `key_cacheCreated` (`cacheCreated`), + KEY `key_ttl` (`cacheExpires`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_cache`; -CREATE TABLE `maniphest_task` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `cache_markupcache` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `ownerPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `ccPHIDs` text, - `attached` longtext NOT NULL, - `status` int(10) unsigned NOT NULL, - `priority` int(10) unsigned NOT NULL, - `title` text NOT NULL, - `originalTitle` text NOT NULL, - `description` longtext NOT NULL, + `cacheKey` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `cacheData` longblob NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `projectPHIDs` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `mailKey` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `ownerOrdering` varchar(64) DEFAULT NULL, - `originalEmailSource` varchar(255) DEFAULT NULL, - `subpriority` double NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - KEY `priority` (`priority`,`status`), - KEY `status` (`status`), - KEY `ownerPHID` (`ownerPHID`,`status`), - KEY `authorPHID` (`authorPHID`,`status`), - KEY `ownerOrdering` (`ownerOrdering`), - KEY `priority_2` (`priority`,`subpriority`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `cacheKey` (`cacheKey`), + KEY `dateCreated` (`dateCreated`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_calendar` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_calendar`; + SET NAMES utf8 ; -CREATE TABLE `maniphest_taskauxiliarystorage` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `calendar_event` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `taskPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(255) NOT NULL, - `value` varchar(255) NOT NULL, + `phid` varbinary(64) NOT NULL, + `hostPHID` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isCancelled` tinyint(1) NOT NULL, + `name` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `mailKey` binary(20) NOT NULL, + `isAllDay` tinyint(1) NOT NULL, + `icon` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isRecurring` tinyint(1) NOT NULL, + `instanceOfEventPHID` varbinary(64) DEFAULT NULL, + `sequenceIndex` int(10) unsigned DEFAULT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + `isStub` tinyint(1) NOT NULL, + `utcInitialEpoch` int(10) unsigned NOT NULL, + `utcUntilEpoch` int(10) unsigned DEFAULT NULL, + `utcInstanceEpoch` int(10) unsigned DEFAULT NULL, + `parameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `importAuthorPHID` varbinary(64) DEFAULT NULL, + `importSourcePHID` varbinary(64) DEFAULT NULL, + `importUIDIndex` binary(12) DEFAULT NULL, + `importUID` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `seriesParentPHID` varbinary(64) DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `taskPHID` (`taskPHID`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_instance` (`instanceOfEventPHID`,`sequenceIndex`), + UNIQUE KEY `key_rdate` (`instanceOfEventPHID`,`utcInstanceEpoch`), + KEY `key_epoch` (`utcInitialEpoch`,`utcUntilEpoch`), + KEY `key_series` (`seriesParentPHID`,`utcInitialEpoch`), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_calendar`; -CREATE TABLE `maniphest_taskproject` ( - `taskPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `projectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`projectPHID`,`taskPHID`), - UNIQUE KEY `taskPHID` (`taskPHID`,`projectPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `maniphest_tasksubscriber` ( - `taskPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `subscriberPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`subscriberPHID`,`taskPHID`), - UNIQUE KEY `taskPHID` (`taskPHID`,`subscriberPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `calendar_event_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_calendar`; -CREATE TABLE `maniphest_touch` ( - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `taskID` int(10) unsigned NOT NULL, - `touchedAt` int(10) unsigned NOT NULL, - PRIMARY KEY (`userPHID`,`taskID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `maniphest_transaction` ( +CREATE TABLE `calendar_event_ffield` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `taskID` int(10) unsigned NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `transactionType` varchar(16) NOT NULL, - `oldValue` longtext CHARACTER SET utf8 COLLATE utf8_bin, - `newValue` longtext CHARACTER SET utf8 COLLATE utf8_bin, - `comments` longtext CHARACTER SET utf8 COLLATE utf8_bin, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - `metadata` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `contentSource` varchar(255) DEFAULT NULL, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, PRIMARY KEY (`id`), - KEY `taskID` (`taskID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_calendar`; -CREATE DATABASE `{$NAMESPACE}_meta_data` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_meta_data`; + SET NAMES utf8 ; -CREATE TABLE `patch_status` ( - `patch` varchar(255) NOT NULL, - `applied` int(10) unsigned NOT NULL, - PRIMARY KEY (`patch`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -INSERT INTO `patch_status` (`patch`, `applied`) VALUES -('phabricator:000.project.sql', 1), -('phabricator:0000.legacy.sql', 1), -('phabricator:001.maniphest_projects.sql', 1), -('phabricator:002.oauth.sql', 1), -('phabricator:003.more_oauth.sql', 1), -('phabricator:004.daemonrepos.sql', 1), -('phabricator:005.workers.sql', 1), -('phabricator:006.repository.sql', 1), -('phabricator:007.daemonlog.sql', 1), -('phabricator:008.repoopt.sql', 1), -('phabricator:009.repo_summary.sql', 1), -('phabricator:010.herald.sql', 1), -('phabricator:011.badcommit.sql', 1), -('phabricator:012.dropphidtype.sql', 1), -('phabricator:013.commitdetail.sql', 1), -('phabricator:014.shortcuts.sql', 1), -('phabricator:015.preferences.sql', 1), -('phabricator:016.userrealnameindex.sql', 1), -('phabricator:017.sessionkeys.sql', 1), -('phabricator:018.owners.sql', 1), -('phabricator:019.arcprojects.sql', 1), -('phabricator:020.pathcapital.sql', 1), -('phabricator:021.xhpastview.sql', 1), -('phabricator:022.differentialcommit.sql', 1), -('phabricator:023.dxkeys.sql', 1), -('phabricator:024.mlistkeys.sql', 1), -('phabricator:025.commentopt.sql', 1), -('phabricator:026.diffpropkey.sql', 1), -('phabricator:027.metamtakeys.sql', 1), -('phabricator:028.systemagent.sql', 1), -('phabricator:029.cursors.sql', 1), -('phabricator:030.imagemacro.sql', 1), -('phabricator:031.workerrace.sql', 1), -('phabricator:032.viewtime.sql', 1), -('phabricator:033.privtest.sql', 1), -('phabricator:034.savedheader.sql', 1), -('phabricator:035.proxyimage.sql', 1), -('phabricator:036.mailkey.sql', 1), -('phabricator:037.setuptest.sql', 1), -('phabricator:038.admin.sql', 1), -('phabricator:039.userlog.sql', 1), -('phabricator:040.transform.sql', 1), -('phabricator:041.heraldrepetition.sql', 1), -('phabricator:042.commentmetadata.sql', 1), -('phabricator:043.pastebin.sql', 1), -('phabricator:044.countdown.sql', 1), -('phabricator:045.timezone.sql', 1), -('phabricator:046.conduittoken.sql', 1), -('phabricator:047.projectstatus.sql', 1), -('phabricator:048.relationshipkeys.sql', 1), -('phabricator:049.projectowner.sql', 1), -('phabricator:050.taskdenormal.sql', 1), -('phabricator:051.projectfilter.sql', 1), -('phabricator:052.pastelanguage.sql', 1), -('phabricator:053.feed.sql', 1), -('phabricator:054.subscribers.sql', 1), -('phabricator:055.add_author_to_files.sql', 1), -('phabricator:056.slowvote.sql', 1), -('phabricator:057.parsecache.sql', 1), -('phabricator:058.missingkeys.sql', 1), -('phabricator:059.engines.php', 1), -('phabricator:060.phriction.sql', 1), -('phabricator:061.phrictioncontent.sql', 1), -('phabricator:062.phrictionmenu.sql', 1), -('phabricator:063.pasteforks.sql', 1), -('phabricator:064.subprojects.sql', 1), -('phabricator:065.sshkeys.sql', 1), -('phabricator:066.phrictioncontent.sql', 1), -('phabricator:067.preferences.sql', 1), -('phabricator:068.maniphestauxiliarystorage.sql', 1), -('phabricator:069.heraldxscript.sql', 1), -('phabricator:070.differentialaux.sql', 1), -('phabricator:071.contentsource.sql', 1), -('phabricator:072.blamerevert.sql', 1), -('phabricator:073.reposymbols.sql', 1), -('phabricator:074.affectedpath.sql', 1), -('phabricator:075.revisionhash.sql', 1), -('phabricator:076.indexedlanguages.sql', 1), -('phabricator:077.originalemail.sql', 1), -('phabricator:078.nametoken.sql', 1), -('phabricator:079.nametokenindex.php', 1), -('phabricator:080.filekeys.sql', 1), -('phabricator:081.filekeys.php', 1), -('phabricator:082.xactionkey.sql', 1), -('phabricator:083.dxviewtime.sql', 1), -('phabricator:084.pasteauthorkey.sql', 1), -('phabricator:085.packagecommitrelationship.sql', 1), -('phabricator:086.formeraffil.sql', 1), -('phabricator:087.phrictiondelete.sql', 1), -('phabricator:088.audit.sql', 1), -('phabricator:089.projectwiki.sql', 1), -('phabricator:090.forceuniqueprojectnames.php', 1), -('phabricator:091.uniqueslugkey.sql', 1), -('phabricator:092.dropgithubnotification.sql', 1), -('phabricator:093.gitremotes.php', 1), -('phabricator:094.phrictioncolumn.sql', 1), -('phabricator:095.directory.sql', 1), -('phabricator:096.filename.sql', 1), -('phabricator:097.heraldruletypes.sql', 1), -('phabricator:098.heraldruletypemigration.php', 1), -('phabricator:099.drydock.sql', 1), -('phabricator:100.projectxaction.sql', 1), -('phabricator:101.heraldruleapplied.sql', 1), -('phabricator:102.heraldcleanup.php', 1), -('phabricator:103.heraldedithistory.sql', 1), -('phabricator:104.searchkey.sql', 1), -('phabricator:105.mimetype.sql', 1), -('phabricator:106.chatlog.sql', 1), -('phabricator:107.oauthserver.sql', 1), -('phabricator:108.oauthscope.sql', 1), -('phabricator:109.oauthclientphidkey.sql', 1), -('phabricator:110.commitaudit.sql', 1), -('phabricator:111.commitauditmigration.php', 1), -('phabricator:112.oauthaccesscoderedirecturi.sql', 1), -('phabricator:113.lastreviewer.sql', 1), -('phabricator:114.auditrequest.sql', 1), -('phabricator:115.prepareutf8.sql', 1), -('phabricator:116.utf8-backup-first-expect-wait.sql', 1), -('phabricator:117.repositorydescription.php', 1), -('phabricator:118.auditinline.sql', 1), -('phabricator:119.filehash.sql', 1), -('phabricator:120.noop.sql', 1), -('phabricator:121.drydocklog.sql', 1), -('phabricator:122.flag.sql', 1), -('phabricator:123.heraldrulelog.sql', 1), -('phabricator:124.subpriority.sql', 1), -('phabricator:125.ipv6.sql', 1), -('phabricator:126.edges.sql', 1), -('phabricator:127.userkeybody.sql', 1), -('phabricator:128.phabricatorcom.sql', 1), -('phabricator:129.savedquery.sql', 1), -('phabricator:130.denormalrevisionquery.sql', 1), -('phabricator:131.migraterevisionquery.php', 1), -('phabricator:132.phame.sql', 1), -('phabricator:133.imagemacro.sql', 1), -('phabricator:134.emptysearch.sql', 1), -('phabricator:135.datecommitted.sql', 1), -('phabricator:136.sex.sql', 1), -('phabricator:137.auditmetadata.sql', 1), -('phabricator:138.notification.sql', 1358377808), -('phabricator:20121209.pholioxactions.sql', 1358377847), -('phabricator:20121209.xmacroadd.sql', 1358377849), -('phabricator:20121209.xmacromigrate.php', 1358377849), -('phabricator:20121209.xmacromigratekey.sql', 1358377850), -('phabricator:20121220.generalcache.sql', 1358377851), -('phabricator:20121226.config.sql', 1358377852), -('phabricator:20130101.confxaction.sql', 1358377853), -('phabricator:20130102.metamtareceivedmailmessageidhash.sql', 1358377854), -('phabricator:20130103.filemetadata.sql', 1358377855), -('phabricator:daemonstatus.sql', 1358377823), -('phabricator:daemonstatuskey.sql', 1358377828), -('phabricator:daemontaskarchive.sql', 1358377838), -('phabricator:db.audit', 1), -('phabricator:db.cache', 1358377804), -('phabricator:db.calendar', 1358377802), -('phabricator:db.chatlog', 1), -('phabricator:db.conduit', 1), -('phabricator:db.config', 1358377852), -('phabricator:db.countdown', 1), -('phabricator:db.daemon', 1), -('phabricator:db.differential', 1), -('phabricator:db.draft', 1), -('phabricator:db.drydock', 1), -('phabricator:db.fact', 1358377804), -('phabricator:db.feed', 1), -('phabricator:db.file', 1), -('phabricator:db.flag', 1), -('phabricator:db.harbormaster', 1358377803), -('phabricator:db.herald', 1), -('phabricator:db.maniphest', 1), -('phabricator:db.metamta', 1), -('phabricator:db.meta_data', 1), -('phabricator:db.oauth_server', 1), -('phabricator:db.owners', 1), -('phabricator:db.pastebin', 1), -('phabricator:db.phame', 1), -('phabricator:db.phid', 1), -('phabricator:db.pholio', 1358377807), -('phabricator:db.phriction', 1), -('phabricator:db.ponder', 1358377805), -('phabricator:db.project', 1), -('phabricator:db.repository', 1), -('phabricator:db.search', 1), -('phabricator:db.slowvote', 1), -('phabricator:db.timeline', 1), -('phabricator:db.user', 1), -('phabricator:db.worker', 1), -('phabricator:db.xhpastview', 1), -('phabricator:db.xhprof', 1358377806), -('phabricator:differentialbookmarks.sql', 1358377817), -('phabricator:draft-metadata.sql', 1358377832), -('phabricator:dropfileproxyimage.sql', 1358377843), -('phabricator:drydockresoucetype.sql', 1358377840), -('phabricator:drydocktaskid.sql', 1358377839), -('phabricator:edgetype.sql', 1358377829), -('phabricator:emailtable.sql', 1358377810), -('phabricator:emailtableport.sql', 1358377811), -('phabricator:emailtableremove.sql', 1358377811), -('phabricator:fact-raw.sql', 1358377825), -('phabricator:harbormasterobject.sql', 1358377817), -('phabricator:holidays.sql', 1358377808), -('phabricator:ldapinfo.sql', 1358377814), -('phabricator:liskcounters-task.sql', 1358377844), -('phabricator:liskcounters.php', 1358377842), -('phabricator:liskcounters.sql', 1358377841), -('phabricator:maniphestxcache.sql', 1358377819), -('phabricator:markupcache.sql', 1358377818), -('phabricator:migrate-differential-dependencies.php', 1358377820), -('phabricator:migrate-maniphest-dependencies.php', 1358377820), -('phabricator:migrate-maniphest-revisions.php', 1358377822), -('phabricator:migrate-project-edges.php', 1358377824), -('phabricator:owners-exclude.sql', 1358377846), -('phabricator:pastepolicy.sql', 1358377831), -('phabricator:phameblog.sql', 1358377821), -('phabricator:phamedomain.sql', 1358377833), -('phabricator:phameoneblog.sql', 1358377837), -('phabricator:phamepolicy.sql', 1358377836), -('phabricator:phiddrop.sql', 1358377812), -('phabricator:pholio.sql', 1358377846), -('phabricator:policy-project.sql', 1358377827), -('phabricator:ponder-comments.sql', 1358377830), -('phabricator:ponder-mailkey-populate.php', 1358377835), -('phabricator:ponder-mailkey.sql', 1358377834), -('phabricator:ponder.sql', 1358377826), -('phabricator:repository-lint.sql', 1358377843), -('phabricator:statustxt.sql', 1358377837), -('phabricator:symbolcontexts.sql', 1358377823), -('phabricator:testdatabase.sql', 1358377813), -('phabricator:threadtopic.sql', 1358377815), -('phabricator:userstatus.sql', 1358377809), -('phabricator:usertranslation.sql', 1358377816), -('phabricator:xhprof.sql', 1358377832); - -CREATE DATABASE `{$NAMESPACE}_metamta` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_metamta`; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `edge` ( - `src` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `type` int(10) unsigned NOT NULL, - `dst` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `seq` int(10) unsigned NOT NULL, - `dataID` int(10) unsigned DEFAULT NULL, - PRIMARY KEY (`src`,`type`,`dst`), - KEY `src` (`src`,`type`,`dateCreated`,`seq`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `calendar_event_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_calendar`; -CREATE TABLE `edgedata` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `metamta_mail` ( +CREATE TABLE `calendar_event_fngrams_common` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `parameters` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `status` varchar(255) NOT NULL, - `message` text, - `retryCount` int(10) unsigned NOT NULL, - `nextRetry` int(10) unsigned NOT NULL, - `relatedPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, PRIMARY KEY (`id`), - KEY `status` (`status`,`nextRetry`), - KEY `relatedPHID` (`relatedPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_calendar`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `metamta_mailinglist` ( +CREATE TABLE `calendar_eventinvitee` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(255) NOT NULL, - `email` varchar(255) NOT NULL, - `uri` varchar(255) DEFAULT NULL, + `eventPHID` varbinary(64) NOT NULL, + `inviteePHID` varbinary(64) NOT NULL, + `inviterPHID` varbinary(64) NOT NULL, + `status` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `availability` varchar(64) COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - UNIQUE KEY `email` (`email`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_event` (`eventPHID`,`inviteePHID`), + KEY `key_invitee` (`inviteePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_calendar`; -CREATE TABLE `metamta_receivedmail` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `calendar_eventtransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `headers` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `bodies` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `attachments` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `relatedPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `message` longtext CHARACTER SET utf8 COLLATE utf8_bin, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `messageIDHash` char(12) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, PRIMARY KEY (`id`), - KEY `relatedPHID` (`relatedPHID`), - KEY `authorPHID` (`authorPHID`), - KEY `key_messageIDHash` (`messageIDHash`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_calendar`; + SET NAMES utf8 ; -CREATE DATABASE `{$NAMESPACE}_oauth_server` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_oauth_server`; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `oauth_server_oauthclientauthorization` ( +CREATE TABLE `calendar_eventtransaction_comment` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `clientPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `scope` text NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - UNIQUE KEY `userPHID` (`userPHID`,`clientPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_calendar`; + SET NAMES utf8 ; -CREATE TABLE `oauth_server_oauthserveraccesstoken` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `calendar_export` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `token` varchar(32) NOT NULL, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `clientPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `name` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `policyMode` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `queryKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `secretKey` binary(20) NOT NULL, + `isDisabled` tinyint(1) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `token` (`token`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_secret` (`secretKey`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_author` (`authorPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_calendar`; -CREATE TABLE `oauth_server_oauthserverauthorizationcode` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `calendar_exporttransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `code` varchar(32) NOT NULL, - `clientPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `clientSecret` varchar(32) NOT NULL, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `redirectURI` varchar(255) NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `code` (`code`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_calendar`; -CREATE TABLE `oauth_server_oauthserverclient` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `calendar_externalinvitee` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(255) NOT NULL, - `secret` varchar(32) NOT NULL, - `redirectURI` varchar(255) NOT NULL, - `creatorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `name` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `nameIndex` binary(12) NOT NULL, + `uri` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `parameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `sourcePHID` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - KEY `creatorPHID` (`creatorPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_name` (`nameIndex`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_calendar`; -CREATE DATABASE `{$NAMESPACE}_owners` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_owners`; + SET NAMES utf8 ; -CREATE TABLE `owners_owner` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `calendar_import` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `packageID` int(10) unsigned NOT NULL, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `name` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `engineType` varchar(64) COLLATE {$COLLATE_TEXT} NOT NULL, + `parameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDisabled` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `triggerPHID` varbinary(64) DEFAULT NULL, + `triggerFrequency` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `packageID` (`packageID`,`userPHID`), - KEY `userPHID` (`userPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_author` (`authorPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_calendar`; -CREATE TABLE `owners_package` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(255) NOT NULL, - `originalName` varchar(255) NOT NULL, - `description` text NOT NULL, - `primaryOwnerPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `auditingEnabled` tinyint(1) NOT NULL DEFAULT '0', - PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `owners_path` ( +CREATE TABLE `calendar_importlog` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `packageID` int(10) unsigned NOT NULL, - `repositoryPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `path` varchar(255) NOT NULL, - `excluded` tinyint(1) NOT NULL DEFAULT '0', + `importPHID` varbinary(64) NOT NULL, + `parameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - KEY `packageID` (`packageID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_import` (`importPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_calendar`; -CREATE DATABASE `{$NAMESPACE}_pastebin` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_pastebin`; + SET NAMES utf8 ; -CREATE TABLE `pastebin_paste` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `calendar_importtransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `title` varchar(255) NOT NULL, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `filePHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `language` varchar(64) NOT NULL, - `parentPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `viewPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`), - KEY `parentPHID` (`parentPHID`), - KEY `authorPHID` (`authorPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_calendar`; + SET NAMES utf8 ; -CREATE DATABASE `{$NAMESPACE}_phame` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_phame`; + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `calendar_notification` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `eventPHID` varbinary(64) NOT NULL, + `utcInitialEpoch` int(10) unsigned NOT NULL, + `targetPHID` varbinary(64) NOT NULL, + `didNotifyEpoch` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_notify` (`eventPHID`,`utcInitialEpoch`,`targetPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_calendar`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `edge` ( - `src` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `src` varbinary(64) NOT NULL, `type` int(10) unsigned NOT NULL, - `dst` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `dst` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `seq` int(10) unsigned NOT NULL, `dataID` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), KEY `src` (`src`,`type`,`dateCreated`,`seq`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_calendar`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; CREATE TABLE `edgedata` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_chatlog` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE TABLE `phame_blog` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `description` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `domain` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `configData` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `creatorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - `viewPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `editPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `joinPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - UNIQUE KEY `domain` (`domain`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +USE `{$NAMESPACE}_chatlog`; + SET NAMES utf8 ; -CREATE TABLE `phame_post` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `chatlog_channel` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `bloggerPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `title` varchar(255) NOT NULL, - `phameTitle` varchar(64) NOT NULL, - `body` longtext, - `visibility` int(10) unsigned NOT NULL DEFAULT '0', - `configData` longtext, - `datePublished` int(10) unsigned NOT NULL, + `serviceName` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `serviceType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `channelName` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `blogPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - UNIQUE KEY `phameTitle` (`bloggerPHID`,`phameTitle`), - KEY `bloggerPosts` (`bloggerPHID`,`visibility`,`datePublished`,`id`), - KEY `instancePosts` (`visibility`,`datePublished`,`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - + UNIQUE KEY `key_channel` (`channelName`,`serviceType`,`serviceName`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; -CREATE DATABASE `{$NAMESPACE}_pholio` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_pholio`; +USE `{$NAMESPACE}_chatlog`; -CREATE TABLE `edge` ( - `src` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `type` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `dst` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `seq` int(10) unsigned NOT NULL, - `dataID` int(10) unsigned DEFAULT NULL, - PRIMARY KEY (`src`,`type`,`dst`), - KEY `src` (`src`,`type`,`dateCreated`,`seq`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `edgedata` ( +CREATE TABLE `chatlog_event` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + `epoch` int(10) unsigned NOT NULL, + `author` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `type` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `message` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `loggedByPHID` varbinary(64) NOT NULL, + `channelID` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `channel` (`epoch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_conduit` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE TABLE `pholio_image` ( +USE `{$NAMESPACE}_conduit`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `conduit_certificatetoken` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `mockID` int(10) unsigned NOT NULL, - `filePHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(128) NOT NULL, - `description` longtext NOT NULL, - `sequence` int(10) unsigned NOT NULL, + `userPHID` varbinary(64) NOT NULL, + `token` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - KEY `mockID` (`mockID`,`sequence`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `userPHID` (`userPHID`), + UNIQUE KEY `token` (`token`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_conduit`; -CREATE TABLE `pholio_mock` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(128) NOT NULL, - `originalName` varchar(128) NOT NULL, - `description` longtext NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `viewPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `coverPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `mailKey` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `conduit_methodcalllog` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `connectionID` bigint(20) unsigned DEFAULT NULL, + `method` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `error` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `duration` bigint(20) unsigned NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `callerPHID` varbinary(64) DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - KEY `authorPHID` (`authorPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_method` (`method`), + KEY `key_callermethod` (`callerPHID`,`method`), + KEY `key_date` (`dateCreated`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_conduit`; + SET NAMES utf8 ; -CREATE TABLE `pholio_transaction` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `conduit_token` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `objectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `viewPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `editPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `commentPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `commentVersion` int(10) unsigned NOT NULL, - `transactionType` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `oldValue` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `newValue` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `contentSource` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `tokenType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `token` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `expires` int(10) unsigned DEFAULT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `key_phid` (`phid`), - KEY `key_object` (`objectPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_token` (`token`), + KEY `key_object` (`objectPHID`,`tokenType`), + KEY `key_expires` (`expires`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_config` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE TABLE `pholio_transaction_comment` ( +USE `{$NAMESPACE}_config`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `config_entry` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `transactionPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `viewPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `editPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `commentVersion` int(10) unsigned NOT NULL, - `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `contentSource` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `namespace` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `configKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `value` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `isDeleted` tinyint(1) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `mockID` int(10) unsigned DEFAULT NULL, - `imageID` int(10) unsigned DEFAULT NULL, - `x` int(10) unsigned DEFAULT NULL, - `y` int(10) unsigned DEFAULT NULL, - `width` int(10) unsigned DEFAULT NULL, - `height` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `key_phid` (`phid`), - UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`), - UNIQUE KEY `key_draft` (`authorPHID`,`mockID`,`transactionPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_name` (`namespace`,`configKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_config`; -CREATE DATABASE `{$NAMESPACE}_phriction` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_phriction`; + SET NAMES utf8 ; -CREATE TABLE `phriction_content` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `config_manualactivity` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `documentID` int(10) unsigned NOT NULL, - `version` int(10) unsigned NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `title` varchar(512) NOT NULL, - `slug` varchar(512) NOT NULL, - `content` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `activityType` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `parameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_type` (`activityType`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_config`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `config_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `description` varchar(512) DEFAULT NULL, - `changeType` int(10) unsigned NOT NULL DEFAULT '0', - `changeRef` int(10) unsigned DEFAULT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `documentID` (`documentID`,`version`), - KEY `authorPHID` (`authorPHID`), - KEY `slug` (`slug`(255)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_conpherence` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE TABLE `phriction_document` ( +USE `{$NAMESPACE}_conpherence`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `conpherence_index` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `slug` varchar(128) NOT NULL, - `depth` int(10) unsigned NOT NULL, - `contentID` int(10) unsigned DEFAULT NULL, - `status` int(10) unsigned NOT NULL DEFAULT '0', + `threadPHID` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) NOT NULL, + `previousTransactionPHID` varbinary(64) DEFAULT NULL, + `corpus` longtext CHARACTER SET {$CHARSET_FULLTEXT} COLLATE {$COLLATE_FULLTEXT} NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - UNIQUE KEY `slug` (`slug`), - UNIQUE KEY `depth` (`depth`,`slug`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_transaction` (`transactionPHID`), + UNIQUE KEY `key_previous` (`previousTransactionPHID`), + KEY `key_thread` (`threadPHID`), + FULLTEXT KEY `key_corpus` (`corpus`) +) ENGINE=MyISAM DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_conpherence`; -CREATE DATABASE `{$NAMESPACE}_ponder` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_ponder`; + SET NAMES utf8 ; -CREATE TABLE `edge` ( - `src` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `type` int(10) unsigned NOT NULL, - `dst` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `conpherence_participant` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `participantPHID` varbinary(64) NOT NULL, + `conpherencePHID` varbinary(64) NOT NULL, + `seenMessageCount` bigint(20) unsigned NOT NULL, + `settings` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, - `seq` int(10) unsigned NOT NULL, - `dataID` int(10) unsigned DEFAULT NULL, - PRIMARY KEY (`src`,`type`,`dst`), - KEY `src` (`src`,`type`,`dateCreated`,`seq`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `conpherencePHID` (`conpherencePHID`,`participantPHID`), + KEY `key_thread` (`participantPHID`,`conpherencePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_conpherence`; -CREATE TABLE `edgedata` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `ponder_answer` ( +CREATE TABLE `conpherence_thread` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `questionID` int(10) unsigned NOT NULL, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `voteCount` int(10) NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `content` longtext NOT NULL, + `phid` varbinary(64) NOT NULL, + `title` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `messageCount` bigint(20) unsigned NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `joinPolicy` varbinary(64) NOT NULL, + `mailKey` varchar(20) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `contentSource` varchar(255) DEFAULT NULL, + `topic` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `profileImagePHID` varbinary(64) DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - KEY `questionID` (`questionID`), - KEY `authorPHID` (`authorPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_conpherence`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `conpherence_threadtitle_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_conpherence`; -CREATE TABLE `ponder_comment` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `conpherence_transaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `targetPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `content` longtext NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - KEY `authorPHID` (`authorPHID`), - KEY `targetPHID` (`targetPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_conpherence`; -CREATE TABLE `ponder_question` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `conpherence_transaction_comment` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `title` varchar(255) NOT NULL, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `voteCount` int(10) NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `content` longtext NOT NULL, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `contentSource` varchar(255) DEFAULT NULL, - `heat` float NOT NULL, - `answerCount` int(10) unsigned NOT NULL, - `mailKey` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `conpherencePHID` varbinary(64) DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - KEY `authorPHID` (`authorPHID`), - KEY `heat` (`heat`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=11; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`), + UNIQUE KEY `key_draft` (`authorPHID`,`conpherencePHID`,`transactionPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_conpherence`; -CREATE DATABASE `{$NAMESPACE}_project` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_project`; + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `edge` ( - `src` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `src` varbinary(64) NOT NULL, `type` int(10) unsigned NOT NULL, - `dst` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `dst` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `seq` int(10) unsigned NOT NULL, `dataID` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), KEY `src` (`src`,`type`,`dateCreated`,`seq`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_conpherence`; + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `edgedata` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_countdown` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE TABLE `project` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) NOT NULL, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - `status` varchar(32) NOT NULL, - `subprojectPHIDs` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `phrictionSlug` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `viewPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `editPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `joinPolicy` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `name` (`name`), - UNIQUE KEY `phid` (`phid`), - UNIQUE KEY `phrictionSlug` (`phrictionSlug`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +USE `{$NAMESPACE}_countdown`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `project_affiliation` ( +CREATE TABLE `countdown` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `projectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `role` varchar(255) NOT NULL, + `phid` varbinary(64) NOT NULL, + `title` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `epoch` int(10) unsigned NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `isOwner` tinyint(1) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + `editPolicy` varbinary(64) NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `mailKey` binary(20) NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `projectPHID` (`projectPHID`,`userPHID`), - KEY `userPHID` (`userPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_epoch` (`epoch`), + KEY `key_author` (`authorPHID`,`epoch`), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_countdown`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `project_profile` ( +CREATE TABLE `countdown_transaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `projectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `blurb` longtext NOT NULL, - `profileImagePHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `projectPHID` (`projectPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_countdown`; -CREATE TABLE `project_subproject` ( - `projectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `subprojectPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`subprojectPHID`,`projectPHID`), - UNIQUE KEY `projectPHID` (`projectPHID`,`subprojectPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `project_transaction` ( +CREATE TABLE `countdown_transaction_comment` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `projectID` int(10) unsigned NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `transactionType` varchar(32) NOT NULL, - `oldValue` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `newValue` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - KEY `projectID` (`projectID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_countdown`; + SET NAMES utf8 ; -CREATE DATABASE `{$NAMESPACE}_repository` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_repository`; + SET character_set_client = {$CHARSET} ; CREATE TABLE `edge` ( - `src` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `src` varbinary(64) NOT NULL, `type` int(10) unsigned NOT NULL, - `dst` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `dst` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `seq` int(10) unsigned NOT NULL, `dataID` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), KEY `src` (`src`,`type`,`dateCreated`,`seq`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_countdown`; + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `edgedata` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_daemon` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE TABLE `repository` ( +USE `{$NAMESPACE}_daemon`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `daemon_locklog` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(255) NOT NULL, - `callsign` varchar(32) NOT NULL, - `versionControlSystem` varchar(32) NOT NULL, - `details` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `lockName` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `lockReleased` int(10) unsigned DEFAULT NULL, + `lockParameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `lockContext` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `uuid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `callsign` (`callsign`), - UNIQUE KEY `phid` (`phid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_lock` (`lockName`), + KEY `key_created` (`dateCreated`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_daemon`; + + SET NAMES utf8 ; -CREATE TABLE `repository_arcanistproject` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `daemon_log` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(255) NOT NULL, - `repositoryID` int(10) unsigned DEFAULT NULL, - `symbolIndexLanguages` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `symbolIndexProjects` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `daemon` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `host` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `pid` int(10) unsigned NOT NULL, + `argv` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `explicitArgv` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `status` varchar(8) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `runningAsUser` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `daemonID` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - UNIQUE KEY `name` (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_daemonID` (`daemonID`), + KEY `status` (`status`), + KEY `key_modified` (`dateModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_daemon`; -CREATE TABLE `repository_auditrequest` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `daemon_logevent` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `auditorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `commitPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `auditStatus` varchar(64) NOT NULL, - `auditReasons` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `logID` int(10) unsigned NOT NULL, + `logType` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `message` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `epoch` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - KEY `commitPHID` (`commitPHID`), - KEY `auditorPHID` (`auditorPHID`,`auditStatus`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `logID` (`logID`,`epoch`), + KEY `key_epoch` (`epoch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_dashboard` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE TABLE `repository_badcommit` ( - `fullCommitName` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `description` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`fullCommitName`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +USE `{$NAMESPACE}_dashboard`; + SET NAMES utf8 ; -CREATE TABLE `repository_branch` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `repositoryID` int(10) unsigned NOT NULL, - `name` varchar(255) NOT NULL, - `lintCommit` varchar(40) DEFAULT NULL, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `layoutConfig` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `icon` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `repositoryID` (`repositoryID`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_dashboard`; -CREATE TABLE `repository_commit` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_dashboard_fdocument` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `repositoryID` int(10) unsigned NOT NULL, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `commitIdentifier` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `epoch` int(10) unsigned NOT NULL, - `mailKey` varchar(20) NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `auditStatus` int(10) unsigned NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`), - UNIQUE KEY `repositoryID` (`repositoryID`,`commitIdentifier`(16)), - KEY `repositoryID_2` (`repositoryID`,`epoch`), - KEY `authorPHID` (`authorPHID`,`auditStatus`,`epoch`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_dashboard`; -CREATE TABLE `repository_commitdata` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_dashboard_ffield` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `commitID` int(10) unsigned NOT NULL, - `authorName` varchar(255) NOT NULL, - `commitMessage` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `commitDetails` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `commitID` (`commitID`), - KEY `authorName` (`authorName`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_dashboard`; -CREATE TABLE `repository_filesystem` ( - `repositoryID` int(10) unsigned NOT NULL, - `parentID` int(10) unsigned NOT NULL, - `svnCommit` int(10) unsigned NOT NULL, - `pathID` int(10) unsigned NOT NULL, - `existed` tinyint(1) NOT NULL, - `fileType` int(10) unsigned NOT NULL, - PRIMARY KEY (`repositoryID`,`parentID`,`pathID`,`svnCommit`), - KEY `repositoryID` (`repositoryID`,`svnCommit`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `repository_lintmessage` ( +CREATE TABLE `dashboard_dashboard_fngrams` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `branchID` int(10) unsigned NOT NULL, - `path` varchar(512) NOT NULL, - `line` int(10) unsigned NOT NULL, - `code` varchar(32) NOT NULL, - `severity` varchar(16) NOT NULL, - `name` varchar(255) NOT NULL, - `description` text NOT NULL, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), - KEY `branchID` (`branchID`,`path`(64)), - KEY `branchID_2` (`branchID`,`code`,`path`(64)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_dashboard`; -CREATE TABLE `repository_path` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_dashboard_fngrams_common` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `path` varchar(512) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `pathHash` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `pathHash` (`pathHash`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_dashboard`; -CREATE TABLE `repository_pathchange` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_panel` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `panelType` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `isArchived` tinyint(1) NOT NULL DEFAULT '0', + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_panel_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_panel_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_panel_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_panel_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_paneltransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_portal` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_portal_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_portal_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_portal_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_portal_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_portaltransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `dashboard_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_dashboard`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_differential` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_affectedpath` ( `repositoryID` int(10) unsigned NOT NULL, `pathID` int(10) unsigned NOT NULL, - `commitID` int(10) unsigned NOT NULL, - `targetPathID` int(10) unsigned DEFAULT NULL, - `targetCommitID` int(10) unsigned DEFAULT NULL, + `epoch` int(10) unsigned NOT NULL, + `revisionID` int(10) unsigned NOT NULL, + KEY `repositoryID` (`repositoryID`,`pathID`,`epoch`), + KEY `revisionID` (`revisionID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_changeset` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `diffID` int(10) unsigned NOT NULL, + `oldFile` longblob, + `filename` longblob NOT NULL, + `awayPaths` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, `changeType` int(10) unsigned NOT NULL, `fileType` int(10) unsigned NOT NULL, - `isDirect` tinyint(1) NOT NULL, - `commitSequence` int(10) unsigned NOT NULL, - PRIMARY KEY (`commitID`,`pathID`), - KEY `repositoryID` (`repositoryID`,`pathID`,`commitSequence`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `oldProperties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `newProperties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `addLines` int(10) unsigned NOT NULL, + `delLines` int(10) unsigned NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `diffID` (`diffID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_changeset_parse_cache` ( + `id` int(10) unsigned NOT NULL, + `cache` longblob NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `dateCreated` (`dateCreated`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_commit` ( + `revisionID` int(10) unsigned NOT NULL, + `commitPHID` varbinary(64) NOT NULL, + PRIMARY KEY (`revisionID`,`commitPHID`), + UNIQUE KEY `commitPHID` (`commitPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + SET NAMES utf8 ; -CREATE TABLE `repository_shortcut` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_customfieldnumericindex` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(255) NOT NULL, - `href` varchar(255) NOT NULL, - `description` varchar(255) NOT NULL, - `sequence` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + `objectPHID` varbinary(64) NOT NULL, + `indexKey` binary(12) NOT NULL, + `indexValue` bigint(20) NOT NULL, + PRIMARY KEY (`id`), + KEY `key_join` (`objectPHID`,`indexKey`,`indexValue`), + KEY `key_find` (`indexKey`,`indexValue`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_differential`; -CREATE TABLE `repository_summary` ( - `repositoryID` int(10) unsigned NOT NULL, - `size` int(10) unsigned NOT NULL, - `lastCommitID` int(10) unsigned NOT NULL, - `epoch` int(10) unsigned DEFAULT NULL, - PRIMARY KEY (`repositoryID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `repository_symbol` ( - `arcanistProjectID` int(10) unsigned NOT NULL, - `symbolContext` varchar(128) NOT NULL DEFAULT '', - `symbolName` varchar(128) NOT NULL, - `symbolType` varchar(12) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `symbolLanguage` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `pathID` int(10) unsigned NOT NULL, - `lineNumber` int(10) unsigned NOT NULL, - KEY `symbolName` (`symbolName`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE `differential_customfieldstorage` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `fieldIndex` binary(12) NOT NULL, + `fieldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `objectPHID` (`objectPHID`,`fieldIndex`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_differential`; -CREATE DATABASE `{$NAMESPACE}_search` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_search`; + SET NAMES utf8 ; -CREATE TABLE `search_document` ( - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `documentType` varchar(4) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `documentTitle` varchar(255) NOT NULL, - `documentCreated` int(10) unsigned NOT NULL, - `documentModified` int(10) unsigned NOT NULL, - PRIMARY KEY (`phid`), - KEY `documentCreated` (`documentCreated`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET character_set_client = {$CHARSET} ; +CREATE TABLE `differential_customfieldstringindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `indexKey` binary(12) NOT NULL, + `indexValue` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_join` (`objectPHID`,`indexKey`,`indexValue`(64)), + KEY `key_find` (`indexKey`,`indexValue`(64)) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; -CREATE TABLE `search_documentfield` ( - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `phidType` varchar(4) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `field` varchar(4) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `auxPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `corpus` text, - KEY `phid` (`phid`), - FULLTEXT KEY `corpus` (`corpus`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; +USE `{$NAMESPACE}_differential`; + SET NAMES utf8 ; -CREATE TABLE `search_documentrelationship` ( - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `relatedPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `relation` varchar(4) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `relatedType` varchar(4) NOT NULL, - `relatedTime` int(10) unsigned NOT NULL, - KEY `phid` (`phid`), - KEY `relatedPHID` (`relatedPHID`,`relation`), - KEY `relation` (`relation`,`relatedPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_diff` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `revisionID` int(10) unsigned DEFAULT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `repositoryPHID` varbinary(64) DEFAULT NULL, + `sourceMachine` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `sourcePath` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `sourceControlSystem` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `sourceControlBaseRevision` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `sourceControlPath` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `lintStatus` int(10) unsigned NOT NULL, + `unitStatus` int(10) unsigned NOT NULL, + `lineCount` int(10) unsigned NOT NULL, + `branch` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `bookmark` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `creationMethod` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `description` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `repositoryUUID` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `commitPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `revisionID` (`revisionID`), + KEY `key_commit` (`commitPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_diffproperty` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `diffID` int(10) unsigned NOT NULL, + `name` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `diffID` (`diffID`,`name`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_difftransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_hiddencomment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `userPHID` varbinary(64) NOT NULL, + `commentID` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_user` (`userPHID`,`commentID`), + KEY `key_comment` (`commentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_hunk` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `changesetID` int(10) unsigned NOT NULL, + `oldOffset` int(10) unsigned NOT NULL, + `oldLen` int(10) unsigned NOT NULL, + `newOffset` int(10) unsigned NOT NULL, + `newLen` int(10) unsigned NOT NULL, + `dataType` binary(4) NOT NULL, + `dataEncoding` varchar(16) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `dataFormat` binary(4) NOT NULL, + `data` longblob NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `key_changeset` (`changesetID`), + KEY `key_created` (`dateCreated`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_reviewer` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `revisionPHID` varbinary(64) NOT NULL, + `reviewerPHID` varbinary(64) NOT NULL, + `reviewerStatus` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `lastActionDiffPHID` varbinary(64) DEFAULT NULL, + `lastCommentDiffPHID` varbinary(64) DEFAULT NULL, + `lastActorPHID` varbinary(64) DEFAULT NULL, + `voidedPHID` varbinary(64) DEFAULT NULL, + `options` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_revision` (`revisionPHID`,`reviewerPHID`), + KEY `key_reviewer` (`reviewerPHID`,`revisionPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_revision` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `phid` varbinary(64) NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `summary` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `testPlan` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `lastReviewerPHID` varbinary(64) DEFAULT NULL, + `lineCount` int(10) unsigned DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `attached` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `mailKey` binary(40) NOT NULL, + `branchName` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `repositoryPHID` varbinary(64) DEFAULT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `activeDiffPHID` varbinary(64) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phid` (`phid`), + KEY `authorPHID` (`authorPHID`,`status`), + KEY `repositoryPHID` (`repositoryPHID`), + KEY `key_status` (`status`,`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_revision_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_revision_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_revision_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_revision_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_revisionhash` ( + `revisionID` int(10) unsigned NOT NULL, + `type` binary(4) NOT NULL, + `hash` binary(40) NOT NULL, + KEY `type` (`type`,`hash`), + KEY `revisionID` (`revisionID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `differential_transaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `revisionPHID` varbinary(64) DEFAULT NULL, + `changesetID` int(10) unsigned DEFAULT NULL, + `isNewFile` tinyint(1) NOT NULL, + `lineNumber` int(10) unsigned NOT NULL, + `lineLength` int(10) unsigned NOT NULL, + `fixedState` varchar(12) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `hasReplies` tinyint(1) NOT NULL, + `replyToCommentPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`), + KEY `key_changeset` (`changesetID`), + KEY `key_draft` (`authorPHID`,`transactionPHID`), + KEY `key_revision` (`revisionPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_differential`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_diviner` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_diviner`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `diviner_liveatom` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `symbolPHID` varbinary(64) NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `atomData` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `symbolPHID` (`symbolPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_diviner`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `diviner_livebook` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `repositoryPHID` varbinary(64) DEFAULT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `configurationData` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`), + UNIQUE KEY `phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_diviner`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `diviner_livebooktransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_diviner`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `diviner_livesymbol` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `bookPHID` varbinary(64) NOT NULL, + `repositoryPHID` varbinary(64) DEFAULT NULL, + `context` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `type` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `atomIndex` int(10) unsigned NOT NULL, + `identityHash` binary(12) NOT NULL, + `graphHash` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `title` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `titleSlugHash` binary(12) DEFAULT NULL, + `groupName` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `summary` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `isDocumentable` tinyint(1) NOT NULL, + `nodeHash` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `identityHash` (`identityHash`), + UNIQUE KEY `phid` (`phid`), + UNIQUE KEY `graphHash` (`graphHash`), + UNIQUE KEY `nodeHash` (`nodeHash`), + KEY `key_slug` (`titleSlugHash`), + KEY `bookPHID` (`bookPHID`,`type`,`name`(64),`context`(64),`atomIndex`), + KEY `name` (`name`(64)) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_diviner`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_diviner`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_doorkeeper` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_doorkeeper`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `doorkeeper_externalobject` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `objectKey` binary(12) NOT NULL, + `applicationType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `applicationDomain` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `objectType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `objectID` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `objectURI` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `importerPHID` varbinary(64) DEFAULT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_object` (`objectKey`), + KEY `key_full` (`applicationType`,`applicationDomain`,`objectType`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_doorkeeper`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_doorkeeper`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_draft` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_draft`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `draft` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `authorPHID` varbinary(64) NOT NULL, + `draftKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `draft` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `authorPHID` (`authorPHID`,`draftKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_draft`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `draft_versioneddraft` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `version` int(10) unsigned NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`,`authorPHID`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_drydock` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_drydock`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `drydock_authorization` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `blueprintPHID` varbinary(64) NOT NULL, + `blueprintAuthorizationState` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `objectAuthorizationState` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_unique` (`objectPHID`,`blueprintPHID`), + KEY `key_blueprint` (`blueprintPHID`,`blueprintAuthorizationState`), + KEY `key_object` (`objectPHID`,`objectAuthorizationState`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_drydock`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `drydock_blueprint` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `className` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `blueprintName` varchar(255) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `details` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `isDisabled` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_drydock`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `drydock_blueprintname_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_drydock`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `drydock_blueprinttransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_drydock`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `drydock_command` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `authorPHID` varbinary(64) NOT NULL, + `targetPHID` varbinary(64) NOT NULL, + `command` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isConsumed` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_target` (`targetPHID`,`isConsumed`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_drydock`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `drydock_lease` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `until` int(10) unsigned DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `attributes` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `resourceType` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `resourcePHID` varbinary(64) DEFAULT NULL, + `authorizingPHID` varbinary(64) NOT NULL, + `acquiredEpoch` int(10) unsigned DEFAULT NULL, + `activatedEpoch` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_resource` (`resourcePHID`,`status`), + KEY `key_status` (`status`), + KEY `key_owner` (`ownerPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_drydock`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `drydock_log` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `epoch` int(10) unsigned NOT NULL, + `blueprintPHID` varbinary(64) DEFAULT NULL, + `resourcePHID` varbinary(64) DEFAULT NULL, + `leasePHID` varbinary(64) DEFAULT NULL, + `type` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `operationPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `epoch` (`epoch`), + KEY `key_blueprint` (`blueprintPHID`,`type`), + KEY `key_resource` (`resourcePHID`,`type`), + KEY `key_lease` (`leasePHID`,`type`), + KEY `key_operation` (`operationPHID`,`type`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_drydock`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `drydock_repositoryoperation` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `repositoryPHID` varbinary(64) NOT NULL, + `repositoryTarget` longblob NOT NULL, + `operationType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `operationState` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `isDismissed` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`), + KEY `key_repository` (`repositoryPHID`,`operationState`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_drydock`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `drydock_resource` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `type` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `attributes` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `capabilities` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `blueprintPHID` varbinary(64) NOT NULL, + `until` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_type` (`type`,`status`), + KEY `key_blueprint` (`blueprintPHID`,`status`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_drydock`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `drydock_slotlock` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ownerPHID` varbinary(64) NOT NULL, + `lockIndex` binary(12) NOT NULL, + `lockKey` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_lock` (`lockIndex`), + KEY `key_owner` (`ownerPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_drydock`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_drydock`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_fact` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_fact`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fact_aggregate` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `factType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `valueX` bigint(20) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `factType` (`factType`,`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fact`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fact_chart` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `chartKey` binary(12) NOT NULL, + `chartParameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_chart` (`chartKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fact`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fact_cursor` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `position` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fact`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fact_intdatapoint` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `keyID` int(10) unsigned NOT NULL, + `objectID` int(10) unsigned NOT NULL, + `dimensionID` int(10) unsigned DEFAULT NULL, + `value` bigint(20) NOT NULL, + `epoch` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `key_dimension` (`keyID`,`dimensionID`), + KEY `key_object` (`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fact`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fact_keydimension` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `factKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_factkey` (`factKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fact`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fact_objectdimension` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fact`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fact_raw` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `factType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `objectA` varbinary(64) NOT NULL, + `valueX` bigint(20) NOT NULL, + `valueY` bigint(20) NOT NULL, + `epoch` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `objectPHID` (`objectPHID`), + KEY `factType` (`factType`,`epoch`), + KEY `factType_2` (`factType`,`objectA`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_feed` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_feed`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `feed_storydata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `chronologicalKey` bigint(20) unsigned NOT NULL, + `storyType` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `storyData` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `chronologicalKey` (`chronologicalKey`), + UNIQUE KEY `phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_feed`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `feed_storynotification` ( + `userPHID` varbinary(64) NOT NULL, + `primaryObjectPHID` varbinary(64) NOT NULL, + `chronologicalKey` bigint(20) unsigned NOT NULL, + `hasViewed` tinyint(1) NOT NULL, + UNIQUE KEY `userPHID` (`userPHID`,`chronologicalKey`), + KEY `userPHID_2` (`userPHID`,`hasViewed`,`primaryObjectPHID`), + KEY `key_object` (`primaryObjectPHID`), + KEY `key_chronological` (`chronologicalKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_feed`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `feed_storyreference` ( + `objectPHID` varbinary(64) NOT NULL, + `chronologicalKey` bigint(20) unsigned NOT NULL, + UNIQUE KEY `objectPHID` (`objectPHID`,`chronologicalKey`), + KEY `chronologicalKey` (`chronologicalKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_file` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `file` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} DEFAULT NULL, + `mimeType` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `byteSize` bigint(20) unsigned NOT NULL, + `storageEngine` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `storageFormat` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `storageHandle` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `secretKey` binary(20) DEFAULT NULL, + `contentHash` binary(64) DEFAULT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `ttl` int(10) unsigned DEFAULT NULL, + `isExplicitUpload` tinyint(1) DEFAULT '1', + `mailKey` binary(20) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `isPartial` tinyint(1) NOT NULL DEFAULT '0', + `builtinKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `isDeleted` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `phid` (`phid`), + UNIQUE KEY `key_builtin` (`builtinKey`), + KEY `authorPHID` (`authorPHID`), + KEY `contentHash` (`contentHash`), + KEY `key_ttl` (`ttl`), + KEY `key_dateCreated` (`dateCreated`), + KEY `key_partial` (`authorPHID`,`isPartial`), + KEY `key_engine` (`storageEngine`,`storageHandle`(64)) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `file_chunk` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `chunkHandle` binary(12) NOT NULL, + `byteStart` bigint(20) unsigned NOT NULL, + `byteEnd` bigint(20) unsigned NOT NULL, + `dataFilePHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `key_file` (`chunkHandle`,`byteStart`,`byteEnd`), + KEY `key_data` (`dataFilePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `file_externalrequest` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `filePHID` varbinary(64) DEFAULT NULL, + `ttl` int(10) unsigned NOT NULL, + `uri` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `uriIndex` binary(12) NOT NULL, + `isSuccessful` tinyint(1) NOT NULL, + `responseMessage` longtext COLLATE {$COLLATE_TEXT}, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_uriindex` (`uriIndex`), + KEY `key_ttl` (`ttl`), + KEY `key_file` (`filePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `file_filename_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `file_imagemacro` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `filePHID` varbinary(64) NOT NULL, + `name` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `isDisabled` tinyint(1) NOT NULL, + `audioPHID` varbinary(64) DEFAULT NULL, + `audioBehavior` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `mailKey` binary(20) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `name` (`name`), + KEY `key_disabled` (`isDisabled`), + KEY `key_dateCreated` (`dateCreated`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `file_storageblob` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longblob NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `file_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `file_transaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `file_transformedfile` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `originalPHID` varbinary(64) NOT NULL, + `transform` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `transformedPHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `originalPHID` (`originalPHID`,`transform`), + KEY `transformedPHID` (`transformedPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `macro_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_file`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `macro_transaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_flag` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_flag`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `flag` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ownerPHID` varbinary(64) NOT NULL, + `type` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `reasonPHID` varbinary(64) NOT NULL, + `color` int(10) unsigned NOT NULL, + `note` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `ownerPHID` (`ownerPHID`,`type`,`objectPHID`), + KEY `objectPHID` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_fund` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_fund`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fund`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fund`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fund_backer` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `initiativePHID` varbinary(64) NOT NULL, + `backerPHID` varbinary(64) NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `amountAsCurrency` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_initiative` (`initiativePHID`), + KEY `key_backer` (`backerPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fund`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fund_backertransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fund`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fund_initiative` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `ownerPHID` varbinary(64) NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `merchantPHID` varbinary(64) DEFAULT NULL, + `risks` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `totalAsCurrency` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `mailKey` binary(20) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_status` (`status`), + KEY `key_owner` (`ownerPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fund`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fund_initiative_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fund`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fund_initiative_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fund`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fund_initiative_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fund`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fund_initiative_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fund`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fund_initiativetransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_fund`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `fund_initiativetransaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_harbormaster` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_build` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `buildablePHID` varbinary(64) NOT NULL, + `buildPlanPHID` varbinary(64) NOT NULL, + `buildStatus` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `buildGeneration` int(10) unsigned NOT NULL DEFAULT '0', + `planAutoKey` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `buildParameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `initiatorPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_planautokey` (`buildablePHID`,`planAutoKey`), + KEY `key_buildable` (`buildablePHID`), + KEY `key_plan` (`buildPlanPHID`), + KEY `key_status` (`buildStatus`), + KEY `key_initiator` (`initiatorPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildable` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `buildablePHID` varbinary(64) NOT NULL, + `containerPHID` varbinary(64) DEFAULT NULL, + `buildableStatus` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `isManualBuildable` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_buildable` (`buildablePHID`), + KEY `key_container` (`containerPHID`), + KEY `key_manual` (`isManualBuildable`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildabletransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildartifact` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `artifactType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `artifactIndex` binary(12) NOT NULL, + `artifactKey` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `artifactData` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `buildTargetPHID` varbinary(64) NOT NULL, + `isReleased` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_artifact` (`artifactType`,`artifactIndex`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_garbagecollect` (`artifactType`,`dateCreated`), + KEY `key_target` (`buildTargetPHID`,`artifactType`), + KEY `key_index` (`artifactIndex`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildcommand` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `authorPHID` varbinary(64) NOT NULL, + `targetPHID` varbinary(64) NOT NULL, + `command` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `key_target` (`targetPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildlintmessage` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `buildTargetPHID` varbinary(64) NOT NULL, + `path` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `line` int(10) unsigned DEFAULT NULL, + `characterOffset` int(10) unsigned DEFAULT NULL, + `code` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `severity` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `key_target` (`buildTargetPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildlog` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `logSource` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `logType` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `duration` int(10) unsigned DEFAULT NULL, + `live` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `buildTargetPHID` varbinary(64) NOT NULL, + `filePHID` varbinary(64) DEFAULT NULL, + `byteLength` bigint(20) unsigned NOT NULL, + `chunkFormat` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `lineMap` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_buildtarget` (`buildTargetPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildlogchunk` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `logID` int(10) unsigned NOT NULL, + `encoding` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `size` int(10) unsigned DEFAULT NULL, + `chunk` longblob NOT NULL, + `headOffset` bigint(20) unsigned NOT NULL, + `tailOffset` bigint(20) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `key_offset` (`logID`,`headOffset`,`tailOffset`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildmessage` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `authorPHID` varbinary(64) NOT NULL, + `receiverPHID` varbinary(64) NOT NULL, + `type` varchar(16) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isConsumed` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `key_receiver` (`receiverPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildplan` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(128) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `planStatus` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `planAutoKey` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_planautokey` (`planAutoKey`), + KEY `key_status` (`planStatus`), + KEY `key_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildplanname_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildplantransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildstep` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `buildPlanPHID` varbinary(64) NOT NULL, + `className` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `details` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `sequence` int(10) unsigned NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `stepAutoKey` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_stepautokey` (`buildPlanPHID`,`stepAutoKey`), + KEY `key_plan` (`buildPlanPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildsteptransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildtarget` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `buildPHID` varbinary(64) NOT NULL, + `buildStepPHID` varbinary(64) NOT NULL, + `className` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `details` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `variables` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `targetStatus` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `dateStarted` int(10) unsigned DEFAULT NULL, + `dateCompleted` int(10) unsigned DEFAULT NULL, + `buildGeneration` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_build` (`buildPHID`,`buildStepPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildtransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_buildunitmessage` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `buildTargetPHID` varbinary(64) NOT NULL, + `engine` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `namespace` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `result` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `duration` double DEFAULT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `nameIndex` binary(12) NOT NULL, + PRIMARY KEY (`id`), + KEY `key_target` (`buildTargetPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_object` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_scratchtable` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `bigData` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `nonmutableData` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `data` (`data`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `harbormaster_string` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `stringIndex` binary(12) NOT NULL, + `stringValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_string` (`stringIndex`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_harbormaster`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `lisk_counter` ( + `counterName` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `counterValue` bigint(20) unsigned NOT NULL, + PRIMARY KEY (`counterName`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_herald` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_herald`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_herald`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_herald`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `herald_action` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ruleID` int(10) unsigned NOT NULL, + `action` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `target` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `ruleID` (`ruleID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_herald`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `herald_condition` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ruleID` int(10) unsigned NOT NULL, + `fieldName` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `fieldCondition` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `value` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `ruleID` (`ruleID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_herald`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `herald_rule` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `contentType` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `mustMatchAll` tinyint(1) NOT NULL, + `configVersion` int(10) unsigned NOT NULL DEFAULT '1', + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `repetitionPolicy` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `ruleType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `phid` varbinary(64) NOT NULL, + `isDisabled` int(10) unsigned NOT NULL DEFAULT '0', + `triggerObjectPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_trigger` (`triggerObjectPHID`), + KEY `key_name` (`name`(128)), + KEY `key_author` (`authorPHID`), + KEY `key_ruletype` (`ruleType`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_herald`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `herald_ruleapplied` ( + `ruleID` int(10) unsigned NOT NULL, + `phid` varbinary(64) NOT NULL, + PRIMARY KEY (`ruleID`,`phid`), + KEY `phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_herald`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `herald_ruletransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_herald`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `herald_savedheader` ( + `phid` varbinary(64) NOT NULL, + `header` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_herald`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `herald_transcript` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `time` int(10) unsigned NOT NULL, + `host` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `duration` double NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `dryRun` tinyint(1) NOT NULL, + `objectTranscript` longblob NOT NULL, + `ruleTranscripts` longblob NOT NULL, + `conditionTranscripts` longblob NOT NULL, + `applyTranscripts` longblob NOT NULL, + `garbageCollected` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `phid` (`phid`), + KEY `objectPHID` (`objectPHID`), + KEY `garbageCollected` (`garbageCollected`,`time`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_herald`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `herald_webhook` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `webhookURI` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `hmacKey` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_herald`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `herald_webhookrequest` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `webhookPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `lastRequestResult` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `lastRequestEpoch` int(10) unsigned NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_ratelimit` (`webhookPHID`,`lastRequestResult`,`lastRequestEpoch`), + KEY `key_collect` (`dateCreated`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_herald`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `herald_webhooktransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_legalpad` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_legalpad`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_legalpad`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_legalpad`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `legalpad_document` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `title` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contributorCount` int(10) unsigned NOT NULL DEFAULT '0', + `recentContributorPHIDs` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `creatorPHID` varbinary(64) NOT NULL, + `versions` int(10) unsigned NOT NULL DEFAULT '0', + `documentBodyPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `mailKey` binary(20) NOT NULL, + `signatureType` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `preamble` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `requireSignature` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_creator` (`creatorPHID`,`dateModified`), + KEY `key_required` (`requireSignature`,`dateModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_legalpad`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `legalpad_documentbody` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `creatorPHID` varbinary(64) NOT NULL, + `documentPHID` varbinary(64) NOT NULL, + `version` int(10) unsigned NOT NULL DEFAULT '0', + `title` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `text` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_document` (`documentPHID`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_legalpad`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `legalpad_documentsignature` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentPHID` varbinary(64) NOT NULL, + `documentVersion` int(10) unsigned NOT NULL DEFAULT '0', + `signatureType` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `signerPHID` varbinary(64) DEFAULT NULL, + `signerName` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `signerEmail` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `signatureData` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `secretKey` binary(20) NOT NULL, + `verified` tinyint(1) DEFAULT '0', + `isExemption` tinyint(1) NOT NULL DEFAULT '0', + `exemptionPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `key_signer` (`signerPHID`,`dateModified`), + KEY `secretKey` (`secretKey`), + KEY `key_document` (`documentPHID`,`signerPHID`,`documentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_legalpad`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `legalpad_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_legalpad`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `legalpad_transaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `documentID` int(10) unsigned DEFAULT NULL, + `lineNumber` int(10) unsigned NOT NULL, + `lineLength` int(10) unsigned NOT NULL, + `fixedState` varchar(12) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `hasReplies` tinyint(1) NOT NULL, + `replyToCommentPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`), + UNIQUE KEY `key_draft` (`authorPHID`,`documentID`,`transactionPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_maniphest` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `maniphest_customfieldnumericindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `indexKey` binary(12) NOT NULL, + `indexValue` bigint(20) NOT NULL, + PRIMARY KEY (`id`), + KEY `key_join` (`objectPHID`,`indexKey`,`indexValue`), + KEY `key_find` (`indexKey`,`indexValue`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `maniphest_customfieldstorage` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `fieldIndex` binary(12) NOT NULL, + `fieldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `objectPHID` (`objectPHID`,`fieldIndex`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `maniphest_customfieldstringindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `indexKey` binary(12) NOT NULL, + `indexValue` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_join` (`objectPHID`,`indexKey`,`indexValue`(64)), + KEY `key_find` (`indexKey`,`indexValue`(64)) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `maniphest_nameindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `indexedObjectPHID` varbinary(64) NOT NULL, + `indexedObjectName` varchar(128) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`indexedObjectPHID`), + KEY `key_name` (`indexedObjectName`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `maniphest_task` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `status` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `priority` int(10) unsigned NOT NULL, + `title` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `mailKey` binary(20) NOT NULL, + `ownerOrdering` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `originalEmailSource` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `subpriority` double NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `points` double DEFAULT NULL, + `bridgedObjectPHID` varbinary(64) DEFAULT NULL, + `subtype` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `closedEpoch` int(10) unsigned DEFAULT NULL, + `closerPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phid` (`phid`), + UNIQUE KEY `key_bridgedobject` (`bridgedObjectPHID`), + KEY `priority` (`priority`,`status`), + KEY `status` (`status`), + KEY `ownerPHID` (`ownerPHID`,`status`), + KEY `authorPHID` (`authorPHID`,`status`), + KEY `ownerOrdering` (`ownerOrdering`), + KEY `priority_2` (`priority`,`subpriority`), + KEY `key_dateCreated` (`dateCreated`), + KEY `key_dateModified` (`dateModified`), + KEY `key_title` (`title`(64)), + KEY `key_subtype` (`subtype`), + KEY `key_closed` (`closedEpoch`), + KEY `key_closer` (`closerPHID`,`closedEpoch`), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `maniphest_task_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `maniphest_task_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `maniphest_task_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `maniphest_task_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `maniphest_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_maniphest`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `maniphest_transaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_meta_data` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_meta_data`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `hoststate` ( + `stateKey` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `stateValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`stateKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_meta_data`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `patch_status` ( + `patch` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `applied` int(10) unsigned NOT NULL, + `duration` bigint(20) unsigned DEFAULT NULL, + PRIMARY KEY (`patch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +INSERT INTO `patch_status` VALUES ('phabricator:000.project.sql',1556231684,NULL),('phabricator:0000.legacy.sql',1556231684,NULL),('phabricator:001.maniphest_projects.sql',1556231684,NULL),('phabricator:002.oauth.sql',1556231684,NULL),('phabricator:003.more_oauth.sql',1556231684,NULL),('phabricator:004.daemonrepos.sql',1556231684,NULL),('phabricator:005.workers.sql',1556231684,NULL),('phabricator:006.repository.sql',1556231684,NULL),('phabricator:007.daemonlog.sql',1556231684,NULL),('phabricator:008.repoopt.sql',1556231684,NULL),('phabricator:009.repo_summary.sql',1556231684,NULL),('phabricator:010.herald.sql',1556231684,NULL),('phabricator:011.badcommit.sql',1556231684,NULL),('phabricator:012.dropphidtype.sql',1556231684,NULL),('phabricator:013.commitdetail.sql',1556231684,NULL),('phabricator:014.shortcuts.sql',1556231684,NULL),('phabricator:015.preferences.sql',1556231684,NULL),('phabricator:016.userrealnameindex.sql',1556231684,NULL),('phabricator:017.sessionkeys.sql',1556231684,NULL),('phabricator:018.owners.sql',1556231684,NULL),('phabricator:019.arcprojects.sql',1556231684,NULL),('phabricator:020.pathcapital.sql',1556231684,NULL),('phabricator:021.xhpastview.sql',1556231684,NULL),('phabricator:022.differentialcommit.sql',1556231684,NULL),('phabricator:023.dxkeys.sql',1556231685,NULL),('phabricator:024.mlistkeys.sql',1556231685,NULL),('phabricator:025.commentopt.sql',1556231685,NULL),('phabricator:026.diffpropkey.sql',1556231685,NULL),('phabricator:027.metamtakeys.sql',1556231685,NULL),('phabricator:028.systemagent.sql',1556231685,NULL),('phabricator:029.cursors.sql',1556231685,NULL),('phabricator:030.imagemacro.sql',1556231685,NULL),('phabricator:031.workerrace.sql',1556231685,NULL),('phabricator:032.viewtime.sql',1556231685,NULL),('phabricator:033.privtest.sql',1556231685,NULL),('phabricator:034.savedheader.sql',1556231685,NULL),('phabricator:035.proxyimage.sql',1556231685,NULL),('phabricator:036.mailkey.sql',1556231685,NULL),('phabricator:037.setuptest.sql',1556231685,NULL),('phabricator:038.admin.sql',1556231685,NULL),('phabricator:039.userlog.sql',1556231685,NULL),('phabricator:040.transform.sql',1556231685,NULL),('phabricator:041.heraldrepetition.sql',1556231685,NULL),('phabricator:042.commentmetadata.sql',1556231685,NULL),('phabricator:043.pastebin.sql',1556231685,NULL),('phabricator:044.countdown.sql',1556231685,NULL),('phabricator:045.timezone.sql',1556231685,NULL),('phabricator:046.conduittoken.sql',1556231685,NULL),('phabricator:047.projectstatus.sql',1556231685,NULL),('phabricator:048.relationshipkeys.sql',1556231685,NULL),('phabricator:049.projectowner.sql',1556231685,NULL),('phabricator:050.taskdenormal.sql',1556231685,NULL),('phabricator:051.projectfilter.sql',1556231685,NULL),('phabricator:052.pastelanguage.sql',1556231685,NULL),('phabricator:053.feed.sql',1556231685,NULL),('phabricator:054.subscribers.sql',1556231685,NULL),('phabricator:055.add_author_to_files.sql',1556231685,NULL),('phabricator:056.slowvote.sql',1556231685,NULL),('phabricator:057.parsecache.sql',1556231685,NULL),('phabricator:058.missingkeys.sql',1556231685,NULL),('phabricator:059.engines.php',1556231685,NULL),('phabricator:060.phriction.sql',1556231685,NULL),('phabricator:061.phrictioncontent.sql',1556231685,NULL),('phabricator:062.phrictionmenu.sql',1556231685,NULL),('phabricator:063.pasteforks.sql',1556231685,NULL),('phabricator:064.subprojects.sql',1556231685,NULL),('phabricator:065.sshkeys.sql',1556231685,NULL),('phabricator:066.phrictioncontent.sql',1556231685,NULL),('phabricator:067.preferences.sql',1556231685,NULL),('phabricator:068.maniphestauxiliarystorage.sql',1556231685,NULL),('phabricator:069.heraldxscript.sql',1556231685,NULL),('phabricator:070.differentialaux.sql',1556231685,NULL),('phabricator:071.contentsource.sql',1556231685,NULL),('phabricator:072.blamerevert.sql',1556231685,NULL),('phabricator:073.reposymbols.sql',1556231685,NULL),('phabricator:074.affectedpath.sql',1556231685,NULL),('phabricator:075.revisionhash.sql',1556231685,NULL),('phabricator:076.indexedlanguages.sql',1556231685,NULL),('phabricator:077.originalemail.sql',1556231685,NULL),('phabricator:078.nametoken.sql',1556231685,NULL),('phabricator:079.nametokenindex.php',1556231685,NULL),('phabricator:080.filekeys.sql',1556231685,NULL),('phabricator:081.filekeys.php',1556231685,NULL),('phabricator:082.xactionkey.sql',1556231685,NULL),('phabricator:083.dxviewtime.sql',1556231685,NULL),('phabricator:084.pasteauthorkey.sql',1556231685,NULL),('phabricator:085.packagecommitrelationship.sql',1556231685,NULL),('phabricator:086.formeraffil.sql',1556231685,NULL),('phabricator:087.phrictiondelete.sql',1556231685,NULL),('phabricator:088.audit.sql',1556231685,NULL),('phabricator:089.projectwiki.sql',1556231685,NULL),('phabricator:090.forceuniqueprojectnames.php',1556231685,NULL),('phabricator:091.uniqueslugkey.sql',1556231686,NULL),('phabricator:092.dropgithubnotification.sql',1556231686,NULL),('phabricator:093.gitremotes.php',1556231686,NULL),('phabricator:094.phrictioncolumn.sql',1556231686,NULL),('phabricator:095.directory.sql',1556231686,NULL),('phabricator:096.filename.sql',1556231686,NULL),('phabricator:097.heraldruletypes.sql',1556231686,NULL),('phabricator:098.heraldruletypemigration.php',1556231686,NULL),('phabricator:099.drydock.sql',1556231686,NULL),('phabricator:100.projectxaction.sql',1556231686,NULL),('phabricator:101.heraldruleapplied.sql',1556231686,NULL),('phabricator:102.heraldcleanup.php',1556231686,NULL),('phabricator:103.heraldedithistory.sql',1556231686,NULL),('phabricator:104.searchkey.sql',1556231686,NULL),('phabricator:105.mimetype.sql',1556231686,NULL),('phabricator:106.chatlog.sql',1556231686,NULL),('phabricator:107.oauthserver.sql',1556231686,NULL),('phabricator:108.oauthscope.sql',1556231686,NULL),('phabricator:109.oauthclientphidkey.sql',1556231686,NULL),('phabricator:110.commitaudit.sql',1556231686,NULL),('phabricator:111.commitauditmigration.php',1556231686,NULL),('phabricator:112.oauthaccesscoderedirecturi.sql',1556231686,NULL),('phabricator:113.lastreviewer.sql',1556231686,NULL),('phabricator:114.auditrequest.sql',1556231686,NULL),('phabricator:115.prepareutf8.sql',1556231686,NULL),('phabricator:116.utf8-backup-first-expect-wait.sql',1556231688,NULL),('phabricator:117.repositorydescription.php',1556231688,NULL),('phabricator:118.auditinline.sql',1556231688,NULL),('phabricator:119.filehash.sql',1556231688,NULL),('phabricator:120.noop.sql',1556231688,NULL),('phabricator:121.drydocklog.sql',1556231688,NULL),('phabricator:122.flag.sql',1556231688,NULL),('phabricator:123.heraldrulelog.sql',1556231688,NULL),('phabricator:124.subpriority.sql',1556231688,NULL),('phabricator:125.ipv6.sql',1556231688,NULL),('phabricator:126.edges.sql',1556231688,NULL),('phabricator:127.userkeybody.sql',1556231688,NULL),('phabricator:128.phabricatorcom.sql',1556231688,NULL),('phabricator:129.savedquery.sql',1556231688,NULL),('phabricator:130.denormalrevisionquery.sql',1556231688,NULL),('phabricator:131.migraterevisionquery.php',1556231688,NULL),('phabricator:132.phame.sql',1556231688,NULL),('phabricator:133.imagemacro.sql',1556231688,NULL),('phabricator:134.emptysearch.sql',1556231688,NULL),('phabricator:135.datecommitted.sql',1556231688,NULL),('phabricator:136.sex.sql',1556231688,NULL),('phabricator:137.auditmetadata.sql',1556231688,NULL),('phabricator:138.notification.sql',1556231688,NULL),('phabricator:20121209.pholioxactions.sql',1556231689,NULL),('phabricator:20121209.xmacroadd.sql',1556231689,NULL),('phabricator:20121209.xmacromigrate.php',1556231689,NULL),('phabricator:20121209.xmacromigratekey.sql',1556231689,NULL),('phabricator:20121220.generalcache.sql',1556231689,NULL),('phabricator:20121226.config.sql',1556231689,NULL),('phabricator:20130101.confxaction.sql',1556231689,NULL),('phabricator:20130102.metamtareceivedmailmessageidhash.sql',1556231689,NULL),('phabricator:20130103.filemetadata.sql',1556231689,NULL),('phabricator:20130111.conpherence.sql',1556231689,NULL),('phabricator:20130127.altheraldtranscript.sql',1556231689,NULL),('phabricator:20130131.conpherencepics.sql',1556231689,NULL),('phabricator:20130201.revisionunsubscribed.php',1556231689,NULL),('phabricator:20130201.revisionunsubscribed.sql',1556231689,NULL),('phabricator:20130214.chatlogchannel.sql',1556231689,NULL),('phabricator:20130214.chatlogchannelid.sql',1556231689,NULL),('phabricator:20130214.token.sql',1556231689,NULL),('phabricator:20130215.phabricatorfileaddttl.sql',1556231689,NULL),('phabricator:20130217.cachettl.sql',1556231689,NULL),('phabricator:20130218.longdaemon.sql',1556231689,NULL),('phabricator:20130218.updatechannelid.php',1556231689,NULL),('phabricator:20130219.commitsummary.sql',1556231689,NULL),('phabricator:20130219.commitsummarymig.php',1556231689,NULL),('phabricator:20130222.dropchannel.sql',1556231689,NULL),('phabricator:20130226.commitkey.sql',1556231689,NULL),('phabricator:20130304.lintauthor.sql',1556231689,NULL),('phabricator:20130310.xactionmeta.sql',1556231689,NULL),('phabricator:20130317.phrictionedge.sql',1556231689,NULL),('phabricator:20130319.conpherence.sql',1556231689,NULL),('phabricator:20130319.phabricatorfileexplicitupload.sql',1556231689,NULL),('phabricator:20130320.phlux.sql',1556231689,NULL),('phabricator:20130321.token.sql',1556231689,NULL),('phabricator:20130322.phortune.sql',1556231689,NULL),('phabricator:20130323.phortunepayment.sql',1556231689,NULL),('phabricator:20130324.phortuneproduct.sql',1556231689,NULL),('phabricator:20130330.phrequent.sql',1556231689,NULL),('phabricator:20130403.conpherencecache.sql',1556231689,NULL),('phabricator:20130403.conpherencecachemig.php',1556231689,NULL),('phabricator:20130409.commitdrev.php',1556231689,NULL),('phabricator:20130417.externalaccount.sql',1556231689,NULL),('phabricator:20130423.conpherenceindices.sql',1556231690,NULL),('phabricator:20130423.phortunepaymentrevised.sql',1556231690,NULL),('phabricator:20130423.updateexternalaccount.sql',1556231689,NULL),('phabricator:20130426.search_savedquery.sql',1556231690,NULL),('phabricator:20130502.countdownrevamp1.sql',1556231690,NULL),('phabricator:20130502.countdownrevamp2.php',1556231690,NULL),('phabricator:20130502.countdownrevamp3.sql',1556231690,NULL),('phabricator:20130507.releephrqmailkey.sql',1556231690,NULL),('phabricator:20130507.releephrqmailkeypop.php',1556231690,NULL),('phabricator:20130507.releephrqsimplifycols.sql',1556231690,NULL),('phabricator:20130508.releephtransactions.sql',1556231690,NULL),('phabricator:20130508.releephtransactionsmig.php',1556231690,NULL),('phabricator:20130508.search_namedquery.sql',1556231690,NULL),('phabricator:20130513.receviedmailstatus.sql',1556231690,NULL),('phabricator:20130519.diviner.sql',1556231690,NULL),('phabricator:20130521.dropconphimages.sql',1556231690,NULL),('phabricator:20130523.maniphest_owners.sql',1556231690,NULL),('phabricator:20130524.repoxactions.sql',1556231690,NULL),('phabricator:20130529.macroauthor.sql',1556231690,NULL),('phabricator:20130529.macroauthormig.php',1556231690,NULL),('phabricator:20130530.macrodatekey.sql',1556231690,NULL),('phabricator:20130530.pastekeys.sql',1556231690,NULL),('phabricator:20130530.sessionhash.php',1556231690,NULL),('phabricator:20130531.filekeys.sql',1556231690,NULL),('phabricator:20130602.morediviner.sql',1556231690,NULL),('phabricator:20130602.namedqueries.sql',1556231690,NULL),('phabricator:20130606.userxactions.sql',1556231690,NULL),('phabricator:20130607.xaccount.sql',1556231690,NULL),('phabricator:20130611.migrateoauth.php',1556231690,NULL),('phabricator:20130611.nukeldap.php',1556231690,NULL),('phabricator:20130613.authdb.sql',1556231690,NULL),('phabricator:20130619.authconf.php',1556231690,NULL),('phabricator:20130620.diffxactions.sql',1556231690,NULL),('phabricator:20130621.diffcommentphid.sql',1556231690,NULL),('phabricator:20130621.diffcommentphidmig.php',1556231690,NULL),('phabricator:20130621.diffcommentunphid.sql',1556231690,NULL),('phabricator:20130622.doorkeeper.sql',1556231690,NULL),('phabricator:20130628.legalpadv0.sql',1556231690,NULL),('phabricator:20130701.conduitlog.sql',1556231690,NULL),('phabricator:20130703.legalpaddocdenorm.php',1556231690,NULL),('phabricator:20130703.legalpaddocdenorm.sql',1556231690,NULL),('phabricator:20130709.droptimeline.sql',1556231690,NULL),('phabricator:20130709.legalpadsignature.sql',1556231690,NULL),('phabricator:20130711.pholioimageobsolete.php',1556231690,NULL),('phabricator:20130711.pholioimageobsolete.sql',1556231690,NULL),('phabricator:20130711.pholioimageobsolete2.sql',1556231690,NULL),('phabricator:20130711.trimrealnames.php',1556231690,NULL),('phabricator:20130714.votexactions.sql',1556231690,NULL),('phabricator:20130715.votecomments.php',1556231690,NULL),('phabricator:20130715.voteedges.sql',1556231690,NULL),('phabricator:20130716.archivememberlessprojects.php',1556231690,NULL),('phabricator:20130722.pholioreplace.sql',1556231690,NULL),('phabricator:20130723.taskstarttime.sql',1556231690,NULL),('phabricator:20130726.ponderxactions.sql',1556231690,NULL),('phabricator:20130727.ponderquestionstatus.sql',1556231690,NULL),('phabricator:20130728.ponderunique.php',1556231690,NULL),('phabricator:20130728.ponderuniquekey.sql',1556231690,NULL),('phabricator:20130728.ponderxcomment.php',1556231690,NULL),('phabricator:20130731.releephcutpointidentifier.sql',1556231690,NULL),('phabricator:20130731.releephproject.sql',1556231690,NULL),('phabricator:20130731.releephrepoid.sql',1556231690,NULL),('phabricator:20130801.pastexactions.php',1556231690,NULL),('phabricator:20130801.pastexactions.sql',1556231690,NULL),('phabricator:20130802.heraldphid.sql',1556231690,NULL),('phabricator:20130802.heraldphids.php',1556231690,NULL),('phabricator:20130802.heraldphidukey.sql',1556231690,NULL),('phabricator:20130802.heraldxactions.sql',1556231690,NULL),('phabricator:20130805.pasteedges.sql',1556231690,NULL),('phabricator:20130805.pastemailkey.sql',1556231690,NULL),('phabricator:20130805.pastemailkeypop.php',1556231690,NULL),('phabricator:20130814.usercustom.sql',1556231690,NULL),('phabricator:20130820.file-mailkey-populate.php',1556231691,NULL),('phabricator:20130820.filemailkey.sql',1556231691,NULL),('phabricator:20130820.filexactions.sql',1556231691,NULL),('phabricator:20130820.releephxactions.sql',1556231690,NULL),('phabricator:20130826.divinernode.sql',1556231691,NULL),('phabricator:20130912.maniphest.1.touch.sql',1556231691,NULL),('phabricator:20130912.maniphest.2.created.sql',1556231691,NULL),('phabricator:20130912.maniphest.3.nameindex.sql',1556231691,NULL),('phabricator:20130912.maniphest.4.fillindex.php',1556231691,NULL),('phabricator:20130913.maniphest.1.migratesearch.php',1556231691,NULL),('phabricator:20130914.usercustom.sql',1556231691,NULL),('phabricator:20130915.maniphestcustom.sql',1556231691,NULL),('phabricator:20130915.maniphestmigrate.php',1556231691,NULL),('phabricator:20130915.maniphestqdrop.sql',1556231691,NULL),('phabricator:20130919.mfieldconf.php',1556231691,NULL),('phabricator:20130920.repokeyspolicy.sql',1556231691,NULL),('phabricator:20130921.mtransactions.sql',1556231691,NULL),('phabricator:20130921.xmigratemaniphest.php',1556231691,NULL),('phabricator:20130923.mrename.sql',1556231691,NULL),('phabricator:20130924.mdraftkey.sql',1556231691,NULL),('phabricator:20130925.mpolicy.sql',1556231691,NULL),('phabricator:20130925.xpolicy.sql',1556231691,NULL),('phabricator:20130926.dcustom.sql',1556231691,NULL),('phabricator:20130926.dinkeys.sql',1556231691,NULL),('phabricator:20130926.dinline.php',1556231691,NULL),('phabricator:20130927.audiomacro.sql',1556231691,NULL),('phabricator:20130929.filepolicy.sql',1556231691,NULL),('phabricator:20131004.dxedgekey.sql',1556231691,NULL),('phabricator:20131004.dxreviewers.php',1556231691,NULL),('phabricator:20131006.hdisable.sql',1556231691,NULL),('phabricator:20131010.pstorage.sql',1556231691,NULL),('phabricator:20131015.cpolicy.sql',1556231691,NULL),('phabricator:20131020.col1.sql',1556231691,NULL),('phabricator:20131020.harbormaster.sql',1556231691,NULL),('phabricator:20131020.pcustom.sql',1556231691,NULL),('phabricator:20131020.pxaction.sql',1556231691,NULL),('phabricator:20131020.pxactionmig.php',1556231691,NULL),('phabricator:20131025.repopush.sql',1556231691,NULL),('phabricator:20131026.commitstatus.sql',1556231691,NULL),('phabricator:20131030.repostatusmessage.sql',1556231691,NULL),('phabricator:20131031.vcspassword.sql',1556231691,NULL),('phabricator:20131105.buildstep.sql',1556231691,NULL),('phabricator:20131106.diffphid.1.col.sql',1556231691,NULL),('phabricator:20131106.diffphid.2.mig.php',1556231691,NULL),('phabricator:20131106.diffphid.3.key.sql',1556231691,NULL),('phabricator:20131106.nuance-v0.sql',1556231691,NULL),('phabricator:20131107.buildlog.sql',1556231691,NULL),('phabricator:20131112.userverified.1.col.sql',1556231691,NULL),('phabricator:20131112.userverified.2.mig.php',1556231691,NULL),('phabricator:20131118.ownerorder.php',1556231691,NULL),('phabricator:20131119.passphrase.sql',1556231691,NULL),('phabricator:20131120.nuancesourcetype.sql',1556231691,NULL),('phabricator:20131121.passphraseedge.sql',1556231691,NULL),('phabricator:20131121.repocredentials.1.col.sql',1556231691,NULL),('phabricator:20131121.repocredentials.2.mig.php',1556231691,NULL),('phabricator:20131122.repomirror.sql',1556231691,NULL),('phabricator:20131123.drydockblueprintpolicy.sql',1556231691,NULL),('phabricator:20131129.drydockresourceblueprint.sql',1556231691,NULL),('phabricator:20131204.pushlog.sql',1556231691,NULL),('phabricator:20131205.buildsteporder.sql',1556231691,NULL),('phabricator:20131205.buildstepordermig.php',1556231691,NULL),('phabricator:20131205.buildtargets.sql',1556231691,NULL),('phabricator:20131206.phragment.sql',1556231691,NULL),('phabricator:20131206.phragmentnull.sql',1556231691,NULL),('phabricator:20131208.phragmentsnapshot.sql',1556231691,NULL),('phabricator:20131211.phragmentedges.sql',1556231691,NULL),('phabricator:20131217.pushlogphid.1.col.sql',1556231691,NULL),('phabricator:20131217.pushlogphid.2.mig.php',1556231691,NULL),('phabricator:20131217.pushlogphid.3.key.sql',1556231692,NULL),('phabricator:20131219.pxdrop.sql',1556231692,NULL),('phabricator:20131224.harbormanual.sql',1556231692,NULL),('phabricator:20131227.heraldobject.sql',1556231692,NULL),('phabricator:20131231.dropshortcut.sql',1556231692,NULL),('phabricator:20131302.maniphestvalue.sql',1556231689,NULL),('phabricator:20140104.harbormastercmd.sql',1556231692,NULL),('phabricator:20140106.macromailkey.1.sql',1556231692,NULL),('phabricator:20140106.macromailkey.2.php',1556231692,NULL),('phabricator:20140108.ddbpname.1.sql',1556231692,NULL),('phabricator:20140108.ddbpname.2.php',1556231692,NULL),('phabricator:20140109.ddxactions.sql',1556231692,NULL),('phabricator:20140109.projectcolumnsdates.sql',1556231692,NULL),('phabricator:20140113.legalpadsig.1.sql',1556231692,NULL),('phabricator:20140113.legalpadsig.2.php',1556231692,NULL),('phabricator:20140115.auth.1.id.sql',1556231692,NULL),('phabricator:20140115.auth.2.expires.sql',1556231692,NULL),('phabricator:20140115.auth.3.unlimit.php',1556231692,NULL),('phabricator:20140115.legalpadsigkey.sql',1556231692,NULL),('phabricator:20140116.reporefcursor.sql',1556231692,NULL),('phabricator:20140126.diff.1.parentrevisionid.sql',1556231692,NULL),('phabricator:20140126.diff.2.repositoryphid.sql',1556231692,NULL),('phabricator:20140130.dash.1.board.sql',1556231692,NULL),('phabricator:20140130.dash.2.panel.sql',1556231692,NULL),('phabricator:20140130.dash.3.boardxaction.sql',1556231692,NULL),('phabricator:20140130.dash.4.panelxaction.sql',1556231692,NULL),('phabricator:20140130.mail.1.retry.sql',1556231692,NULL),('phabricator:20140130.mail.2.next.sql',1556231692,NULL),('phabricator:20140201.gc.1.mailsent.sql',1556231692,NULL),('phabricator:20140201.gc.2.mailreceived.sql',1556231692,NULL),('phabricator:20140205.cal.1.rename.sql',1556231692,NULL),('phabricator:20140205.cal.2.phid-col.sql',1556231692,NULL),('phabricator:20140205.cal.3.phid-mig.php',1556231692,NULL),('phabricator:20140205.cal.4.phid-key.sql',1556231692,NULL),('phabricator:20140210.herald.rule-condition-mig.php',1556231692,NULL),('phabricator:20140210.projcfield.1.blurb.php',1556231692,NULL),('phabricator:20140210.projcfield.2.piccol.sql',1556231692,NULL),('phabricator:20140210.projcfield.3.picmig.sql',1556231692,NULL),('phabricator:20140210.projcfield.4.memmig.sql',1556231692,NULL),('phabricator:20140210.projcfield.5.dropprofile.sql',1556231692,NULL),('phabricator:20140211.dx.1.nullablechangesetid.sql',1556231692,NULL),('phabricator:20140211.dx.2.migcommenttext.php',1556231692,NULL),('phabricator:20140211.dx.3.migsubscriptions.sql',1556231692,NULL),('phabricator:20140211.dx.999.drop.relationships.sql',1556231692,NULL),('phabricator:20140212.dx.1.armageddon.php',1556231692,NULL),('phabricator:20140214.clean.1.legacycommentid.sql',1556231692,NULL),('phabricator:20140214.clean.2.dropcomment.sql',1556231692,NULL),('phabricator:20140214.clean.3.dropinline.sql',1556231692,NULL),('phabricator:20140218.differentialdraft.sql',1556231692,NULL),('phabricator:20140218.passwords.1.extend.sql',1556231692,NULL),('phabricator:20140218.passwords.2.prefix.sql',1556231692,NULL),('phabricator:20140218.passwords.3.vcsextend.sql',1556231692,NULL),('phabricator:20140218.passwords.4.vcs.php',1556231692,NULL),('phabricator:20140223.bigutf8scratch.sql',1556231692,NULL),('phabricator:20140224.dxclean.1.datecommitted.sql',1556231692,NULL),('phabricator:20140226.dxcustom.1.fielddata.php',1556231692,NULL),('phabricator:20140226.dxcustom.99.drop.sql',1556231692,NULL),('phabricator:20140228.dxcomment.1.sql',1556231692,NULL),('phabricator:20140305.diviner.1.slugcol.sql',1556231692,NULL),('phabricator:20140305.diviner.2.slugkey.sql',1556231692,NULL),('phabricator:20140311.mdroplegacy.sql',1556231692,NULL),('phabricator:20140314.projectcolumn.1.statuscol.sql',1556231692,NULL),('phabricator:20140314.projectcolumn.2.statuskey.sql',1556231692,NULL),('phabricator:20140317.mupdatedkey.sql',1556231692,NULL),('phabricator:20140321.harbor.1.bxaction.sql',1556231692,NULL),('phabricator:20140321.mstatus.1.col.sql',1556231692,NULL),('phabricator:20140321.mstatus.2.mig.php',1556231692,NULL),('phabricator:20140323.harbor.1.renames.php',1556231692,NULL),('phabricator:20140323.harbor.2.message.sql',1556231692,NULL),('phabricator:20140325.push.1.event.sql',1556231692,NULL),('phabricator:20140325.push.2.eventphid.sql',1556231692,NULL),('phabricator:20140325.push.3.groups.php',1556231692,NULL),('phabricator:20140325.push.4.prune.sql',1556231692,NULL),('phabricator:20140326.project.1.colxaction.sql',1556231692,NULL),('phabricator:20140328.releeph.1.productxaction.sql',1556231692,NULL),('phabricator:20140330.flagtext.sql',1556231692,NULL),('phabricator:20140402.actionlog.sql',1556231692,NULL),('phabricator:20140410.accountsecret.1.sql',1556231692,NULL),('phabricator:20140410.accountsecret.2.php',1556231692,NULL),('phabricator:20140416.harbor.1.sql',1556231692,NULL),('phabricator:20140420.rel.1.objectphid.sql',1556231692,NULL),('phabricator:20140420.rel.2.objectmig.php',1556231692,NULL),('phabricator:20140421.slowvotecolumnsisclosed.sql',1556231692,NULL),('phabricator:20140423.session.1.hisec.sql',1556231692,NULL),('phabricator:20140427.mfactor.1.sql',1556231692,NULL),('phabricator:20140430.auth.1.partial.sql',1556231692,NULL),('phabricator:20140430.dash.1.paneltype.sql',1556231692,NULL),('phabricator:20140430.dash.2.edge.sql',1556231692,NULL),('phabricator:20140501.passphraselockcredential.sql',1556231692,NULL),('phabricator:20140501.remove.1.dlog.sql',1556231692,NULL),('phabricator:20140507.smstable.sql',1556231692,NULL),('phabricator:20140509.coverage.1.sql',1556231692,NULL),('phabricator:20140509.dashboardlayoutconfig.sql',1556231692,NULL),('phabricator:20140512.dparents.1.sql',1556231692,NULL),('phabricator:20140514.harbormasterbuildabletransaction.sql',1556231692,NULL),('phabricator:20140514.pholiomockclose.sql',1556231692,NULL),('phabricator:20140515.trust-emails.sql',1556231692,NULL),('phabricator:20140517.dxbinarycache.sql',1556231692,NULL),('phabricator:20140518.dxmorebinarycache.sql',1556231693,NULL),('phabricator:20140519.dashboardinstall.sql',1556231693,NULL),('phabricator:20140520.authtemptoken.sql',1556231693,NULL),('phabricator:20140521.projectslug.1.create.sql',1556231693,NULL),('phabricator:20140521.projectslug.2.mig.php',1556231693,NULL),('phabricator:20140522.projecticon.sql',1556231693,NULL),('phabricator:20140524.auth.mfa.cache.sql',1556231693,NULL),('phabricator:20140525.hunkmodern.sql',1556231693,NULL),('phabricator:20140615.pholioedit.1.sql',1556231693,NULL),('phabricator:20140615.pholioedit.2.sql',1556231693,NULL),('phabricator:20140617.daemon.explicit-argv.sql',1556231693,NULL),('phabricator:20140617.daemonlog.sql',1556231693,NULL),('phabricator:20140624.projcolor.1.sql',1556231693,NULL),('phabricator:20140624.projcolor.2.sql',1556231693,NULL),('phabricator:20140629.dasharchive.1.sql',1556231693,NULL),('phabricator:20140629.legalsig.1.sql',1556231693,NULL),('phabricator:20140629.legalsig.2.php',1556231693,NULL),('phabricator:20140701.legalexemption.1.sql',1556231693,NULL),('phabricator:20140701.legalexemption.2.sql',1556231693,NULL),('phabricator:20140703.legalcorp.1.sql',1556231693,NULL),('phabricator:20140703.legalcorp.2.sql',1556231693,NULL),('phabricator:20140703.legalcorp.3.sql',1556231693,NULL),('phabricator:20140703.legalcorp.4.sql',1556231693,NULL),('phabricator:20140703.legalcorp.5.sql',1556231693,NULL),('phabricator:20140704.harbormasterstep.1.sql',1556231693,NULL),('phabricator:20140704.harbormasterstep.2.sql',1556231693,NULL),('phabricator:20140704.legalpreamble.1.sql',1556231693,NULL),('phabricator:20140706.harbormasterdepend.1.php',1556231693,NULL),('phabricator:20140706.pedge.1.sql',1556231693,NULL),('phabricator:20140711.pnames.1.sql',1556231693,NULL),('phabricator:20140711.pnames.2.php',1556231693,NULL),('phabricator:20140711.workerpriority.sql',1556231693,NULL),('phabricator:20140712.projcoluniq.sql',1556231693,NULL),('phabricator:20140721.phortune.1.cart.sql',1556231693,NULL),('phabricator:20140721.phortune.2.purchase.sql',1556231693,NULL),('phabricator:20140721.phortune.3.charge.sql',1556231693,NULL),('phabricator:20140721.phortune.4.cartstatus.sql',1556231693,NULL),('phabricator:20140721.phortune.5.cstatusdefault.sql',1556231693,NULL),('phabricator:20140721.phortune.6.onetimecharge.sql',1556231693,NULL),('phabricator:20140721.phortune.7.nullmethod.sql',1556231693,NULL),('phabricator:20140722.appname.php',1556231693,NULL),('phabricator:20140722.audit.1.xactions.sql',1556231693,NULL),('phabricator:20140722.audit.2.comments.sql',1556231693,NULL),('phabricator:20140722.audit.3.miginlines.php',1556231693,NULL),('phabricator:20140722.audit.4.migtext.php',1556231693,NULL),('phabricator:20140722.renameauth.php',1556231693,NULL),('phabricator:20140723.apprenamexaction.sql',1556231693,NULL),('phabricator:20140725.audit.1.migxactions.php',1556231693,NULL),('phabricator:20140731.audit.1.subscribers.php',1556231693,NULL),('phabricator:20140731.cancdn.php',1556231693,NULL),('phabricator:20140731.harbormasterstepdesc.sql',1556231693,NULL),('phabricator:20140805.boardcol.1.sql',1556231693,NULL),('phabricator:20140805.boardcol.2.php',1556231693,NULL),('phabricator:20140807.harbormastertargettime.sql',1556231693,NULL),('phabricator:20140808.boardprop.1.sql',1556231693,NULL),('phabricator:20140808.boardprop.2.sql',1556231693,NULL),('phabricator:20140808.boardprop.3.php',1556231693,NULL),('phabricator:20140811.blob.1.sql',1556231693,NULL),('phabricator:20140811.blob.2.sql',1556231693,NULL),('phabricator:20140812.projkey.1.sql',1556231693,NULL),('phabricator:20140812.projkey.2.sql',1556231693,NULL),('phabricator:20140814.passphrasecredentialconduit.sql',1556231693,NULL),('phabricator:20140815.cancdncase.php',1556231693,NULL),('phabricator:20140818.harbormasterindex.1.sql',1556231693,NULL),('phabricator:20140821.harbormasterbuildgen.1.sql',1556231693,NULL),('phabricator:20140822.daemonenvhash.sql',1556231693,NULL),('phabricator:20140902.almanacdevice.1.sql',1556231693,NULL),('phabricator:20140904.macroattach.php',1556231693,NULL),('phabricator:20140911.fund.1.initiative.sql',1556231693,NULL),('phabricator:20140911.fund.2.xaction.sql',1556231693,NULL),('phabricator:20140911.fund.3.edge.sql',1556231693,NULL),('phabricator:20140911.fund.4.backer.sql',1556231693,NULL),('phabricator:20140911.fund.5.backxaction.sql',1556231693,NULL),('phabricator:20140914.betaproto.php',1556231693,NULL),('phabricator:20140917.project.canlock.sql',1556231693,NULL),('phabricator:20140918.schema.1.dropaudit.sql',1556231693,NULL),('phabricator:20140918.schema.2.dropauditinline.sql',1556231693,NULL),('phabricator:20140918.schema.3.wipecache.sql',1556231693,NULL),('phabricator:20140918.schema.4.cachetype.sql',1556231693,NULL),('phabricator:20140918.schema.5.slowvote.sql',1556231693,NULL),('phabricator:20140919.schema.01.calstatus.sql',1556231693,NULL),('phabricator:20140919.schema.02.calname.sql',1556231693,NULL),('phabricator:20140919.schema.03.dropaux.sql',1556231693,NULL),('phabricator:20140919.schema.04.droptaskproj.sql',1556231693,NULL),('phabricator:20140926.schema.01.droprelev.sql',1556231693,NULL),('phabricator:20140926.schema.02.droprelreqev.sql',1556231693,NULL),('phabricator:20140926.schema.03.dropldapinfo.sql',1556231693,NULL),('phabricator:20140926.schema.04.dropoauthinfo.sql',1556231693,NULL),('phabricator:20140926.schema.05.dropprojaffil.sql',1556231693,NULL),('phabricator:20140926.schema.06.dropsubproject.sql',1556231693,NULL),('phabricator:20140926.schema.07.droppondcom.sql',1556231693,NULL),('phabricator:20140927.schema.01.dropsearchq.sql',1556231693,NULL),('phabricator:20140927.schema.02.pholio1.sql',1556231693,NULL),('phabricator:20140927.schema.03.pholio2.sql',1556231693,NULL),('phabricator:20140927.schema.04.pholio3.sql',1556231693,NULL),('phabricator:20140927.schema.05.phragment1.sql',1556231693,NULL),('phabricator:20140927.schema.06.releeph1.sql',1556231693,NULL),('phabricator:20141001.schema.01.version.sql',1556231693,NULL),('phabricator:20141001.schema.02.taskmail.sql',1556231693,NULL),('phabricator:20141002.schema.01.liskcounter.sql',1556231693,NULL),('phabricator:20141002.schema.02.draftnull.sql',1556231693,NULL),('phabricator:20141004.currency.01.sql',1556231693,NULL),('phabricator:20141004.currency.02.sql',1556231693,NULL),('phabricator:20141004.currency.03.sql',1556231693,NULL),('phabricator:20141004.currency.04.sql',1556231693,NULL),('phabricator:20141004.currency.05.sql',1556231693,NULL),('phabricator:20141004.currency.06.sql',1556231693,NULL),('phabricator:20141004.harborliskcounter.sql',1556231693,NULL),('phabricator:20141005.phortuneproduct.sql',1556231694,NULL),('phabricator:20141006.phortunecart.sql',1556231694,NULL),('phabricator:20141006.phortunemerchant.sql',1556231694,NULL),('phabricator:20141006.phortunemerchantx.sql',1556231694,NULL),('phabricator:20141007.fundmerchant.sql',1556231694,NULL),('phabricator:20141007.fundrisks.sql',1556231694,NULL),('phabricator:20141007.fundtotal.sql',1556231694,NULL),('phabricator:20141007.phortunecartmerchant.sql',1556231694,NULL),('phabricator:20141007.phortunecharge.sql',1556231694,NULL),('phabricator:20141007.phortunepayment.sql',1556231694,NULL),('phabricator:20141007.phortuneprovider.sql',1556231694,NULL),('phabricator:20141007.phortuneproviderx.sql',1556231694,NULL),('phabricator:20141008.phortunemerchdesc.sql',1556231694,NULL),('phabricator:20141008.phortuneprovdis.sql',1556231694,NULL),('phabricator:20141008.phortunerefund.sql',1556231694,NULL),('phabricator:20141010.fundmailkey.sql',1556231694,NULL),('phabricator:20141011.phortunemerchedit.sql',1556231694,NULL),('phabricator:20141012.phortunecartxaction.sql',1556231694,NULL),('phabricator:20141013.phortunecartkey.sql',1556231694,NULL),('phabricator:20141016.almanac.device.sql',1556231694,NULL),('phabricator:20141016.almanac.dxaction.sql',1556231694,NULL),('phabricator:20141016.almanac.interface.sql',1556231694,NULL),('phabricator:20141016.almanac.network.sql',1556231694,NULL),('phabricator:20141016.almanac.nxaction.sql',1556231694,NULL),('phabricator:20141016.almanac.service.sql',1556231694,NULL),('phabricator:20141016.almanac.sxaction.sql',1556231694,NULL),('phabricator:20141017.almanac.binding.sql',1556231694,NULL),('phabricator:20141017.almanac.bxaction.sql',1556231694,NULL),('phabricator:20141025.phriction.1.xaction.sql',1556231694,NULL),('phabricator:20141025.phriction.2.xaction.sql',1556231694,NULL),('phabricator:20141025.phriction.mailkey.sql',1556231694,NULL),('phabricator:20141103.almanac.1.delprop.sql',1556231694,NULL),('phabricator:20141103.almanac.2.addprop.sql',1556231694,NULL),('phabricator:20141104.almanac.3.edge.sql',1556231694,NULL),('phabricator:20141105.ssh.1.rename.sql',1556231694,NULL),('phabricator:20141106.dropold.sql',1556231694,NULL),('phabricator:20141106.uniqdrafts.php',1556231694,NULL),('phabricator:20141107.phriction.policy.1.sql',1556231694,NULL),('phabricator:20141107.phriction.policy.2.php',1556231694,NULL),('phabricator:20141107.phriction.popkeys.php',1556231694,NULL),('phabricator:20141107.ssh.1.colname.sql',1556231694,NULL),('phabricator:20141107.ssh.2.keyhash.sql',1556231694,NULL),('phabricator:20141107.ssh.3.keyindex.sql',1556231694,NULL),('phabricator:20141107.ssh.4.keymig.php',1556231694,NULL),('phabricator:20141107.ssh.5.indexnull.sql',1556231694,NULL),('phabricator:20141107.ssh.6.indexkey.sql',1556231694,NULL),('phabricator:20141107.ssh.7.colnull.sql',1556231694,NULL),('phabricator:20141113.auditdupes.php',1556231694,NULL),('phabricator:20141118.diffxaction.sql',1556231694,NULL),('phabricator:20141119.commitpedge.sql',1556231694,NULL),('phabricator:20141119.differential.diff.policy.sql',1556231694,NULL),('phabricator:20141119.sshtrust.sql',1556231694,NULL),('phabricator:20141123.taskpriority.1.sql',1556231694,NULL),('phabricator:20141123.taskpriority.2.sql',1556231694,NULL),('phabricator:20141210.maniphestsubscribersmig.1.sql',1556231694,NULL),('phabricator:20141210.maniphestsubscribersmig.2.sql',1556231694,NULL),('phabricator:20141210.reposervice.sql',1556231694,NULL),('phabricator:20141212.conduittoken.sql',1556231694,NULL),('phabricator:20141215.almanacservicetype.sql',1556231694,NULL),('phabricator:20141217.almanacdevicelock.sql',1556231694,NULL),('phabricator:20141217.almanaclock.sql',1556231694,NULL),('phabricator:20141218.maniphestcctxn.php',1556231694,NULL),('phabricator:20141222.maniphestprojtxn.php',1556231694,NULL),('phabricator:20141223.daemonloguser.sql',1556231694,NULL),('phabricator:20141223.daemonobjectphid.sql',1556231694,NULL),('phabricator:20141230.pasteeditpolicycolumn.sql',1556231694,NULL),('phabricator:20141230.pasteeditpolicyexisting.sql',1556231694,NULL),('phabricator:20150102.policyname.php',1556231694,NULL),('phabricator:20150102.tasksubscriber.sql',1556231694,NULL),('phabricator:20150105.conpsearch.sql',1556231694,NULL),('phabricator:20150114.oauthserver.client.policy.sql',1556231694,NULL),('phabricator:20150115.applicationemails.sql',1556231694,NULL),('phabricator:20150115.trigger.1.sql',1556231694,NULL),('phabricator:20150115.trigger.2.sql',1556231694,NULL),('phabricator:20150116.maniphestapplicationemails.php',1556231694,NULL),('phabricator:20150120.maniphestdefaultauthor.php',1556231694,NULL),('phabricator:20150124.subs.1.sql',1556231694,NULL),('phabricator:20150129.pastefileapplicationemails.php',1556231694,NULL),('phabricator:20150130.phortune.1.subphid.sql',1556231694,NULL),('phabricator:20150130.phortune.2.subkey.sql',1556231695,NULL),('phabricator:20150131.phortune.1.defaultpayment.sql',1556231695,NULL),('phabricator:20150205.authprovider.autologin.sql',1556231695,NULL),('phabricator:20150205.daemonenv.sql',1556231695,NULL),('phabricator:20150209.invite.sql',1556231695,NULL),('phabricator:20150209.oauthclient.trust.sql',1556231695,NULL),('phabricator:20150210.invitephid.sql',1556231695,NULL),('phabricator:20150212.legalpad.session.1.sql',1556231695,NULL),('phabricator:20150212.legalpad.session.2.sql',1556231695,NULL),('phabricator:20150219.scratch.nonmutable.sql',1556231695,NULL),('phabricator:20150223.daemon.1.id.sql',1556231695,NULL),('phabricator:20150223.daemon.2.idlegacy.sql',1556231695,NULL),('phabricator:20150223.daemon.3.idkey.sql',1556231695,NULL),('phabricator:20150312.filechunk.1.sql',1556231695,NULL),('phabricator:20150312.filechunk.2.sql',1556231695,NULL),('phabricator:20150312.filechunk.3.sql',1556231695,NULL),('phabricator:20150317.conpherence.isroom.1.sql',1556231695,NULL),('phabricator:20150317.conpherence.isroom.2.sql',1556231695,NULL),('phabricator:20150317.conpherence.policy.sql',1556231695,NULL),('phabricator:20150410.nukeruleedit.sql',1556231695,NULL),('phabricator:20150420.invoice.1.sql',1556231695,NULL),('phabricator:20150420.invoice.2.sql',1556231695,NULL),('phabricator:20150425.isclosed.sql',1556231695,NULL),('phabricator:20150427.calendar.1.edge.sql',1556231695,NULL),('phabricator:20150427.calendar.1.xaction.sql',1556231695,NULL),('phabricator:20150427.calendar.2.xaction.sql',1556231695,NULL),('phabricator:20150428.calendar.1.iscancelled.sql',1556231695,NULL),('phabricator:20150428.calendar.1.name.sql',1556231695,NULL),('phabricator:20150429.calendar.1.invitee.sql',1556231695,NULL),('phabricator:20150430.calendar.1.policies.sql',1556231695,NULL),('phabricator:20150430.multimeter.1.sql',1556231695,NULL),('phabricator:20150430.multimeter.2.host.sql',1556231695,NULL),('phabricator:20150430.multimeter.3.viewer.sql',1556231695,NULL),('phabricator:20150430.multimeter.4.context.sql',1556231695,NULL),('phabricator:20150430.multimeter.5.label.sql',1556231695,NULL),('phabricator:20150501.calendar.1.reply.sql',1556231695,NULL),('phabricator:20150501.calendar.2.reply.php',1556231695,NULL),('phabricator:20150501.conpherencepics.sql',1556231695,NULL),('phabricator:20150503.repositorysymbols.1.sql',1556231695,NULL),('phabricator:20150503.repositorysymbols.2.php',1556231695,NULL),('phabricator:20150503.repositorysymbols.3.sql',1556231695,NULL),('phabricator:20150504.symbolsproject.1.php',1556231695,NULL),('phabricator:20150504.symbolsproject.2.sql',1556231695,NULL),('phabricator:20150506.calendarunnamedevents.1.php',1556231695,NULL),('phabricator:20150507.calendar.1.isallday.sql',1556231695,NULL),('phabricator:20150513.user.cache.1.sql',1556231695,NULL),('phabricator:20150514.calendar.status.sql',1556231695,NULL),('phabricator:20150514.phame.blog.xaction.sql',1556231695,NULL),('phabricator:20150514.user.cache.2.sql',1556231695,NULL),('phabricator:20150515.phame.post.xaction.sql',1556231695,NULL),('phabricator:20150515.project.mailkey.1.sql',1556231695,NULL),('phabricator:20150515.project.mailkey.2.php',1556231695,NULL),('phabricator:20150519.calendar.calendaricon.sql',1556231695,NULL),('phabricator:20150521.releephrepository.sql',1556231695,NULL),('phabricator:20150525.diff.hidden.1.sql',1556231695,NULL),('phabricator:20150526.owners.mailkey.1.sql',1556231695,NULL),('phabricator:20150526.owners.mailkey.2.php',1556231695,NULL),('phabricator:20150526.owners.xaction.sql',1556231695,NULL),('phabricator:20150527.calendar.recurringevents.sql',1556231695,NULL),('phabricator:20150601.spaces.1.namespace.sql',1556231695,NULL),('phabricator:20150601.spaces.2.xaction.sql',1556231695,NULL),('phabricator:20150602.mlist.1.sql',1556231695,NULL),('phabricator:20150602.mlist.2.php',1556231695,NULL),('phabricator:20150604.spaces.1.sql',1556231695,NULL),('phabricator:20150605.diviner.edges.sql',1556231695,NULL),('phabricator:20150605.diviner.editPolicy.sql',1556231695,NULL),('phabricator:20150605.diviner.xaction.sql',1556231695,NULL),('phabricator:20150606.mlist.1.php',1556231695,NULL),('phabricator:20150609.inline.sql',1556231695,NULL),('phabricator:20150609.spaces.1.pholio.sql',1556231695,NULL),('phabricator:20150609.spaces.2.maniphest.sql',1556231695,NULL),('phabricator:20150610.spaces.1.desc.sql',1556231695,NULL),('phabricator:20150610.spaces.2.edge.sql',1556231695,NULL),('phabricator:20150610.spaces.3.archive.sql',1556231695,NULL),('phabricator:20150611.spaces.1.mailxaction.sql',1556231695,NULL),('phabricator:20150611.spaces.2.appmail.sql',1556231695,NULL),('phabricator:20150616.divinerrepository.sql',1556231695,NULL),('phabricator:20150617.harbor.1.lint.sql',1556231695,NULL),('phabricator:20150617.harbor.2.unit.sql',1556231695,NULL),('phabricator:20150618.harbor.1.planauto.sql',1556231695,NULL),('phabricator:20150618.harbor.2.stepauto.sql',1556231695,NULL),('phabricator:20150618.harbor.3.buildauto.sql',1556231695,NULL),('phabricator:20150619.conpherencerooms.1.sql',1556231695,NULL),('phabricator:20150619.conpherencerooms.2.sql',1556231695,NULL),('phabricator:20150619.conpherencerooms.3.sql',1556231695,NULL),('phabricator:20150621.phrase.1.sql',1556231695,NULL),('phabricator:20150621.phrase.2.sql',1556231695,NULL),('phabricator:20150622.bulk.1.job.sql',1556231695,NULL),('phabricator:20150622.bulk.2.task.sql',1556231695,NULL),('phabricator:20150622.bulk.3.xaction.sql',1556231695,NULL),('phabricator:20150622.bulk.4.edge.sql',1556231696,NULL),('phabricator:20150622.metamta.1.phid-col.sql',1556231696,NULL),('phabricator:20150622.metamta.2.phid-mig.php',1556231696,NULL),('phabricator:20150622.metamta.3.phid-key.sql',1556231696,NULL),('phabricator:20150622.metamta.4.actor-phid-col.sql',1556231696,NULL),('phabricator:20150622.metamta.5.actor-phid-mig.php',1556231696,NULL),('phabricator:20150622.metamta.6.actor-phid-key.sql',1556231696,NULL),('phabricator:20150624.spaces.1.repo.sql',1556231696,NULL),('phabricator:20150626.spaces.1.calendar.sql',1556231696,NULL),('phabricator:20150630.herald.1.sql',1556231696,NULL),('phabricator:20150630.herald.2.sql',1556231696,NULL),('phabricator:20150701.herald.1.sql',1556231696,NULL),('phabricator:20150701.herald.2.sql',1556231696,NULL),('phabricator:20150702.spaces.1.slowvote.sql',1556231696,NULL),('phabricator:20150706.herald.1.sql',1556231696,NULL),('phabricator:20150707.herald.1.sql',1556231696,NULL),('phabricator:20150708.arcanistproject.sql',1556231696,NULL),('phabricator:20150708.herald.1.sql',1556231696,NULL),('phabricator:20150708.herald.2.sql',1556231696,NULL),('phabricator:20150708.herald.3.sql',1556231696,NULL),('phabricator:20150712.badges.1.sql',1556231696,NULL),('phabricator:20150714.spaces.countdown.1.sql',1556231696,NULL),('phabricator:20150717.herald.1.sql',1556231696,NULL),('phabricator:20150719.countdown.1.sql',1556231696,NULL),('phabricator:20150719.countdown.2.sql',1556231696,NULL),('phabricator:20150719.countdown.3.sql',1556231696,NULL),('phabricator:20150721.phurl.1.url.sql',1556231696,NULL),('phabricator:20150721.phurl.2.xaction.sql',1556231696,NULL),('phabricator:20150721.phurl.3.xactioncomment.sql',1556231696,NULL),('phabricator:20150721.phurl.4.url.sql',1556231696,NULL),('phabricator:20150721.phurl.5.edge.sql',1556231696,NULL),('phabricator:20150721.phurl.6.alias.sql',1556231696,NULL),('phabricator:20150721.phurl.7.authorphid.sql',1556231696,NULL),('phabricator:20150722.dashboard.1.sql',1556231696,NULL),('phabricator:20150722.dashboard.2.sql',1556231696,NULL),('phabricator:20150723.countdown.1.sql',1556231696,NULL),('phabricator:20150724.badges.comments.1.sql',1556231696,NULL),('phabricator:20150724.countdown.comments.1.sql',1556231696,NULL),('phabricator:20150725.badges.mailkey.1.sql',1556231696,NULL),('phabricator:20150725.badges.mailkey.2.php',1556231696,NULL),('phabricator:20150725.badges.viewpolicy.3.sql',1556231696,NULL),('phabricator:20150725.countdown.mailkey.1.sql',1556231696,NULL),('phabricator:20150725.countdown.mailkey.2.php',1556231696,NULL),('phabricator:20150725.slowvote.mailkey.1.sql',1556231696,NULL),('phabricator:20150725.slowvote.mailkey.2.php',1556231696,NULL),('phabricator:20150727.heraldaction.1.sql',1556231696,NULL),('phabricator:20150730.herald.1.sql',1556231696,NULL),('phabricator:20150730.herald.2.sql',1556231696,NULL),('phabricator:20150730.herald.3.sql',1556231696,NULL),('phabricator:20150730.herald.4.sql',1556231696,NULL),('phabricator:20150730.herald.5.sql',1556231696,NULL),('phabricator:20150730.herald.6.sql',1556231696,NULL),('phabricator:20150730.herald.7.sql',1556231696,NULL),('phabricator:20150803.herald.1.sql',1556231696,NULL),('phabricator:20150803.herald.2.sql',1556231696,NULL),('phabricator:20150804.ponder.answer.mailkey.1.sql',1556231696,NULL),('phabricator:20150804.ponder.answer.mailkey.2.php',1556231696,NULL),('phabricator:20150804.ponder.question.1.sql',1556231696,NULL),('phabricator:20150804.ponder.question.2.sql',1556231696,NULL),('phabricator:20150804.ponder.question.3.sql',1556231696,NULL),('phabricator:20150804.ponder.spaces.4.sql',1556231696,NULL),('phabricator:20150805.paste.status.1.sql',1556231696,NULL),('phabricator:20150805.paste.status.2.sql',1556231696,NULL),('phabricator:20150806.ponder.answer.1.sql',1556231696,NULL),('phabricator:20150806.ponder.editpolicy.2.sql',1556231696,NULL),('phabricator:20150806.ponder.status.1.sql',1556231696,NULL),('phabricator:20150806.ponder.status.2.sql',1556231696,NULL),('phabricator:20150806.ponder.status.3.sql',1556231696,NULL),('phabricator:20150808.ponder.vote.1.sql',1556231696,NULL),('phabricator:20150808.ponder.vote.2.sql',1556231696,NULL),('phabricator:20150812.ponder.answer.1.sql',1556231696,NULL),('phabricator:20150812.ponder.answer.2.sql',1556231696,NULL),('phabricator:20150814.harbormater.artifact.phid.sql',1556231696,NULL),('phabricator:20150815.owners.status.1.sql',1556231696,NULL),('phabricator:20150815.owners.status.2.sql',1556231696,NULL),('phabricator:20150823.nuance.queue.1.sql',1556231696,NULL),('phabricator:20150823.nuance.queue.2.sql',1556231696,NULL),('phabricator:20150823.nuance.queue.3.sql',1556231696,NULL),('phabricator:20150823.nuance.queue.4.sql',1556231696,NULL),('phabricator:20150828.ponder.wiki.1.sql',1556231696,NULL),('phabricator:20150829.ponder.dupe.1.sql',1556231696,NULL),('phabricator:20150904.herald.1.sql',1556231696,NULL),('phabricator:20150906.mailinglist.sql',1556231696,NULL),('phabricator:20150910.owners.custom.1.sql',1556231696,NULL),('phabricator:20150916.drydock.slotlocks.1.sql',1556231696,NULL),('phabricator:20150922.drydock.commands.1.sql',1556231696,NULL),('phabricator:20150923.drydock.resourceid.1.sql',1556231696,NULL),('phabricator:20150923.drydock.resourceid.2.sql',1556231696,NULL),('phabricator:20150923.drydock.resourceid.3.sql',1556231696,NULL),('phabricator:20150923.drydock.taskid.1.sql',1556231696,NULL),('phabricator:20150924.drydock.disable.1.sql',1556231696,NULL),('phabricator:20150924.drydock.status.1.sql',1556231696,NULL),('phabricator:20150928.drydock.rexpire.1.sql',1556231696,NULL),('phabricator:20150930.drydock.log.1.sql',1556231696,NULL),('phabricator:20151001.drydock.rname.1.sql',1556231696,NULL),('phabricator:20151002.dashboard.status.1.sql',1556231696,NULL),('phabricator:20151002.harbormaster.bparam.1.sql',1556231696,NULL),('phabricator:20151009.drydock.auth.1.sql',1556231696,NULL),('phabricator:20151010.drydock.auth.2.sql',1556231696,NULL),('phabricator:20151013.drydock.op.1.sql',1556231696,NULL),('phabricator:20151023.harborpolicy.1.sql',1556231696,NULL),('phabricator:20151023.harborpolicy.2.php',1556231696,NULL),('phabricator:20151023.patchduration.sql',1556231697,141072),('phabricator:20151030.harbormaster.initiator.sql',1556231697,14355),('phabricator:20151106.editengine.1.table.sql',1556231697,7000),('phabricator:20151106.editengine.2.xactions.sql',1556231697,6327),('phabricator:20151106.phame.post.mailkey.1.sql',1556231697,13453),('phabricator:20151106.phame.post.mailkey.2.php',1556231697,1570),('phabricator:20151107.phame.blog.mailkey.1.sql',1556231697,11087),('phabricator:20151107.phame.blog.mailkey.2.php',1556231697,970),('phabricator:20151108.phame.blog.joinpolicy.sql',1556231697,11189),('phabricator:20151108.xhpast.stderr.sql',1556231697,18926),('phabricator:20151109.phame.post.comments.1.sql',1556231697,7158),('phabricator:20151109.repository.coverage.1.sql',1556231697,1260),('phabricator:20151109.xhpast.db.1.sql',1556231697,3950),('phabricator:20151109.xhpast.db.2.sql',1556231697,1156),('phabricator:20151110.daemonenvhash.sql',1556231697,24270),('phabricator:20151111.phame.blog.archive.1.sql',1556231697,11808),('phabricator:20151111.phame.blog.archive.2.sql',1556231697,570),('phabricator:20151112.herald.edge.sql',1556231697,10237),('phabricator:20151116.owners.edge.sql',1556231697,10178),('phabricator:20151128.phame.blog.picture.1.sql',1556231697,12092),('phabricator:20151130.phurl.mailkey.1.sql',1556231697,9727),('phabricator:20151130.phurl.mailkey.2.php',1556231697,1287),('phabricator:20151202.versioneddraft.1.sql',1556231697,5191),('phabricator:20151207.editengine.1.sql',1556231697,48281),('phabricator:20151210.land.1.refphid.sql',1556231697,9677),('phabricator:20151210.land.2.refphid.php',1556231697,629),('phabricator:20151215.phame.1.autotitle.sql',1556231697,20604),('phabricator:20151218.key.1.keyphid.sql',1556231697,13167),('phabricator:20151218.key.2.keyphid.php',1556231697,423),('phabricator:20151219.proj.01.prislug.sql',1556231697,13742),('phabricator:20151219.proj.02.prislugkey.sql',1556231697,8362),('phabricator:20151219.proj.03.copyslug.sql',1556231697,517),('phabricator:20151219.proj.04.dropslugkey.sql',1556231697,6993),('phabricator:20151219.proj.05.dropslug.sql',1556231697,14034),('phabricator:20151219.proj.06.defaultpolicy.php',1556231697,1187),('phabricator:20151219.proj.07.viewnull.sql',1556231697,17899),('phabricator:20151219.proj.08.editnull.sql',1556231697,17020),('phabricator:20151219.proj.09.joinnull.sql',1556231697,17501),('phabricator:20151219.proj.10.subcolumns.sql',1556231697,77351),('phabricator:20151219.proj.11.subprojectphids.sql',1556231697,14306),('phabricator:20151221.search.1.version.sql',1556231697,5434),('phabricator:20151221.search.2.ownersngrams.sql',1556231697,5494),('phabricator:20151221.search.3.reindex.php',1556231697,84),('phabricator:20151223.proj.01.paths.sql',1556231697,15641),('phabricator:20151223.proj.02.depths.sql',1556231697,15239),('phabricator:20151223.proj.03.pathkey.sql',1556231697,9414),('phabricator:20151223.proj.04.keycol.sql',1556231697,16788),('phabricator:20151223.proj.05.updatekeys.php',1556231697,483),('phabricator:20151223.proj.06.uniq.sql',1556231697,10101),('phabricator:20151226.reop.1.sql',1556231697,12605),('phabricator:20151227.proj.01.materialize.sql',1556231697,586),('phabricator:20151231.proj.01.icon.php',1556231697,2511),('phabricator:20160102.badges.award.sql',1556231697,6329),('phabricator:20160110.repo.01.slug.sql',1556231697,20421),('phabricator:20160110.repo.02.slug.php',1556231697,678),('phabricator:20160111.repo.01.slugx.sql',1556231697,1338),('phabricator:20160112.repo.01.uri.sql',1556231697,5759),('phabricator:20160112.repo.02.uri.index.php',1556231697,105),('phabricator:20160113.propanel.1.storage.sql',1556231697,6417),('phabricator:20160113.propanel.2.xaction.sql',1556231697,7222),('phabricator:20160119.project.1.silence.sql',1556231697,547),('phabricator:20160122.project.1.boarddefault.php',1556231697,759),('phabricator:20160124.people.1.icon.sql',1556231697,10389),('phabricator:20160124.people.2.icondefault.sql',1556231697,597),('phabricator:20160128.repo.1.pull.sql',1556231697,6188),('phabricator:20160201.revision.properties.1.sql',1556231697,13671),('phabricator:20160201.revision.properties.2.sql',1556231697,582),('phabricator:20160202.board.1.proxy.sql',1556231697,11473),('phabricator:20160202.ipv6.1.sql',1556231697,29431),('phabricator:20160202.ipv6.2.php',1556231697,1039),('phabricator:20160206.cover.1.sql',1556231697,16645),('phabricator:20160208.task.1.sql',1556231697,17354),('phabricator:20160208.task.2.sql',1556231697,28687),('phabricator:20160208.task.3.sql',1556231697,21722),('phabricator:20160212.proj.1.sql',1556231697,18838),('phabricator:20160212.proj.2.sql',1556231697,682),('phabricator:20160215.owners.policy.1.sql',1556231698,13159),('phabricator:20160215.owners.policy.2.sql',1556231698,13532),('phabricator:20160215.owners.policy.3.sql',1556231698,781),('phabricator:20160215.owners.policy.4.sql',1556231698,575),('phabricator:20160218.callsigns.1.sql',1556231698,18754),('phabricator:20160221.almanac.1.devicen.sql',1556231698,5402),('phabricator:20160221.almanac.2.devicei.php',1556231698,86),('phabricator:20160221.almanac.3.servicen.sql',1556231698,5514),('phabricator:20160221.almanac.4.servicei.php',1556231698,88),('phabricator:20160221.almanac.5.networkn.sql',1556231698,5797),('phabricator:20160221.almanac.6.networki.php',1556231698,98),('phabricator:20160221.almanac.7.namespacen.sql',1556231698,6222),('phabricator:20160221.almanac.8.namespace.sql',1556231698,6967),('phabricator:20160221.almanac.9.namespacex.sql',1556231698,6258),('phabricator:20160222.almanac.1.properties.php',1556231698,1785),('phabricator:20160223.almanac.1.bound.sql',1556231698,12636),('phabricator:20160223.almanac.2.lockbind.sql',1556231698,555),('phabricator:20160223.almanac.3.devicelock.sql',1556231698,12370),('phabricator:20160223.almanac.4.servicelock.sql',1556231698,12403),('phabricator:20160223.paste.fileedges.php',1556231698,563),('phabricator:20160225.almanac.1.disablebinding.sql',1556231698,13239),('phabricator:20160225.almanac.2.stype.sql',1556231698,5306),('phabricator:20160225.almanac.3.stype.php',1556231698,854),('phabricator:20160227.harbormaster.1.plann.sql',1556231698,5517),('phabricator:20160227.harbormaster.2.plani.php',1556231698,85),('phabricator:20160303.drydock.1.bluen.sql',1556231698,5916),('phabricator:20160303.drydock.2.bluei.php',1556231698,84),('phabricator:20160303.drydock.3.edge.sql',1556231698,9299),('phabricator:20160308.nuance.01.disabled.sql',1556231698,11938),('phabricator:20160308.nuance.02.cursordata.sql',1556231698,5933),('phabricator:20160308.nuance.03.sourcen.sql',1556231698,5421),('phabricator:20160308.nuance.04.sourcei.php',1556231698,84),('phabricator:20160308.nuance.05.sourcename.sql',1556231698,14051),('phabricator:20160308.nuance.06.label.sql',1556231698,14773),('phabricator:20160308.nuance.07.itemtype.sql',1556231698,12745),('phabricator:20160308.nuance.08.itemkey.sql',1556231698,12490),('phabricator:20160308.nuance.09.itemcontainer.sql',1556231698,14099),('phabricator:20160308.nuance.10.itemkeyu.sql',1556231698,525),('phabricator:20160308.nuance.11.requestor.sql',1556231698,16661),('phabricator:20160308.nuance.12.queue.sql',1556231698,12884),('phabricator:20160316.lfs.01.token.resource.sql',1556231698,14175),('phabricator:20160316.lfs.02.token.user.sql',1556231698,10063),('phabricator:20160316.lfs.03.token.properties.sql',1556231698,10329),('phabricator:20160316.lfs.04.token.default.sql',1556231698,508),('phabricator:20160317.lfs.01.ref.sql',1556231698,5342),('phabricator:20160321.nuance.01.taskbridge.sql',1556231698,17760),('phabricator:20160322.nuance.01.itemcommand.sql',1556231698,4975),('phabricator:20160323.badgemigrate.sql',1556231698,1649),('phabricator:20160329.nuance.01.requestor.sql',1556231698,3782),('phabricator:20160329.nuance.02.requestorsource.sql',1556231698,4055),('phabricator:20160329.nuance.03.requestorxaction.sql',1556231698,4785),('phabricator:20160329.nuance.04.requestorcomment.sql',1556231698,4420),('phabricator:20160330.badges.migratequality.sql',1556231698,15822),('phabricator:20160330.badges.qualityxaction.mig.sql',1556231698,2799),('phabricator:20160331.fund.comments.1.sql',1556231698,6871),('phabricator:20160404.oauth.1.xaction.sql',1556231698,6721),('phabricator:20160405.oauth.2.disable.sql',1556231698,10930),('phabricator:20160406.badges.ngrams.php',1556231698,97),('phabricator:20160406.badges.ngrams.sql',1556231698,6525),('phabricator:20160406.columns.1.php',1556231698,500),('phabricator:20160411.repo.1.version.sql',1556231698,5519),('phabricator:20160418.repouri.1.sql',1556231698,6074),('phabricator:20160418.repouri.2.sql',1556231698,11525),('phabricator:20160418.repoversion.1.sql',1556231698,10689),('phabricator:20160419.pushlog.1.sql',1556231698,14353),('phabricator:20160424.locks.1.sql',1556231698,10204),('phabricator:20160426.searchedge.sql',1556231698,9947),('phabricator:20160428.repo.1.urixaction.sql',1556231698,7021),('phabricator:20160503.repo.01.lpath.sql',1556231698,13307),('phabricator:20160503.repo.02.lpathkey.sql',1556231698,8490),('phabricator:20160503.repo.03.lpathmigrate.php',1556231698,504),('phabricator:20160503.repo.04.mirrormigrate.php',1556231698,850),('phabricator:20160503.repo.05.urimigrate.php',1556231698,424),('phabricator:20160510.repo.01.uriindex.php',1556231698,4595),('phabricator:20160513.owners.01.autoreview.sql',1556231698,10941),('phabricator:20160513.owners.02.autoreviewnone.sql',1556231698,564),('phabricator:20160516.owners.01.dominion.sql',1556231698,10783),('phabricator:20160516.owners.02.dominionstrong.sql',1556231698,572),('phabricator:20160517.oauth.01.edge.sql',1556231698,10687),('phabricator:20160518.ssh.01.activecol.sql',1556231698,10789),('phabricator:20160518.ssh.02.activeval.sql',1556231698,581),('phabricator:20160518.ssh.03.activekey.sql',1556231698,6783),('phabricator:20160519.ssh.01.xaction.sql',1556231698,6533),('phabricator:20160531.pref.01.xaction.sql',1556231698,7117),('phabricator:20160531.pref.02.datecreatecol.sql',1556231698,9742),('phabricator:20160531.pref.03.datemodcol.sql',1556231698,9161),('phabricator:20160531.pref.04.datecreateval.sql',1556231698,581),('phabricator:20160531.pref.05.datemodval.sql',1556231698,500),('phabricator:20160531.pref.06.phidcol.sql',1556231698,9802),('phabricator:20160531.pref.07.phidval.php',1556231698,812),('phabricator:20160601.user.01.cache.sql',1556231698,7441),('phabricator:20160601.user.02.copyprefs.php',1556231698,1761),('phabricator:20160601.user.03.removetime.sql',1556231698,15650),('phabricator:20160601.user.04.removetranslation.sql',1556231698,15109),('phabricator:20160601.user.05.removesex.sql',1556231698,14245),('phabricator:20160603.user.01.removedcenabled.sql',1556231698,13434),('phabricator:20160603.user.02.removedctab.sql',1556231698,14889),('phabricator:20160603.user.03.removedcvisible.sql',1556231698,14290),('phabricator:20160604.user.01.stringmailprefs.php',1556231698,605),('phabricator:20160604.user.02.removeimagecache.sql',1556231698,13598),('phabricator:20160605.user.01.prefnulluser.sql',1556231698,13603),('phabricator:20160605.user.02.prefbuiltin.sql',1556231698,9726),('phabricator:20160605.user.03.builtinunique.sql',1556231698,5808),('phabricator:20160616.phame.blog.header.1.sql',1556231698,10765),('phabricator:20160616.repo.01.oldref.sql',1556231698,5571),('phabricator:20160617.harbormaster.01.arelease.sql',1556231698,11995),('phabricator:20160618.phame.blog.subtitle.sql',1556231698,11187),('phabricator:20160620.phame.blog.parentdomain.2.sql',1556231698,11609),('phabricator:20160620.phame.blog.parentsite.1.sql',1556231698,13040),('phabricator:20160623.phame.blog.fulldomain.1.sql',1556231698,12008),('phabricator:20160623.phame.blog.fulldomain.2.sql',1556231698,564),('phabricator:20160623.phame.blog.fulldomain.3.sql',1556231698,1211),('phabricator:20160706.phame.blog.parentdomain.2.sql',1556231698,12418),('phabricator:20160706.phame.blog.parentsite.1.sql',1556231699,13036),('phabricator:20160707.calendar.01.stub.sql',1556231699,12754),('phabricator:20160711.files.01.builtin.sql',1556231699,15129),('phabricator:20160711.files.02.builtinkey.sql',1556231699,8836),('phabricator:20160713.event.01.host.sql',1556231699,15511),('phabricator:20160715.event.01.alldayfrom.sql',1556231699,14131),('phabricator:20160715.event.02.alldayto.sql',1556231699,12699),('phabricator:20160715.event.03.allday.php',1556231699,86),('phabricator:20160720.calendar.invitetxn.php',1556231699,1319),('phabricator:20160721.pack.01.pub.sql',1556231699,5812),('phabricator:20160721.pack.02.pubxaction.sql',1556231699,6139),('phabricator:20160721.pack.03.edge.sql',1556231699,10806),('phabricator:20160721.pack.04.pkg.sql',1556231699,6295),('phabricator:20160721.pack.05.pkgxaction.sql',1556231699,6625),('phabricator:20160721.pack.06.version.sql',1556231699,5517),('phabricator:20160721.pack.07.versionxaction.sql',1556231699,6541),('phabricator:20160722.pack.01.pubngrams.sql',1556231699,5991),('phabricator:20160722.pack.02.pkgngrams.sql',1556231699,6165),('phabricator:20160722.pack.03.versionngrams.sql',1556231699,5845),('phabricator:20160810.commit.01.summarylength.sql',1556231699,16647),('phabricator:20160824.connectionlog.sql',1556231699,3624),('phabricator:20160824.repohint.01.hint.sql',1556231699,5880),('phabricator:20160824.repohint.02.movebad.php',1556231699,610),('phabricator:20160824.repohint.03.nukebad.sql',1556231699,3549),('phabricator:20160825.ponder.sql',1556231699,635),('phabricator:20160829.pastebin.01.language.sql',1556231699,16331),('phabricator:20160829.pastebin.02.language.sql',1556231699,560),('phabricator:20160913.conpherence.topic.1.sql',1556231699,11148),('phabricator:20160919.repo.messagecount.sql',1556231699,10883),('phabricator:20160919.repo.messagedefault.sql',1556231699,3870),('phabricator:20160921.fileexternalrequest.sql',1556231699,6461),('phabricator:20160927.phurl.ngrams.php',1556231699,88),('phabricator:20160927.phurl.ngrams.sql',1556231699,5450),('phabricator:20160928.repo.messagecount.sql',1556231699,513),('phabricator:20160928.tokentoken.sql',1556231699,7220),('phabricator:20161003.cal.01.utcepoch.sql',1556231699,39888),('phabricator:20161003.cal.02.parameters.sql',1556231699,13545),('phabricator:20161004.cal.01.noepoch.php',1556231699,1824),('phabricator:20161005.cal.01.rrules.php',1556231699,313),('phabricator:20161005.cal.02.export.sql',1556231699,6093),('phabricator:20161005.cal.03.exportxaction.sql',1556231699,6495),('phabricator:20161005.conpherence.image.1.sql',1556231699,12059),('phabricator:20161005.conpherence.image.2.php',1556231699,85),('phabricator:20161011.conpherence.ngrams.php',1556231699,65),('phabricator:20161011.conpherence.ngrams.sql',1556231699,5332),('phabricator:20161012.cal.01.import.sql',1556231699,6181),('phabricator:20161012.cal.02.importxaction.sql',1556231699,6973),('phabricator:20161012.cal.03.eventimport.sql',1556231699,52644),('phabricator:20161013.cal.01.importlog.sql',1556231699,5063),('phabricator:20161016.conpherence.imagephids.sql',1556231699,10859),('phabricator:20161025.phortune.contact.1.sql',1556231699,9620),('phabricator:20161025.phortune.merchant.image.1.sql',1556231699,11081),('phabricator:20161026.calendar.01.importtriggers.sql',1556231699,23297),('phabricator:20161027.calendar.01.externalinvitee.sql',1556231699,5726),('phabricator:20161029.phortune.invoice.1.sql',1556231699,20493),('phabricator:20161031.calendar.01.seriesparent.sql',1556231699,13938),('phabricator:20161031.calendar.02.notifylog.sql',1556231699,5033),('phabricator:20161101.calendar.01.noholiday.sql',1556231699,3280),('phabricator:20161101.calendar.02.removecolumns.sql',1556231699,78114),('phabricator:20161104.calendar.01.availability.sql',1556231699,11128),('phabricator:20161104.calendar.02.availdefault.sql',1556231699,550),('phabricator:20161115.phamepost.01.subtitle.sql',1556231699,11909),('phabricator:20161115.phamepost.02.header.sql',1556231699,13239),('phabricator:20161121.cluster.01.hoststate.sql',1556231699,4824),('phabricator:20161124.search.01.stopwords.sql',1556231699,4622),('phabricator:20161125.search.01.stemmed.sql',1556231699,7243),('phabricator:20161130.search.01.manual.sql',1556231699,5811),('phabricator:20161130.search.02.rebuild.php',1556231699,1398),('phabricator:20161210.dashboards.01.author.sql',1556231699,11083),('phabricator:20161210.dashboards.02.author.php',1556231699,1611),('phabricator:20161211.menu.01.itemkey.sql',1556231699,4255),('phabricator:20161211.menu.02.itemprops.sql',1556231699,3566),('phabricator:20161211.menu.03.order.sql',1556231699,3844),('phabricator:20161212.dashboardpanel.01.author.sql',1556231699,10207),('phabricator:20161212.dashboardpanel.02.author.php',1556231699,836),('phabricator:20161212.dashboards.01.icon.sql',1556231699,11227),('phabricator:20161213.diff.01.hunks.php',1556231699,747),('phabricator:20161216.dashboard.ngram.01.sql',1556231699,10936),('phabricator:20161216.dashboard.ngram.02.php',1556231699,114),('phabricator:20170106.menu.01.customphd.sql',1556231699,10393),('phabricator:20170109.diff.01.commit.sql',1556231699,12971),('phabricator:20170119.menuitem.motivator.01.php',1556231699,407),('phabricator:20170131.dashboard.personal.01.php',1556231699,1445),('phabricator:20170301.subtype.01.col.sql',1556231699,12251),('phabricator:20170301.subtype.02.default.sql',1556231699,687),('phabricator:20170301.subtype.03.taskcol.sql',1556231699,17435),('phabricator:20170301.subtype.04.taskdefault.sql',1556231699,554),('phabricator:20170303.people.01.avatar.sql',1556231699,27615),('phabricator:20170313.reviewers.01.sql',1556231699,5349),('phabricator:20170316.rawfiles.01.php',1556231699,1720),('phabricator:20170320.reviewers.01.lastaction.sql',1556231699,11553),('phabricator:20170320.reviewers.02.lastcomment.sql',1556231699,10266),('phabricator:20170320.reviewers.03.migrate.php',1556231699,1127),('phabricator:20170322.reviewers.04.actor.sql',1556231699,10051),('phabricator:20170328.reviewers.01.void.sql',1556231699,11143),('phabricator:20170404.files.retroactive-content-hash.sql',1556231699,19835),('phabricator:20170406.hmac.01.keystore.sql',1556231699,5350),('phabricator:20170410.calendar.01.repair.php',1556231699,576),('phabricator:20170412.conpherence.01.picturecrop.sql',1556231699,499),('phabricator:20170413.conpherence.01.recentparty.sql',1556231700,11833),('phabricator:20170417.files.ngrams.sql',1556231700,5606),('phabricator:20170418.1.application.01.xaction.sql',1556231700,6959),('phabricator:20170418.1.application.02.edge.sql',1556231700,9907),('phabricator:20170418.files.isDeleted.sql',1556231700,16731),('phabricator:20170419.app.01.table.sql',1556231700,5395),('phabricator:20170419.thread.01.behind.sql',1556231700,11820),('phabricator:20170419.thread.02.status.sql',1556231700,11320),('phabricator:20170419.thread.03.touched.sql',1556231700,12098),('phabricator:20170424.user.01.verify.php',1556231700,450),('phabricator:20170427.owners.01.long.sql',1556231700,10936),('phabricator:20170504.1.slowvote.shuffle.sql',1556231700,13917),('phabricator:20170522.nuance.01.itemkey.sql',1556231700,13967),('phabricator:20170524.nuance.01.command.sql',1556231700,29175),('phabricator:20170524.nuance.02.commandstatus.sql',1556231700,10499),('phabricator:20170526.dropdifferentialdrafts.sql',1556231700,4528),('phabricator:20170526.milestones.php',1556231700,82),('phabricator:20170528.maniphestdupes.php',1556231700,407),('phabricator:20170612.repository.image.01.sql',1556231700,14513),('phabricator:20170614.taskstatus.sql',1556231700,22946),('phabricator:20170725.legalpad.date.01.sql',1556231700,1121),('phabricator:20170811.differential.01.status.php',1556231700,436),('phabricator:20170811.differential.02.modernstatus.sql',1556231700,1112),('phabricator:20170811.differential.03.modernxaction.php',1556231700,946),('phabricator:20170814.search.01.qconfig.sql',1556231700,5484),('phabricator:20170820.phame.01.post.views.sql',1556231700,12773),('phabricator:20170820.phame.02.post.views.sql',1556231700,492),('phabricator:20170824.search.01.saved.php',1556231700,1093),('phabricator:20170825.phame.01.post.views.sql',1556231700,14383),('phabricator:20170828.ferret.01.taskdoc.sql',1556231700,4720),('phabricator:20170828.ferret.02.taskfield.sql',1556231700,4430),('phabricator:20170828.ferret.03.taskngrams.sql',1556231700,4459),('phabricator:20170830.ferret.01.unique.sql',1556231700,11567),('phabricator:20170830.ferret.02.term.sql',1556231700,10544),('phabricator:20170905.ferret.01.diff.doc.sql',1556231700,4638),('phabricator:20170905.ferret.02.diff.field.sql',1556231700,4380),('phabricator:20170905.ferret.03.diff.ngrams.sql',1556231700,4849),('phabricator:20170907.ferret.01.user.doc.sql',1556231700,4719),('phabricator:20170907.ferret.02.user.field.sql',1556231700,4741),('phabricator:20170907.ferret.03.user.ngrams.sql',1556231700,4472),('phabricator:20170907.ferret.04.fund.doc.sql',1556231700,6308),('phabricator:20170907.ferret.05.fund.field.sql',1556231700,4669),('phabricator:20170907.ferret.06.fund.ngrams.sql',1556231700,4853),('phabricator:20170907.ferret.07.passphrase.doc.sql',1556231700,4554),('phabricator:20170907.ferret.08.passphrase.field.sql',1556231700,5115),('phabricator:20170907.ferret.09.passphrase.ngrams.sql',1556231700,4083),('phabricator:20170907.ferret.10.owners.doc.sql',1556231700,4723),('phabricator:20170907.ferret.11.owners.field.sql',1556231700,5061),('phabricator:20170907.ferret.12.owners.ngrams.sql',1556231700,4786),('phabricator:20170907.ferret.13.blog.doc.sql',1556231700,4252),('phabricator:20170907.ferret.14.blog.field.sql',1556231700,4923),('phabricator:20170907.ferret.15.blog.ngrams.sql',1556231700,4231),('phabricator:20170907.ferret.16.post.doc.sql',1556231700,4741),('phabricator:20170907.ferret.17.post.field.sql',1556231700,4888),('phabricator:20170907.ferret.18.post.ngrams.sql',1556231700,5208),('phabricator:20170907.ferret.19.project.doc.sql',1556231700,4908),('phabricator:20170907.ferret.20.project.field.sql',1556231700,5022),('phabricator:20170907.ferret.21.project.ngrams.sql',1556231700,4594),('phabricator:20170907.ferret.22.phriction.doc.sql',1556231700,4889),('phabricator:20170907.ferret.23.phriction.field.sql',1556231700,4387),('phabricator:20170907.ferret.24.phriction.ngrams.sql',1556231700,4437),('phabricator:20170907.ferret.25.event.doc.sql',1556231700,5550),('phabricator:20170907.ferret.26.event.field.sql',1556231700,4987),('phabricator:20170907.ferret.27.event.ngrams.sql',1556231700,4139),('phabricator:20170907.ferret.28.mock.doc.sql',1556231700,5204),('phabricator:20170907.ferret.29.mock.field.sql',1556231700,4481),('phabricator:20170907.ferret.30.mock.ngrams.sql',1556231700,4263),('phabricator:20170907.ferret.31.repo.doc.sql',1556231700,4498),('phabricator:20170907.ferret.32.repo.field.sql',1556231700,5632),('phabricator:20170907.ferret.33.repo.ngrams.sql',1556231700,4712),('phabricator:20170907.ferret.34.commit.doc.sql',1556231700,5410),('phabricator:20170907.ferret.35.commit.field.sql',1556231700,4832),('phabricator:20170907.ferret.36.commit.ngrams.sql',1556231700,4997),('phabricator:20170912.ferret.01.activity.php',1556231700,358),('phabricator:20170914.ref.01.position.sql',1556231700,4702),('phabricator:20170915.ref.01.migrate.php',1556231700,735),('phabricator:20170915.ref.02.drop.id.sql',1556231700,11053),('phabricator:20170915.ref.03.drop.closed.sql',1556231700,10493),('phabricator:20170915.ref.04.uniq.sql',1556231700,6301),('phabricator:20170918.ref.01.position.php',1556231700,6814),('phabricator:20171002.cngram.01.maniphest.sql',1556231700,6208),('phabricator:20171002.cngram.02.event.sql',1556231700,6453),('phabricator:20171002.cngram.03.revision.sql',1556231700,5686),('phabricator:20171002.cngram.04.fund.sql',1556231700,5388),('phabricator:20171002.cngram.05.owners.sql',1556231700,5625),('phabricator:20171002.cngram.06.passphrase.sql',1556231700,6665),('phabricator:20171002.cngram.07.blog.sql',1556231700,5687),('phabricator:20171002.cngram.08.post.sql',1556231700,5555),('phabricator:20171002.cngram.09.pholio.sql',1556231700,5669),('phabricator:20171002.cngram.10.phriction.sql',1556231700,5644),('phabricator:20171002.cngram.11.project.sql',1556231700,5239),('phabricator:20171002.cngram.12.user.sql',1556231700,6475),('phabricator:20171002.cngram.13.repository.sql',1556231700,5340),('phabricator:20171002.cngram.14.commit.sql',1556231700,5519),('phabricator:20171026.ferret.01.ponder.doc.sql',1556231700,4734),('phabricator:20171026.ferret.02.ponder.field.sql',1556231700,4312),('phabricator:20171026.ferret.03.ponder.ngrams.sql',1556231700,4486),('phabricator:20171026.ferret.04.ponder.cngrams.sql',1556231700,6303),('phabricator:20171026.ferret.05.ponder.index.php',1556231700,111),('phabricator:20171101.diff.01.active.sql',1556231700,13157),('phabricator:20171101.diff.02.populate.php',1556231700,466),('phabricator:20180119.bulk.01.silent.sql',1556231700,12179),('phabricator:20180120.auth.01.password.sql',1556231700,5465),('phabricator:20180120.auth.02.passwordxaction.sql',1556231700,7117),('phabricator:20180120.auth.03.vcsdata.sql',1556231700,1196),('phabricator:20180120.auth.04.vcsphid.php',1556231700,751),('phabricator:20180121.auth.01.vcsnuke.sql',1556231700,3980),('phabricator:20180121.auth.02.passsalt.sql',1556231700,9066),('phabricator:20180121.auth.03.accountdata.sql',1556231700,607),('phabricator:20180121.auth.04.accountphid.php',1556231700,431),('phabricator:20180121.auth.05.accountnuke.sql',1556231700,29120),('phabricator:20180121.auth.06.legacydigest.sql',1556231700,9699),('phabricator:20180121.auth.07.marklegacy.sql',1556231700,567),('phabricator:20180124.herald.01.repetition.sql',1556231700,17664),('phabricator:20180207.mail.01.task.sql',1556231700,18090),('phabricator:20180207.mail.02.revision.sql',1556231700,13051),('phabricator:20180207.mail.03.mock.sql',1556231700,11482),('phabricator:20180208.maniphest.01.close.sql',1556231700,34873),('phabricator:20180208.maniphest.02.populate.php',1556231700,494),('phabricator:20180209.hook.01.hook.sql',1556231700,5084),('phabricator:20180209.hook.02.hookxaction.sql',1556231700,6844),('phabricator:20180209.hook.03.hookrequest.sql',1556231700,4822),('phabricator:20180210.hunk.01.droplegacy.sql',1556231700,4058),('phabricator:20180210.hunk.02.renamemodern.sql',1556231700,4436),('phabricator:20180212.harbor.01.receiver.sql',1556231700,14179),('phabricator:20180214.harbor.01.aborted.php',1556231700,902),('phabricator:20180215.phriction.01.phidcol.sql',1556231701,12098),('phabricator:20180215.phriction.02.phidvalues.php',1556231701,643),('phabricator:20180215.phriction.03.descempty.sql',1556231701,535),('phabricator:20180215.phriction.04.descnull.sql',1556231701,14930),('phabricator:20180215.phriction.05.statustext.sql',1556231701,15691),('phabricator:20180215.phriction.06.statusvalue.sql',1556231701,904),('phabricator:20180218.fact.01.dim.key.sql',1556231701,5182),('phabricator:20180218.fact.02.dim.obj.sql',1556231701,4795),('phabricator:20180218.fact.03.data.int.sql',1556231701,4788),('phabricator:20180222.log.01.filephid.sql',1556231701,12884),('phabricator:20180223.log.01.bytelength.sql',1556231701,11783),('phabricator:20180223.log.02.chunkformat.sql',1556231701,10735),('phabricator:20180223.log.03.chunkdefault.sql',1556231701,508),('phabricator:20180223.log.04.linemap.sql',1556231701,12025),('phabricator:20180223.log.05.linemapdefault.sql',1556231701,597),('phabricator:20180228.log.01.offset.sql',1556231701,20084),('phabricator:20180305.lock.01.locklog.sql',1556231701,4480),('phabricator:20180306.opath.01.digest.sql',1556231701,11285),('phabricator:20180306.opath.02.digestpopulate.php',1556231701,636),('phabricator:20180306.opath.03.purge.php',1556231701,422),('phabricator:20180306.opath.04.unique.sql',1556231701,6155),('phabricator:20180306.opath.05.longpath.sql',1556231701,12989),('phabricator:20180306.opath.06.pathdisplay.sql',1556231701,10854),('phabricator:20180306.opath.07.copypaths.sql',1556231701,667),('phabricator:20180309.owners.01.primaryowner.sql',1556231701,12220),('phabricator:20180312.reviewers.01.options.sql',1556231701,10529),('phabricator:20180312.reviewers.02.optionsdefault.sql',1556231701,514),('phabricator:20180322.lock.01.identifier.sql',1556231701,18925),('phabricator:20180322.lock.02.wait.sql',1556231701,35843),('phabricator:20180326.lock.03.nonunique.sql',1556231701,5998),('phabricator:20180403.draft.01.broadcast.php',1556231701,689),('phabricator:20180410.almanac.01.iface.xaction.sql',1556231701,6457),('phabricator:20180418.alamanc.interface.unique.php',1556231701,8603),('phabricator:20180418.almanac.network.unique.php',1556231701,6736),('phabricator:20180419.phlux.edges.sql',1556231701,10016),('phabricator:20180423.mail.01.properties.sql',1556231701,5352),('phabricator:20180430.repo_identity.sql',1556231701,6953),('phabricator:20180504.owners.01.mailkey.php',1556231701,613),('phabricator:20180504.owners.02.rmkey.sql',1556231701,10972),('phabricator:20180504.owners.03.properties.sql',1556231701,11898),('phabricator:20180504.owners.04.default.sql',1556231701,626),('phabricator:20180504.repo_identity.author.sql',1556231701,11039),('phabricator:20180504.repo_identity.xaction.sql',1556231701,7323),('phabricator:20180509.repo_identity.commits.sql',1556231701,13684),('phabricator:20180730.phriction.01.spaces.sql',1556231701,12193),('phabricator:20180730.project.01.spaces.sql',1556231701,16504),('phabricator:20180809.repo_identities.activity.php',1556231701,412),('phabricator:20180827.drydock.01.acquired.sql',1556231701,11934),('phabricator:20180827.drydock.02.activated.sql',1556231701,10516),('phabricator:20180828.phriction.01.contentphid.sql',1556231701,12373),('phabricator:20180828.phriction.02.documentphid.sql',1556231701,12991),('phabricator:20180828.phriction.03.editedepoch.sql',1556231701,12601),('phabricator:20180828.phriction.04.migrate.php',1556231701,612),('phabricator:20180828.phriction.05.contentid.sql',1556231701,11315),('phabricator:20180828.phriction.06.c.documentid.php',1556231701,4931),('phabricator:20180828.phriction.06.documentid.sql',1556231701,12630),('phabricator:20180828.phriction.07.c.documentuniq.sql',1556231701,539),('phabricator:20180828.phriction.07.documentkey.sql',1556231701,6810),('phabricator:20180829.phriction.01.mailkey.php',1556231701,454),('phabricator:20180829.phriction.02.rmkey.sql',1556231701,12074),('phabricator:20180830.phriction.01.maxversion.sql',1556231701,12437),('phabricator:20180830.phriction.02.maxes.php',1556231701,429),('phabricator:20180910.audit.01.searches.php',1556231701,358),('phabricator:20180910.audit.02.string.sql',1556231701,27220),('phabricator:20180910.audit.03.status.php',1556231701,1070),('phabricator:20180910.audit.04.xactions.php',1556231701,1835),('phabricator:20180914.audit.01.mailkey.php',1556231701,501),('phabricator:20180914.audit.02.rmkey.sql',1556231701,15907),('phabricator:20180914.drydock.01.operationphid.sql',1556231701,11675),('phabricator:20181024.drydock.01.commandprops.sql',1556231701,10537),('phabricator:20181024.drydock.02.commanddefaults.sql',1556231701,562),('phabricator:20181031.board.01.queryreset.php',1556231701,2252),('phabricator:20181106.repo.01.sync.sql',1556231701,5414),('phabricator:20181106.repo.02.hook.sql',1556231701,10859),('phabricator:20181213.auth.01.sessionphid.sql',1556231701,11625),('phabricator:20181213.auth.02.populatephid.php',1556231701,418),('phabricator:20181213.auth.03.phidkey.sql',1556231701,8125),('phabricator:20181213.auth.04.longerhashes.sql',1556231701,15735),('phabricator:20181213.auth.05.longerloghashes.sql',1556231701,17050),('phabricator:20181213.auth.06.challenge.sql',1556231701,5795),('phabricator:20181214.auth.01.workflowkey.sql',1556231701,9956),('phabricator:20181217.auth.01.digest.sql',1556231701,10408),('phabricator:20181217.auth.02.ttl.sql',1556231701,10154),('phabricator:20181217.auth.03.completed.sql',1556231701,10782),('phabricator:20181218.pholio.01.imageauthor.sql',1556231701,11427),('phabricator:20181219.pholio.01.imagephid.sql',1556231701,11379),('phabricator:20181219.pholio.02.imagemigrate.php',1556231701,707),('phabricator:20181219.pholio.03.imageid.sql',1556231701,11959),('phabricator:20181220.pholio.01.mailkey.php',1556231701,444),('phabricator:20181220.pholio.02.dropmailkey.sql',1556231701,11687),('phabricator:20181228.auth.01.provider.sql',1556231701,4634),('phabricator:20181228.auth.02.xaction.sql',1556231701,6313),('phabricator:20181228.auth.03.name.sql',1556231701,10666),('phabricator:20190101.sms.01.drop.sql',1556231701,4467),('phabricator:20190115.mfa.01.provider.sql',1556231701,11158),('phabricator:20190115.mfa.02.migrate.php',1556231701,974),('phabricator:20190115.mfa.03.factorkey.sql',1556231701,10875),('phabricator:20190116.contact.01.number.sql',1556231701,5635),('phabricator:20190116.contact.02.xaction.sql',1556231701,6947),('phabricator:20190116.phortune.01.billing.sql',1556231701,9904),('phabricator:20190117.authmessage.01.message.sql',1556231701,4988),('phabricator:20190117.authmessage.02.xaction.sql',1556231701,6637),('phabricator:20190121.contact.01.primary.sql',1556231701,11548),('phabricator:20190127.project.01.subtype.sql',1556231701,17416),('phabricator:20190127.project.02.default.sql',1556231701,555),('phabricator:20190129.project.01.spaces.php',1556231701,406),('phabricator:20190206.external.01.legalpad.sql',1556231701,485),('phabricator:20190206.external.02.email.sql',1556231701,524),('phabricator:20190206.external.03.providerphid.sql',1556231701,13239),('phabricator:20190206.external.04.providerlink.php',1556231701,698),('phabricator:20190207.packages.01.state.sql',1556231702,10942),('phabricator:20190207.packages.02.migrate.sql',1556231702,565),('phabricator:20190207.packages.03.drop.sql',1556231702,11126),('phabricator:20190207.packages.04.xactions.php',1556231702,1229),('phabricator:20190215.daemons.01.dropdataid.php',1556231702,5352),('phabricator:20190215.daemons.02.nulldataid.sql',1556231702,13353),('phabricator:20190215.harbor.01.stringindex.sql',1556231702,5418),('phabricator:20190215.harbor.02.stringcol.sql',1556231702,10942),('phabricator:20190220.daemon_worker.completed.01.sql',1556231702,12323),('phabricator:20190220.daemon_worker.completed.02.sql',1556231702,12844),('phabricator:20190226.harbor.01.planprops.sql',1556231702,10963),('phabricator:20190226.harbor.02.planvalue.sql',1556231702,644),('phabricator:20190307.herald.01.comments.sql',1556231702,4292),('phabricator:20190312.triggers.01.trigger.sql',1556231702,5749),('phabricator:20190312.triggers.02.xaction.sql',1556231702,7189),('phabricator:20190312.triggers.03.triggerphid.sql',1556231702,12671),('phabricator:20190322.triggers.01.usage.sql',1556231702,5436),('phabricator:20190329.portals.01.create.sql',1556231702,4633),('phabricator:20190329.portals.02.xaction.sql',1556231702,8280),('phabricator:20190410.portals.01.ferret.doc.sql',1556231702,5198),('phabricator:20190410.portals.02.ferret.field.sql',1556231702,4797),('phabricator:20190410.portals.03.ferret.ngrams.sql',1556231702,4275),('phabricator:20190410.portals.04.ferret.cngrams.sql',1556231702,5990),('phabricator:20190412.dashboard.01.panels.php',1556231702,453),('phabricator:20190412.dashboard.02.install.sql',1556231702,3768),('phabricator:20190412.dashboard.03.dashngrams.sql',1556231702,4706),('phabricator:20190412.dashboard.04.panelngrams.sql',1556231702,4492),('phabricator:20190412.dashboard.05.dferret.doc.sql',1556231702,4528),('phabricator:20190412.dashboard.06.dferret.field.sql',1556231702,5105),('phabricator:20190412.dashboard.07.dferret.ngrams.sql',1556231702,4069),('phabricator:20190412.dashboard.08.dferret.cngrams.sql',1556231702,5099),('phabricator:20190412.dashboard.09.pferret.doc.sql',1556231702,4827),('phabricator:20190412.dashboard.10.pferret.field.sql',1556231702,5374),('phabricator:20190412.dashboard.11.pferret.ngrams.sql',1556231702,5073),('phabricator:20190412.dashboard.12.pferret.cngrams.sql',1556231702,5528),('phabricator:20190412.dashboard.13.rebuild.php',1556231702,7019),('phabricator:20190412.herald.01.rebuild.php',1556231702,1878),('phabricator:20190416.chart.01.storage.sql',1556231702,4935),('phabricator:daemonstatus.sql',1556231688,NULL),('phabricator:daemonstatuskey.sql',1556231689,NULL),('phabricator:daemontaskarchive.sql',1556231689,NULL),('phabricator:db.almanac',1556231684,NULL),('phabricator:db.application',1556231684,NULL),('phabricator:db.audit',1556231684,NULL),('phabricator:db.auth',1556231684,NULL),('phabricator:db.badges',1556231684,NULL),('phabricator:db.cache',1556231684,NULL),('phabricator:db.calendar',1556231684,NULL),('phabricator:db.chatlog',1556231684,NULL),('phabricator:db.conduit',1556231684,NULL),('phabricator:db.config',1556231684,NULL),('phabricator:db.conpherence',1556231684,NULL),('phabricator:db.countdown',1556231684,NULL),('phabricator:db.daemon',1556231684,NULL),('phabricator:db.dashboard',1556231684,NULL),('phabricator:db.differential',1556231684,NULL),('phabricator:db.diviner',1556231684,NULL),('phabricator:db.doorkeeper',1556231684,NULL),('phabricator:db.draft',1556231684,NULL),('phabricator:db.drydock',1556231684,NULL),('phabricator:db.fact',1556231684,NULL),('phabricator:db.feed',1556231684,NULL),('phabricator:db.file',1556231684,NULL),('phabricator:db.flag',1556231684,NULL),('phabricator:db.fund',1556231684,NULL),('phabricator:db.harbormaster',1556231684,NULL),('phabricator:db.herald',1556231684,NULL),('phabricator:db.legalpad',1556231684,NULL),('phabricator:db.maniphest',1556231684,NULL),('phabricator:db.meta_data',1556231684,NULL),('phabricator:db.metamta',1556231684,NULL),('phabricator:db.multimeter',1556231684,NULL),('phabricator:db.nuance',1556231684,NULL),('phabricator:db.oauth_server',1556231684,NULL),('phabricator:db.owners',1556231684,NULL),('phabricator:db.packages',1556231684,NULL),('phabricator:db.passphrase',1556231684,NULL),('phabricator:db.pastebin',1556231684,NULL),('phabricator:db.phame',1556231684,NULL),('phabricator:db.phlux',1556231684,NULL),('phabricator:db.pholio',1556231684,NULL),('phabricator:db.phortune',1556231684,NULL),('phabricator:db.phragment',1556231684,NULL),('phabricator:db.phrequent',1556231684,NULL),('phabricator:db.phriction',1556231684,NULL),('phabricator:db.phurl',1556231684,NULL),('phabricator:db.policy',1556231684,NULL),('phabricator:db.ponder',1556231684,NULL),('phabricator:db.project',1556231684,NULL),('phabricator:db.releeph',1556231684,NULL),('phabricator:db.repository',1556231684,NULL),('phabricator:db.search',1556231684,NULL),('phabricator:db.slowvote',1556231684,NULL),('phabricator:db.spaces',1556231684,NULL),('phabricator:db.system',1556231684,NULL),('phabricator:db.timeline',1556231684,NULL),('phabricator:db.token',1556231684,NULL),('phabricator:db.user',1556231684,NULL),('phabricator:db.worker',1556231684,NULL),('phabricator:db.xhpast',1556231684,NULL),('phabricator:db.xhpastview',1556231684,NULL),('phabricator:db.xhprof',1556231684,NULL),('phabricator:differentialbookmarks.sql',1556231688,NULL),('phabricator:draft-metadata.sql',1556231689,NULL),('phabricator:dropfileproxyimage.sql',1556231689,NULL),('phabricator:drydockresoucetype.sql',1556231689,NULL),('phabricator:drydocktaskid.sql',1556231689,NULL),('phabricator:edgetype.sql',1556231689,NULL),('phabricator:emailtable.sql',1556231688,NULL),('phabricator:emailtableport.sql',1556231688,NULL),('phabricator:emailtableremove.sql',1556231688,NULL),('phabricator:fact-raw.sql',1556231688,NULL),('phabricator:harbormasterobject.sql',1556231688,NULL),('phabricator:holidays.sql',1556231688,NULL),('phabricator:ldapinfo.sql',1556231688,NULL),('phabricator:legalpad-mailkey-populate.php',1556231690,NULL),('phabricator:legalpad-mailkey.sql',1556231690,NULL),('phabricator:liskcounters-task.sql',1556231689,NULL),('phabricator:liskcounters.php',1556231689,NULL),('phabricator:liskcounters.sql',1556231689,NULL),('phabricator:maniphestxcache.sql',1556231688,NULL),('phabricator:markupcache.sql',1556231688,NULL),('phabricator:migrate-differential-dependencies.php',1556231688,NULL),('phabricator:migrate-maniphest-dependencies.php',1556231688,NULL),('phabricator:migrate-maniphest-revisions.php',1556231688,NULL),('phabricator:migrate-project-edges.php',1556231688,NULL),('phabricator:owners-exclude.sql',1556231689,NULL),('phabricator:pastepolicy.sql',1556231689,NULL),('phabricator:phameblog.sql',1556231688,NULL),('phabricator:phamedomain.sql',1556231689,NULL),('phabricator:phameoneblog.sql',1556231689,NULL),('phabricator:phamepolicy.sql',1556231689,NULL),('phabricator:phiddrop.sql',1556231688,NULL),('phabricator:pholio.sql',1556231689,NULL),('phabricator:policy-project.sql',1556231689,NULL),('phabricator:ponder-comments.sql',1556231689,NULL),('phabricator:ponder-mailkey-populate.php',1556231689,NULL),('phabricator:ponder-mailkey.sql',1556231689,NULL),('phabricator:ponder.sql',1556231688,NULL),('phabricator:releeph.sql',1556231689,NULL),('phabricator:repository-lint.sql',1556231689,NULL),('phabricator:statustxt.sql',1556231689,NULL),('phabricator:symbolcontexts.sql',1556231688,NULL),('phabricator:testdatabase.sql',1556231688,NULL),('phabricator:threadtopic.sql',1556231688,NULL),('phabricator:userstatus.sql',1556231688,NULL),('phabricator:usertranslation.sql',1556231688,NULL),('phabricator:xhprof.sql',1556231689,NULL); + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_metamta` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_metamta`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_metamta`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_metamta`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `metamta_applicationemail` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `applicationPHID` varbinary(64) NOT NULL, + `address` varchar(128) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `configData` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_address` (`address`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_application` (`applicationPHID`), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_metamta`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `metamta_applicationemailtransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_metamta`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `metamta_mail` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `actorPHID` varbinary(64) DEFAULT NULL, + `parameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `message` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `relatedPHID` varbinary(64) DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `relatedPHID` (`relatedPHID`), + KEY `key_created` (`dateCreated`), + KEY `key_actorPHID` (`actorPHID`), + KEY `status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_metamta`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `metamta_mailproperties` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `mailProperties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_metamta`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `metamta_receivedmail` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `headers` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `bodies` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `attachments` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `relatedPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `message` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `messageIDHash` binary(12) NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `relatedPHID` (`relatedPHID`), + KEY `authorPHID` (`authorPHID`), + KEY `key_messageIDHash` (`messageIDHash`), + KEY `key_created` (`dateCreated`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_multimeter` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_multimeter`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `multimeter_context` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `nameHash` binary(12) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_hash` (`nameHash`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_multimeter`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `multimeter_event` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `eventType` int(10) unsigned NOT NULL, + `eventLabelID` int(10) unsigned NOT NULL, + `resourceCost` bigint(20) NOT NULL, + `sampleRate` int(10) unsigned NOT NULL, + `eventContextID` int(10) unsigned NOT NULL, + `eventHostID` int(10) unsigned NOT NULL, + `eventViewerID` int(10) unsigned NOT NULL, + `epoch` int(10) unsigned NOT NULL, + `requestKey` binary(12) NOT NULL, + PRIMARY KEY (`id`), + KEY `key_request` (`requestKey`), + KEY `key_type` (`eventType`,`epoch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_multimeter`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `multimeter_host` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `nameHash` binary(12) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_hash` (`nameHash`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_multimeter`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `multimeter_label` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `nameHash` binary(12) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_hash` (`nameHash`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_multimeter`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `multimeter_viewer` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `nameHash` binary(12) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_hash` (`nameHash`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_nuance` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `nuance_importcursordata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `sourcePHID` varbinary(64) NOT NULL, + `cursorKey` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `cursorType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_source` (`sourcePHID`,`cursorKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `nuance_item` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `requestorPHID` varbinary(64) DEFAULT NULL, + `sourcePHID` varbinary(64) NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `mailKey` binary(20) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `queuePHID` varbinary(64) DEFAULT NULL, + `itemType` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `itemKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `itemContainerKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_item` (`sourcePHID`,`itemKey`), + KEY `key_source` (`sourcePHID`,`status`), + KEY `key_owner` (`ownerPHID`,`status`), + KEY `key_requestor` (`requestorPHID`,`status`), + KEY `key_queue` (`queuePHID`,`status`), + KEY `key_container` (`sourcePHID`,`itemContainerKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `nuance_itemcommand` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `itemPHID` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `command` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `parameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `queuePHID` varbinary(64) DEFAULT NULL, + `status` varchar(64) COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_pending` (`itemPHID`,`status`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `nuance_itemtransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `nuance_itemtransaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `nuance_queue` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `mailKey` binary(20) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `nuance_queuetransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `nuance_queuetransaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `nuance_source` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `type` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `mailKey` binary(20) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `defaultQueuePHID` varbinary(64) NOT NULL, + `isDisabled` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_type` (`type`,`dateModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `nuance_sourcename_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `nuance_sourcetransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_nuance`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `nuance_sourcetransaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_oauth_server` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_oauth_server`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_oauth_server`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_oauth_server`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `oauth_server_oauthclientauthorization` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `userPHID` varbinary(64) NOT NULL, + `clientPHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `scope` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phid` (`phid`), + UNIQUE KEY `userPHID` (`userPHID`,`clientPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_oauth_server`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `oauth_server_oauthserveraccesstoken` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `token` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `userPHID` varbinary(64) NOT NULL, + `clientPHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `token` (`token`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_oauth_server`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `oauth_server_oauthserverauthorizationcode` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `code` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `clientPHID` varbinary(64) NOT NULL, + `clientSecret` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `userPHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `redirectURI` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_oauth_server`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `oauth_server_oauthserverclient` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `secret` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `redirectURI` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `creatorPHID` varbinary(64) NOT NULL, + `isTrusted` tinyint(1) NOT NULL DEFAULT '0', + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `isDisabled` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `creatorPHID` (`creatorPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_oauth_server`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `oauth_server_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_owners` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `owners_customfieldnumericindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `indexKey` binary(12) NOT NULL, + `indexValue` bigint(20) NOT NULL, + PRIMARY KEY (`id`), + KEY `key_join` (`objectPHID`,`indexKey`,`indexValue`), + KEY `key_find` (`indexKey`,`indexValue`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `owners_customfieldstorage` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `fieldIndex` binary(12) NOT NULL, + `fieldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `objectPHID` (`objectPHID`,`fieldIndex`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `owners_customfieldstringindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `indexKey` binary(12) NOT NULL, + `indexValue` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_join` (`objectPHID`,`indexKey`,`indexValue`(64)), + KEY `key_find` (`indexKey`,`indexValue`(64)) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `owners_name_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `owners_owner` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `packageID` int(10) unsigned NOT NULL, + `userPHID` varbinary(64) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `packageID` (`packageID`,`userPHID`), + KEY `userPHID` (`userPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `owners_package` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `autoReview` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dominion` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `auditingState` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `owners_package_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `owners_package_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `owners_package_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `owners_package_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `owners_packagetransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_owners`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `owners_path` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `packageID` int(10) unsigned NOT NULL, + `repositoryPHID` varbinary(64) NOT NULL, + `path` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `excluded` tinyint(1) NOT NULL DEFAULT '0', + `pathIndex` binary(12) NOT NULL, + `pathDisplay` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_path` (`packageID`,`repositoryPHID`,`pathIndex`), + KEY `key_repository` (`repositoryPHID`,`pathIndex`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_packages` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_packages`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_packages`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_packages`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `packages_package` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(64) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `publisherPHID` varbinary(64) NOT NULL, + `packageKey` varchar(64) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_package` (`publisherPHID`,`packageKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_packages`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `packages_packagename_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_packages`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `packages_packagetransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_packages`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `packages_publisher` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(64) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `publisherKey` varchar(64) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_publisher` (`publisherKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_packages`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `packages_publishername_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_packages`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `packages_publishertransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_packages`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `packages_version` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(64) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `packagePHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_package` (`packagePHID`,`name`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_packages`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `packages_versionname_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_packages`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `packages_versiontransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_passphrase` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_passphrase`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_passphrase`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_passphrase`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `passphrase_credential` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `credentialType` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `providesType` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `username` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `secretID` int(10) unsigned DEFAULT NULL, + `isDestroyed` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `isLocked` tinyint(1) NOT NULL, + `allowConduit` tinyint(1) NOT NULL DEFAULT '0', + `authorPHID` varbinary(64) NOT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_secret` (`secretID`), + KEY `key_type` (`credentialType`), + KEY `key_provides` (`providesType`), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_passphrase`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `passphrase_credential_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_passphrase`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `passphrase_credential_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_passphrase`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `passphrase_credential_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_passphrase`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `passphrase_credential_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_passphrase`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `passphrase_credentialtransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_passphrase`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `passphrase_secret` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `secretData` longblob NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_pastebin` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_pastebin`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pastebin`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pastebin`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `pastebin_paste` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `filePHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `language` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `parentPHID` varbinary(64) DEFAULT NULL, + `viewPolicy` varbinary(64) DEFAULT NULL, + `editPolicy` varbinary(64) NOT NULL, + `mailKey` binary(20) NOT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `parentPHID` (`parentPHID`), + KEY `authorPHID` (`authorPHID`), + KEY `key_dateCreated` (`dateCreated`), + KEY `key_language` (`language`), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pastebin`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `pastebin_pastetransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pastebin`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `pastebin_pastetransaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `lineNumber` int(10) unsigned DEFAULT NULL, + `lineLength` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_phame` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_blog` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `domain` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `configData` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `creatorPHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `viewPolicy` varbinary(64) DEFAULT NULL, + `editPolicy` varbinary(64) DEFAULT NULL, + `mailKey` binary(20) NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `profileImagePHID` varbinary(64) DEFAULT NULL, + `headerImagePHID` varbinary(64) DEFAULT NULL, + `subtitle` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `parentDomain` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `parentSite` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `domainFullURI` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phid` (`phid`), + UNIQUE KEY `domain` (`domain`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_blog_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_blog_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_blog_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_blog_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_blogtransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_post` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `bloggerPHID` varbinary(64) NOT NULL, + `title` varchar(255) COLLATE {$COLLATE_TEXT} NOT NULL, + `phameTitle` varchar(64) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} DEFAULT NULL, + `body` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `visibility` int(10) unsigned NOT NULL DEFAULT '0', + `configData` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `datePublished` int(10) unsigned NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `blogPHID` varbinary(64) DEFAULT NULL, + `mailKey` binary(20) NOT NULL, + `subtitle` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `headerImagePHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phid` (`phid`), + KEY `bloggerPosts` (`bloggerPHID`,`visibility`,`datePublished`,`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_post_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_post_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_post_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_post_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_posttransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phame`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phame_posttransaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_phlux` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_phlux`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phlux`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phlux`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phlux_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phlux`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phlux_variable` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `variableKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `variableValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_key` (`variableKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_pholio` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_pholio`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pholio`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pholio`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `pholio_image` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `filePHID` varbinary(64) NOT NULL, + `name` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `sequence` int(10) unsigned NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `isObsolete` tinyint(1) NOT NULL DEFAULT '0', + `replacesImagePHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `mockPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_mock` (`mockPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pholio`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `pholio_mock` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `coverPHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `status` varchar(12) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `authorPHID` (`authorPHID`), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pholio`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `pholio_mock_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pholio`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `pholio_mock_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pholio`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `pholio_mock_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pholio`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `pholio_mock_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pholio`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `pholio_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_pholio`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `pholio_transaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `imageID` int(10) unsigned DEFAULT NULL, + `x` int(10) unsigned DEFAULT NULL, + `y` int(10) unsigned DEFAULT NULL, + `width` int(10) unsigned DEFAULT NULL, + `height` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`), + UNIQUE KEY `key_draft` (`authorPHID`,`imageID`,`transactionPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_phortune` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_account` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `billingName` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `billingAddress` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_accounttransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_cart` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `accountPHID` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `cartClass` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `merchantPHID` varbinary(64) NOT NULL, + `mailKey` binary(20) NOT NULL, + `subscriptionPHID` varbinary(64) DEFAULT NULL, + `isInvoice` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_account` (`accountPHID`), + KEY `key_merchant` (`merchantPHID`), + KEY `key_subscription` (`subscriptionPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_carttransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_charge` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `accountPHID` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `cartPHID` varbinary(64) NOT NULL, + `paymentMethodPHID` varbinary(64) DEFAULT NULL, + `amountAsCurrency` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `merchantPHID` varbinary(64) NOT NULL, + `providerPHID` varbinary(64) NOT NULL, + `amountRefundedAsCurrency` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `refundingPHID` varbinary(64) DEFAULT NULL, + `refundedChargePHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_cart` (`cartPHID`), + KEY `key_account` (`accountPHID`), + KEY `key_merchant` (`merchantPHID`), + KEY `key_provider` (`providerPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_merchant` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contactInfo` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `profileImagePHID` varbinary(64) DEFAULT NULL, + `invoiceEmail` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `invoiceFooter` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_merchanttransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_paymentmethod` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `status` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `accountPHID` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `brand` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `expires` varchar(16) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `lastFourDigits` varchar(16) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `merchantPHID` varbinary(64) NOT NULL, + `providerPHID` varbinary(64) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_account` (`accountPHID`,`status`), + KEY `key_merchant` (`merchantPHID`,`accountPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_paymentproviderconfig` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `merchantPHID` varbinary(64) NOT NULL, + `providerClassKey` binary(12) NOT NULL, + `providerClass` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `isEnabled` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_merchant` (`merchantPHID`,`providerClassKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_paymentproviderconfigtransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_product` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `productClassKey` binary(12) NOT NULL, + `productClass` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `productRefKey` binary(12) NOT NULL, + `productRef` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_product` (`productClassKey`,`productRefKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_purchase` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `productPHID` varbinary(64) NOT NULL, + `accountPHID` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `cartPHID` varbinary(64) DEFAULT NULL, + `basePriceAsCurrency` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `quantity` int(10) unsigned NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_cart` (`cartPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phortune`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phortune_subscription` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `accountPHID` varbinary(64) NOT NULL, + `merchantPHID` varbinary(64) NOT NULL, + `triggerPHID` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `subscriptionClassKey` binary(12) NOT NULL, + `subscriptionClass` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `subscriptionRefKey` binary(12) NOT NULL, + `subscriptionRef` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `defaultPaymentMethodPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_subscription` (`subscriptionClassKey`,`subscriptionRefKey`), + KEY `key_account` (`accountPHID`), + KEY `key_merchant` (`merchantPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_phrequent` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_phrequent`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phrequent_usertime` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `userPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) DEFAULT NULL, + `note` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `dateStarted` int(10) unsigned NOT NULL, + `dateEnded` int(10) unsigned DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_phriction` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_phriction`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phriction`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phriction`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phriction_content` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `version` int(10) unsigned NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `title` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `slug` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `changeType` int(10) unsigned NOT NULL DEFAULT '0', + `changeRef` int(10) unsigned DEFAULT NULL, + `phid` varbinary(64) NOT NULL, + `documentPHID` varbinary(64) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_version` (`documentPHID`,`version`), + UNIQUE KEY `key_phid` (`phid`), + KEY `authorPHID` (`authorPHID`), + KEY `slug` (`slug`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phriction`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phriction_document` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `slug` varchar(128) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `depth` int(10) unsigned NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + `contentPHID` varbinary(64) NOT NULL, + `editedEpoch` int(10) unsigned NOT NULL, + `maxVersion` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `slug` (`slug`), + UNIQUE KEY `depth` (`depth`,`slug`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phriction`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phriction_document_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phriction`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phriction_document_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phriction`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phriction_document_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phriction`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phriction_document_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phriction`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phriction_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phriction`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phriction_transaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_phurl` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_phurl`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phurl`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phurl`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phurl_phurlname_ngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_object` (`objectID`), + KEY `key_ngram` (`ngram`,`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phurl`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phurl_url` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `longURL` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `alias` varchar(64) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `mailKey` binary(20) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_instance` (`alias`), + KEY `key_author` (`authorPHID`), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phurl`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phurl_urltransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_phurl`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `phurl_urltransaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_policy` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_policy`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `policy` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `rules` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `defaultAction` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_ponder` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_ponder`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_ponder`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_ponder`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `ponder_answer` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `questionID` int(10) unsigned NOT NULL, + `phid` varbinary(64) NOT NULL, + `voteCount` int(10) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `mailKey` binary(20) NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phid` (`phid`), + UNIQUE KEY `key_oneanswerperquestion` (`questionID`,`authorPHID`), + KEY `questionID` (`questionID`), + KEY `authorPHID` (`authorPHID`), + KEY `status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_ponder`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `ponder_answertransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_ponder`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `ponder_answertransaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_ponder`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `ponder_question` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `answerCount` int(10) unsigned NOT NULL, + `mailKey` binary(20) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + `answerWiki` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phid` (`phid`), + KEY `authorPHID` (`authorPHID`), + KEY `status` (`status`), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_ponder`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `ponder_question_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_ponder`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `ponder_question_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_ponder`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `ponder_question_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_ponder`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `ponder_question_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_ponder`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `ponder_questiontransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_ponder`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `ponder_questiontransaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_project` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(128) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `joinPolicy` varbinary(64) NOT NULL, + `isMembershipLocked` tinyint(1) NOT NULL DEFAULT '0', + `profileImagePHID` varbinary(64) DEFAULT NULL, + `icon` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `color` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `mailKey` binary(20) NOT NULL, + `primarySlug` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `parentProjectPHID` varbinary(64) DEFAULT NULL, + `hasWorkboard` tinyint(1) NOT NULL, + `hasMilestones` tinyint(1) NOT NULL, + `hasSubprojects` tinyint(1) NOT NULL, + `milestoneNumber` int(10) unsigned DEFAULT NULL, + `projectPath` varbinary(64) NOT NULL, + `projectDepth` int(10) unsigned NOT NULL, + `projectPathKey` binary(4) NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + `subtype` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_pathkey` (`projectPathKey`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_primaryslug` (`primarySlug`), + UNIQUE KEY `key_milestone` (`parentProjectPHID`,`milestoneNumber`), + KEY `key_icon` (`icon`), + KEY `key_color` (`color`), + KEY `key_path` (`projectPath`,`projectDepth`), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_column` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `status` int(10) unsigned NOT NULL, + `sequence` int(10) unsigned NOT NULL, + `projectPHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `proxyPHID` varbinary(64) DEFAULT NULL, + `triggerPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_proxy` (`projectPHID`,`proxyPHID`), + KEY `key_status` (`projectPHID`,`status`,`sequence`), + KEY `key_sequence` (`projectPHID`,`sequence`), + KEY `key_trigger` (`triggerPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_columnposition` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `boardPHID` varbinary(64) NOT NULL, + `columnPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `sequence` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `boardPHID` (`boardPHID`,`columnPHID`,`objectPHID`), + KEY `objectPHID` (`objectPHID`,`boardPHID`), + KEY `boardPHID_2` (`boardPHID`,`columnPHID`,`sequence`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_columntransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_customfieldnumericindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `indexKey` binary(12) NOT NULL, + `indexValue` bigint(20) NOT NULL, + PRIMARY KEY (`id`), + KEY `key_join` (`objectPHID`,`indexKey`,`indexValue`), + KEY `key_find` (`indexKey`,`indexValue`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_customfieldstorage` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `fieldIndex` binary(12) NOT NULL, + `fieldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `objectPHID` (`objectPHID`,`fieldIndex`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_customfieldstringindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `indexKey` binary(12) NOT NULL, + `indexValue` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_join` (`objectPHID`,`indexKey`,`indexValue`(64)), + KEY `key_find` (`indexKey`,`indexValue`(64)) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_datasourcetoken` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `projectID` int(10) unsigned NOT NULL, + `token` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `token` (`token`,`projectID`), + KEY `projectID` (`projectID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_project_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_project_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_project_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_project_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_slug` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `projectPHID` varbinary(64) NOT NULL, + `slug` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_slug` (`slug`), + KEY `key_projectPHID` (`projectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_trigger` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `ruleset` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_triggertransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_project`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `project_triggerusage` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `triggerPHID` varbinary(64) NOT NULL, + `examplePHID` varbinary(64) DEFAULT NULL, + `columnCount` int(10) unsigned NOT NULL, + `activeColumnCount` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_trigger` (`triggerPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_repository` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `callsign` varchar(32) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} DEFAULT NULL, + `versionControlSystem` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `details` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `uuid` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `pushPolicy` varbinary(64) NOT NULL, + `credentialPHID` varbinary(64) DEFAULT NULL, + `almanacServicePHID` varbinary(64) DEFAULT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + `repositorySlug` varchar(64) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} DEFAULT NULL, + `localPath` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `profileImagePHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `callsign` (`callsign`), + UNIQUE KEY `key_slug` (`repositorySlug`), + UNIQUE KEY `key_local` (`localPath`), + KEY `key_vcs` (`versionControlSystem`), + KEY `key_name` (`name`(128)), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_auditrequest` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `auditorPHID` varbinary(64) NOT NULL, + `commitPHID` varbinary(64) NOT NULL, + `auditStatus` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `auditReasons` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_unique` (`commitPHID`,`auditorPHID`), + KEY `commitPHID` (`commitPHID`), + KEY `auditorPHID` (`auditorPHID`,`auditStatus`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_branch` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repositoryID` int(10) unsigned NOT NULL, + `name` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `lintCommit` varchar(40) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `repositoryID` (`repositoryID`,`name`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_commit` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repositoryID` int(10) unsigned NOT NULL, + `phid` varbinary(64) NOT NULL, + `commitIdentifier` varchar(40) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `epoch` int(10) unsigned NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `auditStatus` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `summary` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `importStatus` int(10) unsigned NOT NULL, + `authorIdentityPHID` varbinary(64) DEFAULT NULL, + `committerIdentityPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phid` (`phid`), + UNIQUE KEY `key_commit_identity` (`commitIdentifier`,`repositoryID`), + KEY `repositoryID_2` (`repositoryID`,`epoch`), + KEY `authorPHID` (`authorPHID`,`auditStatus`,`epoch`), + KEY `repositoryID` (`repositoryID`,`importStatus`), + KEY `key_epoch` (`epoch`), + KEY `key_author` (`authorPHID`,`epoch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_commit_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_commit_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_commit_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_commit_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_commitdata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `commitID` int(10) unsigned NOT NULL, + `authorName` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `commitMessage` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `commitDetails` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `commitID` (`commitID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_commithint` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repositoryPHID` varbinary(64) NOT NULL, + `oldCommitIdentifier` varchar(40) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newCommitIdentifier` varchar(40) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `hintType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_old` (`repositoryPHID`,`oldCommitIdentifier`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_coverage` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `branchID` int(10) unsigned NOT NULL, + `commitID` int(10) unsigned NOT NULL, + `pathID` int(10) unsigned NOT NULL, + `coverage` longblob NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_path` (`branchID`,`pathID`,`commitID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_filesystem` ( + `repositoryID` int(10) unsigned NOT NULL, + `parentID` int(10) unsigned NOT NULL, + `svnCommit` int(10) unsigned NOT NULL, + `pathID` int(10) unsigned NOT NULL, + `existed` tinyint(1) NOT NULL, + `fileType` int(10) unsigned NOT NULL, + PRIMARY KEY (`repositoryID`,`parentID`,`pathID`,`svnCommit`), + KEY `repositoryID` (`repositoryID`,`svnCommit`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_gitlfsref` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repositoryPHID` varbinary(64) NOT NULL, + `objectHash` binary(64) NOT NULL, + `byteSize` bigint(20) unsigned NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `filePHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_hash` (`repositoryPHID`,`objectHash`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_identity` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `automaticGuessedUserPHID` varbinary(64) DEFAULT NULL, + `manuallySetUserPHID` varbinary(64) DEFAULT NULL, + `currentEffectiveUserPHID` varbinary(64) DEFAULT NULL, + `identityNameHash` binary(12) NOT NULL, + `identityNameRaw` longblob NOT NULL, + `identityNameEncoding` varchar(16) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_identity` (`identityNameHash`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_identitytransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_lintmessage` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `branchID` int(10) unsigned NOT NULL, + `path` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `line` int(10) unsigned NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `code` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `severity` varchar(16) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `branchID` (`branchID`,`path`(64)), + KEY `branchID_2` (`branchID`,`code`,`path`(64)), + KEY `key_author` (`authorPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_mirror` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `repositoryPHID` varbinary(64) NOT NULL, + `remoteURI` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `credentialPHID` varbinary(64) DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_repository` (`repositoryPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_oldref` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repositoryPHID` varbinary(64) NOT NULL, + `commitIdentifier` varchar(40) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_repository` (`repositoryPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_parents` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `childCommitID` int(10) unsigned NOT NULL, + `parentCommitID` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_child` (`childCommitID`,`parentCommitID`), + KEY `key_parent` (`parentCommitID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_path` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `path` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `pathHash` binary(32) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `pathHash` (`pathHash`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_pathchange` ( + `repositoryID` int(10) unsigned NOT NULL, + `pathID` int(10) unsigned NOT NULL, + `commitID` int(10) unsigned NOT NULL, + `targetPathID` int(10) unsigned DEFAULT NULL, + `targetCommitID` int(10) unsigned DEFAULT NULL, + `changeType` int(10) unsigned NOT NULL, + `fileType` int(10) unsigned NOT NULL, + `isDirect` tinyint(1) NOT NULL, + `commitSequence` int(10) unsigned NOT NULL, + PRIMARY KEY (`commitID`,`pathID`), + KEY `repositoryID` (`repositoryID`,`pathID`,`commitSequence`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_pullevent` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `repositoryPHID` varbinary(64) DEFAULT NULL, + `epoch` int(10) unsigned NOT NULL, + `pullerPHID` varbinary(64) DEFAULT NULL, + `remoteAddress` varbinary(64) DEFAULT NULL, + `remoteProtocol` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `resultType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `resultCode` int(10) unsigned NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_repository` (`repositoryPHID`), + KEY `key_epoch` (`epoch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_pushevent` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `repositoryPHID` varbinary(64) NOT NULL, + `epoch` int(10) unsigned NOT NULL, + `pusherPHID` varbinary(64) NOT NULL, + `remoteAddress` varbinary(64) DEFAULT NULL, + `remoteProtocol` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `rejectCode` int(10) unsigned NOT NULL, + `rejectDetails` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `requestIdentifier` binary(12) DEFAULT NULL, + `writeWait` bigint(20) unsigned DEFAULT NULL, + `readWait` bigint(20) unsigned DEFAULT NULL, + `hostWait` bigint(20) unsigned DEFAULT NULL, + `hookWait` bigint(20) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_repository` (`repositoryPHID`), + KEY `key_identifier` (`requestIdentifier`), + KEY `key_reject` (`rejectCode`,`rejectDetails`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_pushlog` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `epoch` int(10) unsigned NOT NULL, + `pushEventPHID` varbinary(64) NOT NULL, + `repositoryPHID` varbinary(64) NOT NULL, + `pusherPHID` varbinary(64) NOT NULL, + `refType` varchar(12) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `refNameHash` binary(12) DEFAULT NULL, + `refNameRaw` longblob, + `refNameEncoding` varchar(16) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `refOld` varchar(40) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `refNew` varchar(40) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `mergeBase` varchar(40) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `changeFlags` int(10) unsigned NOT NULL, + `devicePHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_repository` (`repositoryPHID`), + KEY `key_ref` (`repositoryPHID`,`refNew`), + KEY `key_pusher` (`pusherPHID`), + KEY `key_name` (`repositoryPHID`,`refNameHash`), + KEY `key_event` (`pushEventPHID`), + KEY `key_epoch` (`epoch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_refcursor` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `repositoryPHID` varbinary(64) NOT NULL, + `refType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `refNameHash` binary(12) NOT NULL, + `refNameRaw` longblob NOT NULL, + `refNameEncoding` varchar(16) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ref` (`repositoryPHID`,`refType`,`refNameHash`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_refposition` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `cursorID` int(10) unsigned NOT NULL, + `commitIdentifier` varchar(40) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isClosed` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_position` (`cursorID`,`commitIdentifier`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_repository_fdocument` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_repository_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_repository_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_repository_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_statusmessage` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repositoryID` int(10) unsigned NOT NULL, + `statusType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `statusCode` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `parameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `epoch` int(10) unsigned NOT NULL, + `messageCount` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `repositoryID` (`repositoryID`,`statusType`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_summary` ( + `repositoryID` int(10) unsigned NOT NULL, + `size` int(10) unsigned NOT NULL, + `lastCommitID` int(10) unsigned NOT NULL, + `epoch` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`repositoryID`), + KEY `key_epoch` (`epoch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_symbol` ( + `repositoryPHID` varbinary(64) NOT NULL, + `symbolContext` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `symbolName` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `symbolType` varchar(12) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `symbolLanguage` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `pathID` int(10) unsigned NOT NULL, + `lineNumber` int(10) unsigned NOT NULL, + KEY `symbolName` (`symbolName`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_syncevent` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `repositoryPHID` varbinary(64) NOT NULL, + `epoch` int(10) unsigned NOT NULL, + `devicePHID` varbinary(64) NOT NULL, + `fromDevicePHID` varbinary(64) NOT NULL, + `deviceVersion` int(10) unsigned DEFAULT NULL, + `fromDeviceVersion` int(10) unsigned DEFAULT NULL, + `resultType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `resultCode` int(10) unsigned NOT NULL, + `syncWait` bigint(20) unsigned NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_repository` (`repositoryPHID`), + KEY `key_epoch` (`epoch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_uri` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `repositoryPHID` varbinary(64) NOT NULL, + `uri` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `builtinProtocol` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `builtinIdentifier` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `ioType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `displayType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDisabled` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `credentialPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_builtin` (`repositoryPHID`,`builtinProtocol`,`builtinIdentifier`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_uriindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repositoryPHID` varbinary(64) NOT NULL, + `repositoryURI` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_repository` (`repositoryPHID`), + KEY `key_uri` (`repositoryURI`(128)) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_uritransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_repository`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `repository_workingcopyversion` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `repositoryPHID` varbinary(64) NOT NULL, + `devicePHID` varbinary(64) NOT NULL, + `repositoryVersion` int(10) unsigned NOT NULL, + `isWriting` tinyint(1) NOT NULL, + `writeProperties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `lockOwner` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_workingcopy` (`repositoryPHID`,`devicePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_search` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `search_document` ( + `phid` varbinary(64) NOT NULL, + `documentType` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `documentTitle` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `documentCreated` int(10) unsigned NOT NULL, + `documentModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`phid`), + KEY `documentCreated` (`documentCreated`), + KEY `key_type` (`documentType`,`documentCreated`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `search_documentfield` ( + `phid` varbinary(64) NOT NULL, + `phidType` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `field` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `auxPHID` varbinary(64) DEFAULT NULL, + `corpus` longtext CHARACTER SET {$CHARSET_FULLTEXT} COLLATE {$COLLATE_FULLTEXT}, + `stemmedCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT}, + KEY `phid` (`phid`), + FULLTEXT KEY `key_corpus` (`corpus`,`stemmedCorpus`) +) ENGINE=MyISAM DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `search_documentrelationship` ( + `phid` varbinary(64) NOT NULL, + `relatedPHID` varbinary(64) NOT NULL, + `relation` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `relatedType` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `relatedTime` int(10) unsigned NOT NULL, + KEY `phid` (`phid`), + KEY `relatedPHID` (`relatedPHID`,`relation`), + KEY `relation` (`relation`,`relatedPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `search_editengineconfiguration` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `engineKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `builtinKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDisabled` tinyint(1) NOT NULL DEFAULT '0', + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `isEdit` tinyint(1) NOT NULL, + `createOrder` int(10) unsigned NOT NULL, + `editOrder` int(10) unsigned NOT NULL, + `subtype` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_engine` (`engineKey`,`builtinKey`), + KEY `key_default` (`engineKey`,`isDefault`,`isDisabled`), + KEY `key_edit` (`engineKey`,`isEdit`,`isDisabled`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `search_editengineconfigurationtransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `search_indexversion` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `extensionKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `version` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`,`extensionKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `search_namedquery` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `userPHID` varbinary(64) NOT NULL, + `engineClassName` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `queryName` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `queryKey` varchar(12) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `isBuiltin` tinyint(1) NOT NULL DEFAULT '0', + `isDisabled` tinyint(1) NOT NULL DEFAULT '0', + `sequence` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `key_userquery` (`userPHID`,`engineClassName`,`queryKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `search_namedqueryconfig` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `engineClassName` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `scopePHID` varbinary(64) NOT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_scope` (`engineClassName`,`scopePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `search_profilepanelconfiguration` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `profilePHID` varbinary(64) NOT NULL, + `menuItemKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `builtinKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `menuItemOrder` int(10) unsigned DEFAULT NULL, + `visibility` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `menuItemProperties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `customPHID` varbinary(64) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_profile` (`profilePHID`,`menuItemOrder`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `search_profilepanelconfigurationtransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `search_savedquery` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `engineClassName` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `parameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `queryKey` varchar(12) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_queryKey` (`queryKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_search`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `stopwords` ( + `value` varchar(32) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +INSERT INTO `stopwords` VALUES ('the'),('be'),('and'),('of'),('a'),('in'),('to'),('have'),('it'),('I'),('that'),('for'),('you'),('he'),('with'),('on'),('do'),('say'),('this'),('they'),('at'),('but'),('we'),('his'),('from'),('not'),('by'),('or'),('as'),('what'),('go'),('their'),('can'),('who'),('get'),('if'),('would'),('all'),('my'),('will'),('up'),('there'),('so'),('its'),('us'); + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_slowvote` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_slowvote`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_slowvote`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_slowvote`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `slowvote_choice` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `pollID` int(10) unsigned NOT NULL, + `optionID` int(10) unsigned NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `pollID` (`pollID`), + KEY `authorPHID` (`authorPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_slowvote`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `slowvote_option` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `pollID` int(10) unsigned NOT NULL, + `name` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `pollID` (`pollID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_slowvote`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `slowvote_poll` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `question` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `responseVisibility` int(10) unsigned NOT NULL, + `shuffle` tinyint(1) NOT NULL DEFAULT '0', + `method` int(10) unsigned NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `spacePHID` varbinary(64) DEFAULT NULL, + `mailKey` binary(20) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phid` (`phid`), + KEY `key_space` (`spacePHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_slowvote`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `slowvote_transaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_slowvote`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `slowvote_transaction_comment` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `transactionPHID` varbinary(64) DEFAULT NULL, + `authorPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `content` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isDeleted` tinyint(1) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_version` (`transactionPHID`,`commentVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_spaces` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_spaces`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_spaces`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_spaces`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `spaces_namespace` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `namespaceName` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `isDefaultNamespace` tinyint(1) DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `description` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `isArchived` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_default` (`isDefaultNamespace`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_spaces`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `spaces_namespacetransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_system` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_system`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `search_query` ( +CREATE TABLE `system_actionlog` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `query` varchar(255) NOT NULL, - `parameters` text NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - `queryKey` varchar(12) NOT NULL, + `actorHash` binary(12) NOT NULL, + `actorIdentity` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `action` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `score` double NOT NULL, + `epoch` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `queryKey` (`queryKey`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_epoch` (`epoch`), + KEY `key_action` (`actorHash`,`action`,`epoch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_system`; -CREATE DATABASE `{$NAMESPACE}_slowvote` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_slowvote`; + SET NAMES utf8 ; -CREATE TABLE `slowvote_choice` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `system_destructionlog` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `pollID` int(10) unsigned NOT NULL, - `optionID` int(10) unsigned NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, + `objectClass` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rootLogID` int(10) unsigned DEFAULT NULL, + `objectPHID` varbinary(64) DEFAULT NULL, + `objectMonogram` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `epoch` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - KEY `pollID` (`pollID`), - KEY `authorPHID` (`authorPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_epoch` (`epoch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_token` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE TABLE `slowvote_comment` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `pollID` int(10) unsigned NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `commentText` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `pollID` (`pollID`,`authorPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +USE `{$NAMESPACE}_token`; + SET NAMES utf8 ; -CREATE TABLE `slowvote_option` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `token_count` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `pollID` int(10) unsigned NOT NULL, - `name` varchar(255) NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `tokenCount` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - KEY `pollID` (`pollID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_objectPHID` (`objectPHID`), + KEY `key_count` (`tokenCount`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_token`; -CREATE TABLE `slowvote_poll` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `token_given` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `question` varchar(255) NOT NULL, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `responseVisibility` int(10) unsigned NOT NULL, - `shuffle` int(10) unsigned NOT NULL, - `method` int(10) unsigned NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `tokenPHID` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `phid` (`phid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_all` (`objectPHID`,`authorPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_token` (`tokenPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_token`; -CREATE DATABASE `{$NAMESPACE}_timeline` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_timeline`; + SET NAMES utf8 ; -CREATE TABLE `timeline_cursor` ( - `name` varchar(255) NOT NULL, - `position` int(10) unsigned NOT NULL, - PRIMARY KEY (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + SET character_set_client = {$CHARSET} ; - -CREATE TABLE `timeline_event` ( +CREATE TABLE `token_token` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `type` char(4) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `dataID` int(10) unsigned DEFAULT NULL, + `phid` varbinary(64) NOT NULL, + `name` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `flavor` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `builtinKey` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `creatorPHID` varbinary(64) NOT NULL, + `tokenImagePHID` varbinary(64) DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `dataID` (`dataID`), - KEY `type` (`type`,`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_builtin` (`builtinKey`), + KEY `key_creator` (`creatorPHID`,`dateModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_user` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE TABLE `timeline_eventdata` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `eventData` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +USE `{$NAMESPACE}_user`; + SET NAMES utf8 ; -CREATE DATABASE `{$NAMESPACE}_user` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_user`; + SET character_set_client = {$CHARSET} ; CREATE TABLE `edge` ( - `src` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `src` varbinary(64) NOT NULL, `type` int(10) unsigned NOT NULL, - `dst` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `dst` varbinary(64) NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `seq` int(10) unsigned NOT NULL, `dataID` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), KEY `src` (`src`,`type`,`dateCreated`,`seq`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; CREATE TABLE `edgedata` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `phabricator_session` ( - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `type` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `sessionKey` varchar(40) NOT NULL, + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `userPHID` varbinary(64) NOT NULL, + `type` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `sessionKey` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `sessionStart` int(10) unsigned NOT NULL, - PRIMARY KEY (`userPHID`,`type`), - UNIQUE KEY `sessionKey` (`sessionKey`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + `sessionExpires` int(10) unsigned NOT NULL, + `highSecurityUntil` int(10) unsigned DEFAULT NULL, + `isPartial` tinyint(1) NOT NULL DEFAULT '0', + `signedLegalpadDocuments` tinyint(1) NOT NULL DEFAULT '0', + `phid` varbinary(64) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `sessionKey` (`sessionKey`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_identity` (`userPHID`,`type`), + KEY `key_expires` (`sessionExpires`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `phid` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `userName` varchar(64) NOT NULL, - `realName` varchar(128) NOT NULL, - `sex` char(1) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `translation` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `passwordSalt` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `passwordHash` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `phid` varbinary(64) NOT NULL, + `userName` varchar(64) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `realName` varchar(128) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `profileImagePHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `consoleEnabled` tinyint(1) NOT NULL, - `consoleVisible` tinyint(1) NOT NULL, - `consoleTab` varchar(64) NOT NULL, - `conduitCertificate` varchar(255) NOT NULL, + `profileImagePHID` varbinary(64) DEFAULT NULL, + `conduitCertificate` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `isSystemAgent` tinyint(1) NOT NULL DEFAULT '0', `isDisabled` tinyint(1) NOT NULL, `isAdmin` tinyint(1) NOT NULL, - `timezoneIdentifier` varchar(255) NOT NULL, + `isEmailVerified` int(10) unsigned NOT NULL, + `isApproved` int(10) unsigned NOT NULL, + `accountSecret` binary(64) NOT NULL, + `isEnrolledInMultiFactor` tinyint(1) NOT NULL DEFAULT '0', + `availabilityCache` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `availabilityCacheTTL` int(10) unsigned DEFAULT NULL, + `isMailingList` tinyint(1) NOT NULL, + `defaultProfileImagePHID` varbinary(64) DEFAULT NULL, + `defaultProfileImageVersion` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `userName` (`userName`), UNIQUE KEY `phid` (`phid`), - KEY `realName` (`realName`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `realName` (`realName`), + KEY `key_approved` (`isApproved`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `user_authinvite` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `authorPHID` varbinary(64) NOT NULL, + `emailAddress` varchar(128) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `verificationHash` binary(12) NOT NULL, + `acceptedByPHID` varbinary(64) DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `phid` varbinary(64) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_address` (`emailAddress`), + UNIQUE KEY `key_code` (`verificationHash`), + UNIQUE KEY `key_phid` (`phid`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; +CREATE TABLE `user_cache` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `userPHID` varbinary(64) NOT NULL, + `cacheIndex` binary(12) NOT NULL, + `cacheKey` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `cacheData` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `cacheType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_usercache` (`userPHID`,`cacheIndex`), + KEY `key_cachekey` (`cacheIndex`), + KEY `key_cachetype` (`cacheType`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `user_configuredcustomfieldstorage` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `fieldIndex` binary(12) NOT NULL, + `fieldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `objectPHID` (`objectPHID`,`fieldIndex`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `user_customfieldnumericindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `indexKey` binary(12) NOT NULL, + `indexValue` bigint(20) NOT NULL, + PRIMARY KEY (`id`), + KEY `key_join` (`objectPHID`,`indexKey`,`indexValue`), + KEY `key_find` (`indexKey`,`indexValue`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `user_customfieldstringindex` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `objectPHID` varbinary(64) NOT NULL, + `indexKey` binary(12) NOT NULL, + `indexValue` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_join` (`objectPHID`,`indexKey`,`indexValue`(64)), + KEY `key_find` (`indexKey`,`indexValue`(64)) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `user_email` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `address` varchar(128) NOT NULL, + `userPHID` varbinary(64) NOT NULL, + `address` varchar(128) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, `isVerified` tinyint(1) NOT NULL DEFAULT '0', `isPrimary` tinyint(1) NOT NULL DEFAULT '0', - `verificationCode` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `verificationCode` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `address` (`address`), KEY `userPHID` (`userPHID`,`isPrimary`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `user_ldapinfo` ( +CREATE TABLE `user_externalaccount` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `userID` int(10) unsigned NOT NULL, - `ldapUsername` varchar(255) NOT NULL, + `phid` varbinary(64) NOT NULL, + `userPHID` varbinary(64) DEFAULT NULL, + `accountType` varchar(16) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `accountDomain` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `accountSecret` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT}, + `accountID` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `displayName` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `username` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `realName` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `email` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `emailVerified` tinyint(1) NOT NULL, + `accountURI` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `profileImagePHID` varbinary(64) DEFAULT NULL, + `properties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `providerConfigPHID` varbinary(64) NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `userID` (`userID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `account_details` (`accountType`,`accountDomain`,`accountID`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_user` (`userPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `user_log` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `actorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `action` varchar(64) NOT NULL, - `oldValue` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `newValue` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `details` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `actorPHID` varbinary(64) DEFAULT NULL, + `userPHID` varbinary(64) NOT NULL, + `action` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `details` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `remoteAddr` varchar(45) NOT NULL, - `session` varchar(40) DEFAULT NULL, + `remoteAddr` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `session` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, PRIMARY KEY (`id`), KEY `actorPHID` (`actorPHID`,`dateCreated`), KEY `userPHID` (`userPHID`,`dateCreated`), @@ -2186,119 +10213,267 @@ CREATE TABLE `user_log` ( KEY `dateCreated` (`dateCreated`), KEY `remoteAddr` (`remoteAddr`,`dateCreated`), KEY `session` (`session`,`dateCreated`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; CREATE TABLE `user_nametoken` ( - `token` varchar(255) NOT NULL, + `token` varchar(255) CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, `userID` int(10) unsigned NOT NULL, - KEY `token` (`token`), + KEY `token` (`token`(128)), KEY `userID` (`userID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + SET NAMES utf8 ; -CREATE TABLE `user_oauthinfo` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `user_preferences` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `userID` int(10) unsigned NOT NULL, - `oauthProvider` varchar(255) NOT NULL, - `oauthUID` varchar(255) NOT NULL, + `userPHID` varbinary(64) DEFAULT NULL, + `preferences` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, - `accountURI` varchar(255) DEFAULT NULL, - `accountName` varchar(255) DEFAULT NULL, - `token` varchar(255) DEFAULT NULL, - `tokenExpires` int(10) unsigned DEFAULT NULL, - `tokenScope` varchar(255) DEFAULT NULL, - `tokenStatus` varchar(255) DEFAULT NULL, + `phid` varbinary(64) NOT NULL, + `builtinKey` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `userID` (`userID`,`oauthProvider`), - UNIQUE KEY `oauthProvider` (`oauthProvider`,`oauthUID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_builtin` (`builtinKey`), + UNIQUE KEY `key_user` (`userPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_user`; -CREATE TABLE `user_preferences` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `user_preferencestransaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `preferences` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `userPHID` (`userPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `user_profile` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `title` varchar(255) NOT NULL, - `blurb` text NOT NULL, - `profileImagePHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `userPHID` varbinary(64) NOT NULL, + `title` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `blurb` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `profileImagePHID` varbinary(64) DEFAULT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `icon` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `userPHID` (`userPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; -CREATE TABLE `user_sshkey` ( +CREATE TABLE `user_transaction` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `name` varchar(255) DEFAULT NULL, - `keyType` varchar(255) DEFAULT NULL, - `keyBody` text CHARACTER SET utf8 COLLATE utf8_bin, - `keyHash` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `keyComment` varchar(255) DEFAULT NULL, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `keyHash` (`keyHash`), - KEY `userPHID` (`userPHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; -CREATE TABLE `user_status` ( + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `user_user_fdocument` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `userPHID` varchar(64) NOT NULL, - `dateFrom` int(10) unsigned NOT NULL, - `dateTo` int(10) unsigned NOT NULL, - `status` tinyint(3) unsigned NOT NULL, - `dateCreated` int(10) unsigned NOT NULL, - `dateModified` int(10) unsigned NOT NULL, - `description` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `isClosed` tinyint(1) NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `ownerPHID` varbinary(64) DEFAULT NULL, + `epochCreated` int(10) unsigned NOT NULL, + `epochModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_object` (`objectPHID`), + KEY `key_author` (`authorPHID`), + KEY `key_owner` (`ownerPHID`), + KEY `key_created` (`epochCreated`), + KEY `key_modified` (`epochModified`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `user_user_ffield` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `fieldKey` varchar(4) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `rawCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `termCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + `normalCorpus` longtext CHARACTER SET {$CHARSET_SORT} COLLATE {$COLLATE_SORT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_documentfield` (`documentID`,`fieldKey`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `user_user_fngrams` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `documentID` int(10) unsigned NOT NULL, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_ngram` (`ngram`,`documentID`), + KEY `key_object` (`documentID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_user`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `user_user_fngrams_common` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ngram` char(3) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `needsCollection` tinyint(1) NOT NULL, PRIMARY KEY (`id`), - KEY `userPHID_dateFrom` (`userPHID`,`dateTo`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `key_ngram` (`ngram`), + KEY `key_collect` (`needsCollection`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_worker` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; + +USE `{$NAMESPACE}_worker`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edge` ( + `src` varbinary(64) NOT NULL, + `type` int(10) unsigned NOT NULL, + `dst` varbinary(64) NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `seq` int(10) unsigned NOT NULL, + `dataID` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`src`,`type`,`dst`), + UNIQUE KEY `key_dst` (`dst`,`type`,`src`), + KEY `src` (`src`,`type`,`dateCreated`,`seq`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_worker`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `edgedata` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; -CREATE DATABASE `{$NAMESPACE}_worker` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `{$NAMESPACE}_worker`; + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + CREATE TABLE `lisk_counter` ( - `counterName` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `counterName` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `counterValue` bigint(20) unsigned NOT NULL, PRIMARY KEY (`counterName`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +INSERT INTO `lisk_counter` VALUES ('worker_activetask',5); + +USE `{$NAMESPACE}_worker`; + + SET NAMES utf8 ; -INSERT INTO `lisk_counter` (`counterName`, `counterValue`) VALUES -('worker_activetask', 2); + SET character_set_client = {$CHARSET} ; CREATE TABLE `worker_activetask` ( `id` int(10) unsigned NOT NULL, - `taskClass` varchar(255) NOT NULL, - `leaseOwner` varchar(255) DEFAULT NULL, + `taskClass` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `leaseOwner` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, `leaseExpires` int(10) unsigned DEFAULT NULL, `failureCount` int(10) unsigned NOT NULL, - `dataID` int(10) unsigned DEFAULT NULL, + `dataID` int(10) unsigned NOT NULL, + `failureTime` int(10) unsigned DEFAULT NULL, + `priority` int(10) unsigned NOT NULL, + `objectPHID` varbinary(64) DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `dataID` (`dataID`), - KEY `taskClass` (`taskClass`), KEY `leaseExpires` (`leaseExpires`), - KEY `leaseOwner` (`leaseOwner`(16)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `key_failuretime` (`failureTime`), + KEY `taskClass` (`taskClass`), + KEY `key_owner` (`leaseOwner`,`priority`,`id`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +INSERT INTO `worker_activetask` VALUES (3,'PhabricatorRebuildIndexesWorker',NULL,NULL,0,1,NULL,3500,NULL,1556231702,1556231702),(4,'PhabricatorRebuildIndexesWorker',NULL,NULL,0,2,NULL,3500,NULL,1556231702,1556231702),(5,'PhabricatorRebuildIndexesWorker',NULL,NULL,0,3,NULL,3500,NULL,1556231702,1556231702); + +USE `{$NAMESPACE}_worker`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; CREATE TABLE `worker_archivetask` ( `id` int(10) unsigned NOT NULL, - `taskClass` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `leaseOwner` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, + `taskClass` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `leaseOwner` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, `leaseExpires` int(10) unsigned DEFAULT NULL, `failureCount` int(10) unsigned NOT NULL, `dataID` int(10) unsigned NOT NULL, @@ -2306,46 +10481,171 @@ CREATE TABLE `worker_archivetask` ( `duration` bigint(20) unsigned NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, + `priority` int(10) unsigned NOT NULL, + `objectPHID` varbinary(64) DEFAULT NULL, + `archivedEpoch` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`id`), - KEY `dateCreated` (`dateCreated`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `dateCreated` (`dateCreated`), + KEY `key_modified` (`dateModified`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_worker`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `worker_bulkjob` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `jobTypeKey` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `parameters` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `size` int(10) unsigned NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + `isSilent` tinyint(1) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_type` (`jobTypeKey`), + KEY `key_author` (`authorPHID`), + KEY `key_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_worker`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `worker_bulkjobtransaction` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `authorPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `viewPolicy` varbinary(64) NOT NULL, + `editPolicy` varbinary(64) NOT NULL, + `commentPHID` varbinary(64) DEFAULT NULL, + `commentVersion` int(10) unsigned NOT NULL, + `transactionType` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `oldValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `newValue` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `contentSource` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `metadata` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_worker`; + + SET NAMES utf8 ; + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `worker_bulktask` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `bulkJobPHID` varbinary(64) NOT NULL, + `objectPHID` varbinary(64) NOT NULL, + `status` varchar(32) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + KEY `key_job` (`bulkJobPHID`,`status`), + KEY `key_object` (`objectPHID`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_worker`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; CREATE TABLE `worker_taskdata` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `data` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `data` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +INSERT INTO `worker_taskdata` VALUES (1,'{\"queryClass\":\"PhabricatorDashboardQuery\"}'),(2,'{\"queryClass\":\"PhabricatorDashboardPanelQuery\"}'),(3,'{\"queryClass\":\"HeraldRuleQuery\"}'); + +USE `{$NAMESPACE}_worker`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `worker_trigger` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `phid` varbinary(64) NOT NULL, + `triggerVersion` int(10) unsigned NOT NULL, + `clockClass` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `clockProperties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `actionClass` varchar(64) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `actionProperties` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_phid` (`phid`), + UNIQUE KEY `key_trigger` (`triggerVersion`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; + +USE `{$NAMESPACE}_worker`; + + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `worker_triggerevent` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `triggerID` int(10) unsigned NOT NULL, + `lastEventEpoch` int(10) unsigned DEFAULT NULL, + `nextEventEpoch` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `key_trigger` (`triggerID`), + KEY `key_next` (`nextEventEpoch`) +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_xhpast` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE DATABASE `{$NAMESPACE}_xhpastview` /*!40100 DEFAULT CHARACTER SET utf8 */; -USE `{$NAMESPACE}_xhpastview`; +USE `{$NAMESPACE}_xhpast`; -CREATE TABLE `xhpastview_parsetree` ( + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + +CREATE TABLE `xhpast_parsetree` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `authorPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `input` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `stdout` longtext CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `authorPHID` varbinary(64) DEFAULT NULL, + `input` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `returnCode` int(10) NOT NULL, + `stdout` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, + `stderr` longtext CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} NOT NULL, `dateCreated` int(10) unsigned NOT NULL, `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `{$NAMESPACE}_xhprof` /*!40100 DEFAULT CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} */; -CREATE DATABASE `{$NAMESPACE}_xhprof` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `{$NAMESPACE}_xhprof`; + SET NAMES utf8 ; + + SET character_set_client = {$CHARSET} ; + CREATE TABLE `xhprof_sample` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `filePHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `sampleRate` int(11) NOT NULL, + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `filePHID` varbinary(64) NOT NULL, + `sampleRate` int(10) unsigned NOT NULL, `usTotal` bigint(20) unsigned NOT NULL, - `hostname` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `requestPath` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `controller` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `userPHID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `dateCreated` bigint(20) unsigned NOT NULL, - `dateModified` bigint(20) unsigned NOT NULL, + `hostname` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `requestPath` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `controller` varchar(255) CHARACTER SET {$CHARSET} COLLATE {$COLLATE_TEXT} DEFAULT NULL, + `userPHID` varbinary(64) DEFAULT NULL, + `dateCreated` int(10) unsigned NOT NULL, + `dateModified` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `filePHID` (`filePHID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT}; diff --git a/resources/sql/stopwords.txt b/resources/sql/stopwords.txt new file mode 100644 index 0000000000..89f5d060f7 --- /dev/null +++ b/resources/sql/stopwords.txt @@ -0,0 +1,50 @@ +the +be +and +of +a +in +to +have +to +it +I +that +for +you +he +with +on +do +say +this +they +at +but +we +his +from +that +not +by +or +as +what +go +their +can +who +get +if +would +all +my +will +as +up +there +so +its +us +in +on diff --git a/resources/sql/stopwords_myisam.txt b/resources/sql/stopwords_myisam.txt new file mode 100644 index 0000000000..9a0bde3e9b --- /dev/null +++ b/resources/sql/stopwords_myisam.txt @@ -0,0 +1,543 @@ +a's +able +about +above +according +accordingly +across +actually +after +afterwards +again +against +ain't +all +allow +allows +almost +alone +along +already +also +although +always +am +among +amongst +an +and +another +any +anybody +anyhow +anyone +anything +anyway +anyways +anywhere +apart +appear +appreciate +appropriate +are +aren't +around +as +aside +ask +asking +associated +at +available +away +awfully +be +became +because +become +becomes +becoming +been +before +beforehand +behind +being +believe +below +beside +besides +best +better +between +beyond +both +brief +but +by +c'mon +c's +came +can +can't +cannot +cant +cause +causes +certain +certainly +changes +clearly +co +com +come +comes +concerning +consequently +consider +considering +contain +containing +contains +corresponding +could +couldn't +course +currently +definitely +described +despite +did +didn't +different +do +does +doesn't +doing +don't +done +down +downwards +during +each +edu +eg +eight +either +else +elsewhere +enough +entirely +especially +et +etc +even +ever +every +everybody +everyone +everything +everywhere +ex +exactly +example +except +far +few +fifth +first +five +followed +following +follows +for +former +formerly +forth +four +from +further +furthermore +get +gets +getting +given +gives +go +goes +going +gone +got +gotten +greetings +had +hadn't +happens +hardly +has +hasn't +have +haven't +having +he +he's +hello +help +hence +her +here +here's +hereafter +hereby +herein +hereupon +hers +herself +hi +him +himself +his +hither +hopefully +how +howbeit +however +i'd +i'll +i'm +i've +ie +if +ignored +immediate +in +inasmuch +inc +indeed +indicate +indicated +indicates +inner +insofar +instead +into +inward +is +isn't +it +it'd +it'll +it's +its +itself +just +keep +keeps +kept +know +known +knows +last +lately +later +latter +latterly +least +less +lest +let +let's +like +liked +likely +little +look +looking +looks +ltd +mainly +many +may +maybe +me +mean +meanwhile +merely +might +more +moreover +most +mostly +much +must +my +myself +name +namely +nd +near +nearly +necessary +need +needs +neither +never +nevertheless +new +next +nine +no +nobody +non +none +noone +nor +normally +not +nothing +novel +now +nowhere +obviously +of +off +often +oh +ok +okay +old +on +once +one +ones +only +onto +or +other +others +otherwise +ought +our +ours +ourselves +out +outside +over +overall +own +particular +particularly +per +perhaps +placed +please +plus +possible +presumably +probably +provides +que +quite +qv +rather +rd +re +really +reasonably +regarding +regardless +regards +relatively +respectively +right +said +same +saw +say +saying +says +second +secondly +see +seeing +seem +seemed +seeming +seems +seen +self +selves +sensible +sent +serious +seriously +seven +several +shall +she +should +shouldn't +since +six +so +some +somebody +somehow +someone +something +sometime +sometimes +somewhat +somewhere +soon +sorry +specified +specify +specifying +still +sub +such +sup +sure +t's +take +taken +tell +tends +th +than +thank +thanks +thanx +that +that's +thats +the +their +theirs +them +themselves +then +thence +there +there's +thereafter +thereby +therefore +therein +theres +thereupon +these +they +they'd +they'll +they're +they've +think +third +this +thorough +thoroughly +those +though +three +through +throughout +thru +thus +to +together +too +took +toward +towards +tried +tries +truly +try +trying +twice +two +un +under +unfortunately +unless +unlikely +until +unto +up +upon +us +use +used +useful +uses +using +usually +value +various +very +via +viz +vs +want +wants +was +wasn't +way +we +we'd +we'll +we're +we've +welcome +well +went +were +weren't +what +what's +whatever +when +whence +whenever +where +where's +whereafter +whereas +whereby +wherein +whereupon +wherever +whether +which +while +whither +who +who's +whoever +whole +whom +whose +why +will +willing +wish +with +within +without +won't +wonder +would +wouldn't +yes +yet +you +you'd +you'll +you're +you've +your +yours +yourself +yourselves +zero diff --git a/resources/sshd/phabricator-ssh-hook.sh b/resources/sshd/phabricator-ssh-hook.sh new file mode 100755 index 0000000000..fc7de81dad --- /dev/null +++ b/resources/sshd/phabricator-ssh-hook.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +# NOTE: Replace this with the username that you expect users to connect with. +VCSUSER="vcs-user" + +# NOTE: Replace this with the path to your Phabricator directory. +ROOT="/path/to/phabricator" + +if [ "$1" != "$VCSUSER" ]; +then + exit 1 +fi + +exec "$ROOT/bin/ssh-auth" $@ diff --git a/resources/sshd/sshd_config.phabricator.example b/resources/sshd/sshd_config.phabricator.example new file mode 100644 index 0000000000..506d32bbbf --- /dev/null +++ b/resources/sshd/sshd_config.phabricator.example @@ -0,0 +1,24 @@ +# NOTE: You must have OpenSSHD 6.2 or newer; support for AuthorizedKeysCommand +# was added in this version. + +# NOTE: Edit these to the correct values for your setup. + +AuthorizedKeysCommand /usr/libexec/phabricator-ssh-hook.sh +AuthorizedKeysCommandUser vcs-user +AllowUsers vcs-user + +# You may need to tweak these options, but mostly they just turn off everything +# dangerous. + +Port 2222 +Protocol 2 +PermitRootLogin no +AllowAgentForwarding no +AllowTcpForwarding no +PrintMotd no +PrintLastLog no +PasswordAuthentication no +ChallengeResponseAuthentication no +AuthorizedKeysFile none + +PidFile /var/run/sshd-phabricator.pid diff --git a/resources/timezones/generate-timezone-map.php b/resources/timezones/generate-timezone-map.php new file mode 100755 index 0000000000..77ee76c52b --- /dev/null +++ b/resources/timezones/generate-timezone-map.php @@ -0,0 +1,46 @@ +#!/usr/bin/env php +windowsZones->mapTimezones->mapZone; +foreach ($zones as $zone) { + $windows_name = (string)$zone['other']; + $target_name = (string)$zone['type']; + + // Ignore the offset-based timezones from the CLDR map, since we handle + // these later. + if (isset($ignore[$windows_name])) { + continue; + } + + // We've already seen this timezone so we don't need to add it to the map + // again. + if (isset($result_map[$windows_name])) { + continue; + } + + $result_map[$windows_name] = $target_name; +} + +asort($result_map); + +echo id(new PhutilJSON()) + ->encodeFormatted($result_map); diff --git a/resources/timezones/windows-timezones.json b/resources/timezones/windows-timezones.json new file mode 100644 index 0000000000..7a287b6c55 --- /dev/null +++ b/resources/timezones/windows-timezones.json @@ -0,0 +1,126 @@ +{ + "Egypt Standard Time": "Africa/Cairo", + "Morocco Standard Time": "Africa/Casablanca", + "South Africa Standard Time": "Africa/Johannesburg", + "W. Central Africa Standard Time": "Africa/Lagos", + "E. Africa Standard Time": "Africa/Nairobi", + "Libya Standard Time": "Africa/Tripoli", + "Namibia Standard Time": "Africa/Windhoek", + "Aleutian Standard Time": "America/Adak", + "Alaskan Standard Time": "America/Anchorage", + "Tocantins Standard Time": "America/Araguaina", + "Paraguay Standard Time": "America/Asuncion", + "Bahia Standard Time": "America/Bahia", + "SA Pacific Standard Time": "America/Bogota", + "Argentina Standard Time": "America/Buenos_Aires", + "Eastern Standard Time (Mexico)": "America/Cancun", + "Venezuela Standard Time": "America/Caracas", + "SA Eastern Standard Time": "America/Cayenne", + "Central Standard Time": "America/Chicago", + "Mountain Standard Time (Mexico)": "America/Chihuahua", + "Central Brazilian Standard Time": "America/Cuiaba", + "Mountain Standard Time": "America/Denver", + "Greenland Standard Time": "America/Godthab", + "Turks And Caicos Standard Time": "America/Grand_Turk", + "Central America Standard Time": "America/Guatemala", + "Atlantic Standard Time": "America/Halifax", + "Cuba Standard Time": "America/Havana", + "US Eastern Standard Time": "America/Indianapolis", + "SA Western Standard Time": "America/La_Paz", + "Pacific Standard Time": "America/Los_Angeles", + "Central Standard Time (Mexico)": "America/Mexico_City", + "Saint Pierre Standard Time": "America/Miquelon", + "Montevideo Standard Time": "America/Montevideo", + "Eastern Standard Time": "America/New_York", + "US Mountain Standard Time": "America/Phoenix", + "Haiti Standard Time": "America/Port-au-Prince", + "Canada Central Standard Time": "America/Regina", + "Pacific SA Standard Time": "America/Santiago", + "E. South America Standard Time": "America/Sao_Paulo", + "Newfoundland Standard Time": "America/St_Johns", + "Pacific Standard Time (Mexico)": "America/Tijuana", + "Central Asia Standard Time": "Asia/Almaty", + "Jordan Standard Time": "Asia/Amman", + "Arabic Standard Time": "Asia/Baghdad", + "Azerbaijan Standard Time": "Asia/Baku", + "SE Asia Standard Time": "Asia/Bangkok", + "Altai Standard Time": "Asia/Barnaul", + "Middle East Standard Time": "Asia/Beirut", + "India Standard Time": "Asia/Calcutta", + "Transbaikal Standard Time": "Asia/Chita", + "Sri Lanka Standard Time": "Asia/Colombo", + "Syria Standard Time": "Asia/Damascus", + "Bangladesh Standard Time": "Asia/Dhaka", + "Arabian Standard Time": "Asia/Dubai", + "West Bank Standard Time": "Asia/Hebron", + "W. Mongolia Standard Time": "Asia/Hovd", + "North Asia East Standard Time": "Asia/Irkutsk", + "Israel Standard Time": "Asia/Jerusalem", + "Afghanistan Standard Time": "Asia/Kabul", + "Russia Time Zone 11": "Asia/Kamchatka", + "Pakistan Standard Time": "Asia/Karachi", + "Nepal Standard Time": "Asia/Katmandu", + "North Asia Standard Time": "Asia/Krasnoyarsk", + "Magadan Standard Time": "Asia/Magadan", + "N. Central Asia Standard Time": "Asia/Novosibirsk", + "Omsk Standard Time": "Asia/Omsk", + "North Korea Standard Time": "Asia/Pyongyang", + "Myanmar Standard Time": "Asia/Rangoon", + "Arab Standard Time": "Asia/Riyadh", + "Sakhalin Standard Time": "Asia/Sakhalin", + "Korea Standard Time": "Asia/Seoul", + "China Standard Time": "Asia/Shanghai", + "Singapore Standard Time": "Asia/Singapore", + "Russia Time Zone 10": "Asia/Srednekolymsk", + "Taipei Standard Time": "Asia/Taipei", + "West Asia Standard Time": "Asia/Tashkent", + "Georgian Standard Time": "Asia/Tbilisi", + "Iran Standard Time": "Asia/Tehran", + "Tokyo Standard Time": "Asia/Tokyo", + "Tomsk Standard Time": "Asia/Tomsk", + "Ulaanbaatar Standard Time": "Asia/Ulaanbaatar", + "Vladivostok Standard Time": "Asia/Vladivostok", + "Yakutsk Standard Time": "Asia/Yakutsk", + "Ekaterinburg Standard Time": "Asia/Yekaterinburg", + "Caucasus Standard Time": "Asia/Yerevan", + "Azores Standard Time": "Atlantic/Azores", + "Cape Verde Standard Time": "Atlantic/Cape_Verde", + "Greenwich Standard Time": "Atlantic/Reykjavik", + "Cen. Australia Standard Time": "Australia/Adelaide", + "E. Australia Standard Time": "Australia/Brisbane", + "AUS Central Standard Time": "Australia/Darwin", + "Aus Central W. Standard Time": "Australia/Eucla", + "Tasmania Standard Time": "Australia/Hobart", + "Lord Howe Standard Time": "Australia/Lord_Howe", + "W. Australia Standard Time": "Australia/Perth", + "AUS Eastern Standard Time": "Australia/Sydney", + "Dateline Standard Time": "Etc/GMT+12", + "Astrakhan Standard Time": "Europe/Astrakhan", + "W. Europe Standard Time": "Europe/Berlin", + "GTB Standard Time": "Europe/Bucharest", + "Central Europe Standard Time": "Europe/Budapest", + "E. Europe Standard Time": "Europe/Chisinau", + "Turkey Standard Time": "Europe/Istanbul", + "Kaliningrad Standard Time": "Europe/Kaliningrad", + "FLE Standard Time": "Europe/Kiev", + "GMT Standard Time": "Europe/London", + "Belarus Standard Time": "Europe/Minsk", + "Russian Standard Time": "Europe/Moscow", + "Romance Standard Time": "Europe/Paris", + "Russia Time Zone 3": "Europe/Samara", + "Central European Standard Time": "Europe/Warsaw", + "Mauritius Standard Time": "Indian/Mauritius", + "Samoa Standard Time": "Pacific/Apia", + "New Zealand Standard Time": "Pacific/Auckland", + "Bougainville Standard Time": "Pacific/Bougainville", + "Chatham Islands Standard Time": "Pacific/Chatham", + "Easter Island Standard Time": "Pacific/Easter", + "Fiji Standard Time": "Pacific/Fiji", + "Central Pacific Standard Time": "Pacific/Guadalcanal", + "Hawaiian Standard Time": "Pacific/Honolulu", + "Line Islands Standard Time": "Pacific/Kiritimati", + "Marquesas Standard Time": "Pacific/Marquesas", + "Norfolk Standard Time": "Pacific/Norfolk", + "West Pacific Standard Time": "Pacific/Port_Moresby", + "Tonga Standard Time": "Pacific/Tongatapu" +} diff --git a/scripts/__init_script__.php b/scripts/__init_script__.php index c0a198a145..b807ae68a4 100644 --- a/scripts/__init_script__.php +++ b/scripts/__init_script__.php @@ -1,24 +1,3 @@ setTagline(pht('manage host directory')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('AlmanacManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/aphront/aphrontpath.php b/scripts/aphront/aphrontpath.php deleted file mode 100755 index 627ae064c1..0000000000 --- a/scripts/aphront/aphrontpath.php +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env php -\n"; - echo "Purpose: Print controller which will process passed .\n"; - exit(1); -} - -$url = parse_url(http://github.com/$argv[1]); -$path = '/'.(isset($url['path']) ? ltrim($url['path'], '/') : ''); - -$config_key = 'aphront.default-application-configuration-class'; -$application = PhabricatorEnv::newObjectFromConfig($config_key); -$application->setRequest(new AphrontRequest('', $path)); - -list($controller) = $application->buildControllerForPath($path); -if (!$controller && substr($path, -1) !== '/') { - list($controller) = $application->buildControllerForPath($path.'/'); -} -if ($controller) { - echo get_class($controller) . "\n"; -} diff --git a/scripts/cache/manage_cache.php b/scripts/cache/manage_cache.php index 20c4bc1d84..002ba2be58 100755 --- a/scripts/cache/manage_cache.php +++ b/scripts/cache/manage_cache.php @@ -5,7 +5,7 @@ require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('manage mail'); +$args->setTagline(pht('manage cache')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new PhabricatorCacheManagementPurgeWorkflow(), - new PhutilHelpArgumentWorkflow(), -); - +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorCacheManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/calendar/import_us_holidays.php b/scripts/calendar/import_us_holidays.php deleted file mode 100755 index 76a78a299e..0000000000 --- a/scripts/calendar/import_us_holidays.php +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env php - "New Year's Day", - '2013-01-21' => "Birthday of Martin Luther King, Jr.", - '2013-02-18' => "Washington's Birthday", - '2013-05-27' => "Memorial Day", - '2013-07-04' => "Independence Day", - '2013-09-02' => "Labor Day", - '2013-10-14' => "Columbus Day", - '2013-11-11' => "Veterans Day", - '2013-11-28' => "Thanksgiving Day", - '2013-12-25' => "Christmas Day", - '2014-01-01' => "New Year's Day", - '2014-01-20' => "Birthday of Martin Luther King, Jr.", - '2014-02-17' => "Washington's Birthday", - '2014-05-26' => "Memorial Day", - '2014-07-04' => "Independence Day", - '2014-09-01' => "Labor Day", - '2014-10-13' => "Columbus Day", - '2014-11-11' => "Veterans Day", - '2014-11-27' => "Thanksgiving Day", - '2014-12-25' => "Christmas Day", - '2015-01-01' => "New Year's Day", - '2015-01-19' => "Birthday of Martin Luther King, Jr.", - '2015-02-16' => "Washington's Birthday", - '2015-05-25' => "Memorial Day", - '2015-07-03' => "Independence Day", - '2015-09-07' => "Labor Day", - '2015-10-12' => "Columbus Day", - '2015-11-11' => "Veterans Day", - '2015-11-26' => "Thanksgiving Day", - '2015-12-25' => "Christmas Day", - '2016-01-01' => "New Year's Day", - '2016-01-18' => "Birthday of Martin Luther King, Jr.", - '2016-02-15' => "Washington's Birthday", - '2016-05-30' => "Memorial Day", - '2016-07-04' => "Independence Day", - '2016-09-05' => "Labor Day", - '2016-10-10' => "Columbus Day", - '2016-11-11' => "Veterans Day", - '2016-11-24' => "Thanksgiving Day", - '2016-12-26' => "Christmas Day", -); - -$table = new PhabricatorCalendarHoliday(); -$conn_w = $table->establishConnection('w'); -$table_name = $table->getTableName(); - -foreach ($holidays as $day => $name) { - queryfx( - $conn_w, - 'INSERT IGNORE INTO %T (day, name) VALUES (%s, %s)', - $table_name, - $day, - $name); -} diff --git a/scripts/celerity/generate_emoji.php b/scripts/celerity/generate_emoji.php new file mode 100755 index 0000000000..d533752932 --- /dev/null +++ b/scripts/celerity/generate_emoji.php @@ -0,0 +1,50 @@ +#!/usr/bin/env php +setTagline(pht('regenerate Emoji data sheets')); +$args->setSynopsis(<<parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'force', + 'help' => pht('Force regeneration even if sources have not changed.'), + ), + )); + +$root = dirname(phutil_get_library_root('phabricator')); +// move this to an argument? +$path = $root.'/emoji_strategy.json'; +$export_path = $root.'/resources/emoji/manifest.json'; + +if (Filesystem::pathExists($path)) { + $json = Filesystem::readFile($path); + + $emojis = phutil_json_decode($json); + $data = array(); + foreach ($emojis as $shortname => $emoji) { + $unicode = $emoji['unicode']; + $codes = explode('-', $unicode); + $hex = ''; + foreach ($codes as $code) { + $hex .= phutil_utf8_encode_codepoint(hexdec($code)); + } + $data[$shortname] = $hex; + } + + ksort($data); + $json = new PhutilJSON(); + $data = $json->encodeFormatted($data); + Filesystem::writeFile($export_path, $data); + echo pht('Done.')."\n"; +} else { + echo pht('Path %s not exist.', $path)."\n"; +} diff --git a/scripts/celerity/generate_sprites.php b/scripts/celerity/generate_sprites.php index b359da2291..ccdd194b36 100755 --- a/scripts/celerity/generate_sprites.php +++ b/scripts/celerity/generate_sprites.php @@ -4,7 +4,7 @@ require_once dirname(dirname(__FILE__)).'/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('regenerate CSS sprite sheets'); +$args->setTagline(pht('regenerate CSS sprite sheets')); $args->setSynopsis(<< 'force', - 'help' => 'Force regeneration even if sources have not changed.', + 'help' => pht('Force regeneration even if sources have not changed.'), ), )); @@ -27,27 +27,18 @@ $generator = new CeleritySpriteGenerator(); $sheets = array( - 'icons' => $generator->buildIconSheet(), - 'menu' => $generator->buildMenuSheet(), - 'apps' => $generator->buildAppsSheet(), - 'actions' => $generator->buildActionsSheet(), - 'minicons' => $generator->buildMiniconsSheet(), - 'conpherence' => $generator->buildConpherenceSheet(), - 'apps-large' => $generator->buildAppsLargeSheet(), - 'payments' => $generator->buildPaymentsSheet(), 'tokens' => $generator->buildTokenSheet(), - 'docs' => $generator->buildDocsSheet(), - 'gradient' => $generator->buildGradientSheet(), 'login' => $generator->buildLoginSheet(), - 'status' => $generator->buildStatusSheet(), ); list($err) = exec_manual('optipng'); if ($err) { $have_optipng = false; echo phutil_console_format( - " WARNING `optipng` not found in PATH.\n". - "Sprites will not be optimized! Install `optipng`!\n"); + " %s %s\n%s\n", + pht('WARNING'), + pht('`%s` not found in PATH.', 'optipng'), + pht('Sprites will not be optimized! Install `%s`!', 'optipng')); } else { $have_optipng = true; } @@ -60,7 +51,7 @@ if (!$args->getArg('force')) { if (Filesystem::pathExists($manifest_path)) { $data = Filesystem::readFile($manifest_path); - $data = json_decode($data, true); + $data = phutil_json_decode($data); if (!$sheet->needsRegeneration($data)) { continue; } @@ -82,10 +73,10 @@ $sheet->generateImage($full_path, $scale); if ($have_optipng) { - echo "Optimizing...\n"; + echo pht('Optimizing...')."\n"; phutil_passthru('optipng -o7 -clobber %s', $full_path); } } } -echo "Done.\n"; +echo pht('Done.')."\n"; diff --git a/scripts/celerity/install_merge.sh b/scripts/celerity/install_merge.sh index d6c0e97866..84a627b5b2 100755 --- a/scripts/celerity/install_merge.sh +++ b/scripts/celerity/install_merge.sh @@ -1,9 +1,9 @@ #!/bin/sh -echo "src/__celerity_resource_map__.php merge=celerity" \ +echo "resources/celerity/map.php merge=celerity" \ >> `dirname "$0"`/../../.git/info/attributes git config merge.celerity.name "Celerity Mapper" git config merge.celerity.driver \ - 'php $GIT_DIR/../scripts/celerity_mapper.php $GIT_DIR/../webroot' + 'php $GIT_DIR/../bin/celerity map' diff --git a/scripts/celerity_mapper.php b/scripts/celerity_mapper.php deleted file mode 100755 index b6e3760b9d..0000000000 --- a/scripts/celerity_mapper.php +++ /dev/null @@ -1,411 +0,0 @@ -#!/usr/bin/env php - array( - 'javelin-util', - 'javelin-install', - 'javelin-event', - 'javelin-stratcom', - 'javelin-behavior', - 'javelin-resource', - 'javelin-request', - 'javelin-vector', - 'javelin-dom', - 'javelin-json', - 'javelin-uri', - 'javelin-workflow', - 'javelin-mask', - 'javelin-typeahead', - 'javelin-typeahead-normalizer', - 'javelin-typeahead-source', - 'javelin-typeahead-preloaded-source', - 'javelin-typeahead-ondemand-source', - 'javelin-tokenizer', - 'javelin-history', - ), - 'core.pkg.js' => array( - 'javelin-behavior-aphront-basic-tokenizer', - 'javelin-behavior-workflow', - 'javelin-behavior-aphront-form-disable-on-submit', - 'phabricator-keyboard-shortcut-manager', - 'phabricator-keyboard-shortcut', - 'javelin-behavior-phabricator-keyboard-shortcuts', - 'javelin-behavior-refresh-csrf', - 'javelin-behavior-phabricator-watch-anchor', - 'javelin-behavior-phabricator-autofocus', - 'phabricator-menu-item', - 'phabricator-dropdown-menu', - 'phabricator-phtize', - 'javelin-behavior-phabricator-oncopy', - 'phabricator-tooltip', - 'javelin-behavior-phabricator-tooltips', - 'phabricator-prefab', - 'javelin-behavior-device', - 'javelin-behavior-toggle-class', - 'javelin-behavior-lightbox-attachments', - 'phabricator-busy', - 'javelin-aphlict', - 'phabricator-notification', - 'javelin-behavior-aphlict-listen', - 'javelin-behavior-phabricator-search-typeahead', - 'javelin-behavior-konami', - 'javelin-behavior-aphlict-dropdown', - 'javelin-behavior-history-install', - 'javelin-behavior-phabricator-gesture', - - 'javelin-behavior-phabricator-active-nav', - 'javelin-behavior-phabricator-nav', - 'javelin-behavior-phabricator-remarkup-assist', - 'phabricator-textareautils', - 'phabricator-file-upload', - 'javelin-behavior-global-drag-and-drop', - 'javelin-behavior-phabricator-reveal-content', - 'phabricator-hovercard', - 'javelin-behavior-phabricator-hovercards', - ), - 'core.pkg.css' => array( - 'phabricator-core-css', - 'phabricator-zindex-css', - 'phui-button-css', - 'phabricator-standard-page-view', - 'aphront-dialog-view-css', - 'aphront-form-view-css', - 'aphront-panel-view-css', - 'aphront-table-view-css', - 'aphront-tokenizer-control-css', - 'aphront-typeahead-control-css', - 'aphront-list-filter-view-css', - - 'phabricator-jump-nav', - - 'phabricator-remarkup-css', - 'syntax-highlighting-css', - 'aphront-pager-view-css', - 'phabricator-transaction-view-css', - 'aphront-tooltip-css', - 'phabricator-flag-css', - 'aphront-error-view-css', - - 'sprite-icons-css', - 'sprite-gradient-css', - 'sprite-menu-css', - 'sprite-apps-large-css', - - 'phabricator-main-menu-view', - 'phabricator-notification-css', - 'phabricator-notification-menu-css', - 'lightbox-attachment-css', - 'phabricator-header-view-css', - 'phabricator-form-view-css', - 'phabricator-filetree-view-css', - 'phabricator-nav-view-css', - 'phabricator-side-menu-view-css', - 'phabricator-crumbs-view-css', - 'phabricator-object-item-list-view-css', - 'global-drag-and-drop-css', - 'phui-spacing-css', - 'phui-form-css', - 'phui-icon-view-css', - - 'phabricator-application-launch-view-css', - 'phabricator-action-list-view-css', - 'phabricator-property-list-view-css', - 'phabricator-tag-view-css', - ), - 'differential.pkg.css' => array( - 'differential-core-view-css', - 'differential-changeset-view-css', - 'differential-results-table-css', - 'differential-revision-history-css', - 'differential-revision-list-css', - 'differential-table-of-contents-css', - 'differential-revision-comment-css', - 'differential-revision-add-comment-css', - 'differential-revision-comment-list-css', - 'phabricator-object-selector-css', - 'phabricator-content-source-view-css', - 'differential-local-commits-view-css', - 'inline-comment-summary-css', - ), - 'differential.pkg.js' => array( - 'phabricator-drag-and-drop-file-upload', - 'phabricator-shaped-request', - - 'javelin-behavior-differential-feedback-preview', - 'javelin-behavior-differential-edit-inline-comments', - 'javelin-behavior-differential-populate', - 'javelin-behavior-differential-show-more', - 'javelin-behavior-differential-diff-radios', - 'javelin-behavior-differential-accept-with-errors', - 'javelin-behavior-differential-comment-jump', - 'javelin-behavior-differential-add-reviewers-and-ccs', - 'javelin-behavior-differential-keyboard-navigation', - 'javelin-behavior-aphront-drag-and-drop-textarea', - 'javelin-behavior-phabricator-object-selector', - 'javelin-behavior-repository-crossreference', - 'javelin-behavior-load-blame', - - 'differential-inline-comment-editor', - 'javelin-behavior-differential-dropdown-menus', - 'javelin-behavior-differential-toggle-files', - 'javelin-behavior-differential-user-select', - ), - 'diffusion.pkg.css' => array( - 'diffusion-commit-view-css', - 'diffusion-icons-css', - ), - 'diffusion.pkg.js' => array( - 'javelin-behavior-diffusion-pull-lastmodified', - 'javelin-behavior-diffusion-commit-graph', - 'javelin-behavior-audit-preview', - ), - 'maniphest.pkg.css' => array( - 'maniphest-task-summary-css', - 'maniphest-transaction-detail-css', - 'phabricator-project-tag-css', - ), - 'maniphest.pkg.js' => array( - 'javelin-behavior-maniphest-batch-selector', - 'javelin-behavior-maniphest-transaction-controls', - 'javelin-behavior-maniphest-transaction-preview', - 'javelin-behavior-maniphest-transaction-expand', - 'javelin-behavior-maniphest-subpriority-editor', - ), - 'darkconsole.pkg.js' => array( - 'javelin-behavior-dark-console', - 'javelin-behavior-error-log', - ), -); - - -require_once dirname(__FILE__).'/__init_script__.php'; - -$args = new PhutilArgumentParser($argv); -$args->setTagline('map static resources'); -$args->setSynopsis( - "**celerity_mapper.php** [--output __path__] [--with-custom] "); -$args->parse( - array( - array( - 'name' => 'output', - 'param' => 'path', - 'default' => '../src/__celerity_resource_map__.php', - 'help' => "Set the path for resource map. It is usually useful for ". - "'celerity.resource-path' configuration.", - ), - array( - 'name' => 'with-custom', - 'help' => 'Include resources in /rsrc/custom/.', - ), - array( - 'name' => 'webroot', - 'wildcard' => true, - ), - )); - -$root = $args->getArg('webroot'); -if (count($root) != 1 || !is_dir(reset($root))) { - $args->printHelpAndExit(); -} -$root = Filesystem::resolvePath(reset($root)); - -$celerity_path = Filesystem::resolvePath($args->getArg('output'), $root); -$with_custom = $args->getArg('with-custom'); - -$resource_hash = PhabricatorEnv::getEnvConfig('celerity.resource-hash'); -$runtime_map = array(); - -echo "Finding raw static resources...\n"; -$finder = id(new FileFinder($root)) - ->withType('f') - ->withSuffix('png') - ->withSuffix('jpg') - ->withSuffix('gif') - ->withSuffix('swf') - ->withFollowSymlinks(true) - ->setGenerateChecksums(true); -if (!$with_custom) { - $finder->excludePath('./rsrc/custom'); -} -$raw_files = $finder->find(); - -echo "Processing ".count($raw_files)." files"; -foreach ($raw_files as $path => $hash) { - echo "."; - $path = '/'.Filesystem::readablePath($path, $root); - $type = CelerityResourceTransformer::getResourceType($path); - - $hash = md5($hash.$path.$resource_hash); - $uri = '/res/'.substr($hash, 0, 8).$path; - - $runtime_map[$path] = array( - 'hash' => $hash, - 'uri' => $uri, - 'disk' => $path, - 'type' => $type, - ); -} -echo "\n"; - -$xformer = id(new CelerityResourceTransformer()) - ->setMinify(false) - ->setRawResourceMap($runtime_map); - -echo "Finding transformable static resources...\n"; -$finder = id(new FileFinder($root)) - ->withType('f') - ->withSuffix('js') - ->withSuffix('css') - ->withFollowSymlinks(true) - ->setGenerateChecksums(true); -if (!$with_custom) { - $finder->excludePath('./rsrc/custom'); -} -$files = $finder->find(); - -echo "Processing ".count($files)." files"; - -$file_map = array(); -foreach ($files as $path => $raw_hash) { - echo "."; - $path = '/'.Filesystem::readablePath($path, $root); - $data = Filesystem::readFile($root.$path); - - $data = $xformer->transformResource($path, $data); - $hash = md5($data); - $hash = md5($hash.$path.$resource_hash); - - $file_map[$path] = array( - 'hash' => $hash, - 'disk' => $path, - ); -} -echo "\n"; - -$resource_graph = array(); -$hash_map = array(); - -$parser = new PhutilDocblockParser(); -foreach ($file_map as $path => $info) { - $type = CelerityResourceTransformer::getResourceType($path); - - $data = Filesystem::readFile($root.$info['disk']); - $matches = array(); - $ok = preg_match('@/[*][*].*?[*]/@s', $data, $matches); - if (!$ok) { - throw new Exception( - "File {$path} does not have a header doc comment. Encode dependency ". - "data in a header docblock."); - } - - list($description, $metadata) = $parser->parse($matches[0]); - - $provides = preg_split('/\s+/', trim(idx($metadata, 'provides'))); - $requires = preg_split('/\s+/', trim(idx($metadata, 'requires'))); - $provides = array_filter($provides); - $requires = array_filter($requires); - - if (!$provides) { - // Tests and documentation-only JS is permitted to @provide no targets. - continue; - } - - if (count($provides) > 1) { - throw new Exception( - "File {$path} must @provide at most one Celerity target."); - } - - $provides = reset($provides); - - $uri = '/res/'.substr($info['hash'], 0, 8).$path; - - $hash_map[$provides] = $info['hash']; - - $resource_graph[$provides] = $requires; - - $runtime_map[$provides] = array( - 'uri' => $uri, - 'type' => $type, - 'requires' => $requires, - 'disk' => $path, - ); -} - -$celerity_resource_graph = new CelerityResourceGraph(); -$celerity_resource_graph->addNodes($resource_graph); -$celerity_resource_graph->setResourceGraph($resource_graph); -$celerity_resource_graph->loadGraph(); - -foreach ($resource_graph as $provides => $requires) { - $cycle = $celerity_resource_graph->detectCycles($provides); - if ($cycle) { - throw new Exception( - "Cycle detected in resource graph: ". implode($cycle, " => ") - ); - } -} - -$package_map = array(); -foreach ($package_spec as $name => $package) { - $hashes = array(); - $type = null; - foreach ($package as $symbol) { - if (empty($hash_map[$symbol])) { - throw new Exception( - "Package specification for '{$name}' includes '{$symbol}', but that ". - "symbol is not defined anywhere."); - } - if ($type === null) { - $type = $runtime_map[$symbol]['type']; - } else { - $ntype = $runtime_map[$symbol]['type']; - if ($type !== $ntype) { - throw new Exception( - "Package specification for '{$name}' mixes resources of type ". - "'{$type}' with resources of type '{$ntype}'. Each package may only ". - "contain one type of resource."); - } - } - $hashes[] = $symbol.':'.$hash_map[$symbol]; - } - $key = substr(md5(implode("\n", $hashes)), 0, 8); - $package_map['packages'][$key] = array( - 'name' => $name, - 'symbols' => $package, - 'uri' => '/res/pkg/'.$key.'/'.$name, - 'type' => $type, - ); - foreach ($package as $symbol) { - $package_map['reverse'][$symbol] = $key; - } -} - -ksort($runtime_map); -$runtime_map = var_export($runtime_map, true); -$runtime_map = preg_replace('/\s+$/m', '', $runtime_map); -$runtime_map = preg_replace('/array \(/', 'array(', $runtime_map); - -$package_map['packages'] = isort($package_map['packages'], 'name'); -ksort($package_map['reverse']); -$package_map = var_export($package_map, true); -$package_map = preg_replace('/\s+$/m', '', $package_map); -$package_map = preg_replace('/array \(/', 'array(', $package_map); - -$generated = '@'.'generated'; -$resource_map = <<setTagline(pht('daemon executor')); +$args->setSynopsis(<<parse( + array( + array( + 'name' => 'trace', + 'help' => pht('Enable debug tracing.'), + ), + array( + 'name' => 'trace-memory', + 'help' => pht('Enable debug memory tracing.'), + ), + array( + 'name' => 'verbose', + 'help' => pht('Enable verbose activity logging.'), + ), + array( + 'name' => 'label', + 'short' => 'l', + 'param' => 'label', + 'help' => pht( + 'Optional process label. Makes "%s" nicer, no behavioral effects.', + 'ps'), + ), + array( + 'name' => 'daemon', + 'wildcard' => true, + ), + )); + +$trace_memory = $args->getArg('trace-memory'); +$trace_mode = $args->getArg('trace') || $trace_memory; +$verbose = $args->getArg('verbose'); + +if (function_exists('posix_isatty') && posix_isatty(STDIN)) { + fprintf(STDERR, pht('Reading daemon configuration from stdin...')."\n"); +} +$config = @file_get_contents('php://stdin'); +$config = id(new PhutilJSONParser())->parse($config); + +PhutilTypeSpec::checkMap( + $config, + array( + 'log' => 'optional string|null', + 'argv' => 'optional list', + 'load' => 'optional list', + 'down' => 'optional int', + )); + +$log = idx($config, 'log'); + +if ($log) { + ini_set('error_log', $log); + PhutilErrorHandler::setErrorListener(array('PhutilDaemon', 'errorListener')); +} + +$load = idx($config, 'load', array()); +foreach ($load as $library) { + $library = Filesystem::resolvePath($library); + phutil_load_library($library); +} + +PhutilErrorHandler::initialize(); + +$daemon = $args->getArg('daemon'); +if (!$daemon) { + throw new PhutilArgumentUsageException( + pht('Specify which class of daemon to start.')); +} else if (count($daemon) > 1) { + throw new PhutilArgumentUsageException( + pht('Specify exactly one daemon to start.')); +} else { + $daemon = head($daemon); + if (!class_exists($daemon)) { + throw new PhutilArgumentUsageException( + pht( + 'No class "%s" exists in any known library.', + $daemon)); + } else if (!is_subclass_of($daemon, 'PhutilDaemon')) { + throw new PhutilArgumentUsageException( + pht( + 'Class "%s" is not a subclass of "%s".', + $daemon, + 'PhutilDaemon')); + } +} + +$argv = idx($config, 'argv', array()); +$daemon = newv($daemon, array($argv)); + +if ($trace_mode) { + $daemon->setTraceMode(); +} + +if ($trace_memory) { + $daemon->setTraceMemory(); +} + +if ($verbose) { + $daemon->setVerbose(true); +} + +$down_duration = idx($config, 'down'); +if ($down_duration) { + $daemon->setScaledownDuration($down_duration); +} + +$daemon->execute(); diff --git a/scripts/daemon/launch_daemon.php b/scripts/daemon/launch_daemon.php index 21214fecb7..44e70f710d 100755 --- a/scripts/daemon/launch_daemon.php +++ b/scripts/daemon/launch_daemon.php @@ -5,23 +5,20 @@ // script, except it loads the Phabricator environment and adds some Phabricator // specific flags. +if (function_exists('pcntl_async_signals')) { + pcntl_async_signals(true); +} else { + declare(ticks = 1); +} + $root = dirname(dirname(dirname(__FILE__))); require_once $root.'/scripts/__init_script__.php'; -$flags = array(); +$overseer = new PhutilDaemonOverseer($argv); $bootloader = PhutilBootloader::getInstance(); foreach ($bootloader->getAllLibraries() as $library) { - if ($library == 'phutil') { - // No need to load libphutil, it's necessarily loaded implicitly by the - // daemon itself. - continue; - } - $flags[] = '--load-phutil-library='.phutil_get_library_root($library); + $overseer->addLibrary(phutil_get_library_root($library)); } -// Add more flags. -array_splice($argv, 2, 0, $flags); - -$overseer = new PhutilDaemonOverseer($argv); $overseer->run(); diff --git a/scripts/daemon/manage_daemons.php b/scripts/daemon/manage_daemons.php index 4319aa71d5..793bd608d3 100755 --- a/scripts/daemon/manage_daemons.php +++ b/scripts/daemon/manage_daemons.php @@ -7,24 +7,17 @@ PhabricatorDaemonManagementWorkflow::requireExtensions(); $args = new PhutilArgumentParser($argv); -$args->setTagline('manage daemons'); +$args->setTagline(pht('manage daemons')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new PhabricatorDaemonManagementListWorkflow(), - new PhabricatorDaemonManagementStatusWorkflow(), - new PhabricatorDaemonManagementStartWorkflow(), - new PhabricatorDaemonManagementStopWorkflow(), - new PhabricatorDaemonManagementRestartWorkflow(), - new PhabricatorDaemonManagementLaunchWorkflow(), - new PhabricatorDaemonManagementDebugWorkflow(), - new PhabricatorDaemonManagementLogWorkflow(), - new PhutilHelpArgumentWorkflow(), -); +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorDaemonManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/differential/destroy_revision.php b/scripts/differential/destroy_revision.php deleted file mode 100755 index af97de3932..0000000000 --- a/scripts/differential/destroy_revision.php +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env php -setTagline('permanently destroy a Differential Revision'); -$args->setSynopsis(<<parseStandardArguments(); -$args->parse( - array( - array( - 'name' => 'revision', - 'wildcard' => true, - ), - )); - -$revisions = $args->getArg('revision'); -if (count($revisions) != 1) { - $args->printHelpAndExit(); -} - -$id = trim(strtolower(head($revisions)), 'd '); -$revision = id(new DifferentialRevision())->load($id); - -if (!$revision) { - throw new Exception("No revision '{$id}' exists!"); -} - -$title = $revision->getTitle(); -$ok = phutil_console_confirm("Really destroy 'D{$id}: {$title}' forever?"); -if (!$ok) { - throw new Exception("User aborted workflow."); -} - -$revision->delete(); -echo "OK, destroyed revision.\n"; - diff --git a/scripts/differential/remove_empty_revisions.php b/scripts/differential/remove_empty_revisions.php deleted file mode 100755 index 3588890171..0000000000 --- a/scripts/differential/remove_empty_revisions.php +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env php -establishConnection('r'), - 'select distinct r.id from differential_revision r left join '. - 'differential_diff d on r.id=d.revisionID where d.revisionID is NULL'); - -$empty_revisions = ipull($empty_revisions, 'id'); - -if (!$empty_revisions) { - echo "No empty revisions found.\n"; - exit(0); -} - -echo phutil_console_wrap( - "The following revision don't contain any diff:\n". - implode(', ', $empty_revisions)); - -if (!phutil_console_confirm('Do you want to delete them?')) { - echo "Cancelled.\n"; - exit(1); -} - -foreach ($empty_revisions as $revision_id) { - $revision = id(new DifferentialRevision())->load($revision_id); - $revision->delete(); -} - -echo "Done.\n"; diff --git a/scripts/diviner/diviner.php b/scripts/diviner/diviner.php index 9d866ad0b3..fa4c19caa7 100755 --- a/scripts/diviner/diviner.php +++ b/scripts/diviner/diviner.php @@ -6,7 +6,7 @@ $args = new PhutilArgumentParser($argv); -$args->setTagline('documentation generator'); +$args->setTagline(pht('documentation generator')); $args->setSynopsis(<<parseStandardArguments(); -$args->parseWorkflows( - array( - new DivinerGenerateWorkflow(), - new DivinerAtomizeWorkflow(), - new PhutilHelpArgumentWorkflow(), - )); +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('DivinerWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/drydock/drydock_control.php b/scripts/drydock/drydock_control.php index efa9496b7c..f22032b286 100755 --- a/scripts/drydock/drydock_control.php +++ b/scripts/drydock/drydock_control.php @@ -2,10 +2,10 @@ setTagline('manage drydock software resources'); +$args->setTagline(pht('manage drydock software resources')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new DrydockManagementWaitForLeaseWorkflow(), - new DrydockManagementLeaseWorkflow(), - new DrydockManagementCloseWorkflow(), - new DrydockManagementReleaseWorkflow(), - new PhutilHelpArgumentWorkflow(), -); - +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('DrydockManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/fact/manage_facts.php b/scripts/fact/manage_facts.php index 13e3598651..8a773cfbdc 100755 --- a/scripts/fact/manage_facts.php +++ b/scripts/fact/manage_facts.php @@ -5,7 +5,7 @@ require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('manage fact configuration'); +$args->setTagline(pht('manage fact configuration')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new PhabricatorFactManagementDestroyWorkflow(), - new PhabricatorFactManagementAnalyzeWorkflow(), - new PhabricatorFactManagementStatusWorkflow(), - new PhabricatorFactManagementListWorkflow(), - new PhabricatorFactManagementCursorsWorkflow(), - new PhutilHelpArgumentWorkflow(), -); - +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorFactManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/files/manage_files.php b/scripts/files/manage_files.php index c1f276999c..3d7ff887a5 100755 --- a/scripts/files/manage_files.php +++ b/scripts/files/manage_files.php @@ -5,7 +5,7 @@ require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('manage files'); +$args->setTagline(pht('manage files')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new PhabricatorFilesManagementEnginesWorkflow(), - new PhabricatorFilesManagementMigrateWorkflow(), - new PhabricatorFilesManagementRebuildWorkflow(), - new PhabricatorFilesManagementPurgeWorkflow(), - new PhutilHelpArgumentWorkflow(), -); - +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorFilesManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/fpm/warmup.php b/scripts/fpm/warmup.php deleted file mode 100644 index 956a474131..0000000000 --- a/scripts/fpm/warmup.php +++ /dev/null @@ -1,38 +0,0 @@ -selectAndLoadSymbols(); - - define('__WARMUP__', true); -} - -__warmup__(); diff --git a/scripts/init/init-aphlict.php b/scripts/init/init-aphlict.php new file mode 100644 index 0000000000..e2029a0d2a --- /dev/null +++ b/scripts/init/init-aphlict.php @@ -0,0 +1,10 @@ + true, + )); diff --git a/scripts/init/init-script-with-signals.php b/scripts/init/init-script-with-signals.php new file mode 100644 index 0000000000..a479c4b758 --- /dev/null +++ b/scripts/init/init-script-with-signals.php @@ -0,0 +1,11 @@ + false, + )); diff --git a/scripts/init/init-setup.php b/scripts/init/init-setup.php new file mode 100644 index 0000000000..fea975830d --- /dev/null +++ b/scripts/init/init-setup.php @@ -0,0 +1,12 @@ + true, + )); diff --git a/scripts/init/lib.php b/scripts/init/lib.php new file mode 100644 index 0000000000..4c544da9d0 --- /dev/null +++ b/scripts/init/lib.php @@ -0,0 +1,27 @@ + 0 ]] -then - echo "** WARNING **" - echo "A major version less than 6 was detected. Because of this," - echo "several needed dependencies are not available via default repos." - echo "Specifically, RHEL 5 does not have a PEAR package for php53-*." - echo "We will attempt to install it manually, for APC. Please be careful." - confirm -fi - -echo "Phabricator will be installed to: $(pwd)."; -confirm - -echo "Testing sudo/root..." -if [[ $EUID -ne 0 ]] # Check if we're root. If we are, continue. -then - sudo true - SUDO="sudo" - if [[ $? -ne 0 ]] - then - echo "ERROR: You must be able to sudo to run this script, or run it as root."; - exit 1 - fi - -fi - -if [[ $RHEL_MAJOR_VER == 5 ]] -then - # RHEL 5's "php" package is actually 5.1. The "php53" package won't let us install php-pecl-apc. - # (it tries to pull in php 5.1 stuff) ... - yum repolist | grep -i epel - if [ $? -ne 0 ]; then - echo "It doesn't look like you have the EPEL repo enabled. We are to add it" - echo "for you, so that we can install git." - $SUDO rpm -Uvh http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm - fi - YUMCOMMAND="$SUDO yum install httpd git php53 php53-cli php53-mysql php53-process php53-devel php53-gd gcc wget make pcre-devel mysql-server" -else - # RHEL 6+ defaults with php 5.3 - YUMCOMMAND="$SUDO yum install httpd git php php-cli php-mysql php-process php-devel php-gd php-pecl-apc php-pecl-json mysql-server" -fi - -echo "Dropping to yum to install dependencies..." -echo "Running: ${YUMCOMMAND}" -echo "Yum will prompt you with [Y/n] to continue installing." - -$YUMCOMMAND - -if [[ $? -ne 0 ]] -then - echo "The yum command failed. Please fix the errors and re-run this script." - exit 1 -fi - -if [[ $RHEL_MAJOR_VER == 5 ]] -then - # Now that we've ensured all the devel packages required for pecl/apc are there, let's - # set up PEAR, and install apc. - echo "Attempting to install PEAR" - wget http://pear.php.net/go-pear.phar - $SUDO php go-pear.phar && $SUDO pecl install apc -fi - -if [[ $? -ne 0 ]] -then - echo "The apc install failed. Continuing without APC, performance may be impacted." -fi - -pidof httpd 2>&1 > /dev/null -if [[ $? -eq 0 ]] -then - echo "If php was installed above, please run: /etc/init.d/httpd graceful" -else - echo "Please remember to start the httpd with: /etc/init.d/httpd start" -fi - -pidof mysqld 2>&1 > /dev/null -if [[ $? -ne 0 ]] -then - echo "Please remember to start the mysql server: /etc/init.d/mysqld start" -fi - -confirm - -if [[ ! -e libphutil ]] -then - git clone git://github.com/facebook/libphutil.git -else - (cd libphutil && git pull --rebase) -fi - -if [[ ! -e arcanist ]] -then - git clone git://github.com/facebook/arcanist.git -else - (cd arcanist && git pull --rebase) -fi - -if [[ ! -e phabricator ]] -then - git clone git://github.com/facebook/phabricator.git -else - (cd phabricator && git pull --rebase) -fi - -echo -echo -echo "Install probably worked mostly correctly. Continue with the 'Configuration Guide':"; -echo -echo " http://www.phabricator.com/docs/phabricator/article/Configuration_Guide.html"; diff --git a/scripts/install/install_ubuntu.sh b/scripts/install/install_ubuntu.sh deleted file mode 100755 index 3725673ae1..0000000000 --- a/scripts/install/install_ubuntu.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -confirm() { - echo "Press RETURN to continue, or ^C to cancel."; - read -e ignored -} - -GIT='git' - -LTS="Ubuntu 10.04" -ISSUE=`cat /etc/issue` -if [[ $ISSUE != Ubuntu* ]] -then - echo "This script is intended for use on Ubuntu, but this system appears"; - echo "to be something else. Your results may vary."; - echo - confirm -elif [[ `expr match "$ISSUE" "$LTS"` -eq ${#LTS} ]] -then - GIT='git-core' -fi - -echo "PHABRICATOR UBUNTU INSTALL SCRIPT"; -echo "This script will install Phabricator and all of its core dependencies."; -echo "Run it from the directory you want to install into."; -echo - -ROOT=`pwd` -echo "Phabricator will be installed to: ${ROOT}."; -confirm - -echo "Testing sudo..." -sudo true -if [ $? -ne 0 ] -then - echo "ERROR: You must be able to sudo to run this script."; - exit 1; -fi; - -echo "Installing dependencies: git, apache, mysql, php..."; -echo - -set +x - -sudo apt-get -qq update -sudo apt-get install $GIT mysql-server apache2 php5 php5-mysql php5-gd php5-dev php5-curl php-apc php5-cli dpkg-dev - -# Enable mod_rewrite -sudo a2enmod rewrite - -HAVEPCNTL=`php -r "echo extension_loaded('pcntl');"` -if [ $HAVEPCNTL != "1" ] -then - echo "Installing pcntl..."; - echo - apt-get source php5 - PHP5=`ls -1F | grep '^php5-.*/$'` - (cd $PHP5/ext/pcntl && phpize && ./configure && make && sudo make install) -else - echo "pcntl already installed"; -fi - -if [ ! -e libphutil ] -then - git clone git://github.com/facebook/libphutil.git -else - (cd libphutil && git pull --rebase) -fi - -if [ ! -e arcanist ] -then - git clone git://github.com/facebook/arcanist.git -else - (cd arcanist && git pull --rebase) -fi - -if [ ! -e phabricator ] -then - git clone git://github.com/facebook/phabricator.git -else - (cd phabricator && git pull --rebase) -fi - -echo -echo -echo "Install probably worked mostly correctly. Continue with the 'Configuration Guide':"; -echo -echo " http://www.phabricator.com/docs/phabricator/article/Configuration_Guide.html"; -echo -echo "You can delete any php5-* stuff that's left over in this directory if you want."; diff --git a/scripts/install/update_phabricator.sh b/scripts/install/update_phabricator.sh index c89dac967b..3831acd963 100755 --- a/scripts/install/update_phabricator.sh +++ b/scripts/install/update_phabricator.sh @@ -9,15 +9,12 @@ set -x # to work without modifications. # NOTE: This script assumes you are running it from a directory which contains -# arcanist/, libphutil/, and phabricator/. +# arcanist/ and phabricator/. ROOT=`pwd` # You can hard-code the path here instead. ### UPDATE WORKING COPIES ###################################################### -cd $ROOT/libphutil -git pull - cd $ROOT/arcanist git pull @@ -30,17 +27,27 @@ git pull # Stop daemons. $ROOT/phabricator/bin/phd stop +# If running the notification server, stop it. +# $ROOT/phabricator/bin/aphlict stop + # Stop the webserver (apache, nginx, lighttpd, etc). This command will differ # depending on which system and webserver you are running: replace it with an # appropriate command for your system. +# NOTE: If you're running php-fpm, you should stop it here too. + sudo /etc/init.d/httpd stop + # Upgrade the database schema. You may want to add the "--force" flag to allow # this script to run noninteractively. $ROOT/phabricator/bin/storage upgrade # Restart the webserver. As above, this depends on your system and webserver. +# NOTE: If you're running php-fpm, restart it here too. sudo /etc/init.d/httpd start # Restart daemons. $ROOT/phabricator/bin/phd start + +# If running the notification server, start it. +# $ROOT/phabricator/bin/aphlict start diff --git a/scripts/lipsum/manage_lipsum.php b/scripts/lipsum/manage_lipsum.php index e7092f8797..9d45b573d4 100755 --- a/scripts/lipsum/manage_lipsum.php +++ b/scripts/lipsum/manage_lipsum.php @@ -5,18 +5,17 @@ require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('manage lipsum'); +$args->setTagline(pht('synthetic data generator')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new PhabricatorLipsumGenerateWorkflow(), - new PhutilHelpArgumentWorkflow(), -); - +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorLipsumManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/mail/mail_handler.php b/scripts/mail/mail_handler.php index 19e315364d..bf6f315f3a 100755 --- a/scripts/mail/mail_handler.php +++ b/scripts/mail/mail_handler.php @@ -1,39 +1,70 @@ #!/usr/bin/env php 1) { - $_SERVER['PHABRICATOR_ENV'] = $argv[1]; + foreach (array_slice($argv, 1) as $arg) { + if (!preg_match('/^-/', $arg)) { + $_SERVER['PHABRICATOR_ENV'] = $arg; + break; + } + } } $root = dirname(dirname(dirname(__FILE__))); require_once $root.'/scripts/__init_script__.php'; require_once $root.'/externals/mimemailparser/MimeMailParser.class.php'; +$args = new PhutilArgumentParser($argv); +$args->parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'process-duplicates', + 'help' => pht( + "Process this message, even if it's a duplicate of another message. ". + "This is mostly useful when debugging issues with mail routing."), + ), + array( + 'name' => 'env', + 'wildcard' => true, + ), + )); + $parser = new MimeMailParser(); $parser->setText(file_get_contents('php://stdin')); -$text_body = $parser->getMessageBody('text'); +$content = array(); +foreach (array('text', 'html') as $part) { + $part_body = $parser->getMessageBody($part); + + if (strlen($part_body) && !phutil_is_utf8($part_body)) { + $part_headers = $parser->getMessageBodyHeaders($part); + if (!is_array($part_headers)) { + $part_headers = array(); + } + $content_type = idx($part_headers, 'content-type'); + if (preg_match('/charset="(.*?)"/', $content_type, $matches) || + preg_match('/charset=(\S+)/', $content_type, $matches)) { + $part_body = phutil_utf8_convert($part_body, 'UTF-8', $matches[1]); + } + } -$text_body_headers = $parser->getMessageBodyHeaders('text'); -$content_type = idx($text_body_headers, 'content-type'); -if ( - !phutil_is_utf8($text_body) && - (preg_match('/charset="(.*?)"/', $content_type, $matches) || - preg_match('/charset=(\S+)/', $content_type, $matches)) -) { - $text_body = phutil_utf8_convert($text_body, "UTF-8", $matches[1]); + $content[$part] = $part_body; } $headers = $parser->getHeaders(); -$headers['subject'] = iconv_mime_decode($headers['subject'], 0, "UTF-8"); -$headers['from'] = iconv_mime_decode($headers['from'], 0, "UTF-8"); +$headers['subject'] = phutil_decode_mime_header($headers['subject']); +$headers['from'] = phutil_decode_mime_header($headers['from']); + +if ($args->getArg('process-duplicates')) { + $headers['message-id'] = Filesystem::readRandomCharacters(64); +} $received = new PhabricatorMetaMTAReceivedMail(); $received->setHeaders($headers); -$received->setBodies(array( - 'text' => $text_body, - 'html' => $parser->getMessageBody('html'), -)); +$received->setBodies($content); $attachments = array(); foreach ($parser->getAttachments() as $attachment) { @@ -50,6 +81,7 @@ $attachment->getContent(), array( 'name' => $attachment->getFilename(), + 'viewPolicy' => PhabricatorPolicies::POLICY_NOONE, )); $attachments[] = $file->getPHID(); } @@ -60,8 +92,8 @@ $received->processReceivedMail(); } catch (Exception $e) { $received - ->setMessage('EXCEPTION: '.$e->getMessage()) + ->setMessage(pht('EXCEPTION: %s', $e->getMessage())) ->save(); -} - + throw $e; +} diff --git a/scripts/mail/manage_mail.php b/scripts/mail/manage_mail.php index 66ecaea18e..12b907a2ee 100755 --- a/scripts/mail/manage_mail.php +++ b/scripts/mail/manage_mail.php @@ -5,7 +5,7 @@ require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('manage mail'); +$args->setTagline(pht('manage mail')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new PhutilHelpArgumentWorkflow(), - new PhabricatorMailManagementResendWorkflow(), - new PhabricatorMailManagementShowOutboundWorkflow(), - new PhabricatorMailManagementShowInboundWorkflow(), - new PhabricatorMailManagementSendTestWorkflow(), - new PhabricatorMailManagementReceiveTestWorkflow(), - new PhabricatorMailManagementListInboundWorkflow(), - new PhabricatorMailManagementListOutboundWorkflow(), -); - +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorMailManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/manage_bulk.php b/scripts/manage_bulk.php new file mode 120000 index 0000000000..04d0550497 --- /dev/null +++ b/scripts/manage_bulk.php @@ -0,0 +1 @@ +../scripts/setup/manage_bulk.php \ No newline at end of file diff --git a/scripts/profile/rescale_all_user_pics.php b/scripts/profile/rescale_all_user_pics.php deleted file mode 100755 index 3d019a3a93..0000000000 --- a/scripts/profile/rescale_all_user_pics.php +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env php -loadOneWhere('phid = %s', $user->getProfileImagePHID()); - - if (!$file) { - echo 'No pic for user ', $user->getUserName(), "\n"; - continue; - } - - $data = $file->loadFileData(); - $img = imagecreatefromstring($data); - $sx = imagesx($img); - $sy = imagesy($img); - - if ($sx != 50 || $sy != 50) { - echo 'Found one! User ', $user->getUserName(), "\n"; - $xformer = new PhabricatorImageTransformer(); - - // Resize OAuth image to a reasonable size - $small_xformed = $xformer->executeProfileTransform( - $file, - $width = 50, - $min_height = 50, - $max_height = 50); - - $user->setProfileImagePHID($small_xformed->getPHID()); - $user->save(); - break; - } else { - echo '.'; - } -} -echo "\n"; -echo "Done.\n"; diff --git a/scripts/repository/audit.php b/scripts/repository/audit.php deleted file mode 100755 index c91e05f2a6..0000000000 --- a/scripts/repository/audit.php +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env php - 1) { + $context = $argv[1]; + $context = explode(':', $context, 2); + $argv[1] = $context[0]; + + if (count($context) > 1) { + $_ENV['PHABRICATOR_INSTANCE'] = $context[1]; + putenv('PHABRICATOR_INSTANCE='.$context[1]); + } +} + +$root = dirname(dirname(dirname(__FILE__))); +require_once $root.'/scripts/__init_script__.php'; + +if ($argc < 2) { + throw new Exception(pht('usage: commit-hook ')); +} + +$engine = id(new DiffusionCommitHookEngine()) + ->setStartTime($hook_start); + +$repository = id(new PhabricatorRepositoryQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withIdentifiers(array($argv[1])) + ->needProjectPHIDs(true) + ->executeOne(); + +if (!$repository) { + throw new Exception(pht('No such repository "%s"!', $argv[1])); +} + +if (!$repository->isHosted()) { + // In Mercurial, the "pretxnchangegroup" hook fires for both pulls and + // pushes. Normally we only install the hook for hosted repositories, but + // if a hosted repository is later converted into an observed repository we + // can end up with an observed repository that has the hook installed. + // If we're running hooks from an observed repository, just exit without + // taking action. For more discussion, see PHI24. + return 0; +} + +$engine->setRepository($repository); + +$args = new PhutilArgumentParser($argv); +$args->parsePartial( + array( + array( + 'name' => 'hook-mode', + 'param' => 'mode', + 'help' => pht('Hook execution mode.'), + ), + )); + +$argv = array_merge( + array($argv[0]), + $args->getUnconsumedArgumentVector()); + +// Figure out which user is writing the commit. +$hook_mode = $args->getArg('hook-mode'); +if ($hook_mode !== null) { + $known_modes = array( + 'svn-revprop' => true, + ); + + if (empty($known_modes[$hook_mode])) { + throw new Exception( + pht( + 'Invalid Hook Mode: This hook was invoked in "%s" mode, but this '. + 'is not a recognized hook mode. Valid modes are: %s.', + $hook_mode, + implode(', ', array_keys($known_modes)))); + } +} + +$is_svnrevprop = ($hook_mode == 'svn-revprop'); + +if ($is_svnrevprop) { + // For now, we let these through if the repository allows dangerous changes + // and prevent them if it doesn't. See T11208 for discussion. + + $revprop_key = $argv[5]; + + if ($repository->shouldAllowDangerousChanges()) { + $err = 0; + } else { + $err = 1; + + $console = PhutilConsole::getConsole(); + $console->writeErr( + pht( + "DANGEROUS CHANGE: Dangerous change protection is enabled for this ". + "repository, so you can not change revision properties (you are ". + "attempting to edit \"%s\").\n". + "Edit the repository configuration before making dangerous changes.", + $revprop_key)); + } + + exit($err); +} else if ($repository->isGit() || $repository->isHg()) { + $username = getenv(DiffusionCommitHookEngine::ENV_USER); + if ($username === null || !strlen($username)) { + throw new Exception( + pht( + 'No Direct Pushes: You are pushing directly to a hosted repository. '. + 'This will not work. See "No Direct Pushes" in the documentation '. + 'for more information.')); + } + + if ($repository->isHg()) { + // We respond to several different hooks in Mercurial. + $engine->setMercurialHook($argv[2]); + } + +} else if ($repository->isSVN()) { + // NOTE: In Subversion, the entire environment gets wiped so we can't read + // DiffusionCommitHookEngine::ENV_USER. Instead, we've set "--tunnel-user" to + // specify the correct user; read this user out of the commit log. + + if ($argc < 4) { + throw new Exception(pht('usage: commit-hook ')); + } + + $svn_repo = $argv[2]; + $svn_txn = $argv[3]; + list($username) = execx('svnlook author -t %s %s', $svn_txn, $svn_repo); + $username = rtrim($username, "\n"); + + $engine->setSubversionTransactionInfo($svn_txn, $svn_repo); +} else { + throw new Exception(pht('Unknown repository type.')); +} + +$user = id(new PhabricatorPeopleQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withUsernames(array($username)) + ->executeOne(); + +if (!$user) { + throw new Exception(pht('No such user "%s"!', $username)); +} + +$engine->setViewer($user); + + +// Read stdin for the hook engine. + +if ($repository->isHg()) { + // Mercurial leaves stdin open, so we can't just read it until EOF. + $stdin = ''; +} else { + // Git and Subversion write data into stdin and then close it. Read the + // data. + $stdin = @file_get_contents('php://stdin'); + if ($stdin === false) { + throw new Exception(pht('Failed to read stdin!')); + } +} + +$engine->setStdin($stdin); +$engine->setOriginalArgv(array_slice($argv, 2)); + +$remote_address = getenv(DiffusionCommitHookEngine::ENV_REMOTE_ADDRESS); +if ($remote_address !== false && strlen($remote_address)) { + $engine->setRemoteAddress($remote_address); +} + +$remote_protocol = getenv(DiffusionCommitHookEngine::ENV_REMOTE_PROTOCOL); +if ($remote_protocol !== false && strlen($remote_protocol)) { + $engine->setRemoteProtocol($remote_protocol); +} + +$request_identifier = getenv(DiffusionCommitHookEngine::ENV_REQUEST); +if ($request_identifier !== false && strlen($request_identifier)) { + $engine->setRequestIdentifier($request_identifier); +} + +try { + $err = $engine->execute(); +} catch (DiffusionCommitHookRejectException $ex) { + $console = PhutilConsole::getConsole(); + + if (PhabricatorEnv::getEnvConfig('phabricator.serious-business')) { + $preamble = pht('*** PUSH REJECTED BY COMMIT HOOK ***'); + } else { + $preamble = pht(<<writeErr("%s\n\n", $preamble); + $console->writeErr("%s\n\n", $ex->getMessage()); + $err = 1; +} + +exit($err); diff --git a/scripts/repository/manage_repositories.php b/scripts/repository/manage_repositories.php index 694910a83d..5023dc66c6 100755 --- a/scripts/repository/manage_repositories.php +++ b/scripts/repository/manage_repositories.php @@ -5,7 +5,7 @@ require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('manage repositories'); +$args->setTagline(pht('manage repositories')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new PhabricatorRepositoryManagementPullWorkflow(), - new PhabricatorRepositoryManagementDiscoverWorkflow(), - new PhabricatorRepositoryManagementListWorkflow(), - new PhabricatorRepositoryManagementDeleteWorkflow(), - new PhutilHelpArgumentWorkflow(), -); - +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorRepositoryManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/repository/rebuild_summaries.php b/scripts/repository/rebuild_summaries.php deleted file mode 100755 index d0bb215c3c..0000000000 --- a/scripts/repository/rebuild_summaries.php +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env php -establishConnection('w'); -$sizes = queryfx_all( - $conn_w, - 'SELECT repositoryID, count(*) N FROM %T GROUP BY repositoryID', - $commit->getTableName()); -$sizes = ipull($sizes, 'N', 'repositoryID'); - -$maxes = queryfx_all( - $conn_w, - 'SELECT repositoryID, max(epoch) maxEpoch FROM %T GROUP BY repositoryID', - $commit->getTableName()); -$maxes = ipull($maxes, 'maxEpoch', 'repositoryID'); - - -$repository_ids = array_keys($sizes + $maxes); - -echo "Updating ".count($repository_ids)." repositories"; - -foreach ($repository_ids as $repository_id) { - $last_commit = queryfx_one( - $conn_w, - 'SELECT id FROM %T WHERE repositoryID = %d AND epoch = %d LIMIT 1', - $commit->getTableName(), - $repository_id, - idx($maxes, $repository_id, 0)); - if ($last_commit) { - $last_commit = $last_commit['id']; - } else { - $last_commit = 0; - } - queryfx( - $conn_w, - 'INSERT INTO %T (repositoryID, lastCommitID, size, epoch) - VALUES (%d, %d, %d, %d) ON DUPLICATE KEY UPDATE - lastCommitID = VALUES(lastCommitID), - size = VALUES(size), - epoch = VALUES(epoch)', - PhabricatorRepository::TABLE_SUMMARY, - $repository_id, - $last_commit, - idx($sizes, $repository_id, 0), - idx($maxes, $repository_id, 0)); - echo "."; -} -echo "\ndone.\n"; diff --git a/scripts/repository/reconcile.php b/scripts/repository/reconcile.php deleted file mode 100755 index 1e0f99854b..0000000000 --- a/scripts/repository/reconcile.php +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env php -setTagline('reconcile Phabricator state after repository changes'); -$args->setSynopsis(<<parseStandardArguments(); -$args->parse( - array( - array( - 'name' => 'more', - 'wildcard' => true, - ), - )); - -$more = $args->getArg('more'); -if (count($more) !== 1) { - $args->printHelpAndExit(); -} -$callsign = reset($more); - - -$repository = id(new PhabricatorRepository())->loadOneWhere( - 'callsign = %s', - $callsign); -if (!$repository) { - throw new Exception("No repository exists with callsign '{$callsign}'!"); -} - -switch ($repository->getVersionControlSystem()) { - case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: - break; - case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: - case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: - default: - throw new Exception("For now, you can only reconcile git repositories."); -} - -echo "Loading commits...\n"; -$all_commits = id(new PhabricatorRepositoryCommit())->loadAllWhere( - 'repositoryID = %d', - $repository->getID()); - -echo "Updating repository..\n"; -try { - // Sanity-check the repository working copy and make sure we're up to date. - $repository->execxLocalCommand('fetch --all'); -} catch (Exception $ex) { - echo "Unable to `git fetch` the working copy to update it. Reconciliation ". - "requires an up-to-date working copy.\n"; - throw $ex; -} - -echo "Verifying commits (this may take some time if the repository is large)"; -$futures = array(); -foreach ($all_commits as $id => $commit) { - // NOTE: We use "cat-file -t", not "rev-parse --verify", because - // "rev-parse --verify" does not verify that the object actually exists, only - // that the name is properly formatted. - $futures[$id] = $repository->getLocalCommandFuture( - 'cat-file -t %s', - $commit->getCommitIdentifier()); -} - -$bad = array(); -foreach (Futures($futures)->limit(8) as $id => $future) { - list($err) = $future->resolve(); - if ($err) { - $bad[$id] = $all_commits[$id]; - echo "#"; - } else { - echo "."; - } -} -echo "\nDone.\n"; - -if (!count($bad)) { - echo "No bad commits found!\n"; -} else { - echo "Found ".count($bad)." bad commits:\n\n"; - echo ' '.implode("\n ", mpull($bad, 'getCommitIdentifier')); - $ok = phutil_console_confirm("Do you want to delete these commits?"); - if (!$ok) { - echo "OK, aborting.\n"; - exit(1); - } - - echo "Deleting commits"; - foreach ($bad as $commit) { - echo "."; - $commit->delete(); - } - echo "\nDone.\n"; -} - -//// Clean Up Links //////////////////////////////////////////////////////// - -$table = new PhabricatorRepositoryCommit(); - -$valid_phids = queryfx_all( - $table->establishConnection('r'), - 'SELECT phid FROM %T', - $table->getTableName()); -$valid_phids = ipull($valid_phids, null, 'phid'); - -//////// Differential <-> Diffusion Links ////////////////////////////////// - -$dx_conn = id(new DifferentialRevision())->establishConnection('w'); -$dx_table = DifferentialRevision::TABLE_COMMIT; -$dx_phids = queryfx_all( - $dx_conn, - 'SELECT commitPHID FROM %T', - $dx_table); - -$bad_phids = array(); -foreach ($dx_phids as $dx_phid) { - if (empty($valid_phids[$dx_phid['commitPHID']])) { - $bad_phids[] = $dx_phid['commitPHID']; - } -} - -if ($bad_phids) { - echo "Deleting ".count($bad_phids)." bad Diffusion links...\n"; - queryfx( - $dx_conn, - 'DELETE FROM %T WHERE commitPHID IN (%Ls)', - $dx_table, - $bad_phids); - echo "Done.\n"; -} else { - echo "Diffusion links are clean.\n"; -} - -// TODO: There are some links in owners that we should probably clean up too. diff --git a/scripts/repository/reparse.php b/scripts/repository/reparse.php deleted file mode 100755 index 37730a7b03..0000000000 --- a/scripts/repository/reparse.php +++ /dev/null @@ -1,291 +0,0 @@ -#!/usr/bin/env php -setSynopsis(<<parseStandardArguments(); -$args->parse( - array( - // what - array( - 'name' => 'revision', - 'wildcard' => true, - ), - array( - 'name' => 'all', - 'param' => 'callsign or phid', - 'help' => 'Reparse all commits in the specified repository. This '. - 'mode queues parsers into the task queue; you must run '. - 'taskmasters to actually do the parses. Use with '. - '__--force-local__ to run the tasks locally instead of '. - 'with taskmasters.', - ), - array( - 'name' => 'min-date', - 'param' => 'date', - 'help' => 'Must be used with __--all__, this will exclude commits '. - 'which are earlier than __date__.'. - "\n".$min_date_usage_examples, - ), - // which parts - array( - 'name' => 'message', - 'help' => 'Reparse commit messages.', - ), - array( - 'name' => 'change', - 'help' => 'Reparse changes.', - ), - array( - 'name' => 'herald', - 'help' => 'Reevaluate Herald rules (may send huge amounts of email!)', - ), - array( - 'name' => 'owners', - 'help' => 'Reevaluate related commits for owners packages (may '. - 'delete existing relationship entries between your '. - 'package and some old commits!)', - ), - array( - 'name' => 'harbormaster', - 'help' => 'EXPERIMENTAL. Execute Harbormaster.', - ), - // misc options - array( - 'name' => 'force', - 'short' => 'f', - 'help' => 'Act noninteractively, without prompting.', - ), - array( - 'name' => 'force-local', - 'help' => 'Only used with __--all__, use this to run the tasks '. - 'locally instead of deferring them to taskmaster daemons.', - ), - )); - -$all_from_repo = $args->getArg('all'); -$reparse_message = $args->getArg('message'); -$reparse_change = $args->getArg('change'); -$reparse_herald = $args->getArg('herald'); -$reparse_owners = $args->getArg('owners'); -$reparse_harbormaster = $args->getArg('harbormaster'); -$reparse_what = $args->getArg('revision'); -$force = $args->getArg('force'); -$force_local = $args->getArg('force-local'); -$min_date = $args->getArg('min-date'); - -if (!$all_from_repo && !$reparse_what) { - usage("Specify a commit or repository to reparse."); -} - -if ($all_from_repo && $reparse_what) { - $commits = implode(', ', $reparse_what); - usage( - "Specify a commit or repository to reparse, not both:\n". - "All from repo: ".$all_from_repo."\n". - "Commit(s) to reparse: ".$commits); -} - -if (!$reparse_message && !$reparse_change && !$reparse_herald && - !$reparse_owners && !$reparse_harbormaster) { - usage("Specify what information to reparse with --message, --change, ". - "--herald, --harbormaster, and/or --owners"); -} - -$min_timestamp = false; -if ($min_date) { - $min_timestamp = strtotime($min_date); - - if (!$all_from_repo) { - usage( - "You must use --all if you specify --min-date\n". - "e.g.\n". - " ./reparse.php --all TEST --owners --min-date yesterday"); - } - - // previous to PHP 5.1.0 you would compare with -1, instead of false - if (false === $min_timestamp) { - usage( - "Supplied --min-date is not valid\n". - "Supplied value: '".$min_date."'\n". - $min_date_usage_examples); - } -} - -if ($reparse_owners && !$force) { - echo phutil_console_wrap( - "You are about to recreate the relationship entries between the commits ". - "and the packages they touch. This might delete some existing ". - "relationship entries for some old commits."); - - if (!phutil_console_confirm('Are you ready to continue?')) { - echo "Cancelled.\n"; - exit(1); - } -} - -$commits = array(); -if ($all_from_repo) { - $repository = id(new PhabricatorRepository())->loadOneWhere( - 'callsign = %s OR phid = %s', - $all_from_repo, - $all_from_repo); - if (!$repository) { - throw new Exception("Unknown repository {$all_from_repo}!"); - } - $constraint = ''; - if ($min_timestamp) { - echo "Excluding entries before UNIX timestamp: ".$min_timestamp."\n"; - $table = new PhabricatorRepositoryCommit(); - $conn_r = $table->establishConnection('r'); - $constraint = qsprintf( - $conn_r, - 'AND epoch >= %d', - $min_timestamp); - } - $commits = id(new PhabricatorRepositoryCommit())->loadAllWhere( - 'repositoryID = %d %Q', - $repository->getID(), - $constraint); - $callsign = $repository->getCallsign(); - if (!$commits) { - echo "No commits have been discovered in {$callsign} repository!\n"; - exit; - } -} else { - $commits = array(); - foreach ($reparse_what as $identifier) { - $matches = null; - if (!preg_match('/r([A-Z]+)([a-z0-9]+)/', $identifier, $matches)) { - throw new Exception("Can't parse commit identifier!"); - } - $callsign = $matches[1]; - $commit_identifier = $matches[2]; - $repository = id(new PhabricatorRepository())->loadOneWhere( - 'callsign = %s', - $callsign); - if (!$repository) { - throw new Exception("No repository with callsign '{$callsign}'!"); - } - $commit = id(new PhabricatorRepositoryCommit())->loadOneWhere( - 'repositoryID = %d AND commitIdentifier = %s', - $repository->getID(), - $commit_identifier); - if (!$commit) { - throw new Exception( - "No matching commit '{$commit_identifier}' in repository ". - "'{$callsign}'. (For git and mercurial repositories, you must specify ". - "the entire commit hash.)"); - } - $commits[] = $commit; - } -} - -if ($all_from_repo && !$force_local) { - echo phutil_console_format( - '**NOTE**: This script will queue tasks to reparse the data. Once the '. - 'tasks have been queued, you need to run Taskmaster daemons to execute '. - 'them.'); - echo "\n\n"; - echo "QUEUEING TASKS (".number_format(count($commits))." Commits):\n"; -} - -$tasks = array(); -foreach ($commits as $commit) { - $classes = array(); - switch ($repository->getVersionControlSystem()) { - case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: - if ($reparse_message) { - $classes[] = 'PhabricatorRepositoryGitCommitMessageParserWorker'; - } - if ($reparse_change) { - $classes[] = 'PhabricatorRepositoryGitCommitChangeParserWorker'; - } - break; - case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: - if ($reparse_message) { - $classes[] = 'PhabricatorRepositoryMercurialCommitMessageParserWorker'; - } - if ($reparse_change) { - $classes[] = 'PhabricatorRepositoryMercurialCommitChangeParserWorker'; - } - break; - case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: - if ($reparse_message) { - $classes[] = 'PhabricatorRepositorySvnCommitMessageParserWorker'; - } - if ($reparse_change) { - $classes[] = 'PhabricatorRepositorySvnCommitChangeParserWorker'; - } - break; - } - - if ($reparse_herald) { - $classes[] = 'PhabricatorRepositoryCommitHeraldWorker'; - } - - if ($reparse_owners) { - $classes[] = 'PhabricatorRepositoryCommitOwnersWorker'; - } - - if ($reparse_harbormaster) { - $classes[] = 'HarbormasterRunnerWorker'; - } - - $spec = array( - 'commitID' => $commit->getID(), - 'only' => true, - ); - - if ($all_from_repo && !$force_local) { - foreach ($classes as $class) { - PhabricatorWorker::scheduleTask($class, $spec); - - $commit_name = 'r'.$callsign.$commit->getCommitIdentifier(); - echo " Queued '{$class}' for commit '{$commit_name}'.\n"; - } - } else { - foreach ($classes as $class) { - $worker = newv($class, array($spec)); - echo "Running '{$class}'...\n"; - $worker->executeTask(); - } - } -} - -echo "\nDone.\n"; - -function usage($message) { - echo phutil_console_format( - '**Usage Exception:** '.$message."\n". - "Use __--help__ to display full help\n"); - exit(1); -} diff --git a/scripts/repository/save_lint.php b/scripts/repository/save_lint.php index 0a23adb49c..fde2ab8fed 100755 --- a/scripts/repository/save_lint.php +++ b/scripts/repository/save_lint.php @@ -11,41 +11,44 @@ EOT; $args = id(new PhutilArgumentParser($argv)) - ->setTagline('save lint errors to database') + ->setTagline(pht('save lint errors to database')) ->setSynopsis($synopsis) ->parseStandardArguments() ->parse(array( array( 'name' => 'all', - 'help' => - "Discover problems in the whole repository instead of just changes ". - "since the last run.", + 'help' => pht( + 'Discover problems in the whole repository instead of just changes '. + 'since the last run.'), ), array( 'name' => 'arc', 'param' => 'path', 'default' => 'arc', - 'help' => "Path to Arcanist executable.", + 'help' => pht('Path to Arcanist executable.'), ), array( 'name' => 'severity', 'param' => 'string', 'default' => ArcanistLintSeverity::SEVERITY_ADVICE, - 'help' => "Minimum severity, one of ArcanistLintSeverity constants.", + 'help' => pht( + 'Minimum severity, one of %s constants.', + 'ArcanistLintSeverity'), ), array( 'name' => 'chunk-size', 'param' => 'number', 'default' => 256, - 'help' => "Number of paths passed to `arc` at once.", + 'help' => pht('Number of paths passed to `%s` at once.', 'arc'), ), array( 'name' => 'blame', - 'help' => "Assign lint errors to authors who last modified the line.", + 'help' => pht( + 'Assign lint errors to authors who last modified the line.'), ), )); -echo "Saving lint errors to database...\n"; +echo pht('Saving lint errors to database...')."\n"; $count = id(new DiffusionLintSaveRunner()) ->setAll($args->getArg('all', false)) @@ -55,4 +58,4 @@ ->setNeedsBlame($args->getArg('blame')) ->run('.'); -echo "\nProcessed {$count} files.\n"; +echo "\n".pht('Processed %d files.', $count)."\n"; diff --git a/scripts/repository/test_connection.php b/scripts/repository/test_connection.php deleted file mode 100755 index 20c8486d3a..0000000000 --- a/scripts/repository/test_connection.php +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env php -\n"; - exit(1); -} - -echo phutil_console_wrap( - phutil_console_format( - 'This script will test that you have configured valid credentials for '. - 'access to a repository, so the Phabricator daemons can pull from it. '. - 'You should run this as the **same user you will run the daemons as**, '. - 'from the **same machine they will run from**. Doing this will help '. - 'detect various problems with your configuration, such as SSH issues.')); - -list($whoami) = execx('whoami'); -$whoami = trim($whoami); - -$ok = phutil_console_confirm("Do you want to continue as '{$whoami}'?"); -if (!$ok) { - die(1); -} - -$callsign = $argv[1]; -echo "Loading '{$callsign}' repository...\n"; -$repository = id(new PhabricatorRepository())->loadOneWhere( - 'callsign = %s', - $argv[1]); -if (!$repository) { - throw new Exception("No such repository exists!"); -} - -$vcs = $repository->getVersionControlSystem(); - -PhutilServiceProfiler::installEchoListener(); - -echo phutil_console_format( - "\n". - "**NOTE:** If you are prompted for an SSH password in the next step, the\n". - "daemon won't work because it doesn't have the password and can't respond\n". - "to an interactive prompt. Instead of typing the password, it will hang\n". - "forever when prompted. There are several ways to resolve this:\n\n". - " - Run the daemon inside an ssh-agent session where you have unlocked\n". - " the key (most secure, but most complicated).\n". - " - Generate a new, passwordless certificate for the daemon to use\n". - " (usually quite easy).\n". - " - Remove the passphrase from the key with `ssh-keygen -p`\n". - " (easy, but questionable)."); - -phutil_console_confirm('Did you read all that?', $default_no = false); - -echo "Trying to connect to the remote...\n"; -switch ($vcs) { - case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: - $err = $repository->passthruRemoteCommand( - '--limit 1 log %s', - $repository->getRemoteURI()); - break; - case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: - // Do an ls-remote on a nonexistent ref, which we expect to just return - // nothing. - $err = $repository->passthruRemoteCommand( - 'ls-remote %s %s', - $repository->getRemoteURI(), - 'just-testing'); - break; - case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: - // TODO: 'hg id' doesn't support --insecure so we can't tell it not to - // spew. If 'hg id' eventually supports --insecure, consider using it. - echo "(It is safe to ignore any 'certificate with fingerprint ... not ". - "verified' warnings, although you may want to configure Mercurial ". - "to recognize the server's fingerprint/certificate.)\n"; - $err = $repository->passthruRemoteCommand( - 'id --rev tip %s', - $repository->getRemoteURI()); - break; - default: - throw new Exception("Unsupported repository type."); -} - -if ($err) { - echo phutil_console_format( - "** FAIL ** Connection failed. The credentials for this ". - "repository appear to be incorrectly configured.\n"); - exit(1); -} else { - echo phutil_console_format( - "** OKAY ** Connection successful. The credentials for ". - "this repository appear to be correctly configured.\n"); -} - diff --git a/scripts/search/manage_search.php b/scripts/search/manage_search.php index 25c391b6c3..acd659dffe 100755 --- a/scripts/search/manage_search.php +++ b/scripts/search/manage_search.php @@ -5,7 +5,7 @@ require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('manage search'); +$args->setTagline(pht('manage search')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new PhabricatorSearchManagementIndexWorkflow(), - new PhutilHelpArgumentWorkflow(), -); - +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorSearchManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/search/reindex_maniphest.php b/scripts/search/reindex_maniphest.php deleted file mode 100755 index ed4670b690..0000000000 --- a/scripts/search/reindex_maniphest.php +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env php -loadAll(); -echo "Updating relationships for ".count($tasks)." tasks"; -foreach ($tasks as $task) { - ManiphestTaskProject::updateTaskProjects($task); - ManiphestTaskSubscriber::updateTaskSubscribers($task); - echo '.'; -} -echo "\nDone.\n"; - diff --git a/scripts/setup/manage_audit.php b/scripts/setup/manage_audit.php index 8502db2674..89b9927ad6 100755 --- a/scripts/setup/manage_audit.php +++ b/scripts/setup/manage_audit.php @@ -5,7 +5,7 @@ require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('manage audits'); +$args->setTagline(pht('manage audits')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new PhabricatorAuditManagementDeleteWorkflow(), - new PhutilHelpArgumentWorkflow(), -); - +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorAuditManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_auth.php b/scripts/setup/manage_auth.php index f4c87e95d8..3ddbdf6e1e 100755 --- a/scripts/setup/manage_auth.php +++ b/scripts/setup/manage_auth.php @@ -5,7 +5,7 @@ require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('manage authentication'); +$args->setTagline(pht('manage authentication')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new PhabricatorAuthManagementRecoverWorkflow(), - new PhabricatorAuthManagementRefreshWorkflow(), - new PhabricatorAuthManagementLDAPWorkflow(), - new PhutilHelpArgumentWorkflow(), -); - +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorAuthManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_bulk.php b/scripts/setup/manage_bulk.php new file mode 100755 index 0000000000..9786f9b078 --- /dev/null +++ b/scripts/setup/manage_bulk.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage bulk jobs')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorBulkManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_calendar.php b/scripts/setup/manage_calendar.php new file mode 100755 index 0000000000..135c42ded1 --- /dev/null +++ b/scripts/setup/manage_calendar.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage Calendar')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorCalendarManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_celerity.php b/scripts/setup/manage_celerity.php new file mode 100755 index 0000000000..2ae67743b2 --- /dev/null +++ b/scripts/setup/manage_celerity.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage celerity')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('CelerityManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_conduit.php b/scripts/setup/manage_conduit.php new file mode 100755 index 0000000000..07384e7ed8 --- /dev/null +++ b/scripts/setup/manage_conduit.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage Conduit')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorConduitManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_config.php b/scripts/setup/manage_config.php index 1610ebd257..e33da20244 100755 --- a/scripts/setup/manage_config.php +++ b/scripts/setup/manage_config.php @@ -2,10 +2,10 @@ setTagline('manage configuration'); +$args->setTagline(pht('manage configuration')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new PhabricatorConfigManagementListWorkflow(), - new PhabricatorConfigManagementSetWorkflow(), - new PhabricatorConfigManagementGetWorkflow(), - new PhabricatorConfigManagementDeleteWorkflow(), - new PhutilHelpArgumentWorkflow(), -); - +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorConfigManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_differential.php b/scripts/setup/manage_differential.php new file mode 100755 index 0000000000..30e11d27a9 --- /dev/null +++ b/scripts/setup/manage_differential.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage hunks')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorDifferentialManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_feed.php b/scripts/setup/manage_feed.php index 46547f4dc0..02516aa9a5 100755 --- a/scripts/setup/manage_feed.php +++ b/scripts/setup/manage_feed.php @@ -5,7 +5,7 @@ require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('manage feed'); +$args->setTagline(pht('manage feed')); $args->setSynopsis(<<parseStandardArguments(); -$workflows = array( - new PhabricatorFeedManagementRepublishWorkflow(), - new PhutilHelpArgumentWorkflow(), -); - +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorFeedManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); $args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_garbage.php b/scripts/setup/manage_garbage.php new file mode 100755 index 0000000000..326730375e --- /dev/null +++ b/scripts/setup/manage_garbage.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage garbage collectors')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorGarbageCollectorManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_harbormaster.php b/scripts/setup/manage_harbormaster.php new file mode 100755 index 0000000000..484c671aa9 --- /dev/null +++ b/scripts/setup/manage_harbormaster.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage Harbormaster')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('HarbormasterManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_herald.php b/scripts/setup/manage_herald.php new file mode 100755 index 0000000000..4ebd94f820 --- /dev/null +++ b/scripts/setup/manage_herald.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage Herald')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('HeraldManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_i18n.php b/scripts/setup/manage_i18n.php new file mode 100755 index 0000000000..5f01b6331c --- /dev/null +++ b/scripts/setup/manage_i18n.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage internationalization')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorInternationalizationManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_lock.php b/scripts/setup/manage_lock.php new file mode 100755 index 0000000000..ec5405ec01 --- /dev/null +++ b/scripts/setup/manage_lock.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage locks')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorLockManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_nuance.php b/scripts/setup/manage_nuance.php new file mode 100755 index 0000000000..ebf312305a --- /dev/null +++ b/scripts/setup/manage_nuance.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage Nuance')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('NuanceManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_phortune.php b/scripts/setup/manage_phortune.php new file mode 100755 index 0000000000..a04ed0ccd6 --- /dev/null +++ b/scripts/setup/manage_phortune.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage billing')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorPhortuneManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_policy.php b/scripts/setup/manage_policy.php new file mode 100755 index 0000000000..3e36592abc --- /dev/null +++ b/scripts/setup/manage_policy.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage policies')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorPolicyManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_remove.php b/scripts/setup/manage_remove.php new file mode 100755 index 0000000000..9a49e8774d --- /dev/null +++ b/scripts/setup/manage_remove.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('remove objects')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorSystemRemoveWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_trigger.php b/scripts/setup/manage_trigger.php new file mode 100755 index 0000000000..9bfcd0e692 --- /dev/null +++ b/scripts/setup/manage_trigger.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage triggers')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorWorkerTriggerManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_user.php b/scripts/setup/manage_user.php new file mode 100755 index 0000000000..f571cb9346 --- /dev/null +++ b/scripts/setup/manage_user.php @@ -0,0 +1,20 @@ +#!/usr/bin/env php +setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorPeopleManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_webhook.php b/scripts/setup/manage_webhook.php new file mode 100755 index 0000000000..afe662617a --- /dev/null +++ b/scripts/setup/manage_webhook.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage webhooks')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('HeraldWebhookManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/setup/manage_worker.php b/scripts/setup/manage_worker.php new file mode 100755 index 0000000000..588cb69972 --- /dev/null +++ b/scripts/setup/manage_worker.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +setTagline(pht('manage task queue')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorWorkerManagementWorkflow') + ->execute(); +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/sql/manage_storage.php b/scripts/sql/manage_storage.php index 14ec913623..c3de483d72 100755 --- a/scripts/sql/manage_storage.php +++ b/scripts/sql/manage_storage.php @@ -2,16 +2,16 @@ setTagline('manage Phabricator storage and schemata'); +$args->setTagline(pht('manage storage and schemata')); $args->setSynopsis(<<parseStandardArguments(); -$conf = PhabricatorEnv::newObjectFromConfig( - 'mysql.configuration-provider', - array($dao = null, 'w')); - -$default_user = $conf->getUser(); -$default_host = $conf->getHost(); -$default_port = $conf->getPort(); $default_namespace = PhabricatorLiskDAO::getDefaultStorageNamespace(); try { @@ -34,35 +27,56 @@ array( 'name' => 'force', 'short' => 'f', - 'help' => 'Do not prompt before performing dangerous operations.', + 'help' => pht( + 'Do not prompt before performing dangerous operations.'), + ), + array( + 'name' => 'host', + 'param' => 'hostname', + 'help' => pht( + 'Operate on the database server identified by __hostname__.'), + ), + array( + 'name' => 'ref', + 'param' => 'ref', + 'help' => pht( + 'Operate on the database identified by __ref__.'), ), array( 'name' => 'user', 'short' => 'u', 'param' => 'username', - 'default' => $default_user, - 'help' => "Connect with __username__ instead of the configured ". - "default ('{$default_user}').", + 'help' => pht( + 'Connect with __username__ instead of the configured default.'), ), array( 'name' => 'password', 'short' => 'p', 'param' => 'password', - 'help' => 'Use __password__ instead of the configured default.', + 'help' => pht('Use __password__ instead of the configured default.'), ), array( 'name' => 'namespace', 'param' => 'name', 'default' => $default_namespace, - 'help' => "Use namespace __namespace__ instead of the configured ". - "default ('{$default_namespace}'). This is an advanced ". - "feature used by unit tests; you should not normally ". - "use this flag.", + 'help' => pht( + "Use namespace __namespace__ instead of the configured ". + "default ('%s'). This is an advanced feature used by unit tests; ". + "you should not normally use this flag.", + $default_namespace), + ), + array( + 'name' => 'dryrun', + 'help' => pht( + 'Do not actually change anything, just show what would be changed.'), ), array( - 'name' => 'dryrun', - 'help' => 'Do not actually change anything, just show what would be '. - 'changed.', + 'name' => 'disable-utf8mb4', + 'help' => pht( + 'Disable %s, even if the database supports it. This is an '. + 'advanced feature used for testing internal changes; you '. + 'should not normally use this flag.', + 'utf8mb4'), ), )); } catch (PhutilArgumentUsageException $ex) { @@ -70,48 +84,163 @@ exit(77); } -if ($args->getArg('password') === null) { - // This is already a PhutilOpaqueEnvelope. - $password = $conf->getPassword(); -} else { - // Put this in a PhutilOpaqueEnvelope. - $password = new PhutilOpaqueEnvelope($args->getArg('password')); - PhabricatorEnv::overrideConfig('mysql.pass', $args->getArg('password')); +// First, test that the Phabricator configuration is set up correctly. After +// we know this works we'll test any administrative credentials specifically. + +$refs = PhabricatorDatabaseRef::getActiveDatabaseRefs(); +if (!$refs) { + throw new PhutilArgumentUsageException( + pht('No databases are configured.')); } -$api = new PhabricatorStorageManagementAPI(); -$api->setUser($args->getArg('user')); -PhabricatorEnv::overrideConfig('mysql.user', $args->getArg('user')); -$api->setHost($default_host); -$api->setPort($default_port); -$api->setPassword($password); -$api->setNamespace($args->getArg('namespace')); +$host = $args->getArg('host'); +$ref_key = $args->getArg('ref'); +if (($host !== null) || ($ref_key !== null)) { + if ($host && $ref_key) { + throw new PhutilArgumentUsageException( + pht( + 'Use "--host" or "--ref" to select a database, but not both.')); + } -try { - queryfx( - $api->getConn(null), - 'SELECT 1'); -} catch (AphrontQueryException $ex) { - echo phutil_console_format( - "**%s**: %s\n", - 'Unable To Connect', - $ex->getMessage()); - exit(1); + $refs = PhabricatorDatabaseRef::getActiveDatabaseRefs(); + + $possible_refs = array(); + foreach ($refs as $possible_ref) { + if ($host && ($possible_ref->getHost() == $host)) { + $possible_refs[] = $possible_ref; + break; + } + if ($ref_key && ($possible_ref->getRefKey() == $ref_key)) { + $possible_refs[] = $possible_ref; + break; + } + } + + if (!$possible_refs) { + if ($host) { + throw new PhutilArgumentUsageException( + pht( + 'There is no configured database on host "%s". This command can '. + 'only interact with configured databases.', + $host)); + } else { + throw new PhutilArgumentUsageException( + pht( + 'There is no configured database with ref "%s". This command can '. + 'only interact with configured databases.', + $ref_key)); + } + } + + if (count($possible_refs) > 1) { + throw new PhutilArgumentUsageException( + pht( + 'Host "%s" identifies more than one database. Use "--ref" to select '. + 'a specific database.', + $host)); + } + + $refs = $possible_refs; } -$workflows = array( - new PhabricatorStorageManagementDatabasesWorkflow(), - new PhabricatorStorageManagementDestroyWorkflow(), - new PhabricatorStorageManagementDumpWorkflow(), - new PhabricatorStorageManagementStatusWorkflow(), - new PhabricatorStorageManagementProbeWorkflow(), - new PhabricatorStorageManagementUpgradeWorkflow(), -); +$apis = array(); +foreach ($refs as $ref) { + $default_user = $ref->getUser(); + $default_host = $ref->getHost(); + $default_port = $ref->getPort(); + + $test_api = id(new PhabricatorStorageManagementAPI()) + ->setUser($default_user) + ->setHost($default_host) + ->setPort($default_port) + ->setPassword($ref->getPass()) + ->setNamespace($args->getArg('namespace')); + + try { + queryfx( + $test_api->getConn(null), + 'SELECT 1'); + } catch (AphrontQueryException $ex) { + $message = phutil_console_format( + "**%s**\n\n%s\n\n%s\n\n%s\n\n**%s**: %s\n", + pht('MySQL Credentials Not Configured'), + pht( + 'Unable to connect to MySQL using the configured credentials. '. + 'You must configure standard credentials before you can upgrade '. + 'storage. Run these commands to set up credentials:'), + " $ ./bin/config set mysql.host __host__\n". + " $ ./bin/config set mysql.user __username__\n". + " $ ./bin/config set mysql.pass __password__", + pht( + 'These standard credentials are separate from any administrative '. + 'credentials provided to this command with __%s__ or '. + '__%s__, and must be configured correctly before you can proceed.', + '--user', + '--password'), + pht('Raw MySQL Error'), + $ex->getMessage()); + echo phutil_console_wrap($message); + exit(1); + } + + if ($args->getArg('password') === null) { + // This is already a PhutilOpaqueEnvelope. + $password = $ref->getPass(); + } else { + // Put this in a PhutilOpaqueEnvelope. + $password = new PhutilOpaqueEnvelope($args->getArg('password')); + PhabricatorEnv::overrideConfig('mysql.pass', $args->getArg('password')); + } + + $selected_user = $args->getArg('user'); + if ($selected_user === null) { + $selected_user = $default_user; + } + + $api = id(new PhabricatorStorageManagementAPI()) + ->setUser($selected_user) + ->setHost($default_host) + ->setPort($default_port) + ->setPassword($password) + ->setNamespace($args->getArg('namespace')) + ->setDisableUTF8MB4($args->getArg('disable-utf8mb4')); + PhabricatorEnv::overrideConfig('mysql.user', $api->getUser()); + + $ref->setUser($selected_user); + $ref->setPass($password); + + try { + queryfx( + $api->getConn(null), + 'SELECT 1'); + } catch (AphrontQueryException $ex) { + $message = phutil_console_format( + "**%s**\n\n%s\n\n**%s**: %s\n", + pht('Bad Administrative Credentials'), + pht( + 'Unable to connect to MySQL using the administrative credentials '. + 'provided with the __%s__ and __%s__ flags. Check that '. + 'you have entered them correctly.', + '--user', + '--password'), + pht('Raw MySQL Error'), + $ex->getMessage()); + echo phutil_console_wrap($message); + exit(1); + } + + $api->setRef($ref); + $apis[] = $api; +} + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorStorageManagementWorkflow') + ->execute(); $patches = PhabricatorSQLPatchList::buildAllPatches(); foreach ($workflows as $workflow) { - $workflow->setAPI($api); + $workflow->setAPIs($apis); $workflow->setPatches($patches); } diff --git a/scripts/ssh/ssh-auth.php b/scripts/ssh/ssh-auth.php index 96e6ef389b..378ed835ff 100755 --- a/scripts/ssh/ssh-auth.php +++ b/scripts/ssh/ssh-auth.php @@ -2,60 +2,160 @@ setLogName(pht('SSH Error Log')) + ->setLogPath(PhabricatorEnv::getEnvConfig('log.ssh-error.path')) + ->activateLog(); -if (!$cert) { - exit(1); -} +// TODO: For now, this is using "parseParital()", not "parse()". This allows +// the script to accept (and ignore) additional arguments. This preserves +// backward compatibility until installs have time to migrate to the new +// syntax. -$parts = preg_split('/\s+/', $cert); -if (count($parts) < 2) { - exit(1); -} +$args = id(new PhutilArgumentParser($argv)) + ->parsePartial( + array( + array( + 'name' => 'sshd-key', + 'param' => 'k', + 'help' => pht( + 'Accepts the "%%k" parameter from "AuthorizedKeysCommand".'), + ), + )); + +$sshd_key = $args->getArg('sshd-key'); -list($type, $body) = $parts; +// NOTE: We are caching a datastructure rather than the flat key file because +// the path on disk to "ssh-exec" is arbitrarily mutable at runtime. See T12397. -$user_dao = new PhabricatorUser(); -$ssh_dao = new PhabricatorUserSSHKey(); -$conn_r = $user_dao->establishConnection('r'); +$cache = PhabricatorCaches::getMutableCache(); +$authstruct_key = PhabricatorAuthSSHKeyQuery::AUTHSTRUCT_CACHEKEY; +$authstruct_raw = $cache->getKey($authstruct_key); -$row = queryfx_one( - $conn_r, - 'SELECT userName FROM %T u JOIN %T ssh ON u.phid = ssh.userPHID - WHERE ssh.keyType = %s AND ssh.keyBody = %s', - $user_dao->getTableName(), - $ssh_dao->getTableName(), - $type, - $body); +$authstruct = null; -if (!$row) { - exit(1); +if ($authstruct_raw !== null && strlen($authstruct_raw)) { + try { + $authstruct = phutil_json_decode($authstruct_raw); + } catch (Exception $ex) { + // Ignore any issues with the cached data; we'll just rebuild the + // structure below. + } } -$user = idx($row, 'userName'); +if ($authstruct === null) { + $keys = id(new PhabricatorAuthSSHKeyQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withIsActive(true) + ->execute(); + + if (!$keys) { + echo pht('No keys found.')."\n"; + exit(1); + } + + $key_list = array(); + foreach ($keys as $ssh_key) { + $key_argv = array(); + $object = $ssh_key->getObject(); + if ($object instanceof PhabricatorUser) { + $key_argv[] = '--phabricator-ssh-user'; + $key_argv[] = $object->getUsername(); + } else if ($object instanceof AlmanacDevice) { + if (!$ssh_key->getIsTrusted()) { + // If this key is not a trusted device key, don't allow SSH + // authentication. + continue; + } + $key_argv[] = '--phabricator-ssh-device'; + $key_argv[] = $object->getName(); + } else { + // We don't know what sort of key this is; don't permit SSH auth. + continue; + } + + $key_argv[] = '--phabricator-ssh-key'; + $key_argv[] = $ssh_key->getID(); -if (!$user) { - exit(1); + // Strip out newlines and other nonsense from the key type and key body. + $type = $ssh_key->getKeyType(); + $type = preg_replace('@[\x00-\x20]+@', '', $type); + if (!strlen($type)) { + continue; + } + + $key = $ssh_key->getKeyBody(); + $key = preg_replace('@[\x00-\x20]+@', '', $key); + if (!strlen($key)) { + continue; + } + + $key_list[] = array( + 'argv' => $key_argv, + 'type' => $type, + 'key' => $key, + ); + } + + $authstruct = array( + 'keys' => $key_list, + ); + + $authstruct_raw = phutil_json_encode($authstruct); + $ttl = phutil_units('24 hours in seconds'); + $cache->setKey($authstruct_key, $authstruct_raw, $ttl); } -if (!PhabricatorUser::validateUsername($user)) { - exit(1); +// If we've received an "--sshd-key" argument and it matches some known key, +// only emit that key. (For now, if the key doesn't match, we'll fall back to +// emitting all keys.) +if ($sshd_key !== null) { + $matches = array(); + foreach ($authstruct['keys'] as $key => $key_struct) { + if ($key_struct['key'] === $sshd_key) { + $matches[$key] = $key_struct; + } + } + + if ($matches) { + $authstruct['keys'] = $matches; + } } $bin = $root.'/bin/ssh-exec'; -$cmd = csprintf('%s --phabricator-ssh-user %s', $bin, $user); -// This is additional escaping for the SSH 'command="..."' string. -$cmd = str_replace('"', '\\"', $cmd); - -$options = array( - 'command="'.$cmd.'"', - 'no-port-forwarding', - 'no-X11-forwarding', - 'no-agent-forwarding', - 'no-pty', -); - -echo implode(',', $options); +$instance = PhabricatorEnv::getEnvConfig('cluster.instance'); + +$lines = array(); +foreach ($authstruct['keys'] as $key_struct) { + $key_argv = $key_struct['argv']; + $key = $key_struct['key']; + $type = $key_struct['type']; + + $cmd = csprintf('%s %Ls', $bin, $key_argv); + + if ($instance !== null && strlen($instance)) { + $cmd = csprintf('PHABRICATOR_INSTANCE=%s %C', $instance, $cmd); + } + + // This is additional escaping for the SSH 'command="..."' string. + $cmd = addcslashes($cmd, '"\\'); + + $options = array( + 'command="'.$cmd.'"', + 'no-port-forwarding', + 'no-X11-forwarding', + 'no-agent-forwarding', + 'no-pty', + ); + $options = implode(',', $options); + + $lines[] = $options.' '.$type.' '.$key."\n"; +} + +$authfile = implode('', $lines); + +echo $authfile; + exit(0); diff --git a/scripts/ssh/ssh-connect.php b/scripts/ssh/ssh-connect.php new file mode 100755 index 0000000000..c128f3b32f --- /dev/null +++ b/scripts/ssh/ssh-connect.php @@ -0,0 +1,159 @@ +#!/usr/bin/env php +parsePartial( + array( + array( + 'name' => 'port', + 'short' => 'p', + 'param' => pht('port'), + 'help' => pht('Port number to connect to.'), + ), + array( + 'name' => 'options', + 'short' => 'o', + 'param' => pht('options'), + 'repeat' => true, + 'help' => pht('SSH options.'), + ), + )); + +$unconsumed_argv = $args->getUnconsumedArgumentVector(); + +if (function_exists('pcntl_signal')) { + pcntl_signal(SIGTERM, 'ssh_connect_signal'); +} + +function ssh_connect_signal($signo) { + // This is just letting destructors fire. In particular, we want to clean + // up any temporary files we wrote. See T10547. + exit(128 + $signo); +} + +$pattern = array(); +$arguments = array(); + +$pattern[] = 'ssh'; + +$pattern[] = '-o'; +$pattern[] = 'StrictHostKeyChecking=no'; + +// This prevents "known host" failures, and covers for issues where HOME is set +// to something unusual. +$pattern[] = '-o'; +$pattern[] = 'UserKnownHostsFile=/dev/null'; + +$as_device = getenv('PHABRICATOR_AS_DEVICE'); +$credential_phid = getenv('PHABRICATOR_CREDENTIAL'); + +if ($as_device) { + $device = AlmanacKeys::getLiveDevice(); + if (!$device) { + throw new Exception( + pht( + 'Attempting to create an SSH connection that authenticates with '. + 'the current device, but this host is not configured as a cluster '. + 'device.')); + } + + if ($credential_phid) { + throw new Exception( + pht( + 'Attempting to proxy an SSH connection that authenticates with '. + 'both the current device and a specific credential. These options '. + 'are mutually exclusive.')); + } +} + +if ($credential_phid) { + $viewer = PhabricatorUser::getOmnipotentUser(); + $key = PassphraseSSHKey::loadFromPHID($credential_phid, $viewer); + + $pattern[] = '-l %P'; + $arguments[] = $key->getUsernameEnvelope(); + $pattern[] = '-i %P'; + $arguments[] = $key->getKeyfileEnvelope(); +} + +if ($as_device) { + $pattern[] = '-l %R'; + $arguments[] = AlmanacKeys::getClusterSSHUser(); + $pattern[] = '-i %R'; + $arguments[] = AlmanacKeys::getKeyPath('device.key'); +} + +// Subversion passes us a host in the form "domain.com:port", which is not +// valid for normal SSH but which we can parse into a valid "-p" flag. + +$passthru_args = $unconsumed_argv; +$host = array_shift($passthru_args); +$parts = explode(':', $host, 2); +$host = $parts[0]; + +$port = $args->getArg('port'); + +if (!$port) { + if (count($parts) == 2) { + $port = $parts[1]; + } +} + +if ($port) { + $pattern[] = '-p %d'; + $arguments[] = $port; +} + +$options = $args->getArg('options'); +$allowed_ssh_options = array('SendEnv=GIT_PROTOCOL'); + +if (!empty($options)) { + foreach ($options as $option) { + if (array_search($option, $allowed_ssh_options) !== false) { + $pattern[] = '-o %s'; + $arguments[] = $option; + } else { + throw new Exception( + pht( + 'Disallowed ssh option "%s" given with "-o". '. + 'Allowed options are: %s.', + $option, + implode(', ', $allowed_ssh_options))); + } + } +} + +$pattern[] = '--'; + +$pattern[] = '%s'; +$arguments[] = $host; + +foreach ($passthru_args as $passthru_arg) { + $pattern[] = '%s'; + $arguments[] = $passthru_arg; +} + +$pattern = implode(' ', $pattern); +array_unshift($arguments, $pattern); + +$err = newv('PhutilExecPassthru', $arguments) + ->resolve(); + +exit($err); diff --git a/scripts/ssh/ssh-exec.php b/scripts/ssh/ssh-exec.php index a9c639f75d..11e4a3275a 100755 --- a/scripts/ssh/ssh-exec.php +++ b/scripts/ssh/ssh-exec.php @@ -1,91 +1,349 @@ #!/usr/bin/env php setLogName(pht('SSH Error Log')) + ->setLogPath(PhabricatorEnv::getEnvConfig('log.ssh-error.path')) + ->activateLog(); + +$ssh_log = PhabricatorSSHLog::getLog(); -$original_command = getenv('SSH_ORIGINAL_COMMAND'); -$original_argv = id(new PhutilShellLexer())->splitArguments($original_command); -$argv = array_merge($argv, $original_argv); +$request_identifier = Filesystem::readRandomCharacters(12); +$ssh_log->setData( + array( + 'Q' => $request_identifier, + )); $args = new PhutilArgumentParser($argv); -$args->setTagline('receive SSH requests'); +$args->setTagline(pht('execute SSH requests')); $args->setSynopsis(<<parsePartial( +$args->parseStandardArguments(); +$args->parse( array( array( 'name' => 'phabricator-ssh-user', 'param' => 'username', + 'help' => pht( + 'If the request authenticated with a user key, the name of the '. + 'user.'), + ), + array( + 'name' => 'phabricator-ssh-device', + 'param' => 'name', + 'help' => pht( + 'If the request authenticated with a device key, the name of the '. + 'device.'), + ), + array( + 'name' => 'phabricator-ssh-key', + 'param' => 'id', + 'help' => pht( + 'The ID of the SSH key which authenticated this request. This is '. + 'used to allow logs to report when specific keys were used, to make '. + 'it easier to manage credentials.'), + ), + array( + 'name' => 'ssh-command', + 'param' => 'command', + 'help' => pht( + 'Provide a command to execute. This makes testing this script '. + 'easier. When running normally, the command is read from the '. + 'environment (%s), which is populated by sshd.', + 'SSH_ORIGINAL_COMMAND'), ), )); try { - $user_name = $args->getArg('phabricator-ssh-user'); - if (!strlen($user_name)) { - throw new Exception("No username."); + $remote_address = null; + $ssh_client = getenv('SSH_CLIENT'); + if ($ssh_client) { + // This has the format " ". Grab the IP. + $remote_address = head(explode(' ', $ssh_client)); + $ssh_log->setData( + array( + 'r' => $remote_address, + )); } - $user = id(new PhabricatorUser())->loadOneWhere( - 'userName = %s', - $user_name); - if (!$user) { - throw new Exception("Invalid username."); + $key_id = $args->getArg('phabricator-ssh-key'); + if ($key_id) { + $ssh_log->setData( + array( + 'k' => $key_id, + )); + } + + $user_name = $args->getArg('phabricator-ssh-user'); + $device_name = $args->getArg('phabricator-ssh-device'); + + $user = null; + $device = null; + $is_cluster_request = false; + + if ($user_name && $device_name) { + throw new Exception( + pht( + 'The %s and %s flags are mutually exclusive. You can not '. + 'authenticate as both a user ("%s") and a device ("%s"). '. + 'Specify one or the other, but not both.', + '--phabricator-ssh-user', + '--phabricator-ssh-device', + $user_name, + $device_name)); + } else if ($user_name !== null && strlen($user_name)) { + $user = id(new PhabricatorPeopleQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withUsernames(array($user_name)) + ->executeOne(); + if (!$user) { + throw new Exception( + pht( + 'Invalid username ("%s"). There is no user with this username.', + $user_name)); + } + + id(new PhabricatorAuthSessionEngine()) + ->willServeRequestForUser($user); + } else if ($device_name !== null && strlen($device_name)) { + if (!$remote_address) { + throw new Exception( + pht( + 'Unable to identify remote address from the %s environment '. + 'variable. Device authentication is accepted only from trusted '. + 'sources.', + 'SSH_CLIENT')); + } + + if (!PhabricatorEnv::isClusterAddress($remote_address)) { + throw new Exception( + pht( + 'This request originates from outside of the cluster address range. '. + 'Requests signed with a trusted device key must originate from '. + 'trusted hosts.')); + } + + $device = id(new AlmanacDeviceQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withNames(array($device_name)) + ->executeOne(); + if (!$device) { + throw new Exception( + pht( + 'Invalid device name ("%s"). There is no device with this name.', + $device_name)); + } + + if ($device->isDisabled()) { + throw new Exception( + pht( + 'This request has authenticated as a device ("%s"), but this '. + 'device is disabled.', + $device->getName())); + } + + // We're authenticated as a device, but we're going to read the user out of + // the command below. + $is_cluster_request = true; + } else { + throw new Exception( + pht( + 'This script must be invoked with either the %s or %s flag.', + '--phabricator-ssh-user', + '--phabricator-ssh-device')); } - if ($user->getIsDisabled()) { - throw new Exception("You have been exiled."); + if ($args->getArg('ssh-command')) { + $original_command = $args->getArg('ssh-command'); + } else { + $original_command = getenv('SSH_ORIGINAL_COMMAND'); } - $workflows = array( - new ConduitSSHWorkflow(), - ); + $original_argv = id(new PhutilShellLexer()) + ->splitArguments($original_command); + + if ($device) { + // If we're authenticating as a device, the first argument may be a + // "@username" argument to act as a particular user. + $first_argument = head($original_argv); + if (preg_match('/^@/', $first_argument)) { + $act_as_name = array_shift($original_argv); + $act_as_name = substr($act_as_name, 1); + $user = id(new PhabricatorPeopleQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withUsernames(array($act_as_name)) + ->executeOne(); + if (!$user) { + throw new Exception( + pht( + 'Device request identifies an acting user with an invalid '. + 'username ("%s"). There is no user with this username.', + $act_as_name)); + } + } else { + $user = PhabricatorUser::getOmnipotentUser(); + } + } - // This duplicates logic in parseWorkflows(), but allows us to raise more - // concise/relevant exceptions when the client is a remote SSH. - $remain = $args->getUnconsumedArgumentVector(); - if (empty($remain)) { - throw new Exception("No interactive logins."); + if ($user->isOmnipotent()) { + $user_name = 'device/'.$device->getName(); } else { - $command = head($remain); - $workflow_names = mpull($workflows, 'getName', 'getName'); - if (empty($workflow_names[$command])) { - throw new Exception("Invalid command."); + $user_name = $user->getUsername(); + } + + $ssh_log->setData( + array( + 'u' => $user_name, + 'P' => $user->getPHID(), + )); + + if (!$device) { + if (!$user->canEstablishSSHSessions()) { + throw new Exception( + pht( + 'Your account ("%s") does not have permission to establish SSH '. + 'sessions. Visit the web interface for more information.', + $user_name)); } } - $workflow = $args->parseWorkflows($workflows); - $workflow->setUser($user); + $workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorSSHWorkflow') + ->setUniqueMethod('getName') + ->execute(); + + $command_list = array_keys($workflows); + $command_list = implode(', ', $command_list); + + $error_lines = array(); + $error_lines[] = pht( + 'Welcome to %s.', + PlatformSymbols::getPlatformServerName()); + $error_lines[] = pht( + 'You are logged in as %s.', + $user_name); + + if (!$original_argv) { + $error_lines[] = pht( + 'You have not specified a command to run. This means you are requesting '. + 'an interactive shell, but this server does not provide interactive '. + 'shells over SSH.'); + $error_lines[] = pht( + '(Usually, you should run a command like "git clone" or "hg push" '. + 'instead of connecting directly with SSH.)'); + $error_lines[] = pht( + 'Supported commands are: %s.', + $command_list); + + $error_lines = implode("\n\n", $error_lines); + throw new PhutilArgumentUsageException($error_lines); + } + + $log_argv = implode(' ', $original_argv); + $log_argv = id(new PhutilUTF8StringTruncator()) + ->setMaximumCodepoints(128) + ->truncateString($log_argv); + + $ssh_log->setData( + array( + 'C' => $original_argv[0], + 'U' => $log_argv, + )); + + $command = head($original_argv); + + $parseable_argv = $original_argv; + array_unshift($parseable_argv, 'phabricator-ssh-exec'); + + $parsed_args = new PhutilArgumentParser($parseable_argv); + + if (empty($workflows[$command])) { + $error_lines[] = pht( + 'You have specified the command "%s", but that command is not '. + 'supported by this server. As received by this server, your entire '. + 'argument list was:', + $command); + + $error_lines[] = csprintf(' $ ssh ... -- %Ls', $parseable_argv); + + $error_lines[] = pht( + 'Supported commands are: %s.', + $command_list); + + $error_lines = implode("\n\n", $error_lines); + throw new PhutilArgumentUsageException($error_lines); + } + + $workflow = $parsed_args->parseWorkflows($workflows); + $workflow->setSSHUser($user); + $workflow->setOriginalArguments($original_argv); + $workflow->setIsClusterRequest($is_cluster_request); + $workflow->setRequestIdentifier($request_identifier); $sock_stdin = fopen('php://stdin', 'r'); if (!$sock_stdin) { - throw new Exception("Unable to open stdin."); + throw new Exception(pht('Unable to open stdin.')); } $sock_stdout = fopen('php://stdout', 'w'); if (!$sock_stdout) { - throw new Exception("Unable to open stdout."); + throw new Exception(pht('Unable to open stdout.')); + } + + $sock_stderr = fopen('php://stderr', 'w'); + if (!$sock_stderr) { + throw new Exception(pht('Unable to open stderr.')); } $socket_channel = new PhutilSocketChannel( $sock_stdin, $sock_stdout); + $error_channel = new PhutilSocketChannel(null, $sock_stderr); $metrics_channel = new PhutilMetricsChannel($socket_channel); $workflow->setIOChannel($metrics_channel); + $workflow->setErrorChannel($error_channel); + + $rethrow = null; + try { + $err = $workflow->execute($parsed_args); - $err = $workflow->execute($args); + $metrics_channel->flush(); + $error_channel->flush(); + } catch (Exception $ex) { + $rethrow = $ex; + } + + // Always write this if we got as far as building a metrics channel. + $ssh_log->setData( + array( + 'i' => $metrics_channel->getBytesRead(), + 'o' => $metrics_channel->getBytesWritten(), + )); - $metrics_channel->flush(); + if ($rethrow) { + throw $rethrow; + } } catch (Exception $ex) { - echo "phabricator-ssh-exec: ".$ex->getMessage()."\n"; - exit(1); + fwrite(STDERR, "phabricator-ssh-exec: ".$ex->getMessage()."\n"); + $err = 1; } + +$ssh_log->setData( + array( + 'c' => $err, + 'T' => phutil_microseconds_since($ssh_start_time), + )); + +exit($err); diff --git a/scripts/symbols/clear_project_symbols.php b/scripts/symbols/clear_project_symbols.php deleted file mode 100755 index c27576dc29..0000000000 --- a/scripts/symbols/clear_project_symbols.php +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env php -loadOneWhere( - 'name = %s', $argv[1]); -if (!$project) { - throw new Exception('No such arcanist project.'); -} - -$input = file_get_contents('php://stdin'); -$normalized = array(); -foreach (explode("\n", trim($input)) as $path) { - // emulate the behavior of the symbol generation scripts - $normalized[] = '/'.ltrim($path, './'); -} -$paths = PhabricatorRepositoryCommitChangeParserWorker::lookupOrCreatePaths( - $normalized); - -$symbol = new PhabricatorRepositorySymbol(); -$conn_w = $symbol->establishConnection('w'); - -foreach (array_chunk(array_values($paths), 128) as $chunk) { - queryfx( - $conn_w, - 'DELETE FROM %T WHERE arcanistProjectID = %d AND pathID IN (%Ld)', - $symbol->getTableName(), - $project->getID(), - $chunk); -} diff --git a/scripts/symbols/clear_repository_symbols.php b/scripts/symbols/clear_repository_symbols.php new file mode 100755 index 0000000000..701034c6cc --- /dev/null +++ b/scripts/symbols/clear_repository_symbols.php @@ -0,0 +1,60 @@ +#!/usr/bin/env php +setSynopsis(<<parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'repository', + 'wildcard' => true, + ), + )); + +$identifiers = $args->getArg('repository'); +if (count($identifiers) !== 1) { + $args->printHelpAndExit(); +} + +$identifier = head($identifiers); +$repository = id(new PhabricatorRepositoryQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withIdentifiers($identifiers) + ->executeOne(); + +if (!$repository) { + echo tsprintf( + "%s\n", + pht('Repository "%s" does not exist.', $identifier)); + exit(1); +} + +$input = file_get_contents('php://stdin'); +$normalized = array(); +foreach (explode("\n", trim($input)) as $path) { + // Emulate the behavior of the symbol generation scripts. + $normalized[] = '/'.ltrim($path, './'); +} +$paths = PhabricatorRepositoryCommitChangeParserWorker::lookupOrCreatePaths( + $normalized); + +$symbol = new PhabricatorRepositorySymbol(); +$conn_w = $symbol->establishConnection('w'); + +foreach (array_chunk(array_values($paths), 128) as $chunk) { + queryfx( + $conn_w, + 'DELETE FROM %T WHERE repositoryPHID = %s AND pathID IN (%Ld)', + $symbol->getTableName(), + $repository->getPHID(), + $chunk); +} diff --git a/scripts/symbols/generate_ctags_symbols.php b/scripts/symbols/generate_ctags_symbols.php index 15bc14b481..e93b0c5cbc 100755 --- a/scripts/symbols/generate_ctags_symbols.php +++ b/scripts/symbols/generate_ctags_symbols.php @@ -4,77 +4,98 @@ $root = dirname(dirname(dirname(__FILE__))); require_once $root.'/scripts/__init_script__.php'; +$args = new PhutilArgumentParser($argv); +$args->setSynopsis(<<parseStandardArguments(); + if (ctags_check_executable() == false) { echo phutil_console_format( - "Could not find Exuberant ctags. Make sure it is installed and\n". - "available in executable path.\n\n". - "Exuberant ctags project page: http://ctags.sourceforge.net/\n"); + "%s\n\n%s\n", + pht( + 'Could not find Exuberant Ctags. Make sure it is installed and '. + 'available in executable path.'), + pht( + 'Exuberant Ctags project page: %s', + 'http://ctags.sourceforge.net/')); exit(1); } -if ($argc !== 1 || posix_isatty(STDIN)) { +if (posix_isatty(STDIN)) { echo phutil_console_format( - "usage: find . -type f -name '*.py' | ./generate_ctags_symbols.php\n"); + "%s\n", + pht( + 'Usage: %s', + "find . -type f -name '*.py' | ./generate_ctags_symbols.php")); exit(1); } $input = file_get_contents('php://stdin'); -$input = trim($input); -$input = explode("\n", $input); - $data = array(); $futures = array(); -foreach ($input as $file) { +foreach (explode("\n", trim($input)) as $file) { + if (!strlen($file)) { + continue; + } + $file = Filesystem::readablePath($file); $futures[$file] = ctags_get_parser_future($file); } -foreach (Futures($futures)->limit(8) as $file => $future) { +$futures = new FutureIterator($futures); +foreach ($futures->limit(8) as $file => $future) { $tags = $future->resolve(); $tags = explode("\n", $tags[1]); foreach ($tags as $tag) { - $parts = explode(";", $tag); - // skip lines that we can not parse + $parts = explode(';', $tag); + + // Skip lines that we can not parse. if (count($parts) < 2) { continue; } - // split ctags information + // Split ctags information. $tag_info = explode("\t", $parts[0]); - // split exuberant ctags "extension fields" (additional information) + + // Split exuberant ctags "extension fields" (additional information). $parts[1] = trim($parts[1], "\t \""); $extension_fields = explode("\t", $parts[1]); - // skip lines that we can not parse + // Skip lines that we can not parse. if (count($tag_info) < 3 || count($extension_fields) < 2) { continue; } - // default $context to empty + // Default context to empty. $extension_fields[] = ''; list($token, $file_path, $line_num) = $tag_info; list($type, $language, $context) = $extension_fields; - // skip lines with tokens containing a space + // Skip lines with tokens containing a space. if (strpos($token, ' ') !== false) { continue; } - // strip "language:" + // Strip "language:" $language = substr($language, 9); // To keep consistent with "Separate with commas, for example: php, py" // in Arcanist Project edit form. - $language = str_ireplace("python", "py", $language); + $language = str_ireplace('python', 'py', $language); - // also, "normalize" c++ and c# - $language = str_ireplace("c++", "cpp", $language); - $language = str_ireplace("c#", "csharp", $language); + // Also, "normalize" C++ and C#. + $language = str_ireplace('c++', 'cpp', $language); + $language = str_ireplace('c#', 'cs', $language); - // Ruby has "singleton method", for example + // Ruby has "singleton method", for example. $type = substr(str_replace(' ', '_', $type), 0, 12); + // class:foo, struct:foo, union:foo, enum:foo, ... $context = last(explode(':', $context, 2)); @@ -87,30 +108,23 @@ } } -function ctags_get_parser_future($file_path) { - $future = new ExecFuture('ctags -n --fields=Kls -o - %s', - $file_path); +function ctags_get_parser_future($path) { + $future = new ExecFuture('ctags -n --fields=Kls -o - %s', $path); return $future; } function ctags_check_executable() { - $future = new ExecFuture('ctags --version'); - $result = $future->resolve(); - - if (empty($result[1])) { - return false; - } - - return true; + $result = exec_manual('ctags --version'); + return !empty($result[1]); } function print_symbol($file, $line_num, $type, $token, $context, $language) { - // get rid of relative path + // Get rid of relative path. $file = explode('/', $file); - if ($file[0] == '.' || $file[0] == "..") { + if ($file[0] == '.' || $file[0] == '..') { array_shift($file); } - $file = '/' . implode('/', $file); + $file = '/'.implode('/', $file); $parts = array( $context, diff --git a/scripts/symbols/generate_php_symbols.php b/scripts/symbols/generate_php_symbols.php index 65eecbb199..af87d580d8 100755 --- a/scripts/symbols/generate_php_symbols.php +++ b/scripts/symbols/generate_php_symbols.php @@ -4,26 +4,40 @@ $root = dirname(dirname(dirname(__FILE__))); require_once $root.'/scripts/__init_script__.php'; -if ($argc !== 1 || posix_isatty(STDIN)) { +$args = new PhutilArgumentParser($argv); +$args->setSynopsis(<<parseStandardArguments(); + +if (posix_isatty(STDIN)) { echo phutil_console_format( - "usage: find . -type f -name '*.php' | ./generate_php_symbols.php\n"); + "%s\n", + pht( + 'Usage: %s', + "find . -type f -name '*.php' | ./generate_php_symbols.php")); exit(1); } $input = file_get_contents('php://stdin'); -$input = trim($input); -$input = explode("\n", $input); - $data = array(); $futures = array(); -foreach ($input as $file) { +foreach (explode("\n", trim($input)) as $file) { + if (!strlen($file)) { + continue; + } + $file = Filesystem::readablePath($file); $data[$file] = Filesystem::readFile($file); - $futures[$file] = xhpast_get_parser_future($data[$file]); + $futures[$file] = PhutilXHPASTBinary::getParserFuture($data[$file]); } -foreach (Futures($futures)->limit(8) as $file => $future) { +$futures = new FutureIterator($futures); +foreach ($futures->limit(8) as $file => $future) { $tree = XHPASTTree::newFromDataAndResolvedExecFuture( $data[$file], $future->resolve()); @@ -34,6 +48,10 @@ $functions = $root->selectDescendantsOfType('n_FUNCTION_DECLARATION'); foreach ($functions as $function) { $name = $function->getChildByIndex(2); + // Skip anonymous functions. + if (!$name->getConcreteString()) { + continue; + } print_symbol($file, 'function', $name); } @@ -61,8 +79,8 @@ } foreach ($scopes as $scope) { - // this prints duplicate symbols in the case of nested classes - // luckily, PHP doesn't allow those + // This prints duplicate symbols in the case of nested classes. + // Luckily, PHP doesn't allow those. list($class, $class_name) = $scope; $consts = $class->selectDescendantsOfType( @@ -94,15 +112,15 @@ } } -function print_symbol($file, $type, $token, $context=null) { +function print_symbol($file, $type, XHPASTNode $node, $context = null) { $parts = array( $context ? $context->getConcreteString() : '', - // variable tokens are `$name`, not just `name`, so strip the $ off of + // Variable tokens are `$name`, not just `name`, so strip the "$"" off of // class field names - ltrim($token->getConcreteString(), '$'), + ltrim($node->getConcreteString(), '$'), $type, 'php', - $token->getLineNumber(), + $node->getLineNumber(), '/'.ltrim($file, './'), ); echo implode(' ', $parts)."\n"; diff --git a/scripts/symbols/import_project_symbols.php b/scripts/symbols/import_project_symbols.php deleted file mode 100755 index 6271dc7f75..0000000000 --- a/scripts/symbols/import_project_symbols.php +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env php -setSynopsis(<<parseStandardArguments(); -$args->parse( - array( - array( - 'name' => 'no-purge', - 'help' => 'Do not clear all symbols for this project before '. - 'uploading new symbols. Useful for incremental updating.', - ), - array( - 'name' => 'ignore-errors', - 'help' => 'If a line can\'t be parsed, ignore that line and '. - 'continue instead of exiting.', - ), - array( - 'name' => 'more', - 'wildcard' => true, - ), - )); - -$more = $args->getArg('more'); -if (count($more) !== 1) { - $args->printHelpAndExit(); -} - -$project_name = head($more); -$project = id(new PhabricatorRepositoryArcanistProject())->loadOneWhere( - 'name = %s', - $project_name); - -if (!$project) { - // TODO: Provide a less silly way to do this explicitly, or just do it right - // here. - echo "Project '{$project_name}' is unknown. Upload a diff to implicitly ". - "create it.\n"; - exit(1); -} - -echo "Parsing input from stdin...\n"; -$input = file_get_contents('php://stdin'); -$input = trim($input); -$input = explode("\n", $input); - -$symbols = array(); -foreach ($input as $key => $line) { - try { - $line_no = $key + 1; - $matches = null; - $ok = preg_match( - '/^((?P[^ ]+)? )?(?P[^ ]+) (?P[^ ]+) '. - '(?P[^ ]+) (?P\d+) (?P.*)$/', - $line, - $matches); - if (!$ok) { - throw new Exception( - "Line #{$line_no} of input is invalid. Expected five or six ". - "space-delimited fields: maybe symbol context, symbol name, symbol ". - "type, symbol language, line number, path. ". - "For example:\n\n". - "idx function php 13 /path/to/some/file.php\n\n". - "Actual line was:\n\n". - "{$line}"); - } - if (empty($matches['context'])) { - $matches['context'] = ''; - } - $context = $matches['context']; - $name = $matches['name']; - $type = $matches['type']; - $lang = $matches['lang']; - $line_number = $matches['line']; - $path = $matches['path']; - - if (strlen($context) > 128) { - throw new Exception( - "Symbol context '{$context}' defined on line #{$line_no} is too long, ". - "maximum symbol context length is 128 characters."); - } - - if (strlen($name) > 128) { - throw new Exception( - "Symbol name '{$name}' defined on line #{$line_no} is too long, ". - "maximum symbol name length is 128 characters."); - } - - if (strlen($type) > 12) { - throw new Exception( - "Symbol type '{$type}' defined on line #{$line_no} is too long, ". - "maximum symbol type length is 12 characters."); - } - - if (strlen($lang) > 32) { - throw new Exception( - "Symbol language '{$lang}' defined on line #{$line_no} is too long, ". - "maximum symbol language length is 32 characters."); - } - - if (!strlen($path) || $path[0] != 0) { - throw new Exception( - "Path '{$path}' defined on line #{$line_no} is invalid. Paths should ". - "begin with '/' and specify a path from the root of the project, like ". - "'/src/utils/utils.php'."); - } - - $symbols[] = array( - 'ctxt' => $context, - 'name' => $name, - 'type' => $type, - 'lang' => $lang, - 'line' => $line_number, - 'path' => $path, - ); - } catch (Exception $e) { - if ($args->getArg('ignore-errors')) { - continue; - } else { - throw $e; - } - } -} - -echo "Looking up path IDs...\n"; -$path_map = PhabricatorRepositoryCommitChangeParserWorker::lookupOrCreatePaths( - ipull($symbols, 'path')); - -$symbol = new PhabricatorRepositorySymbol(); -$conn_w = $symbol->establishConnection('w'); - -echo "Preparing queries...\n"; -$sql = array(); -foreach ($symbols as $dict) { - $sql[] = qsprintf( - $conn_w, - '(%d, %s, %s, %s, %s, %d, %d)', - $project->getID(), - $dict['ctxt'], - $dict['name'], - $dict['type'], - $dict['lang'], - $dict['line'], - $path_map[$dict['path']]); -} - -if (!$args->getArg('no-purge')) { - echo "Purging old symbols...\n"; - queryfx( - $conn_w, - 'DELETE FROM %T WHERE arcanistProjectID = %d', - $symbol->getTableName(), - $project->getID()); -} - -echo "Loading ".number_format(count($sql))." symbols...\n"; -foreach (array_chunk($sql, 128) as $chunk) { - queryfx( - $conn_w, - 'INSERT INTO %T - (arcanistProjectID, symbolContext, symbolName, symbolType, - symbolLanguage, lineNumber, pathID) VALUES %Q', - $symbol->getTableName(), - implode(', ', $chunk)); -} - -echo "Done.\n"; diff --git a/scripts/symbols/import_repository_symbols.php b/scripts/symbols/import_repository_symbols.php new file mode 100755 index 0000000000..24a0624d64 --- /dev/null +++ b/scripts/symbols/import_repository_symbols.php @@ -0,0 +1,231 @@ +#!/usr/bin/env php +setSynopsis(<<parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'no-purge', + 'help' => pht( + 'Do not clear all symbols for this repository before '. + 'uploading new symbols. Useful for incremental updating.'), + ), + array( + 'name' => 'ignore-errors', + 'help' => pht( + "If a line can't be parsed, ignore that line and ". + "continue instead of exiting."), + ), + array( + 'name' => 'max-transaction', + 'param' => 'num-syms', + 'default' => '100000', + 'help' => pht( + 'Maximum number of symbols that should '. + 'be part of a single transaction.'), + ), + array( + 'name' => 'repository', + 'wildcard' => true, + ), + )); + +$identifiers = $args->getArg('repository'); +if (count($identifiers) !== 1) { + $args->printHelpAndExit(); +} + +$identifier = head($identifiers); +$repository = id(new PhabricatorRepositoryQuery()) + ->setViewer(PhabricatorUser::getOmnipotentUser()) + ->withIdentifiers($identifiers) + ->executeOne(); + +if (!$repository) { + echo tsprintf( + "%s\n", + pht('Repository "%s" does not exist.', $identifier)); + exit(1); +} + +if (!function_exists('posix_isatty') || posix_isatty(STDIN)) { + echo pht('Parsing input from stdin...'), "\n"; +} + +$input = file_get_contents('php://stdin'); +$input = trim($input); +$input = explode("\n", $input); + + +function commit_symbols( + array $symbols, + PhabricatorRepository $repository, + $no_purge) { + + echo pht('Looking up path IDs...'), "\n"; + $path_map = + PhabricatorRepositoryCommitChangeParserWorker::lookupOrCreatePaths( + ipull($symbols, 'path')); + + $symbol = new PhabricatorRepositorySymbol(); + $conn_w = $symbol->establishConnection('w'); + + echo pht('Preparing queries...'), "\n"; + $sql = array(); + foreach ($symbols as $dict) { + $sql[] = qsprintf( + $conn_w, + '(%s, %s, %s, %s, %s, %d, %d)', + $repository->getPHID(), + $dict['ctxt'], + $dict['name'], + $dict['type'], + $dict['lang'], + $dict['line'], + $path_map[$dict['path']]); + } + + if (!$no_purge) { + echo pht('Purging old symbols...'), "\n"; + queryfx( + $conn_w, + 'DELETE FROM %T WHERE repositoryPHID = %s', + $symbol->getTableName(), + $repository->getPHID()); + } + + echo pht('Loading %s symbols...', phutil_count($sql)), "\n"; + foreach (array_chunk($sql, 128) as $chunk) { + queryfx( + $conn_w, + 'INSERT INTO %T + (repositoryPHID, symbolContext, symbolName, symbolType, + symbolLanguage, lineNumber, pathID) VALUES %LQ', + $symbol->getTableName(), + $chunk); + } +} + +function check_string_value($value, $field_name, $line_no, $max_length) { + if (strlen($value) > $max_length) { + throw new Exception( + pht( + "%s '%s' defined on line #%d is too long, ". + "maximum %s length is %d characters.", + $field_name, + $value, + $line_no, + $field_name, + $max_length)); + } + + if (!phutil_is_utf8_with_only_bmp_characters($value)) { + throw new Exception( + pht( + "%s '%s' defined on line #%d is not a valid ". + "UTF-8 string, it should contain only UTF-8 characters.", + $field_name, + $value, + $line_no)); + } +} + +$no_purge = $args->getArg('no-purge'); +$symbols = array(); +foreach ($input as $key => $line) { + try { + $line_no = $key + 1; + $matches = null; + $ok = preg_match( + '/^((?P[^ ]+)? )?(?P[^ ]+) (?P[^ ]+) '. + '(?P[^ ]+) (?P\d+) (?P.*)$/', + $line, + $matches); + if (!$ok) { + throw new Exception( + pht( + "Line #%d of input is invalid. Expected five or six space-delimited ". + "fields: maybe symbol context, symbol name, symbol type, symbol ". + "language, line number, path. For example:\n\n%s\n\n". + "Actual line was:\n\n%s", + $line_no, + 'idx function php 13 /path/to/some/file.php', + $line)); + } + if (empty($matches['context'])) { + $matches['context'] = ''; + } + $context = $matches['context']; + $name = $matches['name']; + $type = $matches['type']; + $lang = $matches['lang']; + $line_number = $matches['line']; + $path = $matches['path']; + + check_string_value($context, pht('Symbol context'), $line_no, 128); + check_string_value($name, pht('Symbol name'), $line_no, 128); + check_string_value($type, pht('Symbol type'), $line_no, 12); + check_string_value($lang, pht('Symbol language'), $line_no, 32); + check_string_value($path, pht('Path'), $line_no, 512); + + if (!strlen($path) || $path[0] != '/') { + throw new Exception( + pht( + "Path '%s' defined on line #%d is invalid. Paths should begin with ". + "'%s' and specify a path from the root of the project, like '%s'.", + $path, + $line_no, + '/', + '/src/utils/utils.php')); + } + + $symbols[] = array( + 'ctxt' => $context, + 'name' => $name, + 'type' => $type, + 'lang' => $lang, + 'line' => $line_number, + 'path' => $path, + ); + } catch (Exception $e) { + if ($args->getArg('ignore-errors')) { + continue; + } else { + throw $e; + } + } + + if (count($symbols) >= $args->getArg('max-transaction')) { + try { + echo pht( + "Committing %s symbols...\n", + new PhutilNumber($args->getArg('max-transaction'))); + commit_symbols($symbols, $repository, $no_purge); + $no_purge = true; + unset($symbols); + $symbols = array(); + } catch (Exception $e) { + if ($args->getArg('ignore-errors')) { + continue; + } else { + throw $e; + } + } + } +} + +if (count($symbols)) { + commit_symbols($symbols, $repository, $no_purge); +} + +echo pht('Done.')."\n"; diff --git a/scripts/user/account_admin.php b/scripts/user/account_admin.php deleted file mode 100755 index d966240f15..0000000000 --- a/scripts/user/account_admin.php +++ /dev/null @@ -1,199 +0,0 @@ -#!/usr/bin/env php -loadOneWhere( - 'username = %s', - $username); - -if (!$user) { - $original = new PhabricatorUser(); - - echo "There is no existing user account '{$username}'.\n"; - $ok = phutil_console_confirm( - "Do you want to create a new '{$username}' account?", - $default_no = false); - if (!$ok) { - echo "Cancelled.\n"; - exit(1); - } - $user = new PhabricatorUser(); - $user->setUsername($username); - - $is_new = true; -} else { - $original = clone $user; - - echo "There is an existing user account '{$username}'.\n"; - $ok = phutil_console_confirm( - "Do you want to edit the existing '{$username}' account?", - $default_no = false); - if (!$ok) { - echo "Cancelled.\n"; - exit(1); - } - - $is_new = false; -} - -$user_realname = $user->getRealName(); -if (strlen($user_realname)) { - $realname_prompt = ' ['.$user_realname.']'; -} else { - $realname_prompt = ''; -} -$realname = nonempty( - phutil_console_prompt("Enter user real name{$realname_prompt}:"), - $user_realname); -$user->setRealName($realname); - -// When creating a new user we prompt for an email address; when editing an -// existing user we just skip this because it would be quite involved to provide -// a reasonable CLI interface for editing multiple addresses and managing email -// verification and primary addresses. - -$create_email = null; -if ($is_new) { - do { - $email = phutil_console_prompt("Enter user email address:"); - $duplicate = id(new PhabricatorUserEmail())->loadOneWhere( - 'address = %s', - $email); - if ($duplicate) { - echo "ERROR: There is already a user with that email address. ". - "Each user must have a unique email address.\n"; - } else { - break; - } - } while (true); - - $create_email = $email; -} - -$changed_pass = false; -// This disables local echo, so the user's password is not shown as they type -// it. -phutil_passthru('stty -echo'); -$password = phutil_console_prompt( - "Enter a password for this user [blank to leave unchanged]:"); -phutil_passthru('stty echo'); -if (strlen($password)) { - $changed_pass = $password; -} - -$is_system_agent = $user->getIsSystemAgent(); -$set_system_agent = phutil_console_confirm( - 'Should this user be a system agent?', - $default_no = !$is_system_agent); - -$verify_email = null; -$set_verified = false; -// Allow administrators to verify primary email addresses at this time in edit -// scenarios. (Create will work just fine from here as we auto-verify email -// on create.) -if (!$is_new) { - $verify_email = $user->loadPrimaryEmail(); - if (!$verify_email->getIsVerified()) { - $set_verified = phutil_console_confirm( - 'Should the primary email address be verified?', - $default_no = true); - } else { - // already verified so let's not make a fuss - $verify_email = null; - } -} - -$is_admin = $user->getIsAdmin(); -$set_admin = phutil_console_confirm( - 'Should this user be an administrator?', - $default_no = !$is_admin); - -echo "\n\nACCOUNT SUMMARY\n\n"; -$tpl = "%12s %-30s %-30s\n"; -printf($tpl, null, 'OLD VALUE', 'NEW VALUE'); -printf($tpl, 'Username', $original->getUsername(), $user->getUsername()); -printf($tpl, 'Real Name', $original->getRealName(), $user->getRealName()); -if ($is_new) { - printf($tpl, 'Email', '', $create_email); -} -printf($tpl, 'Password', null, - ($changed_pass !== false) - ? 'Updated' - : 'Unchanged'); - -printf( - $tpl, - 'System Agent', - $original->getIsSystemAgent() ? 'Y' : 'N', - $set_system_agent ? 'Y' : 'N'); - -if ($verify_email) { - printf( - $tpl, - 'Verify Email', - $verify_email->getIsVerified() ? 'Y' : 'N', - $set_verified ? 'Y' : 'N'); -} - -printf( - $tpl, - 'Admin', - $original->getIsAdmin() ? 'Y' : 'N', - $set_admin ? 'Y' : 'N'); - -echo "\n"; - -if (!phutil_console_confirm("Save these changes?", $default_no = false)) { - echo "Cancelled.\n"; - exit(1); -} - -$user->openTransaction(); - - $editor = new PhabricatorUserEditor(); - - // TODO: This is wrong, but we have a chicken-and-egg problem when you use - // this script to create the first user. - $editor->setActor($user); - - if ($is_new) { - $email = id(new PhabricatorUserEmail()) - ->setAddress($create_email) - ->setIsVerified(1); - - $editor->createNewUser($user, $email); - } else { - if ($verify_email) { - $verify_email->setIsVerified($set_verified ? 1 : 0); - } - $editor->updateUser($user, $verify_email); - } - - $editor->makeAdminUser($user, $set_admin); - $editor->makeSystemAgentUser($user, $set_system_agent); - - if ($changed_pass !== false) { - $envelope = new PhutilOpaqueEnvelope($changed_pass); - $editor->changePassword($user, $envelope); - } - -$user->saveTransaction(); - -echo "Saved changes.\n"; diff --git a/scripts/user/add_user.php b/scripts/user/add_user.php deleted file mode 100755 index edb6a1a26b..0000000000 --- a/scripts/user/add_user.php +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env php - \n"; - exit(1); -} - -$username = $argv[1]; -$email = $argv[2]; -$realname = $argv[3]; -$admin = $argv[4]; - -$admin = id(new PhabricatorUser())->loadOneWhere( - 'username = %s', - $argv[4]); -if (!$admin) { - throw new Exception( - "Admin user must be the username of a valid Phabricator account, used ". - "to send the new user a welcome email."); -} - -$existing_user = id(new PhabricatorUser())->loadOneWhere( - 'username = %s', - $username); -if ($existing_user) { - throw new Exception( - "There is already a user with the username '{$username}'!"); -} - -$existing_email = id(new PhabricatorUserEmail())->loadOneWhere( - 'address = %s', - $email); -if ($existing_email) { - throw new Exception( - "There is already a user with the email '{$email}'!"); -} - -$user = new PhabricatorUser(); -$user->setUsername($username); -$user->setRealname($realname); - -$email_object = id(new PhabricatorUserEmail()) - ->setAddress($email) - ->setIsVerified(1); - -id(new PhabricatorUserEditor()) - ->setActor($admin) - ->createNewUser($user, $email_object); - -$user->sendWelcomeEmail($admin); - -echo "Created user '{$username}' (realname='{$realname}', email='{$email}').\n"; diff --git a/scripts/util/add_macro.php b/scripts/util/add_macro.php index e2b9ea5608..03566cfb76 100755 --- a/scripts/util/add_macro.php +++ b/scripts/util/add_macro.php @@ -5,7 +5,7 @@ require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('load files as image macros'); +$args->setTagline(pht('load files as image macros')); $args->setSynopsis(<< 'as', 'param' => 'name', - 'help' => 'Use a specific name instead of the first part of the image '. - 'name.', + 'help' => pht( + 'Use a specific name instead of the first part of the image name.'), ), array( 'name' => 'more', @@ -45,13 +45,14 @@ 'name = %s', $name); if ($existing) { - throw new Exception("A macro already exists with the name '{$name}'!"); + throw new Exception(pht("A macro already exists with the name '%s'!", $name)); } $file = PhabricatorFile::newFromFileData( $data, array( 'name' => basename($path), + 'canCDN' => true, )); $macro = id(new PhabricatorFileImageMacro()) @@ -61,4 +62,4 @@ $id = $file->getID(); -echo "Added macro '{$name}' (F{$id}).\n"; +echo pht("Added macro '%s' (%s).", $name, "F{$id}")."\n"; diff --git a/scripts/util/emit_test_event.php b/scripts/util/emit_test_event.php index 500e8390e4..c8502d0fe6 100755 --- a/scripts/util/emit_test_event.php +++ b/scripts/util/emit_test_event.php @@ -5,7 +5,7 @@ require_once $root.'/scripts/__init_script__.php'; $args = new PhutilArgumentParser($argv); -$args->setTagline('emit a test event'); +$args->setTagline(pht('emit a test event')); $args->setSynopsis(<<getArg('listen') as $listener) { - $console->writeOut("Installing '%s'...\n", $listener); + $console->writeOut("%s\n", pht("Installing '%s'...", $listener)); newv($listener, array())->register(); } -$console->writeOut("Emitting event...\n"); +$console->writeOut("%s\n", pht('Emitting event...')); PhutilEventEngine::dispatchEvent( new PhabricatorEvent( @@ -37,5 +37,5 @@ 'time' => time(), ))); -$console->writeOut("Done.\n"); +$console->writeOut("%s\n", pht('Done.')); exit(0); diff --git a/scripts/util/purge_cache.php b/scripts/util/purge_cache.php deleted file mode 100755 index 54a0bb29aa..0000000000 --- a/scripts/util/purge_cache.php +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env php - - array( - 'hash' => 'ae90914d120ac3838ddc633b480343f3', - 'uri' => '/res/ae90914d/rsrc/image/actions/edit.png', - 'disk' => '/rsrc/image/actions/edit.png', - 'type' => 'png', - ), - '/rsrc/image/apple-touch-icon.png' => - array( - 'hash' => '3380adf2dd4a5efa0885618bc5943640', - 'uri' => '/res/3380adf2/rsrc/image/apple-touch-icon.png', - 'disk' => '/rsrc/image/apple-touch-icon.png', - 'type' => 'png', - ), - '/rsrc/image/avatar.png' => - array( - 'hash' => '1c5f255071537f05406adee86717ff27', - 'uri' => '/res/1c5f2550/rsrc/image/avatar.png', - 'disk' => '/rsrc/image/avatar.png', - 'type' => 'png', - ), - '/rsrc/image/checker_dark.png' => - array( - 'hash' => '640f795343df76ebe5409aae6187e57f', - 'uri' => '/res/640f7953/rsrc/image/checker_dark.png', - 'disk' => '/rsrc/image/checker_dark.png', - 'type' => 'png', - ), - '/rsrc/image/checker_light.png' => - array( - 'hash' => '7f8f3ef8beb0f2cc4cc69efb9e1c3308', - 'uri' => '/res/7f8f3ef8/rsrc/image/checker_light.png', - 'disk' => '/rsrc/image/checker_light.png', - 'type' => 'png', - ), - '/rsrc/image/credit_cards.png' => - array( - 'hash' => '681448de424ea159b6ea68af04c046ae', - 'uri' => '/res/681448de/rsrc/image/credit_cards.png', - 'disk' => '/rsrc/image/credit_cards.png', - 'type' => 'png', - ), - '/rsrc/image/darkload.gif' => - array( - 'hash' => '3a52cb7145d6e70f461fed21273117f2', - 'uri' => '/res/3a52cb71/rsrc/image/darkload.gif', - 'disk' => '/rsrc/image/darkload.gif', - 'type' => 'gif', - ), - '/rsrc/image/divot.png' => - array( - 'hash' => '3be267bd11ea375bf68e808893718e0e', - 'uri' => '/res/3be267bd/rsrc/image/divot.png', - 'disk' => '/rsrc/image/divot.png', - 'type' => 'png', - ), - '/rsrc/image/grippy_texture.png' => - array( - 'hash' => 'a8945e12ceeaddd5b491a8d81cfa19c1', - 'uri' => '/res/a8945e12/rsrc/image/grippy_texture.png', - 'disk' => '/rsrc/image/grippy_texture.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/arrow_branch.png' => - array( - 'hash' => 'f27b67520766e3d971722bcff703f3a8', - 'uri' => '/res/f27b6752/rsrc/image/icon/fatcow/arrow_branch.png', - 'disk' => '/rsrc/image/icon/fatcow/arrow_branch.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/arrow_merge.png' => - array( - 'hash' => 'c4bd97f3b1257439e2123ef69d2194d0', - 'uri' => '/res/c4bd97f3/rsrc/image/icon/fatcow/arrow_merge.png', - 'disk' => '/rsrc/image/icon/fatcow/arrow_merge.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/bullet_black.png' => - array( - 'hash' => 'c148284c84aa02ba1190dcf7e31c8985', - 'uri' => '/res/c148284c/rsrc/image/icon/fatcow/bullet_black.png', - 'disk' => '/rsrc/image/icon/fatcow/bullet_black.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/bullet_orange.png' => - array( - 'hash' => '397bd1c948d9aaac5e440a9270c3697a', - 'uri' => '/res/397bd1c9/rsrc/image/icon/fatcow/bullet_orange.png', - 'disk' => '/rsrc/image/icon/fatcow/bullet_orange.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/bullet_red.png' => - array( - 'hash' => '470e3b2c2ca84ebdd476271b681f421b', - 'uri' => '/res/470e3b2c/rsrc/image/icon/fatcow/bullet_red.png', - 'disk' => '/rsrc/image/icon/fatcow/bullet_red.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/calendar_edit.png' => - array( - 'hash' => 'de249c0f4f37bf5b2c69ff39ec5573fb', - 'uri' => '/res/de249c0f/rsrc/image/icon/fatcow/calendar_edit.png', - 'disk' => '/rsrc/image/icon/fatcow/calendar_edit.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/document_black.png' => - array( - 'hash' => '44d65a7f05a9c921719deedc160d68f7', - 'uri' => '/res/44d65a7f/rsrc/image/icon/fatcow/document_black.png', - 'disk' => '/rsrc/image/icon/fatcow/document_black.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/flag_blue.png' => - array( - 'hash' => '75a080492f900fbe489e4b27e403962b', - 'uri' => '/res/75a08049/rsrc/image/icon/fatcow/flag_blue.png', - 'disk' => '/rsrc/image/icon/fatcow/flag_blue.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/flag_finish.png' => - array( - 'hash' => '4af11fc7fab8e4610cbc3c88a02d4f78', - 'uri' => '/res/4af11fc7/rsrc/image/icon/fatcow/flag_finish.png', - 'disk' => '/rsrc/image/icon/fatcow/flag_finish.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/flag_ghost.png' => - array( - 'hash' => '14c9f30a37b43f276f27a27a924bf02d', - 'uri' => '/res/14c9f30a/rsrc/image/icon/fatcow/flag_ghost.png', - 'disk' => '/rsrc/image/icon/fatcow/flag_ghost.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/flag_green.png' => - array( - 'hash' => 'fed01374cd396cb774872762dcc447e1', - 'uri' => '/res/fed01374/rsrc/image/icon/fatcow/flag_green.png', - 'disk' => '/rsrc/image/icon/fatcow/flag_green.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/flag_orange.png' => - array( - 'hash' => '88008cb8bb99761a37e5a743e2455aeb', - 'uri' => '/res/88008cb8/rsrc/image/icon/fatcow/flag_orange.png', - 'disk' => '/rsrc/image/icon/fatcow/flag_orange.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/flag_pink.png' => - array( - 'hash' => '2f199f06ffc3dfc81b7561a057e0bc33', - 'uri' => '/res/2f199f06/rsrc/image/icon/fatcow/flag_pink.png', - 'disk' => '/rsrc/image/icon/fatcow/flag_pink.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/flag_purple.png' => - array( - 'hash' => '16358629dc86c39550b575586eb5df80', - 'uri' => '/res/16358629/rsrc/image/icon/fatcow/flag_purple.png', - 'disk' => '/rsrc/image/icon/fatcow/flag_purple.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/flag_red.png' => - array( - 'hash' => '210c28b4d93c439a499f5814f5e05772', - 'uri' => '/res/210c28b4/rsrc/image/icon/fatcow/flag_red.png', - 'disk' => '/rsrc/image/icon/fatcow/flag_red.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/flag_yellow.png' => - array( - 'hash' => 'bdfd73744a80bb80329ae50bc8a5f962', - 'uri' => '/res/bdfd7374/rsrc/image/icon/fatcow/flag_yellow.png', - 'disk' => '/rsrc/image/icon/fatcow/flag_yellow.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/folder.png' => - array( - 'hash' => '25e46cf9d210dde2242332296f79938c', - 'uri' => '/res/25e46cf9/rsrc/image/icon/fatcow/folder.png', - 'disk' => '/rsrc/image/icon/fatcow/folder.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/folder_go.png' => - array( - 'hash' => 'ba922ff7959309f51a14cb7ed5124d8b', - 'uri' => '/res/ba922ff7/rsrc/image/icon/fatcow/folder_go.png', - 'disk' => '/rsrc/image/icon/fatcow/folder_go.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/key_question.png' => - array( - 'hash' => '530a6448a4b91edec091a9292ccfd3d9', - 'uri' => '/res/530a6448/rsrc/image/icon/fatcow/key_question.png', - 'disk' => '/rsrc/image/icon/fatcow/key_question.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/link.png' => - array( - 'hash' => 'be1bea49b216548433014f3324902928', - 'uri' => '/res/be1bea49/rsrc/image/icon/fatcow/link.png', - 'disk' => '/rsrc/image/icon/fatcow/link.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/page_white_edit.png' => - array( - 'hash' => 'e7b7e7f2d9730bc80bc5c9eac1f3e36d', - 'uri' => '/res/e7b7e7f2/rsrc/image/icon/fatcow/page_white_edit.png', - 'disk' => '/rsrc/image/icon/fatcow/page_white_edit.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/page_white_link.png' => - array( - 'hash' => '1cfbad14412bda6c6f132dcc7c8725fd', - 'uri' => '/res/1cfbad14/rsrc/image/icon/fatcow/page_white_link.png', - 'disk' => '/rsrc/image/icon/fatcow/page_white_link.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/page_white_put.png' => - array( - 'hash' => 'bb7308aa5ac40137a8262da395a267fd', - 'uri' => '/res/bb7308aa/rsrc/image/icon/fatcow/page_white_put.png', - 'disk' => '/rsrc/image/icon/fatcow/page_white_put.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/page_white_text.png' => - array( - 'hash' => 'e47d590b626f617fb7d1d44e96e8fd11', - 'uri' => '/res/e47d590b/rsrc/image/icon/fatcow/page_white_text.png', - 'disk' => '/rsrc/image/icon/fatcow/page_white_text.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/source/conduit.png' => - array( - 'hash' => '1cae0656580aa3cd0b54b9d98306b1b9', - 'uri' => '/res/1cae0656/rsrc/image/icon/fatcow/source/conduit.png', - 'disk' => '/rsrc/image/icon/fatcow/source/conduit.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/source/email.png' => - array( - 'hash' => '93bdb3e168da1ed68f50c42125729d4e', - 'uri' => '/res/93bdb3e1/rsrc/image/icon/fatcow/source/email.png', - 'disk' => '/rsrc/image/icon/fatcow/source/email.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/source/fax.png' => - array( - 'hash' => 'd7dedf229841f2d041b347afd881596f', - 'uri' => '/res/d7dedf22/rsrc/image/icon/fatcow/source/fax.png', - 'disk' => '/rsrc/image/icon/fatcow/source/fax.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/source/mobile.png' => - array( - 'hash' => '786e7146d1e7d7318baf76c9d2baad97', - 'uri' => '/res/786e7146/rsrc/image/icon/fatcow/source/mobile.png', - 'disk' => '/rsrc/image/icon/fatcow/source/mobile.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/source/tablet.png' => - array( - 'hash' => '374cd40e4965be6b2fbdef4059d0ca05', - 'uri' => '/res/374cd40e/rsrc/image/icon/fatcow/source/tablet.png', - 'disk' => '/rsrc/image/icon/fatcow/source/tablet.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/source/web.png' => - array( - 'hash' => 'f4882a8f5619ba505ca033f72a340635', - 'uri' => '/res/f4882a8f/rsrc/image/icon/fatcow/source/web.png', - 'disk' => '/rsrc/image/icon/fatcow/source/web.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/thumbnails/default160x120.png' => - array( - 'hash' => '1b52ebd1fe0eee3ed0abfc382991b265', - 'uri' => '/res/1b52ebd1/rsrc/image/icon/fatcow/thumbnails/default160x120.png', - 'disk' => '/rsrc/image/icon/fatcow/thumbnails/default160x120.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/thumbnails/default60x45.png' => - array( - 'hash' => '048d851d8d1daad4754e891e734c1899', - 'uri' => '/res/048d851d/rsrc/image/icon/fatcow/thumbnails/default60x45.png', - 'disk' => '/rsrc/image/icon/fatcow/thumbnails/default60x45.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/thumbnails/image160x120.png' => - array( - 'hash' => '434acbd8dbbc2da9f09f6205a396eba1', - 'uri' => '/res/434acbd8/rsrc/image/icon/fatcow/thumbnails/image160x120.png', - 'disk' => '/rsrc/image/icon/fatcow/thumbnails/image160x120.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/thumbnails/image60x45.png' => - array( - 'hash' => '29f7872dc53588fe0b8f0b330c7ee23a', - 'uri' => '/res/29f7872d/rsrc/image/icon/fatcow/thumbnails/image60x45.png', - 'disk' => '/rsrc/image/icon/fatcow/thumbnails/image60x45.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/thumbnails/pdf160x120.png' => - array( - 'hash' => '39d2e22541658a3472ba41ae2fa548e5', - 'uri' => '/res/39d2e225/rsrc/image/icon/fatcow/thumbnails/pdf160x120.png', - 'disk' => '/rsrc/image/icon/fatcow/thumbnails/pdf160x120.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/thumbnails/pdf60x45.png' => - array( - 'hash' => 'b3572e9317cbed5184d12bdfabed2727', - 'uri' => '/res/b3572e93/rsrc/image/icon/fatcow/thumbnails/pdf60x45.png', - 'disk' => '/rsrc/image/icon/fatcow/thumbnails/pdf60x45.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/thumbnails/zip160x120.png' => - array( - 'hash' => 'e505108688a903b5cfb674707a289bcc', - 'uri' => '/res/e5051086/rsrc/image/icon/fatcow/thumbnails/zip160x120.png', - 'disk' => '/rsrc/image/icon/fatcow/thumbnails/zip160x120.png', - 'type' => 'png', - ), - '/rsrc/image/icon/fatcow/thumbnails/zip60x45.png' => - array( - 'hash' => 'f00716f4e8f7a95e70d43504f06be0a6', - 'uri' => '/res/f00716f4/rsrc/image/icon/fatcow/thumbnails/zip60x45.png', - 'disk' => '/rsrc/image/icon/fatcow/thumbnails/zip60x45.png', - 'type' => 'png', - ), - '/rsrc/image/icon/lightbox/close-2.png' => - array( - 'hash' => '72ff3ddcc1ed5d19a715ed6242114b53', - 'uri' => '/res/72ff3ddc/rsrc/image/icon/lightbox/close-2.png', - 'disk' => '/rsrc/image/icon/lightbox/close-2.png', - 'type' => 'png', - ), - '/rsrc/image/icon/lightbox/close-hover-2.png' => - array( - 'hash' => '6ad4bd4a7820547a1d9041752546ba16', - 'uri' => '/res/6ad4bd4a/rsrc/image/icon/lightbox/close-hover-2.png', - 'disk' => '/rsrc/image/icon/lightbox/close-hover-2.png', - 'type' => 'png', - ), - '/rsrc/image/icon/lightbox/left-arrow-2.png' => - array( - 'hash' => 'd84cbb0d42739f87b8f25b2f1d2f1153', - 'uri' => '/res/d84cbb0d/rsrc/image/icon/lightbox/left-arrow-2.png', - 'disk' => '/rsrc/image/icon/lightbox/left-arrow-2.png', - 'type' => 'png', - ), - '/rsrc/image/icon/lightbox/left-arrow-hover-2.png' => - array( - 'hash' => 'cdf05f98fff3f390cd8df0c89894a3e1', - 'uri' => '/res/cdf05f98/rsrc/image/icon/lightbox/left-arrow-hover-2.png', - 'disk' => '/rsrc/image/icon/lightbox/left-arrow-hover-2.png', - 'type' => 'png', - ), - '/rsrc/image/icon/lightbox/right-arrow-2.png' => - array( - 'hash' => '52021038cb6995c71f62a804bc2d420d', - 'uri' => '/res/52021038/rsrc/image/icon/lightbox/right-arrow-2.png', - 'disk' => '/rsrc/image/icon/lightbox/right-arrow-2.png', - 'type' => 'png', - ), - '/rsrc/image/icon/lightbox/right-arrow-hover-2.png' => - array( - 'hash' => '65d5756b7b9cfcdeb2eb197a9aa6bbd2', - 'uri' => '/res/65d5756b/rsrc/image/icon/lightbox/right-arrow-hover-2.png', - 'disk' => '/rsrc/image/icon/lightbox/right-arrow-hover-2.png', - 'type' => 'png', - ), - '/rsrc/image/icon/subscribe.png' => - array( - 'hash' => '5f47a4b17de245af39a4e7a097e40623', - 'uri' => '/res/5f47a4b1/rsrc/image/icon/subscribe.png', - 'disk' => '/rsrc/image/icon/subscribe.png', - 'type' => 'png', - ), - '/rsrc/image/icon/tango/attachment.png' => - array( - 'hash' => '776fed2de89803fd8a0ba4b9deede230', - 'uri' => '/res/776fed2d/rsrc/image/icon/tango/attachment.png', - 'disk' => '/rsrc/image/icon/tango/attachment.png', - 'type' => 'png', - ), - '/rsrc/image/icon/tango/edit.png' => - array( - 'hash' => 'c0028d99dcf4e9559bbf3c88ce2d8a8d', - 'uri' => '/res/c0028d99/rsrc/image/icon/tango/edit.png', - 'disk' => '/rsrc/image/icon/tango/edit.png', - 'type' => 'png', - ), - '/rsrc/image/icon/tango/go-down.png' => - array( - 'hash' => '96862812cbb0445573c264dc057b8300', - 'uri' => '/res/96862812/rsrc/image/icon/tango/go-down.png', - 'disk' => '/rsrc/image/icon/tango/go-down.png', - 'type' => 'png', - ), - '/rsrc/image/icon/tango/log.png' => - array( - 'hash' => 'a6f72499bef279ff6807a7dbc5148f1e', - 'uri' => '/res/a6f72499/rsrc/image/icon/tango/log.png', - 'disk' => '/rsrc/image/icon/tango/log.png', - 'type' => 'png', - ), - '/rsrc/image/icon/tango/upload.png' => - array( - 'hash' => '8c11b63d6d99db3d7159c5d9a94e3062', - 'uri' => '/res/8c11b63d/rsrc/image/icon/tango/upload.png', - 'disk' => '/rsrc/image/icon/tango/upload.png', - 'type' => 'png', - ), - '/rsrc/image/icon/unsubscribe.png' => - array( - 'hash' => '29429ad65aa3af50b072b32087057361', - 'uri' => '/res/29429ad6/rsrc/image/icon/unsubscribe.png', - 'disk' => '/rsrc/image/icon/unsubscribe.png', - 'type' => 'png', - ), - '/rsrc/image/loading.gif' => - array( - 'hash' => '664297671941142f37d8c89e717ff2ce', - 'uri' => '/res/66429767/rsrc/image/loading.gif', - 'disk' => '/rsrc/image/loading.gif', - 'type' => 'gif', - ), - '/rsrc/image/loading/boating_24.gif' => - array( - 'hash' => '2cd349ded48d698ebe886ba97b2db0f7', - 'uri' => '/res/2cd349de/rsrc/image/loading/boating_24.gif', - 'disk' => '/rsrc/image/loading/boating_24.gif', - 'type' => 'gif', - ), - '/rsrc/image/loading/compass_24.gif' => - array( - 'hash' => '726c1ed4bf23446e044d6b9d28250a07', - 'uri' => '/res/726c1ed4/rsrc/image/loading/compass_24.gif', - 'disk' => '/rsrc/image/loading/compass_24.gif', - 'type' => 'gif', - ), - '/rsrc/image/loading/loading_24.gif' => - array( - 'hash' => 'd6dcc5e6111a44fb9a160fc27b19d85c', - 'uri' => '/res/d6dcc5e6/rsrc/image/loading/loading_24.gif', - 'disk' => '/rsrc/image/loading/loading_24.gif', - 'type' => 'gif', - ), - '/rsrc/image/loading/loading_48.gif' => - array( - 'hash' => 'cb6fc6eb9c0a0efaf589978029080c58', - 'uri' => '/res/cb6fc6eb/rsrc/image/loading/loading_48.gif', - 'disk' => '/rsrc/image/loading/loading_48.gif', - 'type' => 'gif', - ), - '/rsrc/image/loading/loading_d48.gif' => - array( - 'hash' => 'c5181f5e0ac8125ad9beda73fdf18e91', - 'uri' => '/res/c5181f5e/rsrc/image/loading/loading_d48.gif', - 'disk' => '/rsrc/image/loading/loading_d48.gif', - 'type' => 'gif', - ), - '/rsrc/image/loading/loading_w24.gif' => - array( - 'hash' => '231857d68736e9bdda6bdbaaf924b8da', - 'uri' => '/res/231857d6/rsrc/image/loading/loading_w24.gif', - 'disk' => '/rsrc/image/loading/loading_w24.gif', - 'type' => 'gif', - ), - '/rsrc/image/main_texture.png' => - array( - 'hash' => 'e34d8143384721be73ec9b7532a977ab', - 'uri' => '/res/e34d8143/rsrc/image/main_texture.png', - 'disk' => '/rsrc/image/main_texture.png', - 'type' => 'png', - ), - '/rsrc/image/menu_texture.png' => - array( - 'hash' => 'ad020b1529b3a3b3480ca9de1d5f1e40', - 'uri' => '/res/ad020b15/rsrc/image/menu_texture.png', - 'disk' => '/rsrc/image/menu_texture.png', - 'type' => 'png', - ), - '/rsrc/image/people/harding.png' => - array( - 'hash' => '818b035ace2c480aa8df7b7f11cef58b', - 'uri' => '/res/818b035a/rsrc/image/people/harding.png', - 'disk' => '/rsrc/image/people/harding.png', - 'type' => 'png', - ), - '/rsrc/image/people/jefferson.png' => - array( - 'hash' => '55fe807ff02f9320e595fb59442e2038', - 'uri' => '/res/55fe807f/rsrc/image/people/jefferson.png', - 'disk' => '/rsrc/image/people/jefferson.png', - 'type' => 'png', - ), - '/rsrc/image/people/lincoln.png' => - array( - 'hash' => '2363337947ab52fd5fda79e4a004e930', - 'uri' => '/res/23633379/rsrc/image/people/lincoln.png', - 'disk' => '/rsrc/image/people/lincoln.png', - 'type' => 'png', - ), - '/rsrc/image/people/mckinley.png' => - array( - 'hash' => '0b7b05dd47c49a0874670e5e8200bba8', - 'uri' => '/res/0b7b05dd/rsrc/image/people/mckinley.png', - 'disk' => '/rsrc/image/people/mckinley.png', - 'type' => 'png', - ), - '/rsrc/image/people/taft.png' => - array( - 'hash' => 'f3e47d45b59b0b009fd536dabae9a151', - 'uri' => '/res/f3e47d45/rsrc/image/people/taft.png', - 'disk' => '/rsrc/image/people/taft.png', - 'type' => 'png', - ), - '/rsrc/image/people/washington.png' => - array( - 'hash' => '01412761cab769f7993d69eba986d949', - 'uri' => '/res/01412761/rsrc/image/people/washington.png', - 'disk' => '/rsrc/image/people/washington.png', - 'type' => 'png', - ), - '/rsrc/image/phrequent_active.png' => - array( - 'hash' => '716cddc08630eaa33934b2008723cac0', - 'uri' => '/res/716cddc0/rsrc/image/phrequent_active.png', - 'disk' => '/rsrc/image/phrequent_active.png', - 'type' => 'png', - ), - '/rsrc/image/phrequent_inactive.png' => - array( - 'hash' => 'f9099683873c01c5de1dc6650bd668fe', - 'uri' => '/res/f9099683/rsrc/image/phrequent_inactive.png', - 'disk' => '/rsrc/image/phrequent_inactive.png', - 'type' => 'png', - ), - '/rsrc/image/search.png' => - array( - 'hash' => 'ff7da044e6f923b8f569dec11f97e5e5', - 'uri' => '/res/ff7da044/rsrc/image/search.png', - 'disk' => '/rsrc/image/search.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-actions-X2.png' => - array( - 'hash' => '06962a5e8bea98ba7418d1d6cabcd7dc', - 'uri' => '/res/06962a5e/rsrc/image/sprite-actions-X2.png', - 'disk' => '/rsrc/image/sprite-actions-X2.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-actions.png' => - array( - 'hash' => 'd5dda5fab1e61b00538c9a4fa1ee94c8', - 'uri' => '/res/d5dda5fa/rsrc/image/sprite-actions.png', - 'disk' => '/rsrc/image/sprite-actions.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-apps-X2.png' => - array( - 'hash' => 'd12f41da14b7f0b5a364a59a65fc67cd', - 'uri' => '/res/d12f41da/rsrc/image/sprite-apps-X2.png', - 'disk' => '/rsrc/image/sprite-apps-X2.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-apps-large-X2.png' => - array( - 'hash' => '0ad432a9b02c2a9228389e71c3f2b590', - 'uri' => '/res/0ad432a9/rsrc/image/sprite-apps-large-X2.png', - 'disk' => '/rsrc/image/sprite-apps-large-X2.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-apps-large.png' => - array( - 'hash' => 'a3addc473c11d6597a922a4c7d943357', - 'uri' => '/res/a3addc47/rsrc/image/sprite-apps-large.png', - 'disk' => '/rsrc/image/sprite-apps-large.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-apps-xlarge.png' => - array( - 'hash' => '992d2c278b6a22c0fa874d457a252fbd', - 'uri' => '/res/992d2c27/rsrc/image/sprite-apps-xlarge.png', - 'disk' => '/rsrc/image/sprite-apps-xlarge.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-apps.png' => - array( - 'hash' => 'c801a581ebbb0db851cd6623d7b8f175', - 'uri' => '/res/c801a581/rsrc/image/sprite-apps.png', - 'disk' => '/rsrc/image/sprite-apps.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-conpherence-X2.png' => - array( - 'hash' => '5e47868b00933a9afb6c844e464e6b23', - 'uri' => '/res/5e47868b/rsrc/image/sprite-conpherence-X2.png', - 'disk' => '/rsrc/image/sprite-conpherence-X2.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-conpherence.png' => - array( - 'hash' => 'ca51f1be25213262d68e626e4cab7f0f', - 'uri' => '/res/ca51f1be/rsrc/image/sprite-conpherence.png', - 'disk' => '/rsrc/image/sprite-conpherence.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-docs-X2.png' => - array( - 'hash' => '57d3286ce88133f3ec9240e35f6bb897', - 'uri' => '/res/57d3286c/rsrc/image/sprite-docs-X2.png', - 'disk' => '/rsrc/image/sprite-docs-X2.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-docs.png' => - array( - 'hash' => 'b2b089072d6eddd831402a77c02b5736', - 'uri' => '/res/b2b08907/rsrc/image/sprite-docs.png', - 'disk' => '/rsrc/image/sprite-docs.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-gradient.png' => - array( - 'hash' => 'a49d2e493dba4bea85bb202af528106a', - 'uri' => '/res/a49d2e49/rsrc/image/sprite-gradient.png', - 'disk' => '/rsrc/image/sprite-gradient.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-icons-X2.png' => - array( - 'hash' => '2448b7e60f80e12eee6b11e5c540f7ef', - 'uri' => '/res/2448b7e6/rsrc/image/sprite-icons-X2.png', - 'disk' => '/rsrc/image/sprite-icons-X2.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-icons.png' => - array( - 'hash' => '7caf2f6bd649d3ef86b33a25e061bf1a', - 'uri' => '/res/7caf2f6b/rsrc/image/sprite-icons.png', - 'disk' => '/rsrc/image/sprite-icons.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-login-X2.png' => - array( - 'hash' => 'cd7eb19a0428c6be90c48cd2329a35fc', - 'uri' => '/res/cd7eb19a/rsrc/image/sprite-login-X2.png', - 'disk' => '/rsrc/image/sprite-login-X2.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-login.png' => - array( - 'hash' => '788be2fd8e1f80b9faec9f5cf4bd5f4b', - 'uri' => '/res/788be2fd/rsrc/image/sprite-login.png', - 'disk' => '/rsrc/image/sprite-login.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-menu-X2.png' => - array( - 'hash' => '63b649a6ccba7bf76bc9456dc5dfb12b', - 'uri' => '/res/63b649a6/rsrc/image/sprite-menu-X2.png', - 'disk' => '/rsrc/image/sprite-menu-X2.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-menu.png' => - array( - 'hash' => 'e0e16618691d2cffe64e9c57843828ff', - 'uri' => '/res/e0e16618/rsrc/image/sprite-menu.png', - 'disk' => '/rsrc/image/sprite-menu.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-minicons-X2.png' => - array( - 'hash' => 'c420c6462f7e50ca9941ccc5dd9e3dec', - 'uri' => '/res/c420c646/rsrc/image/sprite-minicons-X2.png', - 'disk' => '/rsrc/image/sprite-minicons-X2.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-minicons.png' => - array( - 'hash' => '168bb875933624b3080a1cc134e5b4ed', - 'uri' => '/res/168bb875/rsrc/image/sprite-minicons.png', - 'disk' => '/rsrc/image/sprite-minicons.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-payments.png' => - array( - 'hash' => '5ce73fb580609e7cda16832e3577b147', - 'uri' => '/res/5ce73fb5/rsrc/image/sprite-payments.png', - 'disk' => '/rsrc/image/sprite-payments.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-status-X2.png' => - array( - 'hash' => '6b9a56e989052bfb7139d637918cd227', - 'uri' => '/res/6b9a56e9/rsrc/image/sprite-status-X2.png', - 'disk' => '/rsrc/image/sprite-status-X2.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-status.png' => - array( - 'hash' => 'b0a100328351732903d86185b001f057', - 'uri' => '/res/b0a10032/rsrc/image/sprite-status.png', - 'disk' => '/rsrc/image/sprite-status.png', - 'type' => 'png', - ), - '/rsrc/image/sprite-tokens.png' => - array( - 'hash' => '67c46fd75c885b76ecbfe46e71a476cc', - 'uri' => '/res/67c46fd7/rsrc/image/sprite-tokens.png', - 'disk' => '/rsrc/image/sprite-tokens.png', - 'type' => 'png', - ), - '/rsrc/image/texture/card-gradient.png' => - array( - 'hash' => '268b7fdd758d4bf99db8de6770aae8af', - 'uri' => '/res/268b7fdd/rsrc/image/texture/card-gradient.png', - 'disk' => '/rsrc/image/texture/card-gradient.png', - 'type' => 'png', - ), - '/rsrc/image/texture/dark-menu-hover.png' => - array( - 'hash' => 'a214a732644be34872e895b338b5d639', - 'uri' => '/res/a214a732/rsrc/image/texture/dark-menu-hover.png', - 'disk' => '/rsrc/image/texture/dark-menu-hover.png', - 'type' => 'png', - ), - '/rsrc/image/texture/dark-menu.png' => - array( - 'hash' => '41ee673a762cec48a154b456ad5ac204', - 'uri' => '/res/41ee673a/rsrc/image/texture/dark-menu.png', - 'disk' => '/rsrc/image/texture/dark-menu.png', - 'type' => 'png', - ), - '/rsrc/image/texture/grip.png' => - array( - 'hash' => 'f11bc231d241f1335cfca2933ad234e0', - 'uri' => '/res/f11bc231/rsrc/image/texture/grip.png', - 'disk' => '/rsrc/image/texture/grip.png', - 'type' => 'png', - ), - '/rsrc/image/texture/panel-header-gradient.png' => - array( - 'hash' => 'ad9204dd3ef5b12b645d80677d8ccead', - 'uri' => '/res/ad9204dd/rsrc/image/texture/panel-header-gradient.png', - 'disk' => '/rsrc/image/texture/panel-header-gradient.png', - 'type' => 'png', - ), - '/rsrc/image/texture/phlnx-bg.png' => - array( - 'hash' => 'a55a694da8b3874ca7a3105b7818f3a0', - 'uri' => '/res/a55a694d/rsrc/image/texture/phlnx-bg.png', - 'disk' => '/rsrc/image/texture/phlnx-bg.png', - 'type' => 'png', - ), - '/rsrc/image/texture/pholio-background.gif' => - array( - 'hash' => 'cf4561af116edf393dc583e5119fb412', - 'uri' => '/res/cf4561af/rsrc/image/texture/pholio-background.gif', - 'disk' => '/rsrc/image/texture/pholio-background.gif', - 'type' => 'gif', - ), - '/rsrc/image/texture/table_header.png' => - array( - 'hash' => '4ed3f56a30d3749e8f62052b9735a316', - 'uri' => '/res/4ed3f56a/rsrc/image/texture/table_header.png', - 'disk' => '/rsrc/image/texture/table_header.png', - 'type' => 'png', - ), - '/rsrc/image/texture/table_header_hover.png' => - array( - 'hash' => 'ea1f71a604e9b4859de1e25751540437', - 'uri' => '/res/ea1f71a6/rsrc/image/texture/table_header_hover.png', - 'disk' => '/rsrc/image/texture/table_header_hover.png', - 'type' => 'png', - ), - '/rsrc/image/texture/table_header_tall.png' => - array( - 'hash' => 'b05525601f78d759f1c5e47fd9c1a8aa', - 'uri' => '/res/b0552560/rsrc/image/texture/table_header_tall.png', - 'disk' => '/rsrc/image/texture/table_header_tall.png', - 'type' => 'png', - ), - '/rsrc/swf/aphlict.swf' => - array( - 'hash' => '4b9a9d83bebaf254f3790e87b45c1f92', - 'uri' => '/res/4b9a9d83/rsrc/swf/aphlict.swf', - 'disk' => '/rsrc/swf/aphlict.swf', - 'type' => 'swf', - ), - 'aphront-bars' => - array( - 'uri' => '/res/95a907d6/rsrc/css/aphront/aphront-bars.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/aphront-bars.css', - ), - 'aphront-calendar-view-css' => - array( - 'uri' => '/res/ae6f5b54/rsrc/css/aphront/calendar-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/calendar-view.css', - ), - 'aphront-contextbar-view-css' => - array( - 'uri' => '/res/ecfd5ba9/rsrc/css/aphront/context-bar.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/context-bar.css', - ), - 'aphront-dark-console-css' => - array( - 'uri' => '/res/0d316573/rsrc/css/aphront/dark-console.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/dark-console.css', - ), - 'aphront-dialog-view-css' => - array( - 'uri' => '/res/29a054fd/rsrc/css/aphront/dialog-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/dialog-view.css', - ), - 'aphront-error-view-css' => - array( - 'uri' => '/res/e2bb50c4/rsrc/css/aphront/error-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/error-view.css', - ), - 'aphront-form-view-css' => - array( - 'uri' => '/res/7793ddd1/rsrc/css/aphront/form-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/form-view.css', - ), - 'aphront-list-filter-view-css' => - array( - 'uri' => '/res/a90a0c94/rsrc/css/aphront/list-filter-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/list-filter-view.css', - ), - 'aphront-multi-column-view-css' => - array( - 'uri' => '/res/f7f25fb7/rsrc/css/aphront/multi-column.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/multi-column.css', - ), - 'aphront-notes' => - array( - 'uri' => '/res/5b8ebfa0/rsrc/css/aphront/aphront-notes.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/aphront-notes.css', - ), - 'aphront-pager-view-css' => - array( - 'uri' => '/res/43fb79f0/rsrc/css/aphront/pager-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/pager-view.css', - ), - 'aphront-panel-view-css' => - array( - 'uri' => '/res/f55024c3/rsrc/css/aphront/panel-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/panel-view.css', - ), - 'aphront-request-failure-view-css' => - array( - 'uri' => '/res/c9a43002/rsrc/css/aphront/request-failure-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/request-failure-view.css', - ), - 'aphront-table-view-css' => - array( - 'uri' => '/res/be5ca6be/rsrc/css/aphront/table-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/table-view.css', - ), - 'aphront-tokenizer-control-css' => - array( - 'uri' => '/res/793c5f36/rsrc/css/aphront/tokenizer.css', - 'type' => 'css', - 'requires' => - array( - 0 => 'aphront-typeahead-control-css', - ), - 'disk' => '/rsrc/css/aphront/tokenizer.css', - ), - 'aphront-tooltip-css' => - array( - 'uri' => '/res/3a7d8e07/rsrc/css/aphront/tooltip.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/tooltip.css', - ), - 'aphront-two-column-view-css' => - array( - 'uri' => '/res/4263aa98/rsrc/css/aphront/two-column.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/two-column.css', - ), - 'aphront-typeahead-control-css' => - array( - 'uri' => '/res/e4a4cd4b/rsrc/css/aphront/typeahead.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/typeahead.css', - ), - 'auth-css' => - array( - 'uri' => '/res/751cacaa/rsrc/css/application/auth/auth.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/auth/auth.css', - ), - 'config-options-css' => - array( - 'uri' => '/res/be77d5a6/rsrc/css/application/config/config-options.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/config/config-options.css', - ), - 'conpherence-menu-css' => - array( - 'uri' => '/res/d250b49c/rsrc/css/application/conpherence/menu.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/conpherence/menu.css', - ), - 'conpherence-message-pane-css' => - array( - 'uri' => '/res/80cde760/rsrc/css/application/conpherence/message-pane.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/conpherence/message-pane.css', - ), - 'conpherence-notification-css' => - array( - 'uri' => '/res/232c8cdb/rsrc/css/application/conpherence/notification.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/conpherence/notification.css', - ), - 'conpherence-update-css' => - array( - 'uri' => '/res/92094ed7/rsrc/css/application/conpherence/update.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/conpherence/update.css', - ), - 'conpherence-widget-pane-css' => - array( - 'uri' => '/res/ee9d5004/rsrc/css/application/conpherence/widget-pane.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/conpherence/widget-pane.css', - ), - 'differential-changeset-view-css' => - array( - 'uri' => '/res/8ee213f4/rsrc/css/application/differential/changeset-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/differential/changeset-view.css', - ), - 'differential-core-view-css' => - array( - 'uri' => '/res/85fe5117/rsrc/css/application/differential/core.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/differential/core.css', - ), - 'differential-inline-comment-editor' => - array( - 'uri' => '/res/37e0564f/rsrc/js/application/differential/DifferentialInlineCommentEditor.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-dom', - 1 => 'javelin-util', - 2 => 'javelin-stratcom', - 3 => 'javelin-install', - 4 => 'javelin-request', - 5 => 'javelin-workflow', - ), - 'disk' => '/rsrc/js/application/differential/DifferentialInlineCommentEditor.js', - ), - 'differential-local-commits-view-css' => - array( - 'uri' => '/res/224f3703/rsrc/css/application/differential/local-commits-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/differential/local-commits-view.css', - ), - 'differential-results-table-css' => - array( - 'uri' => '/res/aab3123c/rsrc/css/application/differential/results-table.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/differential/results-table.css', - ), - 'differential-revision-add-comment-css' => - array( - 'uri' => '/res/849748d3/rsrc/css/application/differential/add-comment.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/differential/add-comment.css', - ), - 'differential-revision-comment-css' => - array( - 'uri' => '/res/42c222f4/rsrc/css/application/differential/revision-comment.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/differential/revision-comment.css', - ), - 'differential-revision-comment-list-css' => - array( - 'uri' => '/res/3b31faa3/rsrc/css/application/differential/revision-comment-list.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/differential/revision-comment-list.css', - ), - 'differential-revision-history-css' => - array( - 'uri' => '/res/d41bc64c/rsrc/css/application/differential/revision-history.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/differential/revision-history.css', - ), - 'differential-revision-list-css' => - array( - 'uri' => '/res/fe6c4721/rsrc/css/application/differential/revision-list.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/differential/revision-list.css', - ), - 'differential-table-of-contents-css' => - array( - 'uri' => '/res/4fde8bfc/rsrc/css/application/differential/table-of-contents.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/differential/table-of-contents.css', - ), - 'diffusion-commit-view-css' => - array( - 'uri' => '/res/b445944e/rsrc/css/application/diffusion/commit-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/diffusion/commit-view.css', - ), - 'diffusion-icons-css' => - array( - 'uri' => '/res/b93e32c9/rsrc/css/application/diffusion/diffusion-icons.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/diffusion/diffusion-icons.css', - ), - 'diffusion-source-css' => - array( - 'uri' => '/res/162c8794/rsrc/css/application/diffusion/diffusion-source.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/diffusion/diffusion-source.css', - ), - 'global-drag-and-drop-css' => - array( - 'uri' => '/res/4e24cb65/rsrc/css/application/files/global-drag-and-drop.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/files/global-drag-and-drop.css', - ), - 'herald-css' => - array( - 'uri' => '/res/2150a55d/rsrc/css/application/herald/herald.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/herald/herald.css', - ), - 'herald-rule-editor' => - array( - 'uri' => '/res/f8ee0e9c/rsrc/js/application/herald/HeraldRuleEditor.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'multirow-row-manager', - 1 => 'javelin-install', - 2 => 'javelin-typeahead', - 3 => 'javelin-util', - 4 => 'javelin-dom', - 5 => 'javelin-tokenizer', - 6 => 'javelin-typeahead-preloaded-source', - 7 => 'javelin-stratcom', - 8 => 'javelin-json', - 9 => 'phabricator-prefab', - ), - 'disk' => '/rsrc/js/application/herald/HeraldRuleEditor.js', - ), - 'herald-test-css' => - array( - 'uri' => '/res/c0cd6bdb/rsrc/css/application/herald/herald-test.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/herald/herald-test.css', - ), - 'inline-comment-summary-css' => - array( - 'uri' => '/res/338704f7/rsrc/css/application/diff/inline-comment-summary.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/diff/inline-comment-summary.css', - ), - 'javelin-aphlict' => - array( - 'uri' => '/res/c0b9e53f/rsrc/js/application/aphlict/Aphlict.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - ), - 'disk' => '/rsrc/js/application/aphlict/Aphlict.js', - ), - 'javelin-behavior' => - array( - 'uri' => '/res/15482715/rsrc/externals/javelin/lib/behavior.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-magical-init', - 1 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/lib/behavior.js', - ), - 'javelin-behavior-aphlict-dropdown' => - array( - 'uri' => '/res/c8def75f/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-request', - 2 => 'javelin-stratcom', - 3 => 'javelin-vector', - 4 => 'javelin-dom', - 5 => 'javelin-uri', - ), - 'disk' => '/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js', - ), - 'javelin-behavior-aphlict-listen' => - array( - 'uri' => '/res/7487f207/rsrc/js/application/aphlict/behavior-aphlict-listen.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-aphlict', - 2 => 'javelin-stratcom', - 3 => 'javelin-request', - 4 => 'javelin-uri', - 5 => 'javelin-dom', - 6 => 'javelin-json', - 7 => 'phabricator-notification', - ), - 'disk' => '/rsrc/js/application/aphlict/behavior-aphlict-listen.js', - ), - 'javelin-behavior-aphront-basic-tokenizer' => - array( - 'uri' => '/res/c7fd9a7b/rsrc/js/core/behavior-tokenizer.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'phabricator-prefab', - ), - 'disk' => '/rsrc/js/core/behavior-tokenizer.js', - ), - 'javelin-behavior-aphront-crop' => - array( - 'uri' => '/res/8c800f36/rsrc/js/core/behavior-crop.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-vector', - 3 => 'javelin-magical-init', - ), - 'disk' => '/rsrc/js/core/behavior-crop.js', - ), - 'javelin-behavior-aphront-drag-and-drop-textarea' => - array( - 'uri' => '/res/a261f6e6/rsrc/js/core/behavior-drag-and-drop-textarea.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'phabricator-drag-and-drop-file-upload', - 3 => 'phabricator-textareautils', - ), - 'disk' => '/rsrc/js/core/behavior-drag-and-drop-textarea.js', - ), - 'javelin-behavior-aphront-form-disable-on-submit' => - array( - 'uri' => '/res/a4a4ff07/rsrc/js/core/behavior-form.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/core/behavior-form.js', - ), - 'javelin-behavior-aphront-more' => - array( - 'uri' => '/res/fae13324/rsrc/js/core/behavior-more.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/core/behavior-more.js', - ), - 'javelin-behavior-audit-preview' => - array( - 'uri' => '/res/d8f31e46/rsrc/js/application/diffusion/behavior-audit-preview.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'phabricator-shaped-request', - ), - 'disk' => '/rsrc/js/application/diffusion/behavior-audit-preview.js', - ), - 'javelin-behavior-balanced-payment-form' => - array( - 'uri' => '/res/6876492d/rsrc/js/application/phortune/behavior-balanced-payment-form.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'phortune-credit-card-form', - ), - 'disk' => '/rsrc/js/application/phortune/behavior-balanced-payment-form.js', - ), - 'javelin-behavior-config-reorder-fields' => - array( - 'uri' => '/res/691c5c8c/rsrc/js/application/config/behavior-reorder-fields.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-json', - 4 => 'phabricator-draggable-list', - ), - 'disk' => '/rsrc/js/application/config/behavior-reorder-fields.js', - ), - 'javelin-behavior-conpherence-menu' => - array( - 'uri' => '/res/f27205d4/rsrc/js/application/conpherence/behavior-menu.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-stratcom', - 4 => 'javelin-workflow', - 5 => 'javelin-behavior-device', - 6 => 'javelin-history', - 7 => 'javelin-vector', - ), - 'disk' => '/rsrc/js/application/conpherence/behavior-menu.js', - ), - 'javelin-behavior-conpherence-pontificate' => - array( - 'uri' => '/res/19cb581b/rsrc/js/application/conpherence/behavior-pontificate.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-workflow', - 4 => 'javelin-stratcom', - ), - 'disk' => '/rsrc/js/application/conpherence/behavior-pontificate.js', - ), - 'javelin-behavior-conpherence-widget-pane' => - array( - 'uri' => '/res/562ca20e/rsrc/js/application/conpherence/behavior-widget-pane.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-workflow', - 4 => 'javelin-util', - 5 => 'phabricator-notification', - 6 => 'javelin-behavior-device', - 7 => 'phabricator-dropdown-menu', - 8 => 'phabricator-menu-item', - ), - 'disk' => '/rsrc/js/application/conpherence/behavior-widget-pane.js', - ), - 'javelin-behavior-countdown-timer' => - array( - 'uri' => '/res/13d40efa/rsrc/js/application/countdown/timer.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/application/countdown/timer.js', - ), - 'javelin-behavior-dark-console' => - array( - 'uri' => '/res/1e2c7a5e/rsrc/js/core/behavior-dark-console.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-util', - 3 => 'javelin-dom', - 4 => 'javelin-request', - 5 => 'phabricator-keyboard-shortcut', - ), - 'disk' => '/rsrc/js/core/behavior-dark-console.js', - ), - 'javelin-behavior-device' => - array( - 'uri' => '/res/12e43f5a/rsrc/js/core/behavior-device.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-vector', - 4 => 'javelin-install', - ), - 'disk' => '/rsrc/js/core/behavior-device.js', - ), - 'javelin-behavior-differential-accept-with-errors' => - array( - 'uri' => '/res/8fea67b3/rsrc/js/application/differential/behavior-accept-with-errors.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/application/differential/behavior-accept-with-errors.js', - ), - 'javelin-behavior-differential-add-reviewers-and-ccs' => - array( - 'uri' => '/res/fd9f2c1c/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'phabricator-prefab', - ), - 'disk' => '/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js', - ), - 'javelin-behavior-differential-comment-jump' => - array( - 'uri' => '/res/8ffb4222/rsrc/js/application/differential/behavior-comment-jump.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/application/differential/behavior-comment-jump.js', - ), - 'javelin-behavior-differential-diff-radios' => - array( - 'uri' => '/res/004cb66f/rsrc/js/application/differential/behavior-diff-radios.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/application/differential/behavior-diff-radios.js', - ), - 'javelin-behavior-differential-dropdown-menus' => - array( - 'uri' => '/res/722c679c/rsrc/js/application/differential/behavior-dropdown-menus.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-stratcom', - 4 => 'phabricator-dropdown-menu', - 5 => 'phabricator-menu-item', - 6 => 'phabricator-phtize', - ), - 'disk' => '/rsrc/js/application/differential/behavior-dropdown-menus.js', - ), - 'javelin-behavior-differential-edit-inline-comments' => - array( - 'uri' => '/res/86f459a4/rsrc/js/application/differential/behavior-edit-inline-comments.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-util', - 4 => 'javelin-vector', - 5 => 'differential-inline-comment-editor', - ), - 'disk' => '/rsrc/js/application/differential/behavior-edit-inline-comments.js', - ), - 'javelin-behavior-differential-feedback-preview' => - array( - 'uri' => '/res/4421fac6/rsrc/js/application/differential/behavior-comment-preview.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-request', - 4 => 'javelin-util', - 5 => 'phabricator-shaped-request', - ), - 'disk' => '/rsrc/js/application/differential/behavior-comment-preview.js', - ), - 'javelin-behavior-differential-keyboard-navigation' => - array( - 'uri' => '/res/22ed93ba/rsrc/js/application/differential/behavior-keyboard-nav.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'phabricator-keyboard-shortcut', - ), - 'disk' => '/rsrc/js/application/differential/behavior-keyboard-nav.js', - ), - 'javelin-behavior-differential-populate' => - array( - 'uri' => '/res/bb9a29f4/rsrc/js/application/differential/behavior-populate.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-workflow', - 2 => 'javelin-util', - 3 => 'javelin-dom', - 4 => 'javelin-stratcom', - 5 => 'javelin-behavior-device', - 6 => 'javelin-vector', - 7 => 'phabricator-tooltip', - ), - 'disk' => '/rsrc/js/application/differential/behavior-populate.js', - ), - 'javelin-behavior-differential-show-all-comments' => - array( - 'uri' => '/res/8801848d/rsrc/js/application/differential/behavior-show-all-comments.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/application/differential/behavior-show-all-comments.js', - ), - 'javelin-behavior-differential-show-field-details' => - array( - 'uri' => '/res/8d57f459/rsrc/js/application/differential/behavior-show-field-details.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/application/differential/behavior-show-field-details.js', - ), - 'javelin-behavior-differential-show-more' => - array( - 'uri' => '/res/b9f93090/rsrc/js/application/differential/behavior-show-more.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-workflow', - 3 => 'javelin-util', - 4 => 'javelin-stratcom', - ), - 'disk' => '/rsrc/js/application/differential/behavior-show-more.js', - ), - 'javelin-behavior-differential-toggle-files' => - array( - 'uri' => '/res/ae937207/rsrc/js/application/differential/behavior-toggle-files.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - ), - 'disk' => '/rsrc/js/application/differential/behavior-toggle-files.js', - ), - 'javelin-behavior-differential-user-select' => - array( - 'uri' => '/res/23c51a5d/rsrc/js/application/differential/behavior-user-select.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - ), - 'disk' => '/rsrc/js/application/differential/behavior-user-select.js', - ), - 'javelin-behavior-diffusion-commit-branches' => - array( - 'uri' => '/res/1ede335a/rsrc/js/application/diffusion/behavior-commit-branches.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-request', - ), - 'disk' => '/rsrc/js/application/diffusion/behavior-commit-branches.js', - ), - 'javelin-behavior-diffusion-commit-graph' => - array( - 'uri' => '/res/536b8483/rsrc/js/application/diffusion/behavior-commit-graph.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - ), - 'disk' => '/rsrc/js/application/diffusion/behavior-commit-graph.js', - ), - 'javelin-behavior-diffusion-jump-to' => - array( - 'uri' => '/res/bade44bd/rsrc/js/application/diffusion/behavior-jump-to.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-vector', - 2 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/application/diffusion/behavior-jump-to.js', - ), - 'javelin-behavior-diffusion-pull-lastmodified' => - array( - 'uri' => '/res/29fe2790/rsrc/js/application/diffusion/behavior-pull-lastmodified.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-request', - ), - 'disk' => '/rsrc/js/application/diffusion/behavior-pull-lastmodified.js', - ), - 'javelin-behavior-doorkeeper-tag' => - array( - 'uri' => '/res/59480572/rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-json', - 3 => 'javelin-workflow', - 4 => 'javelin-magical-init', - ), - 'disk' => '/rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js', - ), - 'javelin-behavior-error-log' => - array( - 'uri' => '/res/acefdea7/rsrc/js/core/behavior-error-log.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/core/behavior-error-log.js', - ), - 'javelin-behavior-fancy-datepicker' => - array( - 'uri' => '/res/dcd7c2ca/rsrc/js/core/behavior-fancy-datepicker.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-stratcom', - 4 => 'javelin-vector', - ), - 'disk' => '/rsrc/js/core/behavior-fancy-datepicker.js', - ), - 'javelin-behavior-global-drag-and-drop' => - array( - 'uri' => '/res/ee8e9c39/rsrc/js/core/behavior-global-drag-and-drop.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-uri', - 3 => 'javelin-mask', - 4 => 'phabricator-drag-and-drop-file-upload', - ), - 'disk' => '/rsrc/js/core/behavior-global-drag-and-drop.js', - ), - 'javelin-behavior-herald-rule-editor' => - array( - 'uri' => '/res/77a0c945/rsrc/js/application/herald/herald-rule-editor.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'herald-rule-editor', - 1 => 'javelin-behavior', - ), - 'disk' => '/rsrc/js/application/herald/herald-rule-editor.js', - ), - 'javelin-behavior-history-install' => - array( - 'uri' => '/res/9099a161/rsrc/js/core/behavior-history-install.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-history', - ), - 'disk' => '/rsrc/js/core/behavior-history-install.js', - ), - 'javelin-behavior-konami' => - array( - 'uri' => '/res/b7bb7c24/rsrc/js/core/behavior-konami.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - ), - 'disk' => '/rsrc/js/core/behavior-konami.js', - ), - 'javelin-behavior-lightbox-attachments' => - array( - 'uri' => '/res/72b4d3a8/rsrc/js/core/behavior-lightbox-attachments.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-mask', - 4 => 'javelin-util', - 5 => 'phabricator-busy', - ), - 'disk' => '/rsrc/js/core/behavior-lightbox-attachments.js', - ), - 'javelin-behavior-line-chart' => - array( - 'uri' => '/res/1aa5ac88/rsrc/js/application/maniphest/behavior-line-chart.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-vector', - ), - 'disk' => '/rsrc/js/application/maniphest/behavior-line-chart.js', - ), - 'javelin-behavior-load-blame' => - array( - 'uri' => '/res/138e2961/rsrc/js/application/diffusion/behavior-load-blame.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-request', - ), - 'disk' => '/rsrc/js/application/diffusion/behavior-load-blame.js', - ), - 'javelin-behavior-maniphest-batch-editor' => - array( - 'uri' => '/res/81b2b86f/rsrc/js/application/maniphest/behavior-batch-editor.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'phabricator-prefab', - 4 => 'multirow-row-manager', - 5 => 'javelin-json', - ), - 'disk' => '/rsrc/js/application/maniphest/behavior-batch-editor.js', - ), - 'javelin-behavior-maniphest-batch-selector' => - array( - 'uri' => '/res/c33cb5e3/rsrc/js/application/maniphest/behavior-batch-selector.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-util', - ), - 'disk' => '/rsrc/js/application/maniphest/behavior-batch-selector.js', - ), - 'javelin-behavior-maniphest-list-editor' => - array( - 'uri' => '/res/a251e72f/rsrc/js/application/maniphest/behavior-list-edit.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-workflow', - 4 => 'javelin-fx', - 5 => 'javelin-util', - ), - 'disk' => '/rsrc/js/application/maniphest/behavior-list-edit.js', - ), - 'javelin-behavior-maniphest-subpriority-editor' => - array( - 'uri' => '/res/99d84c61/rsrc/js/application/maniphest/behavior-subpriorityeditor.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-workflow', - 4 => 'phabricator-draggable-list', - ), - 'disk' => '/rsrc/js/application/maniphest/behavior-subpriorityeditor.js', - ), - 'javelin-behavior-maniphest-transaction-controls' => - array( - 'uri' => '/res/e8498688/rsrc/js/application/maniphest/behavior-transaction-controls.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'phabricator-prefab', - ), - 'disk' => '/rsrc/js/application/maniphest/behavior-transaction-controls.js', - ), - 'javelin-behavior-maniphest-transaction-expand' => - array( - 'uri' => '/res/966410de/rsrc/js/application/maniphest/behavior-transaction-expand.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-workflow', - 3 => 'javelin-stratcom', - ), - 'disk' => '/rsrc/js/application/maniphest/behavior-transaction-expand.js', - ), - 'javelin-behavior-maniphest-transaction-preview' => - array( - 'uri' => '/res/9447a3f9/rsrc/js/application/maniphest/behavior-transaction-preview.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-json', - 4 => 'javelin-stratcom', - 5 => 'phabricator-shaped-request', - ), - 'disk' => '/rsrc/js/application/maniphest/behavior-transaction-preview.js', - ), - 'javelin-behavior-owners-path-editor' => - array( - 'uri' => '/res/9cf78ffc/rsrc/js/application/owners/owners-path-editor.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'owners-path-editor', - 1 => 'javelin-behavior', - ), - 'disk' => '/rsrc/js/application/owners/owners-path-editor.js', - ), - 'javelin-behavior-phabricator-active-nav' => - array( - 'uri' => '/res/9c8d3df8/rsrc/js/core/behavior-active-nav.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-vector', - 3 => 'javelin-dom', - 4 => 'javelin-uri', - ), - 'disk' => '/rsrc/js/core/behavior-active-nav.js', - ), - 'javelin-behavior-phabricator-autofocus' => - array( - 'uri' => '/res/bf92b8d6/rsrc/js/core/behavior-autofocus.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/core/behavior-autofocus.js', - ), - 'javelin-behavior-phabricator-busy-example' => - array( - 'uri' => '/res/dbe12f2f/rsrc/js/application/uiexample/busy-example.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'phabricator-busy', - 1 => 'javelin-behavior', - ), - 'disk' => '/rsrc/js/application/uiexample/busy-example.js', - ), - 'javelin-behavior-phabricator-file-tree' => - array( - 'uri' => '/res/e5bf93df/rsrc/js/core/behavior-file-tree.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'phabricator-keyboard-shortcut', - 2 => 'javelin-stratcom', - ), - 'disk' => '/rsrc/js/core/behavior-file-tree.js', - ), - 'javelin-behavior-phabricator-gesture' => - array( - 'uri' => '/res/16e1e77c/rsrc/js/core/behavior-gesture.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-behavior-device', - 2 => 'javelin-stratcom', - 3 => 'javelin-vector', - 4 => 'javelin-dom', - 5 => 'javelin-magical-init', - ), - 'disk' => '/rsrc/js/core/behavior-gesture.js', - ), - 'javelin-behavior-phabricator-gesture-example' => - array( - 'uri' => '/res/91d1e7f2/rsrc/js/application/uiexample/gesture-example.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-stratcom', - 1 => 'javelin-behavior', - 2 => 'javelin-vector', - 3 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/application/uiexample/gesture-example.js', - ), - 'javelin-behavior-phabricator-hovercards' => - array( - 'uri' => '/res/4fe6b436/rsrc/js/core/behavior-hovercard.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-behavior-device', - 2 => 'javelin-stratcom', - 3 => 'javelin-vector', - 4 => 'phabricator-hovercard', - ), - 'disk' => '/rsrc/js/core/behavior-hovercard.js', - ), - 'javelin-behavior-phabricator-keyboard-pager' => - array( - 'uri' => '/res/6a5445b8/rsrc/js/core/behavior-keyboard-pager.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-uri', - 2 => 'phabricator-keyboard-shortcut', - ), - 'disk' => '/rsrc/js/core/behavior-keyboard-pager.js', - ), - 'javelin-behavior-phabricator-keyboard-shortcuts' => - array( - 'uri' => '/res/b971e713/rsrc/js/core/behavior-keyboard-shortcuts.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-workflow', - 2 => 'javelin-json', - 3 => 'javelin-dom', - 4 => 'phabricator-keyboard-shortcut', - ), - 'disk' => '/rsrc/js/core/behavior-keyboard-shortcuts.js', - ), - 'javelin-behavior-phabricator-line-linker' => - array( - 'uri' => '/res/1cefdb6a/rsrc/js/core/behavior-line-linker.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-history', - ), - 'disk' => '/rsrc/js/core/behavior-line-linker.js', - ), - 'javelin-behavior-phabricator-nav' => - array( - 'uri' => '/res/afabcf16/rsrc/js/core/behavior-phabricator-nav.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-behavior-device', - 2 => 'javelin-stratcom', - 3 => 'javelin-dom', - 4 => 'javelin-magical-init', - 5 => 'javelin-vector', - 6 => 'javelin-request', - 7 => 'javelin-util', - ), - 'disk' => '/rsrc/js/core/behavior-phabricator-nav.js', - ), - 'javelin-behavior-phabricator-notification-example' => - array( - 'uri' => '/res/7c50cefd/rsrc/js/application/uiexample/notification-example.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'phabricator-notification', - 1 => 'javelin-stratcom', - 2 => 'javelin-behavior', - ), - 'disk' => '/rsrc/js/application/uiexample/notification-example.js', - ), - 'javelin-behavior-phabricator-object-selector' => - array( - 'uri' => '/res/461f95f7/rsrc/js/core/behavior-object-selector.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-request', - 3 => 'javelin-util', - ), - 'disk' => '/rsrc/js/core/behavior-object-selector.js', - ), - 'javelin-behavior-phabricator-oncopy' => - array( - 'uri' => '/res/cd3a9345/rsrc/js/core/behavior-oncopy.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/core/behavior-oncopy.js', - ), - 'javelin-behavior-phabricator-remarkup-assist' => - array( - 'uri' => '/res/6d254602/rsrc/js/core/behavior-phabricator-remarkup-assist.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'phabricator-textareautils', - 4 => 'javelin-workflow', - 5 => 'phabricator-notification', - 6 => 'javelin-vector', - ), - 'disk' => '/rsrc/js/core/behavior-phabricator-remarkup-assist.js', - ), - 'javelin-behavior-phabricator-reveal-content' => - array( - 'uri' => '/res/fef525ef/rsrc/js/core/behavior-reveal-content.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/core/behavior-reveal-content.js', - ), - 'javelin-behavior-phabricator-search-typeahead' => - array( - 'uri' => '/res/409d9567/rsrc/js/core/behavior-search-typeahead.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-typeahead-ondemand-source', - 2 => 'javelin-typeahead', - 3 => 'javelin-dom', - 4 => 'javelin-uri', - 5 => 'javelin-util', - 6 => 'javelin-stratcom', - ), - 'disk' => '/rsrc/js/core/behavior-search-typeahead.js', - ), - 'javelin-behavior-phabricator-tooltips' => - array( - 'uri' => '/res/a0ac5320/rsrc/js/core/behavior-tooltip.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-behavior-device', - 2 => 'javelin-stratcom', - 3 => 'phabricator-tooltip', - ), - 'disk' => '/rsrc/js/core/behavior-tooltip.js', - ), - 'javelin-behavior-phabricator-transaction-comment-form' => - array( - 'uri' => '/res/3c8d3c10/rsrc/js/application/transactions/behavior-transaction-comment-form.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-fx', - 4 => 'javelin-request', - 5 => 'phabricator-shaped-request', - ), - 'disk' => '/rsrc/js/application/transactions/behavior-transaction-comment-form.js', - ), - 'javelin-behavior-phabricator-transaction-list' => - array( - 'uri' => '/res/8d602093/rsrc/js/application/transactions/behavior-transaction-list.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-workflow', - 3 => 'javelin-dom', - 4 => 'javelin-fx', - ), - 'disk' => '/rsrc/js/application/transactions/behavior-transaction-list.js', - ), - 'javelin-behavior-phabricator-watch-anchor' => - array( - 'uri' => '/res/69a90817/rsrc/js/core/behavior-watch-anchor.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-vector', - ), - 'disk' => '/rsrc/js/core/behavior-watch-anchor.js', - ), - 'javelin-behavior-phame-post-preview' => - array( - 'uri' => '/res/181d1cbe/rsrc/js/application/phame/phame-post-preview.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'phabricator-shaped-request', - ), - 'disk' => '/rsrc/js/application/phame/phame-post-preview.js', - ), - 'javelin-behavior-pholio-mock-edit' => - array( - 'uri' => '/res/d5f4b705/rsrc/js/application/pholio/behavior-pholio-mock-edit.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-workflow', - 4 => 'phabricator-phtize', - 5 => 'phabricator-drag-and-drop-file-upload', - 6 => 'phabricator-draggable-list', - ), - 'disk' => '/rsrc/js/application/pholio/behavior-pholio-mock-edit.js', - ), - 'javelin-behavior-pholio-mock-view' => - array( - 'uri' => '/res/f9588dcf/rsrc/js/application/pholio/behavior-pholio-mock-view.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-util', - 2 => 'javelin-stratcom', - 3 => 'javelin-dom', - 4 => 'javelin-vector', - 5 => 'javelin-magical-init', - 6 => 'javelin-request', - 7 => 'javelin-history', - 8 => 'javelin-workflow', - 9 => 'javelin-mask', - 10 => 'javelin-behavior-device', - 11 => 'phabricator-keyboard-shortcut', - ), - 'disk' => '/rsrc/js/application/pholio/behavior-pholio-mock-view.js', - ), - 'javelin-behavior-ponder-votebox' => - array( - 'uri' => '/res/c28daa12/rsrc/js/application/ponder/behavior-votebox.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-stratcom', - 4 => 'javelin-request', - ), - 'disk' => '/rsrc/js/application/ponder/behavior-votebox.js', - ), - 'javelin-behavior-project-create' => - array( - 'uri' => '/res/e91f3f8f/rsrc/js/application/projects/behavior-project-create.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-workflow', - ), - 'disk' => '/rsrc/js/application/projects/behavior-project-create.js', - ), - 'javelin-behavior-refresh-csrf' => - array( - 'uri' => '/res/6c54100f/rsrc/js/core/behavior-refresh-csrf.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-request', - 1 => 'javelin-behavior', - 2 => 'javelin-dom', - 3 => 'phabricator-busy', - ), - 'disk' => '/rsrc/js/core/behavior-refresh-csrf.js', - ), - 'javelin-behavior-releeph-preview-branch' => - array( - 'uri' => '/res/f694854d/rsrc/js/application/releeph/releeph-preview-branch.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-uri', - 3 => 'javelin-request', - ), - 'disk' => '/rsrc/js/application/releeph/releeph-preview-branch.js', - ), - 'javelin-behavior-releeph-request-state-change' => - array( - 'uri' => '/res/07ecde0c/rsrc/js/application/releeph/releeph-request-state-change.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-request', - 4 => 'phabricator-keyboard-shortcut', - 5 => 'phabricator-notification', - ), - 'disk' => '/rsrc/js/application/releeph/releeph-request-state-change.js', - ), - 'javelin-behavior-releeph-request-typeahead' => - array( - 'uri' => '/res/2c2350a0/rsrc/js/application/releeph/releeph-request-typeahead.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-typeahead', - 3 => 'javelin-typeahead-ondemand-source', - 4 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/application/releeph/releeph-request-typeahead.js', - ), - 'javelin-behavior-remarkup-preview' => - array( - 'uri' => '/res/6ec98508/rsrc/js/core/behavior-remarkup-preview.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'phabricator-shaped-request', - ), - 'disk' => '/rsrc/js/core/behavior-remarkup-preview.js', - ), - 'javelin-behavior-repository-crossreference' => - array( - 'uri' => '/res/d3f9d50b/rsrc/js/application/repository/repository-crossreference.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-uri', - ), - 'disk' => '/rsrc/js/application/repository/repository-crossreference.js', - ), - 'javelin-behavior-search-reorder-queries' => - array( - 'uri' => '/res/9864b481/rsrc/js/application/search/behavior-reorder-queries.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-workflow', - 3 => 'javelin-dom', - 4 => 'phabricator-draggable-list', - ), - 'disk' => '/rsrc/js/application/search/behavior-reorder-queries.js', - ), - 'javelin-behavior-slowvote-embed' => - array( - 'uri' => '/res/8e85e20d/rsrc/js/application/slowvote/behavior-slowvote-embed.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-request', - 2 => 'javelin-stratcom', - 3 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/application/slowvote/behavior-slowvote-embed.js', - ), - 'javelin-behavior-stripe-payment-form' => - array( - 'uri' => '/res/c1a12d77/rsrc/js/application/phortune/behavior-stripe-payment-form.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'phortune-credit-card-form', - ), - 'disk' => '/rsrc/js/application/phortune/behavior-stripe-payment-form.js', - ), - 'javelin-behavior-test-payment-form' => - array( - 'uri' => '/res/a8fe8616/rsrc/js/application/phortune/behavior-test-payment-form.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'phortune-credit-card-form', - ), - 'disk' => '/rsrc/js/application/phortune/behavior-test-payment-form.js', - ), - 'javelin-behavior-toggle-class' => - array( - 'uri' => '/res/79921b7f/rsrc/js/core/behavior-toggle-class.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/core/behavior-toggle-class.js', - ), - 'javelin-behavior-view-placeholder' => - array( - 'uri' => '/res/6abdb85b/rsrc/externals/javelin/ext/view/ViewPlaceholder.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-view-renderer', - 3 => 'javelin-install', - ), - 'disk' => '/rsrc/externals/javelin/ext/view/ViewPlaceholder.js', - ), - 'javelin-behavior-workflow' => - array( - 'uri' => '/res/4a0595c1/rsrc/js/core/behavior-workflow.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-workflow', - 3 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/core/behavior-workflow.js', - ), - 'javelin-color' => - array( - 'uri' => '/res/f17034de/rsrc/externals/javelin/ext/fx/Color.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - ), - 'disk' => '/rsrc/externals/javelin/ext/fx/Color.js', - ), - 'javelin-cookie' => - array( - 'uri' => '/res/ee0d399f/rsrc/externals/javelin/lib/Cookie.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/lib/Cookie.js', - ), - 'javelin-dom' => - array( - 'uri' => '/res/175211d6/rsrc/externals/javelin/lib/DOM.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-magical-init', - 1 => 'javelin-install', - 2 => 'javelin-util', - 3 => 'javelin-vector', - 4 => 'javelin-stratcom', - ), - 'disk' => '/rsrc/externals/javelin/lib/DOM.js', - ), - 'javelin-dynval' => - array( - 'uri' => '/res/ea6f2a9d/rsrc/externals/javelin/ext/reactor/core/DynVal.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-reactornode', - 2 => 'javelin-util', - 3 => 'javelin-reactor', - ), - 'disk' => '/rsrc/externals/javelin/ext/reactor/core/DynVal.js', - ), - 'javelin-event' => - array( - 'uri' => '/res/5f70f4d0/rsrc/externals/javelin/core/Event.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - ), - 'disk' => '/rsrc/externals/javelin/core/Event.js', - ), - 'javelin-fx' => - array( - 'uri' => '/res/23fb3d44/rsrc/externals/javelin/ext/fx/FX.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-color', - 1 => 'javelin-install', - 2 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/ext/fx/FX.js', - ), - 'javelin-history' => - array( - 'uri' => '/res/6c084b09/rsrc/externals/javelin/lib/History.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-stratcom', - 1 => 'javelin-install', - 2 => 'javelin-uri', - 3 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/lib/History.js', - ), - 'javelin-install' => - array( - 'uri' => '/res/904356c0/rsrc/externals/javelin/core/install.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-util', - 1 => 'javelin-magical-init', - ), - 'disk' => '/rsrc/externals/javelin/core/install.js', - ), - 'javelin-json' => - array( - 'uri' => '/res/cf83e72c/rsrc/externals/javelin/lib/JSON.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - ), - 'disk' => '/rsrc/externals/javelin/lib/JSON.js', - ), - 'javelin-magical-init' => - array( - 'uri' => '/res/7c6c8d5a/rsrc/externals/javelin/core/init.js', - 'type' => 'js', - 'requires' => - array( - ), - 'disk' => '/rsrc/externals/javelin/core/init.js', - ), - 'javelin-mask' => - array( - 'uri' => '/res/465cf513/rsrc/externals/javelin/lib/Mask.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - ), - 'disk' => '/rsrc/externals/javelin/lib/Mask.js', - ), - 'javelin-reactor' => - array( - 'uri' => '/res/c05f2658/rsrc/externals/javelin/ext/reactor/core/Reactor.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/ext/reactor/core/Reactor.js', - ), - 'javelin-reactor-dom' => - array( - 'uri' => '/res/5e03117e/rsrc/externals/javelin/ext/reactor/dom/RDOM.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-dom', - 1 => 'javelin-dynval', - 2 => 'javelin-reactor', - 3 => 'javelin-reactornode', - 4 => 'javelin-install', - 5 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/ext/reactor/dom/RDOM.js', - ), - 'javelin-reactor-node-calmer' => - array( - 'uri' => '/res/a93dd6b6/rsrc/externals/javelin/ext/reactor/core/ReactorNodeCalmer.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-reactor', - 2 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/ext/reactor/core/ReactorNodeCalmer.js', - ), - 'javelin-reactornode' => - array( - 'uri' => '/res/4eac475b/rsrc/externals/javelin/ext/reactor/core/ReactorNode.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-reactor', - 2 => 'javelin-util', - 3 => 'javelin-reactor-node-calmer', - ), - 'disk' => '/rsrc/externals/javelin/ext/reactor/core/ReactorNode.js', - ), - 'javelin-request' => - array( - 'uri' => '/res/687bdcfc/rsrc/externals/javelin/lib/Request.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-stratcom', - 2 => 'javelin-util', - 3 => 'javelin-behavior', - 4 => 'javelin-json', - 5 => 'javelin-dom', - 6 => 'javelin-resource', - ), - 'disk' => '/rsrc/externals/javelin/lib/Request.js', - ), - 'javelin-resource' => - array( - 'uri' => '/res/33a3bb57/rsrc/externals/javelin/lib/Resource.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-util', - 1 => 'javelin-uri', - 2 => 'javelin-install', - ), - 'disk' => '/rsrc/externals/javelin/lib/Resource.js', - ), - 'javelin-stratcom' => - array( - 'uri' => '/res/714946e7/rsrc/externals/javelin/core/Stratcom.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-event', - 2 => 'javelin-util', - 3 => 'javelin-magical-init', - ), - 'disk' => '/rsrc/externals/javelin/core/Stratcom.js', - ), - 'javelin-tokenizer' => - array( - 'uri' => '/res/7c117141/rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-dom', - 1 => 'javelin-util', - 2 => 'javelin-stratcom', - 3 => 'javelin-install', - ), - 'disk' => '/rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js', - ), - 'javelin-typeahead' => - array( - 'uri' => '/res/fd79f758/rsrc/externals/javelin/lib/control/typeahead/Typeahead.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-vector', - 3 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/Typeahead.js', - ), - 'javelin-typeahead-composite-source' => - array( - 'uri' => '/res/487b3da2/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-typeahead-source', - 2 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js', - ), - 'javelin-typeahead-normalizer' => - array( - 'uri' => '/res/5a4bd979/rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - ), - 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js', - ), - 'javelin-typeahead-ondemand-source' => - array( - 'uri' => '/res/92286a21/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-request', - 3 => 'javelin-typeahead-source', - ), - 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js', - ), - 'javelin-typeahead-preloaded-source' => - array( - 'uri' => '/res/147900c7/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-request', - 3 => 'javelin-typeahead-source', - ), - 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js', - ), - 'javelin-typeahead-source' => - array( - 'uri' => '/res/13289259/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-typeahead-normalizer', - ), - 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js', - ), - 'javelin-typeahead-static-source' => - array( - 'uri' => '/res/bb0a5173/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-typeahead-source', - ), - 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js', - ), - 'javelin-uri' => - array( - 'uri' => '/res/75aa4597/rsrc/externals/javelin/lib/URI.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-stratcom', - ), - 'disk' => '/rsrc/externals/javelin/lib/URI.js', - ), - 'javelin-util' => - array( - 'uri' => '/res/90222113/rsrc/externals/javelin/core/util.js', - 'type' => 'js', - 'requires' => - array( - ), - 'disk' => '/rsrc/externals/javelin/core/util.js', - ), - 'javelin-vector' => - array( - 'uri' => '/res/58ea3dd7/rsrc/externals/javelin/lib/Vector.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-event', - ), - 'disk' => '/rsrc/externals/javelin/lib/Vector.js', - ), - 'javelin-view' => - array( - 'uri' => '/res/38daaec0/rsrc/externals/javelin/ext/view/View.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/ext/view/View.js', - ), - 'javelin-view-html' => - array( - 'uri' => '/res/0d225e8c/rsrc/externals/javelin/ext/view/HTMLView.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-view-visitor', - 3 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/ext/view/HTMLView.js', - ), - 'javelin-view-interpreter' => - array( - 'uri' => '/res/b0c07f96/rsrc/externals/javelin/ext/view/ViewInterpreter.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-view', - 1 => 'javelin-install', - 2 => 'javelin-dom', - ), - 'disk' => '/rsrc/externals/javelin/ext/view/ViewInterpreter.js', - ), - 'javelin-view-renderer' => - array( - 'uri' => '/res/fe0d2f60/rsrc/externals/javelin/ext/view/ViewRenderer.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/ext/view/ViewRenderer.js', - ), - 'javelin-view-visitor' => - array( - 'uri' => '/res/b1606cec/rsrc/externals/javelin/ext/view/ViewVisitor.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - ), - 'disk' => '/rsrc/externals/javelin/ext/view/ViewVisitor.js', - ), - 'javelin-workflow' => - array( - 'uri' => '/res/7626494b/rsrc/externals/javelin/lib/Workflow.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-stratcom', - 1 => 'javelin-request', - 2 => 'javelin-dom', - 3 => 'javelin-vector', - 4 => 'javelin-install', - 5 => 'javelin-util', - 6 => 'javelin-mask', - 7 => 'javelin-uri', - ), - 'disk' => '/rsrc/externals/javelin/lib/Workflow.js', - ), - 'legalpad-documentbody-css' => - array( - 'uri' => '/res/034c3494/rsrc/css/application/legalpad/legalpad-documentbody.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/legalpad/legalpad-documentbody.css', - ), - 'lightbox-attachment-css' => - array( - 'uri' => '/res/4657e15d/rsrc/css/aphront/lightbox-attachment.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/lightbox-attachment.css', - ), - 'maniphest-batch-editor' => - array( - 'uri' => '/res/fb15d744/rsrc/css/application/maniphest/batch-editor.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/maniphest/batch-editor.css', - ), - 'maniphest-report-css' => - array( - 'uri' => '/res/2e633fcf/rsrc/css/application/maniphest/report.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/maniphest/report.css', - ), - 'maniphest-task-edit-css' => - array( - 'uri' => '/res/c0c64a27/rsrc/css/application/maniphest/task-edit.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/maniphest/task-edit.css', - ), - 'maniphest-task-summary-css' => - array( - 'uri' => '/res/1f2fac54/rsrc/css/application/maniphest/task-summary.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/maniphest/task-summary.css', - ), - 'maniphest-transaction-detail-css' => - array( - 'uri' => '/res/30242771/rsrc/css/application/maniphest/transaction-detail.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/maniphest/transaction-detail.css', - ), - 'multirow-row-manager' => - array( - 'uri' => '/res/408fae4f/rsrc/js/core/MultirowRowManager.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-stratcom', - 2 => 'javelin-dom', - 3 => 'javelin-util', - ), - 'disk' => '/rsrc/js/core/MultirowRowManager.js', - ), - 'owners-path-editor' => - array( - 'uri' => '/res/29b68354/rsrc/js/application/owners/OwnersPathEditor.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'multirow-row-manager', - 1 => 'javelin-install', - 2 => 'path-typeahead', - 3 => 'javelin-dom', - 4 => 'javelin-util', - 5 => 'phabricator-prefab', - ), - 'disk' => '/rsrc/js/application/owners/OwnersPathEditor.js', - ), - 'owners-path-editor-css' => - array( - 'uri' => '/res/1b9b5456/rsrc/css/application/owners/owners-path-editor.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/owners/owners-path-editor.css', - ), - 'paste-css' => - array( - 'uri' => '/res/216fbfe9/rsrc/css/application/paste/paste.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/paste/paste.css', - ), - 'path-typeahead' => - array( - 'uri' => '/res/50246fb6/rsrc/js/application/herald/PathTypeahead.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-typeahead', - 2 => 'javelin-dom', - 3 => 'javelin-request', - 4 => 'javelin-typeahead-ondemand-source', - 5 => 'javelin-util', - ), - 'disk' => '/rsrc/js/application/herald/PathTypeahead.js', - ), - 'people-profile-css' => - array( - 'uri' => '/res/d50d9502/rsrc/css/application/people/people-profile.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/people/people-profile.css', - ), - 'phabricator-action-header-view-css' => - array( - 'uri' => '/res/3b701648/rsrc/css/layout/phabricator-action-header-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-action-header-view.css', - ), - 'phabricator-action-list-view-css' => - array( - 'uri' => '/res/c31a8b76/rsrc/css/layout/phabricator-action-list-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-action-list-view.css', - ), - 'phabricator-application-launch-view-css' => - array( - 'uri' => '/res/21a67228/rsrc/css/application/base/phabricator-application-launch-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/base/phabricator-application-launch-view.css', - ), - 'phabricator-busy' => - array( - 'uri' => '/res/083c11d2/rsrc/js/core/Busy.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-fx', - ), - 'disk' => '/rsrc/js/core/Busy.js', - ), - 'phabricator-chatlog-css' => - array( - 'uri' => '/res/5542e247/rsrc/css/application/chatlog/chatlog.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/chatlog/chatlog.css', - ), - 'phabricator-content-source-view-css' => - array( - 'uri' => '/res/8c738a93/rsrc/css/application/contentsource/content-source-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/contentsource/content-source-view.css', - ), - 'phabricator-core-css' => - array( - 'uri' => '/res/7736096e/rsrc/css/core/core.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/core/core.css', - ), - 'phabricator-countdown-css' => - array( - 'uri' => '/res/c4a30296/rsrc/css/application/countdown/timer.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/countdown/timer.css', - ), - 'phabricator-crumbs-view-css' => - array( - 'uri' => '/res/feeb02f0/rsrc/css/layout/phabricator-crumbs-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-crumbs-view.css', - ), - 'phabricator-drag-and-drop-file-upload' => - array( - 'uri' => '/res/396d3b3b/rsrc/js/core/DragAndDropFileUpload.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-request', - 3 => 'javelin-dom', - 4 => 'javelin-uri', - 5 => 'phabricator-file-upload', - ), - 'disk' => '/rsrc/js/core/DragAndDropFileUpload.js', - ), - 'phabricator-draggable-list' => - array( - 'uri' => '/res/7292a1c4/rsrc/js/core/DraggableList.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-util', - 4 => 'javelin-vector', - 5 => 'javelin-magical-init', - ), - 'disk' => '/rsrc/js/core/DraggableList.js', - ), - 'phabricator-dropdown-menu' => - array( - 'uri' => '/res/a248b7f4/rsrc/js/core/DropdownMenu.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-vector', - 4 => 'javelin-stratcom', - 5 => 'phabricator-menu-item', - ), - 'disk' => '/rsrc/js/core/DropdownMenu.js', - ), - 'phabricator-fatal-config-template-css' => - array( - 'uri' => '/res/6e1a8d22/rsrc/css/application/config/config-template.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/config/config-template.css', - ), - 'phabricator-feed-css' => - array( - 'uri' => '/res/e19633ed/rsrc/css/application/feed/feed.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/feed/feed.css', - ), - 'phabricator-file-upload' => - array( - 'uri' => '/res/c9605008/rsrc/js/core/FileUpload.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'phabricator-notification', - ), - 'disk' => '/rsrc/js/core/FileUpload.js', - ), - 'phabricator-filetree-view-css' => - array( - 'uri' => '/res/c912ed91/rsrc/css/layout/phabricator-filetree-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-filetree-view.css', - ), - 'phabricator-flag-css' => - array( - 'uri' => '/res/237234d7/rsrc/css/application/flag/flag.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/flag/flag.css', - ), - 'phabricator-form-view-css' => - array( - 'uri' => '/res/ba05f8ba/rsrc/css/layout/phabricator-form-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-form-view.css', - ), - 'phabricator-header-view-css' => - array( - 'uri' => '/res/da35cfa0/rsrc/css/layout/phabricator-header-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-header-view.css', - ), - 'phabricator-hovercard' => - array( - 'uri' => '/res/7fb94260/rsrc/js/core/Hovercard.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-vector', - 3 => 'javelin-request', - 4 => 'javelin-uri', - ), - 'disk' => '/rsrc/js/core/Hovercard.js', - ), - 'phabricator-hovercard-view-css' => - array( - 'uri' => '/res/80683f88/rsrc/css/layout/phabricator-hovercard-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-hovercard-view.css', - ), - 'phabricator-jump-nav' => - array( - 'uri' => '/res/15a5598e/rsrc/css/application/directory/phabricator-jump-nav.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/directory/phabricator-jump-nav.css', - ), - 'phabricator-keyboard-shortcut' => - array( - 'uri' => '/res/44747afd/rsrc/js/core/KeyboardShortcut.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'phabricator-keyboard-shortcut-manager', - ), - 'disk' => '/rsrc/js/core/KeyboardShortcut.js', - ), - 'phabricator-keyboard-shortcut-manager' => - array( - 'uri' => '/res/bf9bc02a/rsrc/js/core/KeyboardShortcutManager.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-stratcom', - 3 => 'javelin-dom', - 4 => 'javelin-vector', - ), - 'disk' => '/rsrc/js/core/KeyboardShortcutManager.js', - ), - 'phabricator-main-menu-view' => - array( - 'uri' => '/res/69b4e76a/rsrc/css/application/base/main-menu-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/base/main-menu-view.css', - ), - 'phabricator-menu-item' => - array( - 'uri' => '/res/2add4594/rsrc/js/core/DropdownMenuItem.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - ), - 'disk' => '/rsrc/js/core/DropdownMenuItem.js', - ), - 'phabricator-nav-view-css' => - array( - 'uri' => '/res/37955b6a/rsrc/css/aphront/phabricator-nav-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/phabricator-nav-view.css', - ), - 'phabricator-notification' => - array( - 'uri' => '/res/0764da14/rsrc/js/core/Notification.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-util', - 4 => 'phabricator-notification-css', - ), - 'disk' => '/rsrc/js/core/Notification.js', - ), - 'phabricator-notification-css' => - array( - 'uri' => '/res/bbc495b9/rsrc/css/aphront/notification.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/notification.css', - ), - 'phabricator-notification-menu-css' => - array( - 'uri' => '/res/b14af69e/rsrc/css/application/base/notification-menu.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/base/notification-menu.css', - ), - 'phabricator-object-item-list-view-css' => - array( - 'uri' => '/res/a3e45d8a/rsrc/css/layout/phabricator-object-item-list-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-object-item-list-view.css', - ), - 'phabricator-object-list-view-css' => - array( - 'uri' => '/res/4f183668/rsrc/css/application/projects/phabricator-object-list-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/projects/phabricator-object-list-view.css', - ), - 'phabricator-object-selector-css' => - array( - 'uri' => '/res/502f1bb9/rsrc/css/application/objectselector/object-selector.css', - 'type' => 'css', - 'requires' => - array( - 0 => 'aphront-dialog-view-css', - ), - 'disk' => '/rsrc/css/application/objectselector/object-selector.css', - ), - 'phabricator-phtize' => - array( - 'uri' => '/res/dc655a81/rsrc/js/core/phtize.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-util', - ), - 'disk' => '/rsrc/js/core/phtize.js', - ), - 'phabricator-prefab' => - array( - 'uri' => '/res/511859ca/rsrc/js/core/Prefab.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-typeahead', - 4 => 'javelin-tokenizer', - 5 => 'javelin-typeahead-preloaded-source', - 6 => 'javelin-typeahead-ondemand-source', - 7 => 'javelin-dom', - 8 => 'javelin-stratcom', - 9 => 'javelin-util', - ), - 'disk' => '/rsrc/js/core/Prefab.js', - ), - 'phabricator-profile-css' => - array( - 'uri' => '/res/87229261/rsrc/css/application/profile/profile-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/profile/profile-view.css', - ), - 'phabricator-project-tag-css' => - array( - 'uri' => '/res/383b8c30/rsrc/css/application/projects/project-tag.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/projects/project-tag.css', - ), - 'phabricator-property-list-view-css' => - array( - 'uri' => '/res/1b2f0fa9/rsrc/css/layout/phabricator-property-list-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-property-list-view.css', - ), - 'phabricator-remarkup-css' => - array( - 'uri' => '/res/8531b6a1/rsrc/css/core/remarkup.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/core/remarkup.css', - ), - 'phabricator-search-results-css' => - array( - 'uri' => '/res/9b749d7d/rsrc/css/application/search/search-results.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/search/search-results.css', - ), - 'phabricator-settings-css' => - array( - 'uri' => '/res/fb9d017f/rsrc/css/application/settings/settings.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/settings/settings.css', - ), - 'phabricator-shaped-request' => - array( - 'uri' => '/res/d173af85/rsrc/js/core/ShapedRequest.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-request', - ), - 'disk' => '/rsrc/js/core/ShapedRequest.js', - ), - 'phabricator-side-menu-view-css' => - array( - 'uri' => '/res/f43a8365/rsrc/css/layout/phabricator-side-menu-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-side-menu-view.css', - ), - 'phabricator-slowvote-css' => - array( - 'uri' => '/res/11373549/rsrc/css/application/slowvote/slowvote.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/slowvote/slowvote.css', - ), - 'phabricator-source-code-view-css' => - array( - 'uri' => '/res/70bcbea4/rsrc/css/layout/phabricator-source-code-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-source-code-view.css', - ), - 'phabricator-standard-page-view' => - array( - 'uri' => '/res/0151b341/rsrc/css/application/base/standard-page-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/base/standard-page-view.css', - ), - 'phabricator-tag-view-css' => - array( - 'uri' => '/res/21a0a5d6/rsrc/css/layout/phabricator-tag-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-tag-view.css', - ), - 'phabricator-textareautils' => - array( - 'uri' => '/res/03c03e8b/rsrc/js/core/TextAreaUtils.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - ), - 'disk' => '/rsrc/js/core/TextAreaUtils.js', - ), - 'phabricator-timeline-view-css' => - array( - 'uri' => '/res/3b85450f/rsrc/css/layout/phabricator-timeline-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-timeline-view.css', - ), - 'phabricator-tooltip' => - array( - 'uri' => '/res/a23bc887/rsrc/js/core/ToolTip.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-vector', - ), - 'disk' => '/rsrc/js/core/ToolTip.js', - ), - 'phabricator-transaction-view-css' => - array( - 'uri' => '/res/00be4b1a/rsrc/css/aphront/transaction.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/aphront/transaction.css', - ), - 'phabricator-ui-example-css' => - array( - 'uri' => '/res/376ab671/rsrc/css/application/uiexample/example.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/uiexample/example.css', - ), - 'phabricator-uiexample-javelin-view' => - array( - 'uri' => '/res/d42834b6/rsrc/js/application/uiexample/JavelinViewExample.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-view', - ), - 'disk' => '/rsrc/js/application/uiexample/JavelinViewExample.js', - ), - 'phabricator-uiexample-reactor-button' => - array( - 'uri' => '/res/6bfe4f05/rsrc/js/application/uiexample/ReactorButtonExample.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-dynval', - 4 => 'javelin-reactor-dom', - ), - 'disk' => '/rsrc/js/application/uiexample/ReactorButtonExample.js', - ), - 'phabricator-uiexample-reactor-checkbox' => - array( - 'uri' => '/res/3e8b30ac/rsrc/js/application/uiexample/ReactorCheckboxExample.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', - ), - 'disk' => '/rsrc/js/application/uiexample/ReactorCheckboxExample.js', - ), - 'phabricator-uiexample-reactor-focus' => - array( - 'uri' => '/res/d8f3b56e/rsrc/js/application/uiexample/ReactorFocusExample.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', - ), - 'disk' => '/rsrc/js/application/uiexample/ReactorFocusExample.js', - ), - 'phabricator-uiexample-reactor-input' => - array( - 'uri' => '/res/936352d9/rsrc/js/application/uiexample/ReactorInputExample.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-reactor-dom', - 2 => 'javelin-view-html', - 3 => 'javelin-view-interpreter', - 4 => 'javelin-view-renderer', - ), - 'disk' => '/rsrc/js/application/uiexample/ReactorInputExample.js', - ), - 'phabricator-uiexample-reactor-mouseover' => - array( - 'uri' => '/res/031a9f4f/rsrc/js/application/uiexample/ReactorMouseoverExample.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', - ), - 'disk' => '/rsrc/js/application/uiexample/ReactorMouseoverExample.js', - ), - 'phabricator-uiexample-reactor-radio' => - array( - 'uri' => '/res/208c58e3/rsrc/js/application/uiexample/ReactorRadioExample.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', - ), - 'disk' => '/rsrc/js/application/uiexample/ReactorRadioExample.js', - ), - 'phabricator-uiexample-reactor-select' => - array( - 'uri' => '/res/1b68a6db/rsrc/js/application/uiexample/ReactorSelectExample.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', - ), - 'disk' => '/rsrc/js/application/uiexample/ReactorSelectExample.js', - ), - 'phabricator-uiexample-reactor-sendclass' => - array( - 'uri' => '/res/00cb3131/rsrc/js/application/uiexample/ReactorSendClassExample.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', - ), - 'disk' => '/rsrc/js/application/uiexample/ReactorSendClassExample.js', - ), - 'phabricator-uiexample-reactor-sendproperties' => - array( - 'uri' => '/res/392f1e02/rsrc/js/application/uiexample/ReactorSendPropertiesExample.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-reactor-dom', - ), - 'disk' => '/rsrc/js/application/uiexample/ReactorSendPropertiesExample.js', - ), - 'phabricator-workboard-view-css' => - array( - 'uri' => '/res/f598d215/rsrc/css/layout/phabricator-workboard-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-workboard-view.css', - ), - 'phabricator-workpanel-view-css' => - array( - 'uri' => '/res/d0cdb62e/rsrc/css/layout/phabricator-workpanel-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/layout/phabricator-workpanel-view.css', - ), - 'phabricator-zindex-css' => - array( - 'uri' => '/res/a50437bf/rsrc/css/core/z-index.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/core/z-index.css', - ), - 'phame-css' => - array( - 'uri' => '/res/ba5a8cd8/rsrc/css/application/phame/phame.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/phame/phame.css', - ), - 'pholio-css' => - array( - 'uri' => '/res/14b14ff5/rsrc/css/application/pholio/pholio.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/pholio/pholio.css', - ), - 'pholio-edit-css' => - array( - 'uri' => '/res/00e3a3a8/rsrc/css/application/pholio/pholio-edit.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/pholio/pholio-edit.css', - ), - 'pholio-inline-comments-css' => - array( - 'uri' => '/res/006fc575/rsrc/css/application/pholio/pholio-inline-comments.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/pholio/pholio-inline-comments.css', - ), - 'phortune-credit-card-form' => - array( - 'uri' => '/res/bc948778/rsrc/js/application/phortune/phortune-credit-card-form.js', - 'type' => 'js', - 'requires' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - 2 => 'javelin-json', - 3 => 'javelin-workflow', - 4 => 'javelin-util', - ), - 'disk' => '/rsrc/js/application/phortune/phortune-credit-card-form.js', - ), - 'phortune-credit-card-form-css' => - array( - 'uri' => '/res/563c8c6d/rsrc/css/application/phortune/phortune-credit-card-form.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/phortune/phortune-credit-card-form.css', - ), - 'phrequent-css' => - array( - 'uri' => '/res/9d6f3eb7/rsrc/css/application/phrequent/phrequent.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/phrequent/phrequent.css', - ), - 'phriction-document-css' => - array( - 'uri' => '/res/754f6b37/rsrc/css/application/phriction/phriction-document-css.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/phriction/phriction-document-css.css', - ), - 'phui-box-css' => - array( - 'uri' => '/res/1b741073/rsrc/css/phui/phui-box.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/phui/phui-box.css', - ), - 'phui-button-css' => - array( - 'uri' => '/res/aeb3d0f2/rsrc/css/phui/phui-button.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/phui/phui-button.css', - ), - 'phui-document-view-css' => - array( - 'uri' => '/res/fe374dee/rsrc/css/phui/phui-document.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/phui/phui-document.css', - ), - 'phui-feed-story-css' => - array( - 'uri' => '/res/68a0ce41/rsrc/css/phui/phui-feed-story.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/phui/phui-feed-story.css', - ), - 'phui-form-css' => - array( - 'uri' => '/res/c02b6db7/rsrc/css/phui/phui-form.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/phui/phui-form.css', - ), - 'phui-icon-view-css' => - array( - 'uri' => '/res/f78f4c64/rsrc/css/phui/phui-icon.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/phui/phui-icon.css', - ), - 'phui-list-view-css' => - array( - 'uri' => '/res/3235e888/rsrc/css/phui/phui-list.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/phui/phui-list.css', - ), - 'phui-pinboard-view-css' => - array( - 'uri' => '/res/3b961aa1/rsrc/css/phui/phui-pinboard-view.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/phui/phui-pinboard-view.css', - ), - 'phui-remarkup-preview-css' => - array( - 'uri' => '/res/4535e062/rsrc/css/phui/phui-remarkup-preview.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/phui/phui-remarkup-preview.css', - ), - 'phui-spacing-css' => - array( - 'uri' => '/res/28891fd3/rsrc/css/phui/phui-spacing.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/phui/phui-spacing.css', - ), - 'phui-status-list-view-css' => - array( - 'uri' => '/res/edd24959/rsrc/css/phui/phui-status.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/phui/phui-status.css', - ), - 'phui-text-css' => - array( - 'uri' => '/res/63e53cac/rsrc/css/phui/phui-text.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/phui/phui-text.css', - ), - 'ponder-comment-table-css' => - array( - 'uri' => '/res/2527ba37/rsrc/css/application/ponder/comments.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/ponder/comments.css', - ), - 'ponder-feed-view-css' => - array( - 'uri' => '/res/cab09075/rsrc/css/application/ponder/feed.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/ponder/feed.css', - ), - 'ponder-post-css' => - array( - 'uri' => '/res/013b9e2c/rsrc/css/application/ponder/post.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/ponder/post.css', - ), - 'ponder-vote-css' => - array( - 'uri' => '/res/6bbe8538/rsrc/css/application/ponder/vote.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/ponder/vote.css', - ), - 'raphael-core' => - array( - 'uri' => '/res/5dc5e17c/rsrc/externals/raphael/raphael.js', - 'type' => 'js', - 'requires' => - array( - ), - 'disk' => '/rsrc/externals/raphael/raphael.js', - ), - 'raphael-g' => - array( - 'uri' => '/res/229b89a1/rsrc/externals/raphael/g.raphael.js', - 'type' => 'js', - 'requires' => - array( - ), - 'disk' => '/rsrc/externals/raphael/g.raphael.js', - ), - 'raphael-g-line' => - array( - 'uri' => '/res/96da30f7/rsrc/externals/raphael/g.raphael.line.js', - 'type' => 'js', - 'requires' => - array( - ), - 'disk' => '/rsrc/externals/raphael/g.raphael.line.js', - ), - 'releeph-branch' => - array( - 'uri' => '/res/6ad6420d/rsrc/css/application/releeph/releeph-branch.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/releeph/releeph-branch.css', - ), - 'releeph-colors' => - array( - 'uri' => '/res/dff4b26a/rsrc/css/application/releeph/releeph-colors.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/releeph/releeph-colors.css', - ), - 'releeph-core' => - array( - 'uri' => '/res/853f4a73/rsrc/css/application/releeph/releeph-core.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/releeph/releeph-core.css', - ), - 'releeph-intents' => - array( - 'uri' => '/res/4e73e9dd/rsrc/css/application/releeph/releeph-intents.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/releeph/releeph-intents.css', - ), - 'releeph-preview-branch' => - array( - 'uri' => '/res/65e5dece/rsrc/css/application/releeph/releeph-preview-branch.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/releeph/releeph-preview-branch.css', - ), - 'releeph-project' => - array( - 'uri' => '/res/b9376e59/rsrc/css/application/releeph/releeph-project.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/releeph/releeph-project.css', - ), - 'releeph-request-differential-create-dialog' => - array( - 'uri' => '/res/4df30ce1/rsrc/css/application/releeph/releeph-request-differential-create-dialog.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/releeph/releeph-request-differential-create-dialog.css', - ), - 'releeph-request-typeahead-css' => - array( - 'uri' => '/res/9c9a1acf/rsrc/css/application/releeph/releeph-request-typeahead.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/releeph/releeph-request-typeahead.css', - ), - 'releeph-status' => - array( - 'uri' => '/res/588529df/rsrc/css/application/releeph/releeph-status.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/releeph/releeph-status.css', - ), - 'setup-issue-css' => - array( - 'uri' => '/res/efbb3673/rsrc/css/application/config/setup-issue.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/config/setup-issue.css', - ), - 'sprite-actions-css' => - array( - 'uri' => '/res/bd43efa8/rsrc/css/sprite-actions.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-actions.css', - ), - 'sprite-apps-css' => - array( - 'uri' => '/res/0805dd1d/rsrc/css/sprite-apps.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-apps.css', - ), - 'sprite-apps-large-css' => - array( - 'uri' => '/res/ebba1243/rsrc/css/sprite-apps-large.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-apps-large.css', - ), - 'sprite-apps-xlarge-css' => - array( - 'uri' => '/res/33a8e644/rsrc/css/sprite-apps-xlarge.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-apps-xlarge.css', - ), - 'sprite-conpherence-css' => - array( - 'uri' => '/res/f6793453/rsrc/css/sprite-conpherence.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-conpherence.css', - ), - 'sprite-docs-css' => - array( - 'uri' => '/res/b32f93bc/rsrc/css/sprite-docs.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-docs.css', - ), - 'sprite-gradient-css' => - array( - 'uri' => '/res/af8d50a1/rsrc/css/sprite-gradient.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-gradient.css', - ), - 'sprite-icons-css' => - array( - 'uri' => '/res/03295fbd/rsrc/css/sprite-icons.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-icons.css', - ), - 'sprite-login-css' => - array( - 'uri' => '/res/8bd33e35/rsrc/css/sprite-login.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-login.css', - ), - 'sprite-menu-css' => - array( - 'uri' => '/res/764ab039/rsrc/css/sprite-menu.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-menu.css', - ), - 'sprite-minicons-css' => - array( - 'uri' => '/res/2dba70cd/rsrc/css/sprite-minicons.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-minicons.css', - ), - 'sprite-payments-css' => - array( - 'uri' => '/res/876697b6/rsrc/css/sprite-payments.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-payments.css', - ), - 'sprite-status-css' => - array( - 'uri' => '/res/5c735469/rsrc/css/sprite-status.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-status.css', - ), - 'sprite-tokens-css' => - array( - 'uri' => '/res/edb4e341/rsrc/css/sprite-tokens.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/sprite-tokens.css', - ), - 'syntax-highlighting-css' => - array( - 'uri' => '/res/3c77ac95/rsrc/css/core/syntax.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/core/syntax.css', - ), - 'tokens-css' => - array( - 'uri' => '/res/bbddf548/rsrc/css/application/tokens/tokens.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/tokens/tokens.css', - ), -), array( - 'packages' => - array( - '638c9d42' => - array( - 'name' => 'core.pkg.css', - 'symbols' => - array( - 0 => 'phabricator-core-css', - 1 => 'phabricator-zindex-css', - 2 => 'phui-button-css', - 3 => 'phabricator-standard-page-view', - 4 => 'aphront-dialog-view-css', - 5 => 'aphront-form-view-css', - 6 => 'aphront-panel-view-css', - 7 => 'aphront-table-view-css', - 8 => 'aphront-tokenizer-control-css', - 9 => 'aphront-typeahead-control-css', - 10 => 'aphront-list-filter-view-css', - 11 => 'phabricator-jump-nav', - 12 => 'phabricator-remarkup-css', - 13 => 'syntax-highlighting-css', - 14 => 'aphront-pager-view-css', - 15 => 'phabricator-transaction-view-css', - 16 => 'aphront-tooltip-css', - 17 => 'phabricator-flag-css', - 18 => 'aphront-error-view-css', - 19 => 'sprite-icons-css', - 20 => 'sprite-gradient-css', - 21 => 'sprite-menu-css', - 22 => 'sprite-apps-large-css', - 23 => 'phabricator-main-menu-view', - 24 => 'phabricator-notification-css', - 25 => 'phabricator-notification-menu-css', - 26 => 'lightbox-attachment-css', - 27 => 'phabricator-header-view-css', - 28 => 'phabricator-form-view-css', - 29 => 'phabricator-filetree-view-css', - 30 => 'phabricator-nav-view-css', - 31 => 'phabricator-side-menu-view-css', - 32 => 'phabricator-crumbs-view-css', - 33 => 'phabricator-object-item-list-view-css', - 34 => 'global-drag-and-drop-css', - 35 => 'phui-spacing-css', - 36 => 'phui-form-css', - 37 => 'phui-icon-view-css', - 38 => 'phabricator-application-launch-view-css', - 39 => 'phabricator-action-list-view-css', - 40 => 'phabricator-property-list-view-css', - 41 => 'phabricator-tag-view-css', - ), - 'uri' => '/res/pkg/638c9d42/core.pkg.css', - 'type' => 'css', - ), - '7cc3f99d' => - array( - 'name' => 'core.pkg.js', - 'symbols' => - array( - 0 => 'javelin-behavior-aphront-basic-tokenizer', - 1 => 'javelin-behavior-workflow', - 2 => 'javelin-behavior-aphront-form-disable-on-submit', - 3 => 'phabricator-keyboard-shortcut-manager', - 4 => 'phabricator-keyboard-shortcut', - 5 => 'javelin-behavior-phabricator-keyboard-shortcuts', - 6 => 'javelin-behavior-refresh-csrf', - 7 => 'javelin-behavior-phabricator-watch-anchor', - 8 => 'javelin-behavior-phabricator-autofocus', - 9 => 'phabricator-menu-item', - 10 => 'phabricator-dropdown-menu', - 11 => 'phabricator-phtize', - 12 => 'javelin-behavior-phabricator-oncopy', - 13 => 'phabricator-tooltip', - 14 => 'javelin-behavior-phabricator-tooltips', - 15 => 'phabricator-prefab', - 16 => 'javelin-behavior-device', - 17 => 'javelin-behavior-toggle-class', - 18 => 'javelin-behavior-lightbox-attachments', - 19 => 'phabricator-busy', - 20 => 'javelin-aphlict', - 21 => 'phabricator-notification', - 22 => 'javelin-behavior-aphlict-listen', - 23 => 'javelin-behavior-phabricator-search-typeahead', - 24 => 'javelin-behavior-konami', - 25 => 'javelin-behavior-aphlict-dropdown', - 26 => 'javelin-behavior-history-install', - 27 => 'javelin-behavior-phabricator-gesture', - 28 => 'javelin-behavior-phabricator-active-nav', - 29 => 'javelin-behavior-phabricator-nav', - 30 => 'javelin-behavior-phabricator-remarkup-assist', - 31 => 'phabricator-textareautils', - 32 => 'phabricator-file-upload', - 33 => 'javelin-behavior-global-drag-and-drop', - 34 => 'javelin-behavior-phabricator-reveal-content', - 35 => 'phabricator-hovercard', - 36 => 'javelin-behavior-phabricator-hovercards', - ), - 'uri' => '/res/pkg/7cc3f99d/core.pkg.js', - 'type' => 'js', - ), - '4ccfeb47' => - array( - 'name' => 'darkconsole.pkg.js', - 'symbols' => - array( - 0 => 'javelin-behavior-dark-console', - 1 => 'javelin-behavior-error-log', - ), - 'uri' => '/res/pkg/4ccfeb47/darkconsole.pkg.js', - 'type' => 'js', - ), - 'dd27a69b' => - array( - 'name' => 'differential.pkg.css', - 'symbols' => - array( - 0 => 'differential-core-view-css', - 1 => 'differential-changeset-view-css', - 2 => 'differential-results-table-css', - 3 => 'differential-revision-history-css', - 4 => 'differential-revision-list-css', - 5 => 'differential-table-of-contents-css', - 6 => 'differential-revision-comment-css', - 7 => 'differential-revision-add-comment-css', - 8 => 'differential-revision-comment-list-css', - 9 => 'phabricator-object-selector-css', - 10 => 'phabricator-content-source-view-css', - 11 => 'differential-local-commits-view-css', - 12 => 'inline-comment-summary-css', - ), - 'uri' => '/res/pkg/dd27a69b/differential.pkg.css', - 'type' => 'css', - ), - '48040be9' => - array( - 'name' => 'differential.pkg.js', - 'symbols' => - array( - 0 => 'phabricator-drag-and-drop-file-upload', - 1 => 'phabricator-shaped-request', - 2 => 'javelin-behavior-differential-feedback-preview', - 3 => 'javelin-behavior-differential-edit-inline-comments', - 4 => 'javelin-behavior-differential-populate', - 5 => 'javelin-behavior-differential-show-more', - 6 => 'javelin-behavior-differential-diff-radios', - 7 => 'javelin-behavior-differential-accept-with-errors', - 8 => 'javelin-behavior-differential-comment-jump', - 9 => 'javelin-behavior-differential-add-reviewers-and-ccs', - 10 => 'javelin-behavior-differential-keyboard-navigation', - 11 => 'javelin-behavior-aphront-drag-and-drop-textarea', - 12 => 'javelin-behavior-phabricator-object-selector', - 13 => 'javelin-behavior-repository-crossreference', - 14 => 'javelin-behavior-load-blame', - 15 => 'differential-inline-comment-editor', - 16 => 'javelin-behavior-differential-dropdown-menus', - 17 => 'javelin-behavior-differential-toggle-files', - 18 => 'javelin-behavior-differential-user-select', - ), - 'uri' => '/res/pkg/48040be9/differential.pkg.js', - 'type' => 'js', - ), - 'c8ce2d88' => - array( - 'name' => 'diffusion.pkg.css', - 'symbols' => - array( - 0 => 'diffusion-commit-view-css', - 1 => 'diffusion-icons-css', - ), - 'uri' => '/res/pkg/c8ce2d88/diffusion.pkg.css', - 'type' => 'css', - ), - 96909266 => - array( - 'name' => 'diffusion.pkg.js', - 'symbols' => - array( - 0 => 'javelin-behavior-diffusion-pull-lastmodified', - 1 => 'javelin-behavior-diffusion-commit-graph', - 2 => 'javelin-behavior-audit-preview', - ), - 'uri' => '/res/pkg/96909266/diffusion.pkg.js', - 'type' => 'js', - ), - '2dbbb7d1' => - array( - 'name' => 'javelin.pkg.js', - 'symbols' => - array( - 0 => 'javelin-util', - 1 => 'javelin-install', - 2 => 'javelin-event', - 3 => 'javelin-stratcom', - 4 => 'javelin-behavior', - 5 => 'javelin-resource', - 6 => 'javelin-request', - 7 => 'javelin-vector', - 8 => 'javelin-dom', - 9 => 'javelin-json', - 10 => 'javelin-uri', - 11 => 'javelin-workflow', - 12 => 'javelin-mask', - 13 => 'javelin-typeahead', - 14 => 'javelin-typeahead-normalizer', - 15 => 'javelin-typeahead-source', - 16 => 'javelin-typeahead-preloaded-source', - 17 => 'javelin-typeahead-ondemand-source', - 18 => 'javelin-tokenizer', - 19 => 'javelin-history', - ), - 'uri' => '/res/pkg/2dbbb7d1/javelin.pkg.js', - 'type' => 'js', - ), - '06bacb9a' => - array( - 'name' => 'maniphest.pkg.css', - 'symbols' => - array( - 0 => 'maniphest-task-summary-css', - 1 => 'maniphest-transaction-detail-css', - 2 => 'phabricator-project-tag-css', - ), - 'uri' => '/res/pkg/06bacb9a/maniphest.pkg.css', - 'type' => 'css', - ), - '98f64f07' => - array( - 'name' => 'maniphest.pkg.js', - 'symbols' => - array( - 0 => 'javelin-behavior-maniphest-batch-selector', - 1 => 'javelin-behavior-maniphest-transaction-controls', - 2 => 'javelin-behavior-maniphest-transaction-preview', - 3 => 'javelin-behavior-maniphest-transaction-expand', - 4 => 'javelin-behavior-maniphest-subpriority-editor', - ), - 'uri' => '/res/pkg/98f64f07/maniphest.pkg.js', - 'type' => 'js', - ), - ), - 'reverse' => - array( - 'aphront-dialog-view-css' => '638c9d42', - 'aphront-error-view-css' => '638c9d42', - 'aphront-form-view-css' => '638c9d42', - 'aphront-list-filter-view-css' => '638c9d42', - 'aphront-pager-view-css' => '638c9d42', - 'aphront-panel-view-css' => '638c9d42', - 'aphront-table-view-css' => '638c9d42', - 'aphront-tokenizer-control-css' => '638c9d42', - 'aphront-tooltip-css' => '638c9d42', - 'aphront-typeahead-control-css' => '638c9d42', - 'differential-changeset-view-css' => 'dd27a69b', - 'differential-core-view-css' => 'dd27a69b', - 'differential-inline-comment-editor' => '48040be9', - 'differential-local-commits-view-css' => 'dd27a69b', - 'differential-results-table-css' => 'dd27a69b', - 'differential-revision-add-comment-css' => 'dd27a69b', - 'differential-revision-comment-css' => 'dd27a69b', - 'differential-revision-comment-list-css' => 'dd27a69b', - 'differential-revision-history-css' => 'dd27a69b', - 'differential-revision-list-css' => 'dd27a69b', - 'differential-table-of-contents-css' => 'dd27a69b', - 'diffusion-commit-view-css' => 'c8ce2d88', - 'diffusion-icons-css' => 'c8ce2d88', - 'global-drag-and-drop-css' => '638c9d42', - 'inline-comment-summary-css' => 'dd27a69b', - 'javelin-aphlict' => '7cc3f99d', - 'javelin-behavior' => '2dbbb7d1', - 'javelin-behavior-aphlict-dropdown' => '7cc3f99d', - 'javelin-behavior-aphlict-listen' => '7cc3f99d', - 'javelin-behavior-aphront-basic-tokenizer' => '7cc3f99d', - 'javelin-behavior-aphront-drag-and-drop-textarea' => '48040be9', - 'javelin-behavior-aphront-form-disable-on-submit' => '7cc3f99d', - 'javelin-behavior-audit-preview' => '96909266', - 'javelin-behavior-dark-console' => '4ccfeb47', - 'javelin-behavior-device' => '7cc3f99d', - 'javelin-behavior-differential-accept-with-errors' => '48040be9', - 'javelin-behavior-differential-add-reviewers-and-ccs' => '48040be9', - 'javelin-behavior-differential-comment-jump' => '48040be9', - 'javelin-behavior-differential-diff-radios' => '48040be9', - 'javelin-behavior-differential-dropdown-menus' => '48040be9', - 'javelin-behavior-differential-edit-inline-comments' => '48040be9', - 'javelin-behavior-differential-feedback-preview' => '48040be9', - 'javelin-behavior-differential-keyboard-navigation' => '48040be9', - 'javelin-behavior-differential-populate' => '48040be9', - 'javelin-behavior-differential-show-more' => '48040be9', - 'javelin-behavior-differential-toggle-files' => '48040be9', - 'javelin-behavior-differential-user-select' => '48040be9', - 'javelin-behavior-diffusion-commit-graph' => '96909266', - 'javelin-behavior-diffusion-pull-lastmodified' => '96909266', - 'javelin-behavior-error-log' => '4ccfeb47', - 'javelin-behavior-global-drag-and-drop' => '7cc3f99d', - 'javelin-behavior-history-install' => '7cc3f99d', - 'javelin-behavior-konami' => '7cc3f99d', - 'javelin-behavior-lightbox-attachments' => '7cc3f99d', - 'javelin-behavior-load-blame' => '48040be9', - 'javelin-behavior-maniphest-batch-selector' => '98f64f07', - 'javelin-behavior-maniphest-subpriority-editor' => '98f64f07', - 'javelin-behavior-maniphest-transaction-controls' => '98f64f07', - 'javelin-behavior-maniphest-transaction-expand' => '98f64f07', - 'javelin-behavior-maniphest-transaction-preview' => '98f64f07', - 'javelin-behavior-phabricator-active-nav' => '7cc3f99d', - 'javelin-behavior-phabricator-autofocus' => '7cc3f99d', - 'javelin-behavior-phabricator-gesture' => '7cc3f99d', - 'javelin-behavior-phabricator-hovercards' => '7cc3f99d', - 'javelin-behavior-phabricator-keyboard-shortcuts' => '7cc3f99d', - 'javelin-behavior-phabricator-nav' => '7cc3f99d', - 'javelin-behavior-phabricator-object-selector' => '48040be9', - 'javelin-behavior-phabricator-oncopy' => '7cc3f99d', - 'javelin-behavior-phabricator-remarkup-assist' => '7cc3f99d', - 'javelin-behavior-phabricator-reveal-content' => '7cc3f99d', - 'javelin-behavior-phabricator-search-typeahead' => '7cc3f99d', - 'javelin-behavior-phabricator-tooltips' => '7cc3f99d', - 'javelin-behavior-phabricator-watch-anchor' => '7cc3f99d', - 'javelin-behavior-refresh-csrf' => '7cc3f99d', - 'javelin-behavior-repository-crossreference' => '48040be9', - 'javelin-behavior-toggle-class' => '7cc3f99d', - 'javelin-behavior-workflow' => '7cc3f99d', - 'javelin-dom' => '2dbbb7d1', - 'javelin-event' => '2dbbb7d1', - 'javelin-history' => '2dbbb7d1', - 'javelin-install' => '2dbbb7d1', - 'javelin-json' => '2dbbb7d1', - 'javelin-mask' => '2dbbb7d1', - 'javelin-request' => '2dbbb7d1', - 'javelin-resource' => '2dbbb7d1', - 'javelin-stratcom' => '2dbbb7d1', - 'javelin-tokenizer' => '2dbbb7d1', - 'javelin-typeahead' => '2dbbb7d1', - 'javelin-typeahead-normalizer' => '2dbbb7d1', - 'javelin-typeahead-ondemand-source' => '2dbbb7d1', - 'javelin-typeahead-preloaded-source' => '2dbbb7d1', - 'javelin-typeahead-source' => '2dbbb7d1', - 'javelin-uri' => '2dbbb7d1', - 'javelin-util' => '2dbbb7d1', - 'javelin-vector' => '2dbbb7d1', - 'javelin-workflow' => '2dbbb7d1', - 'lightbox-attachment-css' => '638c9d42', - 'maniphest-task-summary-css' => '06bacb9a', - 'maniphest-transaction-detail-css' => '06bacb9a', - 'phabricator-action-list-view-css' => '638c9d42', - 'phabricator-application-launch-view-css' => '638c9d42', - 'phabricator-busy' => '7cc3f99d', - 'phabricator-content-source-view-css' => 'dd27a69b', - 'phabricator-core-css' => '638c9d42', - 'phabricator-crumbs-view-css' => '638c9d42', - 'phabricator-drag-and-drop-file-upload' => '48040be9', - 'phabricator-dropdown-menu' => '7cc3f99d', - 'phabricator-file-upload' => '7cc3f99d', - 'phabricator-filetree-view-css' => '638c9d42', - 'phabricator-flag-css' => '638c9d42', - 'phabricator-form-view-css' => '638c9d42', - 'phabricator-header-view-css' => '638c9d42', - 'phabricator-hovercard' => '7cc3f99d', - 'phabricator-jump-nav' => '638c9d42', - 'phabricator-keyboard-shortcut' => '7cc3f99d', - 'phabricator-keyboard-shortcut-manager' => '7cc3f99d', - 'phabricator-main-menu-view' => '638c9d42', - 'phabricator-menu-item' => '7cc3f99d', - 'phabricator-nav-view-css' => '638c9d42', - 'phabricator-notification' => '7cc3f99d', - 'phabricator-notification-css' => '638c9d42', - 'phabricator-notification-menu-css' => '638c9d42', - 'phabricator-object-item-list-view-css' => '638c9d42', - 'phabricator-object-selector-css' => 'dd27a69b', - 'phabricator-phtize' => '7cc3f99d', - 'phabricator-prefab' => '7cc3f99d', - 'phabricator-project-tag-css' => '06bacb9a', - 'phabricator-property-list-view-css' => '638c9d42', - 'phabricator-remarkup-css' => '638c9d42', - 'phabricator-shaped-request' => '48040be9', - 'phabricator-side-menu-view-css' => '638c9d42', - 'phabricator-standard-page-view' => '638c9d42', - 'phabricator-tag-view-css' => '638c9d42', - 'phabricator-textareautils' => '7cc3f99d', - 'phabricator-tooltip' => '7cc3f99d', - 'phabricator-transaction-view-css' => '638c9d42', - 'phabricator-zindex-css' => '638c9d42', - 'phui-button-css' => '638c9d42', - 'phui-form-css' => '638c9d42', - 'phui-icon-view-css' => '638c9d42', - 'phui-spacing-css' => '638c9d42', - 'sprite-apps-large-css' => '638c9d42', - 'sprite-gradient-css' => '638c9d42', - 'sprite-icons-css' => '638c9d42', - 'sprite-menu-css' => '638c9d42', - 'syntax-highlighting-css' => '638c9d42', - ), -)); diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 4377ad50e3..b3637667ee 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2,44 +2,216 @@ /** * This file is automatically generated. Use 'arc liberate' to rebuild it. + * * @generated * @phutil-library-version 2 */ - phutil_register_library_map(array( '__library_version__' => 2, - 'class' => - array( + 'class' => array( + 'AlmanacAddress' => 'applications/almanac/util/AlmanacAddress.php', + 'AlmanacBinding' => 'applications/almanac/storage/AlmanacBinding.php', + 'AlmanacBindingDeletePropertyTransaction' => 'applications/almanac/xaction/AlmanacBindingDeletePropertyTransaction.php', + 'AlmanacBindingDisableController' => 'applications/almanac/controller/AlmanacBindingDisableController.php', + 'AlmanacBindingDisableTransaction' => 'applications/almanac/xaction/AlmanacBindingDisableTransaction.php', + 'AlmanacBindingEditConduitAPIMethod' => 'applications/almanac/conduit/AlmanacBindingEditConduitAPIMethod.php', + 'AlmanacBindingEditController' => 'applications/almanac/controller/AlmanacBindingEditController.php', + 'AlmanacBindingEditEngine' => 'applications/almanac/editor/AlmanacBindingEditEngine.php', + 'AlmanacBindingEditor' => 'applications/almanac/editor/AlmanacBindingEditor.php', + 'AlmanacBindingInterfaceTransaction' => 'applications/almanac/xaction/AlmanacBindingInterfaceTransaction.php', + 'AlmanacBindingPHIDType' => 'applications/almanac/phid/AlmanacBindingPHIDType.php', + 'AlmanacBindingPropertyEditEngine' => 'applications/almanac/editor/AlmanacBindingPropertyEditEngine.php', + 'AlmanacBindingQuery' => 'applications/almanac/query/AlmanacBindingQuery.php', + 'AlmanacBindingSearchConduitAPIMethod' => 'applications/almanac/conduit/AlmanacBindingSearchConduitAPIMethod.php', + 'AlmanacBindingSearchEngine' => 'applications/almanac/query/AlmanacBindingSearchEngine.php', + 'AlmanacBindingServiceTransaction' => 'applications/almanac/xaction/AlmanacBindingServiceTransaction.php', + 'AlmanacBindingSetPropertyTransaction' => 'applications/almanac/xaction/AlmanacBindingSetPropertyTransaction.php', + 'AlmanacBindingTableView' => 'applications/almanac/view/AlmanacBindingTableView.php', + 'AlmanacBindingTransaction' => 'applications/almanac/storage/AlmanacBindingTransaction.php', + 'AlmanacBindingTransactionQuery' => 'applications/almanac/query/AlmanacBindingTransactionQuery.php', + 'AlmanacBindingTransactionType' => 'applications/almanac/xaction/AlmanacBindingTransactionType.php', + 'AlmanacBindingViewController' => 'applications/almanac/controller/AlmanacBindingViewController.php', + 'AlmanacBindingsSearchEngineAttachment' => 'applications/almanac/engineextension/AlmanacBindingsSearchEngineAttachment.php', + 'AlmanacCacheEngineExtension' => 'applications/almanac/engineextension/AlmanacCacheEngineExtension.php', + 'AlmanacClusterDatabaseServiceType' => 'applications/almanac/servicetype/AlmanacClusterDatabaseServiceType.php', + 'AlmanacClusterRepositoryServiceType' => 'applications/almanac/servicetype/AlmanacClusterRepositoryServiceType.php', + 'AlmanacClusterServiceType' => 'applications/almanac/servicetype/AlmanacClusterServiceType.php', + 'AlmanacConsoleController' => 'applications/almanac/controller/AlmanacConsoleController.php', + 'AlmanacController' => 'applications/almanac/controller/AlmanacController.php', + 'AlmanacCreateDevicesCapability' => 'applications/almanac/capability/AlmanacCreateDevicesCapability.php', + 'AlmanacCreateNamespacesCapability' => 'applications/almanac/capability/AlmanacCreateNamespacesCapability.php', + 'AlmanacCreateNetworksCapability' => 'applications/almanac/capability/AlmanacCreateNetworksCapability.php', + 'AlmanacCreateServicesCapability' => 'applications/almanac/capability/AlmanacCreateServicesCapability.php', + 'AlmanacCustomServiceType' => 'applications/almanac/servicetype/AlmanacCustomServiceType.php', + 'AlmanacDAO' => 'applications/almanac/storage/AlmanacDAO.php', + 'AlmanacDeletePropertyEditField' => 'applications/almanac/engineextension/AlmanacDeletePropertyEditField.php', + 'AlmanacDeletePropertyEditType' => 'applications/almanac/engineextension/AlmanacDeletePropertyEditType.php', + 'AlmanacDevice' => 'applications/almanac/storage/AlmanacDevice.php', + 'AlmanacDeviceController' => 'applications/almanac/controller/AlmanacDeviceController.php', + 'AlmanacDeviceDeletePropertyTransaction' => 'applications/almanac/xaction/AlmanacDeviceDeletePropertyTransaction.php', + 'AlmanacDeviceEditConduitAPIMethod' => 'applications/almanac/conduit/AlmanacDeviceEditConduitAPIMethod.php', + 'AlmanacDeviceEditController' => 'applications/almanac/controller/AlmanacDeviceEditController.php', + 'AlmanacDeviceEditEngine' => 'applications/almanac/editor/AlmanacDeviceEditEngine.php', + 'AlmanacDeviceEditor' => 'applications/almanac/editor/AlmanacDeviceEditor.php', + 'AlmanacDeviceListController' => 'applications/almanac/controller/AlmanacDeviceListController.php', + 'AlmanacDeviceNameNgrams' => 'applications/almanac/storage/AlmanacDeviceNameNgrams.php', + 'AlmanacDeviceNameTransaction' => 'applications/almanac/xaction/AlmanacDeviceNameTransaction.php', + 'AlmanacDevicePHIDType' => 'applications/almanac/phid/AlmanacDevicePHIDType.php', + 'AlmanacDevicePropertyEditEngine' => 'applications/almanac/editor/AlmanacDevicePropertyEditEngine.php', + 'AlmanacDeviceQuery' => 'applications/almanac/query/AlmanacDeviceQuery.php', + 'AlmanacDeviceSearchConduitAPIMethod' => 'applications/almanac/conduit/AlmanacDeviceSearchConduitAPIMethod.php', + 'AlmanacDeviceSearchEngine' => 'applications/almanac/query/AlmanacDeviceSearchEngine.php', + 'AlmanacDeviceSetPropertyTransaction' => 'applications/almanac/xaction/AlmanacDeviceSetPropertyTransaction.php', + 'AlmanacDeviceStatus' => 'applications/almanac/constants/AlmanacDeviceStatus.php', + 'AlmanacDeviceStatusTransaction' => 'applications/almanac/xaction/AlmanacDeviceStatusTransaction.php', + 'AlmanacDeviceTransaction' => 'applications/almanac/storage/AlmanacDeviceTransaction.php', + 'AlmanacDeviceTransactionQuery' => 'applications/almanac/query/AlmanacDeviceTransactionQuery.php', + 'AlmanacDeviceTransactionType' => 'applications/almanac/xaction/AlmanacDeviceTransactionType.php', + 'AlmanacDeviceViewController' => 'applications/almanac/controller/AlmanacDeviceViewController.php', + 'AlmanacDrydockPoolServiceType' => 'applications/almanac/servicetype/AlmanacDrydockPoolServiceType.php', + 'AlmanacEditor' => 'applications/almanac/editor/AlmanacEditor.php', + 'AlmanacInterface' => 'applications/almanac/storage/AlmanacInterface.php', + 'AlmanacInterfaceAddressTransaction' => 'applications/almanac/xaction/AlmanacInterfaceAddressTransaction.php', + 'AlmanacInterfaceDatasource' => 'applications/almanac/typeahead/AlmanacInterfaceDatasource.php', + 'AlmanacInterfaceDeleteController' => 'applications/almanac/controller/AlmanacInterfaceDeleteController.php', + 'AlmanacInterfaceDestroyTransaction' => 'applications/almanac/xaction/AlmanacInterfaceDestroyTransaction.php', + 'AlmanacInterfaceDeviceTransaction' => 'applications/almanac/xaction/AlmanacInterfaceDeviceTransaction.php', + 'AlmanacInterfaceEditConduitAPIMethod' => 'applications/almanac/conduit/AlmanacInterfaceEditConduitAPIMethod.php', + 'AlmanacInterfaceEditController' => 'applications/almanac/controller/AlmanacInterfaceEditController.php', + 'AlmanacInterfaceEditEngine' => 'applications/almanac/editor/AlmanacInterfaceEditEngine.php', + 'AlmanacInterfaceEditor' => 'applications/almanac/editor/AlmanacInterfaceEditor.php', + 'AlmanacInterfaceNetworkTransaction' => 'applications/almanac/xaction/AlmanacInterfaceNetworkTransaction.php', + 'AlmanacInterfacePHIDType' => 'applications/almanac/phid/AlmanacInterfacePHIDType.php', + 'AlmanacInterfacePortTransaction' => 'applications/almanac/xaction/AlmanacInterfacePortTransaction.php', + 'AlmanacInterfaceQuery' => 'applications/almanac/query/AlmanacInterfaceQuery.php', + 'AlmanacInterfaceSearchConduitAPIMethod' => 'applications/almanac/conduit/AlmanacInterfaceSearchConduitAPIMethod.php', + 'AlmanacInterfaceSearchEngine' => 'applications/almanac/query/AlmanacInterfaceSearchEngine.php', + 'AlmanacInterfaceTableView' => 'applications/almanac/view/AlmanacInterfaceTableView.php', + 'AlmanacInterfaceTransaction' => 'applications/almanac/storage/AlmanacInterfaceTransaction.php', + 'AlmanacInterfaceTransactionQuery' => 'applications/almanac/query/AlmanacInterfaceTransactionQuery.php', + 'AlmanacInterfaceTransactionType' => 'applications/almanac/xaction/AlmanacInterfaceTransactionType.php', + 'AlmanacKeys' => 'applications/almanac/util/AlmanacKeys.php', + 'AlmanacManageClusterServicesCapability' => 'applications/almanac/capability/AlmanacManageClusterServicesCapability.php', + 'AlmanacManagementRegisterWorkflow' => 'applications/almanac/management/AlmanacManagementRegisterWorkflow.php', + 'AlmanacManagementTrustKeyWorkflow' => 'applications/almanac/management/AlmanacManagementTrustKeyWorkflow.php', + 'AlmanacManagementUntrustKeyWorkflow' => 'applications/almanac/management/AlmanacManagementUntrustKeyWorkflow.php', + 'AlmanacManagementWorkflow' => 'applications/almanac/management/AlmanacManagementWorkflow.php', + 'AlmanacModularTransaction' => 'applications/almanac/storage/AlmanacModularTransaction.php', + 'AlmanacNames' => 'applications/almanac/util/AlmanacNames.php', + 'AlmanacNamesTestCase' => 'applications/almanac/util/__tests__/AlmanacNamesTestCase.php', + 'AlmanacNamespace' => 'applications/almanac/storage/AlmanacNamespace.php', + 'AlmanacNamespaceController' => 'applications/almanac/controller/AlmanacNamespaceController.php', + 'AlmanacNamespaceEditConduitAPIMethod' => 'applications/almanac/conduit/AlmanacNamespaceEditConduitAPIMethod.php', + 'AlmanacNamespaceEditController' => 'applications/almanac/controller/AlmanacNamespaceEditController.php', + 'AlmanacNamespaceEditEngine' => 'applications/almanac/editor/AlmanacNamespaceEditEngine.php', + 'AlmanacNamespaceEditor' => 'applications/almanac/editor/AlmanacNamespaceEditor.php', + 'AlmanacNamespaceListController' => 'applications/almanac/controller/AlmanacNamespaceListController.php', + 'AlmanacNamespaceNameNgrams' => 'applications/almanac/storage/AlmanacNamespaceNameNgrams.php', + 'AlmanacNamespaceNameTransaction' => 'applications/almanac/xaction/AlmanacNamespaceNameTransaction.php', + 'AlmanacNamespacePHIDType' => 'applications/almanac/phid/AlmanacNamespacePHIDType.php', + 'AlmanacNamespaceQuery' => 'applications/almanac/query/AlmanacNamespaceQuery.php', + 'AlmanacNamespaceSearchConduitAPIMethod' => 'applications/almanac/conduit/AlmanacNamespaceSearchConduitAPIMethod.php', + 'AlmanacNamespaceSearchEngine' => 'applications/almanac/query/AlmanacNamespaceSearchEngine.php', + 'AlmanacNamespaceTransaction' => 'applications/almanac/storage/AlmanacNamespaceTransaction.php', + 'AlmanacNamespaceTransactionQuery' => 'applications/almanac/query/AlmanacNamespaceTransactionQuery.php', + 'AlmanacNamespaceTransactionType' => 'applications/almanac/xaction/AlmanacNamespaceTransactionType.php', + 'AlmanacNamespaceViewController' => 'applications/almanac/controller/AlmanacNamespaceViewController.php', + 'AlmanacNetwork' => 'applications/almanac/storage/AlmanacNetwork.php', + 'AlmanacNetworkController' => 'applications/almanac/controller/AlmanacNetworkController.php', + 'AlmanacNetworkEditConduitAPIMethod' => 'applications/almanac/conduit/AlmanacNetworkEditConduitAPIMethod.php', + 'AlmanacNetworkEditController' => 'applications/almanac/controller/AlmanacNetworkEditController.php', + 'AlmanacNetworkEditEngine' => 'applications/almanac/editor/AlmanacNetworkEditEngine.php', + 'AlmanacNetworkEditor' => 'applications/almanac/editor/AlmanacNetworkEditor.php', + 'AlmanacNetworkListController' => 'applications/almanac/controller/AlmanacNetworkListController.php', + 'AlmanacNetworkNameNgrams' => 'applications/almanac/storage/AlmanacNetworkNameNgrams.php', + 'AlmanacNetworkNameTransaction' => 'applications/almanac/xaction/AlmanacNetworkNameTransaction.php', + 'AlmanacNetworkPHIDType' => 'applications/almanac/phid/AlmanacNetworkPHIDType.php', + 'AlmanacNetworkQuery' => 'applications/almanac/query/AlmanacNetworkQuery.php', + 'AlmanacNetworkSearchConduitAPIMethod' => 'applications/almanac/conduit/AlmanacNetworkSearchConduitAPIMethod.php', + 'AlmanacNetworkSearchEngine' => 'applications/almanac/query/AlmanacNetworkSearchEngine.php', + 'AlmanacNetworkTransaction' => 'applications/almanac/storage/AlmanacNetworkTransaction.php', + 'AlmanacNetworkTransactionQuery' => 'applications/almanac/query/AlmanacNetworkTransactionQuery.php', + 'AlmanacNetworkTransactionType' => 'applications/almanac/xaction/AlmanacNetworkTransactionType.php', + 'AlmanacNetworkViewController' => 'applications/almanac/controller/AlmanacNetworkViewController.php', + 'AlmanacPropertiesDestructionEngineExtension' => 'applications/almanac/engineextension/AlmanacPropertiesDestructionEngineExtension.php', + 'AlmanacPropertiesEditEngineExtension' => 'applications/almanac/engineextension/AlmanacPropertiesEditEngineExtension.php', + 'AlmanacPropertiesSearchEngineAttachment' => 'applications/almanac/engineextension/AlmanacPropertiesSearchEngineAttachment.php', + 'AlmanacProperty' => 'applications/almanac/storage/AlmanacProperty.php', + 'AlmanacPropertyController' => 'applications/almanac/controller/AlmanacPropertyController.php', + 'AlmanacPropertyDeleteController' => 'applications/almanac/controller/AlmanacPropertyDeleteController.php', + 'AlmanacPropertyEditController' => 'applications/almanac/controller/AlmanacPropertyEditController.php', + 'AlmanacPropertyEditEngine' => 'applications/almanac/editor/AlmanacPropertyEditEngine.php', + 'AlmanacPropertyInterface' => 'applications/almanac/property/AlmanacPropertyInterface.php', + 'AlmanacPropertyQuery' => 'applications/almanac/query/AlmanacPropertyQuery.php', + 'AlmanacQuery' => 'applications/almanac/query/AlmanacQuery.php', + 'AlmanacSchemaSpec' => 'applications/almanac/storage/AlmanacSchemaSpec.php', + 'AlmanacSearchEngineAttachment' => 'applications/almanac/engineextension/AlmanacSearchEngineAttachment.php', + 'AlmanacService' => 'applications/almanac/storage/AlmanacService.php', + 'AlmanacServiceController' => 'applications/almanac/controller/AlmanacServiceController.php', + 'AlmanacServiceDatasource' => 'applications/almanac/typeahead/AlmanacServiceDatasource.php', + 'AlmanacServiceDeletePropertyTransaction' => 'applications/almanac/xaction/AlmanacServiceDeletePropertyTransaction.php', + 'AlmanacServiceEditConduitAPIMethod' => 'applications/almanac/conduit/AlmanacServiceEditConduitAPIMethod.php', + 'AlmanacServiceEditController' => 'applications/almanac/controller/AlmanacServiceEditController.php', + 'AlmanacServiceEditEngine' => 'applications/almanac/editor/AlmanacServiceEditEngine.php', + 'AlmanacServiceEditor' => 'applications/almanac/editor/AlmanacServiceEditor.php', + 'AlmanacServiceListController' => 'applications/almanac/controller/AlmanacServiceListController.php', + 'AlmanacServiceNameNgrams' => 'applications/almanac/storage/AlmanacServiceNameNgrams.php', + 'AlmanacServiceNameTransaction' => 'applications/almanac/xaction/AlmanacServiceNameTransaction.php', + 'AlmanacServicePHIDType' => 'applications/almanac/phid/AlmanacServicePHIDType.php', + 'AlmanacServicePropertyEditEngine' => 'applications/almanac/editor/AlmanacServicePropertyEditEngine.php', + 'AlmanacServiceQuery' => 'applications/almanac/query/AlmanacServiceQuery.php', + 'AlmanacServiceSearchConduitAPIMethod' => 'applications/almanac/conduit/AlmanacServiceSearchConduitAPIMethod.php', + 'AlmanacServiceSearchEngine' => 'applications/almanac/query/AlmanacServiceSearchEngine.php', + 'AlmanacServiceSetPropertyTransaction' => 'applications/almanac/xaction/AlmanacServiceSetPropertyTransaction.php', + 'AlmanacServiceTransaction' => 'applications/almanac/storage/AlmanacServiceTransaction.php', + 'AlmanacServiceTransactionQuery' => 'applications/almanac/query/AlmanacServiceTransactionQuery.php', + 'AlmanacServiceTransactionType' => 'applications/almanac/xaction/AlmanacServiceTransactionType.php', + 'AlmanacServiceType' => 'applications/almanac/servicetype/AlmanacServiceType.php', + 'AlmanacServiceTypeDatasource' => 'applications/almanac/typeahead/AlmanacServiceTypeDatasource.php', + 'AlmanacServiceTypeTestCase' => 'applications/almanac/servicetype/__tests__/AlmanacServiceTypeTestCase.php', + 'AlmanacServiceTypeTransaction' => 'applications/almanac/xaction/AlmanacServiceTypeTransaction.php', + 'AlmanacServiceViewController' => 'applications/almanac/controller/AlmanacServiceViewController.php', + 'AlmanacSetPropertyEditField' => 'applications/almanac/engineextension/AlmanacSetPropertyEditField.php', + 'AlmanacSetPropertyEditType' => 'applications/almanac/engineextension/AlmanacSetPropertyEditType.php', + 'AlmanacTransactionType' => 'applications/almanac/xaction/AlmanacTransactionType.php', + 'AphlictDropdownDataQuery' => 'applications/aphlict/query/AphlictDropdownDataQuery.php', 'Aphront304Response' => 'aphront/response/Aphront304Response.php', 'Aphront400Response' => 'aphront/response/Aphront400Response.php', 'Aphront403Response' => 'aphront/response/Aphront403Response.php', 'Aphront404Response' => 'aphront/response/Aphront404Response.php', - 'AphrontAbstractAttachedFileView' => 'view/control/AphrontAbstractAttachedFileView.php', + 'AphrontAccessDeniedQueryException' => 'infrastructure/storage/exception/AphrontAccessDeniedQueryException.php', 'AphrontAjaxResponse' => 'aphront/response/AphrontAjaxResponse.php', 'AphrontApplicationConfiguration' => 'aphront/configuration/AphrontApplicationConfiguration.php', + 'AphrontAutoIDView' => 'view/AphrontAutoIDView.php', 'AphrontBarView' => 'view/widget/bars/AphrontBarView.php', - 'AphrontCSRFException' => 'aphront/exception/AphrontCSRFException.php', + 'AphrontBaseMySQLDatabaseConnection' => 'infrastructure/storage/connection/mysql/AphrontBaseMySQLDatabaseConnection.php', + 'AphrontBoolHTTPParameterType' => 'aphront/httpparametertype/AphrontBoolHTTPParameterType.php', 'AphrontCalendarEventView' => 'applications/calendar/view/AphrontCalendarEventView.php', - 'AphrontCalendarMonthView' => 'applications/calendar/view/AphrontCalendarMonthView.php', - 'AphrontContextBarView' => 'view/layout/AphrontContextBarView.php', + 'AphrontCharacterSetQueryException' => 'infrastructure/storage/exception/AphrontCharacterSetQueryException.php', + 'AphrontConnectionLostQueryException' => 'infrastructure/storage/exception/AphrontConnectionLostQueryException.php', + 'AphrontConnectionQueryException' => 'infrastructure/storage/exception/AphrontConnectionQueryException.php', 'AphrontController' => 'aphront/AphrontController.php', + 'AphrontCountQueryException' => 'infrastructure/storage/exception/AphrontCountQueryException.php', 'AphrontCursorPagerView' => 'view/control/AphrontCursorPagerView.php', - 'AphrontDefaultApplicationConfiguration' => 'aphront/configuration/AphrontDefaultApplicationConfiguration.php', + 'AphrontDatabaseConnection' => 'infrastructure/storage/connection/AphrontDatabaseConnection.php', + 'AphrontDatabaseTableRef' => 'infrastructure/storage/xsprintf/AphrontDatabaseTableRef.php', + 'AphrontDatabaseTableRefInterface' => 'infrastructure/storage/xsprintf/AphrontDatabaseTableRefInterface.php', + 'AphrontDatabaseTransactionState' => 'infrastructure/storage/connection/AphrontDatabaseTransactionState.php', + 'AphrontDeadlockQueryException' => 'infrastructure/storage/exception/AphrontDeadlockQueryException.php', 'AphrontDialogResponse' => 'aphront/response/AphrontDialogResponse.php', 'AphrontDialogView' => 'view/AphrontDialogView.php', - 'AphrontErrorView' => 'view/form/AphrontErrorView.php', + 'AphrontDuplicateKeyQueryException' => 'infrastructure/storage/exception/AphrontDuplicateKeyQueryException.php', + 'AphrontEpochHTTPParameterType' => 'aphront/httpparametertype/AphrontEpochHTTPParameterType.php', 'AphrontException' => 'aphront/exception/AphrontException.php', + 'AphrontFileHTTPParameterType' => 'aphront/httpparametertype/AphrontFileHTTPParameterType.php', 'AphrontFileResponse' => 'aphront/response/AphrontFileResponse.php', 'AphrontFormCheckboxControl' => 'view/form/control/AphrontFormCheckboxControl.php', 'AphrontFormControl' => 'view/form/control/AphrontFormControl.php', - 'AphrontFormCountedToggleButtonsControl' => 'view/form/control/AphrontFormCountedToggleButtonsControl.php', - 'AphrontFormCropControl' => 'view/form/control/AphrontFormCropControl.php', 'AphrontFormDateControl' => 'view/form/control/AphrontFormDateControl.php', + 'AphrontFormDateControlValue' => 'view/form/control/AphrontFormDateControlValue.php', 'AphrontFormDividerControl' => 'view/form/control/AphrontFormDividerControl.php', 'AphrontFormFileControl' => 'view/form/control/AphrontFormFileControl.php', - 'AphrontFormImageControl' => 'view/form/control/AphrontFormImageControl.php', - 'AphrontFormInsetView' => 'view/form/AphrontFormInsetView.php', - 'AphrontFormLayoutView' => 'view/form/AphrontFormLayoutView.php', + 'AphrontFormHandlesControl' => 'view/form/control/AphrontFormHandlesControl.php', 'AphrontFormMarkupControl' => 'view/form/control/AphrontFormMarkupControl.php', 'AphrontFormPasswordControl' => 'view/form/control/AphrontFormPasswordControl.php', 'AphrontFormPolicyControl' => 'view/form/control/AphrontFormPolicyControl.php', @@ -50,618 +222,1544 @@ 'AphrontFormSubmitControl' => 'view/form/control/AphrontFormSubmitControl.php', 'AphrontFormTextAreaControl' => 'view/form/control/AphrontFormTextAreaControl.php', 'AphrontFormTextControl' => 'view/form/control/AphrontFormTextControl.php', - 'AphrontFormToggleButtonsControl' => 'view/form/control/AphrontFormToggleButtonsControl.php', + 'AphrontFormTextWithSubmitControl' => 'view/form/control/AphrontFormTextWithSubmitControl.php', 'AphrontFormTokenizerControl' => 'view/form/control/AphrontFormTokenizerControl.php', + 'AphrontFormTypeaheadControl' => 'view/form/control/AphrontFormTypeaheadControl.php', 'AphrontFormView' => 'view/form/AphrontFormView.php', 'AphrontGlyphBarView' => 'view/widget/bars/AphrontGlyphBarView.php', 'AphrontHTMLResponse' => 'aphront/response/AphrontHTMLResponse.php', + 'AphrontHTTPHeaderParser' => 'aphront/headerparser/AphrontHTTPHeaderParser.php', + 'AphrontHTTPHeaderParserTestCase' => 'aphront/headerparser/__tests__/AphrontHTTPHeaderParserTestCase.php', + 'AphrontHTTPParameterType' => 'aphront/httpparametertype/AphrontHTTPParameterType.php', + 'AphrontHTTPProxyResponse' => 'aphront/response/AphrontHTTPProxyResponse.php', 'AphrontHTTPSink' => 'aphront/sink/AphrontHTTPSink.php', 'AphrontHTTPSinkTestCase' => 'aphront/sink/__tests__/AphrontHTTPSinkTestCase.php', + 'AphrontIntHTTPParameterType' => 'aphront/httpparametertype/AphrontIntHTTPParameterType.php', + 'AphrontInvalidCredentialsQueryException' => 'infrastructure/storage/exception/AphrontInvalidCredentialsQueryException.php', + 'AphrontIsolatedDatabaseConnection' => 'infrastructure/storage/connection/AphrontIsolatedDatabaseConnection.php', 'AphrontIsolatedDatabaseConnectionTestCase' => 'infrastructure/storage/__tests__/AphrontIsolatedDatabaseConnectionTestCase.php', 'AphrontIsolatedHTTPSink' => 'aphront/sink/AphrontIsolatedHTTPSink.php', + 'AphrontJSONHTTPParameterType' => 'aphront/httpparametertype/AphrontJSONHTTPParameterType.php', 'AphrontJSONResponse' => 'aphront/response/AphrontJSONResponse.php', 'AphrontJavelinView' => 'view/AphrontJavelinView.php', 'AphrontKeyboardShortcutsAvailableView' => 'view/widget/AphrontKeyboardShortcutsAvailableView.php', 'AphrontListFilterView' => 'view/layout/AphrontListFilterView.php', - 'AphrontMiniPanelView' => 'view/layout/AphrontMiniPanelView.php', + 'AphrontListHTTPParameterType' => 'aphront/httpparametertype/AphrontListHTTPParameterType.php', + 'AphrontLockTimeoutQueryException' => 'infrastructure/storage/exception/AphrontLockTimeoutQueryException.php', + 'AphrontMalformedRequestException' => 'aphront/exception/AphrontMalformedRequestException.php', 'AphrontMoreView' => 'view/layout/AphrontMoreView.php', 'AphrontMultiColumnView' => 'view/layout/AphrontMultiColumnView.php', + 'AphrontMultipartParser' => 'aphront/multipartparser/AphrontMultipartParser.php', + 'AphrontMultipartParserTestCase' => 'aphront/multipartparser/__tests__/AphrontMultipartParserTestCase.php', + 'AphrontMultipartPart' => 'aphront/multipartparser/AphrontMultipartPart.php', + 'AphrontMySQLDatabaseConnection' => 'infrastructure/storage/connection/mysql/AphrontMySQLDatabaseConnection.php', 'AphrontMySQLDatabaseConnectionTestCase' => 'infrastructure/storage/__tests__/AphrontMySQLDatabaseConnectionTestCase.php', - 'AphrontNoteView' => 'view/widget/AphrontNoteView.php', + 'AphrontMySQLiDatabaseConnection' => 'infrastructure/storage/connection/mysql/AphrontMySQLiDatabaseConnection.php', + 'AphrontNotSupportedQueryException' => 'infrastructure/storage/exception/AphrontNotSupportedQueryException.php', 'AphrontNullView' => 'view/AphrontNullView.php', + 'AphrontObjectMissingQueryException' => 'infrastructure/storage/exception/AphrontObjectMissingQueryException.php', + 'AphrontPHIDHTTPParameterType' => 'aphront/httpparametertype/AphrontPHIDHTTPParameterType.php', + 'AphrontPHIDListHTTPParameterType' => 'aphront/httpparametertype/AphrontPHIDListHTTPParameterType.php', 'AphrontPHPHTTPSink' => 'aphront/sink/AphrontPHPHTTPSink.php', 'AphrontPageView' => 'view/page/AphrontPageView.php', - 'AphrontPagerView' => 'view/control/AphrontPagerView.php', - 'AphrontPanelView' => 'view/layout/AphrontPanelView.php', + 'AphrontParameterQueryException' => 'infrastructure/storage/exception/AphrontParameterQueryException.php', 'AphrontPlainTextResponse' => 'aphront/response/AphrontPlainTextResponse.php', 'AphrontProgressBarView' => 'view/widget/bars/AphrontProgressBarView.php', + 'AphrontProjectListHTTPParameterType' => 'aphront/httpparametertype/AphrontProjectListHTTPParameterType.php', 'AphrontProxyResponse' => 'aphront/response/AphrontProxyResponse.php', - 'AphrontRedirectException' => 'aphront/exception/AphrontRedirectException.php', + 'AphrontQueryException' => 'infrastructure/storage/exception/AphrontQueryException.php', + 'AphrontQueryTimeoutQueryException' => 'infrastructure/storage/exception/AphrontQueryTimeoutQueryException.php', + 'AphrontRecoverableQueryException' => 'infrastructure/storage/exception/AphrontRecoverableQueryException.php', 'AphrontRedirectResponse' => 'aphront/response/AphrontRedirectResponse.php', + 'AphrontRedirectResponseTestCase' => 'aphront/response/__tests__/AphrontRedirectResponseTestCase.php', 'AphrontReloadResponse' => 'aphront/response/AphrontReloadResponse.php', + 'AphrontRemarkupHTTPParameterType' => 'aphront/httpparametertype/AphrontRemarkupHTTPParameterType.php', 'AphrontRequest' => 'aphront/AphrontRequest.php', - 'AphrontRequestFailureView' => 'view/page/AphrontRequestFailureView.php', + 'AphrontRequestExceptionHandler' => 'aphront/handler/AphrontRequestExceptionHandler.php', + 'AphrontRequestStream' => 'aphront/requeststream/AphrontRequestStream.php', 'AphrontRequestTestCase' => 'aphront/__tests__/AphrontRequestTestCase.php', 'AphrontResponse' => 'aphront/response/AphrontResponse.php', + 'AphrontResponseProducerInterface' => 'aphront/interface/AphrontResponseProducerInterface.php', + 'AphrontRoutingMap' => 'aphront/site/AphrontRoutingMap.php', + 'AphrontRoutingMapTestCase' => 'aphront/__tests__/AphrontRoutingMapTestCase.php', + 'AphrontRoutingResult' => 'aphront/site/AphrontRoutingResult.php', + 'AphrontSchemaQueryException' => 'infrastructure/storage/exception/AphrontSchemaQueryException.php', + 'AphrontScopedUnguardedWriteCapability' => 'aphront/writeguard/AphrontScopedUnguardedWriteCapability.php', + 'AphrontSelectHTTPParameterType' => 'aphront/httpparametertype/AphrontSelectHTTPParameterType.php', 'AphrontSideNavFilterView' => 'view/layout/AphrontSideNavFilterView.php', + 'AphrontSite' => 'aphront/site/AphrontSite.php', + 'AphrontStackTraceView' => 'view/widget/AphrontStackTraceView.php', + 'AphrontStandaloneHTMLResponse' => 'aphront/response/AphrontStandaloneHTMLResponse.php', + 'AphrontStringHTTPParameterType' => 'aphront/httpparametertype/AphrontStringHTTPParameterType.php', + 'AphrontStringListHTTPParameterType' => 'aphront/httpparametertype/AphrontStringListHTTPParameterType.php', 'AphrontTableView' => 'view/control/AphrontTableView.php', 'AphrontTagView' => 'view/AphrontTagView.php', 'AphrontTokenizerTemplateView' => 'view/control/AphrontTokenizerTemplateView.php', - 'AphrontTwoColumnView' => 'view/layout/AphrontTwoColumnView.php', 'AphrontTypeaheadTemplateView' => 'view/control/AphrontTypeaheadTemplateView.php', - 'AphrontURIMapper' => 'aphront/AphrontURIMapper.php', - 'AphrontUsageException' => 'aphront/exception/AphrontUsageException.php', + 'AphrontUnhandledExceptionResponse' => 'aphront/response/AphrontUnhandledExceptionResponse.php', + 'AphrontUserListHTTPParameterType' => 'aphront/httpparametertype/AphrontUserListHTTPParameterType.php', 'AphrontView' => 'view/AphrontView.php', 'AphrontWebpageResponse' => 'aphront/response/AphrontWebpageResponse.php', - 'AuditPeopleMenuEventListener' => 'applications/audit/events/AuditPeopleMenuEventListener.php', - 'CelerityAPI' => 'infrastructure/celerity/CelerityAPI.php', - 'CelerityPhabricatorResourceController' => 'infrastructure/celerity/CelerityPhabricatorResourceController.php', - 'CelerityResourceController' => 'infrastructure/celerity/CelerityResourceController.php', - 'CelerityResourceGraph' => 'infrastructure/celerity/CelerityResourceGraph.php', - 'CelerityResourceMap' => 'infrastructure/celerity/CelerityResourceMap.php', - 'CelerityResourceTransformer' => 'infrastructure/celerity/CelerityResourceTransformer.php', - 'CelerityResourceTransformerTestCase' => 'infrastructure/celerity/__tests__/CelerityResourceTransformerTestCase.php', - 'CeleritySpriteGenerator' => 'infrastructure/celerity/CeleritySpriteGenerator.php', - 'CelerityStaticResourceResponse' => 'infrastructure/celerity/CelerityStaticResourceResponse.php', + 'AphrontWriteGuard' => 'aphront/writeguard/AphrontWriteGuard.php', + 'ArcanistConduitAPIMethod' => 'applications/arcanist/conduit/ArcanistConduitAPIMethod.php', + 'AuditConduitAPIMethod' => 'applications/audit/conduit/AuditConduitAPIMethod.php', + 'AuditQueryConduitAPIMethod' => 'applications/audit/conduit/AuditQueryConduitAPIMethod.php', + 'AuthManageProvidersCapability' => 'applications/auth/capability/AuthManageProvidersCapability.php', + 'BulkParameterType' => 'applications/transactions/bulk/type/BulkParameterType.php', + 'BulkPointsParameterType' => 'applications/transactions/bulk/type/BulkPointsParameterType.php', + 'BulkRemarkupParameterType' => 'applications/transactions/bulk/type/BulkRemarkupParameterType.php', + 'BulkSelectParameterType' => 'applications/transactions/bulk/type/BulkSelectParameterType.php', + 'BulkStringParameterType' => 'applications/transactions/bulk/type/BulkStringParameterType.php', + 'BulkTokenizerParameterType' => 'applications/transactions/bulk/type/BulkTokenizerParameterType.php', + 'CalendarTimeUtil' => 'applications/calendar/util/CalendarTimeUtil.php', + 'CalendarTimeUtilTestCase' => 'applications/calendar/__tests__/CalendarTimeUtilTestCase.php', + 'CelerityAPI' => 'applications/celerity/CelerityAPI.php', + 'CelerityDarkModePostprocessor' => 'applications/celerity/postprocessor/CelerityDarkModePostprocessor.php', + 'CelerityDefaultPostprocessor' => 'applications/celerity/postprocessor/CelerityDefaultPostprocessor.php', + 'CelerityHighContrastPostprocessor' => 'applications/celerity/postprocessor/CelerityHighContrastPostprocessor.php', + 'CelerityLargeFontPostprocessor' => 'applications/celerity/postprocessor/CelerityLargeFontPostprocessor.php', + 'CelerityManagementMapWorkflow' => 'applications/celerity/management/CelerityManagementMapWorkflow.php', + 'CelerityManagementSyntaxWorkflow' => 'applications/celerity/management/CelerityManagementSyntaxWorkflow.php', + 'CelerityManagementWorkflow' => 'applications/celerity/management/CelerityManagementWorkflow.php', + 'CelerityPhabricatorResourceController' => 'applications/celerity/controller/CelerityPhabricatorResourceController.php', + 'CelerityPhabricatorResources' => 'applications/celerity/resources/CelerityPhabricatorResources.php', + 'CelerityPhysicalResources' => 'applications/celerity/resources/CelerityPhysicalResources.php', + 'CelerityPhysicalResourcesTestCase' => 'applications/celerity/resources/__tests__/CelerityPhysicalResourcesTestCase.php', + 'CelerityPostprocessor' => 'applications/celerity/postprocessor/CelerityPostprocessor.php', + 'CelerityPostprocessorTestCase' => 'applications/celerity/__tests__/CelerityPostprocessorTestCase.php', + 'CelerityRedGreenPostprocessor' => 'applications/celerity/postprocessor/CelerityRedGreenPostprocessor.php', + 'CelerityResourceController' => 'applications/celerity/controller/CelerityResourceController.php', + 'CelerityResourceGraph' => 'applications/celerity/CelerityResourceGraph.php', + 'CelerityResourceMap' => 'applications/celerity/CelerityResourceMap.php', + 'CelerityResourceMapGenerator' => 'applications/celerity/CelerityResourceMapGenerator.php', + 'CelerityResourceTransformer' => 'applications/celerity/CelerityResourceTransformer.php', + 'CelerityResourceTransformerTestCase' => 'applications/celerity/__tests__/CelerityResourceTransformerTestCase.php', + 'CelerityResources' => 'applications/celerity/resources/CelerityResources.php', + 'CelerityResourcesOnDisk' => 'applications/celerity/resources/CelerityResourcesOnDisk.php', + 'CeleritySpriteGenerator' => 'applications/celerity/CeleritySpriteGenerator.php', + 'CelerityStaticResourceResponse' => 'applications/celerity/CelerityStaticResourceResponse.php', + 'ChatLogConduitAPIMethod' => 'applications/chatlog/conduit/ChatLogConduitAPIMethod.php', + 'ChatLogQueryConduitAPIMethod' => 'applications/chatlog/conduit/ChatLogQueryConduitAPIMethod.php', + 'ChatLogRecordConduitAPIMethod' => 'applications/chatlog/conduit/ChatLogRecordConduitAPIMethod.php', + 'ConduitAPIDocumentationPage' => 'applications/conduit/data/ConduitAPIDocumentationPage.php', 'ConduitAPIMethod' => 'applications/conduit/method/ConduitAPIMethod.php', + 'ConduitAPIMethodTestCase' => 'applications/conduit/method/__tests__/ConduitAPIMethodTestCase.php', 'ConduitAPIRequest' => 'applications/conduit/protocol/ConduitAPIRequest.php', 'ConduitAPIResponse' => 'applications/conduit/protocol/ConduitAPIResponse.php', - 'ConduitAPI_arcanist_Method' => 'applications/arcanist/conduit/ConduitAPI_arcanist_Method.php', - 'ConduitAPI_arcanist_projectinfo_Method' => 'applications/arcanist/conduit/ConduitAPI_arcanist_projectinfo_Method.php', - 'ConduitAPI_audit_Method' => 'applications/audit/conduit/ConduitAPI_audit_Method.php', - 'ConduitAPI_audit_query_Method' => 'applications/audit/conduit/ConduitAPI_audit_query_Method.php', - 'ConduitAPI_chatlog_Method' => 'applications/chatlog/conduit/ConduitAPI_chatlog_Method.php', - 'ConduitAPI_chatlog_query_Method' => 'applications/chatlog/conduit/ConduitAPI_chatlog_query_Method.php', - 'ConduitAPI_chatlog_record_Method' => 'applications/chatlog/conduit/ConduitAPI_chatlog_record_Method.php', - 'ConduitAPI_conduit_connect_Method' => 'applications/conduit/method/ConduitAPI_conduit_connect_Method.php', - 'ConduitAPI_conduit_getcertificate_Method' => 'applications/conduit/method/ConduitAPI_conduit_getcertificate_Method.php', - 'ConduitAPI_conduit_ping_Method' => 'applications/conduit/method/ConduitAPI_conduit_ping_Method.php', - 'ConduitAPI_conduit_query_Method' => 'applications/conduit/method/ConduitAPI_conduit_query_Method.php', - 'ConduitAPI_conpherence_Method' => 'applications/conpherence/conduit/ConduitAPI_conpherence_Method.php', - 'ConduitAPI_conpherence_createthread_Method' => 'applications/conpherence/conduit/ConduitAPI_conpherence_createthread_Method.php', - 'ConduitAPI_conpherence_querythread_Method' => 'applications/conpherence/conduit/ConduitAPI_conpherence_querythread_Method.php', - 'ConduitAPI_conpherence_querytransaction_Method' => 'applications/conpherence/conduit/ConduitAPI_conpherence_querytransaction_Method.php', - 'ConduitAPI_conpherence_updatethread_Method' => 'applications/conpherence/conduit/ConduitAPI_conpherence_updatethread_Method.php', - 'ConduitAPI_differential_Method' => 'applications/differential/conduit/ConduitAPI_differential_Method.php', - 'ConduitAPI_differential_close_Method' => 'applications/differential/conduit/ConduitAPI_differential_close_Method.php', - 'ConduitAPI_differential_createcomment_Method' => 'applications/differential/conduit/ConduitAPI_differential_createcomment_Method.php', - 'ConduitAPI_differential_creatediff_Method' => 'applications/differential/conduit/ConduitAPI_differential_creatediff_Method.php', - 'ConduitAPI_differential_createinline_Method' => 'applications/differential/conduit/ConduitAPI_differential_createinline_Method.php', - 'ConduitAPI_differential_createrawdiff_Method' => 'applications/differential/conduit/ConduitAPI_differential_createrawdiff_Method.php', - 'ConduitAPI_differential_createrevision_Method' => 'applications/differential/conduit/ConduitAPI_differential_createrevision_Method.php', - 'ConduitAPI_differential_find_Method' => 'applications/differential/conduit/ConduitAPI_differential_find_Method.php', - 'ConduitAPI_differential_finishpostponedlinters_Method' => 'applications/differential/conduit/ConduitAPI_differential_finishpostponedlinters_Method.php', - 'ConduitAPI_differential_getalldiffs_Method' => 'applications/differential/conduit/ConduitAPI_differential_getalldiffs_Method.php', - 'ConduitAPI_differential_getcommitmessage_Method' => 'applications/differential/conduit/ConduitAPI_differential_getcommitmessage_Method.php', - 'ConduitAPI_differential_getcommitpaths_Method' => 'applications/differential/conduit/ConduitAPI_differential_getcommitpaths_Method.php', - 'ConduitAPI_differential_getdiff_Method' => 'applications/differential/conduit/ConduitAPI_differential_getdiff_Method.php', - 'ConduitAPI_differential_getrevision_Method' => 'applications/differential/conduit/ConduitAPI_differential_getrevision_Method.php', - 'ConduitAPI_differential_getrevisioncomments_Method' => 'applications/differential/conduit/ConduitAPI_differential_getrevisioncomments_Method.php', - 'ConduitAPI_differential_markcommitted_Method' => 'applications/differential/conduit/ConduitAPI_differential_markcommitted_Method.php', - 'ConduitAPI_differential_parsecommitmessage_Method' => 'applications/differential/conduit/ConduitAPI_differential_parsecommitmessage_Method.php', - 'ConduitAPI_differential_query_Method' => 'applications/differential/conduit/ConduitAPI_differential_query_Method.php', - 'ConduitAPI_differential_setdiffproperty_Method' => 'applications/differential/conduit/ConduitAPI_differential_setdiffproperty_Method.php', - 'ConduitAPI_differential_updaterevision_Method' => 'applications/differential/conduit/ConduitAPI_differential_updaterevision_Method.php', - 'ConduitAPI_differential_updateunitresults_Method' => 'applications/differential/conduit/ConduitAPI_differential_updateunitresults_Method.php', - 'ConduitAPI_diffusion_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_Method.php', - 'ConduitAPI_diffusion_abstractquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_abstractquery_Method.php', - 'ConduitAPI_diffusion_branchquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_branchquery_Method.php', - 'ConduitAPI_diffusion_browsequery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_browsequery_Method.php', - 'ConduitAPI_diffusion_commitbranchesquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_commitbranchesquery_Method.php', - 'ConduitAPI_diffusion_commitparentsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_commitparentsquery_Method.php', - 'ConduitAPI_diffusion_diffquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_diffquery_Method.php', - 'ConduitAPI_diffusion_existsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_existsquery_Method.php', - 'ConduitAPI_diffusion_expandshortcommitquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_expandshortcommitquery_Method.php', - 'ConduitAPI_diffusion_filecontentquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_filecontentquery_Method.php', - 'ConduitAPI_diffusion_findsymbols_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_findsymbols_Method.php', - 'ConduitAPI_diffusion_getcommits_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getcommits_Method.php', - 'ConduitAPI_diffusion_getlintmessages_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getlintmessages_Method.php', - 'ConduitAPI_diffusion_getrecentcommitsbypath_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getrecentcommitsbypath_Method.php', - 'ConduitAPI_diffusion_historyquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_historyquery_Method.php', - 'ConduitAPI_diffusion_lastmodifiedquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_lastmodifiedquery_Method.php', - 'ConduitAPI_diffusion_mergedcommitsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_mergedcommitsquery_Method.php', - 'ConduitAPI_diffusion_rawdiffquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_rawdiffquery_Method.php', - 'ConduitAPI_diffusion_readmequery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_readmequery_Method.php', - 'ConduitAPI_diffusion_refsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_refsquery_Method.php', - 'ConduitAPI_diffusion_searchquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_searchquery_Method.php', - 'ConduitAPI_diffusion_stablecommitnamequery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_stablecommitnamequery_Method.php', - 'ConduitAPI_diffusion_tagsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_tagsquery_Method.php', - 'ConduitAPI_feed_Method' => 'applications/feed/conduit/ConduitAPI_feed_Method.php', - 'ConduitAPI_feed_publish_Method' => 'applications/feed/conduit/ConduitAPI_feed_publish_Method.php', - 'ConduitAPI_feed_query_Method' => 'applications/feed/conduit/ConduitAPI_feed_query_Method.php', - 'ConduitAPI_file_Method' => 'applications/files/conduit/ConduitAPI_file_Method.php', - 'ConduitAPI_file_download_Method' => 'applications/files/conduit/ConduitAPI_file_download_Method.php', - 'ConduitAPI_file_info_Method' => 'applications/files/conduit/ConduitAPI_file_info_Method.php', - 'ConduitAPI_file_upload_Method' => 'applications/files/conduit/ConduitAPI_file_upload_Method.php', - 'ConduitAPI_file_uploadhash_Method' => 'applications/files/conduit/ConduitAPI_file_uploadhash_Method.php', - 'ConduitAPI_flag_Method' => 'applications/flag/conduit/ConduitAPI_flag_Method.php', - 'ConduitAPI_flag_delete_Method' => 'applications/flag/conduit/ConduitAPI_flag_delete_Method.php', - 'ConduitAPI_flag_edit_Method' => 'applications/flag/conduit/ConduitAPI_flag_edit_Method.php', - 'ConduitAPI_flag_query_Method' => 'applications/flag/conduit/ConduitAPI_flag_query_Method.php', - 'ConduitAPI_macro_Method' => 'applications/macro/conduit/ConduitAPI_macro_Method.php', - 'ConduitAPI_macro_creatememe_Method' => 'applications/macro/conduit/ConduitAPI_macro_creatememe_Method.php', - 'ConduitAPI_macro_query_Method' => 'applications/macro/conduit/ConduitAPI_macro_query_Method.php', - 'ConduitAPI_maniphest_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_Method.php', - 'ConduitAPI_maniphest_createtask_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_createtask_Method.php', - 'ConduitAPI_maniphest_find_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_find_Method.php', - 'ConduitAPI_maniphest_gettasktransactions_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_gettasktransactions_Method.php', - 'ConduitAPI_maniphest_info_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_info_Method.php', - 'ConduitAPI_maniphest_query_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_query_Method.php', - 'ConduitAPI_maniphest_update_Method' => 'applications/maniphest/conduit/ConduitAPI_maniphest_update_Method.php', - 'ConduitAPI_owners_Method' => 'applications/owners/conduit/ConduitAPI_owners_Method.php', - 'ConduitAPI_owners_query_Method' => 'applications/owners/conduit/ConduitAPI_owners_query_Method.php', - 'ConduitAPI_paste_Method' => 'applications/paste/conduit/ConduitAPI_paste_Method.php', - 'ConduitAPI_paste_create_Method' => 'applications/paste/conduit/ConduitAPI_paste_create_Method.php', - 'ConduitAPI_paste_info_Method' => 'applications/paste/conduit/ConduitAPI_paste_info_Method.php', - 'ConduitAPI_paste_query_Method' => 'applications/paste/conduit/ConduitAPI_paste_query_Method.php', - 'ConduitAPI_phid_Method' => 'applications/phid/conduit/ConduitAPI_phid_Method.php', - 'ConduitAPI_phid_info_Method' => 'applications/phid/conduit/ConduitAPI_phid_info_Method.php', - 'ConduitAPI_phid_lookup_Method' => 'applications/phid/conduit/ConduitAPI_phid_lookup_Method.php', - 'ConduitAPI_phid_query_Method' => 'applications/phid/conduit/ConduitAPI_phid_query_Method.php', - 'ConduitAPI_phpast_Method' => 'applications/phpast/conduit/ConduitAPI_phpast_Method.php', - 'ConduitAPI_phpast_getast_Method' => 'applications/phpast/conduit/ConduitAPI_phpast_getast_Method.php', - 'ConduitAPI_phpast_version_Method' => 'applications/phpast/conduit/ConduitAPI_phpast_version_Method.php', - 'ConduitAPI_phriction_Method' => 'applications/phriction/conduit/ConduitAPI_phriction_Method.php', - 'ConduitAPI_phriction_edit_Method' => 'applications/phriction/conduit/ConduitAPI_phriction_edit_Method.php', - 'ConduitAPI_phriction_history_Method' => 'applications/phriction/conduit/ConduitAPI_phriction_history_Method.php', - 'ConduitAPI_phriction_info_Method' => 'applications/phriction/conduit/ConduitAPI_phriction_info_Method.php', - 'ConduitAPI_project_Method' => 'applications/project/conduit/ConduitAPI_project_Method.php', - 'ConduitAPI_project_query_Method' => 'applications/project/conduit/ConduitAPI_project_query_Method.php', - 'ConduitAPI_releeph_Method' => 'applications/releeph/conduit/ConduitAPI_releeph_Method.php', - 'ConduitAPI_releeph_getbranches_Method' => 'applications/releeph/conduit/ConduitAPI_releeph_getbranches_Method.php', - 'ConduitAPI_releeph_projectinfo_Method' => 'applications/releeph/conduit/ConduitAPI_releeph_projectinfo_Method.php', - 'ConduitAPI_releeph_queryrequests_Method' => 'applications/releeph/conduit/ConduitAPI_releeph_queryrequests_Method.php', - 'ConduitAPI_releeph_request_Method' => 'applications/releeph/conduit/ConduitAPI_releeph_request_Method.php', - 'ConduitAPI_releephwork_canpush_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_canpush_Method.php', - 'ConduitAPI_releephwork_getauthorinfo_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_getauthorinfo_Method.php', - 'ConduitAPI_releephwork_getbranch_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_getbranch_Method.php', - 'ConduitAPI_releephwork_getbranchcommitmessage_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_getbranchcommitmessage_Method.php', - 'ConduitAPI_releephwork_getcommitmessage_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_getcommitmessage_Method.php', - 'ConduitAPI_releephwork_getorigcommitmessage_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_getorigcommitmessage_Method.php', - 'ConduitAPI_releephwork_nextrequest_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_nextrequest_Method.php', - 'ConduitAPI_releephwork_record_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_record_Method.php', - 'ConduitAPI_releephwork_recordpickstatus_Method' => 'applications/releeph/conduit/work/ConduitAPI_releephwork_recordpickstatus_Method.php', - 'ConduitAPI_remarkup_process_Method' => 'applications/remarkup/conduit/ConduitAPI_remarkup_process_Method.php', - 'ConduitAPI_repository_Method' => 'applications/repository/conduit/ConduitAPI_repository_Method.php', - 'ConduitAPI_repository_create_Method' => 'applications/repository/conduit/ConduitAPI_repository_create_Method.php', - 'ConduitAPI_repository_query_Method' => 'applications/repository/conduit/ConduitAPI_repository_query_Method.php', - 'ConduitAPI_slowvote_Method' => 'applications/slowvote/conduit/ConduitAPI_slowvote_Method.php', - 'ConduitAPI_slowvote_info_Method' => 'applications/slowvote/conduit/ConduitAPI_slowvote_info_Method.php', - 'ConduitAPI_token_Method' => 'applications/tokens/conduit/ConduitAPI_token_Method.php', - 'ConduitAPI_token_give_Method' => 'applications/tokens/conduit/ConduitAPI_token_give_Method.php', - 'ConduitAPI_token_given_Method' => 'applications/tokens/conduit/ConduitAPI_token_given_Method.php', - 'ConduitAPI_token_query_Method' => 'applications/tokens/conduit/ConduitAPI_token_query_Method.php', - 'ConduitAPI_user_Method' => 'applications/people/conduit/ConduitAPI_user_Method.php', - 'ConduitAPI_user_addstatus_Method' => 'applications/people/conduit/ConduitAPI_user_addstatus_Method.php', - 'ConduitAPI_user_disable_Method' => 'applications/people/conduit/ConduitAPI_user_disable_Method.php', - 'ConduitAPI_user_enable_Method' => 'applications/people/conduit/ConduitAPI_user_enable_Method.php', - 'ConduitAPI_user_find_Method' => 'applications/people/conduit/ConduitAPI_user_find_Method.php', - 'ConduitAPI_user_info_Method' => 'applications/people/conduit/ConduitAPI_user_info_Method.php', - 'ConduitAPI_user_query_Method' => 'applications/people/conduit/ConduitAPI_user_query_Method.php', - 'ConduitAPI_user_removestatus_Method' => 'applications/people/conduit/ConduitAPI_user_removestatus_Method.php', - 'ConduitAPI_user_whoami_Method' => 'applications/people/conduit/ConduitAPI_user_whoami_Method.php', + 'ConduitApplicationNotInstalledException' => 'applications/conduit/protocol/exception/ConduitApplicationNotInstalledException.php', + 'ConduitBoolParameterType' => 'applications/conduit/parametertype/ConduitBoolParameterType.php', 'ConduitCall' => 'applications/conduit/call/ConduitCall.php', 'ConduitCallTestCase' => 'applications/conduit/call/__tests__/ConduitCallTestCase.php', - 'ConduitException' => 'applications/conduit/protocol/ConduitException.php', + 'ConduitColumnsParameterType' => 'applications/conduit/parametertype/ConduitColumnsParameterType.php', + 'ConduitConnectConduitAPIMethod' => 'applications/conduit/method/ConduitConnectConduitAPIMethod.php', + 'ConduitConstantDescription' => 'applications/conduit/data/ConduitConstantDescription.php', + 'ConduitEpochParameterType' => 'applications/conduit/parametertype/ConduitEpochParameterType.php', + 'ConduitException' => 'applications/conduit/protocol/exception/ConduitException.php', + 'ConduitGetCapabilitiesConduitAPIMethod' => 'applications/conduit/method/ConduitGetCapabilitiesConduitAPIMethod.php', + 'ConduitGetCertificateConduitAPIMethod' => 'applications/conduit/method/ConduitGetCertificateConduitAPIMethod.php', + 'ConduitIntListParameterType' => 'applications/conduit/parametertype/ConduitIntListParameterType.php', + 'ConduitIntParameterType' => 'applications/conduit/parametertype/ConduitIntParameterType.php', + 'ConduitListParameterType' => 'applications/conduit/parametertype/ConduitListParameterType.php', + 'ConduitLogGarbageCollector' => 'applications/conduit/garbagecollector/ConduitLogGarbageCollector.php', + 'ConduitMethodDoesNotExistException' => 'applications/conduit/protocol/exception/ConduitMethodDoesNotExistException.php', + 'ConduitMethodNotFoundException' => 'applications/conduit/protocol/exception/ConduitMethodNotFoundException.php', + 'ConduitPHIDListParameterType' => 'applications/conduit/parametertype/ConduitPHIDListParameterType.php', + 'ConduitPHIDParameterType' => 'applications/conduit/parametertype/ConduitPHIDParameterType.php', + 'ConduitParameterType' => 'applications/conduit/parametertype/ConduitParameterType.php', + 'ConduitPingConduitAPIMethod' => 'applications/conduit/method/ConduitPingConduitAPIMethod.php', + 'ConduitPointsParameterType' => 'applications/conduit/parametertype/ConduitPointsParameterType.php', + 'ConduitProjectListParameterType' => 'applications/conduit/parametertype/ConduitProjectListParameterType.php', + 'ConduitQueryConduitAPIMethod' => 'applications/conduit/method/ConduitQueryConduitAPIMethod.php', + 'ConduitResultSearchEngineExtension' => 'applications/conduit/query/ConduitResultSearchEngineExtension.php', 'ConduitSSHWorkflow' => 'applications/conduit/ssh/ConduitSSHWorkflow.php', - 'ConpherenceConfigOptions' => 'applications/conpherence/config/ConpherenceConfigOptions.php', + 'ConduitStringListParameterType' => 'applications/conduit/parametertype/ConduitStringListParameterType.php', + 'ConduitStringParameterType' => 'applications/conduit/parametertype/ConduitStringParameterType.php', + 'ConduitTokenGarbageCollector' => 'applications/conduit/garbagecollector/ConduitTokenGarbageCollector.php', + 'ConduitUserListParameterType' => 'applications/conduit/parametertype/ConduitUserListParameterType.php', + 'ConduitUserParameterType' => 'applications/conduit/parametertype/ConduitUserParameterType.php', + 'ConduitWildParameterType' => 'applications/conduit/parametertype/ConduitWildParameterType.php', + 'ConpherenceColumnViewController' => 'applications/conpherence/controller/ConpherenceColumnViewController.php', + 'ConpherenceConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceConduitAPIMethod.php', 'ConpherenceConstants' => 'applications/conpherence/constants/ConpherenceConstants.php', 'ConpherenceController' => 'applications/conpherence/controller/ConpherenceController.php', - 'ConpherenceCreateThreadMailReceiver' => 'applications/conpherence/mail/ConpherenceCreateThreadMailReceiver.php', + 'ConpherenceCreateThreadConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceCreateThreadConduitAPIMethod.php', 'ConpherenceDAO' => 'applications/conpherence/storage/ConpherenceDAO.php', + 'ConpherenceDurableColumnView' => 'applications/conpherence/view/ConpherenceDurableColumnView.php', + 'ConpherenceEditConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceEditConduitAPIMethod.php', + 'ConpherenceEditEngine' => 'applications/conpherence/editor/ConpherenceEditEngine.php', 'ConpherenceEditor' => 'applications/conpherence/editor/ConpherenceEditor.php', - 'ConpherenceFileWidgetView' => 'applications/conpherence/view/ConpherenceFileWidgetView.php', - 'ConpherenceHovercardEventListener' => 'applications/conpherence/events/ConpherenceHovercardEventListener.php', + 'ConpherenceFulltextQuery' => 'applications/conpherence/query/ConpherenceFulltextQuery.php', + 'ConpherenceIndex' => 'applications/conpherence/storage/ConpherenceIndex.php', 'ConpherenceLayoutView' => 'applications/conpherence/view/ConpherenceLayoutView.php', 'ConpherenceListController' => 'applications/conpherence/controller/ConpherenceListController.php', 'ConpherenceMenuItemView' => 'applications/conpherence/view/ConpherenceMenuItemView.php', - 'ConpherenceNewController' => 'applications/conpherence/controller/ConpherenceNewController.php', 'ConpherenceNotificationPanelController' => 'applications/conpherence/controller/ConpherenceNotificationPanelController.php', 'ConpherenceParticipant' => 'applications/conpherence/storage/ConpherenceParticipant.php', + 'ConpherenceParticipantController' => 'applications/conpherence/controller/ConpherenceParticipantController.php', 'ConpherenceParticipantCountQuery' => 'applications/conpherence/query/ConpherenceParticipantCountQuery.php', 'ConpherenceParticipantQuery' => 'applications/conpherence/query/ConpherenceParticipantQuery.php', - 'ConpherenceParticipationStatus' => 'applications/conpherence/constants/ConpherenceParticipationStatus.php', - 'ConpherencePeopleMenuEventListener' => 'applications/conpherence/events/ConpherencePeopleMenuEventListener.php', - 'ConpherencePeopleWidgetView' => 'applications/conpherence/view/ConpherencePeopleWidgetView.php', + 'ConpherenceParticipantView' => 'applications/conpherence/view/ConpherenceParticipantView.php', + 'ConpherenceQueryThreadConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceQueryThreadConduitAPIMethod.php', + 'ConpherenceQueryTransactionConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceQueryTransactionConduitAPIMethod.php', 'ConpherenceReplyHandler' => 'applications/conpherence/mail/ConpherenceReplyHandler.php', - 'ConpherenceSettings' => 'applications/conpherence/constants/ConpherenceSettings.php', + 'ConpherenceRoomEditController' => 'applications/conpherence/controller/ConpherenceRoomEditController.php', + 'ConpherenceRoomListController' => 'applications/conpherence/controller/ConpherenceRoomListController.php', + 'ConpherenceRoomPictureController' => 'applications/conpherence/controller/ConpherenceRoomPictureController.php', + 'ConpherenceRoomPreferencesController' => 'applications/conpherence/controller/ConpherenceRoomPreferencesController.php', + 'ConpherenceRoomSettings' => 'applications/conpherence/constants/ConpherenceRoomSettings.php', + 'ConpherenceRoomTestCase' => 'applications/conpherence/__tests__/ConpherenceRoomTestCase.php', + 'ConpherenceSchemaSpec' => 'applications/conpherence/storage/ConpherenceSchemaSpec.php', + 'ConpherenceTestCase' => 'applications/conpherence/__tests__/ConpherenceTestCase.php', 'ConpherenceThread' => 'applications/conpherence/storage/ConpherenceThread.php', + 'ConpherenceThreadDatasource' => 'applications/conpherence/typeahead/ConpherenceThreadDatasource.php', + 'ConpherenceThreadDateMarkerTransaction' => 'applications/conpherence/xaction/ConpherenceThreadDateMarkerTransaction.php', + 'ConpherenceThreadIndexEngineExtension' => 'applications/conpherence/engineextension/ConpherenceThreadIndexEngineExtension.php', 'ConpherenceThreadListView' => 'applications/conpherence/view/ConpherenceThreadListView.php', 'ConpherenceThreadMailReceiver' => 'applications/conpherence/mail/ConpherenceThreadMailReceiver.php', + 'ConpherenceThreadMembersPolicyRule' => 'applications/conpherence/policyrule/ConpherenceThreadMembersPolicyRule.php', + 'ConpherenceThreadParticipantsTransaction' => 'applications/conpherence/xaction/ConpherenceThreadParticipantsTransaction.php', + 'ConpherenceThreadPictureTransaction' => 'applications/conpherence/xaction/ConpherenceThreadPictureTransaction.php', 'ConpherenceThreadQuery' => 'applications/conpherence/query/ConpherenceThreadQuery.php', - 'ConpherenceTimeUtil' => 'applications/conpherence/util/ConpherenceTimeUtil.php', - 'ConpherenceTimeUtilTestCase' => 'applications/conpherence/__tests__/ConpherenceTimeUtilTestCase.php', + 'ConpherenceThreadRemarkupRule' => 'applications/conpherence/remarkup/ConpherenceThreadRemarkupRule.php', + 'ConpherenceThreadSearchController' => 'applications/conpherence/controller/ConpherenceThreadSearchController.php', + 'ConpherenceThreadSearchEngine' => 'applications/conpherence/query/ConpherenceThreadSearchEngine.php', + 'ConpherenceThreadTitleNgrams' => 'applications/conpherence/storage/ConpherenceThreadTitleNgrams.php', + 'ConpherenceThreadTitleTransaction' => 'applications/conpherence/xaction/ConpherenceThreadTitleTransaction.php', + 'ConpherenceThreadTopicTransaction' => 'applications/conpherence/xaction/ConpherenceThreadTopicTransaction.php', + 'ConpherenceThreadTransactionType' => 'applications/conpherence/xaction/ConpherenceThreadTransactionType.php', 'ConpherenceTransaction' => 'applications/conpherence/storage/ConpherenceTransaction.php', 'ConpherenceTransactionComment' => 'applications/conpherence/storage/ConpherenceTransactionComment.php', 'ConpherenceTransactionQuery' => 'applications/conpherence/query/ConpherenceTransactionQuery.php', - 'ConpherenceTransactionType' => 'applications/conpherence/constants/ConpherenceTransactionType.php', + 'ConpherenceTransactionRenderer' => 'applications/conpherence/ConpherenceTransactionRenderer.php', 'ConpherenceTransactionView' => 'applications/conpherence/view/ConpherenceTransactionView.php', 'ConpherenceUpdateActions' => 'applications/conpherence/constants/ConpherenceUpdateActions.php', 'ConpherenceUpdateController' => 'applications/conpherence/controller/ConpherenceUpdateController.php', + 'ConpherenceUpdateThreadConduitAPIMethod' => 'applications/conpherence/conduit/ConpherenceUpdateThreadConduitAPIMethod.php', 'ConpherenceViewController' => 'applications/conpherence/controller/ConpherenceViewController.php', - 'ConpherenceWidgetController' => 'applications/conpherence/controller/ConpherenceWidgetController.php', - 'ConpherenceWidgetView' => 'applications/conpherence/view/ConpherenceWidgetView.php', - 'DarkConsoleController' => 'aphront/console/DarkConsoleController.php', - 'DarkConsoleCore' => 'aphront/console/DarkConsoleCore.php', - 'DarkConsoleDataController' => 'aphront/console/DarkConsoleDataController.php', - 'DarkConsoleErrorLogPlugin' => 'aphront/console/plugin/DarkConsoleErrorLogPlugin.php', - 'DarkConsoleErrorLogPluginAPI' => 'aphront/console/plugin/errorlog/DarkConsoleErrorLogPluginAPI.php', - 'DarkConsoleEventPlugin' => 'aphront/console/plugin/DarkConsoleEventPlugin.php', - 'DarkConsoleEventPluginAPI' => 'aphront/console/plugin/event/DarkConsoleEventPluginAPI.php', - 'DarkConsolePlugin' => 'aphront/console/plugin/DarkConsolePlugin.php', - 'DarkConsoleRequestPlugin' => 'aphront/console/plugin/DarkConsoleRequestPlugin.php', - 'DarkConsoleServicesPlugin' => 'aphront/console/plugin/DarkConsoleServicesPlugin.php', - 'DarkConsoleXHProfPlugin' => 'aphront/console/plugin/DarkConsoleXHProfPlugin.php', - 'DarkConsoleXHProfPluginAPI' => 'aphront/console/plugin/xhprof/DarkConsoleXHProfPluginAPI.php', - 'DatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DatabaseConfigurationProvider.php', - 'DefaultDatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DefaultDatabaseConfigurationProvider.php', + 'CountdownEditConduitAPIMethod' => 'applications/countdown/conduit/CountdownEditConduitAPIMethod.php', + 'CountdownSearchConduitAPIMethod' => 'applications/countdown/conduit/CountdownSearchConduitAPIMethod.php', + 'DarkConsoleController' => 'applications/console/controller/DarkConsoleController.php', + 'DarkConsoleCore' => 'applications/console/core/DarkConsoleCore.php', + 'DarkConsoleDataController' => 'applications/console/controller/DarkConsoleDataController.php', + 'DarkConsoleErrorLogPlugin' => 'applications/console/plugin/DarkConsoleErrorLogPlugin.php', + 'DarkConsoleErrorLogPluginAPI' => 'applications/console/plugin/errorlog/DarkConsoleErrorLogPluginAPI.php', + 'DarkConsoleEventPlugin' => 'applications/console/plugin/DarkConsoleEventPlugin.php', + 'DarkConsoleEventPluginAPI' => 'applications/console/plugin/event/DarkConsoleEventPluginAPI.php', + 'DarkConsolePlugin' => 'applications/console/plugin/DarkConsolePlugin.php', + 'DarkConsoleRealtimePlugin' => 'applications/console/plugin/DarkConsoleRealtimePlugin.php', + 'DarkConsoleRequestPlugin' => 'applications/console/plugin/DarkConsoleRequestPlugin.php', + 'DarkConsoleServicesPlugin' => 'applications/console/plugin/DarkConsoleServicesPlugin.php', + 'DarkConsoleStartupPlugin' => 'applications/console/plugin/DarkConsoleStartupPlugin.php', + 'DarkConsoleXHProfPlugin' => 'applications/console/plugin/DarkConsoleXHProfPlugin.php', + 'DarkConsoleXHProfPluginAPI' => 'applications/console/plugin/xhprof/DarkConsoleXHProfPluginAPI.php', 'DifferentialAction' => 'applications/differential/constants/DifferentialAction.php', - 'DifferentialActionHasNoEffectException' => 'applications/differential/exception/DifferentialActionHasNoEffectException.php', - 'DifferentialAddCommentView' => 'applications/differential/view/DifferentialAddCommentView.php', + 'DifferentialActionEmailCommand' => 'applications/differential/command/DifferentialActionEmailCommand.php', + 'DifferentialAdjustmentMapTestCase' => 'applications/differential/storage/__tests__/DifferentialAdjustmentMapTestCase.php', 'DifferentialAffectedPath' => 'applications/differential/storage/DifferentialAffectedPath.php', - 'DifferentialApplyPatchFieldSpecification' => 'applications/differential/field/specification/DifferentialApplyPatchFieldSpecification.php', - 'DifferentialArcanistProjectFieldSpecification' => 'applications/differential/field/specification/DifferentialArcanistProjectFieldSpecification.php', - 'DifferentialAsanaRepresentationFieldSpecification' => 'applications/differential/field/specification/DifferentialAsanaRepresentationFieldSpecification.php', - 'DifferentialAuditorsFieldSpecification' => 'applications/differential/field/specification/DifferentialAuditorsFieldSpecification.php', - 'DifferentialAuthorFieldSpecification' => 'applications/differential/field/specification/DifferentialAuthorFieldSpecification.php', - 'DifferentialAuxiliaryField' => 'applications/differential/storage/DifferentialAuxiliaryField.php', - 'DifferentialBlameRevisionFieldSpecification' => 'applications/differential/field/specification/DifferentialBlameRevisionFieldSpecification.php', - 'DifferentialBranchFieldSpecification' => 'applications/differential/field/specification/DifferentialBranchFieldSpecification.php', - 'DifferentialCCWelcomeMail' => 'applications/differential/mail/DifferentialCCWelcomeMail.php', - 'DifferentialCCsFieldSpecification' => 'applications/differential/field/specification/DifferentialCCsFieldSpecification.php', + 'DifferentialAffectedPathEngine' => 'applications/differential/engine/DifferentialAffectedPathEngine.php', + 'DifferentialAsanaRepresentationField' => 'applications/differential/customfield/DifferentialAsanaRepresentationField.php', + 'DifferentialAuditorsCommitMessageField' => 'applications/differential/field/DifferentialAuditorsCommitMessageField.php', + 'DifferentialAuditorsField' => 'applications/differential/customfield/DifferentialAuditorsField.php', + 'DifferentialBlameRevisionCommitMessageField' => 'applications/differential/field/DifferentialBlameRevisionCommitMessageField.php', + 'DifferentialBlameRevisionField' => 'applications/differential/customfield/DifferentialBlameRevisionField.php', + 'DifferentialBlockHeraldAction' => 'applications/differential/herald/DifferentialBlockHeraldAction.php', + 'DifferentialBlockingReviewerDatasource' => 'applications/differential/typeahead/DifferentialBlockingReviewerDatasource.php', + 'DifferentialBranchField' => 'applications/differential/customfield/DifferentialBranchField.php', + 'DifferentialBuildableEngine' => 'applications/differential/harbormaster/DifferentialBuildableEngine.php', + 'DifferentialChangeDetailMailView' => 'applications/differential/mail/DifferentialChangeDetailMailView.php', + 'DifferentialChangeHeraldFieldGroup' => 'applications/differential/herald/DifferentialChangeHeraldFieldGroup.php', 'DifferentialChangeType' => 'applications/differential/constants/DifferentialChangeType.php', + 'DifferentialChangesSinceLastUpdateField' => 'applications/differential/customfield/DifferentialChangesSinceLastUpdateField.php', 'DifferentialChangeset' => 'applications/differential/storage/DifferentialChangeset.php', 'DifferentialChangesetDetailView' => 'applications/differential/view/DifferentialChangesetDetailView.php', - 'DifferentialChangesetFileTreeSideNavBuilder' => 'applications/differential/view/DifferentialChangesetFileTreeSideNavBuilder.php', + 'DifferentialChangesetEngine' => 'applications/differential/engine/DifferentialChangesetEngine.php', 'DifferentialChangesetHTMLRenderer' => 'applications/differential/render/DifferentialChangesetHTMLRenderer.php', + 'DifferentialChangesetListController' => 'applications/differential/controller/DifferentialChangesetListController.php', 'DifferentialChangesetListView' => 'applications/differential/view/DifferentialChangesetListView.php', + 'DifferentialChangesetOneUpMailRenderer' => 'applications/differential/render/DifferentialChangesetOneUpMailRenderer.php', 'DifferentialChangesetOneUpRenderer' => 'applications/differential/render/DifferentialChangesetOneUpRenderer.php', 'DifferentialChangesetOneUpTestRenderer' => 'applications/differential/render/DifferentialChangesetOneUpTestRenderer.php', + 'DifferentialChangesetPHIDType' => 'applications/differential/phid/DifferentialChangesetPHIDType.php', 'DifferentialChangesetParser' => 'applications/differential/parser/DifferentialChangesetParser.php', 'DifferentialChangesetParserTestCase' => 'applications/differential/parser/__tests__/DifferentialChangesetParserTestCase.php', + 'DifferentialChangesetQuery' => 'applications/differential/query/DifferentialChangesetQuery.php', 'DifferentialChangesetRenderer' => 'applications/differential/render/DifferentialChangesetRenderer.php', + 'DifferentialChangesetSearchConduitAPIMethod' => 'applications/differential/conduit/DifferentialChangesetSearchConduitAPIMethod.php', + 'DifferentialChangesetSearchEngine' => 'applications/differential/query/DifferentialChangesetSearchEngine.php', 'DifferentialChangesetTestRenderer' => 'applications/differential/render/DifferentialChangesetTestRenderer.php', 'DifferentialChangesetTwoUpRenderer' => 'applications/differential/render/DifferentialChangesetTwoUpRenderer.php', 'DifferentialChangesetTwoUpTestRenderer' => 'applications/differential/render/DifferentialChangesetTwoUpTestRenderer.php', 'DifferentialChangesetViewController' => 'applications/differential/controller/DifferentialChangesetViewController.php', - 'DifferentialComment' => 'applications/differential/storage/DifferentialComment.php', - 'DifferentialCommentEditor' => 'applications/differential/editor/DifferentialCommentEditor.php', - 'DifferentialCommentMail' => 'applications/differential/mail/DifferentialCommentMail.php', - 'DifferentialCommentPreviewController' => 'applications/differential/controller/DifferentialCommentPreviewController.php', - 'DifferentialCommentQuery' => 'applications/differential/query/DifferentialCommentQuery.php', - 'DifferentialCommentSaveController' => 'applications/differential/controller/DifferentialCommentSaveController.php', - 'DifferentialCommitsFieldSpecification' => 'applications/differential/field/specification/DifferentialCommitsFieldSpecification.php', - 'DifferentialConflictsFieldSpecification' => 'applications/differential/field/specification/DifferentialConflictsFieldSpecification.php', + 'DifferentialCloseConduitAPIMethod' => 'applications/differential/conduit/DifferentialCloseConduitAPIMethod.php', + 'DifferentialCommitMessageCustomField' => 'applications/differential/field/DifferentialCommitMessageCustomField.php', + 'DifferentialCommitMessageField' => 'applications/differential/field/DifferentialCommitMessageField.php', + 'DifferentialCommitMessageFieldTestCase' => 'applications/differential/field/__tests__/DifferentialCommitMessageFieldTestCase.php', + 'DifferentialCommitMessageParser' => 'applications/differential/parser/DifferentialCommitMessageParser.php', + 'DifferentialCommitMessageParserTestCase' => 'applications/differential/parser/__tests__/DifferentialCommitMessageParserTestCase.php', + 'DifferentialCommitsField' => 'applications/differential/customfield/DifferentialCommitsField.php', + 'DifferentialCommitsSearchEngineAttachment' => 'applications/differential/engineextension/DifferentialCommitsSearchEngineAttachment.php', + 'DifferentialConduitAPIMethod' => 'applications/differential/conduit/DifferentialConduitAPIMethod.php', + 'DifferentialConflictsCommitMessageField' => 'applications/differential/field/DifferentialConflictsCommitMessageField.php', + 'DifferentialConstantsModule' => 'applications/differential/constants/DifferentialConstantsModule.php', 'DifferentialController' => 'applications/differential/controller/DifferentialController.php', + 'DifferentialCoreCustomField' => 'applications/differential/customfield/DifferentialCoreCustomField.php', + 'DifferentialCreateCommentConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateCommentConduitAPIMethod.php', + 'DifferentialCreateDiffConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateDiffConduitAPIMethod.php', + 'DifferentialCreateInlineConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateInlineConduitAPIMethod.php', + 'DifferentialCreateMailReceiver' => 'applications/differential/mail/DifferentialCreateMailReceiver.php', + 'DifferentialCreateRawDiffConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateRawDiffConduitAPIMethod.php', + 'DifferentialCreateRevisionConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateRevisionConduitAPIMethod.php', + 'DifferentialCustomField' => 'applications/differential/customfield/DifferentialCustomField.php', + 'DifferentialCustomFieldDependsOnParser' => 'applications/differential/parser/DifferentialCustomFieldDependsOnParser.php', + 'DifferentialCustomFieldDependsOnParserTestCase' => 'applications/differential/parser/__tests__/DifferentialCustomFieldDependsOnParserTestCase.php', + 'DifferentialCustomFieldNumericIndex' => 'applications/differential/storage/DifferentialCustomFieldNumericIndex.php', + 'DifferentialCustomFieldRevertsParser' => 'applications/differential/parser/DifferentialCustomFieldRevertsParser.php', + 'DifferentialCustomFieldRevertsParserTestCase' => 'applications/differential/parser/__tests__/DifferentialCustomFieldRevertsParserTestCase.php', + 'DifferentialCustomFieldStorage' => 'applications/differential/storage/DifferentialCustomFieldStorage.php', + 'DifferentialCustomFieldStringIndex' => 'applications/differential/storage/DifferentialCustomFieldStringIndex.php', 'DifferentialDAO' => 'applications/differential/storage/DifferentialDAO.php', - 'DifferentialDateCreatedFieldSpecification' => 'applications/differential/field/specification/DifferentialDateCreatedFieldSpecification.php', - 'DifferentialDateModifiedFieldSpecification' => 'applications/differential/field/specification/DifferentialDateModifiedFieldSpecification.php', - 'DifferentialDefaultFieldSelector' => 'applications/differential/field/selector/DifferentialDefaultFieldSelector.php', - 'DifferentialDependenciesFieldSpecification' => 'applications/differential/field/specification/DifferentialDependenciesFieldSpecification.php', - 'DifferentialDependsOnFieldSpecification' => 'applications/differential/field/specification/DifferentialDependsOnFieldSpecification.php', + 'DifferentialDefaultViewCapability' => 'applications/differential/capability/DifferentialDefaultViewCapability.php', 'DifferentialDiff' => 'applications/differential/storage/DifferentialDiff.php', - 'DifferentialDiffContentMail' => 'applications/differential/mail/DifferentialDiffContentMail.php', + 'DifferentialDiffAffectedFilesHeraldField' => 'applications/differential/herald/DifferentialDiffAffectedFilesHeraldField.php', + 'DifferentialDiffAuthorHeraldField' => 'applications/differential/herald/DifferentialDiffAuthorHeraldField.php', + 'DifferentialDiffAuthorProjectsHeraldField' => 'applications/differential/herald/DifferentialDiffAuthorProjectsHeraldField.php', + 'DifferentialDiffContentAddedHeraldField' => 'applications/differential/herald/DifferentialDiffContentAddedHeraldField.php', + 'DifferentialDiffContentHeraldField' => 'applications/differential/herald/DifferentialDiffContentHeraldField.php', + 'DifferentialDiffContentRemovedHeraldField' => 'applications/differential/herald/DifferentialDiffContentRemovedHeraldField.php', 'DifferentialDiffCreateController' => 'applications/differential/controller/DifferentialDiffCreateController.php', + 'DifferentialDiffEditor' => 'applications/differential/editor/DifferentialDiffEditor.php', + 'DifferentialDiffExtractionEngine' => 'applications/differential/engine/DifferentialDiffExtractionEngine.php', + 'DifferentialDiffHeraldField' => 'applications/differential/herald/DifferentialDiffHeraldField.php', + 'DifferentialDiffHeraldFieldGroup' => 'applications/differential/herald/DifferentialDiffHeraldFieldGroup.php', + 'DifferentialDiffInlineCommentQuery' => 'applications/differential/query/DifferentialDiffInlineCommentQuery.php', + 'DifferentialDiffPHIDType' => 'applications/differential/phid/DifferentialDiffPHIDType.php', 'DifferentialDiffProperty' => 'applications/differential/storage/DifferentialDiffProperty.php', 'DifferentialDiffQuery' => 'applications/differential/query/DifferentialDiffQuery.php', - 'DifferentialDiffTableOfContentsView' => 'applications/differential/view/DifferentialDiffTableOfContentsView.php', + 'DifferentialDiffRepositoryHeraldField' => 'applications/differential/herald/DifferentialDiffRepositoryHeraldField.php', + 'DifferentialDiffRepositoryProjectsHeraldField' => 'applications/differential/herald/DifferentialDiffRepositoryProjectsHeraldField.php', + 'DifferentialDiffSearchConduitAPIMethod' => 'applications/differential/conduit/DifferentialDiffSearchConduitAPIMethod.php', + 'DifferentialDiffSearchEngine' => 'applications/differential/query/DifferentialDiffSearchEngine.php', 'DifferentialDiffTestCase' => 'applications/differential/storage/__tests__/DifferentialDiffTestCase.php', + 'DifferentialDiffTransaction' => 'applications/differential/storage/DifferentialDiffTransaction.php', + 'DifferentialDiffTransactionQuery' => 'applications/differential/query/DifferentialDiffTransactionQuery.php', 'DifferentialDiffViewController' => 'applications/differential/controller/DifferentialDiffViewController.php', - 'DifferentialDiffViewPolicyFieldSpecification' => 'applications/differential/field/specification/DifferentialDiffViewPolicyFieldSpecification.php', 'DifferentialDoorkeeperRevisionFeedStoryPublisher' => 'applications/differential/doorkeeper/DifferentialDoorkeeperRevisionFeedStoryPublisher.php', - 'DifferentialException' => 'applications/differential/exception/DifferentialException.php', - 'DifferentialExceptionMail' => 'applications/differential/mail/DifferentialExceptionMail.php', - 'DifferentialExportPatchFieldSpecification' => 'applications/differential/field/specification/DifferentialExportPatchFieldSpecification.php', - 'DifferentialFieldDataNotAvailableException' => 'applications/differential/field/exception/DifferentialFieldDataNotAvailableException.php', - 'DifferentialFieldParseException' => 'applications/differential/field/exception/DifferentialFieldParseException.php', - 'DifferentialFieldSelector' => 'applications/differential/field/selector/DifferentialFieldSelector.php', - 'DifferentialFieldSpecification' => 'applications/differential/field/specification/DifferentialFieldSpecification.php', - 'DifferentialFieldSpecificationIncompleteException' => 'applications/differential/field/exception/DifferentialFieldSpecificationIncompleteException.php', - 'DifferentialFieldValidationException' => 'applications/differential/field/exception/DifferentialFieldValidationException.php', - 'DifferentialFreeformFieldSpecification' => 'applications/differential/field/specification/DifferentialFreeformFieldSpecification.php', - 'DifferentialFreeformFieldTestCase' => 'applications/differential/field/specification/__tests__/DifferentialFreeformFieldTestCase.php', - 'DifferentialGitSVNIDFieldSpecification' => 'applications/differential/field/specification/DifferentialGitSVNIDFieldSpecification.php', - 'DifferentialHostFieldSpecification' => 'applications/differential/field/specification/DifferentialHostFieldSpecification.php', - 'DifferentialHovercardEventListener' => 'applications/differential/events/DifferentialHovercardEventListener.php', + 'DifferentialDraftField' => 'applications/differential/customfield/DifferentialDraftField.php', + 'DifferentialExactUserFunctionDatasource' => 'applications/differential/typeahead/DifferentialExactUserFunctionDatasource.php', + 'DifferentialFieldParseException' => 'applications/differential/exception/DifferentialFieldParseException.php', + 'DifferentialFieldValidationException' => 'applications/differential/exception/DifferentialFieldValidationException.php', + 'DifferentialFileTreeEngine' => 'applications/differential/engine/DifferentialFileTreeEngine.php', + 'DifferentialGetAllDiffsConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetAllDiffsConduitAPIMethod.php', + 'DifferentialGetCommitMessageConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetCommitMessageConduitAPIMethod.php', + 'DifferentialGetCommitPathsConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetCommitPathsConduitAPIMethod.php', + 'DifferentialGetDiffConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetDiffConduitAPIMethod.php', + 'DifferentialGetRawDiffConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetRawDiffConduitAPIMethod.php', + 'DifferentialGetRevisionCommentsConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetRevisionCommentsConduitAPIMethod.php', + 'DifferentialGetRevisionConduitAPIMethod' => 'applications/differential/conduit/DifferentialGetRevisionConduitAPIMethod.php', + 'DifferentialGetWorkingCopy' => 'applications/differential/DifferentialGetWorkingCopy.php', + 'DifferentialGitSVNIDCommitMessageField' => 'applications/differential/field/DifferentialGitSVNIDCommitMessageField.php', + 'DifferentialHarbormasterField' => 'applications/differential/customfield/DifferentialHarbormasterField.php', + 'DifferentialHeraldStateReasons' => 'applications/differential/herald/DifferentialHeraldStateReasons.php', + 'DifferentialHiddenComment' => 'applications/differential/storage/DifferentialHiddenComment.php', + 'DifferentialHostField' => 'applications/differential/customfield/DifferentialHostField.php', + 'DifferentialHovercardEngineExtension' => 'applications/differential/engineextension/DifferentialHovercardEngineExtension.php', 'DifferentialHunk' => 'applications/differential/storage/DifferentialHunk.php', 'DifferentialHunkParser' => 'applications/differential/parser/DifferentialHunkParser.php', 'DifferentialHunkParserTestCase' => 'applications/differential/parser/__tests__/DifferentialHunkParserTestCase.php', + 'DifferentialHunkQuery' => 'applications/differential/query/DifferentialHunkQuery.php', 'DifferentialHunkTestCase' => 'applications/differential/storage/__tests__/DifferentialHunkTestCase.php', 'DifferentialInlineComment' => 'applications/differential/storage/DifferentialInlineComment.php', 'DifferentialInlineCommentEditController' => 'applications/differential/controller/DifferentialInlineCommentEditController.php', - 'DifferentialInlineCommentEditView' => 'applications/differential/view/DifferentialInlineCommentEditView.php', - 'DifferentialInlineCommentPreviewController' => 'applications/differential/controller/DifferentialInlineCommentPreviewController.php', - 'DifferentialInlineCommentQuery' => 'applications/differential/query/DifferentialInlineCommentQuery.php', - 'DifferentialInlineCommentView' => 'applications/differential/view/DifferentialInlineCommentView.php', - 'DifferentialLinesFieldSpecification' => 'applications/differential/field/specification/DifferentialLinesFieldSpecification.php', - 'DifferentialLintFieldSpecification' => 'applications/differential/field/specification/DifferentialLintFieldSpecification.php', + 'DifferentialInlineCommentMailView' => 'applications/differential/mail/DifferentialInlineCommentMailView.php', + 'DifferentialJIRAIssuesCommitMessageField' => 'applications/differential/field/DifferentialJIRAIssuesCommitMessageField.php', + 'DifferentialJIRAIssuesField' => 'applications/differential/customfield/DifferentialJIRAIssuesField.php', + 'DifferentialLegacyQuery' => 'applications/differential/constants/DifferentialLegacyQuery.php', + 'DifferentialLineAdjustmentMap' => 'applications/differential/parser/DifferentialLineAdjustmentMap.php', + 'DifferentialLintField' => 'applications/differential/customfield/DifferentialLintField.php', 'DifferentialLintStatus' => 'applications/differential/constants/DifferentialLintStatus.php', 'DifferentialLocalCommitsView' => 'applications/differential/view/DifferentialLocalCommitsView.php', - 'DifferentialMail' => 'applications/differential/mail/DifferentialMail.php', - 'DifferentialMailPhase' => 'applications/differential/constants/DifferentialMailPhase.php', - 'DifferentialManiphestTasksFieldSpecification' => 'applications/differential/field/specification/DifferentialManiphestTasksFieldSpecification.php', - 'DifferentialNewDiffMail' => 'applications/differential/mail/DifferentialNewDiffMail.php', - 'DifferentialPHIDTypeRevision' => 'applications/differential/phid/DifferentialPHIDTypeRevision.php', + 'DifferentialMailEngineExtension' => 'applications/differential/engineextension/DifferentialMailEngineExtension.php', + 'DifferentialMailView' => 'applications/differential/mail/DifferentialMailView.php', + 'DifferentialManiphestTasksField' => 'applications/differential/customfield/DifferentialManiphestTasksField.php', + 'DifferentialNoReviewersDatasource' => 'applications/differential/typeahead/DifferentialNoReviewersDatasource.php', + 'DifferentialParseCacheGarbageCollector' => 'applications/differential/garbagecollector/DifferentialParseCacheGarbageCollector.php', + 'DifferentialParseCommitMessageConduitAPIMethod' => 'applications/differential/conduit/DifferentialParseCommitMessageConduitAPIMethod.php', 'DifferentialParseRenderTestCase' => 'applications/differential/__tests__/DifferentialParseRenderTestCase.php', - 'DifferentialPathFieldSpecification' => 'applications/differential/field/specification/DifferentialPathFieldSpecification.php', - 'DifferentialPeopleMenuEventListener' => 'applications/differential/events/DifferentialPeopleMenuEventListener.php', - 'DifferentialPrimaryPaneView' => 'applications/differential/view/DifferentialPrimaryPaneView.php', - 'DifferentialReleephRequestFieldSpecification' => 'applications/releeph/differential/DifferentialReleephRequestFieldSpecification.php', + 'DifferentialPathField' => 'applications/differential/customfield/DifferentialPathField.php', + 'DifferentialProjectReviewersField' => 'applications/differential/customfield/DifferentialProjectReviewersField.php', + 'DifferentialQueryConduitAPIMethod' => 'applications/differential/conduit/DifferentialQueryConduitAPIMethod.php', + 'DifferentialQueryDiffsConduitAPIMethod' => 'applications/differential/conduit/DifferentialQueryDiffsConduitAPIMethod.php', + 'DifferentialRawDiffRenderer' => 'applications/differential/render/DifferentialRawDiffRenderer.php', 'DifferentialRemarkupRule' => 'applications/differential/remarkup/DifferentialRemarkupRule.php', 'DifferentialReplyHandler' => 'applications/differential/mail/DifferentialReplyHandler.php', - 'DifferentialResultsTableView' => 'applications/differential/view/DifferentialResultsTableView.php', - 'DifferentialRevertPlanFieldSpecification' => 'applications/differential/field/specification/DifferentialRevertPlanFieldSpecification.php', - 'DifferentialReviewRequestMail' => 'applications/differential/mail/DifferentialReviewRequestMail.php', - 'DifferentialReviewedByFieldSpecification' => 'applications/differential/field/specification/DifferentialReviewedByFieldSpecification.php', + 'DifferentialRepositoryField' => 'applications/differential/customfield/DifferentialRepositoryField.php', + 'DifferentialRepositoryLookup' => 'applications/differential/query/DifferentialRepositoryLookup.php', + 'DifferentialRequiredSignaturesField' => 'applications/differential/customfield/DifferentialRequiredSignaturesField.php', + 'DifferentialResponsibleDatasource' => 'applications/differential/typeahead/DifferentialResponsibleDatasource.php', + 'DifferentialResponsibleUserDatasource' => 'applications/differential/typeahead/DifferentialResponsibleUserDatasource.php', + 'DifferentialResponsibleViewerFunctionDatasource' => 'applications/differential/typeahead/DifferentialResponsibleViewerFunctionDatasource.php', + 'DifferentialRevertPlanCommitMessageField' => 'applications/differential/field/DifferentialRevertPlanCommitMessageField.php', + 'DifferentialRevertPlanField' => 'applications/differential/customfield/DifferentialRevertPlanField.php', + 'DifferentialReviewedByCommitMessageField' => 'applications/differential/field/DifferentialReviewedByCommitMessageField.php', 'DifferentialReviewer' => 'applications/differential/storage/DifferentialReviewer.php', + 'DifferentialReviewerDatasource' => 'applications/differential/typeahead/DifferentialReviewerDatasource.php', + 'DifferentialReviewerForRevisionEdgeType' => 'applications/differential/edge/DifferentialReviewerForRevisionEdgeType.php', + 'DifferentialReviewerFunctionDatasource' => 'applications/differential/typeahead/DifferentialReviewerFunctionDatasource.php', 'DifferentialReviewerStatus' => 'applications/differential/constants/DifferentialReviewerStatus.php', - 'DifferentialReviewersFieldSpecification' => 'applications/differential/field/specification/DifferentialReviewersFieldSpecification.php', + 'DifferentialReviewersAddBlockingReviewersHeraldAction' => 'applications/differential/herald/DifferentialReviewersAddBlockingReviewersHeraldAction.php', + 'DifferentialReviewersAddBlockingSelfHeraldAction' => 'applications/differential/herald/DifferentialReviewersAddBlockingSelfHeraldAction.php', + 'DifferentialReviewersAddReviewersHeraldAction' => 'applications/differential/herald/DifferentialReviewersAddReviewersHeraldAction.php', + 'DifferentialReviewersAddSelfHeraldAction' => 'applications/differential/herald/DifferentialReviewersAddSelfHeraldAction.php', + 'DifferentialReviewersCommitMessageField' => 'applications/differential/field/DifferentialReviewersCommitMessageField.php', + 'DifferentialReviewersField' => 'applications/differential/customfield/DifferentialReviewersField.php', + 'DifferentialReviewersHeraldAction' => 'applications/differential/herald/DifferentialReviewersHeraldAction.php', + 'DifferentialReviewersSearchEngineAttachment' => 'applications/differential/engineextension/DifferentialReviewersSearchEngineAttachment.php', + 'DifferentialReviewersView' => 'applications/differential/view/DifferentialReviewersView.php', 'DifferentialRevision' => 'applications/differential/storage/DifferentialRevision.php', - 'DifferentialRevisionCommentListView' => 'applications/differential/view/DifferentialRevisionCommentListView.php', - 'DifferentialRevisionCommentView' => 'applications/differential/view/DifferentialRevisionCommentView.php', + 'DifferentialRevisionAbandonTransaction' => 'applications/differential/xaction/DifferentialRevisionAbandonTransaction.php', + 'DifferentialRevisionAcceptTransaction' => 'applications/differential/xaction/DifferentialRevisionAcceptTransaction.php', + 'DifferentialRevisionActionTransaction' => 'applications/differential/xaction/DifferentialRevisionActionTransaction.php', + 'DifferentialRevisionAffectedFilesHeraldField' => 'applications/differential/herald/DifferentialRevisionAffectedFilesHeraldField.php', + 'DifferentialRevisionAffectedPathsController' => 'applications/differential/controller/DifferentialRevisionAffectedPathsController.php', + 'DifferentialRevisionAuthorHeraldField' => 'applications/differential/herald/DifferentialRevisionAuthorHeraldField.php', + 'DifferentialRevisionAuthorPackagesHeraldField' => 'applications/differential/herald/DifferentialRevisionAuthorPackagesHeraldField.php', + 'DifferentialRevisionAuthorProjectsHeraldField' => 'applications/differential/herald/DifferentialRevisionAuthorProjectsHeraldField.php', + 'DifferentialRevisionAuthorTransaction' => 'applications/differential/xaction/DifferentialRevisionAuthorTransaction.php', + 'DifferentialRevisionBuildableTransaction' => 'applications/differential/xaction/DifferentialRevisionBuildableTransaction.php', + 'DifferentialRevisionCloseDetailsController' => 'applications/differential/controller/DifferentialRevisionCloseDetailsController.php', + 'DifferentialRevisionCloseTransaction' => 'applications/differential/xaction/DifferentialRevisionCloseTransaction.php', + 'DifferentialRevisionClosedStatusDatasource' => 'applications/differential/typeahead/DifferentialRevisionClosedStatusDatasource.php', + 'DifferentialRevisionCommandeerTransaction' => 'applications/differential/xaction/DifferentialRevisionCommandeerTransaction.php', + 'DifferentialRevisionContentAddedHeraldField' => 'applications/differential/herald/DifferentialRevisionContentAddedHeraldField.php', + 'DifferentialRevisionContentHeraldField' => 'applications/differential/herald/DifferentialRevisionContentHeraldField.php', + 'DifferentialRevisionContentRemovedHeraldField' => 'applications/differential/herald/DifferentialRevisionContentRemovedHeraldField.php', 'DifferentialRevisionControlSystem' => 'applications/differential/constants/DifferentialRevisionControlSystem.php', - 'DifferentialRevisionDetailRenderer' => 'applications/differential/controller/DifferentialRevisionDetailRenderer.php', - 'DifferentialRevisionDetailView' => 'applications/differential/view/DifferentialRevisionDetailView.php', + 'DifferentialRevisionDependedOnByRevisionEdgeType' => 'applications/differential/edge/DifferentialRevisionDependedOnByRevisionEdgeType.php', + 'DifferentialRevisionDependsOnRevisionEdgeType' => 'applications/differential/edge/DifferentialRevisionDependsOnRevisionEdgeType.php', + 'DifferentialRevisionDraftEngine' => 'applications/differential/engine/DifferentialRevisionDraftEngine.php', + 'DifferentialRevisionEditConduitAPIMethod' => 'applications/differential/conduit/DifferentialRevisionEditConduitAPIMethod.php', 'DifferentialRevisionEditController' => 'applications/differential/controller/DifferentialRevisionEditController.php', - 'DifferentialRevisionEditor' => 'applications/differential/editor/DifferentialRevisionEditor.php', - 'DifferentialRevisionIDFieldParserTestCase' => 'applications/differential/field/specification/__tests__/DifferentialRevisionIDFieldParserTestCase.php', - 'DifferentialRevisionIDFieldSpecification' => 'applications/differential/field/specification/DifferentialRevisionIDFieldSpecification.php', + 'DifferentialRevisionEditEngine' => 'applications/differential/editor/DifferentialRevisionEditEngine.php', + 'DifferentialRevisionFerretEngine' => 'applications/differential/search/DifferentialRevisionFerretEngine.php', + 'DifferentialRevisionFulltextEngine' => 'applications/differential/search/DifferentialRevisionFulltextEngine.php', + 'DifferentialRevisionGraph' => 'infrastructure/graph/DifferentialRevisionGraph.php', + 'DifferentialRevisionHasChildRelationship' => 'applications/differential/relationships/DifferentialRevisionHasChildRelationship.php', + 'DifferentialRevisionHasCommitEdgeType' => 'applications/differential/edge/DifferentialRevisionHasCommitEdgeType.php', + 'DifferentialRevisionHasCommitRelationship' => 'applications/differential/relationships/DifferentialRevisionHasCommitRelationship.php', + 'DifferentialRevisionHasParentRelationship' => 'applications/differential/relationships/DifferentialRevisionHasParentRelationship.php', + 'DifferentialRevisionHasReviewerEdgeType' => 'applications/differential/edge/DifferentialRevisionHasReviewerEdgeType.php', + 'DifferentialRevisionHasTaskEdgeType' => 'applications/differential/edge/DifferentialRevisionHasTaskEdgeType.php', + 'DifferentialRevisionHasTaskRelationship' => 'applications/differential/relationships/DifferentialRevisionHasTaskRelationship.php', + 'DifferentialRevisionHeraldField' => 'applications/differential/herald/DifferentialRevisionHeraldField.php', + 'DifferentialRevisionHeraldFieldGroup' => 'applications/differential/herald/DifferentialRevisionHeraldFieldGroup.php', + 'DifferentialRevisionHoldDraftTransaction' => 'applications/differential/xaction/DifferentialRevisionHoldDraftTransaction.php', + 'DifferentialRevisionIDCommitMessageField' => 'applications/differential/field/DifferentialRevisionIDCommitMessageField.php', + 'DifferentialRevisionInlineTransaction' => 'applications/differential/xaction/DifferentialRevisionInlineTransaction.php', + 'DifferentialRevisionInlinesController' => 'applications/differential/controller/DifferentialRevisionInlinesController.php', + 'DifferentialRevisionJIRAIssueURIsHeraldField' => 'applications/differential/herald/DifferentialRevisionJIRAIssueURIsHeraldField.php', 'DifferentialRevisionListController' => 'applications/differential/controller/DifferentialRevisionListController.php', 'DifferentialRevisionListView' => 'applications/differential/view/DifferentialRevisionListView.php', 'DifferentialRevisionMailReceiver' => 'applications/differential/mail/DifferentialRevisionMailReceiver.php', + 'DifferentialRevisionOpenStatusDatasource' => 'applications/differential/typeahead/DifferentialRevisionOpenStatusDatasource.php', + 'DifferentialRevisionOperationController' => 'applications/differential/controller/DifferentialRevisionOperationController.php', + 'DifferentialRevisionPHIDType' => 'applications/differential/phid/DifferentialRevisionPHIDType.php', + 'DifferentialRevisionPackageHeraldField' => 'applications/differential/herald/DifferentialRevisionPackageHeraldField.php', + 'DifferentialRevisionPackageOwnerHeraldField' => 'applications/differential/herald/DifferentialRevisionPackageOwnerHeraldField.php', + 'DifferentialRevisionPlanChangesTransaction' => 'applications/differential/xaction/DifferentialRevisionPlanChangesTransaction.php', 'DifferentialRevisionQuery' => 'applications/differential/query/DifferentialRevisionQuery.php', + 'DifferentialRevisionReclaimTransaction' => 'applications/differential/xaction/DifferentialRevisionReclaimTransaction.php', + 'DifferentialRevisionRejectTransaction' => 'applications/differential/xaction/DifferentialRevisionRejectTransaction.php', + 'DifferentialRevisionRelationship' => 'applications/differential/relationships/DifferentialRevisionRelationship.php', + 'DifferentialRevisionRelationshipSource' => 'applications/search/relationship/DifferentialRevisionRelationshipSource.php', + 'DifferentialRevisionReopenTransaction' => 'applications/differential/xaction/DifferentialRevisionReopenTransaction.php', + 'DifferentialRevisionRepositoryHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryHeraldField.php', + 'DifferentialRevisionRepositoryProjectsHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryProjectsHeraldField.php', + 'DifferentialRevisionRepositoryTransaction' => 'applications/differential/xaction/DifferentialRevisionRepositoryTransaction.php', + 'DifferentialRevisionRequestReviewTransaction' => 'applications/differential/xaction/DifferentialRevisionRequestReviewTransaction.php', + 'DifferentialRevisionRequiredActionResultBucket' => 'applications/differential/query/DifferentialRevisionRequiredActionResultBucket.php', + 'DifferentialRevisionResignTransaction' => 'applications/differential/xaction/DifferentialRevisionResignTransaction.php', + 'DifferentialRevisionResultBucket' => 'applications/differential/query/DifferentialRevisionResultBucket.php', + 'DifferentialRevisionReviewTransaction' => 'applications/differential/xaction/DifferentialRevisionReviewTransaction.php', + 'DifferentialRevisionReviewersHeraldField' => 'applications/differential/herald/DifferentialRevisionReviewersHeraldField.php', + 'DifferentialRevisionReviewersTransaction' => 'applications/differential/xaction/DifferentialRevisionReviewersTransaction.php', + 'DifferentialRevisionSearchConduitAPIMethod' => 'applications/differential/conduit/DifferentialRevisionSearchConduitAPIMethod.php', 'DifferentialRevisionSearchEngine' => 'applications/differential/query/DifferentialRevisionSearchEngine.php', - 'DifferentialRevisionStatsView' => 'applications/differential/view/DifferentialRevisionStatsView.php', 'DifferentialRevisionStatus' => 'applications/differential/constants/DifferentialRevisionStatus.php', - 'DifferentialRevisionStatusFieldSpecification' => 'applications/differential/field/specification/DifferentialRevisionStatusFieldSpecification.php', + 'DifferentialRevisionStatusDatasource' => 'applications/differential/typeahead/DifferentialRevisionStatusDatasource.php', + 'DifferentialRevisionStatusFunctionDatasource' => 'applications/differential/typeahead/DifferentialRevisionStatusFunctionDatasource.php', + 'DifferentialRevisionStatusHeraldField' => 'applications/differential/herald/DifferentialRevisionStatusHeraldField.php', + 'DifferentialRevisionStatusTransaction' => 'applications/differential/xaction/DifferentialRevisionStatusTransaction.php', + 'DifferentialRevisionSummaryHeraldField' => 'applications/differential/herald/DifferentialRevisionSummaryHeraldField.php', + 'DifferentialRevisionSummaryTransaction' => 'applications/differential/xaction/DifferentialRevisionSummaryTransaction.php', + 'DifferentialRevisionTestPlanHeraldField' => 'applications/differential/herald/DifferentialRevisionTestPlanHeraldField.php', + 'DifferentialRevisionTestPlanTransaction' => 'applications/differential/xaction/DifferentialRevisionTestPlanTransaction.php', + 'DifferentialRevisionTimelineEngine' => 'applications/differential/engine/DifferentialRevisionTimelineEngine.php', + 'DifferentialRevisionTitleHeraldField' => 'applications/differential/herald/DifferentialRevisionTitleHeraldField.php', + 'DifferentialRevisionTitleTransaction' => 'applications/differential/xaction/DifferentialRevisionTitleTransaction.php', + 'DifferentialRevisionTransactionType' => 'applications/differential/xaction/DifferentialRevisionTransactionType.php', 'DifferentialRevisionUpdateHistoryView' => 'applications/differential/view/DifferentialRevisionUpdateHistoryView.php', + 'DifferentialRevisionUpdateTransaction' => 'applications/differential/xaction/DifferentialRevisionUpdateTransaction.php', 'DifferentialRevisionViewController' => 'applications/differential/controller/DifferentialRevisionViewController.php', - 'DifferentialSearchIndexer' => 'applications/differential/search/DifferentialSearchIndexer.php', - 'DifferentialSubscribeController' => 'applications/differential/controller/DifferentialSubscribeController.php', - 'DifferentialSummaryFieldSpecification' => 'applications/differential/field/specification/DifferentialSummaryFieldSpecification.php', - 'DifferentialTasksAttacher' => 'applications/differential/DifferentialTasksAttacher.php', - 'DifferentialTestPlanFieldSpecification' => 'applications/differential/field/specification/DifferentialTestPlanFieldSpecification.php', - 'DifferentialTitleFieldSpecification' => 'applications/differential/field/specification/DifferentialTitleFieldSpecification.php', + 'DifferentialRevisionVoidTransaction' => 'applications/differential/xaction/DifferentialRevisionVoidTransaction.php', + 'DifferentialRevisionWrongBuildsTransaction' => 'applications/differential/xaction/DifferentialRevisionWrongBuildsTransaction.php', + 'DifferentialRevisionWrongStateTransaction' => 'applications/differential/xaction/DifferentialRevisionWrongStateTransaction.php', + 'DifferentialSchemaSpec' => 'applications/differential/storage/DifferentialSchemaSpec.php', + 'DifferentialSetDiffPropertyConduitAPIMethod' => 'applications/differential/conduit/DifferentialSetDiffPropertyConduitAPIMethod.php', + 'DifferentialStoredCustomField' => 'applications/differential/customfield/DifferentialStoredCustomField.php', + 'DifferentialSubscribersCommitMessageField' => 'applications/differential/field/DifferentialSubscribersCommitMessageField.php', + 'DifferentialSummaryCommitMessageField' => 'applications/differential/field/DifferentialSummaryCommitMessageField.php', + 'DifferentialSummaryField' => 'applications/differential/customfield/DifferentialSummaryField.php', + 'DifferentialTabReplacementTestCase' => 'applications/differential/parser/__tests__/DifferentialTabReplacementTestCase.php', + 'DifferentialTagsCommitMessageField' => 'applications/differential/field/DifferentialTagsCommitMessageField.php', + 'DifferentialTasksCommitMessageField' => 'applications/differential/field/DifferentialTasksCommitMessageField.php', + 'DifferentialTestPlanCommitMessageField' => 'applications/differential/field/DifferentialTestPlanCommitMessageField.php', + 'DifferentialTestPlanField' => 'applications/differential/customfield/DifferentialTestPlanField.php', + 'DifferentialTitleCommitMessageField' => 'applications/differential/field/DifferentialTitleCommitMessageField.php', 'DifferentialTransaction' => 'applications/differential/storage/DifferentialTransaction.php', 'DifferentialTransactionComment' => 'applications/differential/storage/DifferentialTransactionComment.php', - 'DifferentialUnitFieldSpecification' => 'applications/differential/field/specification/DifferentialUnitFieldSpecification.php', + 'DifferentialTransactionEditor' => 'applications/differential/editor/DifferentialTransactionEditor.php', + 'DifferentialTransactionQuery' => 'applications/differential/query/DifferentialTransactionQuery.php', + 'DifferentialTransactionView' => 'applications/differential/view/DifferentialTransactionView.php', + 'DifferentialUnitField' => 'applications/differential/customfield/DifferentialUnitField.php', 'DifferentialUnitStatus' => 'applications/differential/constants/DifferentialUnitStatus.php', 'DifferentialUnitTestResult' => 'applications/differential/constants/DifferentialUnitTestResult.php', - 'DifferentialViewPolicyFieldSpecification' => 'applications/differential/field/specification/DifferentialViewPolicyFieldSpecification.php', - 'DiffusionBranchInformation' => 'applications/diffusion/data/DiffusionBranchInformation.php', + 'DifferentialUpdateRevisionConduitAPIMethod' => 'applications/differential/conduit/DifferentialUpdateRevisionConduitAPIMethod.php', + 'DifferentialViewState' => 'applications/differential/storage/DifferentialViewState.php', + 'DifferentialViewStateGarbageCollector' => 'applications/differential/garbagecollector/DifferentialViewStateGarbageCollector.php', + 'DifferentialViewStateQuery' => 'applications/differential/query/DifferentialViewStateQuery.php', + 'DiffusionAuditorDatasource' => 'applications/diffusion/typeahead/DiffusionAuditorDatasource.php', + 'DiffusionAuditorFunctionDatasource' => 'applications/diffusion/typeahead/DiffusionAuditorFunctionDatasource.php', + 'DiffusionAuditorsAddAuditorsHeraldAction' => 'applications/diffusion/herald/DiffusionAuditorsAddAuditorsHeraldAction.php', + 'DiffusionAuditorsAddSelfHeraldAction' => 'applications/diffusion/herald/DiffusionAuditorsAddSelfHeraldAction.php', + 'DiffusionAuditorsHeraldAction' => 'applications/diffusion/herald/DiffusionAuditorsHeraldAction.php', + 'DiffusionAuditorsSearchEngineAttachment' => 'applications/diffusion/engineextension/DiffusionAuditorsSearchEngineAttachment.php', + 'DiffusionBlameConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionBlameConduitAPIMethod.php', + 'DiffusionBlameController' => 'applications/diffusion/controller/DiffusionBlameController.php', + 'DiffusionBlameQuery' => 'applications/diffusion/query/blame/DiffusionBlameQuery.php', + 'DiffusionBlockHeraldAction' => 'applications/diffusion/herald/DiffusionBlockHeraldAction.php', + 'DiffusionBranchListView' => 'applications/diffusion/view/DiffusionBranchListView.php', + 'DiffusionBranchQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionBranchQueryConduitAPIMethod.php', 'DiffusionBranchTableController' => 'applications/diffusion/controller/DiffusionBranchTableController.php', - 'DiffusionBranchTableView' => 'applications/diffusion/view/DiffusionBranchTableView.php', 'DiffusionBrowseController' => 'applications/diffusion/controller/DiffusionBrowseController.php', - 'DiffusionBrowseFileController' => 'applications/diffusion/controller/DiffusionBrowseFileController.php', + 'DiffusionBrowseQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionBrowseQueryConduitAPIMethod.php', 'DiffusionBrowseResultSet' => 'applications/diffusion/data/DiffusionBrowseResultSet.php', 'DiffusionBrowseTableView' => 'applications/diffusion/view/DiffusionBrowseTableView.php', + 'DiffusionBuildableEngine' => 'applications/diffusion/harbormaster/DiffusionBuildableEngine.php', + 'DiffusionCacheEngineExtension' => 'applications/diffusion/engineextension/DiffusionCacheEngineExtension.php', + 'DiffusionCachedResolveRefsQuery' => 'applications/diffusion/query/DiffusionCachedResolveRefsQuery.php', 'DiffusionChangeController' => 'applications/diffusion/controller/DiffusionChangeController.php', - 'DiffusionCommentListView' => 'applications/diffusion/view/DiffusionCommentListView.php', - 'DiffusionCommentView' => 'applications/diffusion/view/DiffusionCommentView.php', + 'DiffusionChangeHeraldFieldGroup' => 'applications/diffusion/herald/DiffusionChangeHeraldFieldGroup.php', + 'DiffusionCloneController' => 'applications/diffusion/controller/DiffusionCloneController.php', + 'DiffusionCloneURIView' => 'applications/diffusion/view/DiffusionCloneURIView.php', + 'DiffusionCommandEngine' => 'applications/diffusion/protocol/DiffusionCommandEngine.php', + 'DiffusionCommandEngineTestCase' => 'applications/diffusion/protocol/__tests__/DiffusionCommandEngineTestCase.php', + 'DiffusionCommitAcceptTransaction' => 'applications/diffusion/xaction/DiffusionCommitAcceptTransaction.php', + 'DiffusionCommitActionTransaction' => 'applications/diffusion/xaction/DiffusionCommitActionTransaction.php', + 'DiffusionCommitAffectedFilesHeraldField' => 'applications/diffusion/herald/DiffusionCommitAffectedFilesHeraldField.php', + 'DiffusionCommitAuditStatus' => 'applications/diffusion/DiffusionCommitAuditStatus.php', + 'DiffusionCommitAuditTransaction' => 'applications/diffusion/xaction/DiffusionCommitAuditTransaction.php', + 'DiffusionCommitAuditorsHeraldField' => 'applications/diffusion/herald/DiffusionCommitAuditorsHeraldField.php', + 'DiffusionCommitAuditorsTransaction' => 'applications/diffusion/xaction/DiffusionCommitAuditorsTransaction.php', + 'DiffusionCommitAuthorHeraldField' => 'applications/diffusion/herald/DiffusionCommitAuthorHeraldField.php', + 'DiffusionCommitAuthorPackagesHeraldField' => 'applications/diffusion/herald/DiffusionCommitAuthorPackagesHeraldField.php', + 'DiffusionCommitAuthorProjectsHeraldField' => 'applications/diffusion/herald/DiffusionCommitAuthorProjectsHeraldField.php', + 'DiffusionCommitAutocloseHeraldField' => 'applications/diffusion/herald/DiffusionCommitAutocloseHeraldField.php', 'DiffusionCommitBranchesController' => 'applications/diffusion/controller/DiffusionCommitBranchesController.php', - 'DiffusionCommitChangeTableView' => 'applications/diffusion/view/DiffusionCommitChangeTableView.php', + 'DiffusionCommitBranchesHeraldField' => 'applications/diffusion/herald/DiffusionCommitBranchesHeraldField.php', + 'DiffusionCommitBuildableTransaction' => 'applications/diffusion/xaction/DiffusionCommitBuildableTransaction.php', + 'DiffusionCommitCommitterHeraldField' => 'applications/diffusion/herald/DiffusionCommitCommitterHeraldField.php', + 'DiffusionCommitCommitterPackagesHeraldField' => 'applications/diffusion/herald/DiffusionCommitCommitterPackagesHeraldField.php', + 'DiffusionCommitCommitterProjectsHeraldField' => 'applications/diffusion/herald/DiffusionCommitCommitterProjectsHeraldField.php', + 'DiffusionCommitConcernTransaction' => 'applications/diffusion/xaction/DiffusionCommitConcernTransaction.php', 'DiffusionCommitController' => 'applications/diffusion/controller/DiffusionCommitController.php', + 'DiffusionCommitDiffContentAddedHeraldField' => 'applications/diffusion/herald/DiffusionCommitDiffContentAddedHeraldField.php', + 'DiffusionCommitDiffContentHeraldField' => 'applications/diffusion/herald/DiffusionCommitDiffContentHeraldField.php', + 'DiffusionCommitDiffContentRemovedHeraldField' => 'applications/diffusion/herald/DiffusionCommitDiffContentRemovedHeraldField.php', + 'DiffusionCommitDiffEnormousHeraldField' => 'applications/diffusion/herald/DiffusionCommitDiffEnormousHeraldField.php', + 'DiffusionCommitDraftEngine' => 'applications/diffusion/engine/DiffusionCommitDraftEngine.php', + 'DiffusionCommitEditConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionCommitEditConduitAPIMethod.php', 'DiffusionCommitEditController' => 'applications/diffusion/controller/DiffusionCommitEditController.php', - 'DiffusionCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionCommitParentsQuery.php', + 'DiffusionCommitEditEngine' => 'applications/diffusion/editor/DiffusionCommitEditEngine.php', + 'DiffusionCommitFerretEngine' => 'applications/repository/search/DiffusionCommitFerretEngine.php', + 'DiffusionCommitFulltextEngine' => 'applications/repository/search/DiffusionCommitFulltextEngine.php', + 'DiffusionCommitGraphView' => 'applications/diffusion/view/DiffusionCommitGraphView.php', + 'DiffusionCommitHasPackageEdgeType' => 'applications/diffusion/edge/DiffusionCommitHasPackageEdgeType.php', + 'DiffusionCommitHasRevisionEdgeType' => 'applications/diffusion/edge/DiffusionCommitHasRevisionEdgeType.php', + 'DiffusionCommitHasRevisionRelationship' => 'applications/diffusion/relationships/DiffusionCommitHasRevisionRelationship.php', + 'DiffusionCommitHasTaskEdgeType' => 'applications/diffusion/edge/DiffusionCommitHasTaskEdgeType.php', + 'DiffusionCommitHasTaskRelationship' => 'applications/diffusion/relationships/DiffusionCommitHasTaskRelationship.php', + 'DiffusionCommitHash' => 'applications/diffusion/data/DiffusionCommitHash.php', + 'DiffusionCommitHeraldField' => 'applications/diffusion/herald/DiffusionCommitHeraldField.php', + 'DiffusionCommitHeraldFieldGroup' => 'applications/diffusion/herald/DiffusionCommitHeraldFieldGroup.php', + 'DiffusionCommitHintQuery' => 'applications/diffusion/query/DiffusionCommitHintQuery.php', + 'DiffusionCommitHookEngine' => 'applications/diffusion/engine/DiffusionCommitHookEngine.php', + 'DiffusionCommitHookRejectException' => 'applications/diffusion/exception/DiffusionCommitHookRejectException.php', + 'DiffusionCommitListController' => 'applications/diffusion/controller/DiffusionCommitListController.php', + 'DiffusionCommitMergeHeraldField' => 'applications/diffusion/herald/DiffusionCommitMergeHeraldField.php', + 'DiffusionCommitMessageHeraldField' => 'applications/diffusion/herald/DiffusionCommitMessageHeraldField.php', + 'DiffusionCommitPackageAuditHeraldField' => 'applications/diffusion/herald/DiffusionCommitPackageAuditHeraldField.php', + 'DiffusionCommitPackageHeraldField' => 'applications/diffusion/herald/DiffusionCommitPackageHeraldField.php', + 'DiffusionCommitPackageOwnerHeraldField' => 'applications/diffusion/herald/DiffusionCommitPackageOwnerHeraldField.php', + 'DiffusionCommitParentsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionCommitParentsQueryConduitAPIMethod.php', 'DiffusionCommitQuery' => 'applications/diffusion/query/DiffusionCommitQuery.php', + 'DiffusionCommitRef' => 'applications/diffusion/data/DiffusionCommitRef.php', + 'DiffusionCommitRelationship' => 'applications/diffusion/relationships/DiffusionCommitRelationship.php', + 'DiffusionCommitRelationshipSource' => 'applications/search/relationship/DiffusionCommitRelationshipSource.php', + 'DiffusionCommitRemarkupRule' => 'applications/diffusion/remarkup/DiffusionCommitRemarkupRule.php', + 'DiffusionCommitRemarkupRuleTestCase' => 'applications/diffusion/remarkup/__tests__/DiffusionCommitRemarkupRuleTestCase.php', + 'DiffusionCommitRepositoryHeraldField' => 'applications/diffusion/herald/DiffusionCommitRepositoryHeraldField.php', + 'DiffusionCommitRepositoryProjectsHeraldField' => 'applications/diffusion/herald/DiffusionCommitRepositoryProjectsHeraldField.php', + 'DiffusionCommitRequiredActionResultBucket' => 'applications/diffusion/query/DiffusionCommitRequiredActionResultBucket.php', + 'DiffusionCommitResignTransaction' => 'applications/diffusion/xaction/DiffusionCommitResignTransaction.php', + 'DiffusionCommitResultBucket' => 'applications/diffusion/query/DiffusionCommitResultBucket.php', + 'DiffusionCommitRevertedByCommitEdgeType' => 'applications/diffusion/edge/DiffusionCommitRevertedByCommitEdgeType.php', + 'DiffusionCommitRevertsCommitEdgeType' => 'applications/diffusion/edge/DiffusionCommitRevertsCommitEdgeType.php', + 'DiffusionCommitReviewerHeraldField' => 'applications/diffusion/herald/DiffusionCommitReviewerHeraldField.php', + 'DiffusionCommitRevisionAcceptedHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionAcceptedHeraldField.php', + 'DiffusionCommitRevisionAcceptingReviewersHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionAcceptingReviewersHeraldField.php', + 'DiffusionCommitRevisionHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionHeraldField.php', + 'DiffusionCommitRevisionQuery' => 'applications/diffusion/query/DiffusionCommitRevisionQuery.php', + 'DiffusionCommitRevisionReviewersHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionReviewersHeraldField.php', + 'DiffusionCommitRevisionSubscribersHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionSubscribersHeraldField.php', + 'DiffusionCommitSearchConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionCommitSearchConduitAPIMethod.php', + 'DiffusionCommitStateTransaction' => 'applications/diffusion/xaction/DiffusionCommitStateTransaction.php', 'DiffusionCommitTagsController' => 'applications/diffusion/controller/DiffusionCommitTagsController.php', + 'DiffusionCommitTimelineEngine' => 'applications/diffusion/engine/DiffusionCommitTimelineEngine.php', + 'DiffusionCommitTransactionType' => 'applications/diffusion/xaction/DiffusionCommitTransactionType.php', + 'DiffusionCommitVerifyTransaction' => 'applications/diffusion/xaction/DiffusionCommitVerifyTransaction.php', + 'DiffusionCommitWrongBuildsHeraldField' => 'applications/diffusion/herald/DiffusionCommitWrongBuildsHeraldField.php', + 'DiffusionCompareController' => 'applications/diffusion/controller/DiffusionCompareController.php', + 'DiffusionConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionConduitAPIMethod.php', 'DiffusionController' => 'applications/diffusion/controller/DiffusionController.php', + 'DiffusionCreateRepositoriesCapability' => 'applications/diffusion/capability/DiffusionCreateRepositoriesCapability.php', + 'DiffusionDaemonLockException' => 'applications/diffusion/exception/DiffusionDaemonLockException.php', + 'DiffusionDatasourceEngineExtension' => 'applications/diffusion/engineextension/DiffusionDatasourceEngineExtension.php', + 'DiffusionDefaultEditCapability' => 'applications/diffusion/capability/DiffusionDefaultEditCapability.php', + 'DiffusionDefaultPushCapability' => 'applications/diffusion/capability/DiffusionDefaultPushCapability.php', + 'DiffusionDefaultViewCapability' => 'applications/diffusion/capability/DiffusionDefaultViewCapability.php', 'DiffusionDiffController' => 'applications/diffusion/controller/DiffusionDiffController.php', + 'DiffusionDiffInlineCommentQuery' => 'applications/diffusion/query/DiffusionDiffInlineCommentQuery.php', + 'DiffusionDiffQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionDiffQueryConduitAPIMethod.php', + 'DiffusionDocumentController' => 'applications/diffusion/controller/DiffusionDocumentController.php', + 'DiffusionDocumentRenderingEngine' => 'applications/diffusion/document/DiffusionDocumentRenderingEngine.php', 'DiffusionDoorkeeperCommitFeedStoryPublisher' => 'applications/diffusion/doorkeeper/DiffusionDoorkeeperCommitFeedStoryPublisher.php', 'DiffusionEmptyResultView' => 'applications/diffusion/view/DiffusionEmptyResultView.php', - 'DiffusionExpandCommitQueryException' => 'applications/diffusion/exception/DiffusionExpandCommitQueryException.php', - 'DiffusionExpandShortNameQuery' => 'applications/diffusion/query/expandshortname/DiffusionExpandShortNameQuery.php', + 'DiffusionExistsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionExistsQueryConduitAPIMethod.php', 'DiffusionExternalController' => 'applications/diffusion/controller/DiffusionExternalController.php', - 'DiffusionFileContent' => 'applications/diffusion/data/DiffusionFileContent.php', + 'DiffusionExternalSymbolQuery' => 'applications/diffusion/symbol/DiffusionExternalSymbolQuery.php', + 'DiffusionExternalSymbolsSource' => 'applications/diffusion/symbol/DiffusionExternalSymbolsSource.php', 'DiffusionFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionFileContentQuery.php', + 'DiffusionFileContentQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionFileContentQueryConduitAPIMethod.php', + 'DiffusionFileFutureQuery' => 'applications/diffusion/query/DiffusionFileFutureQuery.php', + 'DiffusionFindSymbolsConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionFindSymbolsConduitAPIMethod.php', + 'DiffusionGetLintMessagesConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionGetLintMessagesConduitAPIMethod.php', + 'DiffusionGetRecentCommitsByPathConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionGetRecentCommitsByPathConduitAPIMethod.php', + 'DiffusionGitBlameQuery' => 'applications/diffusion/query/blame/DiffusionGitBlameQuery.php', 'DiffusionGitBranch' => 'applications/diffusion/data/DiffusionGitBranch.php', 'DiffusionGitBranchTestCase' => 'applications/diffusion/data/__tests__/DiffusionGitBranchTestCase.php', - 'DiffusionGitCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionGitCommitParentsQuery.php', - 'DiffusionGitExpandShortNameQuery' => 'applications/diffusion/query/expandshortname/DiffusionGitExpandShortNameQuery.php', + 'DiffusionGitCommandEngine' => 'applications/diffusion/protocol/DiffusionGitCommandEngine.php', 'DiffusionGitFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionGitFileContentQuery.php', + 'DiffusionGitLFSAuthenticateWorkflow' => 'applications/diffusion/gitlfs/DiffusionGitLFSAuthenticateWorkflow.php', + 'DiffusionGitLFSResponse' => 'applications/diffusion/response/DiffusionGitLFSResponse.php', + 'DiffusionGitLFSTemporaryTokenType' => 'applications/diffusion/gitlfs/DiffusionGitLFSTemporaryTokenType.php', 'DiffusionGitRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionGitRawDiffQuery.php', + 'DiffusionGitReceivePackSSHWorkflow' => 'applications/diffusion/ssh/DiffusionGitReceivePackSSHWorkflow.php', 'DiffusionGitRequest' => 'applications/diffusion/request/DiffusionGitRequest.php', - 'DiffusionGitStableCommitNameQuery' => 'applications/diffusion/query/stablecommitname/DiffusionGitStableCommitNameQuery.php', + 'DiffusionGitResponse' => 'applications/diffusion/response/DiffusionGitResponse.php', + 'DiffusionGitSSHWorkflow' => 'applications/diffusion/ssh/DiffusionGitSSHWorkflow.php', + 'DiffusionGitUploadPackSSHWorkflow' => 'applications/diffusion/ssh/DiffusionGitUploadPackSSHWorkflow.php', + 'DiffusionGitUploadPackWireProtocol' => 'applications/diffusion/protocol/DiffusionGitUploadPackWireProtocol.php', + 'DiffusionGitWireProtocol' => 'applications/diffusion/protocol/DiffusionGitWireProtocol.php', + 'DiffusionGitWireProtocolCapabilities' => 'applications/diffusion/protocol/DiffusionGitWireProtocolCapabilities.php', + 'DiffusionGitWireProtocolRef' => 'applications/diffusion/protocol/DiffusionGitWireProtocolRef.php', + 'DiffusionGitWireProtocolRefList' => 'applications/diffusion/protocol/DiffusionGitWireProtocolRefList.php', 'DiffusionHistoryController' => 'applications/diffusion/controller/DiffusionHistoryController.php', - 'DiffusionHistoryTableView' => 'applications/diffusion/view/DiffusionHistoryTableView.php', - 'DiffusionHomeController' => 'applications/diffusion/controller/DiffusionHomeController.php', - 'DiffusionHovercardEventListener' => 'applications/diffusion/events/DiffusionHovercardEventListener.php', + 'DiffusionHistoryQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionHistoryQueryConduitAPIMethod.php', + 'DiffusionHovercardEngineExtension' => 'applications/diffusion/engineextension/DiffusionHovercardEngineExtension.php', + 'DiffusionIdentityAssigneeDatasource' => 'applications/diffusion/typeahead/DiffusionIdentityAssigneeDatasource.php', + 'DiffusionIdentityAssigneeEditField' => 'applications/diffusion/editfield/DiffusionIdentityAssigneeEditField.php', + 'DiffusionIdentityAssigneeSearchField' => 'applications/diffusion/searchfield/DiffusionIdentityAssigneeSearchField.php', + 'DiffusionIdentityEditController' => 'applications/diffusion/controller/DiffusionIdentityEditController.php', + 'DiffusionIdentityListController' => 'applications/diffusion/controller/DiffusionIdentityListController.php', + 'DiffusionIdentityUnassignedDatasource' => 'applications/diffusion/typeahead/DiffusionIdentityUnassignedDatasource.php', + 'DiffusionIdentityViewController' => 'applications/diffusion/controller/DiffusionIdentityViewController.php', 'DiffusionInlineCommentController' => 'applications/diffusion/controller/DiffusionInlineCommentController.php', - 'DiffusionInlineCommentPreviewController' => 'applications/diffusion/controller/DiffusionInlineCommentPreviewController.php', + 'DiffusionInternalAncestorsConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionInternalAncestorsConduitAPIMethod.php', + 'DiffusionInternalCommitSearchConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionInternalCommitSearchConduitAPIMethod.php', + 'DiffusionInternalCommitSearchEngine' => 'applications/audit/query/DiffusionInternalCommitSearchEngine.php', + 'DiffusionInternalGitRawDiffQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionInternalGitRawDiffQueryConduitAPIMethod.php', 'DiffusionLastModifiedController' => 'applications/diffusion/controller/DiffusionLastModifiedController.php', + 'DiffusionLastModifiedQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionLastModifiedQueryConduitAPIMethod.php', 'DiffusionLintController' => 'applications/diffusion/controller/DiffusionLintController.php', - 'DiffusionLintDetailsController' => 'applications/diffusion/controller/DiffusionLintDetailsController.php', + 'DiffusionLintCountQuery' => 'applications/diffusion/query/DiffusionLintCountQuery.php', 'DiffusionLintSaveRunner' => 'applications/diffusion/DiffusionLintSaveRunner.php', - 'DiffusionMercurialCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionMercurialCommitParentsQuery.php', - 'DiffusionMercurialExpandShortNameQuery' => 'applications/diffusion/query/expandshortname/DiffusionMercurialExpandShortNameQuery.php', + 'DiffusionLocalRepositoryFilter' => 'applications/diffusion/data/DiffusionLocalRepositoryFilter.php', + 'DiffusionLogController' => 'applications/diffusion/controller/DiffusionLogController.php', + 'DiffusionLookSoonConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionLookSoonConduitAPIMethod.php', + 'DiffusionLowLevelCommitFieldsQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelCommitFieldsQuery.php', + 'DiffusionLowLevelCommitQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelCommitQuery.php', + 'DiffusionLowLevelFilesizeQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelFilesizeQuery.php', + 'DiffusionLowLevelGitRefQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelGitRefQuery.php', + 'DiffusionLowLevelMercurialBranchesQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelMercurialBranchesQuery.php', + 'DiffusionLowLevelMercurialPathsQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelMercurialPathsQuery.php', + 'DiffusionLowLevelParentsQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelParentsQuery.php', + 'DiffusionLowLevelQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelQuery.php', + 'DiffusionLowLevelResolveRefsQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelResolveRefsQuery.php', + 'DiffusionMercurialBlameQuery' => 'applications/diffusion/query/blame/DiffusionMercurialBlameQuery.php', + 'DiffusionMercurialCommandEngine' => 'applications/diffusion/protocol/DiffusionMercurialCommandEngine.php', + 'DiffusionMercurialCommandEngineTests' => 'applications/diffusion/protocol/__tests__/DiffusionMercurialCommandEngineTests.php', 'DiffusionMercurialFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionMercurialFileContentQuery.php', + 'DiffusionMercurialFlagInjectionException' => 'applications/diffusion/exception/DiffusionMercurialFlagInjectionException.php', 'DiffusionMercurialRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionMercurialRawDiffQuery.php', 'DiffusionMercurialRequest' => 'applications/diffusion/request/DiffusionMercurialRequest.php', - 'DiffusionMercurialStableCommitNameQuery' => 'applications/diffusion/query/stablecommitname/DiffusionMercurialStableCommitNameQuery.php', + 'DiffusionMercurialResponse' => 'applications/diffusion/response/DiffusionMercurialResponse.php', + 'DiffusionMercurialSSHWorkflow' => 'applications/diffusion/ssh/DiffusionMercurialSSHWorkflow.php', + 'DiffusionMercurialServeSSHWorkflow' => 'applications/diffusion/ssh/DiffusionMercurialServeSSHWorkflow.php', + 'DiffusionMercurialWireClientSSHProtocolChannel' => 'applications/diffusion/ssh/DiffusionMercurialWireClientSSHProtocolChannel.php', + 'DiffusionMercurialWireProtocol' => 'applications/diffusion/protocol/DiffusionMercurialWireProtocol.php', + 'DiffusionMercurialWireProtocolTests' => 'applications/diffusion/protocol/__tests__/DiffusionMercurialWireProtocolTests.php', + 'DiffusionMercurialWireSSHTestCase' => 'applications/diffusion/ssh/__tests__/DiffusionMercurialWireSSHTestCase.php', + 'DiffusionMergedCommitsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionMergedCommitsQueryConduitAPIMethod.php', 'DiffusionPathChange' => 'applications/diffusion/data/DiffusionPathChange.php', 'DiffusionPathChangeQuery' => 'applications/diffusion/query/pathchange/DiffusionPathChangeQuery.php', 'DiffusionPathCompleteController' => 'applications/diffusion/controller/DiffusionPathCompleteController.php', 'DiffusionPathIDQuery' => 'applications/diffusion/query/pathid/DiffusionPathIDQuery.php', 'DiffusionPathQuery' => 'applications/diffusion/query/DiffusionPathQuery.php', 'DiffusionPathQueryTestCase' => 'applications/diffusion/query/pathid/__tests__/DiffusionPathQueryTestCase.php', + 'DiffusionPathTreeController' => 'applications/diffusion/controller/DiffusionPathTreeController.php', 'DiffusionPathValidateController' => 'applications/diffusion/controller/DiffusionPathValidateController.php', + 'DiffusionPatternSearchView' => 'applications/diffusion/view/DiffusionPatternSearchView.php', + 'DiffusionPhpExternalSymbolsSource' => 'applications/diffusion/symbol/DiffusionPhpExternalSymbolsSource.php', + 'DiffusionPreCommitContentAffectedFilesHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAffectedFilesHeraldField.php', + 'DiffusionPreCommitContentAuthorHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAuthorHeraldField.php', + 'DiffusionPreCommitContentAuthorPackagesHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAuthorPackagesHeraldField.php', + 'DiffusionPreCommitContentAuthorProjectsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAuthorProjectsHeraldField.php', + 'DiffusionPreCommitContentAuthorRawHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAuthorRawHeraldField.php', + 'DiffusionPreCommitContentBranchesHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentBranchesHeraldField.php', + 'DiffusionPreCommitContentCommitterHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentCommitterHeraldField.php', + 'DiffusionPreCommitContentCommitterPackagesHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentCommitterPackagesHeraldField.php', + 'DiffusionPreCommitContentCommitterProjectsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentCommitterProjectsHeraldField.php', + 'DiffusionPreCommitContentCommitterRawHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentCommitterRawHeraldField.php', + 'DiffusionPreCommitContentDiffContentAddedHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentDiffContentAddedHeraldField.php', + 'DiffusionPreCommitContentDiffContentHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentDiffContentHeraldField.php', + 'DiffusionPreCommitContentDiffContentRemovedHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentDiffContentRemovedHeraldField.php', + 'DiffusionPreCommitContentDiffEnormousHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentDiffEnormousHeraldField.php', + 'DiffusionPreCommitContentHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentHeraldField.php', + 'DiffusionPreCommitContentMergeHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentMergeHeraldField.php', + 'DiffusionPreCommitContentMessageHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentMessageHeraldField.php', + 'DiffusionPreCommitContentPackageHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentPackageHeraldField.php', + 'DiffusionPreCommitContentPackageOwnerHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentPackageOwnerHeraldField.php', + 'DiffusionPreCommitContentPusherHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentPusherHeraldField.php', + 'DiffusionPreCommitContentPusherIsCommitterHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentPusherIsCommitterHeraldField.php', + 'DiffusionPreCommitContentPusherProjectsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentPusherProjectsHeraldField.php', + 'DiffusionPreCommitContentRepositoryHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRepositoryHeraldField.php', + 'DiffusionPreCommitContentRepositoryProjectsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRepositoryProjectsHeraldField.php', + 'DiffusionPreCommitContentRevisionAcceptedHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRevisionAcceptedHeraldField.php', + 'DiffusionPreCommitContentRevisionAcceptingReviewersHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRevisionAcceptingReviewersHeraldField.php', + 'DiffusionPreCommitContentRevisionHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRevisionHeraldField.php', + 'DiffusionPreCommitContentRevisionReviewersHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRevisionReviewersHeraldField.php', + 'DiffusionPreCommitContentRevisionSubscribersHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRevisionSubscribersHeraldField.php', + 'DiffusionPreCommitContentWrongBuildsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentWrongBuildsHeraldField.php', + 'DiffusionPreCommitRefChangeHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefChangeHeraldField.php', + 'DiffusionPreCommitRefHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefHeraldField.php', + 'DiffusionPreCommitRefHeraldFieldGroup' => 'applications/diffusion/herald/DiffusionPreCommitRefHeraldFieldGroup.php', + 'DiffusionPreCommitRefNameHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefNameHeraldField.php', + 'DiffusionPreCommitRefPusherHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefPusherHeraldField.php', + 'DiffusionPreCommitRefPusherProjectsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefPusherProjectsHeraldField.php', + 'DiffusionPreCommitRefRepositoryHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefRepositoryHeraldField.php', + 'DiffusionPreCommitRefRepositoryProjectsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefRepositoryProjectsHeraldField.php', + 'DiffusionPreCommitRefTypeHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefTypeHeraldField.php', + 'DiffusionPreCommitUsesGitLFSHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitUsesGitLFSHeraldField.php', + 'DiffusionPullEventGarbageCollector' => 'applications/diffusion/garbagecollector/DiffusionPullEventGarbageCollector.php', + 'DiffusionPullLogListController' => 'applications/diffusion/controller/DiffusionPullLogListController.php', + 'DiffusionPullLogListView' => 'applications/diffusion/view/DiffusionPullLogListView.php', + 'DiffusionPullLogSearchEngine' => 'applications/diffusion/query/DiffusionPullLogSearchEngine.php', + 'DiffusionPushCapability' => 'applications/diffusion/capability/DiffusionPushCapability.php', + 'DiffusionPushEventViewController' => 'applications/diffusion/controller/DiffusionPushEventViewController.php', + 'DiffusionPushLogListController' => 'applications/diffusion/controller/DiffusionPushLogListController.php', + 'DiffusionPushLogListView' => 'applications/diffusion/view/DiffusionPushLogListView.php', + 'DiffusionPythonExternalSymbolsSource' => 'applications/diffusion/symbol/DiffusionPythonExternalSymbolsSource.php', 'DiffusionQuery' => 'applications/diffusion/query/DiffusionQuery.php', + 'DiffusionQueryCommitsConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionQueryCommitsConduitAPIMethod.php', + 'DiffusionQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionQueryConduitAPIMethod.php', + 'DiffusionQueryPathsConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionQueryPathsConduitAPIMethod.php', 'DiffusionRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionRawDiffQuery.php', - 'DiffusionRemarkupRule' => 'applications/diffusion/remarkup/DiffusionRemarkupRule.php', + 'DiffusionRawDiffQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionRawDiffQueryConduitAPIMethod.php', + 'DiffusionReadmeView' => 'applications/diffusion/view/DiffusionReadmeView.php', + 'DiffusionRefDatasource' => 'applications/diffusion/typeahead/DiffusionRefDatasource.php', + 'DiffusionRefNotFoundException' => 'applications/diffusion/exception/DiffusionRefNotFoundException.php', + 'DiffusionRefTableController' => 'applications/diffusion/controller/DiffusionRefTableController.php', + 'DiffusionRefsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionRefsQueryConduitAPIMethod.php', 'DiffusionRenameHistoryQuery' => 'applications/diffusion/query/DiffusionRenameHistoryQuery.php', + 'DiffusionRepositoryAutomationManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryAutomationManagementPanel.php', + 'DiffusionRepositoryBasicsManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryBasicsManagementPanel.php', + 'DiffusionRepositoryBranchesManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryBranchesManagementPanel.php', + 'DiffusionRepositoryByIDRemarkupRule' => 'applications/diffusion/remarkup/DiffusionRepositoryByIDRemarkupRule.php', + 'DiffusionRepositoryClusterEngine' => 'applications/diffusion/protocol/DiffusionRepositoryClusterEngine.php', + 'DiffusionRepositoryClusterEngineLogInterface' => 'applications/diffusion/protocol/DiffusionRepositoryClusterEngineLogInterface.php', 'DiffusionRepositoryController' => 'applications/diffusion/controller/DiffusionRepositoryController.php', - 'DiffusionRepositoryCreateController' => 'applications/diffusion/controller/DiffusionRepositoryCreateController.php', - 'DiffusionRepositoryEditBasicController' => 'applications/diffusion/controller/DiffusionRepositoryEditBasicController.php', + 'DiffusionRepositoryDatasource' => 'applications/diffusion/typeahead/DiffusionRepositoryDatasource.php', + 'DiffusionRepositoryDefaultController' => 'applications/diffusion/controller/DiffusionRepositoryDefaultController.php', + 'DiffusionRepositoryEditActivateController' => 'applications/diffusion/controller/DiffusionRepositoryEditActivateController.php', + 'DiffusionRepositoryEditConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionRepositoryEditConduitAPIMethod.php', 'DiffusionRepositoryEditController' => 'applications/diffusion/controller/DiffusionRepositoryEditController.php', - 'DiffusionRepositoryEditEncodingController' => 'applications/diffusion/controller/DiffusionRepositoryEditEncodingController.php', + 'DiffusionRepositoryEditDangerousController' => 'applications/diffusion/controller/DiffusionRepositoryEditDangerousController.php', + 'DiffusionRepositoryEditDeleteController' => 'applications/diffusion/controller/DiffusionRepositoryEditDeleteController.php', + 'DiffusionRepositoryEditEngine' => 'applications/diffusion/editor/DiffusionRepositoryEditEngine.php', + 'DiffusionRepositoryEditEnormousController' => 'applications/diffusion/controller/DiffusionRepositoryEditEnormousController.php', + 'DiffusionRepositoryEditPublishingController' => 'applications/diffusion/controller/DiffusionRepositoryEditPublishingController.php', + 'DiffusionRepositoryEditUpdateController' => 'applications/diffusion/controller/DiffusionRepositoryEditUpdateController.php', + 'DiffusionRepositoryFunctionDatasource' => 'applications/diffusion/typeahead/DiffusionRepositoryFunctionDatasource.php', + 'DiffusionRepositoryHistoryManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryHistoryManagementPanel.php', + 'DiffusionRepositoryIdentityDestructionEngineExtension' => 'applications/diffusion/identity/DiffusionRepositoryIdentityDestructionEngineExtension.php', + 'DiffusionRepositoryIdentityEditor' => 'applications/diffusion/editor/DiffusionRepositoryIdentityEditor.php', + 'DiffusionRepositoryIdentityEngine' => 'applications/diffusion/identity/DiffusionRepositoryIdentityEngine.php', + 'DiffusionRepositoryIdentitySearchEngine' => 'applications/diffusion/query/DiffusionRepositoryIdentitySearchEngine.php', + 'DiffusionRepositoryLimitsManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryLimitsManagementPanel.php', + 'DiffusionRepositoryListController' => 'applications/diffusion/controller/DiffusionRepositoryListController.php', + 'DiffusionRepositoryManageController' => 'applications/diffusion/controller/DiffusionRepositoryManageController.php', + 'DiffusionRepositoryManagePanelsController' => 'applications/diffusion/controller/DiffusionRepositoryManagePanelsController.php', + 'DiffusionRepositoryManagementBuildsPanelGroup' => 'applications/diffusion/management/DiffusionRepositoryManagementBuildsPanelGroup.php', + 'DiffusionRepositoryManagementIntegrationsPanelGroup' => 'applications/diffusion/management/DiffusionRepositoryManagementIntegrationsPanelGroup.php', + 'DiffusionRepositoryManagementMainPanelGroup' => 'applications/diffusion/management/DiffusionRepositoryManagementMainPanelGroup.php', + 'DiffusionRepositoryManagementOtherPanelGroup' => 'applications/diffusion/management/DiffusionRepositoryManagementOtherPanelGroup.php', + 'DiffusionRepositoryManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryManagementPanel.php', + 'DiffusionRepositoryManagementPanelGroup' => 'applications/diffusion/management/DiffusionRepositoryManagementPanelGroup.php', + 'DiffusionRepositoryMetricsSearchEngineAttachment' => 'applications/diffusion/engineextension/DiffusionRepositoryMetricsSearchEngineAttachment.php', 'DiffusionRepositoryPath' => 'applications/diffusion/data/DiffusionRepositoryPath.php', + 'DiffusionRepositoryPoliciesManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryPoliciesManagementPanel.php', + 'DiffusionRepositoryProfilePictureController' => 'applications/diffusion/controller/DiffusionRepositoryProfilePictureController.php', + 'DiffusionRepositoryRef' => 'applications/diffusion/data/DiffusionRepositoryRef.php', + 'DiffusionRepositoryRemarkupRule' => 'applications/diffusion/remarkup/DiffusionRepositoryRemarkupRule.php', + 'DiffusionRepositorySearchConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionRepositorySearchConduitAPIMethod.php', + 'DiffusionRepositoryStagingManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryStagingManagementPanel.php', + 'DiffusionRepositoryStorageManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryStorageManagementPanel.php', + 'DiffusionRepositorySubversionManagementPanel' => 'applications/diffusion/management/DiffusionRepositorySubversionManagementPanel.php', + 'DiffusionRepositorySymbolsManagementPanel' => 'applications/diffusion/management/DiffusionRepositorySymbolsManagementPanel.php', 'DiffusionRepositoryTag' => 'applications/diffusion/data/DiffusionRepositoryTag.php', + 'DiffusionRepositoryTestAutomationController' => 'applications/diffusion/controller/DiffusionRepositoryTestAutomationController.php', + 'DiffusionRepositoryURICredentialController' => 'applications/diffusion/controller/DiffusionRepositoryURICredentialController.php', + 'DiffusionRepositoryURIDisableController' => 'applications/diffusion/controller/DiffusionRepositoryURIDisableController.php', + 'DiffusionRepositoryURIEditController' => 'applications/diffusion/controller/DiffusionRepositoryURIEditController.php', + 'DiffusionRepositoryURIViewController' => 'applications/diffusion/controller/DiffusionRepositoryURIViewController.php', + 'DiffusionRepositoryURIsIndexEngineExtension' => 'applications/diffusion/engineextension/DiffusionRepositoryURIsIndexEngineExtension.php', + 'DiffusionRepositoryURIsManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryURIsManagementPanel.php', + 'DiffusionRepositoryURIsSearchEngineAttachment' => 'applications/diffusion/engineextension/DiffusionRepositoryURIsSearchEngineAttachment.php', 'DiffusionRequest' => 'applications/diffusion/request/DiffusionRequest.php', + 'DiffusionResolveRefsConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionResolveRefsConduitAPIMethod.php', + 'DiffusionResolveUserQuery' => 'applications/diffusion/query/DiffusionResolveUserQuery.php', + 'DiffusionSSHWorkflow' => 'applications/diffusion/ssh/DiffusionSSHWorkflow.php', + 'DiffusionSearchQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionSearchQueryConduitAPIMethod.php', + 'DiffusionServeController' => 'applications/diffusion/controller/DiffusionServeController.php', + 'DiffusionServiceRef' => 'applications/diffusion/ref/DiffusionServiceRef.php', + 'DiffusionSetPasswordSettingsPanel' => 'applications/diffusion/panel/DiffusionSetPasswordSettingsPanel.php', 'DiffusionSetupException' => 'applications/diffusion/exception/DiffusionSetupException.php', - 'DiffusionStableCommitNameQuery' => 'applications/diffusion/query/stablecommitname/DiffusionStableCommitNameQuery.php', - 'DiffusionSvnCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionSvnCommitParentsQuery.php', + 'DiffusionSourceHyperlinkEngineExtension' => 'applications/diffusion/engineextension/DiffusionSourceHyperlinkEngineExtension.php', + 'DiffusionSourceLinkRemarkupRule' => 'applications/diffusion/remarkup/DiffusionSourceLinkRemarkupRule.php', + 'DiffusionSourceLinkView' => 'applications/diffusion/view/DiffusionSourceLinkView.php', + 'DiffusionSubversionCommandEngine' => 'applications/diffusion/protocol/DiffusionSubversionCommandEngine.php', + 'DiffusionSubversionSSHWorkflow' => 'applications/diffusion/ssh/DiffusionSubversionSSHWorkflow.php', + 'DiffusionSubversionServeSSHWorkflow' => 'applications/diffusion/ssh/DiffusionSubversionServeSSHWorkflow.php', + 'DiffusionSubversionWireProtocol' => 'applications/diffusion/protocol/DiffusionSubversionWireProtocol.php', + 'DiffusionSubversionWireProtocolTestCase' => 'applications/diffusion/protocol/__tests__/DiffusionSubversionWireProtocolTestCase.php', + 'DiffusionSvnBlameQuery' => 'applications/diffusion/query/blame/DiffusionSvnBlameQuery.php', 'DiffusionSvnFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionSvnFileContentQuery.php', 'DiffusionSvnRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionSvnRawDiffQuery.php', 'DiffusionSvnRequest' => 'applications/diffusion/request/DiffusionSvnRequest.php', - 'DiffusionSvnStableCommitNameQuery' => 'applications/diffusion/query/stablecommitname/DiffusionSvnStableCommitNameQuery.php', 'DiffusionSymbolController' => 'applications/diffusion/controller/DiffusionSymbolController.php', + 'DiffusionSymbolDatasource' => 'applications/diffusion/typeahead/DiffusionSymbolDatasource.php', 'DiffusionSymbolQuery' => 'applications/diffusion/query/DiffusionSymbolQuery.php', + 'DiffusionSyncLogListController' => 'applications/diffusion/controller/DiffusionSyncLogListController.php', + 'DiffusionSyncLogListView' => 'applications/diffusion/view/DiffusionSyncLogListView.php', + 'DiffusionSyncLogSearchEngine' => 'applications/diffusion/query/DiffusionSyncLogSearchEngine.php', 'DiffusionTagListController' => 'applications/diffusion/controller/DiffusionTagListController.php', 'DiffusionTagListView' => 'applications/diffusion/view/DiffusionTagListView.php', + 'DiffusionTaggedRepositoriesFunctionDatasource' => 'applications/diffusion/typeahead/DiffusionTaggedRepositoriesFunctionDatasource.php', + 'DiffusionTagsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionTagsQueryConduitAPIMethod.php', + 'DiffusionURIEditConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionURIEditConduitAPIMethod.php', + 'DiffusionURIEditEngine' => 'applications/diffusion/editor/DiffusionURIEditEngine.php', + 'DiffusionURIEditor' => 'applications/diffusion/editor/DiffusionURIEditor.php', 'DiffusionURITestCase' => 'applications/diffusion/request/__tests__/DiffusionURITestCase.php', + 'DiffusionUpdateCoverageConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionUpdateCoverageConduitAPIMethod.php', + 'DiffusionUpdateObjectAfterCommitWorker' => 'applications/diffusion/worker/DiffusionUpdateObjectAfterCommitWorker.php', 'DiffusionView' => 'applications/diffusion/view/DiffusionView.php', 'DivinerArticleAtomizer' => 'applications/diviner/atomizer/DivinerArticleAtomizer.php', 'DivinerAtom' => 'applications/diviner/atom/DivinerAtom.php', 'DivinerAtomCache' => 'applications/diviner/cache/DivinerAtomCache.php', 'DivinerAtomController' => 'applications/diviner/controller/DivinerAtomController.php', 'DivinerAtomListController' => 'applications/diviner/controller/DivinerAtomListController.php', + 'DivinerAtomPHIDType' => 'applications/diviner/phid/DivinerAtomPHIDType.php', 'DivinerAtomQuery' => 'applications/diviner/query/DivinerAtomQuery.php', 'DivinerAtomRef' => 'applications/diviner/atom/DivinerAtomRef.php', 'DivinerAtomSearchEngine' => 'applications/diviner/query/DivinerAtomSearchEngine.php', 'DivinerAtomizeWorkflow' => 'applications/diviner/workflow/DivinerAtomizeWorkflow.php', 'DivinerAtomizer' => 'applications/diviner/atomizer/DivinerAtomizer.php', 'DivinerBookController' => 'applications/diviner/controller/DivinerBookController.php', + 'DivinerBookDatasource' => 'applications/diviner/typeahead/DivinerBookDatasource.php', + 'DivinerBookEditController' => 'applications/diviner/controller/DivinerBookEditController.php', + 'DivinerBookItemView' => 'applications/diviner/view/DivinerBookItemView.php', + 'DivinerBookPHIDType' => 'applications/diviner/phid/DivinerBookPHIDType.php', 'DivinerBookQuery' => 'applications/diviner/query/DivinerBookQuery.php', 'DivinerController' => 'applications/diviner/controller/DivinerController.php', 'DivinerDAO' => 'applications/diviner/storage/DivinerDAO.php', + 'DivinerDefaultEditCapability' => 'applications/diviner/capability/DivinerDefaultEditCapability.php', 'DivinerDefaultRenderer' => 'applications/diviner/renderer/DivinerDefaultRenderer.php', + 'DivinerDefaultViewCapability' => 'applications/diviner/capability/DivinerDefaultViewCapability.php', 'DivinerDiskCache' => 'applications/diviner/cache/DivinerDiskCache.php', 'DivinerFileAtomizer' => 'applications/diviner/atomizer/DivinerFileAtomizer.php', 'DivinerFindController' => 'applications/diviner/controller/DivinerFindController.php', 'DivinerGenerateWorkflow' => 'applications/diviner/workflow/DivinerGenerateWorkflow.php', - 'DivinerLegacyController' => 'applications/diviner/controller/DivinerLegacyController.php', 'DivinerLiveAtom' => 'applications/diviner/storage/DivinerLiveAtom.php', 'DivinerLiveBook' => 'applications/diviner/storage/DivinerLiveBook.php', + 'DivinerLiveBookEditor' => 'applications/diviner/editor/DivinerLiveBookEditor.php', + 'DivinerLiveBookFulltextEngine' => 'applications/diviner/search/DivinerLiveBookFulltextEngine.php', + 'DivinerLiveBookTransaction' => 'applications/diviner/storage/DivinerLiveBookTransaction.php', + 'DivinerLiveBookTransactionQuery' => 'applications/diviner/query/DivinerLiveBookTransactionQuery.php', 'DivinerLivePublisher' => 'applications/diviner/publisher/DivinerLivePublisher.php', 'DivinerLiveSymbol' => 'applications/diviner/storage/DivinerLiveSymbol.php', - 'DivinerPHIDTypeAtom' => 'applications/diviner/phid/DivinerPHIDTypeAtom.php', - 'DivinerPHIDTypeBook' => 'applications/diviner/phid/DivinerPHIDTypeBook.php', + 'DivinerLiveSymbolFulltextEngine' => 'applications/diviner/search/DivinerLiveSymbolFulltextEngine.php', + 'DivinerMainController' => 'applications/diviner/controller/DivinerMainController.php', + 'DivinerPHPAtomizer' => 'applications/diviner/atomizer/DivinerPHPAtomizer.php', + 'DivinerParameterTableView' => 'applications/diviner/view/DivinerParameterTableView.php', 'DivinerPublishCache' => 'applications/diviner/cache/DivinerPublishCache.php', 'DivinerPublisher' => 'applications/diviner/publisher/DivinerPublisher.php', - 'DivinerRemarkupRuleSymbol' => 'applications/diviner/markup/DivinerRemarkupRuleSymbol.php', 'DivinerRenderer' => 'applications/diviner/renderer/DivinerRenderer.php', + 'DivinerReturnTableView' => 'applications/diviner/view/DivinerReturnTableView.php', + 'DivinerSchemaSpec' => 'applications/diviner/storage/DivinerSchemaSpec.php', + 'DivinerSectionView' => 'applications/diviner/view/DivinerSectionView.php', 'DivinerStaticPublisher' => 'applications/diviner/publisher/DivinerStaticPublisher.php', + 'DivinerSymbolRemarkupRule' => 'applications/diviner/markup/DivinerSymbolRemarkupRule.php', 'DivinerWorkflow' => 'applications/diviner/workflow/DivinerWorkflow.php', + 'DoorkeeperAsanaFeedWorker' => 'applications/doorkeeper/worker/DoorkeeperAsanaFeedWorker.php', 'DoorkeeperBridge' => 'applications/doorkeeper/bridge/DoorkeeperBridge.php', 'DoorkeeperBridgeAsana' => 'applications/doorkeeper/bridge/DoorkeeperBridgeAsana.php', + 'DoorkeeperBridgeGitHub' => 'applications/doorkeeper/bridge/DoorkeeperBridgeGitHub.php', + 'DoorkeeperBridgeGitHubIssue' => 'applications/doorkeeper/bridge/DoorkeeperBridgeGitHubIssue.php', + 'DoorkeeperBridgeGitHubUser' => 'applications/doorkeeper/bridge/DoorkeeperBridgeGitHubUser.php', + 'DoorkeeperBridgeJIRA' => 'applications/doorkeeper/bridge/DoorkeeperBridgeJIRA.php', + 'DoorkeeperBridgeJIRATestCase' => 'applications/doorkeeper/bridge/__tests__/DoorkeeperBridgeJIRATestCase.php', + 'DoorkeeperBridgedObjectCurtainExtension' => 'applications/doorkeeper/engineextension/DoorkeeperBridgedObjectCurtainExtension.php', + 'DoorkeeperBridgedObjectInterface' => 'applications/doorkeeper/bridge/DoorkeeperBridgedObjectInterface.php', 'DoorkeeperDAO' => 'applications/doorkeeper/storage/DoorkeeperDAO.php', 'DoorkeeperExternalObject' => 'applications/doorkeeper/storage/DoorkeeperExternalObject.php', + 'DoorkeeperExternalObjectPHIDType' => 'applications/doorkeeper/phid/DoorkeeperExternalObjectPHIDType.php', 'DoorkeeperExternalObjectQuery' => 'applications/doorkeeper/query/DoorkeeperExternalObjectQuery.php', 'DoorkeeperFeedStoryPublisher' => 'applications/doorkeeper/engine/DoorkeeperFeedStoryPublisher.php', - 'DoorkeeperFeedWorkerAsana' => 'applications/doorkeeper/worker/DoorkeeperFeedWorkerAsana.php', + 'DoorkeeperFeedWorker' => 'applications/doorkeeper/worker/DoorkeeperFeedWorker.php', + 'DoorkeeperHyperlinkEngineExtension' => 'applications/doorkeeper/engineextension/DoorkeeperHyperlinkEngineExtension.php', 'DoorkeeperImportEngine' => 'applications/doorkeeper/engine/DoorkeeperImportEngine.php', + 'DoorkeeperJIRAFeedWorker' => 'applications/doorkeeper/worker/DoorkeeperJIRAFeedWorker.php', + 'DoorkeeperMissingLinkException' => 'applications/doorkeeper/exception/DoorkeeperMissingLinkException.php', 'DoorkeeperObjectRef' => 'applications/doorkeeper/engine/DoorkeeperObjectRef.php', - 'DoorkeeperRemarkupRuleAsana' => 'applications/doorkeeper/remarkup/DoorkeeperRemarkupRuleAsana.php', + 'DoorkeeperRemarkupURIInterface' => 'applications/doorkeeper/interface/DoorkeeperRemarkupURIInterface.php', + 'DoorkeeperSchemaSpec' => 'applications/doorkeeper/storage/DoorkeeperSchemaSpec.php', + 'DoorkeeperTagView' => 'applications/doorkeeper/view/DoorkeeperTagView.php', 'DoorkeeperTagsController' => 'applications/doorkeeper/controller/DoorkeeperTagsController.php', - 'DrydockAllocatorWorker' => 'applications/drydock/worker/DrydockAllocatorWorker.php', + 'DoorkeeperURIRef' => 'applications/doorkeeper/engine/DoorkeeperURIRef.php', + 'DrydockAcquiredBrokenResourceException' => 'applications/drydock/exception/DrydockAcquiredBrokenResourceException.php', + 'DrydockAlmanacServiceHostBlueprintImplementation' => 'applications/drydock/blueprint/DrydockAlmanacServiceHostBlueprintImplementation.php', 'DrydockApacheWebrootInterface' => 'applications/drydock/interface/webroot/DrydockApacheWebrootInterface.php', - 'DrydockBlueprint' => 'applications/drydock/blueprint/DrydockBlueprint.php', - 'DrydockBlueprintScopeGuard' => 'applications/drydock/util/DrydockBlueprintScopeGuard.php', + 'DrydockAuthorization' => 'applications/drydock/storage/DrydockAuthorization.php', + 'DrydockAuthorizationAuthorizeController' => 'applications/drydock/controller/DrydockAuthorizationAuthorizeController.php', + 'DrydockAuthorizationListController' => 'applications/drydock/controller/DrydockAuthorizationListController.php', + 'DrydockAuthorizationListView' => 'applications/drydock/view/DrydockAuthorizationListView.php', + 'DrydockAuthorizationPHIDType' => 'applications/drydock/phid/DrydockAuthorizationPHIDType.php', + 'DrydockAuthorizationQuery' => 'applications/drydock/query/DrydockAuthorizationQuery.php', + 'DrydockAuthorizationSearchConduitAPIMethod' => 'applications/drydock/conduit/DrydockAuthorizationSearchConduitAPIMethod.php', + 'DrydockAuthorizationSearchEngine' => 'applications/drydock/query/DrydockAuthorizationSearchEngine.php', + 'DrydockAuthorizationViewController' => 'applications/drydock/controller/DrydockAuthorizationViewController.php', + 'DrydockBlueprint' => 'applications/drydock/storage/DrydockBlueprint.php', + 'DrydockBlueprintController' => 'applications/drydock/controller/DrydockBlueprintController.php', + 'DrydockBlueprintCoreCustomField' => 'applications/drydock/customfield/DrydockBlueprintCoreCustomField.php', + 'DrydockBlueprintCustomField' => 'applications/drydock/customfield/DrydockBlueprintCustomField.php', + 'DrydockBlueprintDatasource' => 'applications/drydock/typeahead/DrydockBlueprintDatasource.php', + 'DrydockBlueprintDisableController' => 'applications/drydock/controller/DrydockBlueprintDisableController.php', + 'DrydockBlueprintDisableTransaction' => 'applications/drydock/xaction/DrydockBlueprintDisableTransaction.php', + 'DrydockBlueprintEditConduitAPIMethod' => 'applications/drydock/conduit/DrydockBlueprintEditConduitAPIMethod.php', + 'DrydockBlueprintEditController' => 'applications/drydock/controller/DrydockBlueprintEditController.php', + 'DrydockBlueprintEditEngine' => 'applications/drydock/editor/DrydockBlueprintEditEngine.php', + 'DrydockBlueprintEditor' => 'applications/drydock/editor/DrydockBlueprintEditor.php', + 'DrydockBlueprintImplementation' => 'applications/drydock/blueprint/DrydockBlueprintImplementation.php', + 'DrydockBlueprintImplementationTestCase' => 'applications/drydock/blueprint/__tests__/DrydockBlueprintImplementationTestCase.php', + 'DrydockBlueprintListController' => 'applications/drydock/controller/DrydockBlueprintListController.php', + 'DrydockBlueprintNameNgrams' => 'applications/drydock/storage/DrydockBlueprintNameNgrams.php', + 'DrydockBlueprintNameTransaction' => 'applications/drydock/xaction/DrydockBlueprintNameTransaction.php', + 'DrydockBlueprintPHIDType' => 'applications/drydock/phid/DrydockBlueprintPHIDType.php', + 'DrydockBlueprintQuery' => 'applications/drydock/query/DrydockBlueprintQuery.php', + 'DrydockBlueprintSearchConduitAPIMethod' => 'applications/drydock/conduit/DrydockBlueprintSearchConduitAPIMethod.php', + 'DrydockBlueprintSearchEngine' => 'applications/drydock/query/DrydockBlueprintSearchEngine.php', + 'DrydockBlueprintTransaction' => 'applications/drydock/storage/DrydockBlueprintTransaction.php', + 'DrydockBlueprintTransactionQuery' => 'applications/drydock/query/DrydockBlueprintTransactionQuery.php', + 'DrydockBlueprintTransactionType' => 'applications/drydock/xaction/DrydockBlueprintTransactionType.php', + 'DrydockBlueprintTypeTransaction' => 'applications/drydock/xaction/DrydockBlueprintTypeTransaction.php', + 'DrydockBlueprintViewController' => 'applications/drydock/controller/DrydockBlueprintViewController.php', + 'DrydockCommand' => 'applications/drydock/storage/DrydockCommand.php', + 'DrydockCommandError' => 'applications/drydock/exception/DrydockCommandError.php', 'DrydockCommandInterface' => 'applications/drydock/interface/command/DrydockCommandInterface.php', - 'DrydockConstants' => 'applications/drydock/constants/DrydockConstants.php', + 'DrydockCommandQuery' => 'applications/drydock/query/DrydockCommandQuery.php', + 'DrydockConsoleController' => 'applications/drydock/controller/DrydockConsoleController.php', 'DrydockController' => 'applications/drydock/controller/DrydockController.php', + 'DrydockCreateBlueprintsCapability' => 'applications/drydock/capability/DrydockCreateBlueprintsCapability.php', 'DrydockDAO' => 'applications/drydock/storage/DrydockDAO.php', + 'DrydockDefaultEditCapability' => 'applications/drydock/capability/DrydockDefaultEditCapability.php', + 'DrydockDefaultViewCapability' => 'applications/drydock/capability/DrydockDefaultViewCapability.php', + 'DrydockFilesystemInterface' => 'applications/drydock/interface/filesystem/DrydockFilesystemInterface.php', 'DrydockInterface' => 'applications/drydock/interface/DrydockInterface.php', + 'DrydockLandRepositoryOperation' => 'applications/drydock/operation/DrydockLandRepositoryOperation.php', 'DrydockLease' => 'applications/drydock/storage/DrydockLease.php', + 'DrydockLeaseAcquiredLogType' => 'applications/drydock/logtype/DrydockLeaseAcquiredLogType.php', + 'DrydockLeaseActivatedLogType' => 'applications/drydock/logtype/DrydockLeaseActivatedLogType.php', + 'DrydockLeaseActivationFailureLogType' => 'applications/drydock/logtype/DrydockLeaseActivationFailureLogType.php', + 'DrydockLeaseActivationYieldLogType' => 'applications/drydock/logtype/DrydockLeaseActivationYieldLogType.php', + 'DrydockLeaseAllocationFailureLogType' => 'applications/drydock/logtype/DrydockLeaseAllocationFailureLogType.php', + 'DrydockLeaseController' => 'applications/drydock/controller/DrydockLeaseController.php', + 'DrydockLeaseDatasource' => 'applications/drydock/typeahead/DrydockLeaseDatasource.php', + 'DrydockLeaseDestroyedLogType' => 'applications/drydock/logtype/DrydockLeaseDestroyedLogType.php', 'DrydockLeaseListController' => 'applications/drydock/controller/DrydockLeaseListController.php', + 'DrydockLeaseListView' => 'applications/drydock/view/DrydockLeaseListView.php', + 'DrydockLeaseNoAuthorizationsLogType' => 'applications/drydock/logtype/DrydockLeaseNoAuthorizationsLogType.php', + 'DrydockLeaseNoBlueprintsLogType' => 'applications/drydock/logtype/DrydockLeaseNoBlueprintsLogType.php', + 'DrydockLeasePHIDType' => 'applications/drydock/phid/DrydockLeasePHIDType.php', 'DrydockLeaseQuery' => 'applications/drydock/query/DrydockLeaseQuery.php', + 'DrydockLeaseQueuedLogType' => 'applications/drydock/logtype/DrydockLeaseQueuedLogType.php', + 'DrydockLeaseReacquireLogType' => 'applications/drydock/logtype/DrydockLeaseReacquireLogType.php', + 'DrydockLeaseReclaimLogType' => 'applications/drydock/logtype/DrydockLeaseReclaimLogType.php', 'DrydockLeaseReleaseController' => 'applications/drydock/controller/DrydockLeaseReleaseController.php', + 'DrydockLeaseReleasedLogType' => 'applications/drydock/logtype/DrydockLeaseReleasedLogType.php', + 'DrydockLeaseSearchConduitAPIMethod' => 'applications/drydock/conduit/DrydockLeaseSearchConduitAPIMethod.php', + 'DrydockLeaseSearchEngine' => 'applications/drydock/query/DrydockLeaseSearchEngine.php', 'DrydockLeaseStatus' => 'applications/drydock/constants/DrydockLeaseStatus.php', + 'DrydockLeaseUpdateWorker' => 'applications/drydock/worker/DrydockLeaseUpdateWorker.php', 'DrydockLeaseViewController' => 'applications/drydock/controller/DrydockLeaseViewController.php', - 'DrydockLocalCommandInterface' => 'applications/drydock/interface/command/DrydockLocalCommandInterface.php', - 'DrydockLocalHostBlueprint' => 'applications/drydock/blueprint/DrydockLocalHostBlueprint.php', + 'DrydockLeaseWaitingForActivationLogType' => 'applications/drydock/logtype/DrydockLeaseWaitingForActivationLogType.php', + 'DrydockLeaseWaitingForReclamationLogType' => 'applications/drydock/logtype/DrydockLeaseWaitingForReclamationLogType.php', + 'DrydockLeaseWaitingForResourcesLogType' => 'applications/drydock/logtype/DrydockLeaseWaitingForResourcesLogType.php', 'DrydockLog' => 'applications/drydock/storage/DrydockLog.php', 'DrydockLogController' => 'applications/drydock/controller/DrydockLogController.php', + 'DrydockLogGarbageCollector' => 'applications/drydock/garbagecollector/DrydockLogGarbageCollector.php', + 'DrydockLogListController' => 'applications/drydock/controller/DrydockLogListController.php', + 'DrydockLogListView' => 'applications/drydock/view/DrydockLogListView.php', 'DrydockLogQuery' => 'applications/drydock/query/DrydockLogQuery.php', - 'DrydockManagementCloseWorkflow' => 'applications/drydock/management/DrydockManagementCloseWorkflow.php', + 'DrydockLogSearchEngine' => 'applications/drydock/query/DrydockLogSearchEngine.php', + 'DrydockLogType' => 'applications/drydock/logtype/DrydockLogType.php', + 'DrydockManagementCommandWorkflow' => 'applications/drydock/management/DrydockManagementCommandWorkflow.php', 'DrydockManagementLeaseWorkflow' => 'applications/drydock/management/DrydockManagementLeaseWorkflow.php', - 'DrydockManagementReleaseWorkflow' => 'applications/drydock/management/DrydockManagementReleaseWorkflow.php', - 'DrydockManagementWaitForLeaseWorkflow' => 'applications/drydock/management/DrydockManagementWaitForLeaseWorkflow.php', + 'DrydockManagementReclaimWorkflow' => 'applications/drydock/management/DrydockManagementReclaimWorkflow.php', + 'DrydockManagementReleaseLeaseWorkflow' => 'applications/drydock/management/DrydockManagementReleaseLeaseWorkflow.php', + 'DrydockManagementReleaseResourceWorkflow' => 'applications/drydock/management/DrydockManagementReleaseResourceWorkflow.php', + 'DrydockManagementUpdateLeaseWorkflow' => 'applications/drydock/management/DrydockManagementUpdateLeaseWorkflow.php', + 'DrydockManagementUpdateResourceWorkflow' => 'applications/drydock/management/DrydockManagementUpdateResourceWorkflow.php', 'DrydockManagementWorkflow' => 'applications/drydock/management/DrydockManagementWorkflow.php', + 'DrydockObjectAuthorizationView' => 'applications/drydock/view/DrydockObjectAuthorizationView.php', + 'DrydockOperationWorkLogType' => 'applications/drydock/logtype/DrydockOperationWorkLogType.php', + 'DrydockQuery' => 'applications/drydock/query/DrydockQuery.php', + 'DrydockRepositoryOperation' => 'applications/drydock/storage/DrydockRepositoryOperation.php', + 'DrydockRepositoryOperationController' => 'applications/drydock/controller/DrydockRepositoryOperationController.php', + 'DrydockRepositoryOperationDismissController' => 'applications/drydock/controller/DrydockRepositoryOperationDismissController.php', + 'DrydockRepositoryOperationListController' => 'applications/drydock/controller/DrydockRepositoryOperationListController.php', + 'DrydockRepositoryOperationPHIDType' => 'applications/drydock/phid/DrydockRepositoryOperationPHIDType.php', + 'DrydockRepositoryOperationQuery' => 'applications/drydock/query/DrydockRepositoryOperationQuery.php', + 'DrydockRepositoryOperationSearchEngine' => 'applications/drydock/query/DrydockRepositoryOperationSearchEngine.php', + 'DrydockRepositoryOperationStatusController' => 'applications/drydock/controller/DrydockRepositoryOperationStatusController.php', + 'DrydockRepositoryOperationStatusView' => 'applications/drydock/view/DrydockRepositoryOperationStatusView.php', + 'DrydockRepositoryOperationType' => 'applications/drydock/operation/DrydockRepositoryOperationType.php', + 'DrydockRepositoryOperationUpdateWorker' => 'applications/drydock/worker/DrydockRepositoryOperationUpdateWorker.php', + 'DrydockRepositoryOperationViewController' => 'applications/drydock/controller/DrydockRepositoryOperationViewController.php', 'DrydockResource' => 'applications/drydock/storage/DrydockResource.php', - 'DrydockResourceCloseController' => 'applications/drydock/controller/DrydockResourceCloseController.php', + 'DrydockResourceActivationFailureLogType' => 'applications/drydock/logtype/DrydockResourceActivationFailureLogType.php', + 'DrydockResourceActivationYieldLogType' => 'applications/drydock/logtype/DrydockResourceActivationYieldLogType.php', + 'DrydockResourceAllocationFailureLogType' => 'applications/drydock/logtype/DrydockResourceAllocationFailureLogType.php', + 'DrydockResourceController' => 'applications/drydock/controller/DrydockResourceController.php', + 'DrydockResourceDatasource' => 'applications/drydock/typeahead/DrydockResourceDatasource.php', 'DrydockResourceListController' => 'applications/drydock/controller/DrydockResourceListController.php', + 'DrydockResourceListView' => 'applications/drydock/view/DrydockResourceListView.php', + 'DrydockResourceLockException' => 'applications/drydock/exception/DrydockResourceLockException.php', + 'DrydockResourcePHIDType' => 'applications/drydock/phid/DrydockResourcePHIDType.php', 'DrydockResourceQuery' => 'applications/drydock/query/DrydockResourceQuery.php', + 'DrydockResourceReclaimLogType' => 'applications/drydock/logtype/DrydockResourceReclaimLogType.php', + 'DrydockResourceReleaseController' => 'applications/drydock/controller/DrydockResourceReleaseController.php', + 'DrydockResourceSearchConduitAPIMethod' => 'applications/drydock/conduit/DrydockResourceSearchConduitAPIMethod.php', + 'DrydockResourceSearchEngine' => 'applications/drydock/query/DrydockResourceSearchEngine.php', 'DrydockResourceStatus' => 'applications/drydock/constants/DrydockResourceStatus.php', + 'DrydockResourceUpdateWorker' => 'applications/drydock/worker/DrydockResourceUpdateWorker.php', 'DrydockResourceViewController' => 'applications/drydock/controller/DrydockResourceViewController.php', + 'DrydockSFTPFilesystemInterface' => 'applications/drydock/interface/filesystem/DrydockSFTPFilesystemInterface.php', 'DrydockSSHCommandInterface' => 'applications/drydock/interface/command/DrydockSSHCommandInterface.php', + 'DrydockSchemaSpec' => 'applications/drydock/storage/DrydockSchemaSpec.php', + 'DrydockSlotLock' => 'applications/drydock/storage/DrydockSlotLock.php', + 'DrydockSlotLockException' => 'applications/drydock/exception/DrydockSlotLockException.php', + 'DrydockSlotLockFailureLogType' => 'applications/drydock/logtype/DrydockSlotLockFailureLogType.php', + 'DrydockTestRepositoryOperation' => 'applications/drydock/operation/DrydockTestRepositoryOperation.php', + 'DrydockTextLogType' => 'applications/drydock/logtype/DrydockTextLogType.php', 'DrydockWebrootInterface' => 'applications/drydock/interface/webroot/DrydockWebrootInterface.php', - 'DrydockWorkingCopyBlueprint' => 'applications/drydock/blueprint/DrydockWorkingCopyBlueprint.php', + 'DrydockWorker' => 'applications/drydock/worker/DrydockWorker.php', + 'DrydockWorkingCopyBlueprintImplementation' => 'applications/drydock/blueprint/DrydockWorkingCopyBlueprintImplementation.php', + 'EdgeSearchConduitAPIMethod' => 'infrastructure/edges/conduit/EdgeSearchConduitAPIMethod.php', + 'FeedConduitAPIMethod' => 'applications/feed/conduit/FeedConduitAPIMethod.php', 'FeedPublisherHTTPWorker' => 'applications/feed/worker/FeedPublisherHTTPWorker.php', 'FeedPublisherWorker' => 'applications/feed/worker/FeedPublisherWorker.php', 'FeedPushWorker' => 'applications/feed/worker/FeedPushWorker.php', - 'FilesCreateMailReceiver' => 'applications/files/mail/FilesCreateMailReceiver.php', + 'FeedQueryConduitAPIMethod' => 'applications/feed/conduit/FeedQueryConduitAPIMethod.php', + 'FeedStoryNotificationGarbageCollector' => 'applications/notification/garbagecollector/FeedStoryNotificationGarbageCollector.php', + 'FerretConfigurableSearchFunction' => 'applications/search/ferret/function/FerretConfigurableSearchFunction.php', + 'FerretSearchFunction' => 'applications/search/ferret/function/FerretSearchFunction.php', + 'FileAllocateConduitAPIMethod' => 'applications/files/conduit/FileAllocateConduitAPIMethod.php', + 'FileConduitAPIMethod' => 'applications/files/conduit/FileConduitAPIMethod.php', + 'FileCreateMailReceiver' => 'applications/files/mail/FileCreateMailReceiver.php', + 'FileDeletionWorker' => 'applications/files/worker/FileDeletionWorker.php', + 'FileDownloadConduitAPIMethod' => 'applications/files/conduit/FileDownloadConduitAPIMethod.php', + 'FileInfoConduitAPIMethod' => 'applications/files/conduit/FileInfoConduitAPIMethod.php', + 'FileMailReceiver' => 'applications/files/mail/FileMailReceiver.php', + 'FileQueryChunksConduitAPIMethod' => 'applications/files/conduit/FileQueryChunksConduitAPIMethod.php', + 'FileReplyHandler' => 'applications/files/mail/FileReplyHandler.php', + 'FileTypeIcon' => 'applications/files/constants/FileTypeIcon.php', + 'FileUploadChunkConduitAPIMethod' => 'applications/files/conduit/FileUploadChunkConduitAPIMethod.php', + 'FileUploadConduitAPIMethod' => 'applications/files/conduit/FileUploadConduitAPIMethod.php', + 'FileUploadHashConduitAPIMethod' => 'applications/files/conduit/FileUploadHashConduitAPIMethod.php', + 'FilesDefaultViewCapability' => 'applications/files/capability/FilesDefaultViewCapability.php', + 'FlagConduitAPIMethod' => 'applications/flag/conduit/FlagConduitAPIMethod.php', + 'FlagDeleteConduitAPIMethod' => 'applications/flag/conduit/FlagDeleteConduitAPIMethod.php', + 'FlagEditConduitAPIMethod' => 'applications/flag/conduit/FlagEditConduitAPIMethod.php', + 'FlagQueryConduitAPIMethod' => 'applications/flag/conduit/FlagQueryConduitAPIMethod.php', + 'FuelComponentView' => 'view/fuel/FuelComponentView.php', + 'FuelGridCellView' => 'view/fuel/FuelGridCellView.php', + 'FuelGridRowView' => 'view/fuel/FuelGridRowView.php', + 'FuelGridView' => 'view/fuel/FuelGridView.php', + 'FuelHandleListItemView' => 'view/fuel/FuelHandleListItemView.php', + 'FuelHandleListView' => 'view/fuel/FuelHandleListView.php', + 'FuelMapItemView' => 'view/fuel/FuelMapItemView.php', + 'FuelMapView' => 'view/fuel/FuelMapView.php', + 'FuelMenuItemView' => 'view/fuel/FuelMenuItemView.php', + 'FuelMenuView' => 'view/fuel/FuelMenuView.php', + 'FuelView' => 'view/fuel/FuelView.php', + 'FundBacker' => 'applications/fund/storage/FundBacker.php', + 'FundBackerCart' => 'applications/fund/phortune/FundBackerCart.php', + 'FundBackerEditor' => 'applications/fund/editor/FundBackerEditor.php', + 'FundBackerListController' => 'applications/fund/controller/FundBackerListController.php', + 'FundBackerPHIDType' => 'applications/fund/phid/FundBackerPHIDType.php', + 'FundBackerProduct' => 'applications/fund/phortune/FundBackerProduct.php', + 'FundBackerQuery' => 'applications/fund/query/FundBackerQuery.php', + 'FundBackerRefundTransaction' => 'applications/fund/xaction/FundBackerRefundTransaction.php', + 'FundBackerSearchEngine' => 'applications/fund/query/FundBackerSearchEngine.php', + 'FundBackerStatusTransaction' => 'applications/fund/xaction/FundBackerStatusTransaction.php', + 'FundBackerTransaction' => 'applications/fund/storage/FundBackerTransaction.php', + 'FundBackerTransactionQuery' => 'applications/fund/query/FundBackerTransactionQuery.php', + 'FundBackerTransactionType' => 'applications/fund/xaction/FundBackerTransactionType.php', + 'FundController' => 'applications/fund/controller/FundController.php', + 'FundCreateInitiativesCapability' => 'applications/fund/capability/FundCreateInitiativesCapability.php', + 'FundDAO' => 'applications/fund/storage/FundDAO.php', + 'FundDefaultViewCapability' => 'applications/fund/capability/FundDefaultViewCapability.php', + 'FundInitiative' => 'applications/fund/storage/FundInitiative.php', + 'FundInitiativeBackController' => 'applications/fund/controller/FundInitiativeBackController.php', + 'FundInitiativeBackerTransaction' => 'applications/fund/xaction/FundInitiativeBackerTransaction.php', + 'FundInitiativeCloseController' => 'applications/fund/controller/FundInitiativeCloseController.php', + 'FundInitiativeDescriptionTransaction' => 'applications/fund/xaction/FundInitiativeDescriptionTransaction.php', + 'FundInitiativeEditController' => 'applications/fund/controller/FundInitiativeEditController.php', + 'FundInitiativeEditEngine' => 'applications/fund/editor/FundInitiativeEditEngine.php', + 'FundInitiativeEditor' => 'applications/fund/editor/FundInitiativeEditor.php', + 'FundInitiativeFerretEngine' => 'applications/fund/search/FundInitiativeFerretEngine.php', + 'FundInitiativeFulltextEngine' => 'applications/fund/search/FundInitiativeFulltextEngine.php', + 'FundInitiativeListController' => 'applications/fund/controller/FundInitiativeListController.php', + 'FundInitiativeMerchantTransaction' => 'applications/fund/xaction/FundInitiativeMerchantTransaction.php', + 'FundInitiativeNameTransaction' => 'applications/fund/xaction/FundInitiativeNameTransaction.php', + 'FundInitiativePHIDType' => 'applications/fund/phid/FundInitiativePHIDType.php', + 'FundInitiativeQuery' => 'applications/fund/query/FundInitiativeQuery.php', + 'FundInitiativeRefundTransaction' => 'applications/fund/xaction/FundInitiativeRefundTransaction.php', + 'FundInitiativeRemarkupRule' => 'applications/fund/remarkup/FundInitiativeRemarkupRule.php', + 'FundInitiativeReplyHandler' => 'applications/fund/mail/FundInitiativeReplyHandler.php', + 'FundInitiativeRisksTransaction' => 'applications/fund/xaction/FundInitiativeRisksTransaction.php', + 'FundInitiativeSearchEngine' => 'applications/fund/query/FundInitiativeSearchEngine.php', + 'FundInitiativeStatusTransaction' => 'applications/fund/xaction/FundInitiativeStatusTransaction.php', + 'FundInitiativeTransaction' => 'applications/fund/storage/FundInitiativeTransaction.php', + 'FundInitiativeTransactionComment' => 'applications/fund/storage/FundInitiativeTransactionComment.php', + 'FundInitiativeTransactionQuery' => 'applications/fund/query/FundInitiativeTransactionQuery.php', + 'FundInitiativeTransactionType' => 'applications/fund/xaction/FundInitiativeTransactionType.php', + 'FundInitiativeViewController' => 'applications/fund/controller/FundInitiativeViewController.php', + 'FundSchemaSpec' => 'applications/fund/storage/FundSchemaSpec.php', + 'HarbormasterAbortOlderBuildsBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterAbortOlderBuildsBuildStepImplementation.php', + 'HarbormasterArcLintBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterArcLintBuildStepImplementation.php', + 'HarbormasterArcUnitBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterArcUnitBuildStepImplementation.php', + 'HarbormasterArtifact' => 'applications/harbormaster/artifact/HarbormasterArtifact.php', + 'HarbormasterArtifactSearchConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterArtifactSearchConduitAPIMethod.php', + 'HarbormasterArtifactSearchEngine' => 'applications/harbormaster/query/HarbormasterArtifactSearchEngine.php', + 'HarbormasterAutotargetsTestCase' => 'applications/harbormaster/__tests__/HarbormasterAutotargetsTestCase.php', + 'HarbormasterBuild' => 'applications/harbormaster/storage/build/HarbormasterBuild.php', + 'HarbormasterBuildAbortedException' => 'applications/harbormaster/exception/HarbormasterBuildAbortedException.php', + 'HarbormasterBuildActionController' => 'applications/harbormaster/controller/HarbormasterBuildActionController.php', + 'HarbormasterBuildArcanistAutoplan' => 'applications/harbormaster/autoplan/HarbormasterBuildArcanistAutoplan.php', + 'HarbormasterBuildArtifact' => 'applications/harbormaster/storage/build/HarbormasterBuildArtifact.php', + 'HarbormasterBuildArtifactPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildArtifactPHIDType.php', + 'HarbormasterBuildArtifactQuery' => 'applications/harbormaster/query/HarbormasterBuildArtifactQuery.php', + 'HarbormasterBuildAutoplan' => 'applications/harbormaster/autoplan/HarbormasterBuildAutoplan.php', + 'HarbormasterBuildDependencyDatasource' => 'applications/harbormaster/typeahead/HarbormasterBuildDependencyDatasource.php', + 'HarbormasterBuildEditAPIMethod' => 'applications/harbormaster/conduit/HarbormasterBuildEditAPIMethod.php', + 'HarbormasterBuildEditEngine' => 'applications/harbormaster/editor/HarbormasterBuildEditEngine.php', + 'HarbormasterBuildEngine' => 'applications/harbormaster/engine/HarbormasterBuildEngine.php', + 'HarbormasterBuildFailureException' => 'applications/harbormaster/exception/HarbormasterBuildFailureException.php', + 'HarbormasterBuildGraph' => 'applications/harbormaster/engine/HarbormasterBuildGraph.php', + 'HarbormasterBuildInitiatorDatasource' => 'applications/harbormaster/typeahead/HarbormasterBuildInitiatorDatasource.php', + 'HarbormasterBuildLintMessage' => 'applications/harbormaster/storage/build/HarbormasterBuildLintMessage.php', + 'HarbormasterBuildListController' => 'applications/harbormaster/controller/HarbormasterBuildListController.php', + 'HarbormasterBuildLog' => 'applications/harbormaster/storage/build/HarbormasterBuildLog.php', + 'HarbormasterBuildLogChunk' => 'applications/harbormaster/storage/build/HarbormasterBuildLogChunk.php', + 'HarbormasterBuildLogChunkIterator' => 'applications/harbormaster/storage/build/HarbormasterBuildLogChunkIterator.php', + 'HarbormasterBuildLogDownloadController' => 'applications/harbormaster/controller/HarbormasterBuildLogDownloadController.php', + 'HarbormasterBuildLogPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildLogPHIDType.php', + 'HarbormasterBuildLogQuery' => 'applications/harbormaster/query/HarbormasterBuildLogQuery.php', + 'HarbormasterBuildLogRenderController' => 'applications/harbormaster/controller/HarbormasterBuildLogRenderController.php', + 'HarbormasterBuildLogSearchConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterBuildLogSearchConduitAPIMethod.php', + 'HarbormasterBuildLogSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildLogSearchEngine.php', + 'HarbormasterBuildLogTestCase' => 'applications/harbormaster/__tests__/HarbormasterBuildLogTestCase.php', + 'HarbormasterBuildLogView' => 'applications/harbormaster/view/HarbormasterBuildLogView.php', + 'HarbormasterBuildLogViewController' => 'applications/harbormaster/controller/HarbormasterBuildLogViewController.php', + 'HarbormasterBuildMessage' => 'applications/harbormaster/storage/HarbormasterBuildMessage.php', + 'HarbormasterBuildMessageAbortTransaction' => 'applications/harbormaster/xaction/build/HarbormasterBuildMessageAbortTransaction.php', + 'HarbormasterBuildMessagePauseTransaction' => 'applications/harbormaster/xaction/build/HarbormasterBuildMessagePauseTransaction.php', + 'HarbormasterBuildMessageQuery' => 'applications/harbormaster/query/HarbormasterBuildMessageQuery.php', + 'HarbormasterBuildMessageRestartTransaction' => 'applications/harbormaster/xaction/build/HarbormasterBuildMessageRestartTransaction.php', + 'HarbormasterBuildMessageResumeTransaction' => 'applications/harbormaster/xaction/build/HarbormasterBuildMessageResumeTransaction.php', + 'HarbormasterBuildMessageTransaction' => 'applications/harbormaster/xaction/build/HarbormasterBuildMessageTransaction.php', + 'HarbormasterBuildPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildPHIDType.php', + 'HarbormasterBuildPlan' => 'applications/harbormaster/storage/configuration/HarbormasterBuildPlan.php', + 'HarbormasterBuildPlanBehavior' => 'applications/harbormaster/plan/HarbormasterBuildPlanBehavior.php', + 'HarbormasterBuildPlanBehaviorOption' => 'applications/harbormaster/plan/HarbormasterBuildPlanBehaviorOption.php', + 'HarbormasterBuildPlanBehaviorTransaction' => 'applications/harbormaster/xaction/plan/HarbormasterBuildPlanBehaviorTransaction.php', + 'HarbormasterBuildPlanDatasource' => 'applications/harbormaster/typeahead/HarbormasterBuildPlanDatasource.php', + 'HarbormasterBuildPlanDefaultEditCapability' => 'applications/harbormaster/capability/HarbormasterBuildPlanDefaultEditCapability.php', + 'HarbormasterBuildPlanDefaultViewCapability' => 'applications/harbormaster/capability/HarbormasterBuildPlanDefaultViewCapability.php', + 'HarbormasterBuildPlanEditAPIMethod' => 'applications/harbormaster/conduit/HarbormasterBuildPlanEditAPIMethod.php', + 'HarbormasterBuildPlanEditEngine' => 'applications/harbormaster/editor/HarbormasterBuildPlanEditEngine.php', + 'HarbormasterBuildPlanEditor' => 'applications/harbormaster/editor/HarbormasterBuildPlanEditor.php', + 'HarbormasterBuildPlanNameNgrams' => 'applications/harbormaster/storage/configuration/HarbormasterBuildPlanNameNgrams.php', + 'HarbormasterBuildPlanNameTransaction' => 'applications/harbormaster/xaction/plan/HarbormasterBuildPlanNameTransaction.php', + 'HarbormasterBuildPlanPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildPlanPHIDType.php', + 'HarbormasterBuildPlanPolicyCodex' => 'applications/harbormaster/codex/HarbormasterBuildPlanPolicyCodex.php', + 'HarbormasterBuildPlanQuery' => 'applications/harbormaster/query/HarbormasterBuildPlanQuery.php', + 'HarbormasterBuildPlanSearchAPIMethod' => 'applications/harbormaster/conduit/HarbormasterBuildPlanSearchAPIMethod.php', + 'HarbormasterBuildPlanSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildPlanSearchEngine.php', + 'HarbormasterBuildPlanStatusTransaction' => 'applications/harbormaster/xaction/plan/HarbormasterBuildPlanStatusTransaction.php', + 'HarbormasterBuildPlanTransaction' => 'applications/harbormaster/storage/configuration/HarbormasterBuildPlanTransaction.php', + 'HarbormasterBuildPlanTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildPlanTransactionQuery.php', + 'HarbormasterBuildPlanTransactionType' => 'applications/harbormaster/xaction/plan/HarbormasterBuildPlanTransactionType.php', + 'HarbormasterBuildQuery' => 'applications/harbormaster/query/HarbormasterBuildQuery.php', + 'HarbormasterBuildRequest' => 'applications/harbormaster/engine/HarbormasterBuildRequest.php', + 'HarbormasterBuildSearchConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterBuildSearchConduitAPIMethod.php', + 'HarbormasterBuildSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildSearchEngine.php', + 'HarbormasterBuildStatus' => 'applications/harbormaster/constants/HarbormasterBuildStatus.php', + 'HarbormasterBuildStatusDatasource' => 'applications/harbormaster/typeahead/HarbormasterBuildStatusDatasource.php', + 'HarbormasterBuildStep' => 'applications/harbormaster/storage/configuration/HarbormasterBuildStep.php', + 'HarbormasterBuildStepCoreCustomField' => 'applications/harbormaster/customfield/HarbormasterBuildStepCoreCustomField.php', + 'HarbormasterBuildStepCustomField' => 'applications/harbormaster/customfield/HarbormasterBuildStepCustomField.php', + 'HarbormasterBuildStepEditAPIMethod' => 'applications/harbormaster/conduit/HarbormasterBuildStepEditAPIMethod.php', + 'HarbormasterBuildStepEditEngine' => 'applications/harbormaster/editor/HarbormasterBuildStepEditEngine.php', + 'HarbormasterBuildStepEditor' => 'applications/harbormaster/editor/HarbormasterBuildStepEditor.php', + 'HarbormasterBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterBuildStepGroup.php', + 'HarbormasterBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterBuildStepImplementation.php', + 'HarbormasterBuildStepImplementationTestCase' => 'applications/harbormaster/step/__tests__/HarbormasterBuildStepImplementationTestCase.php', + 'HarbormasterBuildStepPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildStepPHIDType.php', + 'HarbormasterBuildStepQuery' => 'applications/harbormaster/query/HarbormasterBuildStepQuery.php', + 'HarbormasterBuildStepSearchAPIMethod' => 'applications/harbormaster/conduit/HarbormasterBuildStepSearchAPIMethod.php', + 'HarbormasterBuildStepSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildStepSearchEngine.php', + 'HarbormasterBuildStepTransaction' => 'applications/harbormaster/storage/configuration/HarbormasterBuildStepTransaction.php', + 'HarbormasterBuildStepTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildStepTransactionQuery.php', + 'HarbormasterBuildTarget' => 'applications/harbormaster/storage/build/HarbormasterBuildTarget.php', + 'HarbormasterBuildTargetPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildTargetPHIDType.php', + 'HarbormasterBuildTargetQuery' => 'applications/harbormaster/query/HarbormasterBuildTargetQuery.php', + 'HarbormasterBuildTargetSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildTargetSearchEngine.php', + 'HarbormasterBuildTransaction' => 'applications/harbormaster/storage/HarbormasterBuildTransaction.php', + 'HarbormasterBuildTransactionEditor' => 'applications/harbormaster/editor/HarbormasterBuildTransactionEditor.php', + 'HarbormasterBuildTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildTransactionQuery.php', + 'HarbormasterBuildTransactionType' => 'applications/harbormaster/xaction/build/HarbormasterBuildTransactionType.php', + 'HarbormasterBuildUnitMessage' => 'applications/harbormaster/storage/build/HarbormasterBuildUnitMessage.php', + 'HarbormasterBuildUnitMessageQuery' => 'applications/harbormaster/query/HarbormasterBuildUnitMessageQuery.php', + 'HarbormasterBuildView' => 'applications/harbormaster/view/HarbormasterBuildView.php', + 'HarbormasterBuildViewController' => 'applications/harbormaster/controller/HarbormasterBuildViewController.php', + 'HarbormasterBuildWorker' => 'applications/harbormaster/worker/HarbormasterBuildWorker.php', + 'HarbormasterBuildable' => 'applications/harbormaster/storage/HarbormasterBuildable.php', + 'HarbormasterBuildableActionController' => 'applications/harbormaster/controller/HarbormasterBuildableActionController.php', + 'HarbormasterBuildableAdapterInterface' => 'applications/harbormaster/herald/HarbormasterBuildableAdapterInterface.php', + 'HarbormasterBuildableEditAPIMethod' => 'applications/harbormaster/conduit/HarbormasterBuildableEditAPIMethod.php', + 'HarbormasterBuildableEditEngine' => 'applications/harbormaster/editor/HarbormasterBuildableEditEngine.php', + 'HarbormasterBuildableEngine' => 'applications/harbormaster/engine/HarbormasterBuildableEngine.php', + 'HarbormasterBuildableInterface' => 'applications/harbormaster/interface/HarbormasterBuildableInterface.php', + 'HarbormasterBuildableListController' => 'applications/harbormaster/controller/HarbormasterBuildableListController.php', + 'HarbormasterBuildableMessageTransaction' => 'applications/harbormaster/xaction/buildable/HarbormasterBuildableMessageTransaction.php', + 'HarbormasterBuildablePHIDType' => 'applications/harbormaster/phid/HarbormasterBuildablePHIDType.php', + 'HarbormasterBuildableQuery' => 'applications/harbormaster/query/HarbormasterBuildableQuery.php', + 'HarbormasterBuildableSearchAPIMethod' => 'applications/harbormaster/conduit/HarbormasterBuildableSearchAPIMethod.php', + 'HarbormasterBuildableSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildableSearchEngine.php', + 'HarbormasterBuildableStatus' => 'applications/harbormaster/constants/HarbormasterBuildableStatus.php', + 'HarbormasterBuildableTransaction' => 'applications/harbormaster/storage/HarbormasterBuildableTransaction.php', + 'HarbormasterBuildableTransactionEditor' => 'applications/harbormaster/editor/HarbormasterBuildableTransactionEditor.php', + 'HarbormasterBuildableTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildableTransactionQuery.php', + 'HarbormasterBuildableTransactionType' => 'applications/harbormaster/xaction/buildable/HarbormasterBuildableTransactionType.php', + 'HarbormasterBuildableViewController' => 'applications/harbormaster/controller/HarbormasterBuildableViewController.php', + 'HarbormasterBuildkiteBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterBuildkiteBuildStepImplementation.php', + 'HarbormasterBuildkiteBuildableInterface' => 'applications/harbormaster/interface/HarbormasterBuildkiteBuildableInterface.php', + 'HarbormasterBuildkiteHookController' => 'applications/harbormaster/controller/HarbormasterBuildkiteHookController.php', + 'HarbormasterBuiltinBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterBuiltinBuildStepGroup.php', + 'HarbormasterCircleCIBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterCircleCIBuildStepImplementation.php', + 'HarbormasterCircleCIBuildableInterface' => 'applications/harbormaster/interface/HarbormasterCircleCIBuildableInterface.php', + 'HarbormasterCircleCIHookController' => 'applications/harbormaster/controller/HarbormasterCircleCIHookController.php', + 'HarbormasterConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterConduitAPIMethod.php', + 'HarbormasterControlBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterControlBuildStepGroup.php', + 'HarbormasterController' => 'applications/harbormaster/controller/HarbormasterController.php', + 'HarbormasterCreateArtifactConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterCreateArtifactConduitAPIMethod.php', + 'HarbormasterCreatePlansCapability' => 'applications/harbormaster/capability/HarbormasterCreatePlansCapability.php', 'HarbormasterDAO' => 'applications/harbormaster/storage/HarbormasterDAO.php', + 'HarbormasterDrydockBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterDrydockBuildStepGroup.php', + 'HarbormasterDrydockCommandBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterDrydockCommandBuildStepImplementation.php', + 'HarbormasterDrydockLeaseArtifact' => 'applications/harbormaster/artifact/HarbormasterDrydockLeaseArtifact.php', + 'HarbormasterExecFuture' => 'applications/harbormaster/future/HarbormasterExecFuture.php', + 'HarbormasterExternalBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterExternalBuildStepGroup.php', + 'HarbormasterFileArtifact' => 'applications/harbormaster/artifact/HarbormasterFileArtifact.php', + 'HarbormasterHTTPRequestBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterHTTPRequestBuildStepImplementation.php', + 'HarbormasterHostArtifact' => 'applications/harbormaster/artifact/HarbormasterHostArtifact.php', + 'HarbormasterLeaseWorkingCopyBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterLeaseWorkingCopyBuildStepImplementation.php', + 'HarbormasterLintMessagesController' => 'applications/harbormaster/controller/HarbormasterLintMessagesController.php', + 'HarbormasterLintPropertyView' => 'applications/harbormaster/view/HarbormasterLintPropertyView.php', + 'HarbormasterLogWorker' => 'applications/harbormaster/worker/HarbormasterLogWorker.php', + 'HarbormasterManagementArchiveLogsWorkflow' => 'applications/harbormaster/management/HarbormasterManagementArchiveLogsWorkflow.php', + 'HarbormasterManagementBuildWorkflow' => 'applications/harbormaster/management/HarbormasterManagementBuildWorkflow.php', + 'HarbormasterManagementPublishWorkflow' => 'applications/harbormaster/management/HarbormasterManagementPublishWorkflow.php', + 'HarbormasterManagementRebuildLogWorkflow' => 'applications/harbormaster/management/HarbormasterManagementRebuildLogWorkflow.php', + 'HarbormasterManagementRestartWorkflow' => 'applications/harbormaster/management/HarbormasterManagementRestartWorkflow.php', + 'HarbormasterManagementUpdateWorkflow' => 'applications/harbormaster/management/HarbormasterManagementUpdateWorkflow.php', + 'HarbormasterManagementWorkflow' => 'applications/harbormaster/management/HarbormasterManagementWorkflow.php', + 'HarbormasterManagementWriteLogWorkflow' => 'applications/harbormaster/management/HarbormasterManagementWriteLogWorkflow.php', + 'HarbormasterMessageException' => 'applications/harbormaster/exception/HarbormasterMessageException.php', + 'HarbormasterMessageType' => 'applications/harbormaster/engine/HarbormasterMessageType.php', 'HarbormasterObject' => 'applications/harbormaster/storage/HarbormasterObject.php', - 'HarbormasterRunnerWorker' => 'applications/harbormaster/worker/HarbormasterRunnerWorker.php', + 'HarbormasterOtherBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterOtherBuildStepGroup.php', + 'HarbormasterPlanBehaviorController' => 'applications/harbormaster/controller/HarbormasterPlanBehaviorController.php', + 'HarbormasterPlanController' => 'applications/harbormaster/controller/HarbormasterPlanController.php', + 'HarbormasterPlanDisableController' => 'applications/harbormaster/controller/HarbormasterPlanDisableController.php', + 'HarbormasterPlanEditController' => 'applications/harbormaster/controller/HarbormasterPlanEditController.php', + 'HarbormasterPlanListController' => 'applications/harbormaster/controller/HarbormasterPlanListController.php', + 'HarbormasterPlanRunController' => 'applications/harbormaster/controller/HarbormasterPlanRunController.php', + 'HarbormasterPlanViewController' => 'applications/harbormaster/controller/HarbormasterPlanViewController.php', + 'HarbormasterPrototypeBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterPrototypeBuildStepGroup.php', + 'HarbormasterQueryAutotargetsConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterQueryAutotargetsConduitAPIMethod.php', + 'HarbormasterQueryBuildablesConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterQueryBuildablesConduitAPIMethod.php', + 'HarbormasterQueryBuildsConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterQueryBuildsConduitAPIMethod.php', + 'HarbormasterQueryBuildsSearchEngineAttachment' => 'applications/harbormaster/engineextension/HarbormasterQueryBuildsSearchEngineAttachment.php', + 'HarbormasterRemarkupRule' => 'applications/harbormaster/remarkup/HarbormasterRemarkupRule.php', + 'HarbormasterRunBuildPlansHeraldAction' => 'applications/harbormaster/herald/HarbormasterRunBuildPlansHeraldAction.php', + 'HarbormasterSchemaSpec' => 'applications/harbormaster/storage/HarbormasterSchemaSpec.php', 'HarbormasterScratchTable' => 'applications/harbormaster/storage/HarbormasterScratchTable.php', - 'HeraldAction' => 'applications/herald/storage/HeraldAction.php', + 'HarbormasterSendMessageConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterSendMessageConduitAPIMethod.php', + 'HarbormasterSleepBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterSleepBuildStepImplementation.php', + 'HarbormasterStepAddController' => 'applications/harbormaster/controller/HarbormasterStepAddController.php', + 'HarbormasterStepDeleteController' => 'applications/harbormaster/controller/HarbormasterStepDeleteController.php', + 'HarbormasterStepEditController' => 'applications/harbormaster/controller/HarbormasterStepEditController.php', + 'HarbormasterStepViewController' => 'applications/harbormaster/controller/HarbormasterStepViewController.php', + 'HarbormasterString' => 'applications/harbormaster/storage/HarbormasterString.php', + 'HarbormasterTargetEngine' => 'applications/harbormaster/engine/HarbormasterTargetEngine.php', + 'HarbormasterTargetSearchAPIMethod' => 'applications/harbormaster/conduit/HarbormasterTargetSearchAPIMethod.php', + 'HarbormasterTargetWorker' => 'applications/harbormaster/worker/HarbormasterTargetWorker.php', + 'HarbormasterTestBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterTestBuildStepGroup.php', + 'HarbormasterThrowExceptionBuildStep' => 'applications/harbormaster/step/HarbormasterThrowExceptionBuildStep.php', + 'HarbormasterUIEventListener' => 'applications/harbormaster/event/HarbormasterUIEventListener.php', + 'HarbormasterURIArtifact' => 'applications/harbormaster/artifact/HarbormasterURIArtifact.php', + 'HarbormasterUnitMessageListController' => 'applications/harbormaster/controller/HarbormasterUnitMessageListController.php', + 'HarbormasterUnitMessageViewController' => 'applications/harbormaster/controller/HarbormasterUnitMessageViewController.php', + 'HarbormasterUnitPropertyView' => 'applications/harbormaster/view/HarbormasterUnitPropertyView.php', + 'HarbormasterUnitStatus' => 'applications/harbormaster/constants/HarbormasterUnitStatus.php', + 'HarbormasterUnitSummaryView' => 'applications/harbormaster/view/HarbormasterUnitSummaryView.php', + 'HarbormasterUploadArtifactBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterUploadArtifactBuildStepImplementation.php', + 'HarbormasterWaitForPreviousBuildStepImplementation' => 'applications/harbormaster/step/HarbormasterWaitForPreviousBuildStepImplementation.php', + 'HarbormasterWorker' => 'applications/harbormaster/worker/HarbormasterWorker.php', + 'HarbormasterWorkingCopyArtifact' => 'applications/harbormaster/artifact/HarbormasterWorkingCopyArtifact.php', + 'HeraldActingUserField' => 'applications/herald/field/HeraldActingUserField.php', + 'HeraldAction' => 'applications/herald/action/HeraldAction.php', + 'HeraldActionGroup' => 'applications/herald/action/HeraldActionGroup.php', + 'HeraldActionRecord' => 'applications/herald/storage/HeraldActionRecord.php', 'HeraldAdapter' => 'applications/herald/adapter/HeraldAdapter.php', + 'HeraldAdapterDatasource' => 'applications/herald/typeahead/HeraldAdapterDatasource.php', + 'HeraldAlwaysField' => 'applications/herald/field/HeraldAlwaysField.php', + 'HeraldAnotherRuleField' => 'applications/herald/field/HeraldAnotherRuleField.php', + 'HeraldApplicationActionGroup' => 'applications/herald/action/HeraldApplicationActionGroup.php', 'HeraldApplyTranscript' => 'applications/herald/storage/transcript/HeraldApplyTranscript.php', - 'HeraldCommitAdapter' => 'applications/herald/adapter/HeraldCommitAdapter.php', + 'HeraldBasicFieldGroup' => 'applications/herald/field/HeraldBasicFieldGroup.php', + 'HeraldBoolFieldValue' => 'applications/herald/value/HeraldBoolFieldValue.php', + 'HeraldBuildableState' => 'applications/herald/state/HeraldBuildableState.php', + 'HeraldCallWebhookAction' => 'applications/herald/action/HeraldCallWebhookAction.php', + 'HeraldCommentAction' => 'applications/herald/action/HeraldCommentAction.php', + 'HeraldCommentContentField' => 'applications/herald/field/HeraldCommentContentField.php', + 'HeraldCommitAdapter' => 'applications/diffusion/herald/HeraldCommitAdapter.php', 'HeraldCondition' => 'applications/herald/storage/HeraldCondition.php', + 'HeraldConditionResult' => 'applications/herald/storage/transcript/HeraldConditionResult.php', 'HeraldConditionTranscript' => 'applications/herald/storage/transcript/HeraldConditionTranscript.php', + 'HeraldContentSourceField' => 'applications/herald/field/HeraldContentSourceField.php', 'HeraldController' => 'applications/herald/controller/HeraldController.php', + 'HeraldCoreStateReasons' => 'applications/herald/state/HeraldCoreStateReasons.php', + 'HeraldCreateWebhooksCapability' => 'applications/herald/capability/HeraldCreateWebhooksCapability.php', 'HeraldDAO' => 'applications/herald/storage/HeraldDAO.php', - 'HeraldDeleteController' => 'applications/herald/controller/HeraldDeleteController.php', - 'HeraldDifferentialRevisionAdapter' => 'applications/herald/adapter/HeraldDifferentialRevisionAdapter.php', - 'HeraldEditLogQuery' => 'applications/herald/query/HeraldEditLogQuery.php', + 'HeraldDeprecatedFieldGroup' => 'applications/herald/field/HeraldDeprecatedFieldGroup.php', + 'HeraldDifferentialAdapter' => 'applications/differential/herald/HeraldDifferentialAdapter.php', + 'HeraldDifferentialDiffAdapter' => 'applications/differential/herald/HeraldDifferentialDiffAdapter.php', + 'HeraldDifferentialRevisionAdapter' => 'applications/differential/herald/HeraldDifferentialRevisionAdapter.php', + 'HeraldDisableController' => 'applications/herald/controller/HeraldDisableController.php', + 'HeraldDoNothingAction' => 'applications/herald/action/HeraldDoNothingAction.php', + 'HeraldEditFieldGroup' => 'applications/herald/field/HeraldEditFieldGroup.php', 'HeraldEffect' => 'applications/herald/engine/HeraldEffect.php', + 'HeraldEmptyFieldValue' => 'applications/herald/value/HeraldEmptyFieldValue.php', 'HeraldEngine' => 'applications/herald/engine/HeraldEngine.php', + 'HeraldExactProjectsField' => 'applications/project/herald/HeraldExactProjectsField.php', + 'HeraldField' => 'applications/herald/field/HeraldField.php', + 'HeraldFieldGroup' => 'applications/herald/field/HeraldFieldGroup.php', + 'HeraldFieldTestCase' => 'applications/herald/field/__tests__/HeraldFieldTestCase.php', + 'HeraldFieldValue' => 'applications/herald/value/HeraldFieldValue.php', + 'HeraldGroup' => 'applications/herald/group/HeraldGroup.php', 'HeraldInvalidActionException' => 'applications/herald/engine/exception/HeraldInvalidActionException.php', 'HeraldInvalidConditionException' => 'applications/herald/engine/exception/HeraldInvalidConditionException.php', - 'HeraldInvalidFieldException' => 'applications/herald/engine/exception/HeraldInvalidFieldException.php', + 'HeraldMailableState' => 'applications/herald/state/HeraldMailableState.php', + 'HeraldManageGlobalRulesCapability' => 'applications/herald/capability/HeraldManageGlobalRulesCapability.php', + 'HeraldManagementWorkflow' => 'applications/herald/management/HeraldManagementWorkflow.php', + 'HeraldManiphestTaskAdapter' => 'applications/maniphest/herald/HeraldManiphestTaskAdapter.php', 'HeraldNewController' => 'applications/herald/controller/HeraldNewController.php', + 'HeraldNewObjectField' => 'applications/herald/field/HeraldNewObjectField.php', + 'HeraldNotifyActionGroup' => 'applications/herald/action/HeraldNotifyActionGroup.php', 'HeraldObjectTranscript' => 'applications/herald/storage/transcript/HeraldObjectTranscript.php', - 'HeraldPHIDTypeRule' => 'applications/herald/phid/HeraldPHIDTypeRule.php', + 'HeraldPhameBlogAdapter' => 'applications/phame/herald/HeraldPhameBlogAdapter.php', + 'HeraldPhamePostAdapter' => 'applications/phame/herald/HeraldPhamePostAdapter.php', + 'HeraldPholioMockAdapter' => 'applications/pholio/herald/HeraldPholioMockAdapter.php', + 'HeraldPonderQuestionAdapter' => 'applications/ponder/herald/HeraldPonderQuestionAdapter.php', + 'HeraldPreCommitAdapter' => 'applications/diffusion/herald/HeraldPreCommitAdapter.php', + 'HeraldPreCommitContentAdapter' => 'applications/diffusion/herald/HeraldPreCommitContentAdapter.php', + 'HeraldPreCommitRefAdapter' => 'applications/diffusion/herald/HeraldPreCommitRefAdapter.php', + 'HeraldPreventActionGroup' => 'applications/herald/action/HeraldPreventActionGroup.php', + 'HeraldProjectsField' => 'applications/project/herald/HeraldProjectsField.php', 'HeraldRecursiveConditionsException' => 'applications/herald/engine/exception/HeraldRecursiveConditionsException.php', - 'HeraldRepetitionPolicyConfig' => 'applications/herald/config/HeraldRepetitionPolicyConfig.php', + 'HeraldRelatedFieldGroup' => 'applications/herald/field/HeraldRelatedFieldGroup.php', + 'HeraldRemarkupFieldValue' => 'applications/herald/value/HeraldRemarkupFieldValue.php', + 'HeraldRemarkupRule' => 'applications/herald/remarkup/HeraldRemarkupRule.php', 'HeraldRule' => 'applications/herald/storage/HeraldRule.php', + 'HeraldRuleActionAffectsObjectEdgeType' => 'applications/herald/edge/HeraldRuleActionAffectsObjectEdgeType.php', + 'HeraldRuleAdapter' => 'applications/herald/adapter/HeraldRuleAdapter.php', + 'HeraldRuleAdapterField' => 'applications/herald/field/rule/HeraldRuleAdapterField.php', 'HeraldRuleController' => 'applications/herald/controller/HeraldRuleController.php', - 'HeraldRuleEdit' => 'applications/herald/storage/HeraldRuleEdit.php', - 'HeraldRuleEditHistoryController' => 'applications/herald/controller/HeraldRuleEditHistoryController.php', - 'HeraldRuleEditHistoryView' => 'applications/herald/view/HeraldRuleEditHistoryView.php', + 'HeraldRuleDatasource' => 'applications/herald/typeahead/HeraldRuleDatasource.php', + 'HeraldRuleDisableTransaction' => 'applications/herald/xaction/HeraldRuleDisableTransaction.php', + 'HeraldRuleEditTransaction' => 'applications/herald/xaction/HeraldRuleEditTransaction.php', + 'HeraldRuleEditor' => 'applications/herald/editor/HeraldRuleEditor.php', + 'HeraldRuleEvaluationException' => 'applications/herald/engine/exception/HeraldRuleEvaluationException.php', + 'HeraldRuleField' => 'applications/herald/field/rule/HeraldRuleField.php', + 'HeraldRuleFieldGroup' => 'applications/herald/field/rule/HeraldRuleFieldGroup.php', + 'HeraldRuleIndexEngineExtension' => 'applications/herald/engineextension/HeraldRuleIndexEngineExtension.php', 'HeraldRuleListController' => 'applications/herald/controller/HeraldRuleListController.php', + 'HeraldRuleListView' => 'applications/herald/view/HeraldRuleListView.php', + 'HeraldRuleManagementWorkflow' => 'applications/herald/management/HeraldRuleManagementWorkflow.php', + 'HeraldRuleNameTransaction' => 'applications/herald/xaction/HeraldRuleNameTransaction.php', + 'HeraldRulePHIDType' => 'applications/herald/phid/HeraldRulePHIDType.php', 'HeraldRuleQuery' => 'applications/herald/query/HeraldRuleQuery.php', + 'HeraldRuleReplyHandler' => 'applications/herald/mail/HeraldRuleReplyHandler.php', + 'HeraldRuleResult' => 'applications/herald/storage/transcript/HeraldRuleResult.php', 'HeraldRuleSearchEngine' => 'applications/herald/query/HeraldRuleSearchEngine.php', + 'HeraldRuleSerializer' => 'applications/herald/editor/HeraldRuleSerializer.php', + 'HeraldRuleTestCase' => 'applications/herald/storage/__tests__/HeraldRuleTestCase.php', 'HeraldRuleTransaction' => 'applications/herald/storage/HeraldRuleTransaction.php', - 'HeraldRuleTransactionComment' => 'applications/herald/storage/HeraldRuleTransactionComment.php', + 'HeraldRuleTransactionType' => 'applications/herald/xaction/HeraldRuleTransactionType.php', 'HeraldRuleTranscript' => 'applications/herald/storage/transcript/HeraldRuleTranscript.php', 'HeraldRuleTypeConfig' => 'applications/herald/config/HeraldRuleTypeConfig.php', + 'HeraldRuleTypeDatasource' => 'applications/herald/typeahead/HeraldRuleTypeDatasource.php', + 'HeraldRuleTypeField' => 'applications/herald/field/rule/HeraldRuleTypeField.php', 'HeraldRuleViewController' => 'applications/herald/controller/HeraldRuleViewController.php', + 'HeraldSchemaSpec' => 'applications/herald/storage/HeraldSchemaSpec.php', + 'HeraldSelectFieldValue' => 'applications/herald/value/HeraldSelectFieldValue.php', + 'HeraldSpaceField' => 'applications/spaces/herald/HeraldSpaceField.php', + 'HeraldState' => 'applications/herald/state/HeraldState.php', + 'HeraldStateReasons' => 'applications/herald/state/HeraldStateReasons.php', + 'HeraldSubscribersField' => 'applications/subscriptions/herald/HeraldSubscribersField.php', + 'HeraldSupportActionGroup' => 'applications/herald/action/HeraldSupportActionGroup.php', + 'HeraldSupportFieldGroup' => 'applications/herald/field/HeraldSupportFieldGroup.php', 'HeraldTestConsoleController' => 'applications/herald/controller/HeraldTestConsoleController.php', + 'HeraldTestManagementWorkflow' => 'applications/herald/management/HeraldTestManagementWorkflow.php', + 'HeraldTextFieldValue' => 'applications/herald/value/HeraldTextFieldValue.php', + 'HeraldTokenizerFieldValue' => 'applications/herald/value/HeraldTokenizerFieldValue.php', + 'HeraldTransactionQuery' => 'applications/herald/query/HeraldTransactionQuery.php', + 'HeraldTransactionsFieldGroup' => 'applications/herald/field/HeraldTransactionsFieldGroup.php', 'HeraldTranscript' => 'applications/herald/storage/transcript/HeraldTranscript.php', 'HeraldTranscriptController' => 'applications/herald/controller/HeraldTranscriptController.php', + 'HeraldTranscriptDestructionEngineExtension' => 'applications/herald/engineextension/HeraldTranscriptDestructionEngineExtension.php', + 'HeraldTranscriptGarbageCollector' => 'applications/herald/garbagecollector/HeraldTranscriptGarbageCollector.php', 'HeraldTranscriptListController' => 'applications/herald/controller/HeraldTranscriptListController.php', + 'HeraldTranscriptPHIDType' => 'applications/herald/phid/HeraldTranscriptPHIDType.php', + 'HeraldTranscriptQuery' => 'applications/herald/query/HeraldTranscriptQuery.php', + 'HeraldTranscriptResult' => 'applications/herald/storage/transcript/HeraldTranscriptResult.php', + 'HeraldTranscriptSearchEngine' => 'applications/herald/query/HeraldTranscriptSearchEngine.php', + 'HeraldTranscriptTestCase' => 'applications/herald/storage/__tests__/HeraldTranscriptTestCase.php', + 'HeraldUtilityActionGroup' => 'applications/herald/action/HeraldUtilityActionGroup.php', + 'HeraldWebhook' => 'applications/herald/storage/HeraldWebhook.php', + 'HeraldWebhookCallManagementWorkflow' => 'applications/herald/management/HeraldWebhookCallManagementWorkflow.php', + 'HeraldWebhookController' => 'applications/herald/controller/HeraldWebhookController.php', + 'HeraldWebhookDatasource' => 'applications/herald/typeahead/HeraldWebhookDatasource.php', + 'HeraldWebhookEditController' => 'applications/herald/controller/HeraldWebhookEditController.php', + 'HeraldWebhookEditEngine' => 'applications/herald/editor/HeraldWebhookEditEngine.php', + 'HeraldWebhookEditor' => 'applications/herald/editor/HeraldWebhookEditor.php', + 'HeraldWebhookKeyController' => 'applications/herald/controller/HeraldWebhookKeyController.php', + 'HeraldWebhookListController' => 'applications/herald/controller/HeraldWebhookListController.php', + 'HeraldWebhookManagementWorkflow' => 'applications/herald/management/HeraldWebhookManagementWorkflow.php', + 'HeraldWebhookNameTransaction' => 'applications/herald/xaction/HeraldWebhookNameTransaction.php', + 'HeraldWebhookPHIDType' => 'applications/herald/phid/HeraldWebhookPHIDType.php', + 'HeraldWebhookQuery' => 'applications/herald/query/HeraldWebhookQuery.php', + 'HeraldWebhookRequest' => 'applications/herald/storage/HeraldWebhookRequest.php', + 'HeraldWebhookRequestGarbageCollector' => 'applications/herald/garbagecollector/HeraldWebhookRequestGarbageCollector.php', + 'HeraldWebhookRequestListView' => 'applications/herald/view/HeraldWebhookRequestListView.php', + 'HeraldWebhookRequestPHIDType' => 'applications/herald/phid/HeraldWebhookRequestPHIDType.php', + 'HeraldWebhookRequestQuery' => 'applications/herald/query/HeraldWebhookRequestQuery.php', + 'HeraldWebhookSearchEngine' => 'applications/herald/query/HeraldWebhookSearchEngine.php', + 'HeraldWebhookStatusTransaction' => 'applications/herald/xaction/HeraldWebhookStatusTransaction.php', + 'HeraldWebhookTestController' => 'applications/herald/controller/HeraldWebhookTestController.php', + 'HeraldWebhookTransaction' => 'applications/herald/storage/HeraldWebhookTransaction.php', + 'HeraldWebhookTransactionQuery' => 'applications/herald/query/HeraldWebhookTransactionQuery.php', + 'HeraldWebhookTransactionType' => 'applications/herald/xaction/HeraldWebhookTransactionType.php', + 'HeraldWebhookURITransaction' => 'applications/herald/xaction/HeraldWebhookURITransaction.php', + 'HeraldWebhookViewController' => 'applications/herald/controller/HeraldWebhookViewController.php', + 'HeraldWebhookWorker' => 'applications/herald/worker/HeraldWebhookWorker.php', 'Javelin' => 'infrastructure/javelin/Javelin.php', - 'JavelinReactorExample' => 'applications/uiexample/examples/JavelinReactorExample.php', - 'JavelinUIExample' => 'applications/uiexample/examples/JavelinUIExample.php', - 'JavelinViewExample' => 'applications/uiexample/examples/JavelinViewExample.php', - 'JavelinViewExampleServerView' => 'applications/uiexample/examples/JavelinViewExampleServerView.php', - 'LegalpadConstants' => 'applications/legalpad/constants/LegalpadConstants.php', 'LegalpadController' => 'applications/legalpad/controller/LegalpadController.php', + 'LegalpadCreateDocumentsCapability' => 'applications/legalpad/capability/LegalpadCreateDocumentsCapability.php', 'LegalpadDAO' => 'applications/legalpad/storage/LegalpadDAO.php', + 'LegalpadDefaultEditCapability' => 'applications/legalpad/capability/LegalpadDefaultEditCapability.php', + 'LegalpadDefaultViewCapability' => 'applications/legalpad/capability/LegalpadDefaultViewCapability.php', 'LegalpadDocument' => 'applications/legalpad/storage/LegalpadDocument.php', 'LegalpadDocumentBody' => 'applications/legalpad/storage/LegalpadDocumentBody.php', - 'LegalpadDocumentCommentController' => 'applications/legalpad/controller/LegalpadDocumentCommentController.php', + 'LegalpadDocumentDatasource' => 'applications/legalpad/typeahead/LegalpadDocumentDatasource.php', + 'LegalpadDocumentDoneController' => 'applications/legalpad/controller/LegalpadDocumentDoneController.php', 'LegalpadDocumentEditController' => 'applications/legalpad/controller/LegalpadDocumentEditController.php', + 'LegalpadDocumentEditEngine' => 'applications/legalpad/editor/LegalpadDocumentEditEngine.php', 'LegalpadDocumentEditor' => 'applications/legalpad/editor/LegalpadDocumentEditor.php', 'LegalpadDocumentListController' => 'applications/legalpad/controller/LegalpadDocumentListController.php', + 'LegalpadDocumentManageController' => 'applications/legalpad/controller/LegalpadDocumentManageController.php', + 'LegalpadDocumentPreambleTransaction' => 'applications/legalpad/xaction/LegalpadDocumentPreambleTransaction.php', 'LegalpadDocumentQuery' => 'applications/legalpad/query/LegalpadDocumentQuery.php', + 'LegalpadDocumentRemarkupRule' => 'applications/legalpad/remarkup/LegalpadDocumentRemarkupRule.php', + 'LegalpadDocumentRequireSignatureTransaction' => 'applications/legalpad/xaction/LegalpadDocumentRequireSignatureTransaction.php', 'LegalpadDocumentSearchEngine' => 'applications/legalpad/query/LegalpadDocumentSearchEngine.php', 'LegalpadDocumentSignController' => 'applications/legalpad/controller/LegalpadDocumentSignController.php', 'LegalpadDocumentSignature' => 'applications/legalpad/storage/LegalpadDocumentSignature.php', - 'LegalpadDocumentViewController' => 'applications/legalpad/controller/LegalpadDocumentViewController.php', - 'LegalpadMockMailReceiver' => 'applications/legalpad/mail/LegalpadMockMailReceiver.php', + 'LegalpadDocumentSignatureAddController' => 'applications/legalpad/controller/LegalpadDocumentSignatureAddController.php', + 'LegalpadDocumentSignatureListController' => 'applications/legalpad/controller/LegalpadDocumentSignatureListController.php', + 'LegalpadDocumentSignatureQuery' => 'applications/legalpad/query/LegalpadDocumentSignatureQuery.php', + 'LegalpadDocumentSignatureSearchEngine' => 'applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php', + 'LegalpadDocumentSignatureTypeTransaction' => 'applications/legalpad/xaction/LegalpadDocumentSignatureTypeTransaction.php', + 'LegalpadDocumentSignatureVerificationController' => 'applications/legalpad/controller/LegalpadDocumentSignatureVerificationController.php', + 'LegalpadDocumentSignatureViewController' => 'applications/legalpad/controller/LegalpadDocumentSignatureViewController.php', + 'LegalpadDocumentTextTransaction' => 'applications/legalpad/xaction/LegalpadDocumentTextTransaction.php', + 'LegalpadDocumentTitleTransaction' => 'applications/legalpad/xaction/LegalpadDocumentTitleTransaction.php', + 'LegalpadDocumentTransactionType' => 'applications/legalpad/xaction/LegalpadDocumentTransactionType.php', + 'LegalpadMailReceiver' => 'applications/legalpad/mail/LegalpadMailReceiver.php', + 'LegalpadObjectNeedsSignatureEdgeType' => 'applications/legalpad/edge/LegalpadObjectNeedsSignatureEdgeType.php', 'LegalpadReplyHandler' => 'applications/legalpad/mail/LegalpadReplyHandler.php', + 'LegalpadRequireSignatureHeraldAction' => 'applications/legalpad/herald/LegalpadRequireSignatureHeraldAction.php', + 'LegalpadSchemaSpec' => 'applications/legalpad/storage/LegalpadSchemaSpec.php', + 'LegalpadSignatureNeededByObjectEdgeType' => 'applications/legalpad/edge/LegalpadSignatureNeededByObjectEdgeType.php', 'LegalpadTransaction' => 'applications/legalpad/storage/LegalpadTransaction.php', 'LegalpadTransactionComment' => 'applications/legalpad/storage/LegalpadTransactionComment.php', 'LegalpadTransactionQuery' => 'applications/legalpad/query/LegalpadTransactionQuery.php', - 'LegalpadTransactionType' => 'applications/legalpad/constants/LegalpadTransactionType.php', - 'LegalpadTransactionView' => 'applications/legalpad/view/LegalpadTransactionView.php', 'LiskChunkTestCase' => 'infrastructure/storage/lisk/__tests__/LiskChunkTestCase.php', 'LiskDAO' => 'infrastructure/storage/lisk/LiskDAO.php', - 'LiskDAOSet' => 'infrastructure/storage/lisk/LiskDAOSet.php', 'LiskDAOTestCase' => 'infrastructure/storage/lisk/__tests__/LiskDAOTestCase.php', 'LiskEphemeralObjectException' => 'infrastructure/storage/lisk/LiskEphemeralObjectException.php', 'LiskFixtureTestCase' => 'infrastructure/storage/lisk/__tests__/LiskFixtureTestCase.php', @@ -670,224 +1768,720 @@ 'LiskIsolationTestDAOException' => 'infrastructure/storage/lisk/__tests__/LiskIsolationTestDAOException.php', 'LiskMigrationIterator' => 'infrastructure/storage/lisk/LiskMigrationIterator.php', 'LiskRawMigrationIterator' => 'infrastructure/storage/lisk/LiskRawMigrationIterator.php', - 'ManiphestAction' => 'applications/maniphest/constants/ManiphestAction.php', - 'ManiphestAuxiliaryFieldDefaultSpecification' => 'applications/maniphest/auxiliaryfield/ManiphestAuxiliaryFieldDefaultSpecification.php', - 'ManiphestAuxiliaryFieldSpecification' => 'applications/maniphest/auxiliaryfield/ManiphestAuxiliaryFieldSpecification.php', - 'ManiphestAuxiliaryFieldTypeException' => 'applications/maniphest/auxiliaryfield/ManiphestAuxiliaryFieldTypeException.php', - 'ManiphestAuxiliaryFieldValidationException' => 'applications/maniphest/auxiliaryfield/ManiphestAuxiliaryFieldValidationException.php', - 'ManiphestBatchEditController' => 'applications/maniphest/controller/ManiphestBatchEditController.php', + 'MacroConduitAPIMethod' => 'applications/macro/conduit/MacroConduitAPIMethod.php', + 'MacroCreateMemeConduitAPIMethod' => 'applications/macro/conduit/MacroCreateMemeConduitAPIMethod.php', + 'MacroEditConduitAPIMethod' => 'applications/macro/conduit/MacroEditConduitAPIMethod.php', + 'MacroEmojiExample' => 'applications/uiexample/examples/MacroEmojiExample.php', + 'MacroQueryConduitAPIMethod' => 'applications/macro/conduit/MacroQueryConduitAPIMethod.php', + 'ManiphestAssignEmailCommand' => 'applications/maniphest/command/ManiphestAssignEmailCommand.php', + 'ManiphestAssigneeDatasource' => 'applications/maniphest/typeahead/ManiphestAssigneeDatasource.php', + 'ManiphestBulkEditCapability' => 'applications/maniphest/capability/ManiphestBulkEditCapability.php', + 'ManiphestBulkEditController' => 'applications/maniphest/controller/ManiphestBulkEditController.php', + 'ManiphestClaimEmailCommand' => 'applications/maniphest/command/ManiphestClaimEmailCommand.php', + 'ManiphestCloseEmailCommand' => 'applications/maniphest/command/ManiphestCloseEmailCommand.php', + 'ManiphestConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestConduitAPIMethod.php', + 'ManiphestConfiguredCustomField' => 'applications/maniphest/field/ManiphestConfiguredCustomField.php', 'ManiphestConstants' => 'applications/maniphest/constants/ManiphestConstants.php', 'ManiphestController' => 'applications/maniphest/controller/ManiphestController.php', 'ManiphestCreateMailReceiver' => 'applications/maniphest/mail/ManiphestCreateMailReceiver.php', + 'ManiphestCreateTaskConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestCreateTaskConduitAPIMethod.php', + 'ManiphestCustomField' => 'applications/maniphest/field/ManiphestCustomField.php', + 'ManiphestCustomFieldNumericIndex' => 'applications/maniphest/storage/ManiphestCustomFieldNumericIndex.php', + 'ManiphestCustomFieldStatusParser' => 'applications/maniphest/field/parser/ManiphestCustomFieldStatusParser.php', + 'ManiphestCustomFieldStatusParserTestCase' => 'applications/maniphest/field/parser/__tests__/ManiphestCustomFieldStatusParserTestCase.php', + 'ManiphestCustomFieldStorage' => 'applications/maniphest/storage/ManiphestCustomFieldStorage.php', + 'ManiphestCustomFieldStringIndex' => 'applications/maniphest/storage/ManiphestCustomFieldStringIndex.php', 'ManiphestDAO' => 'applications/maniphest/storage/ManiphestDAO.php', - 'ManiphestDefaultTaskExtensions' => 'applications/maniphest/extensions/ManiphestDefaultTaskExtensions.php', - 'ManiphestEdgeEventListener' => 'applications/maniphest/event/ManiphestEdgeEventListener.php', - 'ManiphestExcelDefaultFormat' => 'applications/maniphest/export/ManiphestExcelDefaultFormat.php', - 'ManiphestExcelFormat' => 'applications/maniphest/export/ManiphestExcelFormat.php', - 'ManiphestExportController' => 'applications/maniphest/controller/ManiphestExportController.php', - 'ManiphestHovercardEventListener' => 'applications/maniphest/event/ManiphestHovercardEventListener.php', - 'ManiphestPHIDTypeTask' => 'applications/maniphest/phid/ManiphestPHIDTypeTask.php', - 'ManiphestPeopleMenuEventListener' => 'applications/maniphest/event/ManiphestPeopleMenuEventListener.php', + 'ManiphestDefaultEditCapability' => 'applications/maniphest/capability/ManiphestDefaultEditCapability.php', + 'ManiphestDefaultViewCapability' => 'applications/maniphest/capability/ManiphestDefaultViewCapability.php', + 'ManiphestEditConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestEditConduitAPIMethod.php', + 'ManiphestEditEngine' => 'applications/maniphest/editor/ManiphestEditEngine.php', + 'ManiphestEmailCommand' => 'applications/maniphest/command/ManiphestEmailCommand.php', + 'ManiphestGetTaskTransactionsConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestGetTaskTransactionsConduitAPIMethod.php', + 'ManiphestHovercardEngineExtension' => 'applications/maniphest/engineextension/ManiphestHovercardEngineExtension.php', + 'ManiphestInfoConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestInfoConduitAPIMethod.php', + 'ManiphestMailEngineExtension' => 'applications/maniphest/engineextension/ManiphestMailEngineExtension.php', + 'ManiphestNameIndex' => 'applications/maniphest/storage/ManiphestNameIndex.php', + 'ManiphestPointsConfigType' => 'applications/maniphest/config/ManiphestPointsConfigType.php', + 'ManiphestPrioritiesConfigType' => 'applications/maniphest/config/ManiphestPrioritiesConfigType.php', + 'ManiphestPriorityEmailCommand' => 'applications/maniphest/command/ManiphestPriorityEmailCommand.php', + 'ManiphestPrioritySearchConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestPrioritySearchConduitAPIMethod.php', + 'ManiphestProjectNameFulltextEngineExtension' => 'applications/maniphest/engineextension/ManiphestProjectNameFulltextEngineExtension.php', + 'ManiphestQueryConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestQueryConduitAPIMethod.php', + 'ManiphestQueryStatusesConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestQueryStatusesConduitAPIMethod.php', 'ManiphestRemarkupRule' => 'applications/maniphest/remarkup/ManiphestRemarkupRule.php', 'ManiphestReplyHandler' => 'applications/maniphest/mail/ManiphestReplyHandler.php', 'ManiphestReportController' => 'applications/maniphest/controller/ManiphestReportController.php', - 'ManiphestSavedQuery' => 'applications/maniphest/storage/ManiphestSavedQuery.php', - 'ManiphestSavedQueryDeleteController' => 'applications/maniphest/controller/ManiphestSavedQueryDeleteController.php', - 'ManiphestSavedQueryEditController' => 'applications/maniphest/controller/ManiphestSavedQueryEditController.php', - 'ManiphestSavedQueryListController' => 'applications/maniphest/controller/ManiphestSavedQueryListController.php', - 'ManiphestSearchIndexer' => 'applications/maniphest/search/ManiphestSearchIndexer.php', - 'ManiphestSubpriorityController' => 'applications/maniphest/controller/ManiphestSubpriorityController.php', - 'ManiphestSubscribeController' => 'applications/maniphest/controller/ManiphestSubscribeController.php', + 'ManiphestSchemaSpec' => 'applications/maniphest/storage/ManiphestSchemaSpec.php', + 'ManiphestSearchConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestSearchConduitAPIMethod.php', + 'ManiphestStatusEmailCommand' => 'applications/maniphest/command/ManiphestStatusEmailCommand.php', + 'ManiphestStatusSearchConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestStatusSearchConduitAPIMethod.php', + 'ManiphestStatusesConfigType' => 'applications/maniphest/config/ManiphestStatusesConfigType.php', + 'ManiphestSubtypesConfigType' => 'applications/maniphest/config/ManiphestSubtypesConfigType.php', 'ManiphestTask' => 'applications/maniphest/storage/ManiphestTask.php', - 'ManiphestTaskAuxiliaryStorage' => 'applications/maniphest/storage/ManiphestTaskAuxiliaryStorage.php', - 'ManiphestTaskDescriptionChangeController' => 'applications/maniphest/controller/ManiphestTaskDescriptionChangeController.php', - 'ManiphestTaskDescriptionPreviewController' => 'applications/maniphest/controller/ManiphestTaskDescriptionPreviewController.php', + 'ManiphestTaskAssignHeraldAction' => 'applications/maniphest/herald/ManiphestTaskAssignHeraldAction.php', + 'ManiphestTaskAssignOtherHeraldAction' => 'applications/maniphest/herald/ManiphestTaskAssignOtherHeraldAction.php', + 'ManiphestTaskAssignSelfHeraldAction' => 'applications/maniphest/herald/ManiphestTaskAssignSelfHeraldAction.php', + 'ManiphestTaskAssigneeHeraldField' => 'applications/maniphest/herald/ManiphestTaskAssigneeHeraldField.php', + 'ManiphestTaskAttachTransaction' => 'applications/maniphest/xaction/ManiphestTaskAttachTransaction.php', + 'ManiphestTaskAuthorHeraldField' => 'applications/maniphest/herald/ManiphestTaskAuthorHeraldField.php', + 'ManiphestTaskAuthorPolicyRule' => 'applications/maniphest/policyrule/ManiphestTaskAuthorPolicyRule.php', + 'ManiphestTaskBulkEngine' => 'applications/maniphest/bulk/ManiphestTaskBulkEngine.php', + 'ManiphestTaskCloseAsDuplicateRelationship' => 'applications/maniphest/relationship/ManiphestTaskCloseAsDuplicateRelationship.php', + 'ManiphestTaskClosedStatusDatasource' => 'applications/maniphest/typeahead/ManiphestTaskClosedStatusDatasource.php', + 'ManiphestTaskCoverImageTransaction' => 'applications/maniphest/xaction/ManiphestTaskCoverImageTransaction.php', + 'ManiphestTaskDependedOnByTaskEdgeType' => 'applications/maniphest/edge/ManiphestTaskDependedOnByTaskEdgeType.php', + 'ManiphestTaskDependsOnTaskEdgeType' => 'applications/maniphest/edge/ManiphestTaskDependsOnTaskEdgeType.php', + 'ManiphestTaskDescriptionHeraldField' => 'applications/maniphest/herald/ManiphestTaskDescriptionHeraldField.php', + 'ManiphestTaskDescriptionTransaction' => 'applications/maniphest/xaction/ManiphestTaskDescriptionTransaction.php', 'ManiphestTaskDetailController' => 'applications/maniphest/controller/ManiphestTaskDetailController.php', + 'ManiphestTaskEdgeTransaction' => 'applications/maniphest/xaction/ManiphestTaskEdgeTransaction.php', 'ManiphestTaskEditController' => 'applications/maniphest/controller/ManiphestTaskEditController.php', - 'ManiphestTaskExtensions' => 'applications/maniphest/extensions/ManiphestTaskExtensions.php', + 'ManiphestTaskEditEngineLock' => 'applications/maniphest/editor/ManiphestTaskEditEngineLock.php', + 'ManiphestTaskFerretEngine' => 'applications/maniphest/search/ManiphestTaskFerretEngine.php', + 'ManiphestTaskFulltextEngine' => 'applications/maniphest/search/ManiphestTaskFulltextEngine.php', + 'ManiphestTaskGraph' => 'infrastructure/graph/ManiphestTaskGraph.php', + 'ManiphestTaskGraphController' => 'applications/maniphest/controller/ManiphestTaskGraphController.php', + 'ManiphestTaskHasCommitEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasCommitEdgeType.php', + 'ManiphestTaskHasCommitRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasCommitRelationship.php', + 'ManiphestTaskHasDuplicateTaskEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasDuplicateTaskEdgeType.php', + 'ManiphestTaskHasMockEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasMockEdgeType.php', + 'ManiphestTaskHasMockRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasMockRelationship.php', + 'ManiphestTaskHasParentRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasParentRelationship.php', + 'ManiphestTaskHasRevisionEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasRevisionEdgeType.php', + 'ManiphestTaskHasRevisionRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasRevisionRelationship.php', + 'ManiphestTaskHasSubtaskRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasSubtaskRelationship.php', + 'ManiphestTaskHeraldField' => 'applications/maniphest/herald/ManiphestTaskHeraldField.php', + 'ManiphestTaskHeraldFieldGroup' => 'applications/maniphest/herald/ManiphestTaskHeraldFieldGroup.php', + 'ManiphestTaskIsDuplicateOfTaskEdgeType' => 'applications/maniphest/edge/ManiphestTaskIsDuplicateOfTaskEdgeType.php', 'ManiphestTaskListController' => 'applications/maniphest/controller/ManiphestTaskListController.php', + 'ManiphestTaskListHTTPParameterType' => 'applications/maniphest/httpparametertype/ManiphestTaskListHTTPParameterType.php', 'ManiphestTaskListView' => 'applications/maniphest/view/ManiphestTaskListView.php', + 'ManiphestTaskMFAEngine' => 'applications/maniphest/engine/ManiphestTaskMFAEngine.php', 'ManiphestTaskMailReceiver' => 'applications/maniphest/mail/ManiphestTaskMailReceiver.php', - 'ManiphestTaskOwner' => 'applications/maniphest/constants/ManiphestTaskOwner.php', + 'ManiphestTaskMergeInRelationship' => 'applications/maniphest/relationship/ManiphestTaskMergeInRelationship.php', + 'ManiphestTaskMergedFromTransaction' => 'applications/maniphest/xaction/ManiphestTaskMergedFromTransaction.php', + 'ManiphestTaskMergedIntoTransaction' => 'applications/maniphest/xaction/ManiphestTaskMergedIntoTransaction.php', + 'ManiphestTaskOpenStatusDatasource' => 'applications/maniphest/typeahead/ManiphestTaskOpenStatusDatasource.php', + 'ManiphestTaskOwnerTransaction' => 'applications/maniphest/xaction/ManiphestTaskOwnerTransaction.php', + 'ManiphestTaskPHIDResolver' => 'applications/maniphest/httpparametertype/ManiphestTaskPHIDResolver.php', + 'ManiphestTaskPHIDType' => 'applications/maniphest/phid/ManiphestTaskPHIDType.php', + 'ManiphestTaskParentTransaction' => 'applications/maniphest/xaction/ManiphestTaskParentTransaction.php', + 'ManiphestTaskPoints' => 'applications/maniphest/constants/ManiphestTaskPoints.php', + 'ManiphestTaskPointsTransaction' => 'applications/maniphest/xaction/ManiphestTaskPointsTransaction.php', + 'ManiphestTaskPolicyCodex' => 'applications/maniphest/policy/ManiphestTaskPolicyCodex.php', 'ManiphestTaskPriority' => 'applications/maniphest/constants/ManiphestTaskPriority.php', - 'ManiphestTaskProject' => 'applications/maniphest/storage/ManiphestTaskProject.php', - 'ManiphestTaskProjectsView' => 'applications/maniphest/view/ManiphestTaskProjectsView.php', - 'ManiphestTaskQuery' => 'applications/maniphest/ManiphestTaskQuery.php', + 'ManiphestTaskPriorityDatasource' => 'applications/maniphest/typeahead/ManiphestTaskPriorityDatasource.php', + 'ManiphestTaskPriorityHeraldAction' => 'applications/maniphest/herald/ManiphestTaskPriorityHeraldAction.php', + 'ManiphestTaskPriorityHeraldField' => 'applications/maniphest/herald/ManiphestTaskPriorityHeraldField.php', + 'ManiphestTaskPriorityTransaction' => 'applications/maniphest/xaction/ManiphestTaskPriorityTransaction.php', + 'ManiphestTaskQuery' => 'applications/maniphest/query/ManiphestTaskQuery.php', + 'ManiphestTaskRelationship' => 'applications/maniphest/relationship/ManiphestTaskRelationship.php', + 'ManiphestTaskRelationshipSource' => 'applications/search/relationship/ManiphestTaskRelationshipSource.php', + 'ManiphestTaskResultListView' => 'applications/maniphest/view/ManiphestTaskResultListView.php', + 'ManiphestTaskSearchEngine' => 'applications/maniphest/query/ManiphestTaskSearchEngine.php', 'ManiphestTaskStatus' => 'applications/maniphest/constants/ManiphestTaskStatus.php', - 'ManiphestTaskSubscriber' => 'applications/maniphest/storage/ManiphestTaskSubscriber.php', + 'ManiphestTaskStatusDatasource' => 'applications/maniphest/typeahead/ManiphestTaskStatusDatasource.php', + 'ManiphestTaskStatusFunctionDatasource' => 'applications/maniphest/typeahead/ManiphestTaskStatusFunctionDatasource.php', + 'ManiphestTaskStatusHeraldAction' => 'applications/maniphest/herald/ManiphestTaskStatusHeraldAction.php', + 'ManiphestTaskStatusHeraldField' => 'applications/maniphest/herald/ManiphestTaskStatusHeraldField.php', + 'ManiphestTaskStatusTestCase' => 'applications/maniphest/constants/__tests__/ManiphestTaskStatusTestCase.php', + 'ManiphestTaskStatusTransaction' => 'applications/maniphest/xaction/ManiphestTaskStatusTransaction.php', + 'ManiphestTaskSubpriorityTransaction' => 'applications/maniphest/xaction/ManiphestTaskSubpriorityTransaction.php', + 'ManiphestTaskSubtaskController' => 'applications/maniphest/controller/ManiphestTaskSubtaskController.php', + 'ManiphestTaskSubtypeDatasource' => 'applications/maniphest/typeahead/ManiphestTaskSubtypeDatasource.php', + 'ManiphestTaskTitleHeraldField' => 'applications/maniphest/herald/ManiphestTaskTitleHeraldField.php', + 'ManiphestTaskTitleTransaction' => 'applications/maniphest/xaction/ManiphestTaskTitleTransaction.php', + 'ManiphestTaskTransactionType' => 'applications/maniphest/xaction/ManiphestTaskTransactionType.php', + 'ManiphestTaskUnblockTransaction' => 'applications/maniphest/xaction/ManiphestTaskUnblockTransaction.php', + 'ManiphestTaskUnlockEngine' => 'applications/maniphest/engine/ManiphestTaskUnlockEngine.php', 'ManiphestTransaction' => 'applications/maniphest/storage/ManiphestTransaction.php', - 'ManiphestTransactionDetailView' => 'applications/maniphest/view/ManiphestTransactionDetailView.php', + 'ManiphestTransactionComment' => 'applications/maniphest/storage/ManiphestTransactionComment.php', 'ManiphestTransactionEditor' => 'applications/maniphest/editor/ManiphestTransactionEditor.php', - 'ManiphestTransactionListView' => 'applications/maniphest/view/ManiphestTransactionListView.php', - 'ManiphestTransactionPreviewController' => 'applications/maniphest/controller/ManiphestTransactionPreviewController.php', - 'ManiphestTransactionSaveController' => 'applications/maniphest/controller/ManiphestTransactionSaveController.php', - 'ManiphestTransactionType' => 'applications/maniphest/constants/ManiphestTransactionType.php', + 'ManiphestTransactionQuery' => 'applications/maniphest/query/ManiphestTransactionQuery.php', + 'ManiphestUpdateConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestUpdateConduitAPIMethod.php', 'ManiphestView' => 'applications/maniphest/view/ManiphestView.php', - 'MetaMTAConstants' => 'applications/metamta/constants/MetaMTAConstants.php', - 'MetaMTANotificationType' => 'applications/metamta/constants/MetaMTANotificationType.php', + 'MetaMTAEmailTransactionCommand' => 'applications/metamta/command/MetaMTAEmailTransactionCommand.php', + 'MetaMTAEmailTransactionCommandTestCase' => 'applications/metamta/command/__tests__/MetaMTAEmailTransactionCommandTestCase.php', + 'MetaMTAMailReceivedGarbageCollector' => 'applications/metamta/garbagecollector/MetaMTAMailReceivedGarbageCollector.php', + 'MetaMTAMailSentGarbageCollector' => 'applications/metamta/garbagecollector/MetaMTAMailSentGarbageCollector.php', 'MetaMTAReceivedMailStatus' => 'applications/metamta/constants/MetaMTAReceivedMailStatus.php', + 'MultimeterContext' => 'applications/multimeter/storage/MultimeterContext.php', + 'MultimeterControl' => 'applications/multimeter/data/MultimeterControl.php', + 'MultimeterController' => 'applications/multimeter/controller/MultimeterController.php', + 'MultimeterDAO' => 'applications/multimeter/storage/MultimeterDAO.php', + 'MultimeterDimension' => 'applications/multimeter/storage/MultimeterDimension.php', + 'MultimeterEvent' => 'applications/multimeter/storage/MultimeterEvent.php', + 'MultimeterEventGarbageCollector' => 'applications/multimeter/garbagecollector/MultimeterEventGarbageCollector.php', + 'MultimeterHost' => 'applications/multimeter/storage/MultimeterHost.php', + 'MultimeterLabel' => 'applications/multimeter/storage/MultimeterLabel.php', + 'MultimeterSampleController' => 'applications/multimeter/controller/MultimeterSampleController.php', + 'MultimeterViewer' => 'applications/multimeter/storage/MultimeterViewer.php', + 'NuanceCommandImplementation' => 'applications/nuance/command/NuanceCommandImplementation.php', + 'NuanceConduitAPIMethod' => 'applications/nuance/conduit/NuanceConduitAPIMethod.php', + 'NuanceConsoleController' => 'applications/nuance/controller/NuanceConsoleController.php', + 'NuanceContentSource' => 'applications/nuance/contentsource/NuanceContentSource.php', + 'NuanceController' => 'applications/nuance/controller/NuanceController.php', + 'NuanceDAO' => 'applications/nuance/storage/NuanceDAO.php', + 'NuanceFormItemType' => 'applications/nuance/item/NuanceFormItemType.php', + 'NuanceGitHubEventItemType' => 'applications/nuance/item/NuanceGitHubEventItemType.php', + 'NuanceGitHubImportCursor' => 'applications/nuance/cursor/NuanceGitHubImportCursor.php', + 'NuanceGitHubIssuesImportCursor' => 'applications/nuance/cursor/NuanceGitHubIssuesImportCursor.php', + 'NuanceGitHubRawEvent' => 'applications/nuance/github/NuanceGitHubRawEvent.php', + 'NuanceGitHubRawEventTestCase' => 'applications/nuance/github/__tests__/NuanceGitHubRawEventTestCase.php', + 'NuanceGitHubRepositoryImportCursor' => 'applications/nuance/cursor/NuanceGitHubRepositoryImportCursor.php', + 'NuanceGitHubRepositorySourceDefinition' => 'applications/nuance/source/NuanceGitHubRepositorySourceDefinition.php', + 'NuanceImportCursor' => 'applications/nuance/cursor/NuanceImportCursor.php', + 'NuanceImportCursorData' => 'applications/nuance/storage/NuanceImportCursorData.php', + 'NuanceImportCursorDataQuery' => 'applications/nuance/query/NuanceImportCursorDataQuery.php', + 'NuanceImportCursorPHIDType' => 'applications/nuance/phid/NuanceImportCursorPHIDType.php', + 'NuanceItem' => 'applications/nuance/storage/NuanceItem.php', + 'NuanceItemActionController' => 'applications/nuance/controller/NuanceItemActionController.php', + 'NuanceItemCommand' => 'applications/nuance/storage/NuanceItemCommand.php', + 'NuanceItemCommandQuery' => 'applications/nuance/query/NuanceItemCommandQuery.php', + 'NuanceItemCommandSpec' => 'applications/nuance/command/NuanceItemCommandSpec.php', + 'NuanceItemCommandTransaction' => 'applications/nuance/xaction/NuanceItemCommandTransaction.php', + 'NuanceItemController' => 'applications/nuance/controller/NuanceItemController.php', + 'NuanceItemEditor' => 'applications/nuance/editor/NuanceItemEditor.php', + 'NuanceItemListController' => 'applications/nuance/controller/NuanceItemListController.php', + 'NuanceItemManageController' => 'applications/nuance/controller/NuanceItemManageController.php', + 'NuanceItemOwnerTransaction' => 'applications/nuance/xaction/NuanceItemOwnerTransaction.php', + 'NuanceItemPHIDType' => 'applications/nuance/phid/NuanceItemPHIDType.php', + 'NuanceItemPropertyTransaction' => 'applications/nuance/xaction/NuanceItemPropertyTransaction.php', + 'NuanceItemQuery' => 'applications/nuance/query/NuanceItemQuery.php', + 'NuanceItemQueueTransaction' => 'applications/nuance/xaction/NuanceItemQueueTransaction.php', + 'NuanceItemRequestorTransaction' => 'applications/nuance/xaction/NuanceItemRequestorTransaction.php', + 'NuanceItemSearchEngine' => 'applications/nuance/query/NuanceItemSearchEngine.php', + 'NuanceItemSourceTransaction' => 'applications/nuance/xaction/NuanceItemSourceTransaction.php', + 'NuanceItemStatusTransaction' => 'applications/nuance/xaction/NuanceItemStatusTransaction.php', + 'NuanceItemTransaction' => 'applications/nuance/storage/NuanceItemTransaction.php', + 'NuanceItemTransactionComment' => 'applications/nuance/storage/NuanceItemTransactionComment.php', + 'NuanceItemTransactionQuery' => 'applications/nuance/query/NuanceItemTransactionQuery.php', + 'NuanceItemTransactionType' => 'applications/nuance/xaction/NuanceItemTransactionType.php', + 'NuanceItemType' => 'applications/nuance/item/NuanceItemType.php', + 'NuanceItemUpdateWorker' => 'applications/nuance/worker/NuanceItemUpdateWorker.php', + 'NuanceItemViewController' => 'applications/nuance/controller/NuanceItemViewController.php', + 'NuanceManagementImportWorkflow' => 'applications/nuance/management/NuanceManagementImportWorkflow.php', + 'NuanceManagementUpdateWorkflow' => 'applications/nuance/management/NuanceManagementUpdateWorkflow.php', + 'NuanceManagementWorkflow' => 'applications/nuance/management/NuanceManagementWorkflow.php', + 'NuancePhabricatorFormSourceDefinition' => 'applications/nuance/source/NuancePhabricatorFormSourceDefinition.php', + 'NuanceQuery' => 'applications/nuance/query/NuanceQuery.php', + 'NuanceQueue' => 'applications/nuance/storage/NuanceQueue.php', + 'NuanceQueueController' => 'applications/nuance/controller/NuanceQueueController.php', + 'NuanceQueueDatasource' => 'applications/nuance/typeahead/NuanceQueueDatasource.php', + 'NuanceQueueEditController' => 'applications/nuance/controller/NuanceQueueEditController.php', + 'NuanceQueueEditEngine' => 'applications/nuance/editor/NuanceQueueEditEngine.php', + 'NuanceQueueEditor' => 'applications/nuance/editor/NuanceQueueEditor.php', + 'NuanceQueueListController' => 'applications/nuance/controller/NuanceQueueListController.php', + 'NuanceQueueNameTransaction' => 'applications/nuance/xaction/NuanceQueueNameTransaction.php', + 'NuanceQueuePHIDType' => 'applications/nuance/phid/NuanceQueuePHIDType.php', + 'NuanceQueueQuery' => 'applications/nuance/query/NuanceQueueQuery.php', + 'NuanceQueueSearchEngine' => 'applications/nuance/query/NuanceQueueSearchEngine.php', + 'NuanceQueueTransaction' => 'applications/nuance/storage/NuanceQueueTransaction.php', + 'NuanceQueueTransactionComment' => 'applications/nuance/storage/NuanceQueueTransactionComment.php', + 'NuanceQueueTransactionQuery' => 'applications/nuance/query/NuanceQueueTransactionQuery.php', + 'NuanceQueueTransactionType' => 'applications/nuance/xaction/NuanceQueueTransactionType.php', + 'NuanceQueueViewController' => 'applications/nuance/controller/NuanceQueueViewController.php', + 'NuanceQueueWorkController' => 'applications/nuance/controller/NuanceQueueWorkController.php', + 'NuanceSchemaSpec' => 'applications/nuance/storage/NuanceSchemaSpec.php', + 'NuanceSource' => 'applications/nuance/storage/NuanceSource.php', + 'NuanceSourceActionController' => 'applications/nuance/controller/NuanceSourceActionController.php', + 'NuanceSourceController' => 'applications/nuance/controller/NuanceSourceController.php', + 'NuanceSourceDefaultEditCapability' => 'applications/nuance/capability/NuanceSourceDefaultEditCapability.php', + 'NuanceSourceDefaultQueueTransaction' => 'applications/nuance/xaction/NuanceSourceDefaultQueueTransaction.php', + 'NuanceSourceDefaultViewCapability' => 'applications/nuance/capability/NuanceSourceDefaultViewCapability.php', + 'NuanceSourceDefinition' => 'applications/nuance/source/NuanceSourceDefinition.php', + 'NuanceSourceDefinitionTestCase' => 'applications/nuance/source/__tests__/NuanceSourceDefinitionTestCase.php', + 'NuanceSourceEditController' => 'applications/nuance/controller/NuanceSourceEditController.php', + 'NuanceSourceEditEngine' => 'applications/nuance/editor/NuanceSourceEditEngine.php', + 'NuanceSourceEditor' => 'applications/nuance/editor/NuanceSourceEditor.php', + 'NuanceSourceListController' => 'applications/nuance/controller/NuanceSourceListController.php', + 'NuanceSourceManageCapability' => 'applications/nuance/capability/NuanceSourceManageCapability.php', + 'NuanceSourceNameNgrams' => 'applications/nuance/storage/NuanceSourceNameNgrams.php', + 'NuanceSourceNameTransaction' => 'applications/nuance/xaction/NuanceSourceNameTransaction.php', + 'NuanceSourcePHIDType' => 'applications/nuance/phid/NuanceSourcePHIDType.php', + 'NuanceSourceQuery' => 'applications/nuance/query/NuanceSourceQuery.php', + 'NuanceSourceSearchEngine' => 'applications/nuance/query/NuanceSourceSearchEngine.php', + 'NuanceSourceTransaction' => 'applications/nuance/storage/NuanceSourceTransaction.php', + 'NuanceSourceTransactionComment' => 'applications/nuance/storage/NuanceSourceTransactionComment.php', + 'NuanceSourceTransactionQuery' => 'applications/nuance/query/NuanceSourceTransactionQuery.php', + 'NuanceSourceTransactionType' => 'applications/nuance/xaction/NuanceSourceTransactionType.php', + 'NuanceSourceViewController' => 'applications/nuance/controller/NuanceSourceViewController.php', + 'NuanceTransaction' => 'applications/nuance/storage/NuanceTransaction.php', + 'NuanceTrashCommand' => 'applications/nuance/command/NuanceTrashCommand.php', + 'NuanceWorker' => 'applications/nuance/worker/NuanceWorker.php', + 'OwnersConduitAPIMethod' => 'applications/owners/conduit/OwnersConduitAPIMethod.php', + 'OwnersEditConduitAPIMethod' => 'applications/owners/conduit/OwnersEditConduitAPIMethod.php', 'OwnersPackageReplyHandler' => 'applications/owners/mail/OwnersPackageReplyHandler.php', + 'OwnersSearchConduitAPIMethod' => 'applications/owners/conduit/OwnersSearchConduitAPIMethod.php', + 'PHIDConduitAPIMethod' => 'applications/phid/conduit/PHIDConduitAPIMethod.php', + 'PHIDInfoConduitAPIMethod' => 'applications/phid/conduit/PHIDInfoConduitAPIMethod.php', + 'PHIDLookupConduitAPIMethod' => 'applications/phid/conduit/PHIDLookupConduitAPIMethod.php', + 'PHIDQueryConduitAPIMethod' => 'applications/phid/conduit/PHIDQueryConduitAPIMethod.php', 'PHUI' => 'view/phui/PHUI.php', + 'PHUIActionPanelExample' => 'applications/uiexample/examples/PHUIActionPanelExample.php', + 'PHUIActionPanelView' => 'view/phui/PHUIActionPanelView.php', + 'PHUIApplicationMenuView' => 'view/layout/PHUIApplicationMenuView.php', + 'PHUIBadgeBoxView' => 'view/phui/PHUIBadgeBoxView.php', + 'PHUIBadgeExample' => 'applications/uiexample/examples/PHUIBadgeExample.php', + 'PHUIBadgeMiniView' => 'view/phui/PHUIBadgeMiniView.php', + 'PHUIBadgeView' => 'view/phui/PHUIBadgeView.php', + 'PHUIBigInfoExample' => 'applications/uiexample/examples/PHUIBigInfoExample.php', + 'PHUIBigInfoView' => 'view/phui/PHUIBigInfoView.php', 'PHUIBoxExample' => 'applications/uiexample/examples/PHUIBoxExample.php', 'PHUIBoxView' => 'view/phui/PHUIBoxView.php', + 'PHUIButtonBarExample' => 'applications/uiexample/examples/PHUIButtonBarExample.php', + 'PHUIButtonBarView' => 'view/phui/PHUIButtonBarView.php', 'PHUIButtonExample' => 'applications/uiexample/examples/PHUIButtonExample.php', 'PHUIButtonView' => 'view/phui/PHUIButtonView.php', + 'PHUICMSView' => 'view/phui/PHUICMSView.php', + 'PHUICalendarDayView' => 'view/phui/calendar/PHUICalendarDayView.php', + 'PHUICalendarListView' => 'view/phui/calendar/PHUICalendarListView.php', + 'PHUICalendarMonthView' => 'view/phui/calendar/PHUICalendarMonthView.php', + 'PHUICalendarWeekView' => 'view/phui/calendar/PHUICalendarWeekView.php', + 'PHUICalendarWidgetView' => 'view/phui/calendar/PHUICalendarWidgetView.php', + 'PHUIColor' => 'view/phui/PHUIColor.php', 'PHUIColorPalletteExample' => 'applications/uiexample/examples/PHUIColorPalletteExample.php', - 'PHUIDocumentExample' => 'applications/uiexample/examples/PHUIDocumentExample.php', + 'PHUICrumbView' => 'view/phui/PHUICrumbView.php', + 'PHUICrumbsView' => 'view/phui/PHUICrumbsView.php', + 'PHUICurtainExtension' => 'view/extension/PHUICurtainExtension.php', + 'PHUICurtainObjectRefListView' => 'view/phui/PHUICurtainObjectRefListView.php', + 'PHUICurtainObjectRefView' => 'view/phui/PHUICurtainObjectRefView.php', + 'PHUICurtainPanelView' => 'view/layout/PHUICurtainPanelView.php', + 'PHUICurtainView' => 'view/layout/PHUICurtainView.php', + 'PHUIDiffGraphView' => 'infrastructure/diff/view/PHUIDiffGraphView.php', + 'PHUIDiffGraphViewTestCase' => 'infrastructure/diff/view/__tests__/PHUIDiffGraphViewTestCase.php', + 'PHUIDiffInlineCommentDetailView' => 'infrastructure/diff/view/PHUIDiffInlineCommentDetailView.php', + 'PHUIDiffInlineCommentEditView' => 'infrastructure/diff/view/PHUIDiffInlineCommentEditView.php', + 'PHUIDiffInlineCommentPreviewListView' => 'infrastructure/diff/view/PHUIDiffInlineCommentPreviewListView.php', + 'PHUIDiffInlineCommentRowScaffold' => 'infrastructure/diff/view/PHUIDiffInlineCommentRowScaffold.php', + 'PHUIDiffInlineCommentTableScaffold' => 'infrastructure/diff/view/PHUIDiffInlineCommentTableScaffold.php', + 'PHUIDiffInlineCommentUndoView' => 'infrastructure/diff/view/PHUIDiffInlineCommentUndoView.php', + 'PHUIDiffInlineCommentView' => 'infrastructure/diff/view/PHUIDiffInlineCommentView.php', + 'PHUIDiffInlineThreader' => 'infrastructure/diff/view/PHUIDiffInlineThreader.php', + 'PHUIDiffOneUpInlineCommentRowScaffold' => 'infrastructure/diff/view/PHUIDiffOneUpInlineCommentRowScaffold.php', + 'PHUIDiffRevealIconView' => 'infrastructure/diff/view/PHUIDiffRevealIconView.php', + 'PHUIDiffTableOfContentsItemView' => 'infrastructure/diff/view/PHUIDiffTableOfContentsItemView.php', + 'PHUIDiffTableOfContentsListView' => 'infrastructure/diff/view/PHUIDiffTableOfContentsListView.php', + 'PHUIDiffTwoUpInlineCommentRowScaffold' => 'infrastructure/diff/view/PHUIDiffTwoUpInlineCommentRowScaffold.php', + 'PHUIDocumentSummaryView' => 'view/phui/PHUIDocumentSummaryView.php', 'PHUIDocumentView' => 'view/phui/PHUIDocumentView.php', 'PHUIFeedStoryExample' => 'applications/uiexample/examples/PHUIFeedStoryExample.php', 'PHUIFeedStoryView' => 'view/phui/PHUIFeedStoryView.php', 'PHUIFormDividerControl' => 'view/form/control/PHUIFormDividerControl.php', + 'PHUIFormFileControl' => 'view/form/control/PHUIFormFileControl.php', 'PHUIFormFreeformDateControl' => 'view/form/control/PHUIFormFreeformDateControl.php', - 'PHUIFormMultiSubmitControl' => 'view/form/control/PHUIFormMultiSubmitControl.php', - 'PHUIFormPageView' => 'view/form/PHUIFormPageView.php', + 'PHUIFormIconSetControl' => 'view/form/control/PHUIFormIconSetControl.php', + 'PHUIFormInsetView' => 'view/form/PHUIFormInsetView.php', + 'PHUIFormLayoutView' => 'view/form/PHUIFormLayoutView.php', + 'PHUIFormNumberControl' => 'view/form/control/PHUIFormNumberControl.php', + 'PHUIFormTimerControl' => 'view/form/control/PHUIFormTimerControl.php', + 'PHUIFormationColumnDynamicView' => 'view/formation/PHUIFormationColumnDynamicView.php', + 'PHUIFormationColumnItem' => 'view/formation/PHUIFormationColumnItem.php', + 'PHUIFormationColumnView' => 'view/formation/PHUIFormationColumnView.php', + 'PHUIFormationContentView' => 'view/formation/PHUIFormationContentView.php', + 'PHUIFormationExpanderView' => 'view/formation/PHUIFormationExpanderView.php', + 'PHUIFormationFlankView' => 'view/formation/PHUIFormationFlankView.php', + 'PHUIFormationResizerView' => 'view/formation/PHUIFormationResizerView.php', + 'PHUIFormationView' => 'view/formation/PHUIFormationView.php', + 'PHUIHandleListView' => 'applications/phid/view/PHUIHandleListView.php', + 'PHUIHandleTagListView' => 'applications/phid/view/PHUIHandleTagListView.php', + 'PHUIHandleView' => 'applications/phid/view/PHUIHandleView.php', + 'PHUIHeadThingView' => 'view/phui/PHUIHeadThingView.php', + 'PHUIHeaderView' => 'view/phui/PHUIHeaderView.php', + 'PHUIHomeView' => 'applications/home/view/PHUIHomeView.php', + 'PHUIHovercardUIExample' => 'applications/uiexample/examples/PHUIHovercardUIExample.php', + 'PHUIHovercardView' => 'view/phui/PHUIHovercardView.php', + 'PHUIIconCircleView' => 'view/phui/PHUIIconCircleView.php', 'PHUIIconExample' => 'applications/uiexample/examples/PHUIIconExample.php', 'PHUIIconView' => 'view/phui/PHUIIconView.php', + 'PHUIImageMaskExample' => 'applications/uiexample/examples/PHUIImageMaskExample.php', + 'PHUIImageMaskView' => 'view/phui/PHUIImageMaskView.php', + 'PHUIInfoExample' => 'applications/uiexample/examples/PHUIInfoExample.php', + 'PHUIInfoView' => 'view/phui/PHUIInfoView.php', + 'PHUIInvisibleCharacterTestCase' => 'view/phui/__tests__/PHUIInvisibleCharacterTestCase.php', + 'PHUIInvisibleCharacterView' => 'view/phui/PHUIInvisibleCharacterView.php', + 'PHUILauncherView' => 'view/phui/PHUILauncherView.php', + 'PHUILeftRightExample' => 'applications/uiexample/examples/PHUILeftRightExample.php', + 'PHUILeftRightView' => 'view/phui/PHUILeftRightView.php', + 'PHUILinkView' => 'view/phui/PHUILinkView.php', 'PHUIListExample' => 'applications/uiexample/examples/PHUIListExample.php', 'PHUIListItemView' => 'view/phui/PHUIListItemView.php', 'PHUIListView' => 'view/phui/PHUIListView.php', 'PHUIListViewTestCase' => 'view/layout/__tests__/PHUIListViewTestCase.php', - 'PHUIPagedFormView' => 'view/form/PHUIPagedFormView.php', + 'PHUIObjectBoxView' => 'view/phui/PHUIObjectBoxView.php', + 'PHUIObjectItemListExample' => 'applications/uiexample/examples/PHUIObjectItemListExample.php', + 'PHUIObjectItemListView' => 'view/phui/PHUIObjectItemListView.php', + 'PHUIObjectItemView' => 'view/phui/PHUIObjectItemView.php', + 'PHUIPagerView' => 'view/phui/PHUIPagerView.php', 'PHUIPinboardItemView' => 'view/phui/PHUIPinboardItemView.php', 'PHUIPinboardView' => 'view/phui/PHUIPinboardView.php', + 'PHUIPolicySectionView' => 'applications/policy/view/PHUIPolicySectionView.php', + 'PHUIPropertyGroupView' => 'view/phui/PHUIPropertyGroupView.php', + 'PHUIPropertyListExample' => 'applications/uiexample/examples/PHUIPropertyListExample.php', + 'PHUIPropertyListView' => 'view/phui/PHUIPropertyListView.php', + 'PHUIRemarkupImageView' => 'infrastructure/markup/view/PHUIRemarkupImageView.php', 'PHUIRemarkupPreviewPanel' => 'view/phui/PHUIRemarkupPreviewPanel.php', + 'PHUIRemarkupView' => 'infrastructure/markup/view/PHUIRemarkupView.php', + 'PHUISegmentBarSegmentView' => 'view/phui/PHUISegmentBarSegmentView.php', + 'PHUISegmentBarView' => 'view/phui/PHUISegmentBarView.php', + 'PHUISpacesNamespaceContextView' => 'applications/spaces/view/PHUISpacesNamespaceContextView.php', 'PHUIStatusItemView' => 'view/phui/PHUIStatusItemView.php', 'PHUIStatusListView' => 'view/phui/PHUIStatusListView.php', - 'PHUITextExample' => 'applications/uiexample/examples/PHUITextExample.php', - 'PHUITextView' => 'view/phui/PHUITextView.php', - 'PackageCreateMail' => 'applications/owners/mail/PackageCreateMail.php', - 'PackageDeleteMail' => 'applications/owners/mail/PackageDeleteMail.php', - 'PackageMail' => 'applications/owners/mail/PackageMail.php', - 'PackageModifyMail' => 'applications/owners/mail/PackageModifyMail.php', + 'PHUITabGroupView' => 'view/phui/PHUITabGroupView.php', + 'PHUITabView' => 'view/phui/PHUITabView.php', + 'PHUITagExample' => 'applications/uiexample/examples/PHUITagExample.php', + 'PHUITagView' => 'view/phui/PHUITagView.php', + 'PHUITimelineEventView' => 'view/phui/PHUITimelineEventView.php', + 'PHUITimelineExample' => 'applications/uiexample/examples/PHUITimelineExample.php', + 'PHUITimelineView' => 'view/phui/PHUITimelineView.php', + 'PHUITwoColumnView' => 'view/phui/PHUITwoColumnView.php', + 'PHUITypeaheadExample' => 'applications/uiexample/examples/PHUITypeaheadExample.php', + 'PHUIUserAvailabilityView' => 'applications/calendar/view/PHUIUserAvailabilityView.php', + 'PHUIWorkboardView' => 'view/phui/PHUIWorkboardView.php', + 'PHUIWorkpanelView' => 'view/phui/PHUIWorkpanelView.php', + 'PHUIXComponentsExample' => 'applications/uiexample/examples/PHUIXComponentsExample.php', + 'PassphraseAbstractKey' => 'applications/passphrase/keys/PassphraseAbstractKey.php', + 'PassphraseConduitAPIMethod' => 'applications/passphrase/conduit/PassphraseConduitAPIMethod.php', + 'PassphraseController' => 'applications/passphrase/controller/PassphraseController.php', + 'PassphraseCredential' => 'applications/passphrase/storage/PassphraseCredential.php', + 'PassphraseCredentialAuthorPolicyRule' => 'applications/passphrase/policyrule/PassphraseCredentialAuthorPolicyRule.php', + 'PassphraseCredentialConduitController' => 'applications/passphrase/controller/PassphraseCredentialConduitController.php', + 'PassphraseCredentialConduitTransaction' => 'applications/passphrase/xaction/PassphraseCredentialConduitTransaction.php', + 'PassphraseCredentialControl' => 'applications/passphrase/view/PassphraseCredentialControl.php', + 'PassphraseCredentialCreateController' => 'applications/passphrase/controller/PassphraseCredentialCreateController.php', + 'PassphraseCredentialDescriptionTransaction' => 'applications/passphrase/xaction/PassphraseCredentialDescriptionTransaction.php', + 'PassphraseCredentialDestroyController' => 'applications/passphrase/controller/PassphraseCredentialDestroyController.php', + 'PassphraseCredentialDestroyTransaction' => 'applications/passphrase/xaction/PassphraseCredentialDestroyTransaction.php', + 'PassphraseCredentialEditController' => 'applications/passphrase/controller/PassphraseCredentialEditController.php', + 'PassphraseCredentialFerretEngine' => 'applications/passphrase/search/PassphraseCredentialFerretEngine.php', + 'PassphraseCredentialFulltextEngine' => 'applications/passphrase/search/PassphraseCredentialFulltextEngine.php', + 'PassphraseCredentialListController' => 'applications/passphrase/controller/PassphraseCredentialListController.php', + 'PassphraseCredentialLockController' => 'applications/passphrase/controller/PassphraseCredentialLockController.php', + 'PassphraseCredentialLockTransaction' => 'applications/passphrase/xaction/PassphraseCredentialLockTransaction.php', + 'PassphraseCredentialLookedAtTransaction' => 'applications/passphrase/xaction/PassphraseCredentialLookedAtTransaction.php', + 'PassphraseCredentialNameTransaction' => 'applications/passphrase/xaction/PassphraseCredentialNameTransaction.php', + 'PassphraseCredentialPHIDType' => 'applications/passphrase/phid/PassphraseCredentialPHIDType.php', + 'PassphraseCredentialPublicController' => 'applications/passphrase/controller/PassphraseCredentialPublicController.php', + 'PassphraseCredentialQuery' => 'applications/passphrase/query/PassphraseCredentialQuery.php', + 'PassphraseCredentialRevealController' => 'applications/passphrase/controller/PassphraseCredentialRevealController.php', + 'PassphraseCredentialSearchEngine' => 'applications/passphrase/query/PassphraseCredentialSearchEngine.php', + 'PassphraseCredentialSecretIDTransaction' => 'applications/passphrase/xaction/PassphraseCredentialSecretIDTransaction.php', + 'PassphraseCredentialTransaction' => 'applications/passphrase/storage/PassphraseCredentialTransaction.php', + 'PassphraseCredentialTransactionEditor' => 'applications/passphrase/editor/PassphraseCredentialTransactionEditor.php', + 'PassphraseCredentialTransactionQuery' => 'applications/passphrase/query/PassphraseCredentialTransactionQuery.php', + 'PassphraseCredentialTransactionType' => 'applications/passphrase/xaction/PassphraseCredentialTransactionType.php', + 'PassphraseCredentialType' => 'applications/passphrase/credentialtype/PassphraseCredentialType.php', + 'PassphraseCredentialTypeTestCase' => 'applications/passphrase/credentialtype/__tests__/PassphraseCredentialTypeTestCase.php', + 'PassphraseCredentialUsernameTransaction' => 'applications/passphrase/xaction/PassphraseCredentialUsernameTransaction.php', + 'PassphraseCredentialViewController' => 'applications/passphrase/controller/PassphraseCredentialViewController.php', + 'PassphraseDAO' => 'applications/passphrase/storage/PassphraseDAO.php', + 'PassphraseDefaultEditCapability' => 'applications/passphrase/capability/PassphraseDefaultEditCapability.php', + 'PassphraseDefaultViewCapability' => 'applications/passphrase/capability/PassphraseDefaultViewCapability.php', + 'PassphraseNoteCredentialType' => 'applications/passphrase/credentialtype/PassphraseNoteCredentialType.php', + 'PassphrasePasswordCredentialType' => 'applications/passphrase/credentialtype/PassphrasePasswordCredentialType.php', + 'PassphrasePasswordKey' => 'applications/passphrase/keys/PassphrasePasswordKey.php', + 'PassphraseQueryConduitAPIMethod' => 'applications/passphrase/conduit/PassphraseQueryConduitAPIMethod.php', + 'PassphraseRemarkupRule' => 'applications/passphrase/remarkup/PassphraseRemarkupRule.php', + 'PassphraseSSHGeneratedKeyCredentialType' => 'applications/passphrase/credentialtype/PassphraseSSHGeneratedKeyCredentialType.php', + 'PassphraseSSHKey' => 'applications/passphrase/keys/PassphraseSSHKey.php', + 'PassphraseSSHPrivateKeyCredentialType' => 'applications/passphrase/credentialtype/PassphraseSSHPrivateKeyCredentialType.php', + 'PassphraseSSHPrivateKeyFileCredentialType' => 'applications/passphrase/credentialtype/PassphraseSSHPrivateKeyFileCredentialType.php', + 'PassphraseSSHPrivateKeyTextCredentialType' => 'applications/passphrase/credentialtype/PassphraseSSHPrivateKeyTextCredentialType.php', + 'PassphraseSchemaSpec' => 'applications/passphrase/storage/PassphraseSchemaSpec.php', + 'PassphraseSecret' => 'applications/passphrase/storage/PassphraseSecret.php', + 'PassphraseTokenCredentialType' => 'applications/passphrase/credentialtype/PassphraseTokenCredentialType.php', + 'PasteConduitAPIMethod' => 'applications/paste/conduit/PasteConduitAPIMethod.php', + 'PasteCreateConduitAPIMethod' => 'applications/paste/conduit/PasteCreateConduitAPIMethod.php', 'PasteCreateMailReceiver' => 'applications/paste/mail/PasteCreateMailReceiver.php', + 'PasteDefaultEditCapability' => 'applications/paste/capability/PasteDefaultEditCapability.php', + 'PasteDefaultViewCapability' => 'applications/paste/capability/PasteDefaultViewCapability.php', + 'PasteEditConduitAPIMethod' => 'applications/paste/conduit/PasteEditConduitAPIMethod.php', 'PasteEmbedView' => 'applications/paste/view/PasteEmbedView.php', - 'PasteMockMailReceiver' => 'applications/paste/mail/PasteMockMailReceiver.php', + 'PasteInfoConduitAPIMethod' => 'applications/paste/conduit/PasteInfoConduitAPIMethod.php', + 'PasteLanguageSelectDatasource' => 'applications/paste/typeahead/PasteLanguageSelectDatasource.php', + 'PasteMailReceiver' => 'applications/paste/mail/PasteMailReceiver.php', + 'PasteQueryConduitAPIMethod' => 'applications/paste/conduit/PasteQueryConduitAPIMethod.php', 'PasteReplyHandler' => 'applications/paste/mail/PasteReplyHandler.php', + 'PasteSearchConduitAPIMethod' => 'applications/paste/conduit/PasteSearchConduitAPIMethod.php', + 'PeopleBrowseUserDirectoryCapability' => 'applications/people/capability/PeopleBrowseUserDirectoryCapability.php', + 'PeopleCreateUsersCapability' => 'applications/people/capability/PeopleCreateUsersCapability.php', + 'PeopleDisableUsersCapability' => 'applications/people/capability/PeopleDisableUsersCapability.php', + 'PeopleHovercardEngineExtension' => 'applications/people/engineextension/PeopleHovercardEngineExtension.php', + 'PeopleMainMenuBarExtension' => 'applications/people/engineextension/PeopleMainMenuBarExtension.php', + 'PeopleUserLogGarbageCollector' => 'applications/people/garbagecollector/PeopleUserLogGarbageCollector.php', 'Phabricator404Controller' => 'applications/base/controller/Phabricator404Controller.php', 'PhabricatorAWSConfigOptions' => 'applications/config/option/PhabricatorAWSConfigOptions.php', - 'PhabricatorAccessLog' => 'infrastructure/PhabricatorAccessLog.php', + 'PhabricatorAWSSESFuture' => 'applications/metamta/future/PhabricatorAWSSESFuture.php', + 'PhabricatorAccessControlTestCase' => 'applications/base/controller/__tests__/PhabricatorAccessControlTestCase.php', + 'PhabricatorAccessLog' => 'infrastructure/log/PhabricatorAccessLog.php', 'PhabricatorAccessLogConfigOptions' => 'applications/config/option/PhabricatorAccessLogConfigOptions.php', - 'PhabricatorActionHeaderExample' => 'applications/uiexample/examples/PhabricatorActionHeaderExample.php', - 'PhabricatorActionHeaderView' => 'view/layout/PhabricatorActionHeaderView.php', - 'PhabricatorActionListExample' => 'applications/uiexample/examples/PhabricatorActionListExample.php', + 'PhabricatorAccessibilitySetting' => 'applications/settings/setting/PhabricatorAccessibilitySetting.php', + 'PhabricatorAccumulateChartFunction' => 'applications/fact/chart/PhabricatorAccumulateChartFunction.php', 'PhabricatorActionListView' => 'view/layout/PhabricatorActionListView.php', 'PhabricatorActionView' => 'view/layout/PhabricatorActionView.php', - 'PhabricatorAllCapsTranslation' => 'infrastructure/internationalization/PhabricatorAllCapsTranslation.php', + 'PhabricatorActivitySettingsPanel' => 'applications/settings/panel/PhabricatorActivitySettingsPanel.php', + 'PhabricatorAddEmailUserLogType' => 'applications/people/userlog/PhabricatorAddEmailUserLogType.php', + 'PhabricatorAddMultifactorUserLogType' => 'applications/people/userlog/PhabricatorAddMultifactorUserLogType.php', + 'PhabricatorAdministratorsPolicyRule' => 'applications/people/policyrule/PhabricatorAdministratorsPolicyRule.php', + 'PhabricatorAjaxRequestExceptionHandler' => 'aphront/handler/PhabricatorAjaxRequestExceptionHandler.php', + 'PhabricatorAlmanacApplication' => 'applications/almanac/application/PhabricatorAlmanacApplication.php', + 'PhabricatorAmazonAuthProvider' => 'applications/auth/provider/PhabricatorAmazonAuthProvider.php', + 'PhabricatorAmazonSNSFuture' => 'applications/metamta/future/PhabricatorAmazonSNSFuture.php', + 'PhabricatorAnchorTestCase' => 'infrastructure/markup/__tests__/PhabricatorAnchorTestCase.php', 'PhabricatorAnchorView' => 'view/layout/PhabricatorAnchorView.php', - 'PhabricatorAphrontBarExample' => 'applications/uiexample/examples/PhabricatorAphrontBarExample.php', + 'PhabricatorAphlictManagementDebugWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementDebugWorkflow.php', + 'PhabricatorAphlictManagementNotifyWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementNotifyWorkflow.php', + 'PhabricatorAphlictManagementRestartWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementRestartWorkflow.php', + 'PhabricatorAphlictManagementStartWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementStartWorkflow.php', + 'PhabricatorAphlictManagementStatusWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementStatusWorkflow.php', + 'PhabricatorAphlictManagementStopWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementStopWorkflow.php', + 'PhabricatorAphlictManagementWorkflow' => 'applications/aphlict/management/PhabricatorAphlictManagementWorkflow.php', + 'PhabricatorAphlictSetupCheck' => 'applications/notification/setup/PhabricatorAphlictSetupCheck.php', + 'PhabricatorAphrontBarUIExample' => 'applications/uiexample/examples/PhabricatorAphrontBarUIExample.php', 'PhabricatorAphrontViewTestCase' => 'view/__tests__/PhabricatorAphrontViewTestCase.php', + 'PhabricatorAppSearchEngine' => 'applications/meta/query/PhabricatorAppSearchEngine.php', 'PhabricatorApplication' => 'applications/base/PhabricatorApplication.php', - 'PhabricatorApplicationApplications' => 'applications/meta/application/PhabricatorApplicationApplications.php', - 'PhabricatorApplicationAudit' => 'applications/audit/application/PhabricatorApplicationAudit.php', - 'PhabricatorApplicationAuth' => 'applications/auth/application/PhabricatorApplicationAuth.php', - 'PhabricatorApplicationCalendar' => 'applications/calendar/application/PhabricatorApplicationCalendar.php', - 'PhabricatorApplicationChatLog' => 'applications/chatlog/applications/PhabricatorApplicationChatLog.php', - 'PhabricatorApplicationConduit' => 'applications/conduit/application/PhabricatorApplicationConduit.php', - 'PhabricatorApplicationConfig' => 'applications/config/application/PhabricatorApplicationConfig.php', + 'PhabricatorApplicationApplicationPHIDType' => 'applications/meta/phid/PhabricatorApplicationApplicationPHIDType.php', + 'PhabricatorApplicationApplicationTransaction' => 'applications/meta/storage/PhabricatorApplicationApplicationTransaction.php', + 'PhabricatorApplicationApplicationTransactionQuery' => 'applications/meta/query/PhabricatorApplicationApplicationTransactionQuery.php', 'PhabricatorApplicationConfigOptions' => 'applications/config/option/PhabricatorApplicationConfigOptions.php', - 'PhabricatorApplicationConpherence' => 'applications/conpherence/application/PhabricatorApplicationConpherence.php', - 'PhabricatorApplicationCountdown' => 'applications/countdown/application/PhabricatorApplicationCountdown.php', - 'PhabricatorApplicationDaemons' => 'applications/daemon/application/PhabricatorApplicationDaemons.php', + 'PhabricatorApplicationConfigurationPanel' => 'applications/meta/panel/PhabricatorApplicationConfigurationPanel.php', + 'PhabricatorApplicationConfigurationPanelTestCase' => 'applications/meta/panel/__tests__/PhabricatorApplicationConfigurationPanelTestCase.php', + 'PhabricatorApplicationDatasource' => 'applications/meta/typeahead/PhabricatorApplicationDatasource.php', 'PhabricatorApplicationDetailViewController' => 'applications/meta/controller/PhabricatorApplicationDetailViewController.php', - 'PhabricatorApplicationDifferential' => 'applications/differential/application/PhabricatorApplicationDifferential.php', - 'PhabricatorApplicationDiffusion' => 'applications/diffusion/application/PhabricatorApplicationDiffusion.php', - 'PhabricatorApplicationDiviner' => 'applications/diviner/application/PhabricatorApplicationDiviner.php', - 'PhabricatorApplicationDoorkeeper' => 'applications/doorkeeper/application/PhabricatorApplicationDoorkeeper.php', - 'PhabricatorApplicationDrydock' => 'applications/drydock/application/PhabricatorApplicationDrydock.php', - 'PhabricatorApplicationFact' => 'applications/fact/application/PhabricatorApplicationFact.php', - 'PhabricatorApplicationFeed' => 'applications/feed/application/PhabricatorApplicationFeed.php', - 'PhabricatorApplicationFiles' => 'applications/files/application/PhabricatorApplicationFiles.php', - 'PhabricatorApplicationFlags' => 'applications/flag/application/PhabricatorApplicationFlags.php', - 'PhabricatorApplicationHerald' => 'applications/herald/application/PhabricatorApplicationHerald.php', - 'PhabricatorApplicationLaunchView' => 'applications/meta/view/PhabricatorApplicationLaunchView.php', - 'PhabricatorApplicationLegalpad' => 'applications/legalpad/application/PhabricatorApplicationLegalpad.php', - 'PhabricatorApplicationMacro' => 'applications/macro/application/PhabricatorApplicationMacro.php', - 'PhabricatorApplicationMailingLists' => 'applications/mailinglists/application/PhabricatorApplicationMailingLists.php', - 'PhabricatorApplicationManiphest' => 'applications/maniphest/application/PhabricatorApplicationManiphest.php', - 'PhabricatorApplicationMetaMTA' => 'applications/metamta/application/PhabricatorApplicationMetaMTA.php', - 'PhabricatorApplicationOwners' => 'applications/owners/application/PhabricatorApplicationOwners.php', - 'PhabricatorApplicationPHPAST' => 'applications/phpast/application/PhabricatorApplicationPHPAST.php', - 'PhabricatorApplicationPaste' => 'applications/paste/application/PhabricatorApplicationPaste.php', - 'PhabricatorApplicationPeople' => 'applications/people/application/PhabricatorApplicationPeople.php', - 'PhabricatorApplicationPhame' => 'applications/phame/application/PhabricatorApplicationPhame.php', - 'PhabricatorApplicationPhlux' => 'applications/phlux/application/PhabricatorApplicationPhlux.php', - 'PhabricatorApplicationPholio' => 'applications/pholio/application/PhabricatorApplicationPholio.php', - 'PhabricatorApplicationPhortune' => 'applications/phortune/application/PhabricatorApplicationPhortune.php', - 'PhabricatorApplicationPhrequent' => 'applications/phrequent/application/PhabricatorApplicationPhrequent.php', - 'PhabricatorApplicationPhriction' => 'applications/phriction/application/PhabricatorApplicationPhriction.php', - 'PhabricatorApplicationPonder' => 'applications/ponder/application/PhabricatorApplicationPonder.php', - 'PhabricatorApplicationProject' => 'applications/project/application/PhabricatorApplicationProject.php', - 'PhabricatorApplicationReleeph' => 'applications/releeph/application/PhabricatorApplicationReleeph.php', - 'PhabricatorApplicationReleephConfigOptions' => 'applications/releeph/config/PhabricatorApplicationReleephConfigOptions.php', - 'PhabricatorApplicationRepositories' => 'applications/repository/application/PhabricatorApplicationRepositories.php', - 'PhabricatorApplicationSearch' => 'applications/search/application/PhabricatorApplicationSearch.php', + 'PhabricatorApplicationEditController' => 'applications/meta/controller/PhabricatorApplicationEditController.php', + 'PhabricatorApplicationEditEngine' => 'applications/meta/editor/PhabricatorApplicationEditEngine.php', + 'PhabricatorApplicationEditHTTPParameterHelpView' => 'applications/transactions/view/PhabricatorApplicationEditHTTPParameterHelpView.php', + 'PhabricatorApplicationEditor' => 'applications/meta/editor/PhabricatorApplicationEditor.php', + 'PhabricatorApplicationEmailCommandsController' => 'applications/meta/controller/PhabricatorApplicationEmailCommandsController.php', + 'PhabricatorApplicationMailReceiver' => 'applications/metamta/receiver/PhabricatorApplicationMailReceiver.php', + 'PhabricatorApplicationObjectMailEngineExtension' => 'applications/transactions/engineextension/PhabricatorApplicationObjectMailEngineExtension.php', + 'PhabricatorApplicationPanelController' => 'applications/meta/controller/PhabricatorApplicationPanelController.php', + 'PhabricatorApplicationPolicyChangeTransaction' => 'applications/meta/xactions/PhabricatorApplicationPolicyChangeTransaction.php', + 'PhabricatorApplicationProfileMenuItem' => 'applications/search/menuitem/PhabricatorApplicationProfileMenuItem.php', + 'PhabricatorApplicationQuery' => 'applications/meta/query/PhabricatorApplicationQuery.php', + 'PhabricatorApplicationSchemaSpec' => 'applications/meta/storage/PhabricatorApplicationSchemaSpec.php', 'PhabricatorApplicationSearchController' => 'applications/search/controller/PhabricatorApplicationSearchController.php', 'PhabricatorApplicationSearchEngine' => 'applications/search/engine/PhabricatorApplicationSearchEngine.php', - 'PhabricatorApplicationSearchResultsControllerInterface' => 'applications/search/interface/PhabricatorApplicationSearchResultsControllerInterface.php', - 'PhabricatorApplicationSettings' => 'applications/settings/application/PhabricatorApplicationSettings.php', - 'PhabricatorApplicationSlowvote' => 'applications/slowvote/application/PhabricatorApplicationSlowvote.php', - 'PhabricatorApplicationStatusView' => 'applications/meta/view/PhabricatorApplicationStatusView.php', - 'PhabricatorApplicationSubscriptions' => 'applications/subscriptions/application/PhabricatorApplicationSubscriptions.php', - 'PhabricatorApplicationTokens' => 'applications/tokens/application/PhabricatorApplicationTokens.php', + 'PhabricatorApplicationSearchEngineTestCase' => 'applications/search/engine/__tests__/PhabricatorApplicationSearchEngineTestCase.php', + 'PhabricatorApplicationSearchResultView' => 'applications/search/view/PhabricatorApplicationSearchResultView.php', + 'PhabricatorApplicationTestCase' => 'applications/base/__tests__/PhabricatorApplicationTestCase.php', 'PhabricatorApplicationTransaction' => 'applications/transactions/storage/PhabricatorApplicationTransaction.php', 'PhabricatorApplicationTransactionComment' => 'applications/transactions/storage/PhabricatorApplicationTransactionComment.php', 'PhabricatorApplicationTransactionCommentEditController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php', 'PhabricatorApplicationTransactionCommentEditor' => 'applications/transactions/editor/PhabricatorApplicationTransactionCommentEditor.php', 'PhabricatorApplicationTransactionCommentHistoryController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentHistoryController.php', 'PhabricatorApplicationTransactionCommentQuery' => 'applications/transactions/query/PhabricatorApplicationTransactionCommentQuery.php', + 'PhabricatorApplicationTransactionCommentQuoteController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentQuoteController.php', + 'PhabricatorApplicationTransactionCommentRawController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentRawController.php', + 'PhabricatorApplicationTransactionCommentRemoveController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentRemoveController.php', 'PhabricatorApplicationTransactionCommentView' => 'applications/transactions/view/PhabricatorApplicationTransactionCommentView.php', 'PhabricatorApplicationTransactionController' => 'applications/transactions/controller/PhabricatorApplicationTransactionController.php', + 'PhabricatorApplicationTransactionDetailController' => 'applications/transactions/controller/PhabricatorApplicationTransactionDetailController.php', + 'PhabricatorApplicationTransactionDetailView' => 'applications/transactions/view/PhabricatorApplicationTransactionDetailView.php', 'PhabricatorApplicationTransactionEditor' => 'applications/transactions/editor/PhabricatorApplicationTransactionEditor.php', 'PhabricatorApplicationTransactionFeedStory' => 'applications/transactions/feed/PhabricatorApplicationTransactionFeedStory.php', 'PhabricatorApplicationTransactionInterface' => 'applications/transactions/interface/PhabricatorApplicationTransactionInterface.php', + 'PhabricatorApplicationTransactionJSONDiffDetailView' => 'applications/transactions/view/PhabricatorApplicationTransactionJSONDiffDetailView.php', 'PhabricatorApplicationTransactionNoEffectException' => 'applications/transactions/exception/PhabricatorApplicationTransactionNoEffectException.php', 'PhabricatorApplicationTransactionNoEffectResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionNoEffectResponse.php', - 'PhabricatorApplicationTransactionPHIDTypeTransaction' => 'applications/transactions/phid/PhabricatorApplicationTransactionPHIDTypeTransaction.php', + 'PhabricatorApplicationTransactionPublishWorker' => 'applications/transactions/worker/PhabricatorApplicationTransactionPublishWorker.php', 'PhabricatorApplicationTransactionQuery' => 'applications/transactions/query/PhabricatorApplicationTransactionQuery.php', + 'PhabricatorApplicationTransactionRemarkupPreviewController' => 'applications/transactions/controller/PhabricatorApplicationTransactionRemarkupPreviewController.php', + 'PhabricatorApplicationTransactionReplyHandler' => 'applications/transactions/replyhandler/PhabricatorApplicationTransactionReplyHandler.php', 'PhabricatorApplicationTransactionResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionResponse.php', + 'PhabricatorApplicationTransactionShowOlderController' => 'applications/transactions/controller/PhabricatorApplicationTransactionShowOlderController.php', + 'PhabricatorApplicationTransactionStructureException' => 'applications/transactions/exception/PhabricatorApplicationTransactionStructureException.php', + 'PhabricatorApplicationTransactionTemplatedCommentQuery' => 'applications/transactions/query/PhabricatorApplicationTransactionTemplatedCommentQuery.php', 'PhabricatorApplicationTransactionTextDiffDetailView' => 'applications/transactions/view/PhabricatorApplicationTransactionTextDiffDetailView.php', + 'PhabricatorApplicationTransactionTransactionPHIDType' => 'applications/transactions/phid/PhabricatorApplicationTransactionTransactionPHIDType.php', + 'PhabricatorApplicationTransactionType' => 'applications/meta/xactions/PhabricatorApplicationTransactionType.php', + 'PhabricatorApplicationTransactionValidationError' => 'applications/transactions/error/PhabricatorApplicationTransactionValidationError.php', + 'PhabricatorApplicationTransactionValidationException' => 'applications/transactions/exception/PhabricatorApplicationTransactionValidationException.php', + 'PhabricatorApplicationTransactionValidationResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionValidationResponse.php', + 'PhabricatorApplicationTransactionValueController' => 'applications/transactions/controller/PhabricatorApplicationTransactionValueController.php', 'PhabricatorApplicationTransactionView' => 'applications/transactions/view/PhabricatorApplicationTransactionView.php', - 'PhabricatorApplicationTransactions' => 'applications/transactions/application/PhabricatorApplicationTransactions.php', - 'PhabricatorApplicationUIExamples' => 'applications/uiexample/application/PhabricatorApplicationUIExamples.php', + 'PhabricatorApplicationTransactionWarningException' => 'applications/transactions/exception/PhabricatorApplicationTransactionWarningException.php', + 'PhabricatorApplicationTransactionWarningResponse' => 'applications/transactions/response/PhabricatorApplicationTransactionWarningResponse.php', 'PhabricatorApplicationUninstallController' => 'applications/meta/controller/PhabricatorApplicationUninstallController.php', - 'PhabricatorApplicationXHProf' => 'applications/xhprof/application/PhabricatorApplicationXHProf.php', + 'PhabricatorApplicationUninstallTransaction' => 'applications/meta/xactions/PhabricatorApplicationUninstallTransaction.php', + 'PhabricatorApplicationsApplication' => 'applications/meta/application/PhabricatorApplicationsApplication.php', 'PhabricatorApplicationsController' => 'applications/meta/controller/PhabricatorApplicationsController.php', 'PhabricatorApplicationsListController' => 'applications/meta/controller/PhabricatorApplicationsListController.php', + 'PhabricatorApplyEditField' => 'applications/transactions/editfield/PhabricatorApplyEditField.php', + 'PhabricatorAsanaAuthProvider' => 'applications/auth/provider/PhabricatorAsanaAuthProvider.php', 'PhabricatorAsanaConfigOptions' => 'applications/doorkeeper/option/PhabricatorAsanaConfigOptions.php', + 'PhabricatorAsanaSubtaskHasObjectEdgeType' => 'applications/doorkeeper/edge/PhabricatorAsanaSubtaskHasObjectEdgeType.php', + 'PhabricatorAsanaTaskHasObjectEdgeType' => 'applications/doorkeeper/edge/PhabricatorAsanaTaskHasObjectEdgeType.php', + 'PhabricatorAudioDocumentEngine' => 'applications/files/document/PhabricatorAudioDocumentEngine.php', 'PhabricatorAuditActionConstants' => 'applications/audit/constants/PhabricatorAuditActionConstants.php', - 'PhabricatorAuditAddCommentController' => 'applications/audit/controller/PhabricatorAuditAddCommentController.php', - 'PhabricatorAuditComment' => 'applications/audit/storage/PhabricatorAuditComment.php', + 'PhabricatorAuditApplication' => 'applications/audit/application/PhabricatorAuditApplication.php', 'PhabricatorAuditCommentEditor' => 'applications/audit/editor/PhabricatorAuditCommentEditor.php', - 'PhabricatorAuditCommitListView' => 'applications/audit/view/PhabricatorAuditCommitListView.php', - 'PhabricatorAuditCommitQuery' => 'applications/audit/query/PhabricatorAuditCommitQuery.php', - 'PhabricatorAuditCommitStatusConstants' => 'applications/audit/constants/PhabricatorAuditCommitStatusConstants.php', 'PhabricatorAuditController' => 'applications/audit/controller/PhabricatorAuditController.php', - 'PhabricatorAuditDAO' => 'applications/audit/storage/PhabricatorAuditDAO.php', + 'PhabricatorAuditEditor' => 'applications/audit/editor/PhabricatorAuditEditor.php', 'PhabricatorAuditInlineComment' => 'applications/audit/storage/PhabricatorAuditInlineComment.php', - 'PhabricatorAuditListController' => 'applications/audit/controller/PhabricatorAuditListController.php', - 'PhabricatorAuditListView' => 'applications/audit/view/PhabricatorAuditListView.php', 'PhabricatorAuditMailReceiver' => 'applications/audit/mail/PhabricatorAuditMailReceiver.php', 'PhabricatorAuditManagementDeleteWorkflow' => 'applications/audit/management/PhabricatorAuditManagementDeleteWorkflow.php', 'PhabricatorAuditManagementWorkflow' => 'applications/audit/management/PhabricatorAuditManagementWorkflow.php', - 'PhabricatorAuditPreviewController' => 'applications/audit/controller/PhabricatorAuditPreviewController.php', - 'PhabricatorAuditQuery' => 'applications/audit/query/PhabricatorAuditQuery.php', 'PhabricatorAuditReplyHandler' => 'applications/audit/mail/PhabricatorAuditReplyHandler.php', - 'PhabricatorAuditStatusConstants' => 'applications/audit/constants/PhabricatorAuditStatusConstants.php', + 'PhabricatorAuditRequestStatus' => 'applications/audit/constants/PhabricatorAuditRequestStatus.php', + 'PhabricatorAuditSynchronizeManagementWorkflow' => 'applications/audit/management/PhabricatorAuditSynchronizeManagementWorkflow.php', + 'PhabricatorAuditTransaction' => 'applications/audit/storage/PhabricatorAuditTransaction.php', + 'PhabricatorAuditTransactionComment' => 'applications/audit/storage/PhabricatorAuditTransactionComment.php', + 'PhabricatorAuditTransactionQuery' => 'applications/audit/query/PhabricatorAuditTransactionQuery.php', + 'PhabricatorAuditTransactionView' => 'applications/audit/view/PhabricatorAuditTransactionView.php', + 'PhabricatorAuditUpdateOwnersManagementWorkflow' => 'applications/audit/management/PhabricatorAuditUpdateOwnersManagementWorkflow.php', 'PhabricatorAuthAccountView' => 'applications/auth/view/PhabricatorAuthAccountView.php', + 'PhabricatorAuthApplication' => 'applications/auth/application/PhabricatorAuthApplication.php', + 'PhabricatorAuthAuthFactorPHIDType' => 'applications/auth/phid/PhabricatorAuthAuthFactorPHIDType.php', + 'PhabricatorAuthAuthFactorProviderPHIDType' => 'applications/auth/phid/PhabricatorAuthAuthFactorProviderPHIDType.php', + 'PhabricatorAuthAuthProviderPHIDType' => 'applications/auth/phid/PhabricatorAuthAuthProviderPHIDType.php', + 'PhabricatorAuthCSRFEngine' => 'applications/auth/engine/PhabricatorAuthCSRFEngine.php', + 'PhabricatorAuthChallenge' => 'applications/auth/storage/PhabricatorAuthChallenge.php', + 'PhabricatorAuthChallengeGarbageCollector' => 'applications/auth/garbagecollector/PhabricatorAuthChallengeGarbageCollector.php', + 'PhabricatorAuthChallengePHIDType' => 'applications/auth/phid/PhabricatorAuthChallengePHIDType.php', + 'PhabricatorAuthChallengeQuery' => 'applications/auth/query/PhabricatorAuthChallengeQuery.php', + 'PhabricatorAuthChallengeStatusController' => 'applications/auth/controller/mfa/PhabricatorAuthChallengeStatusController.php', + 'PhabricatorAuthChallengeUpdate' => 'applications/auth/view/PhabricatorAuthChallengeUpdate.php', + 'PhabricatorAuthChangePasswordAction' => 'applications/auth/action/PhabricatorAuthChangePasswordAction.php', + 'PhabricatorAuthChangeUsernameMessageType' => 'applications/auth/message/PhabricatorAuthChangeUsernameMessageType.php', + 'PhabricatorAuthConduitAPIMethod' => 'applications/auth/conduit/PhabricatorAuthConduitAPIMethod.php', + 'PhabricatorAuthConduitTokenRevoker' => 'applications/auth/revoker/PhabricatorAuthConduitTokenRevoker.php', 'PhabricatorAuthConfirmLinkController' => 'applications/auth/controller/PhabricatorAuthConfirmLinkController.php', + 'PhabricatorAuthContactNumber' => 'applications/auth/storage/PhabricatorAuthContactNumber.php', + 'PhabricatorAuthContactNumberController' => 'applications/auth/controller/contact/PhabricatorAuthContactNumberController.php', + 'PhabricatorAuthContactNumberDisableController' => 'applications/auth/controller/contact/PhabricatorAuthContactNumberDisableController.php', + 'PhabricatorAuthContactNumberEditController' => 'applications/auth/controller/contact/PhabricatorAuthContactNumberEditController.php', + 'PhabricatorAuthContactNumberEditEngine' => 'applications/auth/editor/PhabricatorAuthContactNumberEditEngine.php', + 'PhabricatorAuthContactNumberEditor' => 'applications/auth/editor/PhabricatorAuthContactNumberEditor.php', + 'PhabricatorAuthContactNumberMFAEngine' => 'applications/auth/engine/PhabricatorAuthContactNumberMFAEngine.php', + 'PhabricatorAuthContactNumberNumberTransaction' => 'applications/auth/xaction/PhabricatorAuthContactNumberNumberTransaction.php', + 'PhabricatorAuthContactNumberPHIDType' => 'applications/auth/phid/PhabricatorAuthContactNumberPHIDType.php', + 'PhabricatorAuthContactNumberPrimaryController' => 'applications/auth/controller/contact/PhabricatorAuthContactNumberPrimaryController.php', + 'PhabricatorAuthContactNumberPrimaryTransaction' => 'applications/auth/xaction/PhabricatorAuthContactNumberPrimaryTransaction.php', + 'PhabricatorAuthContactNumberQuery' => 'applications/auth/query/PhabricatorAuthContactNumberQuery.php', + 'PhabricatorAuthContactNumberStatusTransaction' => 'applications/auth/xaction/PhabricatorAuthContactNumberStatusTransaction.php', + 'PhabricatorAuthContactNumberTestController' => 'applications/auth/controller/contact/PhabricatorAuthContactNumberTestController.php', + 'PhabricatorAuthContactNumberTransaction' => 'applications/auth/storage/PhabricatorAuthContactNumberTransaction.php', + 'PhabricatorAuthContactNumberTransactionQuery' => 'applications/auth/query/PhabricatorAuthContactNumberTransactionQuery.php', + 'PhabricatorAuthContactNumberTransactionType' => 'applications/auth/xaction/PhabricatorAuthContactNumberTransactionType.php', + 'PhabricatorAuthContactNumberViewController' => 'applications/auth/controller/contact/PhabricatorAuthContactNumberViewController.php', 'PhabricatorAuthController' => 'applications/auth/controller/PhabricatorAuthController.php', 'PhabricatorAuthDAO' => 'applications/auth/storage/PhabricatorAuthDAO.php', 'PhabricatorAuthDisableController' => 'applications/auth/controller/config/PhabricatorAuthDisableController.php', + 'PhabricatorAuthDowngradeSessionController' => 'applications/auth/controller/PhabricatorAuthDowngradeSessionController.php', 'PhabricatorAuthEditController' => 'applications/auth/controller/config/PhabricatorAuthEditController.php', + 'PhabricatorAuthEmailLoginAction' => 'applications/auth/action/PhabricatorAuthEmailLoginAction.php', + 'PhabricatorAuthEmailLoginMessageType' => 'applications/auth/message/PhabricatorAuthEmailLoginMessageType.php', + 'PhabricatorAuthEmailSetPasswordMessageType' => 'applications/auth/message/PhabricatorAuthEmailSetPasswordMessageType.php', + 'PhabricatorAuthFactor' => 'applications/auth/factor/PhabricatorAuthFactor.php', + 'PhabricatorAuthFactorConfig' => 'applications/auth/storage/PhabricatorAuthFactorConfig.php', + 'PhabricatorAuthFactorConfigQuery' => 'applications/auth/query/PhabricatorAuthFactorConfigQuery.php', + 'PhabricatorAuthFactorProvider' => 'applications/auth/storage/PhabricatorAuthFactorProvider.php', + 'PhabricatorAuthFactorProviderController' => 'applications/auth/controller/mfa/PhabricatorAuthFactorProviderController.php', + 'PhabricatorAuthFactorProviderDuoCredentialTransaction' => 'applications/auth/xaction/PhabricatorAuthFactorProviderDuoCredentialTransaction.php', + 'PhabricatorAuthFactorProviderDuoEnrollTransaction' => 'applications/auth/xaction/PhabricatorAuthFactorProviderDuoEnrollTransaction.php', + 'PhabricatorAuthFactorProviderDuoHostnameTransaction' => 'applications/auth/xaction/PhabricatorAuthFactorProviderDuoHostnameTransaction.php', + 'PhabricatorAuthFactorProviderDuoUsernamesTransaction' => 'applications/auth/xaction/PhabricatorAuthFactorProviderDuoUsernamesTransaction.php', + 'PhabricatorAuthFactorProviderEditController' => 'applications/auth/controller/mfa/PhabricatorAuthFactorProviderEditController.php', + 'PhabricatorAuthFactorProviderEditEngine' => 'applications/auth/editor/PhabricatorAuthFactorProviderEditEngine.php', + 'PhabricatorAuthFactorProviderEditor' => 'applications/auth/editor/PhabricatorAuthFactorProviderEditor.php', + 'PhabricatorAuthFactorProviderEnrollMessageTransaction' => 'applications/auth/xaction/PhabricatorAuthFactorProviderEnrollMessageTransaction.php', + 'PhabricatorAuthFactorProviderListController' => 'applications/auth/controller/mfa/PhabricatorAuthFactorProviderListController.php', + 'PhabricatorAuthFactorProviderMFAEngine' => 'applications/auth/engine/PhabricatorAuthFactorProviderMFAEngine.php', + 'PhabricatorAuthFactorProviderMessageController' => 'applications/auth/controller/mfa/PhabricatorAuthFactorProviderMessageController.php', + 'PhabricatorAuthFactorProviderNameTransaction' => 'applications/auth/xaction/PhabricatorAuthFactorProviderNameTransaction.php', + 'PhabricatorAuthFactorProviderQuery' => 'applications/auth/query/PhabricatorAuthFactorProviderQuery.php', + 'PhabricatorAuthFactorProviderStatus' => 'applications/auth/constants/PhabricatorAuthFactorProviderStatus.php', + 'PhabricatorAuthFactorProviderStatusTransaction' => 'applications/auth/xaction/PhabricatorAuthFactorProviderStatusTransaction.php', + 'PhabricatorAuthFactorProviderTransaction' => 'applications/auth/storage/PhabricatorAuthFactorProviderTransaction.php', + 'PhabricatorAuthFactorProviderTransactionQuery' => 'applications/auth/query/PhabricatorAuthFactorProviderTransactionQuery.php', + 'PhabricatorAuthFactorProviderTransactionType' => 'applications/auth/xaction/PhabricatorAuthFactorProviderTransactionType.php', + 'PhabricatorAuthFactorProviderViewController' => 'applications/auth/controller/mfa/PhabricatorAuthFactorProviderViewController.php', + 'PhabricatorAuthFactorResult' => 'applications/auth/factor/PhabricatorAuthFactorResult.php', + 'PhabricatorAuthFactorTestCase' => 'applications/auth/factor/__tests__/PhabricatorAuthFactorTestCase.php', + 'PhabricatorAuthFinishController' => 'applications/auth/controller/PhabricatorAuthFinishController.php', + 'PhabricatorAuthHMACKey' => 'applications/auth/storage/PhabricatorAuthHMACKey.php', + 'PhabricatorAuthHighSecurityRequiredException' => 'applications/auth/exception/PhabricatorAuthHighSecurityRequiredException.php', + 'PhabricatorAuthHighSecurityToken' => 'applications/auth/data/PhabricatorAuthHighSecurityToken.php', + 'PhabricatorAuthInvite' => 'applications/auth/storage/PhabricatorAuthInvite.php', + 'PhabricatorAuthInviteAccountException' => 'applications/auth/exception/PhabricatorAuthInviteAccountException.php', + 'PhabricatorAuthInviteAction' => 'applications/auth/data/PhabricatorAuthInviteAction.php', + 'PhabricatorAuthInviteActionTableView' => 'applications/auth/view/PhabricatorAuthInviteActionTableView.php', + 'PhabricatorAuthInviteController' => 'applications/auth/controller/PhabricatorAuthInviteController.php', + 'PhabricatorAuthInviteDialogException' => 'applications/auth/exception/PhabricatorAuthInviteDialogException.php', + 'PhabricatorAuthInviteEngine' => 'applications/auth/engine/PhabricatorAuthInviteEngine.php', + 'PhabricatorAuthInviteException' => 'applications/auth/exception/PhabricatorAuthInviteException.php', + 'PhabricatorAuthInviteInvalidException' => 'applications/auth/exception/PhabricatorAuthInviteInvalidException.php', + 'PhabricatorAuthInviteLoginException' => 'applications/auth/exception/PhabricatorAuthInviteLoginException.php', + 'PhabricatorAuthInvitePHIDType' => 'applications/auth/phid/PhabricatorAuthInvitePHIDType.php', + 'PhabricatorAuthInviteQuery' => 'applications/auth/query/PhabricatorAuthInviteQuery.php', + 'PhabricatorAuthInviteRegisteredException' => 'applications/auth/exception/PhabricatorAuthInviteRegisteredException.php', + 'PhabricatorAuthInviteSearchEngine' => 'applications/auth/query/PhabricatorAuthInviteSearchEngine.php', + 'PhabricatorAuthInviteTestCase' => 'applications/auth/factor/__tests__/PhabricatorAuthInviteTestCase.php', + 'PhabricatorAuthInviteVerifyException' => 'applications/auth/exception/PhabricatorAuthInviteVerifyException.php', + 'PhabricatorAuthInviteWorker' => 'applications/auth/worker/PhabricatorAuthInviteWorker.php', 'PhabricatorAuthLinkController' => 'applications/auth/controller/PhabricatorAuthLinkController.php', + 'PhabricatorAuthLinkMessageType' => 'applications/auth/message/PhabricatorAuthLinkMessageType.php', 'PhabricatorAuthListController' => 'applications/auth/controller/config/PhabricatorAuthListController.php', 'PhabricatorAuthLoginController' => 'applications/auth/controller/PhabricatorAuthLoginController.php', + 'PhabricatorAuthLoginMessageType' => 'applications/auth/message/PhabricatorAuthLoginMessageType.php', + 'PhabricatorAuthLogoutConduitAPIMethod' => 'applications/auth/conduit/PhabricatorAuthLogoutConduitAPIMethod.php', + 'PhabricatorAuthMFAEditEngineExtension' => 'applications/auth/engineextension/PhabricatorAuthMFAEditEngineExtension.php', + 'PhabricatorAuthMFASyncTemporaryTokenType' => 'applications/auth/factor/PhabricatorAuthMFASyncTemporaryTokenType.php', + 'PhabricatorAuthMainMenuBarExtension' => 'applications/auth/extension/PhabricatorAuthMainMenuBarExtension.php', + 'PhabricatorAuthManagementCachePKCS8Workflow' => 'applications/auth/management/PhabricatorAuthManagementCachePKCS8Workflow.php', 'PhabricatorAuthManagementLDAPWorkflow' => 'applications/auth/management/PhabricatorAuthManagementLDAPWorkflow.php', + 'PhabricatorAuthManagementListFactorsWorkflow' => 'applications/auth/management/PhabricatorAuthManagementListFactorsWorkflow.php', + 'PhabricatorAuthManagementListMFAProvidersWorkflow' => 'applications/auth/management/PhabricatorAuthManagementListMFAProvidersWorkflow.php', + 'PhabricatorAuthManagementLockWorkflow' => 'applications/auth/management/PhabricatorAuthManagementLockWorkflow.php', 'PhabricatorAuthManagementRecoverWorkflow' => 'applications/auth/management/PhabricatorAuthManagementRecoverWorkflow.php', 'PhabricatorAuthManagementRefreshWorkflow' => 'applications/auth/management/PhabricatorAuthManagementRefreshWorkflow.php', + 'PhabricatorAuthManagementRevokeWorkflow' => 'applications/auth/management/PhabricatorAuthManagementRevokeWorkflow.php', + 'PhabricatorAuthManagementStripWorkflow' => 'applications/auth/management/PhabricatorAuthManagementStripWorkflow.php', + 'PhabricatorAuthManagementTrustOAuthClientWorkflow' => 'applications/auth/management/PhabricatorAuthManagementTrustOAuthClientWorkflow.php', + 'PhabricatorAuthManagementUnlimitWorkflow' => 'applications/auth/management/PhabricatorAuthManagementUnlimitWorkflow.php', + 'PhabricatorAuthManagementUnlockWorkflow' => 'applications/auth/management/PhabricatorAuthManagementUnlockWorkflow.php', + 'PhabricatorAuthManagementUntrustOAuthClientWorkflow' => 'applications/auth/management/PhabricatorAuthManagementUntrustOAuthClientWorkflow.php', + 'PhabricatorAuthManagementVerifyWorkflow' => 'applications/auth/management/PhabricatorAuthManagementVerifyWorkflow.php', 'PhabricatorAuthManagementWorkflow' => 'applications/auth/management/PhabricatorAuthManagementWorkflow.php', + 'PhabricatorAuthMessage' => 'applications/auth/storage/PhabricatorAuthMessage.php', + 'PhabricatorAuthMessageController' => 'applications/auth/controller/message/PhabricatorAuthMessageController.php', + 'PhabricatorAuthMessageEditController' => 'applications/auth/controller/message/PhabricatorAuthMessageEditController.php', + 'PhabricatorAuthMessageEditEngine' => 'applications/auth/editor/PhabricatorAuthMessageEditEngine.php', + 'PhabricatorAuthMessageEditor' => 'applications/auth/editor/PhabricatorAuthMessageEditor.php', + 'PhabricatorAuthMessageListController' => 'applications/auth/controller/message/PhabricatorAuthMessageListController.php', + 'PhabricatorAuthMessagePHIDType' => 'applications/auth/phid/PhabricatorAuthMessagePHIDType.php', + 'PhabricatorAuthMessageQuery' => 'applications/auth/query/PhabricatorAuthMessageQuery.php', + 'PhabricatorAuthMessageTextTransaction' => 'applications/auth/xaction/PhabricatorAuthMessageTextTransaction.php', + 'PhabricatorAuthMessageTransaction' => 'applications/auth/storage/PhabricatorAuthMessageTransaction.php', + 'PhabricatorAuthMessageTransactionQuery' => 'applications/auth/query/PhabricatorAuthMessageTransactionQuery.php', + 'PhabricatorAuthMessageTransactionType' => 'applications/auth/xaction/PhabricatorAuthMessageTransactionType.php', + 'PhabricatorAuthMessageType' => 'applications/auth/message/PhabricatorAuthMessageType.php', + 'PhabricatorAuthMessageViewController' => 'applications/auth/controller/message/PhabricatorAuthMessageViewController.php', + 'PhabricatorAuthNeedsApprovalController' => 'applications/auth/controller/PhabricatorAuthNeedsApprovalController.php', + 'PhabricatorAuthNeedsMultiFactorController' => 'applications/auth/controller/PhabricatorAuthNeedsMultiFactorController.php', 'PhabricatorAuthNewController' => 'applications/auth/controller/config/PhabricatorAuthNewController.php', + 'PhabricatorAuthNewFactorAction' => 'applications/auth/action/PhabricatorAuthNewFactorAction.php', 'PhabricatorAuthOldOAuthRedirectController' => 'applications/auth/controller/PhabricatorAuthOldOAuthRedirectController.php', + 'PhabricatorAuthOneTimeLoginController' => 'applications/auth/controller/PhabricatorAuthOneTimeLoginController.php', + 'PhabricatorAuthOneTimeLoginTemporaryTokenType' => 'applications/auth/tokentype/PhabricatorAuthOneTimeLoginTemporaryTokenType.php', + 'PhabricatorAuthPassword' => 'applications/auth/storage/PhabricatorAuthPassword.php', + 'PhabricatorAuthPasswordEditor' => 'applications/auth/editor/PhabricatorAuthPasswordEditor.php', + 'PhabricatorAuthPasswordEngine' => 'applications/auth/engine/PhabricatorAuthPasswordEngine.php', + 'PhabricatorAuthPasswordException' => 'applications/auth/password/PhabricatorAuthPasswordException.php', + 'PhabricatorAuthPasswordHashInterface' => 'applications/auth/password/PhabricatorAuthPasswordHashInterface.php', + 'PhabricatorAuthPasswordPHIDType' => 'applications/auth/phid/PhabricatorAuthPasswordPHIDType.php', + 'PhabricatorAuthPasswordQuery' => 'applications/auth/query/PhabricatorAuthPasswordQuery.php', + 'PhabricatorAuthPasswordResetTemporaryTokenType' => 'applications/auth/tokentype/PhabricatorAuthPasswordResetTemporaryTokenType.php', + 'PhabricatorAuthPasswordRevokeTransaction' => 'applications/auth/xaction/PhabricatorAuthPasswordRevokeTransaction.php', + 'PhabricatorAuthPasswordRevoker' => 'applications/auth/revoker/PhabricatorAuthPasswordRevoker.php', + 'PhabricatorAuthPasswordTestCase' => 'applications/auth/__tests__/PhabricatorAuthPasswordTestCase.php', + 'PhabricatorAuthPasswordTransaction' => 'applications/auth/storage/PhabricatorAuthPasswordTransaction.php', + 'PhabricatorAuthPasswordTransactionQuery' => 'applications/auth/query/PhabricatorAuthPasswordTransactionQuery.php', + 'PhabricatorAuthPasswordTransactionType' => 'applications/auth/xaction/PhabricatorAuthPasswordTransactionType.php', + 'PhabricatorAuthPasswordUpgradeTransaction' => 'applications/auth/xaction/PhabricatorAuthPasswordUpgradeTransaction.php', 'PhabricatorAuthProvider' => 'applications/auth/provider/PhabricatorAuthProvider.php', 'PhabricatorAuthProviderConfig' => 'applications/auth/storage/PhabricatorAuthProviderConfig.php', 'PhabricatorAuthProviderConfigController' => 'applications/auth/controller/config/PhabricatorAuthProviderConfigController.php', @@ -895,156 +2489,558 @@ 'PhabricatorAuthProviderConfigQuery' => 'applications/auth/query/PhabricatorAuthProviderConfigQuery.php', 'PhabricatorAuthProviderConfigTransaction' => 'applications/auth/storage/PhabricatorAuthProviderConfigTransaction.php', 'PhabricatorAuthProviderConfigTransactionQuery' => 'applications/auth/query/PhabricatorAuthProviderConfigTransactionQuery.php', - 'PhabricatorAuthProviderLDAP' => 'applications/auth/provider/PhabricatorAuthProviderLDAP.php', - 'PhabricatorAuthProviderOAuth' => 'applications/auth/provider/PhabricatorAuthProviderOAuth.php', - 'PhabricatorAuthProviderOAuthAmazon' => 'applications/auth/provider/PhabricatorAuthProviderOAuthAmazon.php', - 'PhabricatorAuthProviderOAuthAsana' => 'applications/auth/provider/PhabricatorAuthProviderOAuthAsana.php', - 'PhabricatorAuthProviderOAuthDisqus' => 'applications/auth/provider/PhabricatorAuthProviderOAuthDisqus.php', - 'PhabricatorAuthProviderOAuthFacebook' => 'applications/auth/provider/PhabricatorAuthProviderOAuthFacebook.php', - 'PhabricatorAuthProviderOAuthGitHub' => 'applications/auth/provider/PhabricatorAuthProviderOAuthGitHub.php', - 'PhabricatorAuthProviderOAuthGoogle' => 'applications/auth/provider/PhabricatorAuthProviderOAuthGoogle.php', - 'PhabricatorAuthProviderOAuthTwitch' => 'applications/auth/provider/PhabricatorAuthProviderOAuthTwitch.php', - 'PhabricatorAuthProviderPassword' => 'applications/auth/provider/PhabricatorAuthProviderPassword.php', + 'PhabricatorAuthProviderController' => 'applications/auth/controller/config/PhabricatorAuthProviderController.php', + 'PhabricatorAuthProviderViewController' => 'applications/auth/controller/config/PhabricatorAuthProviderViewController.php', + 'PhabricatorAuthProvidersGuidanceContext' => 'applications/auth/guidance/PhabricatorAuthProvidersGuidanceContext.php', + 'PhabricatorAuthProvidersGuidanceEngineExtension' => 'applications/auth/guidance/PhabricatorAuthProvidersGuidanceEngineExtension.php', + 'PhabricatorAuthQueryPublicKeysConduitAPIMethod' => 'applications/auth/conduit/PhabricatorAuthQueryPublicKeysConduitAPIMethod.php', 'PhabricatorAuthRegisterController' => 'applications/auth/controller/PhabricatorAuthRegisterController.php', + 'PhabricatorAuthRevokeTokenController' => 'applications/auth/controller/PhabricatorAuthRevokeTokenController.php', + 'PhabricatorAuthRevoker' => 'applications/auth/revoker/PhabricatorAuthRevoker.php', + 'PhabricatorAuthSSHKey' => 'applications/auth/storage/PhabricatorAuthSSHKey.php', + 'PhabricatorAuthSSHKeyController' => 'applications/auth/controller/PhabricatorAuthSSHKeyController.php', + 'PhabricatorAuthSSHKeyEditController' => 'applications/auth/controller/PhabricatorAuthSSHKeyEditController.php', + 'PhabricatorAuthSSHKeyEditor' => 'applications/auth/editor/PhabricatorAuthSSHKeyEditor.php', + 'PhabricatorAuthSSHKeyGenerateController' => 'applications/auth/controller/PhabricatorAuthSSHKeyGenerateController.php', + 'PhabricatorAuthSSHKeyListController' => 'applications/auth/controller/PhabricatorAuthSSHKeyListController.php', + 'PhabricatorAuthSSHKeyPHIDType' => 'applications/auth/phid/PhabricatorAuthSSHKeyPHIDType.php', + 'PhabricatorAuthSSHKeyQuery' => 'applications/auth/query/PhabricatorAuthSSHKeyQuery.php', + 'PhabricatorAuthSSHKeyReplyHandler' => 'applications/auth/mail/PhabricatorAuthSSHKeyReplyHandler.php', + 'PhabricatorAuthSSHKeyRevokeController' => 'applications/auth/controller/PhabricatorAuthSSHKeyRevokeController.php', + 'PhabricatorAuthSSHKeySearchEngine' => 'applications/auth/query/PhabricatorAuthSSHKeySearchEngine.php', + 'PhabricatorAuthSSHKeyTableView' => 'applications/auth/view/PhabricatorAuthSSHKeyTableView.php', + 'PhabricatorAuthSSHKeyTestCase' => 'applications/auth/__tests__/PhabricatorAuthSSHKeyTestCase.php', + 'PhabricatorAuthSSHKeyTransaction' => 'applications/auth/storage/PhabricatorAuthSSHKeyTransaction.php', + 'PhabricatorAuthSSHKeyTransactionQuery' => 'applications/auth/query/PhabricatorAuthSSHKeyTransactionQuery.php', + 'PhabricatorAuthSSHKeyViewController' => 'applications/auth/controller/PhabricatorAuthSSHKeyViewController.php', + 'PhabricatorAuthSSHPrivateKey' => 'applications/auth/sshkey/PhabricatorAuthSSHPrivateKey.php', + 'PhabricatorAuthSSHPrivateKeyException' => 'applications/auth/exception/privatekey/PhabricatorAuthSSHPrivateKeyException.php', + 'PhabricatorAuthSSHPrivateKeyFormatException' => 'applications/auth/exception/privatekey/PhabricatorAuthSSHPrivateKeyFormatException.php', + 'PhabricatorAuthSSHPrivateKeyIncorrectPassphraseException' => 'applications/auth/exception/privatekey/PhabricatorAuthSSHPrivateKeyIncorrectPassphraseException.php', + 'PhabricatorAuthSSHPrivateKeyMissingPassphraseException' => 'applications/auth/exception/privatekey/PhabricatorAuthSSHPrivateKeyMissingPassphraseException.php', + 'PhabricatorAuthSSHPrivateKeyPassphraseException' => 'applications/auth/exception/privatekey/PhabricatorAuthSSHPrivateKeyPassphraseException.php', + 'PhabricatorAuthSSHPrivateKeySurplusPassphraseException' => 'applications/auth/exception/privatekey/PhabricatorAuthSSHPrivateKeySurplusPassphraseException.php', + 'PhabricatorAuthSSHPrivateKeyUnknownException' => 'applications/auth/exception/privatekey/PhabricatorAuthSSHPrivateKeyUnknownException.php', + 'PhabricatorAuthSSHPublicKey' => 'applications/auth/sshkey/PhabricatorAuthSSHPublicKey.php', + 'PhabricatorAuthSSHRevoker' => 'applications/auth/revoker/PhabricatorAuthSSHRevoker.php', + 'PhabricatorAuthSession' => 'applications/auth/storage/PhabricatorAuthSession.php', + 'PhabricatorAuthSessionEngine' => 'applications/auth/engine/PhabricatorAuthSessionEngine.php', + 'PhabricatorAuthSessionEngineExtension' => 'applications/auth/engine/PhabricatorAuthSessionEngineExtension.php', + 'PhabricatorAuthSessionEngineExtensionModule' => 'applications/auth/engine/PhabricatorAuthSessionEngineExtensionModule.php', + 'PhabricatorAuthSessionGarbageCollector' => 'applications/auth/garbagecollector/PhabricatorAuthSessionGarbageCollector.php', + 'PhabricatorAuthSessionInfo' => 'applications/auth/data/PhabricatorAuthSessionInfo.php', + 'PhabricatorAuthSessionPHIDType' => 'applications/auth/phid/PhabricatorAuthSessionPHIDType.php', + 'PhabricatorAuthSessionQuery' => 'applications/auth/query/PhabricatorAuthSessionQuery.php', + 'PhabricatorAuthSessionRevoker' => 'applications/auth/revoker/PhabricatorAuthSessionRevoker.php', + 'PhabricatorAuthSetExternalController' => 'applications/auth/controller/PhabricatorAuthSetExternalController.php', + 'PhabricatorAuthSetPasswordController' => 'applications/auth/controller/PhabricatorAuthSetPasswordController.php', + 'PhabricatorAuthSetupCheck' => 'applications/config/check/PhabricatorAuthSetupCheck.php', 'PhabricatorAuthStartController' => 'applications/auth/controller/PhabricatorAuthStartController.php', + 'PhabricatorAuthTemporaryToken' => 'applications/auth/storage/PhabricatorAuthTemporaryToken.php', + 'PhabricatorAuthTemporaryTokenGarbageCollector' => 'applications/auth/garbagecollector/PhabricatorAuthTemporaryTokenGarbageCollector.php', + 'PhabricatorAuthTemporaryTokenQuery' => 'applications/auth/query/PhabricatorAuthTemporaryTokenQuery.php', + 'PhabricatorAuthTemporaryTokenRevoker' => 'applications/auth/revoker/PhabricatorAuthTemporaryTokenRevoker.php', + 'PhabricatorAuthTemporaryTokenType' => 'applications/auth/tokentype/PhabricatorAuthTemporaryTokenType.php', + 'PhabricatorAuthTemporaryTokenTypeModule' => 'applications/auth/tokentype/PhabricatorAuthTemporaryTokenTypeModule.php', + 'PhabricatorAuthTerminateSessionController' => 'applications/auth/controller/PhabricatorAuthTerminateSessionController.php', + 'PhabricatorAuthTestSMSAction' => 'applications/auth/action/PhabricatorAuthTestSMSAction.php', + 'PhabricatorAuthTryEmailLoginAction' => 'applications/auth/action/PhabricatorAuthTryEmailLoginAction.php', + 'PhabricatorAuthTryFactorAction' => 'applications/auth/action/PhabricatorAuthTryFactorAction.php', + 'PhabricatorAuthTryPasswordAction' => 'applications/auth/action/PhabricatorAuthTryPasswordAction.php', + 'PhabricatorAuthTryPasswordWithoutCAPTCHAAction' => 'applications/auth/action/PhabricatorAuthTryPasswordWithoutCAPTCHAAction.php', 'PhabricatorAuthUnlinkController' => 'applications/auth/controller/PhabricatorAuthUnlinkController.php', 'PhabricatorAuthValidateController' => 'applications/auth/controller/PhabricatorAuthValidateController.php', + 'PhabricatorAuthWaitForApprovalMessageType' => 'applications/auth/message/PhabricatorAuthWaitForApprovalMessageType.php', + 'PhabricatorAuthWelcomeMailMessageType' => 'applications/auth/message/PhabricatorAuthWelcomeMailMessageType.php', 'PhabricatorAuthenticationConfigOptions' => 'applications/config/option/PhabricatorAuthenticationConfigOptions.php', - 'PhabricatorBarePageExample' => 'applications/uiexample/examples/PhabricatorBarePageExample.php', + 'PhabricatorAutoEventListener' => 'infrastructure/events/PhabricatorAutoEventListener.php', + 'PhabricatorBadgesApplication' => 'applications/badges/application/PhabricatorBadgesApplication.php', + 'PhabricatorBadgesArchiveController' => 'applications/badges/controller/PhabricatorBadgesArchiveController.php', + 'PhabricatorBadgesAward' => 'applications/badges/storage/PhabricatorBadgesAward.php', + 'PhabricatorBadgesAwardController' => 'applications/badges/controller/PhabricatorBadgesAwardController.php', + 'PhabricatorBadgesAwardQuery' => 'applications/badges/query/PhabricatorBadgesAwardQuery.php', + 'PhabricatorBadgesAwardTestDataGenerator' => 'applications/badges/lipsum/PhabricatorBadgesAwardTestDataGenerator.php', + 'PhabricatorBadgesBadge' => 'applications/badges/storage/PhabricatorBadgesBadge.php', + 'PhabricatorBadgesBadgeAwardTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeAwardTransaction.php', + 'PhabricatorBadgesBadgeDescriptionTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeDescriptionTransaction.php', + 'PhabricatorBadgesBadgeFlavorTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeFlavorTransaction.php', + 'PhabricatorBadgesBadgeIconTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeIconTransaction.php', + 'PhabricatorBadgesBadgeNameNgrams' => 'applications/badges/storage/PhabricatorBadgesBadgeNameNgrams.php', + 'PhabricatorBadgesBadgeNameTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeNameTransaction.php', + 'PhabricatorBadgesBadgeQualityTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeQualityTransaction.php', + 'PhabricatorBadgesBadgeRevokeTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeRevokeTransaction.php', + 'PhabricatorBadgesBadgeStatusTransaction' => 'applications/badges/xaction/PhabricatorBadgesBadgeStatusTransaction.php', + 'PhabricatorBadgesBadgeTestDataGenerator' => 'applications/badges/lipsum/PhabricatorBadgesBadgeTestDataGenerator.php', + 'PhabricatorBadgesBadgeTransactionType' => 'applications/badges/xaction/PhabricatorBadgesBadgeTransactionType.php', + 'PhabricatorBadgesCommentController' => 'applications/badges/controller/PhabricatorBadgesCommentController.php', + 'PhabricatorBadgesController' => 'applications/badges/controller/PhabricatorBadgesController.php', + 'PhabricatorBadgesCreateCapability' => 'applications/badges/capability/PhabricatorBadgesCreateCapability.php', + 'PhabricatorBadgesDAO' => 'applications/badges/storage/PhabricatorBadgesDAO.php', + 'PhabricatorBadgesDatasource' => 'applications/badges/typeahead/PhabricatorBadgesDatasource.php', + 'PhabricatorBadgesDefaultEditCapability' => 'applications/badges/capability/PhabricatorBadgesDefaultEditCapability.php', + 'PhabricatorBadgesEditConduitAPIMethod' => 'applications/badges/conduit/PhabricatorBadgesEditConduitAPIMethod.php', + 'PhabricatorBadgesEditController' => 'applications/badges/controller/PhabricatorBadgesEditController.php', + 'PhabricatorBadgesEditEngine' => 'applications/badges/editor/PhabricatorBadgesEditEngine.php', + 'PhabricatorBadgesEditRecipientsController' => 'applications/badges/controller/PhabricatorBadgesEditRecipientsController.php', + 'PhabricatorBadgesEditor' => 'applications/badges/editor/PhabricatorBadgesEditor.php', + 'PhabricatorBadgesIconSet' => 'applications/badges/icon/PhabricatorBadgesIconSet.php', + 'PhabricatorBadgesListController' => 'applications/badges/controller/PhabricatorBadgesListController.php', + 'PhabricatorBadgesLootContextFreeGrammar' => 'applications/badges/lipsum/PhabricatorBadgesLootContextFreeGrammar.php', + 'PhabricatorBadgesMailReceiver' => 'applications/badges/mail/PhabricatorBadgesMailReceiver.php', + 'PhabricatorBadgesPHIDType' => 'applications/badges/phid/PhabricatorBadgesPHIDType.php', + 'PhabricatorBadgesProfileController' => 'applications/badges/controller/PhabricatorBadgesProfileController.php', + 'PhabricatorBadgesQuality' => 'applications/badges/constants/PhabricatorBadgesQuality.php', + 'PhabricatorBadgesQuery' => 'applications/badges/query/PhabricatorBadgesQuery.php', + 'PhabricatorBadgesRecipientsController' => 'applications/badges/controller/PhabricatorBadgesRecipientsController.php', + 'PhabricatorBadgesRecipientsListView' => 'applications/badges/view/PhabricatorBadgesRecipientsListView.php', + 'PhabricatorBadgesRemoveRecipientsController' => 'applications/badges/controller/PhabricatorBadgesRemoveRecipientsController.php', + 'PhabricatorBadgesReplyHandler' => 'applications/badges/mail/PhabricatorBadgesReplyHandler.php', + 'PhabricatorBadgesSchemaSpec' => 'applications/badges/storage/PhabricatorBadgesSchemaSpec.php', + 'PhabricatorBadgesSearchConduitAPIMethod' => 'applications/badges/conduit/PhabricatorBadgesSearchConduitAPIMethod.php', + 'PhabricatorBadgesSearchEngine' => 'applications/badges/query/PhabricatorBadgesSearchEngine.php', + 'PhabricatorBadgesTransaction' => 'applications/badges/storage/PhabricatorBadgesTransaction.php', + 'PhabricatorBadgesTransactionComment' => 'applications/badges/storage/PhabricatorBadgesTransactionComment.php', + 'PhabricatorBadgesTransactionQuery' => 'applications/badges/query/PhabricatorBadgesTransactionQuery.php', + 'PhabricatorBadgesViewController' => 'applications/badges/controller/PhabricatorBadgesViewController.php', 'PhabricatorBarePageView' => 'view/page/PhabricatorBarePageView.php', - 'PhabricatorBaseEnglishTranslation' => 'infrastructure/internationalization/PhabricatorBaseEnglishTranslation.php', - 'PhabricatorBaseProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorBaseProtocolAdapter.php', - 'PhabricatorBot' => 'infrastructure/daemon/bot/PhabricatorBot.php', - 'PhabricatorBotBaseStreamingProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorBotBaseStreamingProtocolAdapter.php', - 'PhabricatorBotChannel' => 'infrastructure/daemon/bot/target/PhabricatorBotChannel.php', - 'PhabricatorBotDebugLogHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotDebugLogHandler.php', - 'PhabricatorBotDifferentialNotificationHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotDifferentialNotificationHandler.php', - 'PhabricatorBotFeedNotificationHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotFeedNotificationHandler.php', - 'PhabricatorBotFlowdockProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorBotFlowdockProtocolAdapter.php', - 'PhabricatorBotHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotHandler.php', - 'PhabricatorBotLogHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotLogHandler.php', - 'PhabricatorBotMacroHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotMacroHandler.php', - 'PhabricatorBotMessage' => 'infrastructure/daemon/bot/PhabricatorBotMessage.php', - 'PhabricatorBotObjectNameHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotObjectNameHandler.php', - 'PhabricatorBotSymbolHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotSymbolHandler.php', - 'PhabricatorBotTarget' => 'infrastructure/daemon/bot/target/PhabricatorBotTarget.php', - 'PhabricatorBotUser' => 'infrastructure/daemon/bot/target/PhabricatorBotUser.php', - 'PhabricatorBotWhatsNewHandler' => 'infrastructure/daemon/bot/handler/PhabricatorBotWhatsNewHandler.php', + 'PhabricatorBaseURISetupCheck' => 'applications/config/check/PhabricatorBaseURISetupCheck.php', + 'PhabricatorBcryptPasswordHasher' => 'infrastructure/util/password/PhabricatorBcryptPasswordHasher.php', + 'PhabricatorBinariesSetupCheck' => 'applications/config/check/PhabricatorBinariesSetupCheck.php', + 'PhabricatorBitbucketAuthProvider' => 'applications/auth/provider/PhabricatorBitbucketAuthProvider.php', + 'PhabricatorBoardColumnsSearchEngineAttachment' => 'applications/project/engineextension/PhabricatorBoardColumnsSearchEngineAttachment.php', + 'PhabricatorBoardLayoutEngine' => 'applications/project/engine/PhabricatorBoardLayoutEngine.php', + 'PhabricatorBoardRenderingEngine' => 'applications/project/engine/PhabricatorBoardRenderingEngine.php', + 'PhabricatorBoardResponseEngine' => 'applications/project/engine/PhabricatorBoardResponseEngine.php', + 'PhabricatorBoolConfigType' => 'applications/config/type/PhabricatorBoolConfigType.php', + 'PhabricatorBoolEditField' => 'applications/transactions/editfield/PhabricatorBoolEditField.php', + 'PhabricatorBoolMailStamp' => 'applications/metamta/stamp/PhabricatorBoolMailStamp.php', + 'PhabricatorBritishEnglishTranslation' => 'infrastructure/internationalization/translation/PhabricatorBritishEnglishTranslation.php', + 'PhabricatorBuiltinDraftEngine' => 'applications/transactions/draft/PhabricatorBuiltinDraftEngine.php', + 'PhabricatorBuiltinFileCachePurger' => 'applications/cache/purger/PhabricatorBuiltinFileCachePurger.php', 'PhabricatorBuiltinPatchList' => 'infrastructure/storage/patch/PhabricatorBuiltinPatchList.php', - 'PhabricatorBusyExample' => 'applications/uiexample/examples/PhabricatorBusyExample.php', + 'PhabricatorBulkContentSource' => 'infrastructure/daemon/contentsource/PhabricatorBulkContentSource.php', + 'PhabricatorBulkEditGroup' => 'applications/transactions/bulk/PhabricatorBulkEditGroup.php', + 'PhabricatorBulkEngine' => 'applications/transactions/bulk/PhabricatorBulkEngine.php', + 'PhabricatorBulkManagementExportWorkflow' => 'applications/transactions/bulk/management/PhabricatorBulkManagementExportWorkflow.php', + 'PhabricatorBulkManagementMakeSilentWorkflow' => 'applications/transactions/bulk/management/PhabricatorBulkManagementMakeSilentWorkflow.php', + 'PhabricatorBulkManagementWorkflow' => 'applications/transactions/bulk/management/PhabricatorBulkManagementWorkflow.php', + 'PhabricatorCSVExportFormat' => 'infrastructure/export/format/PhabricatorCSVExportFormat.php', 'PhabricatorCacheDAO' => 'applications/cache/storage/PhabricatorCacheDAO.php', + 'PhabricatorCacheEngine' => 'applications/system/engine/PhabricatorCacheEngine.php', + 'PhabricatorCacheEngineExtension' => 'applications/system/engine/PhabricatorCacheEngineExtension.php', + 'PhabricatorCacheGeneralGarbageCollector' => 'applications/cache/garbagecollector/PhabricatorCacheGeneralGarbageCollector.php', 'PhabricatorCacheManagementPurgeWorkflow' => 'applications/cache/management/PhabricatorCacheManagementPurgeWorkflow.php', 'PhabricatorCacheManagementWorkflow' => 'applications/cache/management/PhabricatorCacheManagementWorkflow.php', + 'PhabricatorCacheMarkupGarbageCollector' => 'applications/cache/garbagecollector/PhabricatorCacheMarkupGarbageCollector.php', + 'PhabricatorCachePurger' => 'applications/cache/purger/PhabricatorCachePurger.php', + 'PhabricatorCacheSchemaSpec' => 'applications/cache/storage/PhabricatorCacheSchemaSpec.php', + 'PhabricatorCacheSetupCheck' => 'applications/config/check/PhabricatorCacheSetupCheck.php', + 'PhabricatorCacheSpec' => 'applications/cache/spec/PhabricatorCacheSpec.php', + 'PhabricatorCacheTTLGarbageCollector' => 'applications/cache/garbagecollector/PhabricatorCacheTTLGarbageCollector.php', + 'PhabricatorCachedClassMapQuery' => 'applications/cache/PhabricatorCachedClassMapQuery.php', 'PhabricatorCaches' => 'applications/cache/PhabricatorCaches.php', - 'PhabricatorCalendarBrowseController' => 'applications/calendar/controller/PhabricatorCalendarBrowseController.php', + 'PhabricatorCachesTestCase' => 'applications/cache/__tests__/PhabricatorCachesTestCase.php', + 'PhabricatorCalendarApplication' => 'applications/calendar/application/PhabricatorCalendarApplication.php', 'PhabricatorCalendarController' => 'applications/calendar/controller/PhabricatorCalendarController.php', 'PhabricatorCalendarDAO' => 'applications/calendar/storage/PhabricatorCalendarDAO.php', - 'PhabricatorCalendarDeleteStatusController' => 'applications/calendar/controller/PhabricatorCalendarDeleteStatusController.php', - 'PhabricatorCalendarEditStatusController' => 'applications/calendar/controller/PhabricatorCalendarEditStatusController.php', - 'PhabricatorCalendarHoliday' => 'applications/calendar/storage/PhabricatorCalendarHoliday.php', - 'PhabricatorCalendarHolidayTestCase' => 'applications/calendar/storage/__tests__/PhabricatorCalendarHolidayTestCase.php', - 'PhabricatorCalendarViewStatusController' => 'applications/calendar/controller/PhabricatorCalendarViewStatusController.php', - 'PhabricatorCampfireProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorCampfireProtocolAdapter.php', + 'PhabricatorCalendarEvent' => 'applications/calendar/storage/PhabricatorCalendarEvent.php', + 'PhabricatorCalendarEventAcceptTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventAcceptTransaction.php', + 'PhabricatorCalendarEventAllDayTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventAllDayTransaction.php', + 'PhabricatorCalendarEventAvailabilityController' => 'applications/calendar/controller/PhabricatorCalendarEventAvailabilityController.php', + 'PhabricatorCalendarEventCancelController' => 'applications/calendar/controller/PhabricatorCalendarEventCancelController.php', + 'PhabricatorCalendarEventCancelTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventCancelTransaction.php', + 'PhabricatorCalendarEventDateTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventDateTransaction.php', + 'PhabricatorCalendarEventDeclineTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventDeclineTransaction.php', + 'PhabricatorCalendarEventDefaultEditCapability' => 'applications/calendar/capability/PhabricatorCalendarEventDefaultEditCapability.php', + 'PhabricatorCalendarEventDefaultViewCapability' => 'applications/calendar/capability/PhabricatorCalendarEventDefaultViewCapability.php', + 'PhabricatorCalendarEventDescriptionTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventDescriptionTransaction.php', + 'PhabricatorCalendarEventDragController' => 'applications/calendar/controller/PhabricatorCalendarEventDragController.php', + 'PhabricatorCalendarEventEditConduitAPIMethod' => 'applications/calendar/conduit/PhabricatorCalendarEventEditConduitAPIMethod.php', + 'PhabricatorCalendarEventEditController' => 'applications/calendar/controller/PhabricatorCalendarEventEditController.php', + 'PhabricatorCalendarEventEditEngine' => 'applications/calendar/editor/PhabricatorCalendarEventEditEngine.php', + 'PhabricatorCalendarEventEditor' => 'applications/calendar/editor/PhabricatorCalendarEventEditor.php', + 'PhabricatorCalendarEventEmailCommand' => 'applications/calendar/command/PhabricatorCalendarEventEmailCommand.php', + 'PhabricatorCalendarEventEndDateTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventEndDateTransaction.php', + 'PhabricatorCalendarEventExportController' => 'applications/calendar/controller/PhabricatorCalendarEventExportController.php', + 'PhabricatorCalendarEventFerretEngine' => 'applications/calendar/search/PhabricatorCalendarEventFerretEngine.php', + 'PhabricatorCalendarEventForkTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventForkTransaction.php', + 'PhabricatorCalendarEventFrequencyTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventFrequencyTransaction.php', + 'PhabricatorCalendarEventFulltextEngine' => 'applications/calendar/search/PhabricatorCalendarEventFulltextEngine.php', + 'PhabricatorCalendarEventHeraldAdapter' => 'applications/calendar/herald/PhabricatorCalendarEventHeraldAdapter.php', + 'PhabricatorCalendarEventHeraldField' => 'applications/calendar/herald/PhabricatorCalendarEventHeraldField.php', + 'PhabricatorCalendarEventHeraldFieldGroup' => 'applications/calendar/herald/PhabricatorCalendarEventHeraldFieldGroup.php', + 'PhabricatorCalendarEventHostPolicyRule' => 'applications/calendar/policyrule/PhabricatorCalendarEventHostPolicyRule.php', + 'PhabricatorCalendarEventHostTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventHostTransaction.php', + 'PhabricatorCalendarEventIconTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventIconTransaction.php', + 'PhabricatorCalendarEventInviteTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventInviteTransaction.php', + 'PhabricatorCalendarEventInvitee' => 'applications/calendar/storage/PhabricatorCalendarEventInvitee.php', + 'PhabricatorCalendarEventInviteeQuery' => 'applications/calendar/query/PhabricatorCalendarEventInviteeQuery.php', + 'PhabricatorCalendarEventInviteesPolicyRule' => 'applications/calendar/policyrule/PhabricatorCalendarEventInviteesPolicyRule.php', + 'PhabricatorCalendarEventJoinController' => 'applications/calendar/controller/PhabricatorCalendarEventJoinController.php', + 'PhabricatorCalendarEventListController' => 'applications/calendar/controller/PhabricatorCalendarEventListController.php', + 'PhabricatorCalendarEventMailReceiver' => 'applications/calendar/mail/PhabricatorCalendarEventMailReceiver.php', + 'PhabricatorCalendarEventNameHeraldField' => 'applications/calendar/herald/PhabricatorCalendarEventNameHeraldField.php', + 'PhabricatorCalendarEventNameTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventNameTransaction.php', + 'PhabricatorCalendarEventNotificationView' => 'applications/calendar/notifications/PhabricatorCalendarEventNotificationView.php', + 'PhabricatorCalendarEventPHIDType' => 'applications/calendar/phid/PhabricatorCalendarEventPHIDType.php', + 'PhabricatorCalendarEventPolicyCodex' => 'applications/calendar/codex/PhabricatorCalendarEventPolicyCodex.php', + 'PhabricatorCalendarEventQuery' => 'applications/calendar/query/PhabricatorCalendarEventQuery.php', + 'PhabricatorCalendarEventRSVPEmailCommand' => 'applications/calendar/command/PhabricatorCalendarEventRSVPEmailCommand.php', + 'PhabricatorCalendarEventRecurringTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventRecurringTransaction.php', + 'PhabricatorCalendarEventReplyTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventReplyTransaction.php', + 'PhabricatorCalendarEventSearchConduitAPIMethod' => 'applications/calendar/conduit/PhabricatorCalendarEventSearchConduitAPIMethod.php', + 'PhabricatorCalendarEventSearchEngine' => 'applications/calendar/query/PhabricatorCalendarEventSearchEngine.php', + 'PhabricatorCalendarEventStartDateTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventStartDateTransaction.php', + 'PhabricatorCalendarEventTransaction' => 'applications/calendar/storage/PhabricatorCalendarEventTransaction.php', + 'PhabricatorCalendarEventTransactionComment' => 'applications/calendar/storage/PhabricatorCalendarEventTransactionComment.php', + 'PhabricatorCalendarEventTransactionQuery' => 'applications/calendar/query/PhabricatorCalendarEventTransactionQuery.php', + 'PhabricatorCalendarEventTransactionType' => 'applications/calendar/xaction/PhabricatorCalendarEventTransactionType.php', + 'PhabricatorCalendarEventUntilDateTransaction' => 'applications/calendar/xaction/PhabricatorCalendarEventUntilDateTransaction.php', + 'PhabricatorCalendarEventViewController' => 'applications/calendar/controller/PhabricatorCalendarEventViewController.php', + 'PhabricatorCalendarExport' => 'applications/calendar/storage/PhabricatorCalendarExport.php', + 'PhabricatorCalendarExportDisableController' => 'applications/calendar/controller/PhabricatorCalendarExportDisableController.php', + 'PhabricatorCalendarExportDisableTransaction' => 'applications/calendar/xaction/PhabricatorCalendarExportDisableTransaction.php', + 'PhabricatorCalendarExportEditController' => 'applications/calendar/controller/PhabricatorCalendarExportEditController.php', + 'PhabricatorCalendarExportEditEngine' => 'applications/calendar/editor/PhabricatorCalendarExportEditEngine.php', + 'PhabricatorCalendarExportEditor' => 'applications/calendar/editor/PhabricatorCalendarExportEditor.php', + 'PhabricatorCalendarExportICSController' => 'applications/calendar/controller/PhabricatorCalendarExportICSController.php', + 'PhabricatorCalendarExportListController' => 'applications/calendar/controller/PhabricatorCalendarExportListController.php', + 'PhabricatorCalendarExportModeTransaction' => 'applications/calendar/xaction/PhabricatorCalendarExportModeTransaction.php', + 'PhabricatorCalendarExportNameTransaction' => 'applications/calendar/xaction/PhabricatorCalendarExportNameTransaction.php', + 'PhabricatorCalendarExportPHIDType' => 'applications/calendar/phid/PhabricatorCalendarExportPHIDType.php', + 'PhabricatorCalendarExportQuery' => 'applications/calendar/query/PhabricatorCalendarExportQuery.php', + 'PhabricatorCalendarExportQueryKeyTransaction' => 'applications/calendar/xaction/PhabricatorCalendarExportQueryKeyTransaction.php', + 'PhabricatorCalendarExportSearchEngine' => 'applications/calendar/query/PhabricatorCalendarExportSearchEngine.php', + 'PhabricatorCalendarExportTransaction' => 'applications/calendar/storage/PhabricatorCalendarExportTransaction.php', + 'PhabricatorCalendarExportTransactionQuery' => 'applications/calendar/query/PhabricatorCalendarExportTransactionQuery.php', + 'PhabricatorCalendarExportTransactionType' => 'applications/calendar/xaction/PhabricatorCalendarExportTransactionType.php', + 'PhabricatorCalendarExportViewController' => 'applications/calendar/controller/PhabricatorCalendarExportViewController.php', + 'PhabricatorCalendarExternalInvitee' => 'applications/calendar/storage/PhabricatorCalendarExternalInvitee.php', + 'PhabricatorCalendarExternalInviteePHIDType' => 'applications/calendar/phid/PhabricatorCalendarExternalInviteePHIDType.php', + 'PhabricatorCalendarExternalInviteeQuery' => 'applications/calendar/query/PhabricatorCalendarExternalInviteeQuery.php', + 'PhabricatorCalendarICSFileImportEngine' => 'applications/calendar/import/PhabricatorCalendarICSFileImportEngine.php', + 'PhabricatorCalendarICSImportEngine' => 'applications/calendar/import/PhabricatorCalendarICSImportEngine.php', + 'PhabricatorCalendarICSURIImportEngine' => 'applications/calendar/import/PhabricatorCalendarICSURIImportEngine.php', + 'PhabricatorCalendarICSWriter' => 'applications/calendar/util/PhabricatorCalendarICSWriter.php', + 'PhabricatorCalendarIconSet' => 'applications/calendar/icon/PhabricatorCalendarIconSet.php', + 'PhabricatorCalendarImport' => 'applications/calendar/storage/PhabricatorCalendarImport.php', + 'PhabricatorCalendarImportDefaultLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportDefaultLogType.php', + 'PhabricatorCalendarImportDeleteController' => 'applications/calendar/controller/PhabricatorCalendarImportDeleteController.php', + 'PhabricatorCalendarImportDeleteLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportDeleteLogType.php', + 'PhabricatorCalendarImportDeleteTransaction' => 'applications/calendar/xaction/PhabricatorCalendarImportDeleteTransaction.php', + 'PhabricatorCalendarImportDisableController' => 'applications/calendar/controller/PhabricatorCalendarImportDisableController.php', + 'PhabricatorCalendarImportDisableTransaction' => 'applications/calendar/xaction/PhabricatorCalendarImportDisableTransaction.php', + 'PhabricatorCalendarImportDropController' => 'applications/calendar/controller/PhabricatorCalendarImportDropController.php', + 'PhabricatorCalendarImportDuplicateLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportDuplicateLogType.php', + 'PhabricatorCalendarImportEditController' => 'applications/calendar/controller/PhabricatorCalendarImportEditController.php', + 'PhabricatorCalendarImportEditEngine' => 'applications/calendar/editor/PhabricatorCalendarImportEditEngine.php', + 'PhabricatorCalendarImportEditor' => 'applications/calendar/editor/PhabricatorCalendarImportEditor.php', + 'PhabricatorCalendarImportEmptyLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportEmptyLogType.php', + 'PhabricatorCalendarImportEngine' => 'applications/calendar/import/PhabricatorCalendarImportEngine.php', + 'PhabricatorCalendarImportEpochLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportEpochLogType.php', + 'PhabricatorCalendarImportFetchLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportFetchLogType.php', + 'PhabricatorCalendarImportFrequencyLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportFrequencyLogType.php', + 'PhabricatorCalendarImportFrequencyTransaction' => 'applications/calendar/xaction/PhabricatorCalendarImportFrequencyTransaction.php', + 'PhabricatorCalendarImportICSFileTransaction' => 'applications/calendar/xaction/PhabricatorCalendarImportICSFileTransaction.php', + 'PhabricatorCalendarImportICSLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportICSLogType.php', + 'PhabricatorCalendarImportICSURITransaction' => 'applications/calendar/xaction/PhabricatorCalendarImportICSURITransaction.php', + 'PhabricatorCalendarImportICSWarningLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportICSWarningLogType.php', + 'PhabricatorCalendarImportIgnoredNodeLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportIgnoredNodeLogType.php', + 'PhabricatorCalendarImportListController' => 'applications/calendar/controller/PhabricatorCalendarImportListController.php', + 'PhabricatorCalendarImportLog' => 'applications/calendar/storage/PhabricatorCalendarImportLog.php', + 'PhabricatorCalendarImportLogListController' => 'applications/calendar/controller/PhabricatorCalendarImportLogListController.php', + 'PhabricatorCalendarImportLogQuery' => 'applications/calendar/query/PhabricatorCalendarImportLogQuery.php', + 'PhabricatorCalendarImportLogSearchEngine' => 'applications/calendar/query/PhabricatorCalendarImportLogSearchEngine.php', + 'PhabricatorCalendarImportLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportLogType.php', + 'PhabricatorCalendarImportLogView' => 'applications/calendar/view/PhabricatorCalendarImportLogView.php', + 'PhabricatorCalendarImportNameTransaction' => 'applications/calendar/xaction/PhabricatorCalendarImportNameTransaction.php', + 'PhabricatorCalendarImportOriginalLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportOriginalLogType.php', + 'PhabricatorCalendarImportOrphanLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportOrphanLogType.php', + 'PhabricatorCalendarImportPHIDType' => 'applications/calendar/phid/PhabricatorCalendarImportPHIDType.php', + 'PhabricatorCalendarImportQuery' => 'applications/calendar/query/PhabricatorCalendarImportQuery.php', + 'PhabricatorCalendarImportQueueLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportQueueLogType.php', + 'PhabricatorCalendarImportReloadController' => 'applications/calendar/controller/PhabricatorCalendarImportReloadController.php', + 'PhabricatorCalendarImportReloadTransaction' => 'applications/calendar/xaction/PhabricatorCalendarImportReloadTransaction.php', + 'PhabricatorCalendarImportReloadWorker' => 'applications/calendar/worker/PhabricatorCalendarImportReloadWorker.php', + 'PhabricatorCalendarImportSearchEngine' => 'applications/calendar/query/PhabricatorCalendarImportSearchEngine.php', + 'PhabricatorCalendarImportTransaction' => 'applications/calendar/storage/PhabricatorCalendarImportTransaction.php', + 'PhabricatorCalendarImportTransactionQuery' => 'applications/calendar/query/PhabricatorCalendarImportTransactionQuery.php', + 'PhabricatorCalendarImportTransactionType' => 'applications/calendar/xaction/PhabricatorCalendarImportTransactionType.php', + 'PhabricatorCalendarImportTriggerLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportTriggerLogType.php', + 'PhabricatorCalendarImportUpdateLogType' => 'applications/calendar/importlog/PhabricatorCalendarImportUpdateLogType.php', + 'PhabricatorCalendarImportViewController' => 'applications/calendar/controller/PhabricatorCalendarImportViewController.php', + 'PhabricatorCalendarInviteeDatasource' => 'applications/calendar/typeahead/PhabricatorCalendarInviteeDatasource.php', + 'PhabricatorCalendarInviteeUserDatasource' => 'applications/calendar/typeahead/PhabricatorCalendarInviteeUserDatasource.php', + 'PhabricatorCalendarInviteeViewerFunctionDatasource' => 'applications/calendar/typeahead/PhabricatorCalendarInviteeViewerFunctionDatasource.php', + 'PhabricatorCalendarManagementNotifyWorkflow' => 'applications/calendar/management/PhabricatorCalendarManagementNotifyWorkflow.php', + 'PhabricatorCalendarManagementReloadWorkflow' => 'applications/calendar/management/PhabricatorCalendarManagementReloadWorkflow.php', + 'PhabricatorCalendarManagementWorkflow' => 'applications/calendar/management/PhabricatorCalendarManagementWorkflow.php', + 'PhabricatorCalendarNotification' => 'applications/calendar/storage/PhabricatorCalendarNotification.php', + 'PhabricatorCalendarNotificationEngine' => 'applications/calendar/notifications/PhabricatorCalendarNotificationEngine.php', + 'PhabricatorCalendarRemarkupRule' => 'applications/calendar/remarkup/PhabricatorCalendarRemarkupRule.php', + 'PhabricatorCalendarReplyHandler' => 'applications/calendar/mail/PhabricatorCalendarReplyHandler.php', + 'PhabricatorCalendarSchemaSpec' => 'applications/calendar/storage/PhabricatorCalendarSchemaSpec.php', + 'PhabricatorCelerityApplication' => 'applications/celerity/application/PhabricatorCelerityApplication.php', + 'PhabricatorCelerityTestCase' => '__tests__/PhabricatorCelerityTestCase.php', + 'PhabricatorChangeParserTestCase' => 'applications/repository/worker/__tests__/PhabricatorChangeParserTestCase.php', + 'PhabricatorChangePasswordUserLogType' => 'applications/people/userlog/PhabricatorChangePasswordUserLogType.php', + 'PhabricatorChangesetCachePurger' => 'applications/cache/purger/PhabricatorChangesetCachePurger.php', 'PhabricatorChangesetResponse' => 'infrastructure/diff/PhabricatorChangesetResponse.php', + 'PhabricatorChangesetViewState' => 'infrastructure/diff/viewstate/PhabricatorChangesetViewState.php', + 'PhabricatorChangesetViewStateEngine' => 'infrastructure/diff/viewstate/PhabricatorChangesetViewStateEngine.php', + 'PhabricatorChartAxis' => 'applications/fact/chart/PhabricatorChartAxis.php', + 'PhabricatorChartDataQuery' => 'applications/fact/chart/PhabricatorChartDataQuery.php', + 'PhabricatorChartDataset' => 'applications/fact/chart/PhabricatorChartDataset.php', + 'PhabricatorChartDisplayData' => 'applications/fact/chart/PhabricatorChartDisplayData.php', + 'PhabricatorChartEngine' => 'applications/fact/engine/PhabricatorChartEngine.php', + 'PhabricatorChartFunction' => 'applications/fact/chart/PhabricatorChartFunction.php', + 'PhabricatorChartFunctionArgument' => 'applications/fact/chart/PhabricatorChartFunctionArgument.php', + 'PhabricatorChartFunctionArgumentParser' => 'applications/fact/chart/PhabricatorChartFunctionArgumentParser.php', + 'PhabricatorChartFunctionLabel' => 'applications/fact/chart/PhabricatorChartFunctionLabel.php', + 'PhabricatorChartInterval' => 'applications/fact/chart/PhabricatorChartInterval.php', + 'PhabricatorChartRenderingEngine' => 'applications/fact/engine/PhabricatorChartRenderingEngine.php', + 'PhabricatorChartStackedAreaDataset' => 'applications/fact/chart/PhabricatorChartStackedAreaDataset.php', + 'PhabricatorChatLogApplication' => 'applications/chatlog/application/PhabricatorChatLogApplication.php', 'PhabricatorChatLogChannel' => 'applications/chatlog/storage/PhabricatorChatLogChannel.php', 'PhabricatorChatLogChannelListController' => 'applications/chatlog/controller/PhabricatorChatLogChannelListController.php', 'PhabricatorChatLogChannelLogController' => 'applications/chatlog/controller/PhabricatorChatLogChannelLogController.php', - 'PhabricatorChatLogChannelQuery' => 'applications/chatlog/PhabricatorChatLogChannelQuery.php', - 'PhabricatorChatLogConstants' => 'applications/chatlog/constants/PhabricatorChatLogConstants.php', + 'PhabricatorChatLogChannelQuery' => 'applications/chatlog/query/PhabricatorChatLogChannelQuery.php', 'PhabricatorChatLogController' => 'applications/chatlog/controller/PhabricatorChatLogController.php', 'PhabricatorChatLogDAO' => 'applications/chatlog/storage/PhabricatorChatLogDAO.php', 'PhabricatorChatLogEvent' => 'applications/chatlog/storage/PhabricatorChatLogEvent.php', - 'PhabricatorChatLogEventType' => 'applications/chatlog/constants/PhabricatorChatLogEventType.php', - 'PhabricatorChatLogQuery' => 'applications/chatlog/PhabricatorChatLogQuery.php', + 'PhabricatorChatLogQuery' => 'applications/chatlog/query/PhabricatorChatLogQuery.php', + 'PhabricatorCheckboxesEditField' => 'applications/transactions/editfield/PhabricatorCheckboxesEditField.php', + 'PhabricatorChunkedFileStorageEngine' => 'applications/files/engine/PhabricatorChunkedFileStorageEngine.php', + 'PhabricatorClassConfigType' => 'applications/config/type/PhabricatorClassConfigType.php', + 'PhabricatorClusterConfigOptions' => 'applications/config/option/PhabricatorClusterConfigOptions.php', + 'PhabricatorClusterDatabasesConfigType' => 'infrastructure/cluster/config/PhabricatorClusterDatabasesConfigType.php', + 'PhabricatorClusterException' => 'infrastructure/cluster/exception/PhabricatorClusterException.php', + 'PhabricatorClusterExceptionHandler' => 'infrastructure/cluster/exception/PhabricatorClusterExceptionHandler.php', + 'PhabricatorClusterImpossibleWriteException' => 'infrastructure/cluster/exception/PhabricatorClusterImpossibleWriteException.php', + 'PhabricatorClusterImproperWriteException' => 'infrastructure/cluster/exception/PhabricatorClusterImproperWriteException.php', + 'PhabricatorClusterMailersConfigType' => 'infrastructure/cluster/config/PhabricatorClusterMailersConfigType.php', + 'PhabricatorClusterNoHostForRoleException' => 'infrastructure/cluster/exception/PhabricatorClusterNoHostForRoleException.php', + 'PhabricatorClusterSearchConfigType' => 'infrastructure/cluster/config/PhabricatorClusterSearchConfigType.php', + 'PhabricatorClusterServiceHealthRecord' => 'infrastructure/cluster/PhabricatorClusterServiceHealthRecord.php', + 'PhabricatorClusterStrandedException' => 'infrastructure/cluster/exception/PhabricatorClusterStrandedException.php', + 'PhabricatorColumnProxyInterface' => 'applications/project/interface/PhabricatorColumnProxyInterface.php', + 'PhabricatorColumnsEditField' => 'applications/transactions/editfield/PhabricatorColumnsEditField.php', + 'PhabricatorCommentEditEngineExtension' => 'applications/transactions/engineextension/PhabricatorCommentEditEngineExtension.php', + 'PhabricatorCommentEditField' => 'applications/transactions/editfield/PhabricatorCommentEditField.php', + 'PhabricatorCommentEditType' => 'applications/transactions/edittype/PhabricatorCommentEditType.php', + 'PhabricatorCommitBranchesField' => 'applications/repository/customfield/PhabricatorCommitBranchesField.php', + 'PhabricatorCommitCustomField' => 'applications/repository/customfield/PhabricatorCommitCustomField.php', + 'PhabricatorCommitMergedCommitsField' => 'applications/repository/customfield/PhabricatorCommitMergedCommitsField.php', + 'PhabricatorCommitRepositoryField' => 'applications/repository/customfield/PhabricatorCommitRepositoryField.php', + 'PhabricatorCommitSearchEngine' => 'applications/audit/query/PhabricatorCommitSearchEngine.php', + 'PhabricatorCommitTagsField' => 'applications/repository/customfield/PhabricatorCommitTagsField.php', + 'PhabricatorCommonPasswords' => 'applications/auth/constants/PhabricatorCommonPasswords.php', + 'PhabricatorComposeChartFunction' => 'applications/fact/chart/PhabricatorComposeChartFunction.php', 'PhabricatorConduitAPIController' => 'applications/conduit/controller/PhabricatorConduitAPIController.php', + 'PhabricatorConduitApplication' => 'applications/conduit/application/PhabricatorConduitApplication.php', + 'PhabricatorConduitCallManagementWorkflow' => 'applications/conduit/management/PhabricatorConduitCallManagementWorkflow.php', + 'PhabricatorConduitCertificateFailureUserLogType' => 'applications/people/userlog/PhabricatorConduitCertificateFailureUserLogType.php', 'PhabricatorConduitCertificateToken' => 'applications/conduit/storage/PhabricatorConduitCertificateToken.php', - 'PhabricatorConduitConfigOptions' => 'applications/conduit/config/PhabricatorConduitConfigOptions.php', - 'PhabricatorConduitConnectionLog' => 'applications/conduit/storage/PhabricatorConduitConnectionLog.php', + 'PhabricatorConduitCertificateUserLogType' => 'applications/people/userlog/PhabricatorConduitCertificateUserLogType.php', 'PhabricatorConduitConsoleController' => 'applications/conduit/controller/PhabricatorConduitConsoleController.php', + 'PhabricatorConduitContentSource' => 'infrastructure/contentsource/PhabricatorConduitContentSource.php', 'PhabricatorConduitController' => 'applications/conduit/controller/PhabricatorConduitController.php', 'PhabricatorConduitDAO' => 'applications/conduit/storage/PhabricatorConduitDAO.php', + 'PhabricatorConduitEditField' => 'applications/transactions/editfield/PhabricatorConduitEditField.php', 'PhabricatorConduitListController' => 'applications/conduit/controller/PhabricatorConduitListController.php', 'PhabricatorConduitLogController' => 'applications/conduit/controller/PhabricatorConduitLogController.php', 'PhabricatorConduitLogQuery' => 'applications/conduit/query/PhabricatorConduitLogQuery.php', + 'PhabricatorConduitLogSearchEngine' => 'applications/conduit/query/PhabricatorConduitLogSearchEngine.php', + 'PhabricatorConduitManagementWorkflow' => 'applications/conduit/management/PhabricatorConduitManagementWorkflow.php', 'PhabricatorConduitMethodCallLog' => 'applications/conduit/storage/PhabricatorConduitMethodCallLog.php', 'PhabricatorConduitMethodQuery' => 'applications/conduit/query/PhabricatorConduitMethodQuery.php', + 'PhabricatorConduitRequestExceptionHandler' => 'aphront/handler/PhabricatorConduitRequestExceptionHandler.php', + 'PhabricatorConduitResultInterface' => 'applications/conduit/interface/PhabricatorConduitResultInterface.php', 'PhabricatorConduitSearchEngine' => 'applications/conduit/query/PhabricatorConduitSearchEngine.php', + 'PhabricatorConduitSearchFieldSpecification' => 'applications/conduit/interface/PhabricatorConduitSearchFieldSpecification.php', + 'PhabricatorConduitTestCase' => '__tests__/PhabricatorConduitTestCase.php', + 'PhabricatorConduitToken' => 'applications/conduit/storage/PhabricatorConduitToken.php', 'PhabricatorConduitTokenController' => 'applications/conduit/controller/PhabricatorConduitTokenController.php', - 'PhabricatorConfigAllController' => 'applications/config/controller/PhabricatorConfigAllController.php', + 'PhabricatorConduitTokenEditController' => 'applications/conduit/controller/PhabricatorConduitTokenEditController.php', + 'PhabricatorConduitTokenHandshakeController' => 'applications/conduit/controller/PhabricatorConduitTokenHandshakeController.php', + 'PhabricatorConduitTokenQuery' => 'applications/conduit/query/PhabricatorConduitTokenQuery.php', + 'PhabricatorConduitTokenTerminateController' => 'applications/conduit/controller/PhabricatorConduitTokenTerminateController.php', + 'PhabricatorConduitTokensSettingsPanel' => 'applications/conduit/settings/PhabricatorConduitTokensSettingsPanel.php', + 'PhabricatorConfigApplication' => 'applications/config/application/PhabricatorConfigApplication.php', + 'PhabricatorConfigCacheController' => 'applications/config/controller/services/PhabricatorConfigCacheController.php', + 'PhabricatorConfigClusterDatabasesController' => 'applications/config/controller/services/PhabricatorConfigClusterDatabasesController.php', + 'PhabricatorConfigClusterNotificationsController' => 'applications/config/controller/services/PhabricatorConfigClusterNotificationsController.php', + 'PhabricatorConfigClusterRepositoriesController' => 'applications/config/controller/services/PhabricatorConfigClusterRepositoriesController.php', + 'PhabricatorConfigClusterSearchController' => 'applications/config/controller/services/PhabricatorConfigClusterSearchController.php', + 'PhabricatorConfigCollectorsModule' => 'applications/config/module/PhabricatorConfigCollectorsModule.php', + 'PhabricatorConfigColumnSchema' => 'applications/config/schema/PhabricatorConfigColumnSchema.php', + 'PhabricatorConfigConfigPHIDType' => 'applications/config/phid/PhabricatorConfigConfigPHIDType.php', + 'PhabricatorConfigConsoleController' => 'applications/config/controller/PhabricatorConfigConsoleController.php', + 'PhabricatorConfigConstants' => 'applications/config/constants/PhabricatorConfigConstants.php', 'PhabricatorConfigController' => 'applications/config/controller/PhabricatorConfigController.php', + 'PhabricatorConfigCoreSchemaSpec' => 'applications/config/schema/PhabricatorConfigCoreSchemaSpec.php', + 'PhabricatorConfigDatabaseController' => 'applications/config/controller/services/PhabricatorConfigDatabaseController.php', + 'PhabricatorConfigDatabaseIssueController' => 'applications/config/controller/services/PhabricatorConfigDatabaseIssueController.php', + 'PhabricatorConfigDatabaseSchema' => 'applications/config/schema/PhabricatorConfigDatabaseSchema.php', 'PhabricatorConfigDatabaseSource' => 'infrastructure/env/PhabricatorConfigDatabaseSource.php', + 'PhabricatorConfigDatabaseStatusController' => 'applications/config/controller/services/PhabricatorConfigDatabaseStatusController.php', 'PhabricatorConfigDefaultSource' => 'infrastructure/env/PhabricatorConfigDefaultSource.php', 'PhabricatorConfigDictionarySource' => 'infrastructure/env/PhabricatorConfigDictionarySource.php', - 'PhabricatorConfigEditController' => 'applications/config/controller/PhabricatorConfigEditController.php', + 'PhabricatorConfigEdgeModule' => 'applications/config/module/PhabricatorConfigEdgeModule.php', + 'PhabricatorConfigEditController' => 'applications/config/controller/settings/PhabricatorConfigEditController.php', 'PhabricatorConfigEditor' => 'applications/config/editor/PhabricatorConfigEditor.php', 'PhabricatorConfigEntry' => 'applications/config/storage/PhabricatorConfigEntry.php', 'PhabricatorConfigEntryDAO' => 'applications/config/storage/PhabricatorConfigEntryDAO.php', 'PhabricatorConfigEntryQuery' => 'applications/config/query/PhabricatorConfigEntryQuery.php', 'PhabricatorConfigFileSource' => 'infrastructure/env/PhabricatorConfigFileSource.php', - 'PhabricatorConfigGroupController' => 'applications/config/controller/PhabricatorConfigGroupController.php', - 'PhabricatorConfigIgnoreController' => 'applications/config/controller/PhabricatorConfigIgnoreController.php', - 'PhabricatorConfigIssueListController' => 'applications/config/controller/PhabricatorConfigIssueListController.php', - 'PhabricatorConfigIssueViewController' => 'applications/config/controller/PhabricatorConfigIssueViewController.php', + 'PhabricatorConfigGroupConstants' => 'applications/config/constants/PhabricatorConfigGroupConstants.php', + 'PhabricatorConfigHTTPParameterTypesModule' => 'applications/config/module/PhabricatorConfigHTTPParameterTypesModule.php', + 'PhabricatorConfigIgnoreController' => 'applications/config/controller/issue/PhabricatorConfigIgnoreController.php', + 'PhabricatorConfigIssueListController' => 'applications/config/controller/issue/PhabricatorConfigIssueListController.php', + 'PhabricatorConfigIssuePanelController' => 'applications/config/controller/issue/PhabricatorConfigIssuePanelController.php', + 'PhabricatorConfigIssueViewController' => 'applications/config/controller/issue/PhabricatorConfigIssueViewController.php', 'PhabricatorConfigJSON' => 'applications/config/json/PhabricatorConfigJSON.php', - 'PhabricatorConfigListController' => 'applications/config/controller/PhabricatorConfigListController.php', + 'PhabricatorConfigJSONOptionType' => 'applications/config/custom/PhabricatorConfigJSONOptionType.php', + 'PhabricatorConfigKeySchema' => 'applications/config/schema/PhabricatorConfigKeySchema.php', 'PhabricatorConfigLocalSource' => 'infrastructure/env/PhabricatorConfigLocalSource.php', 'PhabricatorConfigManagementDeleteWorkflow' => 'applications/config/management/PhabricatorConfigManagementDeleteWorkflow.php', + 'PhabricatorConfigManagementDoneWorkflow' => 'applications/config/management/PhabricatorConfigManagementDoneWorkflow.php', 'PhabricatorConfigManagementGetWorkflow' => 'applications/config/management/PhabricatorConfigManagementGetWorkflow.php', 'PhabricatorConfigManagementListWorkflow' => 'applications/config/management/PhabricatorConfigManagementListWorkflow.php', + 'PhabricatorConfigManagementMigrateWorkflow' => 'applications/config/management/PhabricatorConfigManagementMigrateWorkflow.php', 'PhabricatorConfigManagementSetWorkflow' => 'applications/config/management/PhabricatorConfigManagementSetWorkflow.php', 'PhabricatorConfigManagementWorkflow' => 'applications/config/management/PhabricatorConfigManagementWorkflow.php', + 'PhabricatorConfigManualActivity' => 'applications/config/storage/PhabricatorConfigManualActivity.php', + 'PhabricatorConfigModule' => 'applications/config/module/PhabricatorConfigModule.php', + 'PhabricatorConfigModuleController' => 'applications/config/controller/module/PhabricatorConfigModuleController.php', 'PhabricatorConfigOption' => 'applications/config/option/PhabricatorConfigOption.php', 'PhabricatorConfigOptionType' => 'applications/config/custom/PhabricatorConfigOptionType.php', - 'PhabricatorConfigPHIDTypeConfig' => 'applications/config/phid/PhabricatorConfigPHIDTypeConfig.php', + 'PhabricatorConfigPHIDModule' => 'applications/config/module/PhabricatorConfigPHIDModule.php', 'PhabricatorConfigProxySource' => 'infrastructure/env/PhabricatorConfigProxySource.php', + 'PhabricatorConfigPurgeCacheController' => 'applications/config/controller/services/PhabricatorConfigPurgeCacheController.php', + 'PhabricatorConfigRegexOptionType' => 'applications/config/custom/PhabricatorConfigRegexOptionType.php', + 'PhabricatorConfigRemarkupRule' => 'infrastructure/markup/rule/PhabricatorConfigRemarkupRule.php', + 'PhabricatorConfigRequestExceptionHandlerModule' => 'applications/config/module/PhabricatorConfigRequestExceptionHandlerModule.php', 'PhabricatorConfigResponse' => 'applications/config/response/PhabricatorConfigResponse.php', + 'PhabricatorConfigSchemaQuery' => 'applications/config/schema/PhabricatorConfigSchemaQuery.php', + 'PhabricatorConfigSchemaSpec' => 'applications/config/schema/PhabricatorConfigSchemaSpec.php', + 'PhabricatorConfigServerSchema' => 'applications/config/schema/PhabricatorConfigServerSchema.php', + 'PhabricatorConfigServicesController' => 'applications/config/controller/services/PhabricatorConfigServicesController.php', + 'PhabricatorConfigSettingsController' => 'applications/config/controller/settings/PhabricatorConfigSettingsController.php', + 'PhabricatorConfigSettingsHistoryController' => 'applications/config/controller/settings/PhabricatorConfigSettingsHistoryController.php', + 'PhabricatorConfigSettingsListController' => 'applications/config/controller/settings/PhabricatorConfigSettingsListController.php', + 'PhabricatorConfigSetupCheckModule' => 'applications/config/module/PhabricatorConfigSetupCheckModule.php', + 'PhabricatorConfigSiteModule' => 'applications/config/module/PhabricatorConfigSiteModule.php', + 'PhabricatorConfigSiteSource' => 'infrastructure/env/PhabricatorConfigSiteSource.php', 'PhabricatorConfigSource' => 'infrastructure/env/PhabricatorConfigSource.php', 'PhabricatorConfigStackSource' => 'infrastructure/env/PhabricatorConfigStackSource.php', + 'PhabricatorConfigStorageSchema' => 'applications/config/schema/PhabricatorConfigStorageSchema.php', + 'PhabricatorConfigTableSchema' => 'applications/config/schema/PhabricatorConfigTableSchema.php', 'PhabricatorConfigTransaction' => 'applications/config/storage/PhabricatorConfigTransaction.php', 'PhabricatorConfigTransactionQuery' => 'applications/config/query/PhabricatorConfigTransactionQuery.php', + 'PhabricatorConfigType' => 'applications/config/type/PhabricatorConfigType.php', 'PhabricatorConfigValidationException' => 'applications/config/exception/PhabricatorConfigValidationException.php', - 'PhabricatorConpherencePHIDTypeThread' => 'applications/conpherence/phid/PhabricatorConpherencePHIDTypeThread.php', - 'PhabricatorContentSource' => 'applications/metamta/contentsource/PhabricatorContentSource.php', - 'PhabricatorContentSourceView' => 'applications/metamta/contentsource/PhabricatorContentSourceView.php', + 'PhabricatorConpherenceApplication' => 'applications/conpherence/application/PhabricatorConpherenceApplication.php', + 'PhabricatorConpherenceColumnMinimizeSetting' => 'applications/settings/setting/PhabricatorConpherenceColumnMinimizeSetting.php', + 'PhabricatorConpherenceColumnVisibleSetting' => 'applications/settings/setting/PhabricatorConpherenceColumnVisibleSetting.php', + 'PhabricatorConpherenceNotificationsSetting' => 'applications/settings/setting/PhabricatorConpherenceNotificationsSetting.php', + 'PhabricatorConpherencePreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorConpherencePreferencesSettingsPanel.php', + 'PhabricatorConpherenceProfileMenuItem' => 'applications/search/menuitem/PhabricatorConpherenceProfileMenuItem.php', + 'PhabricatorConpherenceRoomContextFreeGrammar' => 'applications/conpherence/lipsum/PhabricatorConpherenceRoomContextFreeGrammar.php', + 'PhabricatorConpherenceRoomTestDataGenerator' => 'applications/conpherence/lipsum/PhabricatorConpherenceRoomTestDataGenerator.php', + 'PhabricatorConpherenceSoundSetting' => 'applications/settings/setting/PhabricatorConpherenceSoundSetting.php', + 'PhabricatorConpherenceThreadPHIDType' => 'applications/conpherence/phid/PhabricatorConpherenceThreadPHIDType.php', + 'PhabricatorConpherenceWidgetVisibleSetting' => 'applications/settings/setting/PhabricatorConpherenceWidgetVisibleSetting.php', + 'PhabricatorConsoleApplication' => 'applications/console/application/PhabricatorConsoleApplication.php', + 'PhabricatorConsoleContentSource' => 'infrastructure/contentsource/PhabricatorConsoleContentSource.php', + 'PhabricatorConstantChartFunction' => 'applications/fact/chart/PhabricatorConstantChartFunction.php', + 'PhabricatorContactNumbersSettingsPanel' => 'applications/settings/panel/PhabricatorContactNumbersSettingsPanel.php', + 'PhabricatorContentSource' => 'infrastructure/contentsource/PhabricatorContentSource.php', + 'PhabricatorContentSourceModule' => 'infrastructure/contentsource/PhabricatorContentSourceModule.php', + 'PhabricatorContentSourceView' => 'infrastructure/contentsource/PhabricatorContentSourceView.php', + 'PhabricatorContributedToObjectEdgeType' => 'applications/transactions/edges/PhabricatorContributedToObjectEdgeType.php', 'PhabricatorController' => 'applications/base/controller/PhabricatorController.php', + 'PhabricatorCookies' => 'applications/auth/constants/PhabricatorCookies.php', 'PhabricatorCoreConfigOptions' => 'applications/config/option/PhabricatorCoreConfigOptions.php', + 'PhabricatorCoreCreateTransaction' => 'applications/transactions/xaction/PhabricatorCoreCreateTransaction.php', + 'PhabricatorCoreTransactionType' => 'applications/transactions/xaction/PhabricatorCoreTransactionType.php', + 'PhabricatorCoreVoidTransaction' => 'applications/transactions/xaction/PhabricatorCoreVoidTransaction.php', + 'PhabricatorCosChartFunction' => 'applications/fact/chart/PhabricatorCosChartFunction.php', + 'PhabricatorCountFact' => 'applications/fact/fact/PhabricatorCountFact.php', 'PhabricatorCountdown' => 'applications/countdown/storage/PhabricatorCountdown.php', + 'PhabricatorCountdownApplication' => 'applications/countdown/application/PhabricatorCountdownApplication.php', 'PhabricatorCountdownController' => 'applications/countdown/controller/PhabricatorCountdownController.php', + 'PhabricatorCountdownCountdownPHIDType' => 'applications/countdown/phid/PhabricatorCountdownCountdownPHIDType.php', 'PhabricatorCountdownDAO' => 'applications/countdown/storage/PhabricatorCountdownDAO.php', - 'PhabricatorCountdownDeleteController' => 'applications/countdown/controller/PhabricatorCountdownDeleteController.php', + 'PhabricatorCountdownDefaultEditCapability' => 'applications/countdown/capability/PhabricatorCountdownDefaultEditCapability.php', + 'PhabricatorCountdownDefaultViewCapability' => 'applications/countdown/capability/PhabricatorCountdownDefaultViewCapability.php', + 'PhabricatorCountdownDescriptionTransaction' => 'applications/countdown/xaction/PhabricatorCountdownDescriptionTransaction.php', 'PhabricatorCountdownEditController' => 'applications/countdown/controller/PhabricatorCountdownEditController.php', + 'PhabricatorCountdownEditEngine' => 'applications/countdown/editor/PhabricatorCountdownEditEngine.php', + 'PhabricatorCountdownEditor' => 'applications/countdown/editor/PhabricatorCountdownEditor.php', + 'PhabricatorCountdownEpochTransaction' => 'applications/countdown/xaction/PhabricatorCountdownEpochTransaction.php', 'PhabricatorCountdownListController' => 'applications/countdown/controller/PhabricatorCountdownListController.php', - 'PhabricatorCountdownPHIDTypeCountdown' => 'applications/countdown/phid/PhabricatorCountdownPHIDTypeCountdown.php', + 'PhabricatorCountdownMailReceiver' => 'applications/countdown/mail/PhabricatorCountdownMailReceiver.php', 'PhabricatorCountdownQuery' => 'applications/countdown/query/PhabricatorCountdownQuery.php', 'PhabricatorCountdownRemarkupRule' => 'applications/countdown/remarkup/PhabricatorCountdownRemarkupRule.php', + 'PhabricatorCountdownReplyHandler' => 'applications/countdown/mail/PhabricatorCountdownReplyHandler.php', + 'PhabricatorCountdownSchemaSpec' => 'applications/countdown/storage/PhabricatorCountdownSchemaSpec.php', 'PhabricatorCountdownSearchEngine' => 'applications/countdown/query/PhabricatorCountdownSearchEngine.php', + 'PhabricatorCountdownTitleTransaction' => 'applications/countdown/xaction/PhabricatorCountdownTitleTransaction.php', + 'PhabricatorCountdownTransaction' => 'applications/countdown/storage/PhabricatorCountdownTransaction.php', + 'PhabricatorCountdownTransactionComment' => 'applications/countdown/storage/PhabricatorCountdownTransactionComment.php', + 'PhabricatorCountdownTransactionQuery' => 'applications/countdown/query/PhabricatorCountdownTransactionQuery.php', + 'PhabricatorCountdownTransactionType' => 'applications/countdown/xaction/PhabricatorCountdownTransactionType.php', 'PhabricatorCountdownView' => 'applications/countdown/view/PhabricatorCountdownView.php', 'PhabricatorCountdownViewController' => 'applications/countdown/controller/PhabricatorCountdownViewController.php', - 'PhabricatorCountedToggleButtonsExample' => 'applications/uiexample/examples/PhabricatorCountedToggleButtonsExample.php', - 'PhabricatorCrumbView' => 'view/layout/PhabricatorCrumbView.php', - 'PhabricatorCrumbsView' => 'view/layout/PhabricatorCrumbsView.php', + 'PhabricatorCredentialEditField' => 'applications/transactions/editfield/PhabricatorCredentialEditField.php', 'PhabricatorCursorPagedPolicyAwareQuery' => 'infrastructure/query/policy/PhabricatorCursorPagedPolicyAwareQuery.php', 'PhabricatorCustomField' => 'infrastructure/customfield/field/PhabricatorCustomField.php', + 'PhabricatorCustomFieldApplicationSearchAnyFunctionDatasource' => 'infrastructure/customfield/datasource/PhabricatorCustomFieldApplicationSearchAnyFunctionDatasource.php', + 'PhabricatorCustomFieldApplicationSearchDatasource' => 'infrastructure/customfield/datasource/PhabricatorCustomFieldApplicationSearchDatasource.php', + 'PhabricatorCustomFieldApplicationSearchNoneFunctionDatasource' => 'infrastructure/customfield/datasource/PhabricatorCustomFieldApplicationSearchNoneFunctionDatasource.php', + 'PhabricatorCustomFieldAttachment' => 'infrastructure/customfield/field/PhabricatorCustomFieldAttachment.php', 'PhabricatorCustomFieldConfigOptionType' => 'infrastructure/customfield/config/PhabricatorCustomFieldConfigOptionType.php', 'PhabricatorCustomFieldDataNotAvailableException' => 'infrastructure/customfield/exception/PhabricatorCustomFieldDataNotAvailableException.php', + 'PhabricatorCustomFieldEditEngineExtension' => 'infrastructure/customfield/engineextension/PhabricatorCustomFieldEditEngineExtension.php', + 'PhabricatorCustomFieldEditField' => 'infrastructure/customfield/editor/PhabricatorCustomFieldEditField.php', + 'PhabricatorCustomFieldEditType' => 'infrastructure/customfield/editor/PhabricatorCustomFieldEditType.php', + 'PhabricatorCustomFieldExportEngineExtension' => 'infrastructure/export/engine/PhabricatorCustomFieldExportEngineExtension.php', + 'PhabricatorCustomFieldFulltextEngineExtension' => 'infrastructure/customfield/engineextension/PhabricatorCustomFieldFulltextEngineExtension.php', + 'PhabricatorCustomFieldHeraldAction' => 'infrastructure/customfield/herald/PhabricatorCustomFieldHeraldAction.php', + 'PhabricatorCustomFieldHeraldActionGroup' => 'infrastructure/customfield/herald/PhabricatorCustomFieldHeraldActionGroup.php', + 'PhabricatorCustomFieldHeraldField' => 'infrastructure/customfield/herald/PhabricatorCustomFieldHeraldField.php', + 'PhabricatorCustomFieldHeraldFieldGroup' => 'infrastructure/customfield/herald/PhabricatorCustomFieldHeraldFieldGroup.php', 'PhabricatorCustomFieldImplementationIncompleteException' => 'infrastructure/customfield/exception/PhabricatorCustomFieldImplementationIncompleteException.php', 'PhabricatorCustomFieldIndexStorage' => 'infrastructure/customfield/storage/PhabricatorCustomFieldIndexStorage.php', 'PhabricatorCustomFieldInterface' => 'infrastructure/customfield/interface/PhabricatorCustomFieldInterface.php', + 'PhabricatorCustomFieldList' => 'infrastructure/customfield/field/PhabricatorCustomFieldList.php', + 'PhabricatorCustomFieldMonogramParser' => 'infrastructure/customfield/parser/PhabricatorCustomFieldMonogramParser.php', 'PhabricatorCustomFieldNotAttachedException' => 'infrastructure/customfield/exception/PhabricatorCustomFieldNotAttachedException.php', + 'PhabricatorCustomFieldNotProxyException' => 'infrastructure/customfield/exception/PhabricatorCustomFieldNotProxyException.php', 'PhabricatorCustomFieldNumericIndexStorage' => 'infrastructure/customfield/storage/PhabricatorCustomFieldNumericIndexStorage.php', + 'PhabricatorCustomFieldSearchEngineExtension' => 'infrastructure/customfield/engineextension/PhabricatorCustomFieldSearchEngineExtension.php', 'PhabricatorCustomFieldStorage' => 'infrastructure/customfield/storage/PhabricatorCustomFieldStorage.php', + 'PhabricatorCustomFieldStorageQuery' => 'infrastructure/customfield/query/PhabricatorCustomFieldStorageQuery.php', 'PhabricatorCustomFieldStringIndexStorage' => 'infrastructure/customfield/storage/PhabricatorCustomFieldStringIndexStorage.php', - 'PhabricatorCustomFieldValidationException' => 'infrastructure/customfield/exception/PhabricatorCustomFieldValidationException.php', + 'PhabricatorCustomLogoConfigType' => 'applications/config/custom/PhabricatorCustomLogoConfigType.php', + 'PhabricatorCustomUIFooterConfigType' => 'applications/config/custom/PhabricatorCustomUIFooterConfigType.php', 'PhabricatorDaemon' => 'infrastructure/daemon/PhabricatorDaemon.php', - 'PhabricatorDaemonCombinedLogController' => 'applications/daemon/controller/PhabricatorDaemonCombinedLogController.php', + 'PhabricatorDaemonBulkJobController' => 'applications/daemon/controller/PhabricatorDaemonBulkJobController.php', + 'PhabricatorDaemonBulkJobListController' => 'applications/daemon/controller/PhabricatorDaemonBulkJobListController.php', + 'PhabricatorDaemonBulkJobMonitorController' => 'applications/daemon/controller/PhabricatorDaemonBulkJobMonitorController.php', + 'PhabricatorDaemonBulkJobViewController' => 'applications/daemon/controller/PhabricatorDaemonBulkJobViewController.php', 'PhabricatorDaemonConsoleController' => 'applications/daemon/controller/PhabricatorDaemonConsoleController.php', + 'PhabricatorDaemonContentSource' => 'infrastructure/daemon/contentsource/PhabricatorDaemonContentSource.php', 'PhabricatorDaemonController' => 'applications/daemon/controller/PhabricatorDaemonController.php', 'PhabricatorDaemonDAO' => 'applications/daemon/storage/PhabricatorDaemonDAO.php', 'PhabricatorDaemonEventListener' => 'applications/daemon/event/PhabricatorDaemonEventListener.php', + 'PhabricatorDaemonLockLog' => 'applications/daemon/storage/PhabricatorDaemonLockLog.php', + 'PhabricatorDaemonLockLogGarbageCollector' => 'applications/daemon/garbagecollector/PhabricatorDaemonLockLogGarbageCollector.php', 'PhabricatorDaemonLog' => 'applications/daemon/storage/PhabricatorDaemonLog.php', 'PhabricatorDaemonLogEvent' => 'applications/daemon/storage/PhabricatorDaemonLogEvent.php', - 'PhabricatorDaemonLogEventViewController' => 'applications/daemon/controller/PhabricatorDaemonLogEventViewController.php', - 'PhabricatorDaemonLogEventsView' => 'applications/daemon/view/PhabricatorDaemonLogEventsView.php', + 'PhabricatorDaemonLogEventGarbageCollector' => 'applications/daemon/garbagecollector/PhabricatorDaemonLogEventGarbageCollector.php', + 'PhabricatorDaemonLogGarbageCollector' => 'applications/daemon/garbagecollector/PhabricatorDaemonLogGarbageCollector.php', 'PhabricatorDaemonLogListController' => 'applications/daemon/controller/PhabricatorDaemonLogListController.php', 'PhabricatorDaemonLogListView' => 'applications/daemon/view/PhabricatorDaemonLogListView.php', 'PhabricatorDaemonLogQuery' => 'applications/daemon/query/PhabricatorDaemonLogQuery.php', @@ -1053,205 +3049,703 @@ 'PhabricatorDaemonManagementLaunchWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementLaunchWorkflow.php', 'PhabricatorDaemonManagementListWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementListWorkflow.php', 'PhabricatorDaemonManagementLogWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementLogWorkflow.php', + 'PhabricatorDaemonManagementReloadWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementReloadWorkflow.php', 'PhabricatorDaemonManagementRestartWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementRestartWorkflow.php', 'PhabricatorDaemonManagementStartWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementStartWorkflow.php', 'PhabricatorDaemonManagementStatusWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementStatusWorkflow.php', 'PhabricatorDaemonManagementStopWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementStopWorkflow.php', 'PhabricatorDaemonManagementWorkflow' => 'applications/daemon/management/PhabricatorDaemonManagementWorkflow.php', + 'PhabricatorDaemonOverseerModule' => 'infrastructure/daemon/overseer/PhabricatorDaemonOverseerModule.php', 'PhabricatorDaemonReference' => 'infrastructure/daemon/control/PhabricatorDaemonReference.php', + 'PhabricatorDaemonTaskGarbageCollector' => 'applications/daemon/garbagecollector/PhabricatorDaemonTaskGarbageCollector.php', + 'PhabricatorDaemonTasksTableView' => 'applications/daemon/view/PhabricatorDaemonTasksTableView.php', + 'PhabricatorDaemonsApplication' => 'applications/daemon/application/PhabricatorDaemonsApplication.php', + 'PhabricatorDaemonsSetupCheck' => 'applications/config/check/PhabricatorDaemonsSetupCheck.php', + 'PhabricatorDailyRoutineTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorDailyRoutineTriggerClock.php', + 'PhabricatorDarkConsoleSetting' => 'applications/settings/setting/PhabricatorDarkConsoleSetting.php', + 'PhabricatorDarkConsoleTabSetting' => 'applications/settings/setting/PhabricatorDarkConsoleTabSetting.php', + 'PhabricatorDarkConsoleVisibleSetting' => 'applications/settings/setting/PhabricatorDarkConsoleVisibleSetting.php', + 'PhabricatorDashboard' => 'applications/dashboard/storage/PhabricatorDashboard.php', + 'PhabricatorDashboardAdjustController' => 'applications/dashboard/controller/dashboard/PhabricatorDashboardAdjustController.php', + 'PhabricatorDashboardApplication' => 'applications/dashboard/application/PhabricatorDashboardApplication.php', + 'PhabricatorDashboardApplicationInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardApplicationInstallWorkflow.php', + 'PhabricatorDashboardArchiveController' => 'applications/dashboard/controller/dashboard/PhabricatorDashboardArchiveController.php', + 'PhabricatorDashboardChartPanelChartTransaction' => 'applications/dashboard/xaction/panel/PhabricatorDashboardChartPanelChartTransaction.php', + 'PhabricatorDashboardChartPanelType' => 'applications/dashboard/paneltype/PhabricatorDashboardChartPanelType.php', + 'PhabricatorDashboardColumn' => 'applications/dashboard/layoutconfig/PhabricatorDashboardColumn.php', + 'PhabricatorDashboardConsoleController' => 'applications/dashboard/controller/PhabricatorDashboardConsoleController.php', + 'PhabricatorDashboardController' => 'applications/dashboard/controller/PhabricatorDashboardController.php', + 'PhabricatorDashboardDAO' => 'applications/dashboard/storage/PhabricatorDashboardDAO.php', + 'PhabricatorDashboardDashboardPHIDType' => 'applications/dashboard/phid/PhabricatorDashboardDashboardPHIDType.php', + 'PhabricatorDashboardDatasource' => 'applications/dashboard/typeahead/PhabricatorDashboardDatasource.php', + 'PhabricatorDashboardEditController' => 'applications/dashboard/controller/dashboard/PhabricatorDashboardEditController.php', + 'PhabricatorDashboardEditEngine' => 'applications/dashboard/editor/PhabricatorDashboardEditEngine.php', + 'PhabricatorDashboardFavoritesInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardFavoritesInstallWorkflow.php', + 'PhabricatorDashboardFerretEngine' => 'applications/dashboard/engine/PhabricatorDashboardFerretEngine.php', + 'PhabricatorDashboardFullLayoutMode' => 'applications/dashboard/layoutconfig/PhabricatorDashboardFullLayoutMode.php', + 'PhabricatorDashboardFulltextEngine' => 'applications/dashboard/engine/PhabricatorDashboardFulltextEngine.php', + 'PhabricatorDashboardHalfLayoutMode' => 'applications/dashboard/layoutconfig/PhabricatorDashboardHalfLayoutMode.php', + 'PhabricatorDashboardHomeInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardHomeInstallWorkflow.php', + 'PhabricatorDashboardIconSet' => 'applications/dashboard/icon/PhabricatorDashboardIconSet.php', + 'PhabricatorDashboardIconTransaction' => 'applications/dashboard/xaction/dashboard/PhabricatorDashboardIconTransaction.php', + 'PhabricatorDashboardInstallController' => 'applications/dashboard/controller/dashboard/PhabricatorDashboardInstallController.php', + 'PhabricatorDashboardInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardInstallWorkflow.php', + 'PhabricatorDashboardLayoutMode' => 'applications/dashboard/layoutconfig/PhabricatorDashboardLayoutMode.php', + 'PhabricatorDashboardLayoutTransaction' => 'applications/dashboard/xaction/dashboard/PhabricatorDashboardLayoutTransaction.php', + 'PhabricatorDashboardListController' => 'applications/dashboard/controller/PhabricatorDashboardListController.php', + 'PhabricatorDashboardNameTransaction' => 'applications/dashboard/xaction/dashboard/PhabricatorDashboardNameTransaction.php', + 'PhabricatorDashboardObjectInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardObjectInstallWorkflow.php', + 'PhabricatorDashboardOneThirdLayoutMode' => 'applications/dashboard/layoutconfig/PhabricatorDashboardOneThirdLayoutMode.php', + 'PhabricatorDashboardPanel' => 'applications/dashboard/storage/PhabricatorDashboardPanel.php', + 'PhabricatorDashboardPanelArchiveController' => 'applications/dashboard/controller/panel/PhabricatorDashboardPanelArchiveController.php', + 'PhabricatorDashboardPanelContainerIndexEngineExtension' => 'applications/dashboard/engineextension/PhabricatorDashboardPanelContainerIndexEngineExtension.php', + 'PhabricatorDashboardPanelContainerInterface' => 'applications/dashboard/interface/PhabricatorDashboardPanelContainerInterface.php', + 'PhabricatorDashboardPanelDatasource' => 'applications/dashboard/typeahead/PhabricatorDashboardPanelDatasource.php', + 'PhabricatorDashboardPanelEditConduitAPIMethod' => 'applications/dashboard/conduit/PhabricatorDashboardPanelEditConduitAPIMethod.php', + 'PhabricatorDashboardPanelEditController' => 'applications/dashboard/controller/panel/PhabricatorDashboardPanelEditController.php', + 'PhabricatorDashboardPanelEditEngine' => 'applications/dashboard/editor/PhabricatorDashboardPanelEditEngine.php', + 'PhabricatorDashboardPanelFerretEngine' => 'applications/dashboard/engine/PhabricatorDashboardPanelFerretEngine.php', + 'PhabricatorDashboardPanelFulltextEngine' => 'applications/dashboard/engine/PhabricatorDashboardPanelFulltextEngine.php', + 'PhabricatorDashboardPanelListController' => 'applications/dashboard/controller/panel/PhabricatorDashboardPanelListController.php', + 'PhabricatorDashboardPanelNameTransaction' => 'applications/dashboard/xaction/panel/PhabricatorDashboardPanelNameTransaction.php', + 'PhabricatorDashboardPanelPHIDType' => 'applications/dashboard/phid/PhabricatorDashboardPanelPHIDType.php', + 'PhabricatorDashboardPanelPropertyTransaction' => 'applications/dashboard/xaction/panel/PhabricatorDashboardPanelPropertyTransaction.php', + 'PhabricatorDashboardPanelQuery' => 'applications/dashboard/query/PhabricatorDashboardPanelQuery.php', + 'PhabricatorDashboardPanelRef' => 'applications/dashboard/layoutconfig/PhabricatorDashboardPanelRef.php', + 'PhabricatorDashboardPanelRefList' => 'applications/dashboard/layoutconfig/PhabricatorDashboardPanelRefList.php', + 'PhabricatorDashboardPanelRenderController' => 'applications/dashboard/controller/panel/PhabricatorDashboardPanelRenderController.php', + 'PhabricatorDashboardPanelRenderingEngine' => 'applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php', + 'PhabricatorDashboardPanelSearchEngine' => 'applications/dashboard/query/PhabricatorDashboardPanelSearchEngine.php', + 'PhabricatorDashboardPanelStatusTransaction' => 'applications/dashboard/xaction/panel/PhabricatorDashboardPanelStatusTransaction.php', + 'PhabricatorDashboardPanelTabsController' => 'applications/dashboard/controller/panel/PhabricatorDashboardPanelTabsController.php', + 'PhabricatorDashboardPanelTransaction' => 'applications/dashboard/storage/PhabricatorDashboardPanelTransaction.php', + 'PhabricatorDashboardPanelTransactionEditor' => 'applications/dashboard/editor/PhabricatorDashboardPanelTransactionEditor.php', + 'PhabricatorDashboardPanelTransactionQuery' => 'applications/dashboard/query/PhabricatorDashboardPanelTransactionQuery.php', + 'PhabricatorDashboardPanelTransactionType' => 'applications/dashboard/xaction/panel/PhabricatorDashboardPanelTransactionType.php', + 'PhabricatorDashboardPanelType' => 'applications/dashboard/paneltype/PhabricatorDashboardPanelType.php', + 'PhabricatorDashboardPanelUsedByObjectEdgeType' => 'applications/search/edge/PhabricatorDashboardPanelUsedByObjectEdgeType.php', + 'PhabricatorDashboardPanelViewController' => 'applications/dashboard/controller/panel/PhabricatorDashboardPanelViewController.php', + 'PhabricatorDashboardPanelsTransaction' => 'applications/dashboard/xaction/dashboard/PhabricatorDashboardPanelsTransaction.php', + 'PhabricatorDashboardPortal' => 'applications/dashboard/storage/PhabricatorDashboardPortal.php', + 'PhabricatorDashboardPortalController' => 'applications/dashboard/controller/portal/PhabricatorDashboardPortalController.php', + 'PhabricatorDashboardPortalDatasource' => 'applications/dashboard/typeahead/PhabricatorDashboardPortalDatasource.php', + 'PhabricatorDashboardPortalEditConduitAPIMethod' => 'applications/dashboard/conduit/PhabricatorDashboardPortalEditConduitAPIMethod.php', + 'PhabricatorDashboardPortalEditController' => 'applications/dashboard/controller/portal/PhabricatorDashboardPortalEditController.php', + 'PhabricatorDashboardPortalEditEngine' => 'applications/dashboard/editor/PhabricatorDashboardPortalEditEngine.php', + 'PhabricatorDashboardPortalEditor' => 'applications/dashboard/editor/PhabricatorDashboardPortalEditor.php', + 'PhabricatorDashboardPortalFerretEngine' => 'applications/dashboard/engine/PhabricatorDashboardPortalFerretEngine.php', + 'PhabricatorDashboardPortalFulltextEngine' => 'applications/dashboard/engine/PhabricatorDashboardPortalFulltextEngine.php', + 'PhabricatorDashboardPortalInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardPortalInstallWorkflow.php', + 'PhabricatorDashboardPortalListController' => 'applications/dashboard/controller/portal/PhabricatorDashboardPortalListController.php', + 'PhabricatorDashboardPortalMenuItem' => 'applications/dashboard/menuitem/PhabricatorDashboardPortalMenuItem.php', + 'PhabricatorDashboardPortalNameTransaction' => 'applications/dashboard/xaction/portal/PhabricatorDashboardPortalNameTransaction.php', + 'PhabricatorDashboardPortalPHIDType' => 'applications/dashboard/phid/PhabricatorDashboardPortalPHIDType.php', + 'PhabricatorDashboardPortalProfileMenuEngine' => 'applications/dashboard/engine/PhabricatorDashboardPortalProfileMenuEngine.php', + 'PhabricatorDashboardPortalQuery' => 'applications/dashboard/query/PhabricatorDashboardPortalQuery.php', + 'PhabricatorDashboardPortalSearchConduitAPIMethod' => 'applications/dashboard/conduit/PhabricatorDashboardPortalSearchConduitAPIMethod.php', + 'PhabricatorDashboardPortalSearchEngine' => 'applications/dashboard/query/PhabricatorDashboardPortalSearchEngine.php', + 'PhabricatorDashboardPortalStatus' => 'applications/dashboard/constants/PhabricatorDashboardPortalStatus.php', + 'PhabricatorDashboardPortalTransaction' => 'applications/dashboard/storage/PhabricatorDashboardPortalTransaction.php', + 'PhabricatorDashboardPortalTransactionQuery' => 'applications/dashboard/query/PhabricatorDashboardPortalTransactionQuery.php', + 'PhabricatorDashboardPortalTransactionType' => 'applications/dashboard/xaction/portal/PhabricatorDashboardPortalTransactionType.php', + 'PhabricatorDashboardPortalViewController' => 'applications/dashboard/controller/portal/PhabricatorDashboardPortalViewController.php', + 'PhabricatorDashboardProfileController' => 'applications/dashboard/controller/PhabricatorDashboardProfileController.php', + 'PhabricatorDashboardProfileMenuItem' => 'applications/search/menuitem/PhabricatorDashboardProfileMenuItem.php', + 'PhabricatorDashboardProjectInstallWorkflow' => 'applications/dashboard/install/PhabricatorDashboardProjectInstallWorkflow.php', + 'PhabricatorDashboardQuery' => 'applications/dashboard/query/PhabricatorDashboardQuery.php', + 'PhabricatorDashboardQueryPanelApplicationEditField' => 'applications/dashboard/editfield/PhabricatorDashboardQueryPanelApplicationEditField.php', + 'PhabricatorDashboardQueryPanelApplicationTransaction' => 'applications/dashboard/xaction/panel/PhabricatorDashboardQueryPanelApplicationTransaction.php', + 'PhabricatorDashboardQueryPanelInstallController' => 'applications/dashboard/controller/PhabricatorDashboardQueryPanelInstallController.php', + 'PhabricatorDashboardQueryPanelLimitTransaction' => 'applications/dashboard/xaction/panel/PhabricatorDashboardQueryPanelLimitTransaction.php', + 'PhabricatorDashboardQueryPanelQueryEditField' => 'applications/dashboard/editfield/PhabricatorDashboardQueryPanelQueryEditField.php', + 'PhabricatorDashboardQueryPanelQueryTransaction' => 'applications/dashboard/xaction/panel/PhabricatorDashboardQueryPanelQueryTransaction.php', + 'PhabricatorDashboardQueryPanelType' => 'applications/dashboard/paneltype/PhabricatorDashboardQueryPanelType.php', + 'PhabricatorDashboardRemarkupRule' => 'applications/dashboard/remarkup/PhabricatorDashboardRemarkupRule.php', + 'PhabricatorDashboardRenderingEngine' => 'applications/dashboard/engine/PhabricatorDashboardRenderingEngine.php', + 'PhabricatorDashboardSchemaSpec' => 'applications/dashboard/storage/PhabricatorDashboardSchemaSpec.php', + 'PhabricatorDashboardSearchEngine' => 'applications/dashboard/query/PhabricatorDashboardSearchEngine.php', + 'PhabricatorDashboardStatusTransaction' => 'applications/dashboard/xaction/dashboard/PhabricatorDashboardStatusTransaction.php', + 'PhabricatorDashboardTabsPanelTabsTransaction' => 'applications/dashboard/xaction/panel/PhabricatorDashboardTabsPanelTabsTransaction.php', + 'PhabricatorDashboardTabsPanelType' => 'applications/dashboard/paneltype/PhabricatorDashboardTabsPanelType.php', + 'PhabricatorDashboardTextPanelTextTransaction' => 'applications/dashboard/xaction/panel/PhabricatorDashboardTextPanelTextTransaction.php', + 'PhabricatorDashboardTextPanelType' => 'applications/dashboard/paneltype/PhabricatorDashboardTextPanelType.php', + 'PhabricatorDashboardTransaction' => 'applications/dashboard/storage/PhabricatorDashboardTransaction.php', + 'PhabricatorDashboardTransactionEditor' => 'applications/dashboard/editor/PhabricatorDashboardTransactionEditor.php', + 'PhabricatorDashboardTransactionQuery' => 'applications/dashboard/query/PhabricatorDashboardTransactionQuery.php', + 'PhabricatorDashboardTransactionType' => 'applications/dashboard/xaction/dashboard/PhabricatorDashboardTransactionType.php', + 'PhabricatorDashboardTwoThirdsLayoutMode' => 'applications/dashboard/layoutconfig/PhabricatorDashboardTwoThirdsLayoutMode.php', + 'PhabricatorDashboardViewController' => 'applications/dashboard/controller/dashboard/PhabricatorDashboardViewController.php', + 'PhabricatorDataCacheSpec' => 'applications/cache/spec/PhabricatorDataCacheSpec.php', 'PhabricatorDataNotAttachedException' => 'infrastructure/storage/lisk/PhabricatorDataNotAttachedException.php', - 'PhabricatorDebugController' => 'applications/system/PhabricatorDebugController.php', - 'PhabricatorDefaultFileStorageEngineSelector' => 'applications/files/engineselector/PhabricatorDefaultFileStorageEngineSelector.php', - 'PhabricatorDefaultSearchEngineSelector' => 'applications/search/selector/PhabricatorDefaultSearchEngineSelector.php', + 'PhabricatorDatabaseRef' => 'infrastructure/cluster/PhabricatorDatabaseRef.php', + 'PhabricatorDatabaseRefParser' => 'infrastructure/cluster/PhabricatorDatabaseRefParser.php', + 'PhabricatorDatabaseSetupCheck' => 'applications/config/check/PhabricatorDatabaseSetupCheck.php', + 'PhabricatorDatasourceApplicationEngineExtension' => 'applications/meta/engineextension/PhabricatorDatasourceApplicationEngineExtension.php', + 'PhabricatorDatasourceEditField' => 'applications/transactions/editfield/PhabricatorDatasourceEditField.php', + 'PhabricatorDatasourceEditType' => 'applications/transactions/edittype/PhabricatorDatasourceEditType.php', + 'PhabricatorDatasourceEngine' => 'applications/search/engine/PhabricatorDatasourceEngine.php', + 'PhabricatorDatasourceEngineExtension' => 'applications/search/engineextension/PhabricatorDatasourceEngineExtension.php', + 'PhabricatorDatasourceURIEngineExtension' => 'applications/meta/engineextension/PhabricatorDatasourceURIEngineExtension.php', + 'PhabricatorDateFormatSetting' => 'applications/settings/setting/PhabricatorDateFormatSetting.php', + 'PhabricatorDateTimeSettingsPanel' => 'applications/settings/panel/PhabricatorDateTimeSettingsPanel.php', + 'PhabricatorDebugController' => 'applications/system/controller/PhabricatorDebugController.php', + 'PhabricatorDefaultRequestExceptionHandler' => 'aphront/handler/PhabricatorDefaultRequestExceptionHandler.php', + 'PhabricatorDefaultSyntaxStyle' => 'infrastructure/syntax/PhabricatorDefaultSyntaxStyle.php', + 'PhabricatorDefaultUnlockEngine' => 'applications/system/engine/PhabricatorDefaultUnlockEngine.php', + 'PhabricatorDemoChartEngine' => 'applications/fact/engine/PhabricatorDemoChartEngine.php', + 'PhabricatorDestructibleCodex' => 'applications/system/codex/PhabricatorDestructibleCodex.php', + 'PhabricatorDestructibleCodexInterface' => 'applications/system/interface/PhabricatorDestructibleCodexInterface.php', + 'PhabricatorDestructibleInterface' => 'applications/system/interface/PhabricatorDestructibleInterface.php', + 'PhabricatorDestructionEngine' => 'applications/system/engine/PhabricatorDestructionEngine.php', + 'PhabricatorDestructionEngineExtension' => 'applications/system/engine/PhabricatorDestructionEngineExtension.php', + 'PhabricatorDestructionEngineExtensionModule' => 'applications/system/engine/PhabricatorDestructionEngineExtensionModule.php', 'PhabricatorDeveloperConfigOptions' => 'applications/config/option/PhabricatorDeveloperConfigOptions.php', + 'PhabricatorDeveloperPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorDeveloperPreferencesSettingsPanel.php', + 'PhabricatorDiffInlineCommentContentState' => 'infrastructure/diff/inline/PhabricatorDiffInlineCommentContentState.php', + 'PhabricatorDiffInlineCommentContext' => 'infrastructure/diff/inline/PhabricatorDiffInlineCommentContext.php', + 'PhabricatorDiffInlineCommentQuery' => 'infrastructure/diff/query/PhabricatorDiffInlineCommentQuery.php', + 'PhabricatorDiffPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorDiffPreferencesSettingsPanel.php', + 'PhabricatorDiffScopeEngine' => 'infrastructure/diff/PhabricatorDiffScopeEngine.php', + 'PhabricatorDiffScopeEngineTestCase' => 'infrastructure/diff/__tests__/PhabricatorDiffScopeEngineTestCase.php', 'PhabricatorDifferenceEngine' => 'infrastructure/diff/PhabricatorDifferenceEngine.php', + 'PhabricatorDifferentialApplication' => 'applications/differential/application/PhabricatorDifferentialApplication.php', + 'PhabricatorDifferentialAttachCommitWorkflow' => 'applications/differential/management/PhabricatorDifferentialAttachCommitWorkflow.php', 'PhabricatorDifferentialConfigOptions' => 'applications/differential/config/PhabricatorDifferentialConfigOptions.php', + 'PhabricatorDifferentialExtractWorkflow' => 'applications/differential/management/PhabricatorDifferentialExtractWorkflow.php', + 'PhabricatorDifferentialManagementWorkflow' => 'applications/differential/management/PhabricatorDifferentialManagementWorkflow.php', + 'PhabricatorDifferentialMigrateHunkWorkflow' => 'applications/differential/management/PhabricatorDifferentialMigrateHunkWorkflow.php', + 'PhabricatorDifferentialRebuildChangesetsWorkflow' => 'applications/differential/management/PhabricatorDifferentialRebuildChangesetsWorkflow.php', 'PhabricatorDifferentialRevisionTestDataGenerator' => 'applications/differential/lipsum/PhabricatorDifferentialRevisionTestDataGenerator.php', + 'PhabricatorDiffusionApplication' => 'applications/diffusion/application/PhabricatorDiffusionApplication.php', + 'PhabricatorDiffusionBlameSetting' => 'applications/settings/setting/PhabricatorDiffusionBlameSetting.php', 'PhabricatorDiffusionConfigOptions' => 'applications/diffusion/config/PhabricatorDiffusionConfigOptions.php', - 'PhabricatorDirectoryController' => 'applications/directory/controller/PhabricatorDirectoryController.php', - 'PhabricatorDirectoryMainController' => 'applications/directory/controller/PhabricatorDirectoryMainController.php', 'PhabricatorDisabledUserController' => 'applications/auth/controller/PhabricatorDisabledUserController.php', - 'PhabricatorDisqusConfigOptions' => 'applications/config/option/PhabricatorDisqusConfigOptions.php', + 'PhabricatorDisplayPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorDisplayPreferencesSettingsPanel.php', + 'PhabricatorDisqusAuthProvider' => 'applications/auth/provider/PhabricatorDisqusAuthProvider.php', + 'PhabricatorDividerEditField' => 'applications/transactions/editfield/PhabricatorDividerEditField.php', + 'PhabricatorDividerProfileMenuItem' => 'applications/search/menuitem/PhabricatorDividerProfileMenuItem.php', + 'PhabricatorDivinerApplication' => 'applications/diviner/application/PhabricatorDivinerApplication.php', + 'PhabricatorDocumentEngine' => 'applications/files/document/PhabricatorDocumentEngine.php', + 'PhabricatorDocumentEngineBlock' => 'applications/files/diff/PhabricatorDocumentEngineBlock.php', + 'PhabricatorDocumentEngineBlockDiff' => 'applications/files/diff/PhabricatorDocumentEngineBlockDiff.php', + 'PhabricatorDocumentEngineBlocks' => 'applications/files/diff/PhabricatorDocumentEngineBlocks.php', + 'PhabricatorDocumentEngineParserException' => 'applications/files/document/exception/PhabricatorDocumentEngineParserException.php', + 'PhabricatorDocumentRef' => 'applications/files/document/PhabricatorDocumentRef.php', + 'PhabricatorDocumentRenderingEngine' => 'applications/files/document/render/PhabricatorDocumentRenderingEngine.php', + 'PhabricatorDoorkeeperApplication' => 'applications/doorkeeper/application/PhabricatorDoorkeeperApplication.php', + 'PhabricatorDoubleExportField' => 'infrastructure/export/field/PhabricatorDoubleExportField.php', 'PhabricatorDraft' => 'applications/draft/storage/PhabricatorDraft.php', 'PhabricatorDraftDAO' => 'applications/draft/storage/PhabricatorDraftDAO.php', + 'PhabricatorDraftEngine' => 'applications/transactions/draft/PhabricatorDraftEngine.php', + 'PhabricatorDraftInterface' => 'applications/transactions/draft/PhabricatorDraftInterface.php', + 'PhabricatorDrydockApplication' => 'applications/drydock/application/PhabricatorDrydockApplication.php', + 'PhabricatorDuoAuthFactor' => 'applications/auth/factor/PhabricatorDuoAuthFactor.php', + 'PhabricatorDuoFuture' => 'applications/auth/future/PhabricatorDuoFuture.php', + 'PhabricatorEdgeChangeRecord' => 'infrastructure/edges/util/PhabricatorEdgeChangeRecord.php', + 'PhabricatorEdgeChangeRecordTestCase' => 'infrastructure/edges/__tests__/PhabricatorEdgeChangeRecordTestCase.php', 'PhabricatorEdgeConfig' => 'infrastructure/edges/constants/PhabricatorEdgeConfig.php', 'PhabricatorEdgeConstants' => 'infrastructure/edges/constants/PhabricatorEdgeConstants.php', 'PhabricatorEdgeCycleException' => 'infrastructure/edges/exception/PhabricatorEdgeCycleException.php', + 'PhabricatorEdgeEditType' => 'applications/transactions/edittype/PhabricatorEdgeEditType.php', 'PhabricatorEdgeEditor' => 'infrastructure/edges/editor/PhabricatorEdgeEditor.php', 'PhabricatorEdgeGraph' => 'infrastructure/edges/util/PhabricatorEdgeGraph.php', + 'PhabricatorEdgeIndexEngineExtension' => 'applications/search/engineextension/PhabricatorEdgeIndexEngineExtension.php', + 'PhabricatorEdgeObject' => 'infrastructure/edges/conduit/PhabricatorEdgeObject.php', + 'PhabricatorEdgeObjectQuery' => 'infrastructure/edges/query/PhabricatorEdgeObjectQuery.php', 'PhabricatorEdgeQuery' => 'infrastructure/edges/query/PhabricatorEdgeQuery.php', 'PhabricatorEdgeTestCase' => 'infrastructure/edges/__tests__/PhabricatorEdgeTestCase.php', + 'PhabricatorEdgeType' => 'infrastructure/edges/type/PhabricatorEdgeType.php', + 'PhabricatorEdgeTypeTestCase' => 'infrastructure/edges/type/__tests__/PhabricatorEdgeTypeTestCase.php', + 'PhabricatorEdgesDestructionEngineExtension' => 'infrastructure/edges/engineextension/PhabricatorEdgesDestructionEngineExtension.php', + 'PhabricatorEditEngine' => 'applications/transactions/editengine/PhabricatorEditEngine.php', + 'PhabricatorEditEngineAPIMethod' => 'applications/transactions/editengine/PhabricatorEditEngineAPIMethod.php', + 'PhabricatorEditEngineBulkJobType' => 'applications/transactions/bulk/PhabricatorEditEngineBulkJobType.php', + 'PhabricatorEditEngineCheckboxesCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineCheckboxesCommentAction.php', + 'PhabricatorEditEngineColumnsCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineColumnsCommentAction.php', + 'PhabricatorEditEngineCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineCommentAction.php', + 'PhabricatorEditEngineCommentActionGroup' => 'applications/transactions/commentaction/PhabricatorEditEngineCommentActionGroup.php', + 'PhabricatorEditEngineConfiguration' => 'applications/transactions/storage/PhabricatorEditEngineConfiguration.php', + 'PhabricatorEditEngineConfigurationDefaultCreateController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationDefaultCreateController.php', + 'PhabricatorEditEngineConfigurationDefaultsController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationDefaultsController.php', + 'PhabricatorEditEngineConfigurationDisableController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationDisableController.php', + 'PhabricatorEditEngineConfigurationEditController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationEditController.php', + 'PhabricatorEditEngineConfigurationEditEngine' => 'applications/transactions/editor/PhabricatorEditEngineConfigurationEditEngine.php', + 'PhabricatorEditEngineConfigurationEditor' => 'applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php', + 'PhabricatorEditEngineConfigurationIsEditController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationIsEditController.php', + 'PhabricatorEditEngineConfigurationListController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationListController.php', + 'PhabricatorEditEngineConfigurationLockController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationLockController.php', + 'PhabricatorEditEngineConfigurationPHIDType' => 'applications/transactions/phid/PhabricatorEditEngineConfigurationPHIDType.php', + 'PhabricatorEditEngineConfigurationQuery' => 'applications/transactions/query/PhabricatorEditEngineConfigurationQuery.php', + 'PhabricatorEditEngineConfigurationReorderController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationReorderController.php', + 'PhabricatorEditEngineConfigurationSaveController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationSaveController.php', + 'PhabricatorEditEngineConfigurationSearchEngine' => 'applications/transactions/query/PhabricatorEditEngineConfigurationSearchEngine.php', + 'PhabricatorEditEngineConfigurationSortController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationSortController.php', + 'PhabricatorEditEngineConfigurationSubtypeController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationSubtypeController.php', + 'PhabricatorEditEngineConfigurationTransaction' => 'applications/transactions/storage/PhabricatorEditEngineConfigurationTransaction.php', + 'PhabricatorEditEngineConfigurationTransactionQuery' => 'applications/transactions/query/PhabricatorEditEngineConfigurationTransactionQuery.php', + 'PhabricatorEditEngineConfigurationViewController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationViewController.php', + 'PhabricatorEditEngineController' => 'applications/transactions/controller/PhabricatorEditEngineController.php', + 'PhabricatorEditEngineCreateOrderTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineCreateOrderTransaction.php', + 'PhabricatorEditEngineDatasource' => 'applications/transactions/typeahead/PhabricatorEditEngineDatasource.php', + 'PhabricatorEditEngineDefaultCreateTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineDefaultCreateTransaction.php', + 'PhabricatorEditEngineDefaultLock' => 'applications/transactions/editengine/PhabricatorEditEngineDefaultLock.php', + 'PhabricatorEditEngineDefaultTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineDefaultTransaction.php', + 'PhabricatorEditEngineDisableTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineDisableTransaction.php', + 'PhabricatorEditEngineEditOrderTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineEditOrderTransaction.php', + 'PhabricatorEditEngineExtension' => 'applications/transactions/engineextension/PhabricatorEditEngineExtension.php', + 'PhabricatorEditEngineExtensionModule' => 'applications/transactions/engineextension/PhabricatorEditEngineExtensionModule.php', + 'PhabricatorEditEngineIsEditTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineIsEditTransaction.php', + 'PhabricatorEditEngineListController' => 'applications/transactions/controller/PhabricatorEditEngineListController.php', + 'PhabricatorEditEngineLock' => 'applications/transactions/editengine/PhabricatorEditEngineLock.php', + 'PhabricatorEditEngineLockableInterface' => 'applications/transactions/editengine/PhabricatorEditEngineLockableInterface.php', + 'PhabricatorEditEngineLocksTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineLocksTransaction.php', + 'PhabricatorEditEngineMFAEngine' => 'applications/transactions/editengine/PhabricatorEditEngineMFAEngine.php', + 'PhabricatorEditEngineMFAInterface' => 'applications/transactions/editengine/PhabricatorEditEngineMFAInterface.php', + 'PhabricatorEditEngineNameTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineNameTransaction.php', + 'PhabricatorEditEngineOrderTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineOrderTransaction.php', + 'PhabricatorEditEnginePageState' => 'applications/transactions/editengine/PhabricatorEditEnginePageState.php', + 'PhabricatorEditEnginePointsCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEnginePointsCommentAction.php', + 'PhabricatorEditEnginePreambleTransaction' => 'applications/transactions/xaction/PhabricatorEditEnginePreambleTransaction.php', + 'PhabricatorEditEngineProfileMenuItem' => 'applications/search/menuitem/PhabricatorEditEngineProfileMenuItem.php', + 'PhabricatorEditEngineQuery' => 'applications/transactions/query/PhabricatorEditEngineQuery.php', + 'PhabricatorEditEngineSearchEngine' => 'applications/transactions/query/PhabricatorEditEngineSearchEngine.php', + 'PhabricatorEditEngineSelectCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineSelectCommentAction.php', + 'PhabricatorEditEngineSettingsPanel' => 'applications/settings/panel/PhabricatorEditEngineSettingsPanel.php', + 'PhabricatorEditEngineStaticCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineStaticCommentAction.php', + 'PhabricatorEditEngineSubtype' => 'applications/transactions/editengine/PhabricatorEditEngineSubtype.php', + 'PhabricatorEditEngineSubtypeHeraldField' => 'applications/transactions/herald/PhabricatorEditEngineSubtypeHeraldField.php', + 'PhabricatorEditEngineSubtypeInterface' => 'applications/transactions/editengine/PhabricatorEditEngineSubtypeInterface.php', + 'PhabricatorEditEngineSubtypeMap' => 'applications/transactions/editengine/PhabricatorEditEngineSubtypeMap.php', + 'PhabricatorEditEngineSubtypeTestCase' => 'applications/transactions/editengine/__tests__/PhabricatorEditEngineSubtypeTestCase.php', + 'PhabricatorEditEngineSubtypeTransaction' => 'applications/transactions/xaction/PhabricatorEditEngineSubtypeTransaction.php', + 'PhabricatorEditEngineTokenizerCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineTokenizerCommentAction.php', + 'PhabricatorEditEngineTransactionType' => 'applications/transactions/xaction/PhabricatorEditEngineTransactionType.php', + 'PhabricatorEditField' => 'applications/transactions/editfield/PhabricatorEditField.php', + 'PhabricatorEditPage' => 'applications/transactions/editengine/PhabricatorEditPage.php', + 'PhabricatorEditType' => 'applications/transactions/edittype/PhabricatorEditType.php', 'PhabricatorEditor' => 'infrastructure/PhabricatorEditor.php', + 'PhabricatorEditorExtension' => 'applications/transactions/engineextension/PhabricatorEditorExtension.php', + 'PhabricatorEditorExtensionModule' => 'applications/transactions/engineextension/PhabricatorEditorExtensionModule.php', + 'PhabricatorEditorMailEngineExtension' => 'applications/transactions/engineextension/PhabricatorEditorMailEngineExtension.php', + 'PhabricatorEditorSetting' => 'applications/settings/setting/PhabricatorEditorSetting.php', + 'PhabricatorEditorURIEngine' => 'infrastructure/editor/PhabricatorEditorURIEngine.php', + 'PhabricatorEditorURIEngineTestCase' => 'infrastructure/editor/__tests__/PhabricatorEditorURIEngineTestCase.php', + 'PhabricatorEditorURIParserException' => 'infrastructure/editor/PhabricatorEditorURIParserException.php', + 'PhabricatorElasticFulltextStorageEngine' => 'applications/search/fulltextstorage/PhabricatorElasticFulltextStorageEngine.php', + 'PhabricatorElasticsearchHost' => 'infrastructure/cluster/search/PhabricatorElasticsearchHost.php', + 'PhabricatorElasticsearchQueryBuilder' => 'applications/search/fulltextstorage/PhabricatorElasticsearchQueryBuilder.php', + 'PhabricatorElasticsearchSetupCheck' => 'applications/config/check/PhabricatorElasticsearchSetupCheck.php', + 'PhabricatorEmailAddressesSettingsPanel' => 'applications/settings/panel/PhabricatorEmailAddressesSettingsPanel.php', + 'PhabricatorEmailContentSource' => 'applications/metamta/contentsource/PhabricatorEmailContentSource.php', + 'PhabricatorEmailDeliverySettingsPanel' => 'applications/settings/panel/PhabricatorEmailDeliverySettingsPanel.php', + 'PhabricatorEmailFormatSetting' => 'applications/settings/setting/PhabricatorEmailFormatSetting.php', + 'PhabricatorEmailFormatSettingsPanel' => 'applications/settings/panel/PhabricatorEmailFormatSettingsPanel.php', 'PhabricatorEmailLoginController' => 'applications/auth/controller/PhabricatorEmailLoginController.php', - 'PhabricatorEmailTokenController' => 'applications/auth/controller/PhabricatorEmailTokenController.php', + 'PhabricatorEmailLoginUserLogType' => 'applications/people/userlog/PhabricatorEmailLoginUserLogType.php', + 'PhabricatorEmailNotificationsSetting' => 'applications/settings/setting/PhabricatorEmailNotificationsSetting.php', + 'PhabricatorEmailPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorEmailPreferencesSettingsPanel.php', + 'PhabricatorEmailRePrefixSetting' => 'applications/settings/setting/PhabricatorEmailRePrefixSetting.php', + 'PhabricatorEmailSelfActionsSetting' => 'applications/settings/setting/PhabricatorEmailSelfActionsSetting.php', + 'PhabricatorEmailStampsSetting' => 'applications/settings/setting/PhabricatorEmailStampsSetting.php', + 'PhabricatorEmailTagsSetting' => 'applications/settings/setting/PhabricatorEmailTagsSetting.php', + 'PhabricatorEmailVarySubjectsSetting' => 'applications/settings/setting/PhabricatorEmailVarySubjectsSetting.php', 'PhabricatorEmailVerificationController' => 'applications/auth/controller/PhabricatorEmailVerificationController.php', - 'PhabricatorEmptyQueryException' => 'infrastructure/query/PhabricatorEmptyQueryException.php', - 'PhabricatorEnglishTranslation' => 'infrastructure/internationalization/PhabricatorEnglishTranslation.php', + 'PhabricatorEmbedFileRemarkupRule' => 'applications/files/markup/PhabricatorEmbedFileRemarkupRule.php', + 'PhabricatorEmojiDatasource' => 'applications/macro/typeahead/PhabricatorEmojiDatasource.php', + 'PhabricatorEmojiRemarkupRule' => 'applications/macro/markup/PhabricatorEmojiRemarkupRule.php', + 'PhabricatorEmojiTranslation' => 'infrastructure/internationalization/translation/PhabricatorEmojiTranslation.php', + 'PhabricatorEmptyQueryException' => 'infrastructure/query/exception/PhabricatorEmptyQueryException.php', + 'PhabricatorEnterHisecUserLogType' => 'applications/people/userlog/PhabricatorEnterHisecUserLogType.php', + 'PhabricatorEnumConfigType' => 'applications/config/type/PhabricatorEnumConfigType.php', 'PhabricatorEnv' => 'infrastructure/env/PhabricatorEnv.php', 'PhabricatorEnvTestCase' => 'infrastructure/env/__tests__/PhabricatorEnvTestCase.php', - 'PhabricatorErrorExample' => 'applications/uiexample/examples/PhabricatorErrorExample.php', + 'PhabricatorEpochEditField' => 'applications/transactions/editfield/PhabricatorEpochEditField.php', + 'PhabricatorEpochExportField' => 'infrastructure/export/field/PhabricatorEpochExportField.php', 'PhabricatorEvent' => 'infrastructure/events/PhabricatorEvent.php', 'PhabricatorEventEngine' => 'infrastructure/events/PhabricatorEventEngine.php', + 'PhabricatorEventListener' => 'infrastructure/events/PhabricatorEventListener.php', 'PhabricatorEventType' => 'infrastructure/events/constant/PhabricatorEventType.php', 'PhabricatorExampleEventListener' => 'infrastructure/events/PhabricatorExampleEventListener.php', + 'PhabricatorExcelExportFormat' => 'infrastructure/export/format/PhabricatorExcelExportFormat.php', + 'PhabricatorExecFutureFileUploadSource' => 'applications/files/uploadsource/PhabricatorExecFutureFileUploadSource.php', + 'PhabricatorExitHisecUserLogType' => 'applications/people/userlog/PhabricatorExitHisecUserLogType.php', + 'PhabricatorExportEngine' => 'infrastructure/export/engine/PhabricatorExportEngine.php', + 'PhabricatorExportEngineBulkJobType' => 'infrastructure/export/engine/PhabricatorExportEngineBulkJobType.php', + 'PhabricatorExportEngineExtension' => 'infrastructure/export/engine/PhabricatorExportEngineExtension.php', + 'PhabricatorExportField' => 'infrastructure/export/field/PhabricatorExportField.php', + 'PhabricatorExportFormat' => 'infrastructure/export/format/PhabricatorExportFormat.php', + 'PhabricatorExportFormatSetting' => 'infrastructure/export/engine/PhabricatorExportFormatSetting.php', + 'PhabricatorExtendedPolicyInterface' => 'applications/policy/interface/PhabricatorExtendedPolicyInterface.php', 'PhabricatorExtendingPhabricatorConfigOptions' => 'applications/config/option/PhabricatorExtendingPhabricatorConfigOptions.php', + 'PhabricatorExtensionsSetupCheck' => 'applications/config/check/PhabricatorExtensionsSetupCheck.php', 'PhabricatorExternalAccount' => 'applications/people/storage/PhabricatorExternalAccount.php', + 'PhabricatorExternalAccountIdentifier' => 'applications/people/storage/PhabricatorExternalAccountIdentifier.php', + 'PhabricatorExternalAccountIdentifierQuery' => 'applications/auth/query/PhabricatorExternalAccountIdentifierQuery.php', 'PhabricatorExternalAccountQuery' => 'applications/auth/query/PhabricatorExternalAccountQuery.php', + 'PhabricatorExternalAccountsSettingsPanel' => 'applications/settings/panel/PhabricatorExternalAccountsSettingsPanel.php', + 'PhabricatorExternalEditorSettingsPanel' => 'applications/settings/panel/PhabricatorExternalEditorSettingsPanel.php', + 'PhabricatorExtraConfigSetupCheck' => 'applications/config/check/PhabricatorExtraConfigSetupCheck.php', + 'PhabricatorFacebookAuthProvider' => 'applications/auth/provider/PhabricatorFacebookAuthProvider.php', + 'PhabricatorFact' => 'applications/fact/fact/PhabricatorFact.php', 'PhabricatorFactAggregate' => 'applications/fact/storage/PhabricatorFactAggregate.php', + 'PhabricatorFactApplication' => 'applications/fact/application/PhabricatorFactApplication.php', + 'PhabricatorFactChart' => 'applications/fact/storage/PhabricatorFactChart.php', 'PhabricatorFactChartController' => 'applications/fact/controller/PhabricatorFactChartController.php', + 'PhabricatorFactChartFunction' => 'applications/fact/chart/PhabricatorFactChartFunction.php', 'PhabricatorFactController' => 'applications/fact/controller/PhabricatorFactController.php', - 'PhabricatorFactCountEngine' => 'applications/fact/engine/PhabricatorFactCountEngine.php', 'PhabricatorFactCursor' => 'applications/fact/storage/PhabricatorFactCursor.php', 'PhabricatorFactDAO' => 'applications/fact/storage/PhabricatorFactDAO.php', 'PhabricatorFactDaemon' => 'applications/fact/daemon/PhabricatorFactDaemon.php', + 'PhabricatorFactDatapointQuery' => 'applications/fact/query/PhabricatorFactDatapointQuery.php', + 'PhabricatorFactDimension' => 'applications/fact/storage/PhabricatorFactDimension.php', 'PhabricatorFactEngine' => 'applications/fact/engine/PhabricatorFactEngine.php', + 'PhabricatorFactEngineTestCase' => 'applications/fact/engine/__tests__/PhabricatorFactEngineTestCase.php', 'PhabricatorFactHomeController' => 'applications/fact/controller/PhabricatorFactHomeController.php', - 'PhabricatorFactLastUpdatedEngine' => 'applications/fact/engine/PhabricatorFactLastUpdatedEngine.php', + 'PhabricatorFactIntDatapoint' => 'applications/fact/storage/PhabricatorFactIntDatapoint.php', + 'PhabricatorFactKeyDimension' => 'applications/fact/storage/PhabricatorFactKeyDimension.php', 'PhabricatorFactManagementAnalyzeWorkflow' => 'applications/fact/management/PhabricatorFactManagementAnalyzeWorkflow.php', 'PhabricatorFactManagementCursorsWorkflow' => 'applications/fact/management/PhabricatorFactManagementCursorsWorkflow.php', 'PhabricatorFactManagementDestroyWorkflow' => 'applications/fact/management/PhabricatorFactManagementDestroyWorkflow.php', 'PhabricatorFactManagementListWorkflow' => 'applications/fact/management/PhabricatorFactManagementListWorkflow.php', - 'PhabricatorFactManagementStatusWorkflow' => 'applications/fact/management/PhabricatorFactManagementStatusWorkflow.php', 'PhabricatorFactManagementWorkflow' => 'applications/fact/management/PhabricatorFactManagementWorkflow.php', + 'PhabricatorFactObjectController' => 'applications/fact/controller/PhabricatorFactObjectController.php', + 'PhabricatorFactObjectDimension' => 'applications/fact/storage/PhabricatorFactObjectDimension.php', 'PhabricatorFactRaw' => 'applications/fact/storage/PhabricatorFactRaw.php', - 'PhabricatorFactSimpleSpec' => 'applications/fact/spec/PhabricatorFactSimpleSpec.php', - 'PhabricatorFactSpec' => 'applications/fact/spec/PhabricatorFactSpec.php', 'PhabricatorFactUpdateIterator' => 'applications/fact/extract/PhabricatorFactUpdateIterator.php', + 'PhabricatorFailHisecUserLogType' => 'applications/people/userlog/PhabricatorFailHisecUserLogType.php', + 'PhabricatorFaviconController' => 'applications/system/controller/PhabricatorFaviconController.php', + 'PhabricatorFaviconRef' => 'applications/files/favicon/PhabricatorFaviconRef.php', + 'PhabricatorFaviconRefQuery' => 'applications/files/favicon/PhabricatorFaviconRefQuery.php', + 'PhabricatorFavoritesApplication' => 'applications/favorites/application/PhabricatorFavoritesApplication.php', + 'PhabricatorFavoritesController' => 'applications/favorites/controller/PhabricatorFavoritesController.php', + 'PhabricatorFavoritesMainMenuBarExtension' => 'applications/favorites/engineextension/PhabricatorFavoritesMainMenuBarExtension.php', + 'PhabricatorFavoritesMenuItemController' => 'applications/favorites/controller/PhabricatorFavoritesMenuItemController.php', + 'PhabricatorFavoritesProfileMenuEngine' => 'applications/favorites/engine/PhabricatorFavoritesProfileMenuEngine.php', + 'PhabricatorFaxContentSource' => 'infrastructure/contentsource/PhabricatorFaxContentSource.php', + 'PhabricatorFeedApplication' => 'applications/feed/application/PhabricatorFeedApplication.php', 'PhabricatorFeedBuilder' => 'applications/feed/builder/PhabricatorFeedBuilder.php', 'PhabricatorFeedConfigOptions' => 'applications/feed/config/PhabricatorFeedConfigOptions.php', - 'PhabricatorFeedConstants' => 'applications/feed/constants/PhabricatorFeedConstants.php', 'PhabricatorFeedController' => 'applications/feed/controller/PhabricatorFeedController.php', 'PhabricatorFeedDAO' => 'applications/feed/storage/PhabricatorFeedDAO.php', 'PhabricatorFeedDetailController' => 'applications/feed/controller/PhabricatorFeedDetailController.php', 'PhabricatorFeedListController' => 'applications/feed/controller/PhabricatorFeedListController.php', 'PhabricatorFeedManagementRepublishWorkflow' => 'applications/feed/management/PhabricatorFeedManagementRepublishWorkflow.php', 'PhabricatorFeedManagementWorkflow' => 'applications/feed/management/PhabricatorFeedManagementWorkflow.php', - 'PhabricatorFeedPublicStreamController' => 'applications/feed/controller/PhabricatorFeedPublicStreamController.php', 'PhabricatorFeedQuery' => 'applications/feed/query/PhabricatorFeedQuery.php', 'PhabricatorFeedSearchEngine' => 'applications/feed/query/PhabricatorFeedSearchEngine.php', 'PhabricatorFeedStory' => 'applications/feed/story/PhabricatorFeedStory.php', - 'PhabricatorFeedStoryAggregate' => 'applications/feed/story/PhabricatorFeedStoryAggregate.php', - 'PhabricatorFeedStoryAudit' => 'applications/feed/story/PhabricatorFeedStoryAudit.php', - 'PhabricatorFeedStoryCommit' => 'applications/feed/story/PhabricatorFeedStoryCommit.php', 'PhabricatorFeedStoryData' => 'applications/feed/storage/PhabricatorFeedStoryData.php', - 'PhabricatorFeedStoryDifferential' => 'applications/feed/story/PhabricatorFeedStoryDifferential.php', - 'PhabricatorFeedStoryDifferentialAggregate' => 'applications/feed/story/PhabricatorFeedStoryDifferentialAggregate.php', - 'PhabricatorFeedStoryManiphest' => 'applications/feed/story/PhabricatorFeedStoryManiphest.php', - 'PhabricatorFeedStoryManiphestAggregate' => 'applications/feed/story/PhabricatorFeedStoryManiphestAggregate.php', 'PhabricatorFeedStoryNotification' => 'applications/notification/storage/PhabricatorFeedStoryNotification.php', - 'PhabricatorFeedStoryPhriction' => 'applications/feed/story/PhabricatorFeedStoryPhriction.php', - 'PhabricatorFeedStoryProject' => 'applications/feed/story/PhabricatorFeedStoryProject.php', 'PhabricatorFeedStoryPublisher' => 'applications/feed/PhabricatorFeedStoryPublisher.php', 'PhabricatorFeedStoryReference' => 'applications/feed/storage/PhabricatorFeedStoryReference.php', - 'PhabricatorFeedStoryStatus' => 'applications/feed/story/PhabricatorFeedStoryStatus.php', - 'PhabricatorFeedStoryTypeConstants' => 'applications/feed/constants/PhabricatorFeedStoryTypeConstants.php', + 'PhabricatorFeedTransactionListController' => 'applications/feed/controller/PhabricatorFeedTransactionListController.php', + 'PhabricatorFeedTransactionQuery' => 'applications/feed/query/PhabricatorFeedTransactionQuery.php', + 'PhabricatorFeedTransactionSearchEngine' => 'applications/feed/query/PhabricatorFeedTransactionSearchEngine.php', + 'PhabricatorFerretEngine' => 'applications/search/ferret/PhabricatorFerretEngine.php', + 'PhabricatorFerretEngineTestCase' => 'applications/search/ferret/__tests__/PhabricatorFerretEngineTestCase.php', + 'PhabricatorFerretFulltextEngineExtension' => 'applications/search/engineextension/PhabricatorFerretFulltextEngineExtension.php', + 'PhabricatorFerretFulltextStorageEngine' => 'applications/search/fulltextstorage/PhabricatorFerretFulltextStorageEngine.php', + 'PhabricatorFerretInterface' => 'applications/search/ferret/PhabricatorFerretInterface.php', + 'PhabricatorFerretMetadata' => 'applications/search/ferret/PhabricatorFerretMetadata.php', + 'PhabricatorFerretSearchEngineExtension' => 'applications/search/engineextension/PhabricatorFerretSearchEngineExtension.php', 'PhabricatorFile' => 'applications/files/storage/PhabricatorFile.php', + 'PhabricatorFileAES256StorageFormat' => 'applications/files/format/PhabricatorFileAES256StorageFormat.php', + 'PhabricatorFileAltTextTransaction' => 'applications/files/xaction/PhabricatorFileAltTextTransaction.php', + 'PhabricatorFileAttachment' => 'applications/files/storage/PhabricatorFileAttachment.php', + 'PhabricatorFileAttachmentQuery' => 'applications/files/query/PhabricatorFileAttachmentQuery.php', + 'PhabricatorFileBundleLoader' => 'applications/files/query/PhabricatorFileBundleLoader.php', + 'PhabricatorFileChunk' => 'applications/files/storage/PhabricatorFileChunk.php', + 'PhabricatorFileChunkIterator' => 'applications/files/engine/PhabricatorFileChunkIterator.php', + 'PhabricatorFileChunkQuery' => 'applications/files/query/PhabricatorFileChunkQuery.php', + 'PhabricatorFileComposeController' => 'applications/files/controller/PhabricatorFileComposeController.php', 'PhabricatorFileController' => 'applications/files/controller/PhabricatorFileController.php', 'PhabricatorFileDAO' => 'applications/files/storage/PhabricatorFileDAO.php', 'PhabricatorFileDataController' => 'applications/files/controller/PhabricatorFileDataController.php', 'PhabricatorFileDeleteController' => 'applications/files/controller/PhabricatorFileDeleteController.php', + 'PhabricatorFileDeleteTransaction' => 'applications/files/xaction/PhabricatorFileDeleteTransaction.php', + 'PhabricatorFileDetachController' => 'applications/files/controller/PhabricatorFileDetachController.php', + 'PhabricatorFileDocumentController' => 'applications/files/controller/PhabricatorFileDocumentController.php', + 'PhabricatorFileDocumentRenderingEngine' => 'applications/files/document/render/PhabricatorFileDocumentRenderingEngine.php', 'PhabricatorFileDropUploadController' => 'applications/files/controller/PhabricatorFileDropUploadController.php', + 'PhabricatorFileEditController' => 'applications/files/controller/PhabricatorFileEditController.php', + 'PhabricatorFileEditEngine' => 'applications/files/editor/PhabricatorFileEditEngine.php', + 'PhabricatorFileEditField' => 'applications/transactions/editfield/PhabricatorFileEditField.php', + 'PhabricatorFileEditor' => 'applications/files/editor/PhabricatorFileEditor.php', + 'PhabricatorFileExternalRequest' => 'applications/files/storage/PhabricatorFileExternalRequest.php', + 'PhabricatorFileExternalRequestGarbageCollector' => 'applications/files/garbagecollector/PhabricatorFileExternalRequestGarbageCollector.php', + 'PhabricatorFileFilePHIDType' => 'applications/files/phid/PhabricatorFileFilePHIDType.php', + 'PhabricatorFileIconSetSelectController' => 'applications/files/controller/PhabricatorFileIconSetSelectController.php', 'PhabricatorFileImageMacro' => 'applications/macro/storage/PhabricatorFileImageMacro.php', - 'PhabricatorFileInfoController' => 'applications/files/controller/PhabricatorFileInfoController.php', - 'PhabricatorFileLinkListView' => 'view/layout/PhabricatorFileLinkListView.php', + 'PhabricatorFileImageProxyController' => 'applications/files/controller/PhabricatorFileImageProxyController.php', + 'PhabricatorFileImageTransform' => 'applications/files/transform/PhabricatorFileImageTransform.php', + 'PhabricatorFileIntegrityException' => 'applications/files/exception/PhabricatorFileIntegrityException.php', + 'PhabricatorFileLightboxController' => 'applications/files/controller/PhabricatorFileLightboxController.php', 'PhabricatorFileLinkView' => 'view/layout/PhabricatorFileLinkView.php', 'PhabricatorFileListController' => 'applications/files/controller/PhabricatorFileListController.php', - 'PhabricatorFilePHIDTypeFile' => 'applications/files/phid/PhabricatorFilePHIDTypeFile.php', + 'PhabricatorFileNameNgrams' => 'applications/files/storage/PhabricatorFileNameNgrams.php', + 'PhabricatorFileNameTransaction' => 'applications/files/xaction/PhabricatorFileNameTransaction.php', 'PhabricatorFileQuery' => 'applications/files/query/PhabricatorFileQuery.php', + 'PhabricatorFileROT13StorageFormat' => 'applications/files/format/PhabricatorFileROT13StorageFormat.php', + 'PhabricatorFileRawStorageFormat' => 'applications/files/format/PhabricatorFileRawStorageFormat.php', + 'PhabricatorFileSchemaSpec' => 'applications/files/storage/PhabricatorFileSchemaSpec.php', + 'PhabricatorFileSearchConduitAPIMethod' => 'applications/files/conduit/PhabricatorFileSearchConduitAPIMethod.php', 'PhabricatorFileSearchEngine' => 'applications/files/query/PhabricatorFileSearchEngine.php', - 'PhabricatorFileShortcutController' => 'applications/files/controller/PhabricatorFileShortcutController.php', 'PhabricatorFileStorageBlob' => 'applications/files/storage/PhabricatorFileStorageBlob.php', 'PhabricatorFileStorageConfigurationException' => 'applications/files/exception/PhabricatorFileStorageConfigurationException.php', 'PhabricatorFileStorageEngine' => 'applications/files/engine/PhabricatorFileStorageEngine.php', - 'PhabricatorFileStorageEngineSelector' => 'applications/files/engineselector/PhabricatorFileStorageEngineSelector.php', + 'PhabricatorFileStorageEngineTestCase' => 'applications/files/engine/__tests__/PhabricatorFileStorageEngineTestCase.php', + 'PhabricatorFileStorageFormat' => 'applications/files/format/PhabricatorFileStorageFormat.php', + 'PhabricatorFileStorageFormatTestCase' => 'applications/files/format/__tests__/PhabricatorFileStorageFormatTestCase.php', + 'PhabricatorFileTemporaryGarbageCollector' => 'applications/files/garbagecollector/PhabricatorFileTemporaryGarbageCollector.php', 'PhabricatorFileTestCase' => 'applications/files/storage/__tests__/PhabricatorFileTestCase.php', 'PhabricatorFileTestDataGenerator' => 'applications/files/lipsum/PhabricatorFileTestDataGenerator.php', + 'PhabricatorFileThumbnailTransform' => 'applications/files/transform/PhabricatorFileThumbnailTransform.php', + 'PhabricatorFileTransaction' => 'applications/files/storage/PhabricatorFileTransaction.php', + 'PhabricatorFileTransactionComment' => 'applications/files/storage/PhabricatorFileTransactionComment.php', + 'PhabricatorFileTransactionQuery' => 'applications/files/query/PhabricatorFileTransactionQuery.php', + 'PhabricatorFileTransactionType' => 'applications/files/xaction/PhabricatorFileTransactionType.php', + 'PhabricatorFileTransform' => 'applications/files/transform/PhabricatorFileTransform.php', 'PhabricatorFileTransformController' => 'applications/files/controller/PhabricatorFileTransformController.php', + 'PhabricatorFileTransformListController' => 'applications/files/controller/PhabricatorFileTransformListController.php', + 'PhabricatorFileTransformTestCase' => 'applications/files/transform/__tests__/PhabricatorFileTransformTestCase.php', + 'PhabricatorFileUICurtainAttachController' => 'applications/files/controller/PhabricatorFileUICurtainAttachController.php', + 'PhabricatorFileUICurtainListController' => 'applications/files/controller/PhabricatorFileUICurtainListController.php', 'PhabricatorFileUploadController' => 'applications/files/controller/PhabricatorFileUploadController.php', 'PhabricatorFileUploadDialogController' => 'applications/files/controller/PhabricatorFileUploadDialogController.php', 'PhabricatorFileUploadException' => 'applications/files/exception/PhabricatorFileUploadException.php', + 'PhabricatorFileUploadSource' => 'applications/files/uploadsource/PhabricatorFileUploadSource.php', + 'PhabricatorFileUploadSourceByteLimitException' => 'applications/files/uploadsource/PhabricatorFileUploadSourceByteLimitException.php', + 'PhabricatorFileViewController' => 'applications/files/controller/PhabricatorFileViewController.php', + 'PhabricatorFileinfoSetupCheck' => 'applications/config/check/PhabricatorFileinfoSetupCheck.php', + 'PhabricatorFilesApplication' => 'applications/files/application/PhabricatorFilesApplication.php', + 'PhabricatorFilesApplicationStorageEnginePanel' => 'applications/files/applicationpanel/PhabricatorFilesApplicationStorageEnginePanel.php', + 'PhabricatorFilesBuiltinFile' => 'applications/files/builtin/PhabricatorFilesBuiltinFile.php', + 'PhabricatorFilesComposeAvatarBuiltinFile' => 'applications/files/builtin/PhabricatorFilesComposeAvatarBuiltinFile.php', + 'PhabricatorFilesComposeIconBuiltinFile' => 'applications/files/builtin/PhabricatorFilesComposeIconBuiltinFile.php', 'PhabricatorFilesConfigOptions' => 'applications/files/config/PhabricatorFilesConfigOptions.php', + 'PhabricatorFilesCurtainExtension' => 'applications/files/engineextension/PhabricatorFilesCurtainExtension.php', + 'PhabricatorFilesManagementCatWorkflow' => 'applications/files/management/PhabricatorFilesManagementCatWorkflow.php', + 'PhabricatorFilesManagementCompactWorkflow' => 'applications/files/management/PhabricatorFilesManagementCompactWorkflow.php', + 'PhabricatorFilesManagementCycleWorkflow' => 'applications/files/management/PhabricatorFilesManagementCycleWorkflow.php', + 'PhabricatorFilesManagementEncodeWorkflow' => 'applications/files/management/PhabricatorFilesManagementEncodeWorkflow.php', 'PhabricatorFilesManagementEnginesWorkflow' => 'applications/files/management/PhabricatorFilesManagementEnginesWorkflow.php', + 'PhabricatorFilesManagementGenerateKeyWorkflow' => 'applications/files/management/PhabricatorFilesManagementGenerateKeyWorkflow.php', + 'PhabricatorFilesManagementIntegrityWorkflow' => 'applications/files/management/PhabricatorFilesManagementIntegrityWorkflow.php', 'PhabricatorFilesManagementMigrateWorkflow' => 'applications/files/management/PhabricatorFilesManagementMigrateWorkflow.php', - 'PhabricatorFilesManagementPurgeWorkflow' => 'applications/files/management/PhabricatorFilesManagementPurgeWorkflow.php', 'PhabricatorFilesManagementRebuildWorkflow' => 'applications/files/management/PhabricatorFilesManagementRebuildWorkflow.php', 'PhabricatorFilesManagementWorkflow' => 'applications/files/management/PhabricatorFilesManagementWorkflow.php', + 'PhabricatorFilesOnDiskBuiltinFile' => 'applications/files/builtin/PhabricatorFilesOnDiskBuiltinFile.php', + 'PhabricatorFilesOutboundRequestAction' => 'applications/files/action/PhabricatorFilesOutboundRequestAction.php', + 'PhabricatorFiletreeVisibleSetting' => 'applications/settings/setting/PhabricatorFiletreeVisibleSetting.php', + 'PhabricatorFiletreeWidthSetting' => 'applications/settings/setting/PhabricatorFiletreeWidthSetting.php', 'PhabricatorFlag' => 'applications/flag/storage/PhabricatorFlag.php', + 'PhabricatorFlagAddFlagHeraldAction' => 'applications/flag/herald/PhabricatorFlagAddFlagHeraldAction.php', 'PhabricatorFlagColor' => 'applications/flag/constants/PhabricatorFlagColor.php', 'PhabricatorFlagConstants' => 'applications/flag/constants/PhabricatorFlagConstants.php', 'PhabricatorFlagController' => 'applications/flag/controller/PhabricatorFlagController.php', 'PhabricatorFlagDAO' => 'applications/flag/storage/PhabricatorFlagDAO.php', 'PhabricatorFlagDeleteController' => 'applications/flag/controller/PhabricatorFlagDeleteController.php', + 'PhabricatorFlagDestructionEngineExtension' => 'applications/flag/engineextension/PhabricatorFlagDestructionEngineExtension.php', 'PhabricatorFlagEditController' => 'applications/flag/controller/PhabricatorFlagEditController.php', + 'PhabricatorFlagHeraldAction' => 'applications/flag/herald/PhabricatorFlagHeraldAction.php', 'PhabricatorFlagListController' => 'applications/flag/controller/PhabricatorFlagListController.php', - 'PhabricatorFlagListView' => 'applications/flag/view/PhabricatorFlagListView.php', 'PhabricatorFlagQuery' => 'applications/flag/query/PhabricatorFlagQuery.php', + 'PhabricatorFlagRemoveFlagHeraldAction' => 'applications/flag/herald/PhabricatorFlagRemoveFlagHeraldAction.php', + 'PhabricatorFlagSearchEngine' => 'applications/flag/query/PhabricatorFlagSearchEngine.php', + 'PhabricatorFlagSelectControl' => 'applications/flag/view/PhabricatorFlagSelectControl.php', + 'PhabricatorFlaggableInterface' => 'applications/flag/interface/PhabricatorFlaggableInterface.php', + 'PhabricatorFlagsApplication' => 'applications/flag/application/PhabricatorFlagsApplication.php', 'PhabricatorFlagsUIEventListener' => 'applications/flag/events/PhabricatorFlagsUIEventListener.php', - 'PhabricatorFormExample' => 'applications/uiexample/examples/PhabricatorFormExample.php', - 'PhabricatorGarbageCollectorConfigOptions' => 'applications/config/option/PhabricatorGarbageCollectorConfigOptions.php', - 'PhabricatorGarbageCollectorDaemon' => 'infrastructure/daemon/PhabricatorGarbageCollectorDaemon.php', - 'PhabricatorGestureExample' => 'applications/uiexample/examples/PhabricatorGestureExample.php', + 'PhabricatorFullLoginUserLogType' => 'applications/people/userlog/PhabricatorFullLoginUserLogType.php', + 'PhabricatorFulltextEngine' => 'applications/search/index/PhabricatorFulltextEngine.php', + 'PhabricatorFulltextEngineExtension' => 'applications/search/index/PhabricatorFulltextEngineExtension.php', + 'PhabricatorFulltextEngineExtensionModule' => 'applications/search/index/PhabricatorFulltextEngineExtensionModule.php', + 'PhabricatorFulltextIndexEngineExtension' => 'applications/search/engineextension/PhabricatorFulltextIndexEngineExtension.php', + 'PhabricatorFulltextInterface' => 'applications/search/interface/PhabricatorFulltextInterface.php', + 'PhabricatorFulltextResultSet' => 'applications/search/query/PhabricatorFulltextResultSet.php', + 'PhabricatorFulltextStorageEngine' => 'applications/search/fulltextstorage/PhabricatorFulltextStorageEngine.php', + 'PhabricatorFulltextToken' => 'applications/search/query/PhabricatorFulltextToken.php', + 'PhabricatorFundApplication' => 'applications/fund/application/PhabricatorFundApplication.php', + 'PhabricatorGDSetupCheck' => 'applications/config/check/PhabricatorGDSetupCheck.php', + 'PhabricatorGarbageCollector' => 'infrastructure/daemon/garbagecollector/PhabricatorGarbageCollector.php', + 'PhabricatorGarbageCollectorManagementCollectWorkflow' => 'infrastructure/daemon/garbagecollector/management/PhabricatorGarbageCollectorManagementCollectWorkflow.php', + 'PhabricatorGarbageCollectorManagementCompactEdgesWorkflow' => 'infrastructure/daemon/garbagecollector/management/PhabricatorGarbageCollectorManagementCompactEdgesWorkflow.php', + 'PhabricatorGarbageCollectorManagementSetPolicyWorkflow' => 'infrastructure/daemon/garbagecollector/management/PhabricatorGarbageCollectorManagementSetPolicyWorkflow.php', + 'PhabricatorGarbageCollectorManagementWorkflow' => 'infrastructure/daemon/garbagecollector/management/PhabricatorGarbageCollectorManagementWorkflow.php', + 'PhabricatorGeneralCachePurger' => 'applications/cache/purger/PhabricatorGeneralCachePurger.php', + 'PhabricatorGestureUIExample' => 'applications/uiexample/examples/PhabricatorGestureUIExample.php', 'PhabricatorGitGraphStream' => 'applications/repository/daemon/PhabricatorGitGraphStream.php', + 'PhabricatorGitHubAuthProvider' => 'applications/auth/provider/PhabricatorGitHubAuthProvider.php', 'PhabricatorGlobalLock' => 'infrastructure/util/PhabricatorGlobalLock.php', + 'PhabricatorGlobalLockTestCase' => 'infrastructure/util/__tests__/PhabricatorGlobalLockTestCase.php', 'PhabricatorGlobalUploadTargetView' => 'applications/files/view/PhabricatorGlobalUploadTargetView.php', + 'PhabricatorGoogleAuthProvider' => 'applications/auth/provider/PhabricatorGoogleAuthProvider.php', + 'PhabricatorGuidanceContext' => 'applications/guides/guidance/PhabricatorGuidanceContext.php', + 'PhabricatorGuidanceEngine' => 'applications/guides/guidance/PhabricatorGuidanceEngine.php', + 'PhabricatorGuidanceEngineExtension' => 'applications/guides/guidance/PhabricatorGuidanceEngineExtension.php', + 'PhabricatorGuidanceMessage' => 'applications/guides/guidance/PhabricatorGuidanceMessage.php', + 'PhabricatorGuideApplication' => 'applications/guides/application/PhabricatorGuideApplication.php', + 'PhabricatorGuideController' => 'applications/guides/controller/PhabricatorGuideController.php', + 'PhabricatorGuideInstallModule' => 'applications/guides/module/PhabricatorGuideInstallModule.php', + 'PhabricatorGuideItemView' => 'applications/guides/view/PhabricatorGuideItemView.php', + 'PhabricatorGuideListView' => 'applications/guides/view/PhabricatorGuideListView.php', + 'PhabricatorGuideModule' => 'applications/guides/module/PhabricatorGuideModule.php', + 'PhabricatorGuideModuleController' => 'applications/guides/controller/PhabricatorGuideModuleController.php', + 'PhabricatorGuideQuickStartModule' => 'applications/guides/module/PhabricatorGuideQuickStartModule.php', + 'PhabricatorHMACTestCase' => 'infrastructure/util/__tests__/PhabricatorHMACTestCase.php', + 'PhabricatorHTTPParameterTypeTableView' => 'applications/config/view/PhabricatorHTTPParameterTypeTableView.php', + 'PhabricatorHandleList' => 'applications/phid/handle/pool/PhabricatorHandleList.php', 'PhabricatorHandleObjectSelectorDataView' => 'applications/phid/handle/view/PhabricatorHandleObjectSelectorDataView.php', + 'PhabricatorHandlePool' => 'applications/phid/handle/pool/PhabricatorHandlePool.php', + 'PhabricatorHandlePoolTestCase' => 'applications/phid/handle/pool/__tests__/PhabricatorHandlePoolTestCase.php', 'PhabricatorHandleQuery' => 'applications/phid/query/PhabricatorHandleQuery.php', + 'PhabricatorHandleRemarkupRule' => 'applications/phid/remarkup/PhabricatorHandleRemarkupRule.php', + 'PhabricatorHandlesEditField' => 'applications/transactions/editfield/PhabricatorHandlesEditField.php', + 'PhabricatorHarbormasterApplication' => 'applications/harbormaster/application/PhabricatorHarbormasterApplication.php', 'PhabricatorHash' => 'infrastructure/util/PhabricatorHash.php', 'PhabricatorHashTestCase' => 'infrastructure/util/__tests__/PhabricatorHashTestCase.php', - 'PhabricatorHeaderView' => 'view/layout/PhabricatorHeaderView.php', + 'PhabricatorHelpApplication' => 'applications/help/application/PhabricatorHelpApplication.php', 'PhabricatorHelpController' => 'applications/help/controller/PhabricatorHelpController.php', + 'PhabricatorHelpDocumentationController' => 'applications/help/controller/PhabricatorHelpDocumentationController.php', 'PhabricatorHelpKeyboardShortcutController' => 'applications/help/controller/PhabricatorHelpKeyboardShortcutController.php', - 'PhabricatorHovercardExample' => 'applications/uiexample/examples/PhabricatorHovercardExample.php', - 'PhabricatorHovercardView' => 'view/widget/hovercard/PhabricatorHovercardView.php', - 'PhabricatorIRCBot' => 'infrastructure/daemon/bot/PhabricatorIRCBot.php', - 'PhabricatorIRCProtocolAdapter' => 'infrastructure/daemon/bot/adapter/PhabricatorIRCProtocolAdapter.php', - 'PhabricatorIRCProtocolHandler' => 'infrastructure/daemon/bot/handler/PhabricatorIRCProtocolHandler.php', + 'PhabricatorHeraldApplication' => 'applications/herald/application/PhabricatorHeraldApplication.php', + 'PhabricatorHeraldContentSource' => 'applications/herald/contentsource/PhabricatorHeraldContentSource.php', + 'PhabricatorHexdumpDocumentEngine' => 'applications/files/document/PhabricatorHexdumpDocumentEngine.php', + 'PhabricatorHighSecurityRequestExceptionHandler' => 'aphront/handler/PhabricatorHighSecurityRequestExceptionHandler.php', + 'PhabricatorHigherOrderChartFunction' => 'applications/fact/chart/PhabricatorHigherOrderChartFunction.php', + 'PhabricatorHomeApplication' => 'applications/home/application/PhabricatorHomeApplication.php', + 'PhabricatorHomeConstants' => 'applications/home/constants/PhabricatorHomeConstants.php', + 'PhabricatorHomeController' => 'applications/home/controller/PhabricatorHomeController.php', + 'PhabricatorHomeLauncherProfileMenuItem' => 'applications/home/menuitem/PhabricatorHomeLauncherProfileMenuItem.php', + 'PhabricatorHomeMenuItemController' => 'applications/home/controller/PhabricatorHomeMenuItemController.php', + 'PhabricatorHomeProfileMenuEngine' => 'applications/home/engine/PhabricatorHomeProfileMenuEngine.php', + 'PhabricatorHomeProfileMenuItem' => 'applications/home/menuitem/PhabricatorHomeProfileMenuItem.php', + 'PhabricatorHovercardEngineExtension' => 'applications/search/engineextension/PhabricatorHovercardEngineExtension.php', + 'PhabricatorHovercardEngineExtensionModule' => 'applications/search/engineextension/PhabricatorHovercardEngineExtensionModule.php', + 'PhabricatorIDExportField' => 'infrastructure/export/field/PhabricatorIDExportField.php', + 'PhabricatorIDsSearchEngineExtension' => 'applications/search/engineextension/PhabricatorIDsSearchEngineExtension.php', + 'PhabricatorIDsSearchField' => 'applications/search/field/PhabricatorIDsSearchField.php', + 'PhabricatorIconDatasource' => 'applications/files/typeahead/PhabricatorIconDatasource.php', + 'PhabricatorIconRemarkupRule' => 'applications/macro/markup/PhabricatorIconRemarkupRule.php', + 'PhabricatorIconSet' => 'applications/files/iconset/PhabricatorIconSet.php', + 'PhabricatorIconSetEditField' => 'applications/transactions/editfield/PhabricatorIconSetEditField.php', + 'PhabricatorIconSetIcon' => 'applications/files/iconset/PhabricatorIconSetIcon.php', + 'PhabricatorImageDocumentEngine' => 'applications/files/document/PhabricatorImageDocumentEngine.php', + 'PhabricatorImageMacroRemarkupRule' => 'applications/macro/markup/PhabricatorImageMacroRemarkupRule.php', + 'PhabricatorImageRemarkupRule' => 'applications/files/markup/PhabricatorImageRemarkupRule.php', 'PhabricatorImageTransformer' => 'applications/files/PhabricatorImageTransformer.php', - 'PhabricatorInfrastructureTestCase' => 'infrastructure/__tests__/PhabricatorInfrastructureTestCase.php', + 'PhabricatorImagemagickSetupCheck' => 'applications/config/check/PhabricatorImagemagickSetupCheck.php', + 'PhabricatorInFlightErrorView' => 'applications/config/view/PhabricatorInFlightErrorView.php', + 'PhabricatorIndexEngine' => 'applications/search/index/PhabricatorIndexEngine.php', + 'PhabricatorIndexEngineExtension' => 'applications/search/index/PhabricatorIndexEngineExtension.php', + 'PhabricatorIndexEngineExtensionModule' => 'applications/search/index/PhabricatorIndexEngineExtensionModule.php', + 'PhabricatorIndexableInterface' => 'applications/search/interface/PhabricatorIndexableInterface.php', + 'PhabricatorInfrastructureTestCase' => '__tests__/PhabricatorInfrastructureTestCase.php', + 'PhabricatorInlineComment' => 'infrastructure/diff/interface/PhabricatorInlineComment.php', + 'PhabricatorInlineCommentAdjustmentEngine' => 'infrastructure/diff/engine/PhabricatorInlineCommentAdjustmentEngine.php', + 'PhabricatorInlineCommentContentState' => 'infrastructure/diff/inline/PhabricatorInlineCommentContentState.php', + 'PhabricatorInlineCommentContext' => 'infrastructure/diff/inline/PhabricatorInlineCommentContext.php', 'PhabricatorInlineCommentController' => 'infrastructure/diff/PhabricatorInlineCommentController.php', - 'PhabricatorInlineCommentInterface' => 'infrastructure/diff/interface/PhabricatorInlineCommentInterface.php', - 'PhabricatorInlineCommentPreviewController' => 'infrastructure/diff/PhabricatorInlineCommentPreviewController.php', + 'PhabricatorInlineCommentInterface' => 'applications/transactions/interface/PhabricatorInlineCommentInterface.php', 'PhabricatorInlineSummaryView' => 'infrastructure/diff/view/PhabricatorInlineSummaryView.php', + 'PhabricatorInstructionsEditField' => 'applications/transactions/editfield/PhabricatorInstructionsEditField.php', + 'PhabricatorIntConfigType' => 'applications/config/type/PhabricatorIntConfigType.php', + 'PhabricatorIntEditField' => 'applications/transactions/editfield/PhabricatorIntEditField.php', + 'PhabricatorIntExportField' => 'infrastructure/export/field/PhabricatorIntExportField.php', + 'PhabricatorInternalSetting' => 'applications/settings/setting/PhabricatorInternalSetting.php', + 'PhabricatorInternationalizationManagementExtractWorkflow' => 'infrastructure/internationalization/management/PhabricatorInternationalizationManagementExtractWorkflow.php', + 'PhabricatorInternationalizationManagementWorkflow' => 'infrastructure/internationalization/management/PhabricatorInternationalizationManagementWorkflow.php', + 'PhabricatorInvalidConfigSetupCheck' => 'applications/config/check/PhabricatorInvalidConfigSetupCheck.php', + 'PhabricatorInvalidQueryCursorException' => 'infrastructure/query/exception/PhabricatorInvalidQueryCursorException.php', + 'PhabricatorIteratedMD5PasswordHasher' => 'infrastructure/util/password/PhabricatorIteratedMD5PasswordHasher.php', + 'PhabricatorIteratedMD5PasswordHasherTestCase' => 'infrastructure/util/password/__tests__/PhabricatorIteratedMD5PasswordHasherTestCase.php', + 'PhabricatorIteratorFileUploadSource' => 'applications/files/uploadsource/PhabricatorIteratorFileUploadSource.php', + 'PhabricatorJIRAAuthProvider' => 'applications/auth/provider/PhabricatorJIRAAuthProvider.php', + 'PhabricatorJSONConfigType' => 'applications/config/type/PhabricatorJSONConfigType.php', + 'PhabricatorJSONDocumentEngine' => 'applications/files/document/PhabricatorJSONDocumentEngine.php', + 'PhabricatorJSONExportFormat' => 'infrastructure/export/format/PhabricatorJSONExportFormat.php', 'PhabricatorJavelinLinter' => 'infrastructure/lint/linter/PhabricatorJavelinLinter.php', - 'PhabricatorJumpNavHandler' => 'applications/search/engine/PhabricatorJumpNavHandler.php', + 'PhabricatorJiraIssueHasObjectEdgeType' => 'applications/doorkeeper/edge/PhabricatorJiraIssueHasObjectEdgeType.php', + 'PhabricatorJupyterDocumentEngine' => 'applications/files/document/PhabricatorJupyterDocumentEngine.php', 'PhabricatorKeyValueDatabaseCache' => 'applications/cache/PhabricatorKeyValueDatabaseCache.php', - 'PhabricatorLegalpadConfigOptions' => 'applications/legalpad/config/PhabricatorLegalpadConfigOptions.php', - 'PhabricatorLegalpadPHIDTypeDocument' => 'applications/legalpad/phid/PhabricatorLegalpadPHIDTypeDocument.php', - 'PhabricatorLintEngine' => 'infrastructure/lint/PhabricatorLintEngine.php', + 'PhabricatorKeyValueSerializingCacheProxy' => 'applications/cache/PhabricatorKeyValueSerializingCacheProxy.php', + 'PhabricatorKeyboardRemarkupRule' => 'infrastructure/markup/rule/PhabricatorKeyboardRemarkupRule.php', + 'PhabricatorKeyring' => 'applications/files/keyring/PhabricatorKeyring.php', + 'PhabricatorKeyringConfigOptionType' => 'applications/files/keyring/PhabricatorKeyringConfigOptionType.php', + 'PhabricatorLDAPAuthProvider' => 'applications/auth/provider/PhabricatorLDAPAuthProvider.php', + 'PhabricatorLabelProfileMenuItem' => 'applications/search/menuitem/PhabricatorLabelProfileMenuItem.php', + 'PhabricatorLanguageSettingsPanel' => 'applications/settings/panel/PhabricatorLanguageSettingsPanel.php', + 'PhabricatorLegalpadApplication' => 'applications/legalpad/application/PhabricatorLegalpadApplication.php', + 'PhabricatorLegalpadDocumentPHIDType' => 'applications/legalpad/phid/PhabricatorLegalpadDocumentPHIDType.php', + 'PhabricatorLegalpadSignaturePolicyRule' => 'applications/legalpad/policyrule/PhabricatorLegalpadSignaturePolicyRule.php', + 'PhabricatorLibraryTestCase' => '__tests__/PhabricatorLibraryTestCase.php', + 'PhabricatorLinkProfileMenuItem' => 'applications/search/menuitem/PhabricatorLinkProfileMenuItem.php', 'PhabricatorLipsumArtist' => 'applications/lipsum/image/PhabricatorLipsumArtist.php', + 'PhabricatorLipsumContentSource' => 'infrastructure/contentsource/PhabricatorLipsumContentSource.php', 'PhabricatorLipsumGenerateWorkflow' => 'applications/lipsum/management/PhabricatorLipsumGenerateWorkflow.php', 'PhabricatorLipsumManagementWorkflow' => 'applications/lipsum/management/PhabricatorLipsumManagementWorkflow.php', 'PhabricatorLipsumMondrianArtist' => 'applications/lipsum/image/PhabricatorLipsumMondrianArtist.php', 'PhabricatorLiskDAO' => 'infrastructure/storage/lisk/PhabricatorLiskDAO.php', + 'PhabricatorLiskExportEngineExtension' => 'infrastructure/export/engine/PhabricatorLiskExportEngineExtension.php', + 'PhabricatorLiskFulltextEngineExtension' => 'applications/search/engineextension/PhabricatorLiskFulltextEngineExtension.php', + 'PhabricatorLiskSearchEngineExtension' => 'applications/search/engineextension/PhabricatorLiskSearchEngineExtension.php', + 'PhabricatorLiskSerializer' => 'infrastructure/storage/lisk/PhabricatorLiskSerializer.php', + 'PhabricatorListExportField' => 'infrastructure/export/field/PhabricatorListExportField.php', 'PhabricatorLocalDiskFileStorageEngine' => 'applications/files/engine/PhabricatorLocalDiskFileStorageEngine.php', 'PhabricatorLocalTimeTestCase' => 'view/__tests__/PhabricatorLocalTimeTestCase.php', + 'PhabricatorLocaleScopeGuard' => 'infrastructure/internationalization/scope/PhabricatorLocaleScopeGuard.php', + 'PhabricatorLocaleScopeGuardTestCase' => 'infrastructure/internationalization/scope/__tests__/PhabricatorLocaleScopeGuardTestCase.php', + 'PhabricatorLockLogManagementWorkflow' => 'applications/daemon/management/PhabricatorLockLogManagementWorkflow.php', + 'PhabricatorLockManagementWorkflow' => 'applications/daemon/management/PhabricatorLockManagementWorkflow.php', + 'PhabricatorLogTriggerAction' => 'infrastructure/daemon/workers/action/PhabricatorLogTriggerAction.php', + 'PhabricatorLoginFailureUserLogType' => 'applications/people/userlog/PhabricatorLoginFailureUserLogType.php', + 'PhabricatorLoginUserLogType' => 'applications/people/userlog/PhabricatorLoginUserLogType.php', 'PhabricatorLogoutController' => 'applications/auth/controller/PhabricatorLogoutController.php', - 'PhabricatorMacroCommentController' => 'applications/macro/controller/PhabricatorMacroCommentController.php', - 'PhabricatorMacroConfigOptions' => 'applications/macro/config/PhabricatorMacroConfigOptions.php', + 'PhabricatorLogoutUserLogType' => 'applications/people/userlog/PhabricatorLogoutUserLogType.php', + 'PhabricatorLunarPhasePolicyRule' => 'applications/policy/rule/PhabricatorLunarPhasePolicyRule.php', + 'PhabricatorMacroApplication' => 'applications/macro/application/PhabricatorMacroApplication.php', + 'PhabricatorMacroAudioBehaviorTransaction' => 'applications/macro/xaction/PhabricatorMacroAudioBehaviorTransaction.php', + 'PhabricatorMacroAudioController' => 'applications/macro/controller/PhabricatorMacroAudioController.php', + 'PhabricatorMacroAudioTransaction' => 'applications/macro/xaction/PhabricatorMacroAudioTransaction.php', 'PhabricatorMacroController' => 'applications/macro/controller/PhabricatorMacroController.php', + 'PhabricatorMacroDatasource' => 'applications/macro/typeahead/PhabricatorMacroDatasource.php', 'PhabricatorMacroDisableController' => 'applications/macro/controller/PhabricatorMacroDisableController.php', + 'PhabricatorMacroDisabledTransaction' => 'applications/macro/xaction/PhabricatorMacroDisabledTransaction.php', 'PhabricatorMacroEditController' => 'applications/macro/controller/PhabricatorMacroEditController.php', + 'PhabricatorMacroEditEngine' => 'applications/macro/editor/PhabricatorMacroEditEngine.php', 'PhabricatorMacroEditor' => 'applications/macro/editor/PhabricatorMacroEditor.php', + 'PhabricatorMacroFileTransaction' => 'applications/macro/xaction/PhabricatorMacroFileTransaction.php', 'PhabricatorMacroListController' => 'applications/macro/controller/PhabricatorMacroListController.php', + 'PhabricatorMacroMacroPHIDType' => 'applications/macro/phid/PhabricatorMacroMacroPHIDType.php', 'PhabricatorMacroMailReceiver' => 'applications/macro/mail/PhabricatorMacroMailReceiver.php', + 'PhabricatorMacroManageCapability' => 'applications/macro/capability/PhabricatorMacroManageCapability.php', 'PhabricatorMacroMemeController' => 'applications/macro/controller/PhabricatorMacroMemeController.php', 'PhabricatorMacroMemeDialogController' => 'applications/macro/controller/PhabricatorMacroMemeDialogController.php', - 'PhabricatorMacroPHIDTypeMacro' => 'applications/macro/phid/PhabricatorMacroPHIDTypeMacro.php', + 'PhabricatorMacroNameTransaction' => 'applications/macro/xaction/PhabricatorMacroNameTransaction.php', 'PhabricatorMacroQuery' => 'applications/macro/query/PhabricatorMacroQuery.php', 'PhabricatorMacroReplyHandler' => 'applications/macro/mail/PhabricatorMacroReplyHandler.php', 'PhabricatorMacroSearchEngine' => 'applications/macro/query/PhabricatorMacroSearchEngine.php', + 'PhabricatorMacroTestCase' => 'applications/macro/xaction/__tests__/PhabricatorMacroTestCase.php', 'PhabricatorMacroTransaction' => 'applications/macro/storage/PhabricatorMacroTransaction.php', 'PhabricatorMacroTransactionComment' => 'applications/macro/storage/PhabricatorMacroTransactionComment.php', 'PhabricatorMacroTransactionQuery' => 'applications/macro/query/PhabricatorMacroTransactionQuery.php', - 'PhabricatorMacroTransactionType' => 'applications/macro/constants/PhabricatorMacroTransactionType.php', + 'PhabricatorMacroTransactionType' => 'applications/macro/xaction/PhabricatorMacroTransactionType.php', 'PhabricatorMacroViewController' => 'applications/macro/controller/PhabricatorMacroViewController.php', - 'PhabricatorMail' => 'applications/metamta/PhabricatorMail.php', - 'PhabricatorMailImplementationAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationAdapter.php', - 'PhabricatorMailImplementationAmazonSESAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationAmazonSESAdapter.php', - 'PhabricatorMailImplementationPHPMailerAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationPHPMailerAdapter.php', - 'PhabricatorMailImplementationPHPMailerLiteAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationPHPMailerLiteAdapter.php', - 'PhabricatorMailImplementationSendGridAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationSendGridAdapter.php', - 'PhabricatorMailImplementationTestAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationTestAdapter.php', + 'PhabricatorMailAdapter' => 'applications/metamta/adapter/PhabricatorMailAdapter.php', + 'PhabricatorMailAdapterTestCase' => 'applications/metamta/adapter/__tests__/PhabricatorMailAdapterTestCase.php', + 'PhabricatorMailAmazonSESAdapter' => 'applications/metamta/adapter/PhabricatorMailAmazonSESAdapter.php', + 'PhabricatorMailAmazonSNSAdapter' => 'applications/metamta/adapter/PhabricatorMailAmazonSNSAdapter.php', + 'PhabricatorMailAttachment' => 'applications/metamta/message/PhabricatorMailAttachment.php', + 'PhabricatorMailConfigTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMailConfigTestCase.php', + 'PhabricatorMailEmailEngine' => 'applications/metamta/engine/PhabricatorMailEmailEngine.php', + 'PhabricatorMailEmailHeraldField' => 'applications/metamta/herald/PhabricatorMailEmailHeraldField.php', + 'PhabricatorMailEmailHeraldFieldGroup' => 'applications/metamta/herald/PhabricatorMailEmailHeraldFieldGroup.php', + 'PhabricatorMailEmailMessage' => 'applications/metamta/message/PhabricatorMailEmailMessage.php', + 'PhabricatorMailEmailSubjectHeraldField' => 'applications/metamta/herald/PhabricatorMailEmailSubjectHeraldField.php', + 'PhabricatorMailEngineExtension' => 'applications/metamta/engine/PhabricatorMailEngineExtension.php', + 'PhabricatorMailExternalMessage' => 'applications/metamta/message/PhabricatorMailExternalMessage.php', + 'PhabricatorMailHeader' => 'applications/metamta/message/PhabricatorMailHeader.php', + 'PhabricatorMailMailgunAdapter' => 'applications/metamta/adapter/PhabricatorMailMailgunAdapter.php', 'PhabricatorMailManagementListInboundWorkflow' => 'applications/metamta/management/PhabricatorMailManagementListInboundWorkflow.php', 'PhabricatorMailManagementListOutboundWorkflow' => 'applications/metamta/management/PhabricatorMailManagementListOutboundWorkflow.php', 'PhabricatorMailManagementReceiveTestWorkflow' => 'applications/metamta/management/PhabricatorMailManagementReceiveTestWorkflow.php', @@ -1259,391 +3753,1282 @@ 'PhabricatorMailManagementSendTestWorkflow' => 'applications/metamta/management/PhabricatorMailManagementSendTestWorkflow.php', 'PhabricatorMailManagementShowInboundWorkflow' => 'applications/metamta/management/PhabricatorMailManagementShowInboundWorkflow.php', 'PhabricatorMailManagementShowOutboundWorkflow' => 'applications/metamta/management/PhabricatorMailManagementShowOutboundWorkflow.php', + 'PhabricatorMailManagementUnverifyWorkflow' => 'applications/metamta/management/PhabricatorMailManagementUnverifyWorkflow.php', + 'PhabricatorMailManagementVolumeWorkflow' => 'applications/metamta/management/PhabricatorMailManagementVolumeWorkflow.php', 'PhabricatorMailManagementWorkflow' => 'applications/metamta/management/PhabricatorMailManagementWorkflow.php', + 'PhabricatorMailMessageEngine' => 'applications/metamta/engine/PhabricatorMailMessageEngine.php', + 'PhabricatorMailMustEncryptHeraldAction' => 'applications/metamta/herald/PhabricatorMailMustEncryptHeraldAction.php', + 'PhabricatorMailOutboundMailHeraldAdapter' => 'applications/metamta/herald/PhabricatorMailOutboundMailHeraldAdapter.php', + 'PhabricatorMailOutboundRoutingHeraldAction' => 'applications/metamta/herald/PhabricatorMailOutboundRoutingHeraldAction.php', + 'PhabricatorMailOutboundRoutingSelfEmailHeraldAction' => 'applications/metamta/herald/PhabricatorMailOutboundRoutingSelfEmailHeraldAction.php', + 'PhabricatorMailOutboundRoutingSelfNotificationHeraldAction' => 'applications/metamta/herald/PhabricatorMailOutboundRoutingSelfNotificationHeraldAction.php', + 'PhabricatorMailOutboundStatus' => 'applications/metamta/constants/PhabricatorMailOutboundStatus.php', + 'PhabricatorMailPostmarkAdapter' => 'applications/metamta/adapter/PhabricatorMailPostmarkAdapter.php', + 'PhabricatorMailPropertiesDestructionEngineExtension' => 'applications/metamta/engineextension/PhabricatorMailPropertiesDestructionEngineExtension.php', 'PhabricatorMailReceiver' => 'applications/metamta/receiver/PhabricatorMailReceiver.php', 'PhabricatorMailReceiverTestCase' => 'applications/metamta/receiver/__tests__/PhabricatorMailReceiverTestCase.php', 'PhabricatorMailReplyHandler' => 'applications/metamta/replyhandler/PhabricatorMailReplyHandler.php', - 'PhabricatorMailingListPHIDTypeList' => 'applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php', - 'PhabricatorMailingListQuery' => 'applications/mailinglists/query/PhabricatorMailingListQuery.php', - 'PhabricatorMailingListSearchEngine' => 'applications/mailinglists/query/PhabricatorMailingListSearchEngine.php', - 'PhabricatorMailingListsController' => 'applications/mailinglists/controller/PhabricatorMailingListsController.php', - 'PhabricatorMailingListsEditController' => 'applications/mailinglists/controller/PhabricatorMailingListsEditController.php', - 'PhabricatorMailingListsListController' => 'applications/mailinglists/controller/PhabricatorMailingListsListController.php', - 'PhabricatorMainMenuGroupView' => 'view/page/menu/PhabricatorMainMenuGroupView.php', - 'PhabricatorMainMenuIconView' => 'view/page/menu/PhabricatorMainMenuIconView.php', + 'PhabricatorMailRoutingRule' => 'applications/metamta/constants/PhabricatorMailRoutingRule.php', + 'PhabricatorMailSMSEngine' => 'applications/metamta/engine/PhabricatorMailSMSEngine.php', + 'PhabricatorMailSMSMessage' => 'applications/metamta/message/PhabricatorMailSMSMessage.php', + 'PhabricatorMailSMTPAdapter' => 'applications/metamta/adapter/PhabricatorMailSMTPAdapter.php', + 'PhabricatorMailSendGridAdapter' => 'applications/metamta/adapter/PhabricatorMailSendGridAdapter.php', + 'PhabricatorMailSendmailAdapter' => 'applications/metamta/adapter/PhabricatorMailSendmailAdapter.php', + 'PhabricatorMailSetupCheck' => 'applications/config/check/PhabricatorMailSetupCheck.php', + 'PhabricatorMailStamp' => 'applications/metamta/stamp/PhabricatorMailStamp.php', + 'PhabricatorMailTarget' => 'applications/metamta/replyhandler/PhabricatorMailTarget.php', + 'PhabricatorMailTestAdapter' => 'applications/metamta/adapter/PhabricatorMailTestAdapter.php', + 'PhabricatorMailTwilioAdapter' => 'applications/metamta/adapter/PhabricatorMailTwilioAdapter.php', + 'PhabricatorMailUtil' => 'applications/metamta/util/PhabricatorMailUtil.php', + 'PhabricatorMainMenuBarExtension' => 'view/page/menu/PhabricatorMainMenuBarExtension.php', 'PhabricatorMainMenuSearchView' => 'view/page/menu/PhabricatorMainMenuSearchView.php', 'PhabricatorMainMenuView' => 'view/page/menu/PhabricatorMainMenuView.php', + 'PhabricatorManageProfileMenuItem' => 'applications/search/menuitem/PhabricatorManageProfileMenuItem.php', + 'PhabricatorManagementWorkflow' => 'infrastructure/management/PhabricatorManagementWorkflow.php', + 'PhabricatorManiphestApplication' => 'applications/maniphest/application/PhabricatorManiphestApplication.php', 'PhabricatorManiphestConfigOptions' => 'applications/maniphest/config/PhabricatorManiphestConfigOptions.php', + 'PhabricatorManiphestTaskFactEngine' => 'applications/fact/engine/PhabricatorManiphestTaskFactEngine.php', 'PhabricatorManiphestTaskTestDataGenerator' => 'applications/maniphest/lipsum/PhabricatorManiphestTaskTestDataGenerator.php', + 'PhabricatorManualActivitySetupCheck' => 'applications/config/check/PhabricatorManualActivitySetupCheck.php', 'PhabricatorMarkupCache' => 'applications/cache/storage/PhabricatorMarkupCache.php', 'PhabricatorMarkupEngine' => 'infrastructure/markup/PhabricatorMarkupEngine.php', + 'PhabricatorMarkupEngineTestCase' => 'infrastructure/markup/__tests__/PhabricatorMarkupEngineTestCase.php', 'PhabricatorMarkupInterface' => 'infrastructure/markup/PhabricatorMarkupInterface.php', 'PhabricatorMarkupOneOff' => 'infrastructure/markup/PhabricatorMarkupOneOff.php', 'PhabricatorMarkupPreviewController' => 'infrastructure/markup/PhabricatorMarkupPreviewController.php', + 'PhabricatorMaxChartFunction' => 'applications/fact/chart/PhabricatorMaxChartFunction.php', + 'PhabricatorMemeEngine' => 'applications/macro/engine/PhabricatorMemeEngine.php', + 'PhabricatorMemeRemarkupRule' => 'applications/macro/markup/PhabricatorMemeRemarkupRule.php', + 'PhabricatorMentionRemarkupRule' => 'applications/people/markup/PhabricatorMentionRemarkupRule.php', + 'PhabricatorMentionableInterface' => 'applications/transactions/interface/PhabricatorMentionableInterface.php', 'PhabricatorMercurialGraphStream' => 'applications/repository/daemon/PhabricatorMercurialGraphStream.php', 'PhabricatorMetaMTAActor' => 'applications/metamta/query/PhabricatorMetaMTAActor.php', 'PhabricatorMetaMTAActorQuery' => 'applications/metamta/query/PhabricatorMetaMTAActorQuery.php', - 'PhabricatorMetaMTAAttachment' => 'applications/metamta/storage/PhabricatorMetaMTAAttachment.php', + 'PhabricatorMetaMTAApplication' => 'applications/metamta/application/PhabricatorMetaMTAApplication.php', + 'PhabricatorMetaMTAApplicationEmail' => 'applications/metamta/storage/PhabricatorMetaMTAApplicationEmail.php', + 'PhabricatorMetaMTAApplicationEmailDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAApplicationEmailDatasource.php', + 'PhabricatorMetaMTAApplicationEmailEditor' => 'applications/metamta/editor/PhabricatorMetaMTAApplicationEmailEditor.php', + 'PhabricatorMetaMTAApplicationEmailHeraldField' => 'applications/metamta/herald/PhabricatorMetaMTAApplicationEmailHeraldField.php', + 'PhabricatorMetaMTAApplicationEmailPHIDType' => 'applications/phid/PhabricatorMetaMTAApplicationEmailPHIDType.php', + 'PhabricatorMetaMTAApplicationEmailPanel' => 'applications/metamta/applicationpanel/PhabricatorMetaMTAApplicationEmailPanel.php', + 'PhabricatorMetaMTAApplicationEmailQuery' => 'applications/metamta/query/PhabricatorMetaMTAApplicationEmailQuery.php', + 'PhabricatorMetaMTAApplicationEmailTransaction' => 'applications/metamta/storage/PhabricatorMetaMTAApplicationEmailTransaction.php', + 'PhabricatorMetaMTAApplicationEmailTransactionQuery' => 'applications/metamta/query/PhabricatorMetaMTAApplicationEmailTransactionQuery.php', 'PhabricatorMetaMTAConfigOptions' => 'applications/config/option/PhabricatorMetaMTAConfigOptions.php', 'PhabricatorMetaMTAController' => 'applications/metamta/controller/PhabricatorMetaMTAController.php', 'PhabricatorMetaMTADAO' => 'applications/metamta/storage/PhabricatorMetaMTADAO.php', 'PhabricatorMetaMTAEmailBodyParser' => 'applications/metamta/parser/PhabricatorMetaMTAEmailBodyParser.php', 'PhabricatorMetaMTAEmailBodyParserTestCase' => 'applications/metamta/parser/__tests__/PhabricatorMetaMTAEmailBodyParserTestCase.php', + 'PhabricatorMetaMTAEmailHeraldAction' => 'applications/metamta/herald/PhabricatorMetaMTAEmailHeraldAction.php', + 'PhabricatorMetaMTAEmailOthersHeraldAction' => 'applications/metamta/herald/PhabricatorMetaMTAEmailOthersHeraldAction.php', + 'PhabricatorMetaMTAEmailSelfHeraldAction' => 'applications/metamta/herald/PhabricatorMetaMTAEmailSelfHeraldAction.php', + 'PhabricatorMetaMTAErrorMailAction' => 'applications/metamta/action/PhabricatorMetaMTAErrorMailAction.php', 'PhabricatorMetaMTAMail' => 'applications/metamta/storage/PhabricatorMetaMTAMail.php', 'PhabricatorMetaMTAMailBody' => 'applications/metamta/view/PhabricatorMetaMTAMailBody.php', 'PhabricatorMetaMTAMailBodyTestCase' => 'applications/metamta/view/__tests__/PhabricatorMetaMTAMailBodyTestCase.php', + 'PhabricatorMetaMTAMailHasRecipientEdgeType' => 'applications/metamta/edge/PhabricatorMetaMTAMailHasRecipientEdgeType.php', + 'PhabricatorMetaMTAMailListController' => 'applications/metamta/controller/PhabricatorMetaMTAMailListController.php', + 'PhabricatorMetaMTAMailPHIDType' => 'applications/metamta/phid/PhabricatorMetaMTAMailPHIDType.php', + 'PhabricatorMetaMTAMailProperties' => 'applications/metamta/storage/PhabricatorMetaMTAMailProperties.php', + 'PhabricatorMetaMTAMailPropertiesQuery' => 'applications/metamta/query/PhabricatorMetaMTAMailPropertiesQuery.php', + 'PhabricatorMetaMTAMailQuery' => 'applications/metamta/query/PhabricatorMetaMTAMailQuery.php', + 'PhabricatorMetaMTAMailSearchEngine' => 'applications/metamta/query/PhabricatorMetaMTAMailSearchEngine.php', + 'PhabricatorMetaMTAMailSection' => 'applications/metamta/view/PhabricatorMetaMTAMailSection.php', 'PhabricatorMetaMTAMailTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMetaMTAMailTestCase.php', - 'PhabricatorMetaMTAMailingList' => 'applications/mailinglists/storage/PhabricatorMetaMTAMailingList.php', + 'PhabricatorMetaMTAMailViewController' => 'applications/metamta/controller/PhabricatorMetaMTAMailViewController.php', + 'PhabricatorMetaMTAMailableDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAMailableDatasource.php', + 'PhabricatorMetaMTAMailableFunctionDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAMailableFunctionDatasource.php', + 'PhabricatorMetaMTAMailgunReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTAMailgunReceiveController.php', + 'PhabricatorMetaMTAMemberQuery' => 'applications/metamta/query/PhabricatorMetaMTAMemberQuery.php', + 'PhabricatorMetaMTAPermanentFailureException' => 'applications/metamta/exception/PhabricatorMetaMTAPermanentFailureException.php', + 'PhabricatorMetaMTAPostmarkReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTAPostmarkReceiveController.php', 'PhabricatorMetaMTAReceivedMail' => 'applications/metamta/storage/PhabricatorMetaMTAReceivedMail.php', 'PhabricatorMetaMTAReceivedMailProcessingException' => 'applications/metamta/exception/PhabricatorMetaMTAReceivedMailProcessingException.php', 'PhabricatorMetaMTAReceivedMailTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMetaMTAReceivedMailTestCase.php', + 'PhabricatorMetaMTASchemaSpec' => 'applications/metamta/storage/PhabricatorMetaMTASchemaSpec.php', 'PhabricatorMetaMTASendGridReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTASendGridReceiveController.php', 'PhabricatorMetaMTAWorker' => 'applications/metamta/PhabricatorMetaMTAWorker.php', - 'PhabricatorMultiColumnExample' => 'applications/uiexample/examples/PhabricatorMultiColumnExample.php', + 'PhabricatorMetronome' => 'infrastructure/util/PhabricatorMetronome.php', + 'PhabricatorMetronomeTestCase' => 'infrastructure/util/__tests__/PhabricatorMetronomeTestCase.php', + 'PhabricatorMetronomicTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorMetronomicTriggerClock.php', + 'PhabricatorMinChartFunction' => 'applications/fact/chart/PhabricatorMinChartFunction.php', + 'PhabricatorModularTransaction' => 'applications/transactions/storage/PhabricatorModularTransaction.php', + 'PhabricatorModularTransactionType' => 'applications/transactions/storage/PhabricatorModularTransactionType.php', + 'PhabricatorMonogramDatasourceEngineExtension' => 'applications/typeahead/engineextension/PhabricatorMonogramDatasourceEngineExtension.php', + 'PhabricatorMonospacedFontSetting' => 'applications/settings/setting/PhabricatorMonospacedFontSetting.php', + 'PhabricatorMonospacedTextareasSetting' => 'applications/settings/setting/PhabricatorMonospacedTextareasSetting.php', + 'PhabricatorMotivatorProfileMenuItem' => 'applications/search/menuitem/PhabricatorMotivatorProfileMenuItem.php', + 'PhabricatorMultiColumnUIExample' => 'applications/uiexample/examples/PhabricatorMultiColumnUIExample.php', + 'PhabricatorMultiFactorSettingsPanel' => 'applications/settings/panel/PhabricatorMultiFactorSettingsPanel.php', + 'PhabricatorMultimeterApplication' => 'applications/multimeter/application/PhabricatorMultimeterApplication.php', 'PhabricatorMustVerifyEmailController' => 'applications/auth/controller/PhabricatorMustVerifyEmailController.php', + 'PhabricatorMutedByEdgeType' => 'applications/transactions/edges/PhabricatorMutedByEdgeType.php', + 'PhabricatorMutedEdgeType' => 'applications/transactions/edges/PhabricatorMutedEdgeType.php', 'PhabricatorMySQLConfigOptions' => 'applications/config/option/PhabricatorMySQLConfigOptions.php', 'PhabricatorMySQLFileStorageEngine' => 'applications/files/engine/PhabricatorMySQLFileStorageEngine.php', + 'PhabricatorMySQLSearchHost' => 'infrastructure/cluster/search/PhabricatorMySQLSearchHost.php', + 'PhabricatorMySQLSetupCheck' => 'applications/config/check/PhabricatorMySQLSetupCheck.php', 'PhabricatorNamedQuery' => 'applications/search/storage/PhabricatorNamedQuery.php', + 'PhabricatorNamedQueryConfig' => 'applications/search/storage/PhabricatorNamedQueryConfig.php', + 'PhabricatorNamedQueryConfigQuery' => 'applications/search/query/PhabricatorNamedQueryConfigQuery.php', 'PhabricatorNamedQueryQuery' => 'applications/search/query/PhabricatorNamedQueryQuery.php', - 'PhabricatorNoteExample' => 'applications/uiexample/examples/PhabricatorNoteExample.php', + 'PhabricatorNavigationRemarkupRule' => 'infrastructure/markup/rule/PhabricatorNavigationRemarkupRule.php', + 'PhabricatorNeverTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorNeverTriggerClock.php', + 'PhabricatorNgramsIndexEngineExtension' => 'applications/search/engineextension/PhabricatorNgramsIndexEngineExtension.php', + 'PhabricatorNgramsInterface' => 'applications/search/interface/PhabricatorNgramsInterface.php', 'PhabricatorNotificationBuilder' => 'applications/notification/builder/PhabricatorNotificationBuilder.php', 'PhabricatorNotificationClearController' => 'applications/notification/controller/PhabricatorNotificationClearController.php', + 'PhabricatorNotificationClient' => 'applications/notification/client/PhabricatorNotificationClient.php', 'PhabricatorNotificationConfigOptions' => 'applications/config/option/PhabricatorNotificationConfigOptions.php', 'PhabricatorNotificationController' => 'applications/notification/controller/PhabricatorNotificationController.php', + 'PhabricatorNotificationDestructionEngineExtension' => 'applications/notification/engineextension/PhabricatorNotificationDestructionEngineExtension.php', 'PhabricatorNotificationIndividualController' => 'applications/notification/controller/PhabricatorNotificationIndividualController.php', 'PhabricatorNotificationListController' => 'applications/notification/controller/PhabricatorNotificationListController.php', 'PhabricatorNotificationPanelController' => 'applications/notification/controller/PhabricatorNotificationPanelController.php', - 'PhabricatorNotificationQuery' => 'applications/notification/PhabricatorNotificationQuery.php', - 'PhabricatorNotificationStatusController' => 'applications/notification/controller/PhabricatorNotificationStatusController.php', + 'PhabricatorNotificationQuery' => 'applications/notification/query/PhabricatorNotificationQuery.php', + 'PhabricatorNotificationSearchEngine' => 'applications/notification/query/PhabricatorNotificationSearchEngine.php', + 'PhabricatorNotificationServerRef' => 'applications/notification/client/PhabricatorNotificationServerRef.php', + 'PhabricatorNotificationServersConfigType' => 'applications/notification/config/PhabricatorNotificationServersConfigType.php', + 'PhabricatorNotificationStatusView' => 'applications/notification/view/PhabricatorNotificationStatusView.php', + 'PhabricatorNotificationTestController' => 'applications/notification/controller/PhabricatorNotificationTestController.php', + 'PhabricatorNotificationUIExample' => 'applications/uiexample/examples/PhabricatorNotificationUIExample.php', + 'PhabricatorNotificationsApplication' => 'applications/notification/application/PhabricatorNotificationsApplication.php', + 'PhabricatorNotificationsSetting' => 'applications/settings/setting/PhabricatorNotificationsSetting.php', + 'PhabricatorNotificationsSettingsPanel' => 'applications/settings/panel/PhabricatorNotificationsSettingsPanel.php', + 'PhabricatorNuanceApplication' => 'applications/nuance/application/PhabricatorNuanceApplication.php', + 'PhabricatorOAuth1AuthProvider' => 'applications/auth/provider/PhabricatorOAuth1AuthProvider.php', + 'PhabricatorOAuth1SecretTemporaryTokenType' => 'applications/auth/provider/PhabricatorOAuth1SecretTemporaryTokenType.php', + 'PhabricatorOAuth2AuthProvider' => 'applications/auth/provider/PhabricatorOAuth2AuthProvider.php', + 'PhabricatorOAuthAuthProvider' => 'applications/auth/provider/PhabricatorOAuthAuthProvider.php', 'PhabricatorOAuthClientAuthorization' => 'applications/oauthserver/storage/PhabricatorOAuthClientAuthorization.php', - 'PhabricatorOAuthClientAuthorizationBaseController' => 'applications/oauthserver/controller/clientauthorization/PhabricatorOAuthClientAuthorizationBaseController.php', - 'PhabricatorOAuthClientAuthorizationDeleteController' => 'applications/oauthserver/controller/clientauthorization/PhabricatorOAuthClientAuthorizationDeleteController.php', - 'PhabricatorOAuthClientAuthorizationEditController' => 'applications/oauthserver/controller/clientauthorization/PhabricatorOAuthClientAuthorizationEditController.php', - 'PhabricatorOAuthClientAuthorizationListController' => 'applications/oauthserver/controller/clientauthorization/PhabricatorOAuthClientAuthorizationListController.php', 'PhabricatorOAuthClientAuthorizationQuery' => 'applications/oauthserver/query/PhabricatorOAuthClientAuthorizationQuery.php', - 'PhabricatorOAuthClientBaseController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientBaseController.php', - 'PhabricatorOAuthClientDeleteController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientDeleteController.php', + 'PhabricatorOAuthClientController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientController.php', + 'PhabricatorOAuthClientDisableController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientDisableController.php', 'PhabricatorOAuthClientEditController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientEditController.php', 'PhabricatorOAuthClientListController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientListController.php', + 'PhabricatorOAuthClientSecretController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientSecretController.php', + 'PhabricatorOAuthClientTestController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientTestController.php', 'PhabricatorOAuthClientViewController' => 'applications/oauthserver/controller/client/PhabricatorOAuthClientViewController.php', 'PhabricatorOAuthResponse' => 'applications/oauthserver/PhabricatorOAuthResponse.php', 'PhabricatorOAuthServer' => 'applications/oauthserver/PhabricatorOAuthServer.php', 'PhabricatorOAuthServerAccessToken' => 'applications/oauthserver/storage/PhabricatorOAuthServerAccessToken.php', + 'PhabricatorOAuthServerApplication' => 'applications/oauthserver/application/PhabricatorOAuthServerApplication.php', 'PhabricatorOAuthServerAuthController' => 'applications/oauthserver/controller/PhabricatorOAuthServerAuthController.php', 'PhabricatorOAuthServerAuthorizationCode' => 'applications/oauthserver/storage/PhabricatorOAuthServerAuthorizationCode.php', + 'PhabricatorOAuthServerAuthorizationsSettingsPanel' => 'applications/oauthserver/panel/PhabricatorOAuthServerAuthorizationsSettingsPanel.php', 'PhabricatorOAuthServerClient' => 'applications/oauthserver/storage/PhabricatorOAuthServerClient.php', + 'PhabricatorOAuthServerClientAuthorizationPHIDType' => 'applications/oauthserver/phid/PhabricatorOAuthServerClientAuthorizationPHIDType.php', + 'PhabricatorOAuthServerClientPHIDType' => 'applications/oauthserver/phid/PhabricatorOAuthServerClientPHIDType.php', 'PhabricatorOAuthServerClientQuery' => 'applications/oauthserver/query/PhabricatorOAuthServerClientQuery.php', + 'PhabricatorOAuthServerClientSearchEngine' => 'applications/oauthserver/query/PhabricatorOAuthServerClientSearchEngine.php', 'PhabricatorOAuthServerController' => 'applications/oauthserver/controller/PhabricatorOAuthServerController.php', + 'PhabricatorOAuthServerCreateClientsCapability' => 'applications/oauthserver/capability/PhabricatorOAuthServerCreateClientsCapability.php', 'PhabricatorOAuthServerDAO' => 'applications/oauthserver/storage/PhabricatorOAuthServerDAO.php', + 'PhabricatorOAuthServerEditEngine' => 'applications/oauthserver/editor/PhabricatorOAuthServerEditEngine.php', + 'PhabricatorOAuthServerEditor' => 'applications/oauthserver/editor/PhabricatorOAuthServerEditor.php', + 'PhabricatorOAuthServerSchemaSpec' => 'applications/oauthserver/query/PhabricatorOAuthServerSchemaSpec.php', 'PhabricatorOAuthServerScope' => 'applications/oauthserver/PhabricatorOAuthServerScope.php', 'PhabricatorOAuthServerTestCase' => 'applications/oauthserver/__tests__/PhabricatorOAuthServerTestCase.php', - 'PhabricatorOAuthServerTestController' => 'applications/oauthserver/controller/PhabricatorOAuthServerTestController.php', 'PhabricatorOAuthServerTokenController' => 'applications/oauthserver/controller/PhabricatorOAuthServerTokenController.php', + 'PhabricatorOAuthServerTransaction' => 'applications/oauthserver/storage/PhabricatorOAuthServerTransaction.php', + 'PhabricatorOAuthServerTransactionQuery' => 'applications/oauthserver/query/PhabricatorOAuthServerTransactionQuery.php', + 'PhabricatorObjectGraph' => 'infrastructure/graph/PhabricatorObjectGraph.php', 'PhabricatorObjectHandle' => 'applications/phid/PhabricatorObjectHandle.php', - 'PhabricatorObjectHandleConstants' => 'applications/phid/handle/const/PhabricatorObjectHandleConstants.php', - 'PhabricatorObjectHandleData' => 'applications/phid/handle/PhabricatorObjectHandleData.php', - 'PhabricatorObjectHandleStatus' => 'applications/phid/handle/const/PhabricatorObjectHandleStatus.php', - 'PhabricatorObjectItemListExample' => 'applications/uiexample/examples/PhabricatorObjectItemListExample.php', - 'PhabricatorObjectItemListView' => 'view/layout/PhabricatorObjectItemListView.php', - 'PhabricatorObjectItemView' => 'view/layout/PhabricatorObjectItemView.php', - 'PhabricatorObjectListView' => 'view/control/PhabricatorObjectListView.php', + 'PhabricatorObjectHasAsanaSubtaskEdgeType' => 'applications/doorkeeper/edge/PhabricatorObjectHasAsanaSubtaskEdgeType.php', + 'PhabricatorObjectHasAsanaTaskEdgeType' => 'applications/doorkeeper/edge/PhabricatorObjectHasAsanaTaskEdgeType.php', + 'PhabricatorObjectHasContributorEdgeType' => 'applications/transactions/edges/PhabricatorObjectHasContributorEdgeType.php', + 'PhabricatorObjectHasDraftEdgeType' => 'applications/transactions/edges/PhabricatorObjectHasDraftEdgeType.php', + 'PhabricatorObjectHasJiraIssueEdgeType' => 'applications/doorkeeper/edge/PhabricatorObjectHasJiraIssueEdgeType.php', + 'PhabricatorObjectHasSubscriberEdgeType' => 'applications/transactions/edges/PhabricatorObjectHasSubscriberEdgeType.php', + 'PhabricatorObjectHasUnsubscriberEdgeType' => 'applications/transactions/edges/PhabricatorObjectHasUnsubscriberEdgeType.php', + 'PhabricatorObjectHasWatcherEdgeType' => 'applications/transactions/edges/PhabricatorObjectHasWatcherEdgeType.php', + 'PhabricatorObjectListQuery' => 'applications/phid/query/PhabricatorObjectListQuery.php', + 'PhabricatorObjectListQueryTestCase' => 'applications/phid/query/__tests__/PhabricatorObjectListQueryTestCase.php', 'PhabricatorObjectMailReceiver' => 'applications/metamta/receiver/PhabricatorObjectMailReceiver.php', 'PhabricatorObjectMailReceiverTestCase' => 'applications/metamta/receiver/__tests__/PhabricatorObjectMailReceiverTestCase.php', + 'PhabricatorObjectMentionedByObjectEdgeType' => 'applications/transactions/edges/PhabricatorObjectMentionedByObjectEdgeType.php', + 'PhabricatorObjectMentionsObjectEdgeType' => 'applications/transactions/edges/PhabricatorObjectMentionsObjectEdgeType.php', 'PhabricatorObjectQuery' => 'applications/phid/query/PhabricatorObjectQuery.php', + 'PhabricatorObjectRelationship' => 'applications/search/relationship/PhabricatorObjectRelationship.php', + 'PhabricatorObjectRelationshipList' => 'applications/search/relationship/PhabricatorObjectRelationshipList.php', + 'PhabricatorObjectRelationshipSource' => 'applications/search/relationship/PhabricatorObjectRelationshipSource.php', + 'PhabricatorObjectRemarkupRule' => 'infrastructure/markup/rule/PhabricatorObjectRemarkupRule.php', 'PhabricatorObjectSelectorDialog' => 'view/control/PhabricatorObjectSelectorDialog.php', + 'PhabricatorObjectStatus' => 'infrastructure/status/PhabricatorObjectStatus.php', + 'PhabricatorObjectUsesDashboardPanelEdgeType' => 'applications/search/edge/PhabricatorObjectUsesDashboardPanelEdgeType.php', 'PhabricatorOffsetPagedQuery' => 'infrastructure/query/PhabricatorOffsetPagedQuery.php', + 'PhabricatorOldWorldContentSource' => 'infrastructure/contentsource/PhabricatorOldWorldContentSource.php', + 'PhabricatorOlderInlinesSetting' => 'applications/settings/setting/PhabricatorOlderInlinesSetting.php', + 'PhabricatorOneTimeTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorOneTimeTriggerClock.php', + 'PhabricatorOpcodeCacheSpec' => 'applications/cache/spec/PhabricatorOpcodeCacheSpec.php', + 'PhabricatorOptionExportField' => 'infrastructure/export/field/PhabricatorOptionExportField.php', + 'PhabricatorOptionGroupSetting' => 'applications/settings/setting/PhabricatorOptionGroupSetting.php', 'PhabricatorOwnerPathQuery' => 'applications/owners/query/PhabricatorOwnerPathQuery.php', + 'PhabricatorOwnersApplication' => 'applications/owners/application/PhabricatorOwnersApplication.php', + 'PhabricatorOwnersArchiveController' => 'applications/owners/controller/PhabricatorOwnersArchiveController.php', + 'PhabricatorOwnersAuditRule' => 'applications/owners/constants/PhabricatorOwnersAuditRule.php', 'PhabricatorOwnersConfigOptions' => 'applications/owners/config/PhabricatorOwnersConfigOptions.php', + 'PhabricatorOwnersConfiguredCustomField' => 'applications/owners/customfield/PhabricatorOwnersConfiguredCustomField.php', 'PhabricatorOwnersController' => 'applications/owners/controller/PhabricatorOwnersController.php', + 'PhabricatorOwnersCustomField' => 'applications/owners/customfield/PhabricatorOwnersCustomField.php', + 'PhabricatorOwnersCustomFieldNumericIndex' => 'applications/owners/storage/PhabricatorOwnersCustomFieldNumericIndex.php', + 'PhabricatorOwnersCustomFieldStorage' => 'applications/owners/storage/PhabricatorOwnersCustomFieldStorage.php', + 'PhabricatorOwnersCustomFieldStringIndex' => 'applications/owners/storage/PhabricatorOwnersCustomFieldStringIndex.php', 'PhabricatorOwnersDAO' => 'applications/owners/storage/PhabricatorOwnersDAO.php', - 'PhabricatorOwnersDeleteController' => 'applications/owners/controller/PhabricatorOwnersDeleteController.php', + 'PhabricatorOwnersDefaultEditCapability' => 'applications/owners/capability/PhabricatorOwnersDefaultEditCapability.php', + 'PhabricatorOwnersDefaultViewCapability' => 'applications/owners/capability/PhabricatorOwnersDefaultViewCapability.php', 'PhabricatorOwnersDetailController' => 'applications/owners/controller/PhabricatorOwnersDetailController.php', 'PhabricatorOwnersEditController' => 'applications/owners/controller/PhabricatorOwnersEditController.php', + 'PhabricatorOwnersHovercardEngineExtension' => 'applications/owners/engineextension/PhabricatorOwnersHovercardEngineExtension.php', 'PhabricatorOwnersListController' => 'applications/owners/controller/PhabricatorOwnersListController.php', 'PhabricatorOwnersOwner' => 'applications/owners/storage/PhabricatorOwnersOwner.php', - 'PhabricatorOwnersPHIDTypePackage' => 'applications/owners/phid/PhabricatorOwnersPHIDTypePackage.php', 'PhabricatorOwnersPackage' => 'applications/owners/storage/PhabricatorOwnersPackage.php', - 'PhabricatorOwnersPackagePathValidator' => 'applications/repository/worker/commitchangeparser/PhabricatorOwnersPackagePathValidator.php', + 'PhabricatorOwnersPackageAuditingTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageAuditingTransaction.php', + 'PhabricatorOwnersPackageAuthorityTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageAuthorityTransaction.php', + 'PhabricatorOwnersPackageAutoreviewTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageAutoreviewTransaction.php', + 'PhabricatorOwnersPackageContextFreeGrammar' => 'applications/owners/lipsum/PhabricatorOwnersPackageContextFreeGrammar.php', + 'PhabricatorOwnersPackageDatasource' => 'applications/owners/typeahead/PhabricatorOwnersPackageDatasource.php', + 'PhabricatorOwnersPackageDescriptionTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageDescriptionTransaction.php', + 'PhabricatorOwnersPackageDominionTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageDominionTransaction.php', + 'PhabricatorOwnersPackageEditEngine' => 'applications/owners/editor/PhabricatorOwnersPackageEditEngine.php', + 'PhabricatorOwnersPackageFerretEngine' => 'applications/owners/search/PhabricatorOwnersPackageFerretEngine.php', + 'PhabricatorOwnersPackageFulltextEngine' => 'applications/owners/search/PhabricatorOwnersPackageFulltextEngine.php', + 'PhabricatorOwnersPackageFunctionDatasource' => 'applications/owners/typeahead/PhabricatorOwnersPackageFunctionDatasource.php', + 'PhabricatorOwnersPackageIgnoredTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageIgnoredTransaction.php', + 'PhabricatorOwnersPackageNameNgrams' => 'applications/owners/storage/PhabricatorOwnersPackageNameNgrams.php', + 'PhabricatorOwnersPackageNameTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageNameTransaction.php', + 'PhabricatorOwnersPackageOwnerDatasource' => 'applications/owners/typeahead/PhabricatorOwnersPackageOwnerDatasource.php', + 'PhabricatorOwnersPackageOwnersTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageOwnersTransaction.php', + 'PhabricatorOwnersPackagePHIDType' => 'applications/owners/phid/PhabricatorOwnersPackagePHIDType.php', + 'PhabricatorOwnersPackagePathsTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackagePathsTransaction.php', + 'PhabricatorOwnersPackagePrimaryTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackagePrimaryTransaction.php', 'PhabricatorOwnersPackageQuery' => 'applications/owners/query/PhabricatorOwnersPackageQuery.php', + 'PhabricatorOwnersPackageRemarkupRule' => 'applications/owners/remarkup/PhabricatorOwnersPackageRemarkupRule.php', + 'PhabricatorOwnersPackageSearchEngine' => 'applications/owners/query/PhabricatorOwnersPackageSearchEngine.php', + 'PhabricatorOwnersPackageStatusTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageStatusTransaction.php', 'PhabricatorOwnersPackageTestCase' => 'applications/owners/storage/__tests__/PhabricatorOwnersPackageTestCase.php', + 'PhabricatorOwnersPackageTestDataGenerator' => 'applications/owners/lipsum/PhabricatorOwnersPackageTestDataGenerator.php', + 'PhabricatorOwnersPackageTransaction' => 'applications/owners/storage/PhabricatorOwnersPackageTransaction.php', + 'PhabricatorOwnersPackageTransactionEditor' => 'applications/owners/editor/PhabricatorOwnersPackageTransactionEditor.php', + 'PhabricatorOwnersPackageTransactionQuery' => 'applications/owners/query/PhabricatorOwnersPackageTransactionQuery.php', + 'PhabricatorOwnersPackageTransactionType' => 'applications/owners/xaction/PhabricatorOwnersPackageTransactionType.php', 'PhabricatorOwnersPath' => 'applications/owners/storage/PhabricatorOwnersPath.php', + 'PhabricatorOwnersPathContextFreeGrammar' => 'applications/owners/lipsum/PhabricatorOwnersPathContextFreeGrammar.php', + 'PhabricatorOwnersPathsController' => 'applications/owners/controller/PhabricatorOwnersPathsController.php', + 'PhabricatorOwnersPathsSearchEngineAttachment' => 'applications/owners/engineextension/PhabricatorOwnersPathsSearchEngineAttachment.php', + 'PhabricatorOwnersSchemaSpec' => 'applications/owners/storage/PhabricatorOwnersSchemaSpec.php', + 'PhabricatorOwnersSearchField' => 'applications/owners/searchfield/PhabricatorOwnersSearchField.php', + 'PhabricatorPDFCatalogObject' => 'applications/phortune/pdf/PhabricatorPDFCatalogObject.php', + 'PhabricatorPDFContentsObject' => 'applications/phortune/pdf/PhabricatorPDFContentsObject.php', + 'PhabricatorPDFDocumentEngine' => 'applications/files/document/PhabricatorPDFDocumentEngine.php', + 'PhabricatorPDFFontObject' => 'applications/phortune/pdf/PhabricatorPDFFontObject.php', + 'PhabricatorPDFFragment' => 'applications/phortune/pdf/PhabricatorPDFFragment.php', + 'PhabricatorPDFFragmentOffset' => 'applications/phortune/pdf/PhabricatorPDFFragmentOffset.php', + 'PhabricatorPDFGenerator' => 'applications/phortune/pdf/PhabricatorPDFGenerator.php', + 'PhabricatorPDFHeadFragment' => 'applications/phortune/pdf/PhabricatorPDFHeadFragment.php', + 'PhabricatorPDFInfoObject' => 'applications/phortune/pdf/PhabricatorPDFInfoObject.php', + 'PhabricatorPDFIterator' => 'applications/phortune/pdf/PhabricatorPDFIterator.php', + 'PhabricatorPDFObject' => 'applications/phortune/pdf/PhabricatorPDFObject.php', + 'PhabricatorPDFPageObject' => 'applications/phortune/pdf/PhabricatorPDFPageObject.php', + 'PhabricatorPDFPagesObject' => 'applications/phortune/pdf/PhabricatorPDFPagesObject.php', + 'PhabricatorPDFResourcesObject' => 'applications/phortune/pdf/PhabricatorPDFResourcesObject.php', + 'PhabricatorPDFTailFragment' => 'applications/phortune/pdf/PhabricatorPDFTailFragment.php', 'PhabricatorPHDConfigOptions' => 'applications/config/option/PhabricatorPHDConfigOptions.php', 'PhabricatorPHID' => 'applications/phid/storage/PhabricatorPHID.php', 'PhabricatorPHIDConstants' => 'applications/phid/PhabricatorPHIDConstants.php', + 'PhabricatorPHIDExportField' => 'infrastructure/export/field/PhabricatorPHIDExportField.php', + 'PhabricatorPHIDInterface' => 'applications/phid/interface/PhabricatorPHIDInterface.php', + 'PhabricatorPHIDListEditField' => 'applications/transactions/editfield/PhabricatorPHIDListEditField.php', + 'PhabricatorPHIDListEditType' => 'applications/transactions/edittype/PhabricatorPHIDListEditType.php', + 'PhabricatorPHIDListExportField' => 'infrastructure/export/field/PhabricatorPHIDListExportField.php', + 'PhabricatorPHIDMailStamp' => 'applications/metamta/stamp/PhabricatorPHIDMailStamp.php', + 'PhabricatorPHIDResolver' => 'applications/phid/resolver/PhabricatorPHIDResolver.php', 'PhabricatorPHIDType' => 'applications/phid/type/PhabricatorPHIDType.php', - 'PhabricatorPHPMailerConfigOptions' => 'applications/config/option/PhabricatorPHPMailerConfigOptions.php', - 'PhabricatorPagedFormExample' => 'applications/uiexample/examples/PhabricatorPagedFormExample.php', + 'PhabricatorPHIDTypeTestCase' => 'applications/phid/type/__tests__/PhabricatorPHIDTypeTestCase.php', + 'PhabricatorPHIDsSearchField' => 'applications/search/field/PhabricatorPHIDsSearchField.php', + 'PhabricatorPHPASTApplication' => 'applications/phpast/application/PhabricatorPHPASTApplication.php', + 'PhabricatorPHPConfigSetupCheck' => 'applications/config/check/PhabricatorPHPConfigSetupCheck.php', + 'PhabricatorPHPPreflightSetupCheck' => 'applications/config/check/PhabricatorPHPPreflightSetupCheck.php', + 'PhabricatorPackagesApplication' => 'applications/packages/application/PhabricatorPackagesApplication.php', + 'PhabricatorPackagesController' => 'applications/packages/controller/PhabricatorPackagesController.php', + 'PhabricatorPackagesCreatePublisherCapability' => 'applications/packages/capability/PhabricatorPackagesCreatePublisherCapability.php', + 'PhabricatorPackagesDAO' => 'applications/packages/storage/PhabricatorPackagesDAO.php', + 'PhabricatorPackagesEditEngine' => 'applications/packages/editor/PhabricatorPackagesEditEngine.php', + 'PhabricatorPackagesEditor' => 'applications/packages/editor/PhabricatorPackagesEditor.php', + 'PhabricatorPackagesNgrams' => 'applications/packages/storage/PhabricatorPackagesNgrams.php', + 'PhabricatorPackagesPackage' => 'applications/packages/storage/PhabricatorPackagesPackage.php', + 'PhabricatorPackagesPackageController' => 'applications/packages/controller/PhabricatorPackagesPackageController.php', + 'PhabricatorPackagesPackageDatasource' => 'applications/packages/typeahead/PhabricatorPackagesPackageDatasource.php', + 'PhabricatorPackagesPackageDefaultEditCapability' => 'applications/packages/capability/PhabricatorPackagesPackageDefaultEditCapability.php', + 'PhabricatorPackagesPackageDefaultViewCapability' => 'applications/packages/capability/PhabricatorPackagesPackageDefaultViewCapability.php', + 'PhabricatorPackagesPackageEditConduitAPIMethod' => 'applications/packages/conduit/PhabricatorPackagesPackageEditConduitAPIMethod.php', + 'PhabricatorPackagesPackageEditController' => 'applications/packages/controller/PhabricatorPackagesPackageEditController.php', + 'PhabricatorPackagesPackageEditEngine' => 'applications/packages/editor/PhabricatorPackagesPackageEditEngine.php', + 'PhabricatorPackagesPackageEditor' => 'applications/packages/editor/PhabricatorPackagesPackageEditor.php', + 'PhabricatorPackagesPackageKeyTransaction' => 'applications/packages/xaction/package/PhabricatorPackagesPackageKeyTransaction.php', + 'PhabricatorPackagesPackageListController' => 'applications/packages/controller/PhabricatorPackagesPackageListController.php', + 'PhabricatorPackagesPackageListView' => 'applications/packages/view/PhabricatorPackagesPackageListView.php', + 'PhabricatorPackagesPackageNameNgrams' => 'applications/packages/storage/PhabricatorPackagesPackageNameNgrams.php', + 'PhabricatorPackagesPackageNameTransaction' => 'applications/packages/xaction/package/PhabricatorPackagesPackageNameTransaction.php', + 'PhabricatorPackagesPackagePHIDType' => 'applications/packages/phid/PhabricatorPackagesPackagePHIDType.php', + 'PhabricatorPackagesPackagePublisherTransaction' => 'applications/packages/xaction/package/PhabricatorPackagesPackagePublisherTransaction.php', + 'PhabricatorPackagesPackageQuery' => 'applications/packages/query/PhabricatorPackagesPackageQuery.php', + 'PhabricatorPackagesPackageSearchConduitAPIMethod' => 'applications/packages/conduit/PhabricatorPackagesPackageSearchConduitAPIMethod.php', + 'PhabricatorPackagesPackageSearchEngine' => 'applications/packages/query/PhabricatorPackagesPackageSearchEngine.php', + 'PhabricatorPackagesPackageTransaction' => 'applications/packages/storage/PhabricatorPackagesPackageTransaction.php', + 'PhabricatorPackagesPackageTransactionQuery' => 'applications/packages/query/PhabricatorPackagesPackageTransactionQuery.php', + 'PhabricatorPackagesPackageTransactionType' => 'applications/packages/xaction/package/PhabricatorPackagesPackageTransactionType.php', + 'PhabricatorPackagesPackageViewController' => 'applications/packages/controller/PhabricatorPackagesPackageViewController.php', + 'PhabricatorPackagesPublisher' => 'applications/packages/storage/PhabricatorPackagesPublisher.php', + 'PhabricatorPackagesPublisherController' => 'applications/packages/controller/PhabricatorPackagesPublisherController.php', + 'PhabricatorPackagesPublisherDatasource' => 'applications/packages/typeahead/PhabricatorPackagesPublisherDatasource.php', + 'PhabricatorPackagesPublisherDefaultEditCapability' => 'applications/packages/capability/PhabricatorPackagesPublisherDefaultEditCapability.php', + 'PhabricatorPackagesPublisherEditConduitAPIMethod' => 'applications/packages/conduit/PhabricatorPackagesPublisherEditConduitAPIMethod.php', + 'PhabricatorPackagesPublisherEditController' => 'applications/packages/controller/PhabricatorPackagesPublisherEditController.php', + 'PhabricatorPackagesPublisherEditEngine' => 'applications/packages/editor/PhabricatorPackagesPublisherEditEngine.php', + 'PhabricatorPackagesPublisherEditor' => 'applications/packages/editor/PhabricatorPackagesPublisherEditor.php', + 'PhabricatorPackagesPublisherKeyTransaction' => 'applications/packages/xaction/publisher/PhabricatorPackagesPublisherKeyTransaction.php', + 'PhabricatorPackagesPublisherListController' => 'applications/packages/controller/PhabricatorPackagesPublisherListController.php', + 'PhabricatorPackagesPublisherListView' => 'applications/packages/view/PhabricatorPackagesPublisherListView.php', + 'PhabricatorPackagesPublisherNameNgrams' => 'applications/packages/storage/PhabricatorPackagesPublisherNameNgrams.php', + 'PhabricatorPackagesPublisherNameTransaction' => 'applications/packages/xaction/publisher/PhabricatorPackagesPublisherNameTransaction.php', + 'PhabricatorPackagesPublisherPHIDType' => 'applications/packages/phid/PhabricatorPackagesPublisherPHIDType.php', + 'PhabricatorPackagesPublisherQuery' => 'applications/packages/query/PhabricatorPackagesPublisherQuery.php', + 'PhabricatorPackagesPublisherSearchConduitAPIMethod' => 'applications/packages/conduit/PhabricatorPackagesPublisherSearchConduitAPIMethod.php', + 'PhabricatorPackagesPublisherSearchEngine' => 'applications/packages/query/PhabricatorPackagesPublisherSearchEngine.php', + 'PhabricatorPackagesPublisherTransaction' => 'applications/packages/storage/PhabricatorPackagesPublisherTransaction.php', + 'PhabricatorPackagesPublisherTransactionQuery' => 'applications/packages/query/PhabricatorPackagesPublisherTransactionQuery.php', + 'PhabricatorPackagesPublisherTransactionType' => 'applications/packages/xaction/publisher/PhabricatorPackagesPublisherTransactionType.php', + 'PhabricatorPackagesPublisherViewController' => 'applications/packages/controller/PhabricatorPackagesPublisherViewController.php', + 'PhabricatorPackagesQuery' => 'applications/packages/query/PhabricatorPackagesQuery.php', + 'PhabricatorPackagesSchemaSpec' => 'applications/packages/storage/PhabricatorPackagesSchemaSpec.php', + 'PhabricatorPackagesTransactionType' => 'applications/packages/xaction/PhabricatorPackagesTransactionType.php', + 'PhabricatorPackagesVersion' => 'applications/packages/storage/PhabricatorPackagesVersion.php', + 'PhabricatorPackagesVersionController' => 'applications/packages/controller/PhabricatorPackagesVersionController.php', + 'PhabricatorPackagesVersionEditConduitAPIMethod' => 'applications/packages/conduit/PhabricatorPackagesVersionEditConduitAPIMethod.php', + 'PhabricatorPackagesVersionEditController' => 'applications/packages/controller/PhabricatorPackagesVersionEditController.php', + 'PhabricatorPackagesVersionEditEngine' => 'applications/packages/editor/PhabricatorPackagesVersionEditEngine.php', + 'PhabricatorPackagesVersionEditor' => 'applications/packages/editor/PhabricatorPackagesVersionEditor.php', + 'PhabricatorPackagesVersionListController' => 'applications/packages/controller/PhabricatorPackagesVersionListController.php', + 'PhabricatorPackagesVersionListView' => 'applications/packages/view/PhabricatorPackagesVersionListView.php', + 'PhabricatorPackagesVersionNameNgrams' => 'applications/packages/storage/PhabricatorPackagesVersionNameNgrams.php', + 'PhabricatorPackagesVersionNameTransaction' => 'applications/packages/xaction/version/PhabricatorPackagesVersionNameTransaction.php', + 'PhabricatorPackagesVersionPHIDType' => 'applications/packages/phid/PhabricatorPackagesVersionPHIDType.php', + 'PhabricatorPackagesVersionPackageTransaction' => 'applications/packages/xaction/version/PhabricatorPackagesVersionPackageTransaction.php', + 'PhabricatorPackagesVersionQuery' => 'applications/packages/query/PhabricatorPackagesVersionQuery.php', + 'PhabricatorPackagesVersionSearchConduitAPIMethod' => 'applications/packages/conduit/PhabricatorPackagesVersionSearchConduitAPIMethod.php', + 'PhabricatorPackagesVersionSearchEngine' => 'applications/packages/query/PhabricatorPackagesVersionSearchEngine.php', + 'PhabricatorPackagesVersionTransaction' => 'applications/packages/storage/PhabricatorPackagesVersionTransaction.php', + 'PhabricatorPackagesVersionTransactionQuery' => 'applications/packages/query/PhabricatorPackagesVersionTransactionQuery.php', + 'PhabricatorPackagesVersionTransactionType' => 'applications/packages/xaction/version/PhabricatorPackagesVersionTransactionType.php', + 'PhabricatorPackagesVersionViewController' => 'applications/packages/controller/PhabricatorPackagesVersionViewController.php', + 'PhabricatorPackagesView' => 'applications/packages/view/PhabricatorPackagesView.php', + 'PhabricatorPagerUIExample' => 'applications/uiexample/examples/PhabricatorPagerUIExample.php', + 'PhabricatorPartialLoginUserLogType' => 'applications/people/userlog/PhabricatorPartialLoginUserLogType.php', + 'PhabricatorPassphraseApplication' => 'applications/passphrase/application/PhabricatorPassphraseApplication.php', + 'PhabricatorPasswordAuthProvider' => 'applications/auth/provider/PhabricatorPasswordAuthProvider.php', + 'PhabricatorPasswordDestructionEngineExtension' => 'applications/auth/extension/PhabricatorPasswordDestructionEngineExtension.php', + 'PhabricatorPasswordHasher' => 'infrastructure/util/password/PhabricatorPasswordHasher.php', + 'PhabricatorPasswordHasherTestCase' => 'infrastructure/util/password/__tests__/PhabricatorPasswordHasherTestCase.php', + 'PhabricatorPasswordHasherUnavailableException' => 'infrastructure/util/password/PhabricatorPasswordHasherUnavailableException.php', + 'PhabricatorPasswordSettingsPanel' => 'applications/settings/panel/PhabricatorPasswordSettingsPanel.php', 'PhabricatorPaste' => 'applications/paste/storage/PhabricatorPaste.php', - 'PhabricatorPasteCommentController' => 'applications/paste/controller/PhabricatorPasteCommentController.php', - 'PhabricatorPasteConfigOptions' => 'applications/paste/config/PhabricatorPasteConfigOptions.php', + 'PhabricatorPasteApplication' => 'applications/paste/application/PhabricatorPasteApplication.php', + 'PhabricatorPasteArchiveController' => 'applications/paste/controller/PhabricatorPasteArchiveController.php', + 'PhabricatorPasteContentSearchEngineAttachment' => 'applications/paste/engineextension/PhabricatorPasteContentSearchEngineAttachment.php', + 'PhabricatorPasteContentTransaction' => 'applications/paste/xaction/PhabricatorPasteContentTransaction.php', 'PhabricatorPasteController' => 'applications/paste/controller/PhabricatorPasteController.php', 'PhabricatorPasteDAO' => 'applications/paste/storage/PhabricatorPasteDAO.php', 'PhabricatorPasteEditController' => 'applications/paste/controller/PhabricatorPasteEditController.php', + 'PhabricatorPasteEditEngine' => 'applications/paste/editor/PhabricatorPasteEditEngine.php', 'PhabricatorPasteEditor' => 'applications/paste/editor/PhabricatorPasteEditor.php', + 'PhabricatorPasteFerretEngine' => 'applications/paste/engine/PhabricatorPasteFerretEngine.php', + 'PhabricatorPasteFilenameContextFreeGrammar' => 'applications/paste/lipsum/PhabricatorPasteFilenameContextFreeGrammar.php', + 'PhabricatorPasteFulltextEngine' => 'applications/paste/engine/PhabricatorPasteFulltextEngine.php', + 'PhabricatorPasteLanguageTransaction' => 'applications/paste/xaction/PhabricatorPasteLanguageTransaction.php', 'PhabricatorPasteListController' => 'applications/paste/controller/PhabricatorPasteListController.php', - 'PhabricatorPastePHIDTypePaste' => 'applications/paste/phid/PhabricatorPastePHIDTypePaste.php', + 'PhabricatorPastePastePHIDType' => 'applications/paste/phid/PhabricatorPastePastePHIDType.php', 'PhabricatorPasteQuery' => 'applications/paste/query/PhabricatorPasteQuery.php', + 'PhabricatorPasteRawController' => 'applications/paste/controller/PhabricatorPasteRawController.php', 'PhabricatorPasteRemarkupRule' => 'applications/paste/remarkup/PhabricatorPasteRemarkupRule.php', + 'PhabricatorPasteSchemaSpec' => 'applications/paste/storage/PhabricatorPasteSchemaSpec.php', 'PhabricatorPasteSearchEngine' => 'applications/paste/query/PhabricatorPasteSearchEngine.php', + 'PhabricatorPasteSnippet' => 'applications/paste/snippet/PhabricatorPasteSnippet.php', + 'PhabricatorPasteStatusTransaction' => 'applications/paste/xaction/PhabricatorPasteStatusTransaction.php', 'PhabricatorPasteTestDataGenerator' => 'applications/paste/lipsum/PhabricatorPasteTestDataGenerator.php', + 'PhabricatorPasteTitleTransaction' => 'applications/paste/xaction/PhabricatorPasteTitleTransaction.php', 'PhabricatorPasteTransaction' => 'applications/paste/storage/PhabricatorPasteTransaction.php', 'PhabricatorPasteTransactionComment' => 'applications/paste/storage/PhabricatorPasteTransactionComment.php', 'PhabricatorPasteTransactionQuery' => 'applications/paste/query/PhabricatorPasteTransactionQuery.php', + 'PhabricatorPasteTransactionType' => 'applications/paste/xaction/PhabricatorPasteTransactionType.php', 'PhabricatorPasteViewController' => 'applications/paste/controller/PhabricatorPasteViewController.php', + 'PhabricatorPathSetupCheck' => 'applications/config/check/PhabricatorPathSetupCheck.php', + 'PhabricatorPeopleAnyOwnerDatasource' => 'applications/people/typeahead/PhabricatorPeopleAnyOwnerDatasource.php', + 'PhabricatorPeopleApplication' => 'applications/people/application/PhabricatorPeopleApplication.php', + 'PhabricatorPeopleApproveController' => 'applications/people/controller/PhabricatorPeopleApproveController.php', + 'PhabricatorPeopleAvailabilitySearchEngineAttachment' => 'applications/people/engineextension/PhabricatorPeopleAvailabilitySearchEngineAttachment.php', + 'PhabricatorPeopleBadgesProfileMenuItem' => 'applications/people/menuitem/PhabricatorPeopleBadgesProfileMenuItem.php', + 'PhabricatorPeopleCommitsProfileMenuItem' => 'applications/people/menuitem/PhabricatorPeopleCommitsProfileMenuItem.php', 'PhabricatorPeopleController' => 'applications/people/controller/PhabricatorPeopleController.php', - 'PhabricatorPeopleEditController' => 'applications/people/controller/PhabricatorPeopleEditController.php', - 'PhabricatorPeopleHovercardEventListener' => 'applications/people/event/PhabricatorPeopleHovercardEventListener.php', - 'PhabricatorPeopleLdapController' => 'applications/people/controller/PhabricatorPeopleLdapController.php', + 'PhabricatorPeopleCreateController' => 'applications/people/controller/PhabricatorPeopleCreateController.php', + 'PhabricatorPeopleCreateGuidanceContext' => 'applications/people/guidance/PhabricatorPeopleCreateGuidanceContext.php', + 'PhabricatorPeopleDatasource' => 'applications/people/typeahead/PhabricatorPeopleDatasource.php', + 'PhabricatorPeopleDatasourceEngineExtension' => 'applications/people/engineextension/PhabricatorPeopleDatasourceEngineExtension.php', + 'PhabricatorPeopleDeleteController' => 'applications/people/controller/PhabricatorPeopleDeleteController.php', + 'PhabricatorPeopleDetailsProfileMenuItem' => 'applications/people/menuitem/PhabricatorPeopleDetailsProfileMenuItem.php', + 'PhabricatorPeopleDisableController' => 'applications/people/controller/PhabricatorPeopleDisableController.php', + 'PhabricatorPeopleEmailLoginMailEngine' => 'applications/people/mail/PhabricatorPeopleEmailLoginMailEngine.php', + 'PhabricatorPeopleEmpowerController' => 'applications/people/controller/PhabricatorPeopleEmpowerController.php', + 'PhabricatorPeopleExternalIdentifierPHIDType' => 'applications/people/phid/PhabricatorPeopleExternalIdentifierPHIDType.php', + 'PhabricatorPeopleExternalPHIDType' => 'applications/people/phid/PhabricatorPeopleExternalPHIDType.php', + 'PhabricatorPeopleIconSet' => 'applications/people/icon/PhabricatorPeopleIconSet.php', + 'PhabricatorPeopleInviteController' => 'applications/people/controller/PhabricatorPeopleInviteController.php', + 'PhabricatorPeopleInviteListController' => 'applications/people/controller/PhabricatorPeopleInviteListController.php', + 'PhabricatorPeopleInviteSendController' => 'applications/people/controller/PhabricatorPeopleInviteSendController.php', 'PhabricatorPeopleListController' => 'applications/people/controller/PhabricatorPeopleListController.php', + 'PhabricatorPeopleLogQuery' => 'applications/people/query/PhabricatorPeopleLogQuery.php', + 'PhabricatorPeopleLogSearchEngine' => 'applications/people/query/PhabricatorPeopleLogSearchEngine.php', + 'PhabricatorPeopleLogViewController' => 'applications/people/controller/PhabricatorPeopleLogViewController.php', 'PhabricatorPeopleLogsController' => 'applications/people/controller/PhabricatorPeopleLogsController.php', - 'PhabricatorPeoplePHIDTypeExternal' => 'applications/people/phid/PhabricatorPeoplePHIDTypeExternal.php', - 'PhabricatorPeoplePHIDTypeUser' => 'applications/people/phid/PhabricatorPeoplePHIDTypeUser.php', + 'PhabricatorPeopleMailEngine' => 'applications/people/mail/PhabricatorPeopleMailEngine.php', + 'PhabricatorPeopleMailEngineException' => 'applications/people/mail/PhabricatorPeopleMailEngineException.php', + 'PhabricatorPeopleManageProfileMenuItem' => 'applications/people/menuitem/PhabricatorPeopleManageProfileMenuItem.php', + 'PhabricatorPeopleManagementApproveWorkflow' => 'applications/people/management/PhabricatorPeopleManagementApproveWorkflow.php', + 'PhabricatorPeopleManagementEmpowerWorkflow' => 'applications/people/management/PhabricatorPeopleManagementEmpowerWorkflow.php', + 'PhabricatorPeopleManagementEnableWorkflow' => 'applications/people/management/PhabricatorPeopleManagementEnableWorkflow.php', + 'PhabricatorPeopleManagementWorkflow' => 'applications/people/management/PhabricatorPeopleManagementWorkflow.php', + 'PhabricatorPeopleNewController' => 'applications/people/controller/PhabricatorPeopleNewController.php', + 'PhabricatorPeopleNoOwnerDatasource' => 'applications/people/typeahead/PhabricatorPeopleNoOwnerDatasource.php', + 'PhabricatorPeopleOwnerDatasource' => 'applications/people/typeahead/PhabricatorPeopleOwnerDatasource.php', + 'PhabricatorPeoplePictureProfileMenuItem' => 'applications/people/menuitem/PhabricatorPeoplePictureProfileMenuItem.php', + 'PhabricatorPeopleProfileBadgesController' => 'applications/people/controller/PhabricatorPeopleProfileBadgesController.php', + 'PhabricatorPeopleProfileCommitsController' => 'applications/people/controller/PhabricatorPeopleProfileCommitsController.php', 'PhabricatorPeopleProfileController' => 'applications/people/controller/PhabricatorPeopleProfileController.php', 'PhabricatorPeopleProfileEditController' => 'applications/people/controller/PhabricatorPeopleProfileEditController.php', + 'PhabricatorPeopleProfileManageController' => 'applications/people/controller/PhabricatorPeopleProfileManageController.php', + 'PhabricatorPeopleProfileMenuEngine' => 'applications/people/engine/PhabricatorPeopleProfileMenuEngine.php', 'PhabricatorPeopleProfilePictureController' => 'applications/people/controller/PhabricatorPeopleProfilePictureController.php', + 'PhabricatorPeopleProfileRevisionsController' => 'applications/people/controller/PhabricatorPeopleProfileRevisionsController.php', + 'PhabricatorPeopleProfileTasksController' => 'applications/people/controller/PhabricatorPeopleProfileTasksController.php', + 'PhabricatorPeopleProfileViewController' => 'applications/people/controller/PhabricatorPeopleProfileViewController.php', 'PhabricatorPeopleQuery' => 'applications/people/query/PhabricatorPeopleQuery.php', + 'PhabricatorPeopleRenameController' => 'applications/people/controller/PhabricatorPeopleRenameController.php', + 'PhabricatorPeopleRevisionsProfileMenuItem' => 'applications/people/menuitem/PhabricatorPeopleRevisionsProfileMenuItem.php', 'PhabricatorPeopleSearchEngine' => 'applications/people/query/PhabricatorPeopleSearchEngine.php', + 'PhabricatorPeopleTasksProfileMenuItem' => 'applications/people/menuitem/PhabricatorPeopleTasksProfileMenuItem.php', 'PhabricatorPeopleTestDataGenerator' => 'applications/people/lipsum/PhabricatorPeopleTestDataGenerator.php', - 'PhabricatorPhameConfigOptions' => 'applications/phame/config/PhabricatorPhameConfigOptions.php', - 'PhabricatorPhamePHIDTypeBlog' => 'applications/phame/phid/PhabricatorPhamePHIDTypeBlog.php', - 'PhabricatorPhamePHIDTypePost' => 'applications/phame/phid/PhabricatorPhamePHIDTypePost.php', - 'PhabricatorPholioConfigOptions' => 'applications/pholio/config/PhabricatorPholioConfigOptions.php', + 'PhabricatorPeopleTransactionQuery' => 'applications/people/query/PhabricatorPeopleTransactionQuery.php', + 'PhabricatorPeopleUserEmailPHIDType' => 'applications/people/phid/PhabricatorPeopleUserEmailPHIDType.php', + 'PhabricatorPeopleUserEmailQuery' => 'applications/people/query/PhabricatorPeopleUserEmailQuery.php', + 'PhabricatorPeopleUserFunctionDatasource' => 'applications/people/typeahead/PhabricatorPeopleUserFunctionDatasource.php', + 'PhabricatorPeopleUserPHIDType' => 'applications/people/phid/PhabricatorPeopleUserPHIDType.php', + 'PhabricatorPeopleUsernameMailEngine' => 'applications/people/mail/PhabricatorPeopleUsernameMailEngine.php', + 'PhabricatorPeopleWelcomeController' => 'applications/people/controller/PhabricatorPeopleWelcomeController.php', + 'PhabricatorPeopleWelcomeMailEngine' => 'applications/people/mail/PhabricatorPeopleWelcomeMailEngine.php', + 'PhabricatorPhabricatorAuthProvider' => 'applications/auth/provider/PhabricatorPhabricatorAuthProvider.php', + 'PhabricatorPhameApplication' => 'applications/phame/application/PhabricatorPhameApplication.php', + 'PhabricatorPhameBlogPHIDType' => 'applications/phame/phid/PhabricatorPhameBlogPHIDType.php', + 'PhabricatorPhamePostPHIDType' => 'applications/phame/phid/PhabricatorPhamePostPHIDType.php', + 'PhabricatorPhluxApplication' => 'applications/phlux/application/PhabricatorPhluxApplication.php', + 'PhabricatorPholioApplication' => 'applications/pholio/application/PhabricatorPholioApplication.php', 'PhabricatorPholioMockTestDataGenerator' => 'applications/pholio/lipsum/PhabricatorPholioMockTestDataGenerator.php', - 'PhabricatorPhortuneConfigOptions' => 'applications/phortune/option/PhabricatorPhortuneConfigOptions.php', - 'PhabricatorPhrequentConfigOptions' => 'applications/phrequent/config/PhabricatorPhrequentConfigOptions.php', - 'PhabricatorPhrictionConfigOptions' => 'applications/phriction/config/PhabricatorPhrictionConfigOptions.php', + 'PhabricatorPhoneNumber' => 'applications/metamta/message/PhabricatorPhoneNumber.php', + 'PhabricatorPhoneNumberTestCase' => 'applications/metamta/message/__tests__/PhabricatorPhoneNumberTestCase.php', + 'PhabricatorPhortuneApplication' => 'applications/phortune/application/PhabricatorPhortuneApplication.php', + 'PhabricatorPhortuneContentSource' => 'applications/phortune/contentsource/PhabricatorPhortuneContentSource.php', + 'PhabricatorPhortuneManagementInvoiceWorkflow' => 'applications/phortune/management/PhabricatorPhortuneManagementInvoiceWorkflow.php', + 'PhabricatorPhortuneManagementWorkflow' => 'applications/phortune/management/PhabricatorPhortuneManagementWorkflow.php', + 'PhabricatorPhortuneTestCase' => 'applications/phortune/__tests__/PhabricatorPhortuneTestCase.php', + 'PhabricatorPhrequentApplication' => 'applications/phrequent/application/PhabricatorPhrequentApplication.php', + 'PhabricatorPhrictionApplication' => 'applications/phriction/application/PhabricatorPhrictionApplication.php', + 'PhabricatorPhurlApplication' => 'applications/phurl/application/PhabricatorPhurlApplication.php', + 'PhabricatorPhurlConfigOptions' => 'applications/config/option/PhabricatorPhurlConfigOptions.php', + 'PhabricatorPhurlController' => 'applications/phurl/controller/PhabricatorPhurlController.php', + 'PhabricatorPhurlDAO' => 'applications/phurl/storage/PhabricatorPhurlDAO.php', + 'PhabricatorPhurlLinkRemarkupRule' => 'applications/phurl/remarkup/PhabricatorPhurlLinkRemarkupRule.php', + 'PhabricatorPhurlRemarkupRule' => 'applications/phurl/remarkup/PhabricatorPhurlRemarkupRule.php', + 'PhabricatorPhurlSchemaSpec' => 'applications/phurl/storage/PhabricatorPhurlSchemaSpec.php', + 'PhabricatorPhurlShortURLController' => 'applications/phurl/controller/PhabricatorPhurlShortURLController.php', + 'PhabricatorPhurlShortURLDefaultController' => 'applications/phurl/controller/PhabricatorPhurlShortURLDefaultController.php', + 'PhabricatorPhurlURL' => 'applications/phurl/storage/PhabricatorPhurlURL.php', + 'PhabricatorPhurlURLAccessController' => 'applications/phurl/controller/PhabricatorPhurlURLAccessController.php', + 'PhabricatorPhurlURLAliasTransaction' => 'applications/phurl/xaction/PhabricatorPhurlURLAliasTransaction.php', + 'PhabricatorPhurlURLCreateCapability' => 'applications/phurl/capability/PhabricatorPhurlURLCreateCapability.php', + 'PhabricatorPhurlURLDatasource' => 'applications/phurl/typeahead/PhabricatorPhurlURLDatasource.php', + 'PhabricatorPhurlURLDescriptionTransaction' => 'applications/phurl/xaction/PhabricatorPhurlURLDescriptionTransaction.php', + 'PhabricatorPhurlURLEditConduitAPIMethod' => 'applications/phurl/conduit/PhabricatorPhurlURLEditConduitAPIMethod.php', + 'PhabricatorPhurlURLEditController' => 'applications/phurl/controller/PhabricatorPhurlURLEditController.php', + 'PhabricatorPhurlURLEditEngine' => 'applications/phurl/editor/PhabricatorPhurlURLEditEngine.php', + 'PhabricatorPhurlURLEditor' => 'applications/phurl/editor/PhabricatorPhurlURLEditor.php', + 'PhabricatorPhurlURLListController' => 'applications/phurl/controller/PhabricatorPhurlURLListController.php', + 'PhabricatorPhurlURLLongURLTransaction' => 'applications/phurl/xaction/PhabricatorPhurlURLLongURLTransaction.php', + 'PhabricatorPhurlURLMailReceiver' => 'applications/phurl/mail/PhabricatorPhurlURLMailReceiver.php', + 'PhabricatorPhurlURLNameNgrams' => 'applications/phurl/storage/PhabricatorPhurlURLNameNgrams.php', + 'PhabricatorPhurlURLNameTransaction' => 'applications/phurl/xaction/PhabricatorPhurlURLNameTransaction.php', + 'PhabricatorPhurlURLPHIDType' => 'applications/phurl/phid/PhabricatorPhurlURLPHIDType.php', + 'PhabricatorPhurlURLQuery' => 'applications/phurl/query/PhabricatorPhurlURLQuery.php', + 'PhabricatorPhurlURLReplyHandler' => 'applications/phurl/mail/PhabricatorPhurlURLReplyHandler.php', + 'PhabricatorPhurlURLSearchConduitAPIMethod' => 'applications/phurl/conduit/PhabricatorPhurlURLSearchConduitAPIMethod.php', + 'PhabricatorPhurlURLSearchEngine' => 'applications/phurl/query/PhabricatorPhurlURLSearchEngine.php', + 'PhabricatorPhurlURLTransaction' => 'applications/phurl/storage/PhabricatorPhurlURLTransaction.php', + 'PhabricatorPhurlURLTransactionComment' => 'applications/phurl/storage/PhabricatorPhurlURLTransactionComment.php', + 'PhabricatorPhurlURLTransactionQuery' => 'applications/phurl/query/PhabricatorPhurlURLTransactionQuery.php', + 'PhabricatorPhurlURLTransactionType' => 'applications/phurl/xaction/PhabricatorPhurlURLTransactionType.php', + 'PhabricatorPhurlURLViewController' => 'applications/phurl/controller/PhabricatorPhurlURLViewController.php', + 'PhabricatorPinnedApplicationsSetting' => 'applications/settings/setting/PhabricatorPinnedApplicationsSetting.php', + 'PhabricatorPirateEnglishTranslation' => 'infrastructure/internationalization/translation/PhabricatorPirateEnglishTranslation.php', + 'PhabricatorPlatform404Controller' => 'applications/base/controller/PhabricatorPlatform404Controller.php', + 'PhabricatorPlatformSite' => 'aphront/site/PhabricatorPlatformSite.php', + 'PhabricatorPointsEditField' => 'applications/transactions/editfield/PhabricatorPointsEditField.php', + 'PhabricatorPointsFact' => 'applications/fact/fact/PhabricatorPointsFact.php', 'PhabricatorPolicies' => 'applications/policy/constants/PhabricatorPolicies.php', - 'PhabricatorPolicy' => 'applications/policy/filter/PhabricatorPolicy.php', + 'PhabricatorPolicy' => 'applications/policy/storage/PhabricatorPolicy.php', + 'PhabricatorPolicyApplication' => 'applications/policy/application/PhabricatorPolicyApplication.php', 'PhabricatorPolicyAwareQuery' => 'infrastructure/query/policy/PhabricatorPolicyAwareQuery.php', 'PhabricatorPolicyAwareTestQuery' => 'applications/policy/__tests__/PhabricatorPolicyAwareTestQuery.php', - 'PhabricatorPolicyCapability' => 'applications/policy/constants/PhabricatorPolicyCapability.php', - 'PhabricatorPolicyConfigOptions' => 'applications/config/option/PhabricatorPolicyConfigOptions.php', + 'PhabricatorPolicyCanEditCapability' => 'applications/policy/capability/PhabricatorPolicyCanEditCapability.php', + 'PhabricatorPolicyCanInteractCapability' => 'applications/policy/capability/PhabricatorPolicyCanInteractCapability.php', + 'PhabricatorPolicyCanJoinCapability' => 'applications/policy/capability/PhabricatorPolicyCanJoinCapability.php', + 'PhabricatorPolicyCanViewCapability' => 'applications/policy/capability/PhabricatorPolicyCanViewCapability.php', + 'PhabricatorPolicyCapability' => 'applications/policy/capability/PhabricatorPolicyCapability.php', + 'PhabricatorPolicyCapabilityTestCase' => 'applications/policy/capability/__tests__/PhabricatorPolicyCapabilityTestCase.php', + 'PhabricatorPolicyCodex' => 'applications/policy/codex/PhabricatorPolicyCodex.php', + 'PhabricatorPolicyCodexInterface' => 'applications/policy/codex/PhabricatorPolicyCodexInterface.php', + 'PhabricatorPolicyCodexRuleDescription' => 'applications/policy/codex/PhabricatorPolicyCodexRuleDescription.php', + 'PhabricatorPolicyConfigOptions' => 'applications/policy/config/PhabricatorPolicyConfigOptions.php', 'PhabricatorPolicyConstants' => 'applications/policy/constants/PhabricatorPolicyConstants.php', + 'PhabricatorPolicyController' => 'applications/policy/controller/PhabricatorPolicyController.php', + 'PhabricatorPolicyDAO' => 'applications/policy/storage/PhabricatorPolicyDAO.php', + 'PhabricatorPolicyDataTestCase' => 'applications/policy/__tests__/PhabricatorPolicyDataTestCase.php', + 'PhabricatorPolicyEditController' => 'applications/policy/controller/PhabricatorPolicyEditController.php', + 'PhabricatorPolicyEditEngineExtension' => 'applications/policy/editor/PhabricatorPolicyEditEngineExtension.php', + 'PhabricatorPolicyEditField' => 'applications/transactions/editfield/PhabricatorPolicyEditField.php', 'PhabricatorPolicyException' => 'applications/policy/exception/PhabricatorPolicyException.php', + 'PhabricatorPolicyExplainController' => 'applications/policy/controller/PhabricatorPolicyExplainController.php', + 'PhabricatorPolicyFavoritesSetting' => 'applications/settings/setting/PhabricatorPolicyFavoritesSetting.php', 'PhabricatorPolicyFilter' => 'applications/policy/filter/PhabricatorPolicyFilter.php', + 'PhabricatorPolicyFilterSet' => 'applications/policy/filter/PhabricatorPolicyFilterSet.php', 'PhabricatorPolicyInterface' => 'applications/policy/interface/PhabricatorPolicyInterface.php', + 'PhabricatorPolicyManagementShowWorkflow' => 'applications/policy/management/PhabricatorPolicyManagementShowWorkflow.php', + 'PhabricatorPolicyManagementUnlockWorkflow' => 'applications/policy/management/PhabricatorPolicyManagementUnlockWorkflow.php', + 'PhabricatorPolicyManagementWorkflow' => 'applications/policy/management/PhabricatorPolicyManagementWorkflow.php', + 'PhabricatorPolicyPHIDTypePolicy' => 'applications/policy/phid/PhabricatorPolicyPHIDTypePolicy.php', 'PhabricatorPolicyQuery' => 'applications/policy/query/PhabricatorPolicyQuery.php', + 'PhabricatorPolicyRef' => 'applications/policy/view/PhabricatorPolicyRef.php', + 'PhabricatorPolicyRequestExceptionHandler' => 'aphront/handler/PhabricatorPolicyRequestExceptionHandler.php', + 'PhabricatorPolicyRule' => 'applications/policy/rule/PhabricatorPolicyRule.php', + 'PhabricatorPolicyRulesView' => 'applications/policy/view/PhabricatorPolicyRulesView.php', + 'PhabricatorPolicySearchEngineExtension' => 'applications/policy/engineextension/PhabricatorPolicySearchEngineExtension.php', 'PhabricatorPolicyTestCase' => 'applications/policy/__tests__/PhabricatorPolicyTestCase.php', 'PhabricatorPolicyTestObject' => 'applications/policy/__tests__/PhabricatorPolicyTestObject.php', 'PhabricatorPolicyType' => 'applications/policy/constants/PhabricatorPolicyType.php', + 'PhabricatorPonderApplication' => 'applications/ponder/application/PhabricatorPonderApplication.php', + 'PhabricatorPreambleTestCase' => 'infrastructure/util/__tests__/PhabricatorPreambleTestCase.php', + 'PhabricatorPrimaryEmailUserLogType' => 'applications/people/userlog/PhabricatorPrimaryEmailUserLogType.php', + 'PhabricatorProfileMenuEditEngine' => 'applications/search/editor/PhabricatorProfileMenuEditEngine.php', + 'PhabricatorProfileMenuEditor' => 'applications/search/editor/PhabricatorProfileMenuEditor.php', + 'PhabricatorProfileMenuEngine' => 'applications/search/engine/PhabricatorProfileMenuEngine.php', + 'PhabricatorProfileMenuItem' => 'applications/search/menuitem/PhabricatorProfileMenuItem.php', + 'PhabricatorProfileMenuItemAffectsObjectEdgeType' => 'applications/search/edge/PhabricatorProfileMenuItemAffectsObjectEdgeType.php', + 'PhabricatorProfileMenuItemConfiguration' => 'applications/search/storage/PhabricatorProfileMenuItemConfiguration.php', + 'PhabricatorProfileMenuItemConfigurationQuery' => 'applications/search/query/PhabricatorProfileMenuItemConfigurationQuery.php', + 'PhabricatorProfileMenuItemConfigurationTransaction' => 'applications/search/storage/PhabricatorProfileMenuItemConfigurationTransaction.php', + 'PhabricatorProfileMenuItemConfigurationTransactionQuery' => 'applications/search/query/PhabricatorProfileMenuItemConfigurationTransactionQuery.php', + 'PhabricatorProfileMenuItemIconSet' => 'applications/search/menuitem/PhabricatorProfileMenuItemIconSet.php', + 'PhabricatorProfileMenuItemIndexEngineExtension' => 'applications/search/engineextension/PhabricatorProfileMenuItemIndexEngineExtension.php', + 'PhabricatorProfileMenuItemPHIDType' => 'applications/search/phidtype/PhabricatorProfileMenuItemPHIDType.php', + 'PhabricatorProfileMenuItemView' => 'applications/search/engine/PhabricatorProfileMenuItemView.php', + 'PhabricatorProfileMenuItemViewList' => 'applications/search/engine/PhabricatorProfileMenuItemViewList.php', 'PhabricatorProject' => 'applications/project/storage/PhabricatorProject.php', - 'PhabricatorProjectConstants' => 'applications/project/constants/PhabricatorProjectConstants.php', + 'PhabricatorProjectActivityChartEngine' => 'applications/project/chart/PhabricatorProjectActivityChartEngine.php', + 'PhabricatorProjectAddHeraldAction' => 'applications/project/herald/PhabricatorProjectAddHeraldAction.php', + 'PhabricatorProjectApplication' => 'applications/project/application/PhabricatorProjectApplication.php', + 'PhabricatorProjectArchiveController' => 'applications/project/controller/PhabricatorProjectArchiveController.php', + 'PhabricatorProjectBoardBackgroundController' => 'applications/project/controller/PhabricatorProjectBoardBackgroundController.php', + 'PhabricatorProjectBoardController' => 'applications/project/controller/PhabricatorProjectBoardController.php', + 'PhabricatorProjectBoardDefaultController' => 'applications/project/controller/PhabricatorProjectBoardDefaultController.php', + 'PhabricatorProjectBoardDisableController' => 'applications/project/controller/PhabricatorProjectBoardDisableController.php', + 'PhabricatorProjectBoardFilterController' => 'applications/project/controller/PhabricatorProjectBoardFilterController.php', + 'PhabricatorProjectBoardImportController' => 'applications/project/controller/PhabricatorProjectBoardImportController.php', + 'PhabricatorProjectBoardManageController' => 'applications/project/controller/PhabricatorProjectBoardManageController.php', + 'PhabricatorProjectBoardReloadController' => 'applications/project/controller/PhabricatorProjectBoardReloadController.php', + 'PhabricatorProjectBoardReorderController' => 'applications/project/controller/PhabricatorProjectBoardReorderController.php', + 'PhabricatorProjectBoardViewController' => 'applications/project/controller/PhabricatorProjectBoardViewController.php', + 'PhabricatorProjectBuiltinsExample' => 'applications/uiexample/examples/PhabricatorProjectBuiltinsExample.php', + 'PhabricatorProjectBurndownChartEngine' => 'applications/project/chart/PhabricatorProjectBurndownChartEngine.php', + 'PhabricatorProjectCardView' => 'applications/project/view/PhabricatorProjectCardView.php', + 'PhabricatorProjectColorTransaction' => 'applications/project/xaction/PhabricatorProjectColorTransaction.php', + 'PhabricatorProjectColorsConfigType' => 'applications/project/config/PhabricatorProjectColorsConfigType.php', + 'PhabricatorProjectColumn' => 'applications/project/storage/PhabricatorProjectColumn.php', + 'PhabricatorProjectColumnAuthorOrder' => 'applications/project/order/PhabricatorProjectColumnAuthorOrder.php', + 'PhabricatorProjectColumnBulkEditController' => 'applications/project/controller/PhabricatorProjectColumnBulkEditController.php', + 'PhabricatorProjectColumnBulkMoveController' => 'applications/project/controller/PhabricatorProjectColumnBulkMoveController.php', + 'PhabricatorProjectColumnCreatedOrder' => 'applications/project/order/PhabricatorProjectColumnCreatedOrder.php', + 'PhabricatorProjectColumnDetailController' => 'applications/project/controller/PhabricatorProjectColumnDetailController.php', + 'PhabricatorProjectColumnEditController' => 'applications/project/controller/PhabricatorProjectColumnEditController.php', + 'PhabricatorProjectColumnHeader' => 'applications/project/order/PhabricatorProjectColumnHeader.php', + 'PhabricatorProjectColumnHideController' => 'applications/project/controller/PhabricatorProjectColumnHideController.php', + 'PhabricatorProjectColumnLimitTransaction' => 'applications/project/xaction/column/PhabricatorProjectColumnLimitTransaction.php', + 'PhabricatorProjectColumnNameTransaction' => 'applications/project/xaction/column/PhabricatorProjectColumnNameTransaction.php', + 'PhabricatorProjectColumnNaturalOrder' => 'applications/project/order/PhabricatorProjectColumnNaturalOrder.php', + 'PhabricatorProjectColumnOrder' => 'applications/project/order/PhabricatorProjectColumnOrder.php', + 'PhabricatorProjectColumnOwnerOrder' => 'applications/project/order/PhabricatorProjectColumnOwnerOrder.php', + 'PhabricatorProjectColumnPHIDType' => 'applications/project/phid/PhabricatorProjectColumnPHIDType.php', + 'PhabricatorProjectColumnPointsOrder' => 'applications/project/order/PhabricatorProjectColumnPointsOrder.php', + 'PhabricatorProjectColumnPosition' => 'applications/project/storage/PhabricatorProjectColumnPosition.php', + 'PhabricatorProjectColumnPositionQuery' => 'applications/project/query/PhabricatorProjectColumnPositionQuery.php', + 'PhabricatorProjectColumnPriorityOrder' => 'applications/project/order/PhabricatorProjectColumnPriorityOrder.php', + 'PhabricatorProjectColumnQuery' => 'applications/project/query/PhabricatorProjectColumnQuery.php', + 'PhabricatorProjectColumnRemoveTriggerController' => 'applications/project/controller/PhabricatorProjectColumnRemoveTriggerController.php', + 'PhabricatorProjectColumnSearchEngine' => 'applications/project/query/PhabricatorProjectColumnSearchEngine.php', + 'PhabricatorProjectColumnStatusOrder' => 'applications/project/order/PhabricatorProjectColumnStatusOrder.php', + 'PhabricatorProjectColumnStatusTransaction' => 'applications/project/xaction/column/PhabricatorProjectColumnStatusTransaction.php', + 'PhabricatorProjectColumnTitleOrder' => 'applications/project/order/PhabricatorProjectColumnTitleOrder.php', + 'PhabricatorProjectColumnTransaction' => 'applications/project/storage/PhabricatorProjectColumnTransaction.php', + 'PhabricatorProjectColumnTransactionEditor' => 'applications/project/editor/PhabricatorProjectColumnTransactionEditor.php', + 'PhabricatorProjectColumnTransactionQuery' => 'applications/project/query/PhabricatorProjectColumnTransactionQuery.php', + 'PhabricatorProjectColumnTransactionType' => 'applications/project/xaction/column/PhabricatorProjectColumnTransactionType.php', + 'PhabricatorProjectColumnTriggerTransaction' => 'applications/project/xaction/column/PhabricatorProjectColumnTriggerTransaction.php', + 'PhabricatorProjectColumnViewQueryController' => 'applications/project/controller/PhabricatorProjectColumnViewQueryController.php', + 'PhabricatorProjectConfigOptions' => 'applications/project/config/PhabricatorProjectConfigOptions.php', + 'PhabricatorProjectConfiguredCustomField' => 'applications/project/customfield/PhabricatorProjectConfiguredCustomField.php', 'PhabricatorProjectController' => 'applications/project/controller/PhabricatorProjectController.php', - 'PhabricatorProjectCreateController' => 'applications/project/controller/PhabricatorProjectCreateController.php', + 'PhabricatorProjectCoreTestCase' => 'applications/project/__tests__/PhabricatorProjectCoreTestCase.php', + 'PhabricatorProjectCoverController' => 'applications/project/controller/PhabricatorProjectCoverController.php', + 'PhabricatorProjectCustomField' => 'applications/project/customfield/PhabricatorProjectCustomField.php', + 'PhabricatorProjectCustomFieldNumericIndex' => 'applications/project/storage/PhabricatorProjectCustomFieldNumericIndex.php', + 'PhabricatorProjectCustomFieldStorage' => 'applications/project/storage/PhabricatorProjectCustomFieldStorage.php', + 'PhabricatorProjectCustomFieldStringIndex' => 'applications/project/storage/PhabricatorProjectCustomFieldStringIndex.php', 'PhabricatorProjectDAO' => 'applications/project/storage/PhabricatorProjectDAO.php', - 'PhabricatorProjectEditor' => 'applications/project/editor/PhabricatorProjectEditor.php', - 'PhabricatorProjectEditorTestCase' => 'applications/project/editor/__tests__/PhabricatorProjectEditorTestCase.php', + 'PhabricatorProjectDatasource' => 'applications/project/typeahead/PhabricatorProjectDatasource.php', + 'PhabricatorProjectDescriptionField' => 'applications/project/customfield/PhabricatorProjectDescriptionField.php', + 'PhabricatorProjectDetailsProfileMenuItem' => 'applications/project/menuitem/PhabricatorProjectDetailsProfileMenuItem.php', + 'PhabricatorProjectDropEffect' => 'applications/project/icon/PhabricatorProjectDropEffect.php', + 'PhabricatorProjectEditController' => 'applications/project/controller/PhabricatorProjectEditController.php', + 'PhabricatorProjectEditEngine' => 'applications/project/engine/PhabricatorProjectEditEngine.php', + 'PhabricatorProjectEditPictureController' => 'applications/project/controller/PhabricatorProjectEditPictureController.php', + 'PhabricatorProjectFerretEngine' => 'applications/project/search/PhabricatorProjectFerretEngine.php', + 'PhabricatorProjectFilterTransaction' => 'applications/project/xaction/PhabricatorProjectFilterTransaction.php', + 'PhabricatorProjectFulltextEngine' => 'applications/project/search/PhabricatorProjectFulltextEngine.php', + 'PhabricatorProjectHeraldAction' => 'applications/project/herald/PhabricatorProjectHeraldAction.php', + 'PhabricatorProjectHeraldAdapter' => 'applications/project/herald/PhabricatorProjectHeraldAdapter.php', + 'PhabricatorProjectHeraldFieldGroup' => 'applications/project/herald/PhabricatorProjectHeraldFieldGroup.php', + 'PhabricatorProjectHovercardEngineExtension' => 'applications/project/engineextension/PhabricatorProjectHovercardEngineExtension.php', + 'PhabricatorProjectIconSet' => 'applications/project/icon/PhabricatorProjectIconSet.php', + 'PhabricatorProjectIconTransaction' => 'applications/project/xaction/PhabricatorProjectIconTransaction.php', + 'PhabricatorProjectIconsConfigType' => 'applications/project/config/PhabricatorProjectIconsConfigType.php', + 'PhabricatorProjectImageTransaction' => 'applications/project/xaction/PhabricatorProjectImageTransaction.php', + 'PhabricatorProjectInterface' => 'applications/project/interface/PhabricatorProjectInterface.php', 'PhabricatorProjectListController' => 'applications/project/controller/PhabricatorProjectListController.php', - 'PhabricatorProjectMembersEditController' => 'applications/project/controller/PhabricatorProjectMembersEditController.php', - 'PhabricatorProjectNameCollisionException' => 'applications/project/exception/PhabricatorProjectNameCollisionException.php', - 'PhabricatorProjectPHIDTypeProject' => 'applications/project/phid/PhabricatorProjectPHIDTypeProject.php', - 'PhabricatorProjectProfile' => 'applications/project/storage/PhabricatorProjectProfile.php', + 'PhabricatorProjectListView' => 'applications/project/view/PhabricatorProjectListView.php', + 'PhabricatorProjectLockController' => 'applications/project/controller/PhabricatorProjectLockController.php', + 'PhabricatorProjectLockTransaction' => 'applications/project/xaction/PhabricatorProjectLockTransaction.php', + 'PhabricatorProjectLogicalAncestorDatasource' => 'applications/project/typeahead/PhabricatorProjectLogicalAncestorDatasource.php', + 'PhabricatorProjectLogicalDatasource' => 'applications/project/typeahead/PhabricatorProjectLogicalDatasource.php', + 'PhabricatorProjectLogicalOnlyDatasource' => 'applications/project/typeahead/PhabricatorProjectLogicalOnlyDatasource.php', + 'PhabricatorProjectLogicalOrNotDatasource' => 'applications/project/typeahead/PhabricatorProjectLogicalOrNotDatasource.php', + 'PhabricatorProjectLogicalUserDatasource' => 'applications/project/typeahead/PhabricatorProjectLogicalUserDatasource.php', + 'PhabricatorProjectLogicalViewerDatasource' => 'applications/project/typeahead/PhabricatorProjectLogicalViewerDatasource.php', + 'PhabricatorProjectManageController' => 'applications/project/controller/PhabricatorProjectManageController.php', + 'PhabricatorProjectManageProfileMenuItem' => 'applications/project/menuitem/PhabricatorProjectManageProfileMenuItem.php', + 'PhabricatorProjectMaterializedMemberEdgeType' => 'applications/project/edge/PhabricatorProjectMaterializedMemberEdgeType.php', + 'PhabricatorProjectMemberListView' => 'applications/project/view/PhabricatorProjectMemberListView.php', + 'PhabricatorProjectMemberOfProjectEdgeType' => 'applications/project/edge/PhabricatorProjectMemberOfProjectEdgeType.php', + 'PhabricatorProjectMembersAddController' => 'applications/project/controller/PhabricatorProjectMembersAddController.php', + 'PhabricatorProjectMembersDatasource' => 'applications/project/typeahead/PhabricatorProjectMembersDatasource.php', + 'PhabricatorProjectMembersPolicyRule' => 'applications/project/policyrule/PhabricatorProjectMembersPolicyRule.php', + 'PhabricatorProjectMembersProfileMenuItem' => 'applications/project/menuitem/PhabricatorProjectMembersProfileMenuItem.php', + 'PhabricatorProjectMembersRemoveController' => 'applications/project/controller/PhabricatorProjectMembersRemoveController.php', + 'PhabricatorProjectMembersViewController' => 'applications/project/controller/PhabricatorProjectMembersViewController.php', + 'PhabricatorProjectMenuItemController' => 'applications/project/controller/PhabricatorProjectMenuItemController.php', + 'PhabricatorProjectMilestoneTransaction' => 'applications/project/xaction/PhabricatorProjectMilestoneTransaction.php', + 'PhabricatorProjectMoveController' => 'applications/project/controller/PhabricatorProjectMoveController.php', + 'PhabricatorProjectNameContextFreeGrammar' => 'applications/project/lipsum/PhabricatorProjectNameContextFreeGrammar.php', + 'PhabricatorProjectNameTransaction' => 'applications/project/xaction/PhabricatorProjectNameTransaction.php', + 'PhabricatorProjectNoProjectsDatasource' => 'applications/project/typeahead/PhabricatorProjectNoProjectsDatasource.php', + 'PhabricatorProjectObjectHasProjectEdgeType' => 'applications/project/edge/PhabricatorProjectObjectHasProjectEdgeType.php', + 'PhabricatorProjectOrUserDatasource' => 'applications/project/typeahead/PhabricatorProjectOrUserDatasource.php', + 'PhabricatorProjectOrUserFunctionDatasource' => 'applications/project/typeahead/PhabricatorProjectOrUserFunctionDatasource.php', + 'PhabricatorProjectPHIDResolver' => 'applications/phid/resolver/PhabricatorProjectPHIDResolver.php', + 'PhabricatorProjectParentTransaction' => 'applications/project/xaction/PhabricatorProjectParentTransaction.php', + 'PhabricatorProjectPictureProfileMenuItem' => 'applications/project/menuitem/PhabricatorProjectPictureProfileMenuItem.php', + 'PhabricatorProjectPointsProfileMenuItem' => 'applications/project/menuitem/PhabricatorProjectPointsProfileMenuItem.php', 'PhabricatorProjectProfileController' => 'applications/project/controller/PhabricatorProjectProfileController.php', - 'PhabricatorProjectProfileEditController' => 'applications/project/controller/PhabricatorProjectProfileEditController.php', + 'PhabricatorProjectProfileMenuEngine' => 'applications/project/engine/PhabricatorProjectProfileMenuEngine.php', + 'PhabricatorProjectProfileMenuItem' => 'applications/search/menuitem/PhabricatorProjectProfileMenuItem.php', + 'PhabricatorProjectProjectHasMemberEdgeType' => 'applications/project/edge/PhabricatorProjectProjectHasMemberEdgeType.php', + 'PhabricatorProjectProjectHasObjectEdgeType' => 'applications/project/edge/PhabricatorProjectProjectHasObjectEdgeType.php', + 'PhabricatorProjectProjectPHIDType' => 'applications/project/phid/PhabricatorProjectProjectPHIDType.php', 'PhabricatorProjectQuery' => 'applications/project/query/PhabricatorProjectQuery.php', + 'PhabricatorProjectRemoveHeraldAction' => 'applications/project/herald/PhabricatorProjectRemoveHeraldAction.php', + 'PhabricatorProjectReportsController' => 'applications/project/controller/PhabricatorProjectReportsController.php', + 'PhabricatorProjectReportsProfileMenuItem' => 'applications/project/menuitem/PhabricatorProjectReportsProfileMenuItem.php', + 'PhabricatorProjectSchemaSpec' => 'applications/project/storage/PhabricatorProjectSchemaSpec.php', 'PhabricatorProjectSearchEngine' => 'applications/project/query/PhabricatorProjectSearchEngine.php', + 'PhabricatorProjectSearchField' => 'applications/project/searchfield/PhabricatorProjectSearchField.php', + 'PhabricatorProjectSilenceController' => 'applications/project/controller/PhabricatorProjectSilenceController.php', + 'PhabricatorProjectSilencedEdgeType' => 'applications/project/edge/PhabricatorProjectSilencedEdgeType.php', + 'PhabricatorProjectSlug' => 'applications/project/storage/PhabricatorProjectSlug.php', + 'PhabricatorProjectSlugsTransaction' => 'applications/project/xaction/PhabricatorProjectSlugsTransaction.php', + 'PhabricatorProjectSortTransaction' => 'applications/project/xaction/PhabricatorProjectSortTransaction.php', + 'PhabricatorProjectStandardCustomField' => 'applications/project/customfield/PhabricatorProjectStandardCustomField.php', 'PhabricatorProjectStatus' => 'applications/project/constants/PhabricatorProjectStatus.php', + 'PhabricatorProjectStatusTransaction' => 'applications/project/xaction/PhabricatorProjectStatusTransaction.php', + 'PhabricatorProjectSubprojectWarningController' => 'applications/project/controller/PhabricatorProjectSubprojectWarningController.php', + 'PhabricatorProjectSubprojectsController' => 'applications/project/controller/PhabricatorProjectSubprojectsController.php', + 'PhabricatorProjectSubprojectsProfileMenuItem' => 'applications/project/menuitem/PhabricatorProjectSubprojectsProfileMenuItem.php', + 'PhabricatorProjectSubtypeDatasource' => 'applications/project/typeahead/PhabricatorProjectSubtypeDatasource.php', + 'PhabricatorProjectSubtypesConfigType' => 'applications/project/config/PhabricatorProjectSubtypesConfigType.php', + 'PhabricatorProjectTagsAddedField' => 'applications/project/herald/PhabricatorProjectTagsAddedField.php', + 'PhabricatorProjectTagsField' => 'applications/project/herald/PhabricatorProjectTagsField.php', + 'PhabricatorProjectTagsRemovedField' => 'applications/project/herald/PhabricatorProjectTagsRemovedField.php', 'PhabricatorProjectTestDataGenerator' => 'applications/project/lipsum/PhabricatorProjectTestDataGenerator.php', 'PhabricatorProjectTransaction' => 'applications/project/storage/PhabricatorProjectTransaction.php', - 'PhabricatorProjectTransactionType' => 'applications/project/constants/PhabricatorProjectTransactionType.php', + 'PhabricatorProjectTransactionEditor' => 'applications/project/editor/PhabricatorProjectTransactionEditor.php', + 'PhabricatorProjectTransactionQuery' => 'applications/project/query/PhabricatorProjectTransactionQuery.php', + 'PhabricatorProjectTransactionType' => 'applications/project/xaction/PhabricatorProjectTransactionType.php', + 'PhabricatorProjectTrigger' => 'applications/project/storage/PhabricatorProjectTrigger.php', + 'PhabricatorProjectTriggerAddProjectsRule' => 'applications/project/trigger/PhabricatorProjectTriggerAddProjectsRule.php', + 'PhabricatorProjectTriggerController' => 'applications/project/controller/trigger/PhabricatorProjectTriggerController.php', + 'PhabricatorProjectTriggerCorruptionException' => 'applications/project/exception/PhabricatorProjectTriggerCorruptionException.php', + 'PhabricatorProjectTriggerEditController' => 'applications/project/controller/trigger/PhabricatorProjectTriggerEditController.php', + 'PhabricatorProjectTriggerEditor' => 'applications/project/editor/PhabricatorProjectTriggerEditor.php', + 'PhabricatorProjectTriggerInvalidRule' => 'applications/project/trigger/PhabricatorProjectTriggerInvalidRule.php', + 'PhabricatorProjectTriggerListController' => 'applications/project/controller/trigger/PhabricatorProjectTriggerListController.php', + 'PhabricatorProjectTriggerManiphestOwnerRule' => 'applications/project/trigger/PhabricatorProjectTriggerManiphestOwnerRule.php', + 'PhabricatorProjectTriggerManiphestPriorityRule' => 'applications/project/trigger/PhabricatorProjectTriggerManiphestPriorityRule.php', + 'PhabricatorProjectTriggerManiphestStatusRule' => 'applications/project/trigger/PhabricatorProjectTriggerManiphestStatusRule.php', + 'PhabricatorProjectTriggerNameTransaction' => 'applications/project/xaction/trigger/PhabricatorProjectTriggerNameTransaction.php', + 'PhabricatorProjectTriggerPHIDType' => 'applications/project/phid/PhabricatorProjectTriggerPHIDType.php', + 'PhabricatorProjectTriggerPlaySoundRule' => 'applications/project/trigger/PhabricatorProjectTriggerPlaySoundRule.php', + 'PhabricatorProjectTriggerQuery' => 'applications/project/query/PhabricatorProjectTriggerQuery.php', + 'PhabricatorProjectTriggerRemoveProjectsRule' => 'applications/project/trigger/PhabricatorProjectTriggerRemoveProjectsRule.php', + 'PhabricatorProjectTriggerRule' => 'applications/project/trigger/PhabricatorProjectTriggerRule.php', + 'PhabricatorProjectTriggerRuleRecord' => 'applications/project/trigger/PhabricatorProjectTriggerRuleRecord.php', + 'PhabricatorProjectTriggerRulesetTransaction' => 'applications/project/xaction/trigger/PhabricatorProjectTriggerRulesetTransaction.php', + 'PhabricatorProjectTriggerSearchEngine' => 'applications/project/query/PhabricatorProjectTriggerSearchEngine.php', + 'PhabricatorProjectTriggerTransaction' => 'applications/project/storage/PhabricatorProjectTriggerTransaction.php', + 'PhabricatorProjectTriggerTransactionQuery' => 'applications/project/query/PhabricatorProjectTriggerTransactionQuery.php', + 'PhabricatorProjectTriggerTransactionType' => 'applications/project/xaction/trigger/PhabricatorProjectTriggerTransactionType.php', + 'PhabricatorProjectTriggerUnknownRule' => 'applications/project/trigger/PhabricatorProjectTriggerUnknownRule.php', + 'PhabricatorProjectTriggerUsage' => 'applications/project/storage/PhabricatorProjectTriggerUsage.php', + 'PhabricatorProjectTriggerUsageIndexEngineExtension' => 'applications/project/engineextension/PhabricatorProjectTriggerUsageIndexEngineExtension.php', + 'PhabricatorProjectTriggerViewController' => 'applications/project/controller/trigger/PhabricatorProjectTriggerViewController.php', + 'PhabricatorProjectTypeTransaction' => 'applications/project/xaction/PhabricatorProjectTypeTransaction.php', + 'PhabricatorProjectUIEventListener' => 'applications/project/events/PhabricatorProjectUIEventListener.php', 'PhabricatorProjectUpdateController' => 'applications/project/controller/PhabricatorProjectUpdateController.php', - 'PhabricatorPropertyListExample' => 'applications/uiexample/examples/PhabricatorPropertyListExample.php', - 'PhabricatorPropertyListView' => 'view/layout/PhabricatorPropertyListView.php', + 'PhabricatorProjectUserFunctionDatasource' => 'applications/project/typeahead/PhabricatorProjectUserFunctionDatasource.php', + 'PhabricatorProjectUserListView' => 'applications/project/view/PhabricatorProjectUserListView.php', + 'PhabricatorProjectViewController' => 'applications/project/controller/PhabricatorProjectViewController.php', + 'PhabricatorProjectWatchController' => 'applications/project/controller/PhabricatorProjectWatchController.php', + 'PhabricatorProjectWatcherListView' => 'applications/project/view/PhabricatorProjectWatcherListView.php', + 'PhabricatorProjectWorkboardBackgroundColor' => 'applications/project/constants/PhabricatorProjectWorkboardBackgroundColor.php', + 'PhabricatorProjectWorkboardBackgroundTransaction' => 'applications/project/xaction/PhabricatorProjectWorkboardBackgroundTransaction.php', + 'PhabricatorProjectWorkboardProfileMenuItem' => 'applications/project/menuitem/PhabricatorProjectWorkboardProfileMenuItem.php', + 'PhabricatorProjectWorkboardTransaction' => 'applications/project/xaction/PhabricatorProjectWorkboardTransaction.php', + 'PhabricatorProjectsAllPolicyRule' => 'applications/project/policyrule/PhabricatorProjectsAllPolicyRule.php', + 'PhabricatorProjectsAncestorsSearchEngineAttachment' => 'applications/project/engineextension/PhabricatorProjectsAncestorsSearchEngineAttachment.php', + 'PhabricatorProjectsBasePolicyRule' => 'applications/project/policyrule/PhabricatorProjectsBasePolicyRule.php', + 'PhabricatorProjectsCurtainExtension' => 'applications/project/engineextension/PhabricatorProjectsCurtainExtension.php', + 'PhabricatorProjectsEditEngineExtension' => 'applications/project/engineextension/PhabricatorProjectsEditEngineExtension.php', + 'PhabricatorProjectsEditField' => 'applications/transactions/editfield/PhabricatorProjectsEditField.php', + 'PhabricatorProjectsExportEngineExtension' => 'infrastructure/export/engine/PhabricatorProjectsExportEngineExtension.php', + 'PhabricatorProjectsFulltextEngineExtension' => 'applications/project/engineextension/PhabricatorProjectsFulltextEngineExtension.php', + 'PhabricatorProjectsMailEngineExtension' => 'applications/project/engineextension/PhabricatorProjectsMailEngineExtension.php', + 'PhabricatorProjectsMembersSearchEngineAttachment' => 'applications/project/engineextension/PhabricatorProjectsMembersSearchEngineAttachment.php', + 'PhabricatorProjectsMembershipIndexEngineExtension' => 'applications/project/engineextension/PhabricatorProjectsMembershipIndexEngineExtension.php', + 'PhabricatorProjectsPolicyRule' => 'applications/project/policyrule/PhabricatorProjectsPolicyRule.php', + 'PhabricatorProjectsSearchEngineAttachment' => 'applications/project/engineextension/PhabricatorProjectsSearchEngineAttachment.php', + 'PhabricatorProjectsSearchEngineExtension' => 'applications/project/engineextension/PhabricatorProjectsSearchEngineExtension.php', + 'PhabricatorProjectsWatchersSearchEngineAttachment' => 'applications/project/engineextension/PhabricatorProjectsWatchersSearchEngineAttachment.php', + 'PhabricatorPronounSetting' => 'applications/settings/setting/PhabricatorPronounSetting.php', + 'PhabricatorProtocolLog' => 'infrastructure/log/PhabricatorProtocolLog.php', + 'PhabricatorPureChartFunction' => 'applications/fact/chart/PhabricatorPureChartFunction.php', + 'PhabricatorPygmentSetupCheck' => 'applications/config/check/PhabricatorPygmentSetupCheck.php', 'PhabricatorQuery' => 'infrastructure/query/PhabricatorQuery.php', + 'PhabricatorQueryConstraint' => 'infrastructure/query/constraint/PhabricatorQueryConstraint.php', + 'PhabricatorQueryCursor' => 'infrastructure/query/policy/PhabricatorQueryCursor.php', + 'PhabricatorQueryIterator' => 'infrastructure/storage/lisk/PhabricatorQueryIterator.php', + 'PhabricatorQueryOrderItem' => 'infrastructure/query/order/PhabricatorQueryOrderItem.php', + 'PhabricatorQueryOrderTestCase' => 'infrastructure/query/order/__tests__/PhabricatorQueryOrderTestCase.php', + 'PhabricatorQueryOrderVector' => 'infrastructure/query/order/PhabricatorQueryOrderVector.php', + 'PhabricatorRateLimitRequestExceptionHandler' => 'aphront/handler/PhabricatorRateLimitRequestExceptionHandler.php', + 'PhabricatorReassignEmailUserLogType' => 'applications/people/userlog/PhabricatorReassignEmailUserLogType.php', + 'PhabricatorRebuildIndexesWorker' => 'applications/search/worker/PhabricatorRebuildIndexesWorker.php', 'PhabricatorRecaptchaConfigOptions' => 'applications/config/option/PhabricatorRecaptchaConfigOptions.php', 'PhabricatorRedirectController' => 'applications/base/controller/PhabricatorRedirectController.php', 'PhabricatorRefreshCSRFController' => 'applications/auth/controller/PhabricatorRefreshCSRFController.php', + 'PhabricatorRegexListConfigType' => 'applications/config/type/PhabricatorRegexListConfigType.php', 'PhabricatorRegistrationProfile' => 'applications/people/storage/PhabricatorRegistrationProfile.php', + 'PhabricatorRemarkupCachePurger' => 'applications/cache/purger/PhabricatorRemarkupCachePurger.php', 'PhabricatorRemarkupControl' => 'view/form/control/PhabricatorRemarkupControl.php', - 'PhabricatorRemarkupRuleEmbedFile' => 'applications/files/remarkup/PhabricatorRemarkupRuleEmbedFile.php', - 'PhabricatorRemarkupRuleImageMacro' => 'applications/macro/remarkup/PhabricatorRemarkupRuleImageMacro.php', - 'PhabricatorRemarkupRuleMeme' => 'applications/macro/remarkup/PhabricatorRemarkupRuleMeme.php', - 'PhabricatorRemarkupRuleMention' => 'applications/people/remarkup/PhabricatorRemarkupRuleMention.php', - 'PhabricatorRemarkupRuleObject' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleObject.php', - 'PhabricatorRemarkupRuleYoutube' => 'infrastructure/markup/rule/PhabricatorRemarkupRuleYoutube.php', + 'PhabricatorRemarkupCowsayBlockInterpreter' => 'infrastructure/markup/interpreter/PhabricatorRemarkupCowsayBlockInterpreter.php', + 'PhabricatorRemarkupCustomBlockRule' => 'infrastructure/markup/rule/PhabricatorRemarkupCustomBlockRule.php', + 'PhabricatorRemarkupCustomInlineRule' => 'infrastructure/markup/rule/PhabricatorRemarkupCustomInlineRule.php', + 'PhabricatorRemarkupDocumentEngine' => 'applications/files/document/PhabricatorRemarkupDocumentEngine.php', + 'PhabricatorRemarkupEditField' => 'applications/transactions/editfield/PhabricatorRemarkupEditField.php', + 'PhabricatorRemarkupFigletBlockInterpreter' => 'infrastructure/markup/interpreter/PhabricatorRemarkupFigletBlockInterpreter.php', + 'PhabricatorRemarkupHyperlinkEngineExtension' => 'applications/remarkup/engineextension/PhabricatorRemarkupHyperlinkEngineExtension.php', + 'PhabricatorRemarkupUIExample' => 'applications/uiexample/examples/PhabricatorRemarkupUIExample.php', + 'PhabricatorRemoveEmailUserLogType' => 'applications/people/userlog/PhabricatorRemoveEmailUserLogType.php', + 'PhabricatorRemoveMultifactorUserLogType' => 'applications/people/userlog/PhabricatorRemoveMultifactorUserLogType.php', + 'PhabricatorRepositoriesSetupCheck' => 'applications/config/check/PhabricatorRepositoriesSetupCheck.php', 'PhabricatorRepository' => 'applications/repository/storage/PhabricatorRepository.php', - 'PhabricatorRepositoryArcanistProject' => 'applications/repository/storage/PhabricatorRepositoryArcanistProject.php', - 'PhabricatorRepositoryArcanistProjectDeleteController' => 'applications/repository/controller/PhabricatorRepositoryArcanistProjectDeleteController.php', - 'PhabricatorRepositoryArcanistProjectEditController' => 'applications/repository/controller/PhabricatorRepositoryArcanistProjectEditController.php', - 'PhabricatorRepositoryArcanistProjectQuery' => 'applications/repository/query/PhabricatorRepositoryArcanistProjectQuery.php', + 'PhabricatorRepositoryActivateTransaction' => 'applications/repository/xaction/PhabricatorRepositoryActivateTransaction.php', 'PhabricatorRepositoryAuditRequest' => 'applications/repository/storage/PhabricatorRepositoryAuditRequest.php', + 'PhabricatorRepositoryBlueprintsTransaction' => 'applications/repository/xaction/PhabricatorRepositoryBlueprintsTransaction.php', 'PhabricatorRepositoryBranch' => 'applications/repository/storage/PhabricatorRepositoryBranch.php', + 'PhabricatorRepositoryCallsignTransaction' => 'applications/repository/xaction/PhabricatorRepositoryCallsignTransaction.php', 'PhabricatorRepositoryCommit' => 'applications/repository/storage/PhabricatorRepositoryCommit.php', 'PhabricatorRepositoryCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php', 'PhabricatorRepositoryCommitData' => 'applications/repository/storage/PhabricatorRepositoryCommitData.php', - 'PhabricatorRepositoryCommitHeraldWorker' => 'applications/repository/worker/PhabricatorRepositoryCommitHeraldWorker.php', + 'PhabricatorRepositoryCommitHint' => 'applications/repository/storage/PhabricatorRepositoryCommitHint.php', 'PhabricatorRepositoryCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php', - 'PhabricatorRepositoryCommitOwnersWorker' => 'applications/repository/worker/PhabricatorRepositoryCommitOwnersWorker.php', + 'PhabricatorRepositoryCommitPHIDType' => 'applications/repository/phid/PhabricatorRepositoryCommitPHIDType.php', 'PhabricatorRepositoryCommitParserWorker' => 'applications/repository/worker/PhabricatorRepositoryCommitParserWorker.php', + 'PhabricatorRepositoryCommitPublishWorker' => 'applications/repository/worker/PhabricatorRepositoryCommitPublishWorker.php', 'PhabricatorRepositoryCommitRef' => 'applications/repository/engine/PhabricatorRepositoryCommitRef.php', - 'PhabricatorRepositoryCommitSearchIndexer' => 'applications/repository/search/PhabricatorRepositoryCommitSearchIndexer.php', - 'PhabricatorRepositoryConfigOptions' => 'applications/repository/PhabricatorRepositoryConfigOptions.php', - 'PhabricatorRepositoryController' => 'applications/repository/controller/PhabricatorRepositoryController.php', - 'PhabricatorRepositoryCreateController' => 'applications/repository/controller/PhabricatorRepositoryCreateController.php', + 'PhabricatorRepositoryCommitTestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryCommitTestCase.php', + 'PhabricatorRepositoryConfigOptions' => 'applications/repository/config/PhabricatorRepositoryConfigOptions.php', + 'PhabricatorRepositoryCopyTimeLimitTransaction' => 'applications/repository/xaction/PhabricatorRepositoryCopyTimeLimitTransaction.php', 'PhabricatorRepositoryDAO' => 'applications/repository/storage/PhabricatorRepositoryDAO.php', - 'PhabricatorRepositoryDeleteController' => 'applications/repository/controller/PhabricatorRepositoryDeleteController.php', + 'PhabricatorRepositoryDangerousTransaction' => 'applications/repository/xaction/PhabricatorRepositoryDangerousTransaction.php', + 'PhabricatorRepositoryDefaultBranchTransaction' => 'applications/repository/xaction/PhabricatorRepositoryDefaultBranchTransaction.php', + 'PhabricatorRepositoryDescriptionTransaction' => 'applications/repository/xaction/PhabricatorRepositoryDescriptionTransaction.php', + 'PhabricatorRepositoryDestructibleCodex' => 'applications/repository/codex/PhabricatorRepositoryDestructibleCodex.php', 'PhabricatorRepositoryDiscoveryEngine' => 'applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php', - 'PhabricatorRepositoryEditController' => 'applications/repository/controller/PhabricatorRepositoryEditController.php', 'PhabricatorRepositoryEditor' => 'applications/repository/editor/PhabricatorRepositoryEditor.php', + 'PhabricatorRepositoryEncodingTransaction' => 'applications/repository/xaction/PhabricatorRepositoryEncodingTransaction.php', 'PhabricatorRepositoryEngine' => 'applications/repository/engine/PhabricatorRepositoryEngine.php', + 'PhabricatorRepositoryEnormousTransaction' => 'applications/repository/xaction/PhabricatorRepositoryEnormousTransaction.php', + 'PhabricatorRepositoryFerretEngine' => 'applications/repository/search/PhabricatorRepositoryFerretEngine.php', + 'PhabricatorRepositoryFetchRefsTransaction' => 'applications/repository/xaction/PhabricatorRepositoryFetchRefsTransaction.php', + 'PhabricatorRepositoryFilesizeLimitTransaction' => 'applications/repository/xaction/PhabricatorRepositoryFilesizeLimitTransaction.php', + 'PhabricatorRepositoryFulltextEngine' => 'applications/repository/search/PhabricatorRepositoryFulltextEngine.php', 'PhabricatorRepositoryGitCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryGitCommitChangeParserWorker.php', 'PhabricatorRepositoryGitCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositoryGitCommitMessageParserWorker.php', - 'PhabricatorRepositoryListController' => 'applications/repository/controller/PhabricatorRepositoryListController.php', - 'PhabricatorRepositoryManagementDeleteWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementDeleteWorkflow.php', + 'PhabricatorRepositoryGitLFSRef' => 'applications/repository/storage/PhabricatorRepositoryGitLFSRef.php', + 'PhabricatorRepositoryGitLFSRefQuery' => 'applications/repository/query/PhabricatorRepositoryGitLFSRefQuery.php', + 'PhabricatorRepositoryGraphCache' => 'applications/repository/graphcache/PhabricatorRepositoryGraphCache.php', + 'PhabricatorRepositoryGraphStream' => 'applications/repository/daemon/PhabricatorRepositoryGraphStream.php', + 'PhabricatorRepositoryIdentity' => 'applications/repository/storage/PhabricatorRepositoryIdentity.php', + 'PhabricatorRepositoryIdentityAssignTransaction' => 'applications/repository/xaction/PhabricatorRepositoryIdentityAssignTransaction.php', + 'PhabricatorRepositoryIdentityChangeWorker' => 'applications/repository/worker/PhabricatorRepositoryIdentityChangeWorker.php', + 'PhabricatorRepositoryIdentityEditEngine' => 'applications/repository/engine/PhabricatorRepositoryIdentityEditEngine.php', + 'PhabricatorRepositoryIdentityFerretEngine' => 'applications/repository/search/PhabricatorRepositoryIdentityFerretEngine.php', + 'PhabricatorRepositoryIdentityPHIDType' => 'applications/repository/phid/PhabricatorRepositoryIdentityPHIDType.php', + 'PhabricatorRepositoryIdentityQuery' => 'applications/repository/query/PhabricatorRepositoryIdentityQuery.php', + 'PhabricatorRepositoryIdentityTransaction' => 'applications/repository/storage/PhabricatorRepositoryIdentityTransaction.php', + 'PhabricatorRepositoryIdentityTransactionQuery' => 'applications/repository/query/PhabricatorRepositoryIdentityTransactionQuery.php', + 'PhabricatorRepositoryIdentityTransactionType' => 'applications/repository/xaction/PhabricatorRepositoryIdentityTransactionType.php', + 'PhabricatorRepositoryMaintenanceTransaction' => 'applications/repository/xaction/PhabricatorRepositoryMaintenanceTransaction.php', + 'PhabricatorRepositoryManagementCacheWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementCacheWorkflow.php', + 'PhabricatorRepositoryManagementClusterizeWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementClusterizeWorkflow.php', 'PhabricatorRepositoryManagementDiscoverWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementDiscoverWorkflow.php', + 'PhabricatorRepositoryManagementHintWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementHintWorkflow.php', + 'PhabricatorRepositoryManagementImportingWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementImportingWorkflow.php', + 'PhabricatorRepositoryManagementListPathsWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementListPathsWorkflow.php', 'PhabricatorRepositoryManagementListWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementListWorkflow.php', + 'PhabricatorRepositoryManagementLockWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementLockWorkflow.php', + 'PhabricatorRepositoryManagementMaintenanceWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementMaintenanceWorkflow.php', + 'PhabricatorRepositoryManagementMarkImportedWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementMarkImportedWorkflow.php', + 'PhabricatorRepositoryManagementMarkReachableWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementMarkReachableWorkflow.php', + 'PhabricatorRepositoryManagementMirrorWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementMirrorWorkflow.php', + 'PhabricatorRepositoryManagementMovePathsWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementMovePathsWorkflow.php', + 'PhabricatorRepositoryManagementParentsWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementParentsWorkflow.php', 'PhabricatorRepositoryManagementPullWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementPullWorkflow.php', + 'PhabricatorRepositoryManagementRebuildIdentitiesWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementRebuildIdentitiesWorkflow.php', + 'PhabricatorRepositoryManagementRefsWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementRefsWorkflow.php', + 'PhabricatorRepositoryManagementReparseWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementReparseWorkflow.php', + 'PhabricatorRepositoryManagementThawWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementThawWorkflow.php', + 'PhabricatorRepositoryManagementUnpublishWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementUnpublishWorkflow.php', + 'PhabricatorRepositoryManagementUpdateWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementUpdateWorkflow.php', 'PhabricatorRepositoryManagementWorkflow' => 'applications/repository/management/PhabricatorRepositoryManagementWorkflow.php', 'PhabricatorRepositoryMercurialCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryMercurialCommitChangeParserWorker.php', 'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositoryMercurialCommitMessageParserWorker.php', - 'PhabricatorRepositoryPHIDTypeArcanistProject' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeArcanistProject.php', - 'PhabricatorRepositoryPHIDTypeCommit' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeCommit.php', - 'PhabricatorRepositoryPHIDTypeRepository' => 'applications/repository/phid/PhabricatorRepositoryPHIDTypeRepository.php', + 'PhabricatorRepositoryMirror' => 'applications/repository/storage/PhabricatorRepositoryMirror.php', + 'PhabricatorRepositoryMirrorEngine' => 'applications/repository/engine/PhabricatorRepositoryMirrorEngine.php', + 'PhabricatorRepositoryNameTransaction' => 'applications/repository/xaction/PhabricatorRepositoryNameTransaction.php', + 'PhabricatorRepositoryNotifyTransaction' => 'applications/repository/xaction/PhabricatorRepositoryNotifyTransaction.php', + 'PhabricatorRepositoryOldRef' => 'applications/repository/storage/PhabricatorRepositoryOldRef.php', + 'PhabricatorRepositoryParsedChange' => 'applications/repository/data/PhabricatorRepositoryParsedChange.php', + 'PhabricatorRepositoryPermanentRefsTransaction' => 'applications/repository/xaction/PhabricatorRepositoryPermanentRefsTransaction.php', + 'PhabricatorRepositoryPublisher' => 'applications/repository/query/PhabricatorRepositoryPublisher.php', + 'PhabricatorRepositoryPublisherHoldReason' => 'applications/repository/query/PhabricatorRepositoryPublisherHoldReason.php', 'PhabricatorRepositoryPullEngine' => 'applications/repository/engine/PhabricatorRepositoryPullEngine.php', + 'PhabricatorRepositoryPullEvent' => 'applications/repository/storage/PhabricatorRepositoryPullEvent.php', + 'PhabricatorRepositoryPullEventPHIDType' => 'applications/repository/phid/PhabricatorRepositoryPullEventPHIDType.php', + 'PhabricatorRepositoryPullEventQuery' => 'applications/repository/query/PhabricatorRepositoryPullEventQuery.php', 'PhabricatorRepositoryPullLocalDaemon' => 'applications/repository/daemon/PhabricatorRepositoryPullLocalDaemon.php', + 'PhabricatorRepositoryPullLocalDaemonModule' => 'applications/repository/daemon/PhabricatorRepositoryPullLocalDaemonModule.php', + 'PhabricatorRepositoryPushEvent' => 'applications/repository/storage/PhabricatorRepositoryPushEvent.php', + 'PhabricatorRepositoryPushEventPHIDType' => 'applications/repository/phid/PhabricatorRepositoryPushEventPHIDType.php', + 'PhabricatorRepositoryPushEventQuery' => 'applications/repository/query/PhabricatorRepositoryPushEventQuery.php', + 'PhabricatorRepositoryPushLog' => 'applications/repository/storage/PhabricatorRepositoryPushLog.php', + 'PhabricatorRepositoryPushLogPHIDType' => 'applications/repository/phid/PhabricatorRepositoryPushLogPHIDType.php', + 'PhabricatorRepositoryPushLogQuery' => 'applications/repository/query/PhabricatorRepositoryPushLogQuery.php', + 'PhabricatorRepositoryPushLogSearchEngine' => 'applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php', + 'PhabricatorRepositoryPushMailWorker' => 'applications/repository/worker/PhabricatorRepositoryPushMailWorker.php', + 'PhabricatorRepositoryPushPolicyTransaction' => 'applications/repository/xaction/PhabricatorRepositoryPushPolicyTransaction.php', + 'PhabricatorRepositoryPushReplyHandler' => 'applications/repository/mail/PhabricatorRepositoryPushReplyHandler.php', 'PhabricatorRepositoryQuery' => 'applications/repository/query/PhabricatorRepositoryQuery.php', - 'PhabricatorRepositoryShortcut' => 'applications/repository/storage/PhabricatorRepositoryShortcut.php', + 'PhabricatorRepositoryRefCursor' => 'applications/repository/storage/PhabricatorRepositoryRefCursor.php', + 'PhabricatorRepositoryRefCursorPHIDType' => 'applications/repository/phid/PhabricatorRepositoryRefCursorPHIDType.php', + 'PhabricatorRepositoryRefCursorQuery' => 'applications/repository/query/PhabricatorRepositoryRefCursorQuery.php', + 'PhabricatorRepositoryRefEngine' => 'applications/repository/engine/PhabricatorRepositoryRefEngine.php', + 'PhabricatorRepositoryRefPosition' => 'applications/repository/storage/PhabricatorRepositoryRefPosition.php', + 'PhabricatorRepositoryRepositoryPHIDType' => 'applications/repository/phid/PhabricatorRepositoryRepositoryPHIDType.php', + 'PhabricatorRepositorySVNSubpathTransaction' => 'applications/repository/xaction/PhabricatorRepositorySVNSubpathTransaction.php', + 'PhabricatorRepositorySchemaSpec' => 'applications/repository/storage/PhabricatorRepositorySchemaSpec.php', + 'PhabricatorRepositorySearchEngine' => 'applications/repository/query/PhabricatorRepositorySearchEngine.php', + 'PhabricatorRepositoryServiceTransaction' => 'applications/repository/xaction/PhabricatorRepositoryServiceTransaction.php', + 'PhabricatorRepositorySlugTransaction' => 'applications/repository/xaction/PhabricatorRepositorySlugTransaction.php', + 'PhabricatorRepositoryStagingURITransaction' => 'applications/repository/xaction/PhabricatorRepositoryStagingURITransaction.php', + 'PhabricatorRepositoryStatusMessage' => 'applications/repository/storage/PhabricatorRepositoryStatusMessage.php', 'PhabricatorRepositorySvnCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositorySvnCommitChangeParserWorker.php', 'PhabricatorRepositorySvnCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositorySvnCommitMessageParserWorker.php', 'PhabricatorRepositorySymbol' => 'applications/repository/storage/PhabricatorRepositorySymbol.php', + 'PhabricatorRepositorySymbolLanguagesTransaction' => 'applications/repository/xaction/PhabricatorRepositorySymbolLanguagesTransaction.php', + 'PhabricatorRepositorySymbolSourcesTransaction' => 'applications/repository/xaction/PhabricatorRepositorySymbolSourcesTransaction.php', + 'PhabricatorRepositorySyncEvent' => 'applications/repository/storage/PhabricatorRepositorySyncEvent.php', + 'PhabricatorRepositorySyncEventPHIDType' => 'applications/repository/phid/PhabricatorRepositorySyncEventPHIDType.php', + 'PhabricatorRepositorySyncEventQuery' => 'applications/repository/query/PhabricatorRepositorySyncEventQuery.php', 'PhabricatorRepositoryTestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php', + 'PhabricatorRepositoryTouchLimitTransaction' => 'applications/repository/xaction/PhabricatorRepositoryTouchLimitTransaction.php', + 'PhabricatorRepositoryTrackOnlyTransaction' => 'applications/repository/xaction/PhabricatorRepositoryTrackOnlyTransaction.php', 'PhabricatorRepositoryTransaction' => 'applications/repository/storage/PhabricatorRepositoryTransaction.php', 'PhabricatorRepositoryTransactionQuery' => 'applications/repository/query/PhabricatorRepositoryTransactionQuery.php', + 'PhabricatorRepositoryTransactionType' => 'applications/repository/xaction/PhabricatorRepositoryTransactionType.php', 'PhabricatorRepositoryType' => 'applications/repository/constants/PhabricatorRepositoryType.php', + 'PhabricatorRepositoryURI' => 'applications/repository/storage/PhabricatorRepositoryURI.php', + 'PhabricatorRepositoryURIIndex' => 'applications/repository/storage/PhabricatorRepositoryURIIndex.php', + 'PhabricatorRepositoryURIPHIDType' => 'applications/repository/phid/PhabricatorRepositoryURIPHIDType.php', + 'PhabricatorRepositoryURIQuery' => 'applications/repository/query/PhabricatorRepositoryURIQuery.php', + 'PhabricatorRepositoryURITestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryURITestCase.php', + 'PhabricatorRepositoryURITransaction' => 'applications/repository/storage/PhabricatorRepositoryURITransaction.php', + 'PhabricatorRepositoryURITransactionQuery' => 'applications/repository/query/PhabricatorRepositoryURITransactionQuery.php', + 'PhabricatorRepositoryVCSTransaction' => 'applications/repository/xaction/PhabricatorRepositoryVCSTransaction.php', + 'PhabricatorRepositoryWorkingCopyVersion' => 'applications/repository/storage/PhabricatorRepositoryWorkingCopyVersion.php', + 'PhabricatorRequestExceptionHandler' => 'aphront/handler/PhabricatorRequestExceptionHandler.php', + 'PhabricatorResetPasswordUserLogType' => 'applications/people/userlog/PhabricatorResetPasswordUserLogType.php', + 'PhabricatorResourceSite' => 'aphront/site/PhabricatorResourceSite.php', + 'PhabricatorRobotsBlogController' => 'applications/system/controller/robots/PhabricatorRobotsBlogController.php', + 'PhabricatorRobotsController' => 'applications/system/controller/robots/PhabricatorRobotsController.php', + 'PhabricatorRobotsPlatformController' => 'applications/system/controller/robots/PhabricatorRobotsPlatformController.php', + 'PhabricatorRobotsResourceController' => 'applications/system/controller/robots/PhabricatorRobotsResourceController.php', + 'PhabricatorRobotsShortController' => 'applications/system/controller/robots/PhabricatorRobotsShortController.php', 'PhabricatorS3FileStorageEngine' => 'applications/files/engine/PhabricatorS3FileStorageEngine.php', + 'PhabricatorSMSAuthFactor' => 'applications/auth/factor/PhabricatorSMSAuthFactor.php', 'PhabricatorSQLPatchList' => 'infrastructure/storage/patch/PhabricatorSQLPatchList.php', + 'PhabricatorSSHKeyGenerator' => 'infrastructure/util/PhabricatorSSHKeyGenerator.php', + 'PhabricatorSSHKeysSettingsPanel' => 'applications/settings/panel/PhabricatorSSHKeysSettingsPanel.php', + 'PhabricatorSSHLog' => 'infrastructure/log/PhabricatorSSHLog.php', + 'PhabricatorSSHPassthruCommand' => 'infrastructure/ssh/PhabricatorSSHPassthruCommand.php', + 'PhabricatorSSHPublicKeyInterface' => 'applications/auth/sshkey/PhabricatorSSHPublicKeyInterface.php', 'PhabricatorSSHWorkflow' => 'infrastructure/ssh/PhabricatorSSHWorkflow.php', 'PhabricatorSavedQuery' => 'applications/search/storage/PhabricatorSavedQuery.php', 'PhabricatorSavedQueryQuery' => 'applications/search/query/PhabricatorSavedQueryQuery.php', + 'PhabricatorScaleChartFunction' => 'applications/fact/chart/PhabricatorScaleChartFunction.php', + 'PhabricatorScheduleTaskTriggerAction' => 'infrastructure/daemon/workers/action/PhabricatorScheduleTaskTriggerAction.php', 'PhabricatorScopedEnv' => 'infrastructure/env/PhabricatorScopedEnv.php', 'PhabricatorSearchAbstractDocument' => 'applications/search/index/PhabricatorSearchAbstractDocument.php', - 'PhabricatorSearchAttachController' => 'applications/search/controller/PhabricatorSearchAttachController.php', + 'PhabricatorSearchApplication' => 'applications/search/application/PhabricatorSearchApplication.php', + 'PhabricatorSearchApplicationSearchEngine' => 'applications/search/query/PhabricatorSearchApplicationSearchEngine.php', + 'PhabricatorSearchApplicationStorageEnginePanel' => 'applications/search/applicationpanel/PhabricatorSearchApplicationStorageEnginePanel.php', 'PhabricatorSearchBaseController' => 'applications/search/controller/PhabricatorSearchBaseController.php', - 'PhabricatorSearchConfigOptions' => 'applications/search/config/PhabricatorSearchConfigOptions.php', + 'PhabricatorSearchCheckboxesField' => 'applications/search/field/PhabricatorSearchCheckboxesField.php', + 'PhabricatorSearchConstraintException' => 'applications/search/exception/PhabricatorSearchConstraintException.php', 'PhabricatorSearchController' => 'applications/search/controller/PhabricatorSearchController.php', + 'PhabricatorSearchCustomFieldProxyField' => 'applications/search/field/PhabricatorSearchCustomFieldProxyField.php', 'PhabricatorSearchDAO' => 'applications/search/storage/PhabricatorSearchDAO.php', + 'PhabricatorSearchDatasource' => 'applications/search/typeahead/PhabricatorSearchDatasource.php', + 'PhabricatorSearchDatasourceField' => 'applications/search/field/PhabricatorSearchDatasourceField.php', + 'PhabricatorSearchDateControlField' => 'applications/search/field/PhabricatorSearchDateControlField.php', + 'PhabricatorSearchDateField' => 'applications/search/field/PhabricatorSearchDateField.php', + 'PhabricatorSearchDefaultController' => 'applications/search/controller/PhabricatorSearchDefaultController.php', 'PhabricatorSearchDeleteController' => 'applications/search/controller/PhabricatorSearchDeleteController.php', 'PhabricatorSearchDocument' => 'applications/search/storage/document/PhabricatorSearchDocument.php', - 'PhabricatorSearchDocumentField' => 'applications/search/storage/document/PhabricatorSearchDocumentField.php', - 'PhabricatorSearchDocumentIndexer' => 'applications/search/index/PhabricatorSearchDocumentIndexer.php', + 'PhabricatorSearchDocumentFieldType' => 'applications/search/constants/PhabricatorSearchDocumentFieldType.php', + 'PhabricatorSearchDocumentQuery' => 'applications/search/query/PhabricatorSearchDocumentQuery.php', 'PhabricatorSearchDocumentRelationship' => 'applications/search/storage/document/PhabricatorSearchDocumentRelationship.php', + 'PhabricatorSearchDocumentTypeDatasource' => 'applications/search/typeahead/PhabricatorSearchDocumentTypeDatasource.php', 'PhabricatorSearchEditController' => 'applications/search/controller/PhabricatorSearchEditController.php', - 'PhabricatorSearchEngine' => 'applications/search/engine/PhabricatorSearchEngine.php', - 'PhabricatorSearchEngineElastic' => 'applications/search/engine/PhabricatorSearchEngineElastic.php', - 'PhabricatorSearchEngineMySQL' => 'applications/search/engine/PhabricatorSearchEngineMySQL.php', - 'PhabricatorSearchEngineSelector' => 'applications/search/selector/PhabricatorSearchEngineSelector.php', - 'PhabricatorSearchField' => 'applications/search/constants/PhabricatorSearchField.php', + 'PhabricatorSearchEngineAPIMethod' => 'applications/search/engine/PhabricatorSearchEngineAPIMethod.php', + 'PhabricatorSearchEngineAttachment' => 'applications/search/engineextension/PhabricatorSearchEngineAttachment.php', + 'PhabricatorSearchEngineExtension' => 'applications/search/engineextension/PhabricatorSearchEngineExtension.php', + 'PhabricatorSearchEngineExtensionModule' => 'applications/search/engineextension/PhabricatorSearchEngineExtensionModule.php', + 'PhabricatorSearchFerretNgramGarbageCollector' => 'applications/search/garbagecollector/PhabricatorSearchFerretNgramGarbageCollector.php', + 'PhabricatorSearchField' => 'applications/search/field/PhabricatorSearchField.php', + 'PhabricatorSearchHandleController' => 'applications/search/controller/PhabricatorSearchHandleController.php', + 'PhabricatorSearchHost' => 'infrastructure/cluster/search/PhabricatorSearchHost.php', 'PhabricatorSearchHovercardController' => 'applications/search/controller/PhabricatorSearchHovercardController.php', - 'PhabricatorSearchIndexer' => 'applications/search/index/PhabricatorSearchIndexer.php', + 'PhabricatorSearchIndexVersion' => 'applications/search/storage/PhabricatorSearchIndexVersion.php', + 'PhabricatorSearchIndexVersionDestructionEngineExtension' => 'applications/search/engineextension/PhabricatorSearchIndexVersionDestructionEngineExtension.php', + 'PhabricatorSearchIntField' => 'applications/search/field/PhabricatorSearchIntField.php', 'PhabricatorSearchManagementIndexWorkflow' => 'applications/search/management/PhabricatorSearchManagementIndexWorkflow.php', + 'PhabricatorSearchManagementInitWorkflow' => 'applications/search/management/PhabricatorSearchManagementInitWorkflow.php', + 'PhabricatorSearchManagementNgramsWorkflow' => 'applications/search/management/PhabricatorSearchManagementNgramsWorkflow.php', + 'PhabricatorSearchManagementQueryWorkflow' => 'applications/search/management/PhabricatorSearchManagementQueryWorkflow.php', 'PhabricatorSearchManagementWorkflow' => 'applications/search/management/PhabricatorSearchManagementWorkflow.php', + 'PhabricatorSearchNgramEngine' => 'applications/search/engine/PhabricatorSearchNgramEngine.php', + 'PhabricatorSearchNgrams' => 'applications/search/ngrams/PhabricatorSearchNgrams.php', + 'PhabricatorSearchNgramsDestructionEngineExtension' => 'applications/search/engineextension/PhabricatorSearchNgramsDestructionEngineExtension.php', 'PhabricatorSearchOrderController' => 'applications/search/controller/PhabricatorSearchOrderController.php', - 'PhabricatorSearchQuery' => 'applications/search/storage/PhabricatorSearchQuery.php', + 'PhabricatorSearchOrderField' => 'applications/search/field/PhabricatorSearchOrderField.php', 'PhabricatorSearchRelationship' => 'applications/search/constants/PhabricatorSearchRelationship.php', + 'PhabricatorSearchRelationshipController' => 'applications/search/controller/PhabricatorSearchRelationshipController.php', + 'PhabricatorSearchRelationshipSourceController' => 'applications/search/controller/PhabricatorSearchRelationshipSourceController.php', + 'PhabricatorSearchResultBucket' => 'applications/search/buckets/PhabricatorSearchResultBucket.php', + 'PhabricatorSearchResultBucketGroup' => 'applications/search/buckets/PhabricatorSearchResultBucketGroup.php', 'PhabricatorSearchResultView' => 'applications/search/view/PhabricatorSearchResultView.php', - 'PhabricatorSearchScope' => 'applications/search/constants/PhabricatorSearchScope.php', - 'PhabricatorSearchSelectController' => 'applications/search/controller/PhabricatorSearchSelectController.php', + 'PhabricatorSearchSchemaSpec' => 'applications/search/storage/PhabricatorSearchSchemaSpec.php', + 'PhabricatorSearchScopeSetting' => 'applications/settings/setting/PhabricatorSearchScopeSetting.php', + 'PhabricatorSearchSelectField' => 'applications/search/field/PhabricatorSearchSelectField.php', + 'PhabricatorSearchService' => 'infrastructure/cluster/search/PhabricatorSearchService.php', + 'PhabricatorSearchSettingsPanel' => 'applications/settings/panel/PhabricatorSearchSettingsPanel.php', + 'PhabricatorSearchStringListField' => 'applications/search/field/PhabricatorSearchStringListField.php', + 'PhabricatorSearchSubscribersField' => 'applications/search/field/PhabricatorSearchSubscribersField.php', + 'PhabricatorSearchTextField' => 'applications/search/field/PhabricatorSearchTextField.php', + 'PhabricatorSearchThreeStateField' => 'applications/search/field/PhabricatorSearchThreeStateField.php', + 'PhabricatorSearchTokenizerField' => 'applications/search/field/PhabricatorSearchTokenizerField.php', + 'PhabricatorSearchWorker' => 'applications/search/worker/PhabricatorSearchWorker.php', 'PhabricatorSecurityConfigOptions' => 'applications/config/option/PhabricatorSecurityConfigOptions.php', - 'PhabricatorSendGridConfigOptions' => 'applications/config/option/PhabricatorSendGridConfigOptions.php', + 'PhabricatorSecuritySetupCheck' => 'applications/config/check/PhabricatorSecuritySetupCheck.php', + 'PhabricatorSelectEditField' => 'applications/transactions/editfield/PhabricatorSelectEditField.php', + 'PhabricatorSelectSetting' => 'applications/settings/setting/PhabricatorSelectSetting.php', + 'PhabricatorSelfHyperlinkEngineExtension' => 'applications/meta/engineextension/PhabricatorSelfHyperlinkEngineExtension.php', + 'PhabricatorSessionsSettingsPanel' => 'applications/settings/panel/PhabricatorSessionsSettingsPanel.php', + 'PhabricatorSetConfigType' => 'applications/config/type/PhabricatorSetConfigType.php', + 'PhabricatorSetting' => 'applications/settings/setting/PhabricatorSetting.php', + 'PhabricatorSettingsAccountPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsAccountPanelGroup.php', + 'PhabricatorSettingsAddEmailAction' => 'applications/settings/action/PhabricatorSettingsAddEmailAction.php', 'PhabricatorSettingsAdjustController' => 'applications/settings/controller/PhabricatorSettingsAdjustController.php', + 'PhabricatorSettingsApplication' => 'applications/settings/application/PhabricatorSettingsApplication.php', + 'PhabricatorSettingsApplicationsPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsApplicationsPanelGroup.php', + 'PhabricatorSettingsAuthenticationPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsAuthenticationPanelGroup.php', + 'PhabricatorSettingsDeveloperPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsDeveloperPanelGroup.php', + 'PhabricatorSettingsEditEngine' => 'applications/settings/editor/PhabricatorSettingsEditEngine.php', + 'PhabricatorSettingsEmailPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsEmailPanelGroup.php', + 'PhabricatorSettingsIssueController' => 'applications/settings/controller/PhabricatorSettingsIssueController.php', + 'PhabricatorSettingsListController' => 'applications/settings/controller/PhabricatorSettingsListController.php', + 'PhabricatorSettingsLogsPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsLogsPanelGroup.php', 'PhabricatorSettingsMainController' => 'applications/settings/controller/PhabricatorSettingsMainController.php', 'PhabricatorSettingsPanel' => 'applications/settings/panel/PhabricatorSettingsPanel.php', - 'PhabricatorSettingsPanelAccount' => 'applications/settings/panel/PhabricatorSettingsPanelAccount.php', - 'PhabricatorSettingsPanelConduit' => 'applications/settings/panel/PhabricatorSettingsPanelConduit.php', - 'PhabricatorSettingsPanelConpherencePreferences' => 'applications/settings/panel/PhabricatorSettingsPanelConpherencePreferences.php', - 'PhabricatorSettingsPanelDeveloperPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelDeveloperPreferences.php', - 'PhabricatorSettingsPanelDiffPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelDiffPreferences.php', - 'PhabricatorSettingsPanelDisplayPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelDisplayPreferences.php', - 'PhabricatorSettingsPanelEmailAddresses' => 'applications/settings/panel/PhabricatorSettingsPanelEmailAddresses.php', - 'PhabricatorSettingsPanelEmailPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelEmailPreferences.php', - 'PhabricatorSettingsPanelExternalAccounts' => 'applications/settings/panel/PhabricatorSettingsPanelExternalAccounts.php', - 'PhabricatorSettingsPanelHomePreferences' => 'applications/settings/panel/PhabricatorSettingsPanelHomePreferences.php', - 'PhabricatorSettingsPanelPassword' => 'applications/settings/panel/PhabricatorSettingsPanelPassword.php', - 'PhabricatorSettingsPanelSSHKeys' => 'applications/settings/panel/PhabricatorSettingsPanelSSHKeys.php', - 'PhabricatorSettingsPanelSearchPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelSearchPreferences.php', + 'PhabricatorSettingsPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsPanelGroup.php', + 'PhabricatorSettingsTimezoneController' => 'applications/settings/controller/PhabricatorSettingsTimezoneController.php', 'PhabricatorSetupCheck' => 'applications/config/check/PhabricatorSetupCheck.php', - 'PhabricatorSetupCheckAPC' => 'applications/config/check/PhabricatorSetupCheckAPC.php', - 'PhabricatorSetupCheckAuth' => 'applications/config/check/PhabricatorSetupCheckAuth.php', - 'PhabricatorSetupCheckBaseURI' => 'applications/config/check/PhabricatorSetupCheckBaseURI.php', - 'PhabricatorSetupCheckBinaries' => 'applications/config/check/PhabricatorSetupCheckBinaries.php', - 'PhabricatorSetupCheckDatabase' => 'applications/config/check/PhabricatorSetupCheckDatabase.php', - 'PhabricatorSetupCheckExtensions' => 'applications/config/check/PhabricatorSetupCheckExtensions.php', - 'PhabricatorSetupCheckExtraConfig' => 'applications/config/check/PhabricatorSetupCheckExtraConfig.php', - 'PhabricatorSetupCheckFileinfo' => 'applications/config/check/PhabricatorSetupCheckFileinfo.php', - 'PhabricatorSetupCheckGD' => 'applications/config/check/PhabricatorSetupCheckGD.php', - 'PhabricatorSetupCheckImagemagick' => 'applications/config/check/PhabricatorSetupCheckImagemagick.php', - 'PhabricatorSetupCheckInvalidConfig' => 'applications/config/check/PhabricatorSetupCheckInvalidConfig.php', - 'PhabricatorSetupCheckMail' => 'applications/config/check/PhabricatorSetupCheckMail.php', - 'PhabricatorSetupCheckMySQL' => 'applications/config/check/PhabricatorSetupCheckMySQL.php', - 'PhabricatorSetupCheckPHPConfig' => 'applications/config/check/PhabricatorSetupCheckPHPConfig.php', - 'PhabricatorSetupCheckPath' => 'applications/config/check/PhabricatorSetupCheckPath.php', - 'PhabricatorSetupCheckPygment' => 'applications/config/check/PhabricatorSetupCheckPygment.php', - 'PhabricatorSetupCheckStorage' => 'applications/config/check/PhabricatorSetupCheckStorage.php', - 'PhabricatorSetupCheckTimezone' => 'applications/config/check/PhabricatorSetupCheckTimezone.php', + 'PhabricatorSetupCheckTestCase' => 'applications/config/check/__tests__/PhabricatorSetupCheckTestCase.php', + 'PhabricatorSetupEngine' => 'applications/config/engine/PhabricatorSetupEngine.php', 'PhabricatorSetupIssue' => 'applications/config/issue/PhabricatorSetupIssue.php', - 'PhabricatorSetupIssueExample' => 'applications/uiexample/examples/PhabricatorSetupIssueExample.php', + 'PhabricatorSetupIssueUIExample' => 'applications/uiexample/examples/PhabricatorSetupIssueUIExample.php', 'PhabricatorSetupIssueView' => 'applications/config/view/PhabricatorSetupIssueView.php', + 'PhabricatorShiftChartFunction' => 'applications/fact/chart/PhabricatorShiftChartFunction.php', + 'PhabricatorShortSite' => 'aphront/site/PhabricatorShortSite.php', + 'PhabricatorSignDocumentsUserLogType' => 'applications/people/userlog/PhabricatorSignDocumentsUserLogType.php', + 'PhabricatorSimpleEditType' => 'applications/transactions/edittype/PhabricatorSimpleEditType.php', + 'PhabricatorSinChartFunction' => 'applications/fact/chart/PhabricatorSinChartFunction.php', + 'PhabricatorSite' => 'aphront/site/PhabricatorSite.php', + 'PhabricatorSlackAuthProvider' => 'applications/auth/provider/PhabricatorSlackAuthProvider.php', + 'PhabricatorSlowvoteApplication' => 'applications/slowvote/application/PhabricatorSlowvoteApplication.php', 'PhabricatorSlowvoteChoice' => 'applications/slowvote/storage/PhabricatorSlowvoteChoice.php', - 'PhabricatorSlowvoteComment' => 'applications/slowvote/storage/PhabricatorSlowvoteComment.php', + 'PhabricatorSlowvoteCloseController' => 'applications/slowvote/controller/PhabricatorSlowvoteCloseController.php', 'PhabricatorSlowvoteCommentController' => 'applications/slowvote/controller/PhabricatorSlowvoteCommentController.php', 'PhabricatorSlowvoteController' => 'applications/slowvote/controller/PhabricatorSlowvoteController.php', 'PhabricatorSlowvoteDAO' => 'applications/slowvote/storage/PhabricatorSlowvoteDAO.php', + 'PhabricatorSlowvoteDefaultViewCapability' => 'applications/slowvote/capability/PhabricatorSlowvoteDefaultViewCapability.php', + 'PhabricatorSlowvoteDescriptionTransaction' => 'applications/slowvote/xaction/PhabricatorSlowvoteDescriptionTransaction.php', 'PhabricatorSlowvoteEditController' => 'applications/slowvote/controller/PhabricatorSlowvoteEditController.php', 'PhabricatorSlowvoteEditor' => 'applications/slowvote/editor/PhabricatorSlowvoteEditor.php', 'PhabricatorSlowvoteListController' => 'applications/slowvote/controller/PhabricatorSlowvoteListController.php', + 'PhabricatorSlowvoteMailReceiver' => 'applications/slowvote/mail/PhabricatorSlowvoteMailReceiver.php', 'PhabricatorSlowvoteOption' => 'applications/slowvote/storage/PhabricatorSlowvoteOption.php', - 'PhabricatorSlowvotePHIDTypePoll' => 'applications/slowvote/phid/PhabricatorSlowvotePHIDTypePoll.php', 'PhabricatorSlowvotePoll' => 'applications/slowvote/storage/PhabricatorSlowvotePoll.php', 'PhabricatorSlowvotePollController' => 'applications/slowvote/controller/PhabricatorSlowvotePollController.php', + 'PhabricatorSlowvotePollPHIDType' => 'applications/slowvote/phid/PhabricatorSlowvotePollPHIDType.php', 'PhabricatorSlowvoteQuery' => 'applications/slowvote/query/PhabricatorSlowvoteQuery.php', + 'PhabricatorSlowvoteQuestionTransaction' => 'applications/slowvote/xaction/PhabricatorSlowvoteQuestionTransaction.php', + 'PhabricatorSlowvoteReplyHandler' => 'applications/slowvote/mail/PhabricatorSlowvoteReplyHandler.php', + 'PhabricatorSlowvoteResponsesTransaction' => 'applications/slowvote/xaction/PhabricatorSlowvoteResponsesTransaction.php', + 'PhabricatorSlowvoteSchemaSpec' => 'applications/slowvote/storage/PhabricatorSlowvoteSchemaSpec.php', 'PhabricatorSlowvoteSearchEngine' => 'applications/slowvote/query/PhabricatorSlowvoteSearchEngine.php', + 'PhabricatorSlowvoteShuffleTransaction' => 'applications/slowvote/xaction/PhabricatorSlowvoteShuffleTransaction.php', + 'PhabricatorSlowvoteStatusTransaction' => 'applications/slowvote/xaction/PhabricatorSlowvoteStatusTransaction.php', 'PhabricatorSlowvoteTransaction' => 'applications/slowvote/storage/PhabricatorSlowvoteTransaction.php', 'PhabricatorSlowvoteTransactionComment' => 'applications/slowvote/storage/PhabricatorSlowvoteTransactionComment.php', 'PhabricatorSlowvoteTransactionQuery' => 'applications/slowvote/query/PhabricatorSlowvoteTransactionQuery.php', + 'PhabricatorSlowvoteTransactionType' => 'applications/slowvote/xaction/PhabricatorSlowvoteTransactionType.php', 'PhabricatorSlowvoteVoteController' => 'applications/slowvote/controller/PhabricatorSlowvoteVoteController.php', + 'PhabricatorSlowvoteVotingMethodTransaction' => 'applications/slowvote/xaction/PhabricatorSlowvoteVotingMethodTransaction.php', 'PhabricatorSlug' => 'infrastructure/util/PhabricatorSlug.php', 'PhabricatorSlugTestCase' => 'infrastructure/util/__tests__/PhabricatorSlugTestCase.php', - 'PhabricatorSortTableExample' => 'applications/uiexample/examples/PhabricatorSortTableExample.php', 'PhabricatorSourceCodeView' => 'view/layout/PhabricatorSourceCodeView.php', - 'PhabricatorStandardCustomField' => 'infrastructure/customfield/field/PhabricatorStandardCustomField.php', + 'PhabricatorSourceDocumentEngine' => 'applications/files/document/PhabricatorSourceDocumentEngine.php', + 'PhabricatorSpaceEditField' => 'applications/transactions/editfield/PhabricatorSpaceEditField.php', + 'PhabricatorSpacesApplication' => 'applications/spaces/application/PhabricatorSpacesApplication.php', + 'PhabricatorSpacesArchiveController' => 'applications/spaces/controller/PhabricatorSpacesArchiveController.php', + 'PhabricatorSpacesCapabilityCreateSpaces' => 'applications/spaces/capability/PhabricatorSpacesCapabilityCreateSpaces.php', + 'PhabricatorSpacesCapabilityDefaultEdit' => 'applications/spaces/capability/PhabricatorSpacesCapabilityDefaultEdit.php', + 'PhabricatorSpacesCapabilityDefaultView' => 'applications/spaces/capability/PhabricatorSpacesCapabilityDefaultView.php', + 'PhabricatorSpacesController' => 'applications/spaces/controller/PhabricatorSpacesController.php', + 'PhabricatorSpacesDAO' => 'applications/spaces/storage/PhabricatorSpacesDAO.php', + 'PhabricatorSpacesEditController' => 'applications/spaces/controller/PhabricatorSpacesEditController.php', + 'PhabricatorSpacesExportEngineExtension' => 'infrastructure/export/engine/PhabricatorSpacesExportEngineExtension.php', + 'PhabricatorSpacesInterface' => 'applications/spaces/interface/PhabricatorSpacesInterface.php', + 'PhabricatorSpacesListController' => 'applications/spaces/controller/PhabricatorSpacesListController.php', + 'PhabricatorSpacesMailEngineExtension' => 'applications/spaces/engineextension/PhabricatorSpacesMailEngineExtension.php', + 'PhabricatorSpacesNamespace' => 'applications/spaces/storage/PhabricatorSpacesNamespace.php', + 'PhabricatorSpacesNamespaceArchiveTransaction' => 'applications/spaces/xaction/PhabricatorSpacesNamespaceArchiveTransaction.php', + 'PhabricatorSpacesNamespaceDatasource' => 'applications/spaces/typeahead/PhabricatorSpacesNamespaceDatasource.php', + 'PhabricatorSpacesNamespaceDefaultTransaction' => 'applications/spaces/xaction/PhabricatorSpacesNamespaceDefaultTransaction.php', + 'PhabricatorSpacesNamespaceDescriptionTransaction' => 'applications/spaces/xaction/PhabricatorSpacesNamespaceDescriptionTransaction.php', + 'PhabricatorSpacesNamespaceEditor' => 'applications/spaces/editor/PhabricatorSpacesNamespaceEditor.php', + 'PhabricatorSpacesNamespaceNameTransaction' => 'applications/spaces/xaction/PhabricatorSpacesNamespaceNameTransaction.php', + 'PhabricatorSpacesNamespacePHIDType' => 'applications/spaces/phid/PhabricatorSpacesNamespacePHIDType.php', + 'PhabricatorSpacesNamespaceQuery' => 'applications/spaces/query/PhabricatorSpacesNamespaceQuery.php', + 'PhabricatorSpacesNamespaceSearchEngine' => 'applications/spaces/query/PhabricatorSpacesNamespaceSearchEngine.php', + 'PhabricatorSpacesNamespaceTransaction' => 'applications/spaces/storage/PhabricatorSpacesNamespaceTransaction.php', + 'PhabricatorSpacesNamespaceTransactionQuery' => 'applications/spaces/query/PhabricatorSpacesNamespaceTransactionQuery.php', + 'PhabricatorSpacesNamespaceTransactionType' => 'applications/spaces/xaction/PhabricatorSpacesNamespaceTransactionType.php', + 'PhabricatorSpacesNoAccessController' => 'applications/spaces/controller/PhabricatorSpacesNoAccessController.php', + 'PhabricatorSpacesRemarkupRule' => 'applications/spaces/remarkup/PhabricatorSpacesRemarkupRule.php', + 'PhabricatorSpacesSchemaSpec' => 'applications/spaces/storage/PhabricatorSpacesSchemaSpec.php', + 'PhabricatorSpacesSearchEngineExtension' => 'applications/spaces/engineextension/PhabricatorSpacesSearchEngineExtension.php', + 'PhabricatorSpacesSearchField' => 'applications/spaces/searchfield/PhabricatorSpacesSearchField.php', + 'PhabricatorSpacesTestCase' => 'applications/spaces/__tests__/PhabricatorSpacesTestCase.php', + 'PhabricatorSpacesViewController' => 'applications/spaces/controller/PhabricatorSpacesViewController.php', + 'PhabricatorStandardCustomField' => 'infrastructure/customfield/standard/PhabricatorStandardCustomField.php', + 'PhabricatorStandardCustomFieldBlueprints' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldBlueprints.php', + 'PhabricatorStandardCustomFieldBool' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldBool.php', + 'PhabricatorStandardCustomFieldCredential' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldCredential.php', + 'PhabricatorStandardCustomFieldDatasource' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldDatasource.php', + 'PhabricatorStandardCustomFieldDate' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldDate.php', + 'PhabricatorStandardCustomFieldHeader' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldHeader.php', + 'PhabricatorStandardCustomFieldInt' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldInt.php', + 'PhabricatorStandardCustomFieldInterface' => 'infrastructure/customfield/interface/PhabricatorStandardCustomFieldInterface.php', + 'PhabricatorStandardCustomFieldLink' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldLink.php', + 'PhabricatorStandardCustomFieldPHIDs' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldPHIDs.php', + 'PhabricatorStandardCustomFieldRemarkup' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldRemarkup.php', + 'PhabricatorStandardCustomFieldSelect' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldSelect.php', + 'PhabricatorStandardCustomFieldText' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldText.php', + 'PhabricatorStandardCustomFieldTokenizer' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldTokenizer.php', + 'PhabricatorStandardCustomFieldUsers' => 'infrastructure/customfield/standard/PhabricatorStandardCustomFieldUsers.php', 'PhabricatorStandardPageView' => 'view/page/PhabricatorStandardPageView.php', - 'PhabricatorStatusController' => 'applications/system/PhabricatorStatusController.php', + 'PhabricatorStandardSelectCustomFieldDatasource' => 'infrastructure/customfield/datasource/PhabricatorStandardSelectCustomFieldDatasource.php', + 'PhabricatorStandardTimelineEngine' => 'applications/transactions/engine/PhabricatorStandardTimelineEngine.php', + 'PhabricatorStaticEditField' => 'applications/transactions/editfield/PhabricatorStaticEditField.php', + 'PhabricatorStatusController' => 'applications/system/controller/PhabricatorStatusController.php', + 'PhabricatorStatusUIExample' => 'applications/uiexample/examples/PhabricatorStatusUIExample.php', 'PhabricatorStorageFixtureScopeGuard' => 'infrastructure/testing/fixture/PhabricatorStorageFixtureScopeGuard.php', 'PhabricatorStorageManagementAPI' => 'infrastructure/storage/management/PhabricatorStorageManagementAPI.php', + 'PhabricatorStorageManagementAdjustWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementAdjustWorkflow.php', + 'PhabricatorStorageManagementAnalyzeWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementAnalyzeWorkflow.php', 'PhabricatorStorageManagementDatabasesWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementDatabasesWorkflow.php', 'PhabricatorStorageManagementDestroyWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementDestroyWorkflow.php', 'PhabricatorStorageManagementDumpWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementDumpWorkflow.php', + 'PhabricatorStorageManagementOptimizeWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementOptimizeWorkflow.php', + 'PhabricatorStorageManagementPartitionWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementPartitionWorkflow.php', 'PhabricatorStorageManagementProbeWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementProbeWorkflow.php', + 'PhabricatorStorageManagementQuickstartWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementQuickstartWorkflow.php', + 'PhabricatorStorageManagementRenamespaceWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementRenamespaceWorkflow.php', + 'PhabricatorStorageManagementShellWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementShellWorkflow.php', 'PhabricatorStorageManagementStatusWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementStatusWorkflow.php', 'PhabricatorStorageManagementUpgradeWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementUpgradeWorkflow.php', 'PhabricatorStorageManagementWorkflow' => 'infrastructure/storage/management/workflow/PhabricatorStorageManagementWorkflow.php', 'PhabricatorStoragePatch' => 'infrastructure/storage/management/PhabricatorStoragePatch.php', + 'PhabricatorStorageSchemaSpec' => 'infrastructure/storage/schema/PhabricatorStorageSchemaSpec.php', + 'PhabricatorStorageSetupCheck' => 'applications/config/check/PhabricatorStorageSetupCheck.php', + 'PhabricatorStringConfigType' => 'applications/config/type/PhabricatorStringConfigType.php', + 'PhabricatorStringExportField' => 'infrastructure/export/field/PhabricatorStringExportField.php', + 'PhabricatorStringListConfigType' => 'applications/config/type/PhabricatorStringListConfigType.php', + 'PhabricatorStringListEditField' => 'applications/transactions/editfield/PhabricatorStringListEditField.php', + 'PhabricatorStringListExportField' => 'infrastructure/export/field/PhabricatorStringListExportField.php', + 'PhabricatorStringMailStamp' => 'applications/metamta/stamp/PhabricatorStringMailStamp.php', + 'PhabricatorStringSetting' => 'applications/settings/setting/PhabricatorStringSetting.php', + 'PhabricatorSubmitEditField' => 'applications/transactions/editfield/PhabricatorSubmitEditField.php', 'PhabricatorSubscribableInterface' => 'applications/subscriptions/interface/PhabricatorSubscribableInterface.php', + 'PhabricatorSubscribedToObjectEdgeType' => 'applications/transactions/edges/PhabricatorSubscribedToObjectEdgeType.php', + 'PhabricatorSubscribersEditField' => 'applications/transactions/editfield/PhabricatorSubscribersEditField.php', 'PhabricatorSubscribersQuery' => 'applications/subscriptions/query/PhabricatorSubscribersQuery.php', + 'PhabricatorSubscriptionTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorSubscriptionTriggerClock.php', + 'PhabricatorSubscriptionsAddSelfHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsAddSelfHeraldAction.php', + 'PhabricatorSubscriptionsAddSubscribersHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsAddSubscribersHeraldAction.php', + 'PhabricatorSubscriptionsApplication' => 'applications/subscriptions/application/PhabricatorSubscriptionsApplication.php', + 'PhabricatorSubscriptionsCurtainExtension' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsCurtainExtension.php', 'PhabricatorSubscriptionsEditController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsEditController.php', + 'PhabricatorSubscriptionsEditEngineExtension' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsEditEngineExtension.php', 'PhabricatorSubscriptionsEditor' => 'applications/subscriptions/editor/PhabricatorSubscriptionsEditor.php', + 'PhabricatorSubscriptionsExportEngineExtension' => 'infrastructure/export/engine/PhabricatorSubscriptionsExportEngineExtension.php', + 'PhabricatorSubscriptionsFulltextEngineExtension' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsFulltextEngineExtension.php', + 'PhabricatorSubscriptionsHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsHeraldAction.php', + 'PhabricatorSubscriptionsListController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsListController.php', + 'PhabricatorSubscriptionsMailEngineExtension' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsMailEngineExtension.php', + 'PhabricatorSubscriptionsMuteController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsMuteController.php', + 'PhabricatorSubscriptionsRemoveSelfHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSelfHeraldAction.php', + 'PhabricatorSubscriptionsRemoveSubscribersHeraldAction' => 'applications/subscriptions/herald/PhabricatorSubscriptionsRemoveSubscribersHeraldAction.php', + 'PhabricatorSubscriptionsSearchEngineAttachment' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsSearchEngineAttachment.php', + 'PhabricatorSubscriptionsSearchEngineExtension' => 'applications/subscriptions/engineextension/PhabricatorSubscriptionsSearchEngineExtension.php', + 'PhabricatorSubscriptionsSubscribeEmailCommand' => 'applications/subscriptions/command/PhabricatorSubscriptionsSubscribeEmailCommand.php', + 'PhabricatorSubscriptionsSubscribersPolicyRule' => 'applications/subscriptions/policyrule/PhabricatorSubscriptionsSubscribersPolicyRule.php', + 'PhabricatorSubscriptionsTransactionController' => 'applications/subscriptions/controller/PhabricatorSubscriptionsTransactionController.php', 'PhabricatorSubscriptionsUIEventListener' => 'applications/subscriptions/events/PhabricatorSubscriptionsUIEventListener.php', - 'PhabricatorSymbolNameLinter' => 'infrastructure/lint/hook/PhabricatorSymbolNameLinter.php', + 'PhabricatorSubscriptionsUnsubscribeEmailCommand' => 'applications/subscriptions/command/PhabricatorSubscriptionsUnsubscribeEmailCommand.php', + 'PhabricatorSubtypeEditEngineExtension' => 'applications/transactions/engineextension/PhabricatorSubtypeEditEngineExtension.php', + 'PhabricatorSumChartFunction' => 'applications/fact/chart/PhabricatorSumChartFunction.php', + 'PhabricatorSupportApplication' => 'applications/support/application/PhabricatorSupportApplication.php', 'PhabricatorSyntaxHighlighter' => 'infrastructure/markup/PhabricatorSyntaxHighlighter.php', 'PhabricatorSyntaxHighlightingConfigOptions' => 'applications/config/option/PhabricatorSyntaxHighlightingConfigOptions.php', - 'PhabricatorTagExample' => 'applications/uiexample/examples/PhabricatorTagExample.php', - 'PhabricatorTagView' => 'view/layout/PhabricatorTagView.php', + 'PhabricatorSyntaxStyle' => 'infrastructure/syntax/PhabricatorSyntaxStyle.php', + 'PhabricatorSystemAction' => 'applications/system/action/PhabricatorSystemAction.php', + 'PhabricatorSystemActionEngine' => 'applications/system/engine/PhabricatorSystemActionEngine.php', + 'PhabricatorSystemActionGarbageCollector' => 'applications/system/garbagecollector/PhabricatorSystemActionGarbageCollector.php', + 'PhabricatorSystemActionLog' => 'applications/system/storage/PhabricatorSystemActionLog.php', + 'PhabricatorSystemActionRateLimitException' => 'applications/system/exception/PhabricatorSystemActionRateLimitException.php', + 'PhabricatorSystemApplication' => 'applications/system/application/PhabricatorSystemApplication.php', + 'PhabricatorSystemDAO' => 'applications/system/storage/PhabricatorSystemDAO.php', + 'PhabricatorSystemDebugUIEventListener' => 'applications/system/events/PhabricatorSystemDebugUIEventListener.php', + 'PhabricatorSystemDestructionGarbageCollector' => 'applications/system/garbagecollector/PhabricatorSystemDestructionGarbageCollector.php', + 'PhabricatorSystemDestructionLog' => 'applications/system/storage/PhabricatorSystemDestructionLog.php', + 'PhabricatorSystemObjectController' => 'applications/system/controller/PhabricatorSystemObjectController.php', + 'PhabricatorSystemReadOnlyController' => 'applications/system/controller/PhabricatorSystemReadOnlyController.php', + 'PhabricatorSystemRemoveDestroyWorkflow' => 'applications/system/management/PhabricatorSystemRemoveDestroyWorkflow.php', + 'PhabricatorSystemRemoveLogWorkflow' => 'applications/system/management/PhabricatorSystemRemoveLogWorkflow.php', + 'PhabricatorSystemRemoveWorkflow' => 'applications/system/management/PhabricatorSystemRemoveWorkflow.php', + 'PhabricatorSystemSelectEncodingController' => 'applications/system/controller/PhabricatorSystemSelectEncodingController.php', + 'PhabricatorSystemSelectHighlightController' => 'applications/system/controller/PhabricatorSystemSelectHighlightController.php', + 'PhabricatorSystemSelectViewAsController' => 'applications/system/controller/PhabricatorSystemSelectViewAsController.php', + 'PhabricatorTOTPAuthFactor' => 'applications/auth/factor/PhabricatorTOTPAuthFactor.php', + 'PhabricatorTOTPAuthFactorTestCase' => 'applications/auth/factor/__tests__/PhabricatorTOTPAuthFactorTestCase.php', 'PhabricatorTaskmasterDaemon' => 'infrastructure/daemon/workers/PhabricatorTaskmasterDaemon.php', + 'PhabricatorTaskmasterDaemonModule' => 'infrastructure/daemon/workers/PhabricatorTaskmasterDaemonModule.php', + 'PhabricatorTestApplication' => 'applications/base/controller/__tests__/PhabricatorTestApplication.php', 'PhabricatorTestCase' => 'infrastructure/testing/PhabricatorTestCase.php', + 'PhabricatorTestController' => 'applications/base/controller/__tests__/PhabricatorTestController.php', 'PhabricatorTestDataGenerator' => 'applications/lipsum/generator/PhabricatorTestDataGenerator.php', + 'PhabricatorTestNoCycleEdgeType' => 'applications/transactions/edges/PhabricatorTestNoCycleEdgeType.php', 'PhabricatorTestStorageEngine' => 'applications/files/engine/PhabricatorTestStorageEngine.php', 'PhabricatorTestWorker' => 'infrastructure/daemon/workers/__tests__/PhabricatorTestWorker.php', + 'PhabricatorTextAreaEditField' => 'applications/transactions/editfield/PhabricatorTextAreaEditField.php', + 'PhabricatorTextConfigType' => 'applications/config/type/PhabricatorTextConfigType.php', + 'PhabricatorTextDocumentEngine' => 'applications/files/document/PhabricatorTextDocumentEngine.php', + 'PhabricatorTextEditField' => 'applications/transactions/editfield/PhabricatorTextEditField.php', + 'PhabricatorTextExportFormat' => 'infrastructure/export/format/PhabricatorTextExportFormat.php', + 'PhabricatorTextListConfigType' => 'applications/config/type/PhabricatorTextListConfigType.php', 'PhabricatorTime' => 'infrastructure/time/PhabricatorTime.php', + 'PhabricatorTimeFormatSetting' => 'applications/settings/setting/PhabricatorTimeFormatSetting.php', 'PhabricatorTimeGuard' => 'infrastructure/time/PhabricatorTimeGuard.php', 'PhabricatorTimeTestCase' => 'infrastructure/time/__tests__/PhabricatorTimeTestCase.php', - 'PhabricatorTimelineEventView' => 'view/layout/PhabricatorTimelineEventView.php', - 'PhabricatorTimelineExample' => 'applications/uiexample/examples/PhabricatorTimelineExample.php', - 'PhabricatorTimelineView' => 'view/layout/PhabricatorTimelineView.php', + 'PhabricatorTimelineEngine' => 'applications/transactions/engine/PhabricatorTimelineEngine.php', + 'PhabricatorTimelineInterface' => 'applications/transactions/interface/PhabricatorTimelineInterface.php', + 'PhabricatorTimezoneIgnoreOffsetSetting' => 'applications/settings/setting/PhabricatorTimezoneIgnoreOffsetSetting.php', + 'PhabricatorTimezoneSetting' => 'applications/settings/setting/PhabricatorTimezoneSetting.php', + 'PhabricatorTimezoneSetupCheck' => 'applications/config/check/PhabricatorTimezoneSetupCheck.php', + 'PhabricatorTitleGlyphsSetting' => 'applications/settings/setting/PhabricatorTitleGlyphsSetting.php', 'PhabricatorToken' => 'applications/tokens/storage/PhabricatorToken.php', 'PhabricatorTokenController' => 'applications/tokens/controller/PhabricatorTokenController.php', 'PhabricatorTokenCount' => 'applications/tokens/storage/PhabricatorTokenCount.php', 'PhabricatorTokenCountQuery' => 'applications/tokens/query/PhabricatorTokenCountQuery.php', 'PhabricatorTokenDAO' => 'applications/tokens/storage/PhabricatorTokenDAO.php', + 'PhabricatorTokenDestructionEngineExtension' => 'applications/tokens/engineextension/PhabricatorTokenDestructionEngineExtension.php', 'PhabricatorTokenGiveController' => 'applications/tokens/controller/PhabricatorTokenGiveController.php', 'PhabricatorTokenGiven' => 'applications/tokens/storage/PhabricatorTokenGiven.php', 'PhabricatorTokenGivenController' => 'applications/tokens/controller/PhabricatorTokenGivenController.php', @@ -1654,417 +5039,1158 @@ 'PhabricatorTokenQuery' => 'applications/tokens/query/PhabricatorTokenQuery.php', 'PhabricatorTokenReceiverInterface' => 'applications/tokens/interface/PhabricatorTokenReceiverInterface.php', 'PhabricatorTokenReceiverQuery' => 'applications/tokens/query/PhabricatorTokenReceiverQuery.php', + 'PhabricatorTokenTokenPHIDType' => 'applications/tokens/phid/PhabricatorTokenTokenPHIDType.php', 'PhabricatorTokenUIEventListener' => 'applications/tokens/event/PhabricatorTokenUIEventListener.php', - 'PhabricatorTransactionView' => 'view/layout/PhabricatorTransactionView.php', + 'PhabricatorTokenizerEditField' => 'applications/transactions/editfield/PhabricatorTokenizerEditField.php', + 'PhabricatorTokensApplication' => 'applications/tokens/application/PhabricatorTokensApplication.php', + 'PhabricatorTokensCurtainExtension' => 'applications/tokens/engineextension/PhabricatorTokensCurtainExtension.php', + 'PhabricatorTokensSettingsPanel' => 'applications/settings/panel/PhabricatorTokensSettingsPanel.php', + 'PhabricatorTokensToken' => 'applications/tokens/storage/PhabricatorTokensToken.php', + 'PhabricatorTransactionChange' => 'applications/transactions/data/PhabricatorTransactionChange.php', + 'PhabricatorTransactionFactEngine' => 'applications/fact/engine/PhabricatorTransactionFactEngine.php', + 'PhabricatorTransactionRemarkupChange' => 'applications/transactions/data/PhabricatorTransactionRemarkupChange.php', + 'PhabricatorTransactionWarning' => 'applications/transactions/data/PhabricatorTransactionWarning.php', 'PhabricatorTransactions' => 'applications/transactions/constants/PhabricatorTransactions.php', + 'PhabricatorTransactionsApplication' => 'applications/transactions/application/PhabricatorTransactionsApplication.php', + 'PhabricatorTransactionsDestructionEngineExtension' => 'applications/transactions/engineextension/PhabricatorTransactionsDestructionEngineExtension.php', + 'PhabricatorTransactionsFulltextEngineExtension' => 'applications/transactions/engineextension/PhabricatorTransactionsFulltextEngineExtension.php', + 'PhabricatorTransactionsObjectTypeDatasource' => 'applications/transactions/typeahead/PhabricatorTransactionsObjectTypeDatasource.php', 'PhabricatorTransformedFile' => 'applications/files/storage/PhabricatorTransformedFile.php', - 'PhabricatorTranslation' => 'infrastructure/internationalization/PhabricatorTranslation.php', + 'PhabricatorTranslationSetting' => 'applications/settings/setting/PhabricatorTranslationSetting.php', 'PhabricatorTranslationsConfigOptions' => 'applications/config/option/PhabricatorTranslationsConfigOptions.php', + 'PhabricatorTriggerAction' => 'infrastructure/daemon/workers/action/PhabricatorTriggerAction.php', + 'PhabricatorTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorTriggerClock.php', + 'PhabricatorTriggerClockTestCase' => 'infrastructure/daemon/workers/clock/__tests__/PhabricatorTriggerClockTestCase.php', + 'PhabricatorTriggerDaemon' => 'infrastructure/daemon/workers/PhabricatorTriggerDaemon.php', 'PhabricatorTrivialTestCase' => 'infrastructure/testing/__tests__/PhabricatorTrivialTestCase.php', - 'PhabricatorTwoColumnExample' => 'applications/uiexample/examples/PhabricatorTwoColumnExample.php', - 'PhabricatorTypeaheadCommonDatasourceController' => 'applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php', + 'PhabricatorTwilioFuture' => 'applications/metamta/future/PhabricatorTwilioFuture.php', + 'PhabricatorTwitchAuthProvider' => 'applications/auth/provider/PhabricatorTwitchAuthProvider.php', + 'PhabricatorTwitterAuthProvider' => 'applications/auth/provider/PhabricatorTwitterAuthProvider.php', + 'PhabricatorTypeaheadApplication' => 'applications/typeahead/application/PhabricatorTypeaheadApplication.php', + 'PhabricatorTypeaheadCompositeDatasource' => 'applications/typeahead/datasource/PhabricatorTypeaheadCompositeDatasource.php', + 'PhabricatorTypeaheadDatasource' => 'applications/typeahead/datasource/PhabricatorTypeaheadDatasource.php', 'PhabricatorTypeaheadDatasourceController' => 'applications/typeahead/controller/PhabricatorTypeaheadDatasourceController.php', + 'PhabricatorTypeaheadDatasourceTestCase' => 'applications/typeahead/datasource/__tests__/PhabricatorTypeaheadDatasourceTestCase.php', + 'PhabricatorTypeaheadFunctionHelpController' => 'applications/typeahead/controller/PhabricatorTypeaheadFunctionHelpController.php', + 'PhabricatorTypeaheadInvalidTokenException' => 'applications/typeahead/exception/PhabricatorTypeaheadInvalidTokenException.php', + 'PhabricatorTypeaheadModularDatasourceController' => 'applications/typeahead/controller/PhabricatorTypeaheadModularDatasourceController.php', + 'PhabricatorTypeaheadMonogramDatasource' => 'applications/typeahead/datasource/PhabricatorTypeaheadMonogramDatasource.php', + 'PhabricatorTypeaheadProxyDatasource' => 'applications/typeahead/datasource/PhabricatorTypeaheadProxyDatasource.php', 'PhabricatorTypeaheadResult' => 'applications/typeahead/storage/PhabricatorTypeaheadResult.php', + 'PhabricatorTypeaheadRuntimeCompositeDatasource' => 'applications/typeahead/datasource/PhabricatorTypeaheadRuntimeCompositeDatasource.php', + 'PhabricatorTypeaheadTestNumbersDatasource' => 'applications/typeahead/datasource/__tests__/PhabricatorTypeaheadTestNumbersDatasource.php', + 'PhabricatorTypeaheadTokenView' => 'applications/typeahead/view/PhabricatorTypeaheadTokenView.php', + 'PhabricatorUIConfigOptions' => 'applications/config/option/PhabricatorUIConfigOptions.php', 'PhabricatorUIExample' => 'applications/uiexample/examples/PhabricatorUIExample.php', 'PhabricatorUIExampleRenderController' => 'applications/uiexample/controller/PhabricatorUIExampleRenderController.php', - 'PhabricatorUIListFilterExample' => 'applications/uiexample/examples/PhabricatorUIListFilterExample.php', - 'PhabricatorUINotificationExample' => 'applications/uiexample/examples/PhabricatorUINotificationExample.php', - 'PhabricatorUIPagerExample' => 'applications/uiexample/examples/PhabricatorUIPagerExample.php', - 'PhabricatorUIStatusExample' => 'applications/uiexample/examples/PhabricatorUIStatusExample.php', - 'PhabricatorUITooltipExample' => 'applications/uiexample/examples/PhabricatorUITooltipExample.php', + 'PhabricatorUIExamplesApplication' => 'applications/uiexample/application/PhabricatorUIExamplesApplication.php', + 'PhabricatorURIExportField' => 'infrastructure/export/field/PhabricatorURIExportField.php', + 'PhabricatorUSEnglishTranslation' => 'infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php', + 'PhabricatorUnifiedDiffsSetting' => 'applications/settings/setting/PhabricatorUnifiedDiffsSetting.php', + 'PhabricatorUnitTestContentSource' => 'infrastructure/contentsource/PhabricatorUnitTestContentSource.php', 'PhabricatorUnitsTestCase' => 'view/__tests__/PhabricatorUnitsTestCase.php', + 'PhabricatorUnknownContentSource' => 'infrastructure/contentsource/PhabricatorUnknownContentSource.php', + 'PhabricatorUnlockEngine' => 'applications/system/engine/PhabricatorUnlockEngine.php', + 'PhabricatorUnlockableInterface' => 'applications/system/interface/PhabricatorUnlockableInterface.php', + 'PhabricatorUnsubscribedFromObjectEdgeType' => 'applications/transactions/edges/PhabricatorUnsubscribedFromObjectEdgeType.php', 'PhabricatorUser' => 'applications/people/storage/PhabricatorUser.php', + 'PhabricatorUserApproveTransaction' => 'applications/people/xaction/PhabricatorUserApproveTransaction.php', + 'PhabricatorUserBadgesCacheType' => 'applications/people/cache/PhabricatorUserBadgesCacheType.php', 'PhabricatorUserBlurbField' => 'applications/people/customfield/PhabricatorUserBlurbField.php', + 'PhabricatorUserCache' => 'applications/people/storage/PhabricatorUserCache.php', + 'PhabricatorUserCachePurger' => 'applications/cache/purger/PhabricatorUserCachePurger.php', + 'PhabricatorUserCacheType' => 'applications/people/cache/PhabricatorUserCacheType.php', + 'PhabricatorUserCardView' => 'applications/people/view/PhabricatorUserCardView.php', 'PhabricatorUserConfigOptions' => 'applications/people/config/PhabricatorUserConfigOptions.php', + 'PhabricatorUserConfiguredCustomField' => 'applications/people/customfield/PhabricatorUserConfiguredCustomField.php', + 'PhabricatorUserConfiguredCustomFieldStorage' => 'applications/people/storage/PhabricatorUserConfiguredCustomFieldStorage.php', 'PhabricatorUserCustomField' => 'applications/people/customfield/PhabricatorUserCustomField.php', - 'PhabricatorUserCustomFieldInterface' => 'applications/people/customfield/PhabricatorUserCustomFieldInterface.php', + 'PhabricatorUserCustomFieldNumericIndex' => 'applications/people/storage/PhabricatorUserCustomFieldNumericIndex.php', + 'PhabricatorUserCustomFieldStringIndex' => 'applications/people/storage/PhabricatorUserCustomFieldStringIndex.php', 'PhabricatorUserDAO' => 'applications/people/storage/PhabricatorUserDAO.php', + 'PhabricatorUserDisableTransaction' => 'applications/people/xaction/PhabricatorUserDisableTransaction.php', + 'PhabricatorUserEditEngine' => 'applications/people/editor/PhabricatorUserEditEngine.php', 'PhabricatorUserEditor' => 'applications/people/editor/PhabricatorUserEditor.php', + 'PhabricatorUserEditorTestCase' => 'applications/people/editor/__tests__/PhabricatorUserEditorTestCase.php', 'PhabricatorUserEmail' => 'applications/people/storage/PhabricatorUserEmail.php', + 'PhabricatorUserEmailTestCase' => 'applications/people/storage/__tests__/PhabricatorUserEmailTestCase.php', + 'PhabricatorUserEmpowerTransaction' => 'applications/people/xaction/PhabricatorUserEmpowerTransaction.php', + 'PhabricatorUserFerretEngine' => 'applications/people/search/PhabricatorUserFerretEngine.php', + 'PhabricatorUserFulltextEngine' => 'applications/people/search/PhabricatorUserFulltextEngine.php', + 'PhabricatorUserIconField' => 'applications/people/customfield/PhabricatorUserIconField.php', 'PhabricatorUserLog' => 'applications/people/storage/PhabricatorUserLog.php', + 'PhabricatorUserLogType' => 'applications/people/userlog/PhabricatorUserLogType.php', + 'PhabricatorUserLogTypeDatasource' => 'applications/people/typeahead/PhabricatorUserLogTypeDatasource.php', + 'PhabricatorUserLogView' => 'applications/people/view/PhabricatorUserLogView.php', + 'PhabricatorUserMessageCountCacheType' => 'applications/people/cache/PhabricatorUserMessageCountCacheType.php', + 'PhabricatorUserNotificationCountCacheType' => 'applications/people/cache/PhabricatorUserNotificationCountCacheType.php', + 'PhabricatorUserNotifyTransaction' => 'applications/people/xaction/PhabricatorUserNotifyTransaction.php', + 'PhabricatorUserPHIDResolver' => 'applications/phid/resolver/PhabricatorUserPHIDResolver.php', 'PhabricatorUserPreferences' => 'applications/settings/storage/PhabricatorUserPreferences.php', + 'PhabricatorUserPreferencesCacheType' => 'applications/people/cache/PhabricatorUserPreferencesCacheType.php', + 'PhabricatorUserPreferencesEditor' => 'applications/settings/editor/PhabricatorUserPreferencesEditor.php', + 'PhabricatorUserPreferencesPHIDType' => 'applications/settings/phid/PhabricatorUserPreferencesPHIDType.php', + 'PhabricatorUserPreferencesQuery' => 'applications/settings/query/PhabricatorUserPreferencesQuery.php', + 'PhabricatorUserPreferencesSearchEngine' => 'applications/settings/query/PhabricatorUserPreferencesSearchEngine.php', + 'PhabricatorUserPreferencesTransaction' => 'applications/settings/storage/PhabricatorUserPreferencesTransaction.php', + 'PhabricatorUserPreferencesTransactionQuery' => 'applications/settings/query/PhabricatorUserPreferencesTransactionQuery.php', 'PhabricatorUserProfile' => 'applications/people/storage/PhabricatorUserProfile.php', - 'PhabricatorUserProfileEditor' => 'applications/people/editor/PhabricatorUserProfileEditor.php', + 'PhabricatorUserProfileImageCacheType' => 'applications/people/cache/PhabricatorUserProfileImageCacheType.php', 'PhabricatorUserRealNameField' => 'applications/people/customfield/PhabricatorUserRealNameField.php', 'PhabricatorUserRolesField' => 'applications/people/customfield/PhabricatorUserRolesField.php', - 'PhabricatorUserSSHKey' => 'applications/settings/storage/PhabricatorUserSSHKey.php', - 'PhabricatorUserSearchIndexer' => 'applications/people/search/PhabricatorUserSearchIndexer.php', + 'PhabricatorUserSchemaSpec' => 'applications/people/storage/PhabricatorUserSchemaSpec.php', 'PhabricatorUserSinceField' => 'applications/people/customfield/PhabricatorUserSinceField.php', - 'PhabricatorUserStatus' => 'applications/people/storage/PhabricatorUserStatus.php', 'PhabricatorUserStatusField' => 'applications/people/customfield/PhabricatorUserStatusField.php', - 'PhabricatorUserStatusInvalidEpochException' => 'applications/people/exception/PhabricatorUserStatusInvalidEpochException.php', - 'PhabricatorUserStatusOverlapException' => 'applications/people/exception/PhabricatorUserStatusOverlapException.php', 'PhabricatorUserTestCase' => 'applications/people/storage/__tests__/PhabricatorUserTestCase.php', 'PhabricatorUserTitleField' => 'applications/people/customfield/PhabricatorUserTitleField.php', 'PhabricatorUserTransaction' => 'applications/people/storage/PhabricatorUserTransaction.php', - 'PhabricatorWorkboardExample' => 'applications/uiexample/examples/PhabricatorWorkboardExample.php', - 'PhabricatorWorkboardView' => 'view/layout/PhabricatorWorkboardView.php', + 'PhabricatorUserTransactionEditor' => 'applications/people/editor/PhabricatorUserTransactionEditor.php', + 'PhabricatorUserTransactionType' => 'applications/people/xaction/PhabricatorUserTransactionType.php', + 'PhabricatorUserUsernameTransaction' => 'applications/people/xaction/PhabricatorUserUsernameTransaction.php', + 'PhabricatorUsersEditField' => 'applications/transactions/editfield/PhabricatorUsersEditField.php', + 'PhabricatorUsersPolicyRule' => 'applications/people/policyrule/PhabricatorUsersPolicyRule.php', + 'PhabricatorUsersSearchField' => 'applications/people/searchfield/PhabricatorUsersSearchField.php', + 'PhabricatorVCSResponse' => 'applications/repository/response/PhabricatorVCSResponse.php', + 'PhabricatorVerifyEmailUserLogType' => 'applications/people/userlog/PhabricatorVerifyEmailUserLogType.php', + 'PhabricatorVersionedDraft' => 'applications/draft/storage/PhabricatorVersionedDraft.php', + 'PhabricatorVeryWowEnglishTranslation' => 'infrastructure/internationalization/translation/PhabricatorVeryWowEnglishTranslation.php', + 'PhabricatorVideoDocumentEngine' => 'applications/files/document/PhabricatorVideoDocumentEngine.php', + 'PhabricatorViewerDatasource' => 'applications/people/typeahead/PhabricatorViewerDatasource.php', + 'PhabricatorVoidDocumentEngine' => 'applications/files/document/PhabricatorVoidDocumentEngine.php', + 'PhabricatorWatcherHasObjectEdgeType' => 'applications/transactions/edges/PhabricatorWatcherHasObjectEdgeType.php', + 'PhabricatorWebContentSource' => 'infrastructure/contentsource/PhabricatorWebContentSource.php', + 'PhabricatorWebServerSetupCheck' => 'applications/config/check/PhabricatorWebServerSetupCheck.php', + 'PhabricatorWeekStartDaySetting' => 'applications/settings/setting/PhabricatorWeekStartDaySetting.php', + 'PhabricatorWildConfigType' => 'applications/config/type/PhabricatorWildConfigType.php', + 'PhabricatorWordPressAuthProvider' => 'applications/auth/provider/PhabricatorWordPressAuthProvider.php', + 'PhabricatorWorkboardInterface' => 'applications/project/interface/PhabricatorWorkboardInterface.php', + 'PhabricatorWorkboardViewState' => 'applications/project/state/PhabricatorWorkboardViewState.php', 'PhabricatorWorker' => 'infrastructure/daemon/workers/PhabricatorWorker.php', 'PhabricatorWorkerActiveTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerActiveTask.php', + 'PhabricatorWorkerActiveTaskQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerActiveTaskQuery.php', 'PhabricatorWorkerArchiveTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerArchiveTask.php', + 'PhabricatorWorkerArchiveTaskQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerArchiveTaskQuery.php', + 'PhabricatorWorkerBulkJob' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerBulkJob.php', + 'PhabricatorWorkerBulkJobCreateWorker' => 'infrastructure/daemon/workers/bulk/PhabricatorWorkerBulkJobCreateWorker.php', + 'PhabricatorWorkerBulkJobEditor' => 'infrastructure/daemon/workers/editor/PhabricatorWorkerBulkJobEditor.php', + 'PhabricatorWorkerBulkJobPHIDType' => 'infrastructure/daemon/workers/phid/PhabricatorWorkerBulkJobPHIDType.php', + 'PhabricatorWorkerBulkJobQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerBulkJobQuery.php', + 'PhabricatorWorkerBulkJobSearchEngine' => 'infrastructure/daemon/workers/query/PhabricatorWorkerBulkJobSearchEngine.php', + 'PhabricatorWorkerBulkJobTaskWorker' => 'infrastructure/daemon/workers/bulk/PhabricatorWorkerBulkJobTaskWorker.php', + 'PhabricatorWorkerBulkJobTestCase' => 'infrastructure/daemon/workers/__tests__/PhabricatorWorkerBulkJobTestCase.php', + 'PhabricatorWorkerBulkJobTransaction' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerBulkJobTransaction.php', + 'PhabricatorWorkerBulkJobTransactionQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerBulkJobTransactionQuery.php', + 'PhabricatorWorkerBulkJobType' => 'infrastructure/daemon/workers/bulk/PhabricatorWorkerBulkJobType.php', + 'PhabricatorWorkerBulkJobWorker' => 'infrastructure/daemon/workers/bulk/PhabricatorWorkerBulkJobWorker.php', + 'PhabricatorWorkerBulkTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerBulkTask.php', 'PhabricatorWorkerDAO' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerDAO.php', + 'PhabricatorWorkerDestructionEngineExtension' => 'infrastructure/daemon/workers/engineextension/PhabricatorWorkerDestructionEngineExtension.php', 'PhabricatorWorkerLeaseQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerLeaseQuery.php', + 'PhabricatorWorkerManagementCancelWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementCancelWorkflow.php', + 'PhabricatorWorkerManagementDelayWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementDelayWorkflow.php', + 'PhabricatorWorkerManagementExecuteWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementExecuteWorkflow.php', + 'PhabricatorWorkerManagementFloodWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementFloodWorkflow.php', + 'PhabricatorWorkerManagementFreeWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementFreeWorkflow.php', + 'PhabricatorWorkerManagementPriorityWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementPriorityWorkflow.php', + 'PhabricatorWorkerManagementRetryWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementRetryWorkflow.php', + 'PhabricatorWorkerManagementWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerManagementWorkflow.php', 'PhabricatorWorkerPermanentFailureException' => 'infrastructure/daemon/workers/exception/PhabricatorWorkerPermanentFailureException.php', + 'PhabricatorWorkerSchemaSpec' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerSchemaSpec.php', + 'PhabricatorWorkerSingleBulkJobType' => 'infrastructure/daemon/workers/bulk/PhabricatorWorkerSingleBulkJobType.php', 'PhabricatorWorkerTask' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTask.php', 'PhabricatorWorkerTaskData' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTaskData.php', 'PhabricatorWorkerTaskDetailController' => 'applications/daemon/controller/PhabricatorWorkerTaskDetailController.php', - 'PhabricatorWorkerTaskUpdateController' => 'applications/daemon/controller/PhabricatorWorkerTaskUpdateController.php', + 'PhabricatorWorkerTaskQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerTaskQuery.php', 'PhabricatorWorkerTestCase' => 'infrastructure/daemon/workers/__tests__/PhabricatorWorkerTestCase.php', + 'PhabricatorWorkerTrigger' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTrigger.php', + 'PhabricatorWorkerTriggerEvent' => 'infrastructure/daemon/workers/storage/PhabricatorWorkerTriggerEvent.php', + 'PhabricatorWorkerTriggerManagementFireWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerTriggerManagementFireWorkflow.php', + 'PhabricatorWorkerTriggerManagementWorkflow' => 'infrastructure/daemon/workers/management/PhabricatorWorkerTriggerManagementWorkflow.php', + 'PhabricatorWorkerTriggerPHIDType' => 'infrastructure/daemon/workers/phid/PhabricatorWorkerTriggerPHIDType.php', + 'PhabricatorWorkerTriggerQuery' => 'infrastructure/daemon/workers/query/PhabricatorWorkerTriggerQuery.php', + 'PhabricatorWorkerYieldException' => 'infrastructure/daemon/workers/exception/PhabricatorWorkerYieldException.php', 'PhabricatorWorkingCopyDiscoveryTestCase' => 'applications/repository/engine/__tests__/PhabricatorWorkingCopyDiscoveryTestCase.php', 'PhabricatorWorkingCopyPullTestCase' => 'applications/repository/engine/__tests__/PhabricatorWorkingCopyPullTestCase.php', 'PhabricatorWorkingCopyTestCase' => 'applications/repository/engine/__tests__/PhabricatorWorkingCopyTestCase.php', - 'PhabricatorWorkpanelView' => 'view/layout/PhabricatorWorkpanelView.php', + 'PhabricatorXHPASTDAO' => 'applications/phpast/storage/PhabricatorXHPASTDAO.php', + 'PhabricatorXHPASTParseTree' => 'applications/phpast/storage/PhabricatorXHPASTParseTree.php', 'PhabricatorXHPASTViewController' => 'applications/phpast/controller/PhabricatorXHPASTViewController.php', - 'PhabricatorXHPASTViewDAO' => 'applications/phpast/storage/PhabricatorXHPASTViewDAO.php', 'PhabricatorXHPASTViewFrameController' => 'applications/phpast/controller/PhabricatorXHPASTViewFrameController.php', 'PhabricatorXHPASTViewFramesetController' => 'applications/phpast/controller/PhabricatorXHPASTViewFramesetController.php', 'PhabricatorXHPASTViewInputController' => 'applications/phpast/controller/PhabricatorXHPASTViewInputController.php', 'PhabricatorXHPASTViewPanelController' => 'applications/phpast/controller/PhabricatorXHPASTViewPanelController.php', - 'PhabricatorXHPASTViewParseTree' => 'applications/phpast/storage/PhabricatorXHPASTViewParseTree.php', 'PhabricatorXHPASTViewRunController' => 'applications/phpast/controller/PhabricatorXHPASTViewRunController.php', 'PhabricatorXHPASTViewStreamController' => 'applications/phpast/controller/PhabricatorXHPASTViewStreamController.php', 'PhabricatorXHPASTViewTreeController' => 'applications/phpast/controller/PhabricatorXHPASTViewTreeController.php', + 'PhabricatorXHProfApplication' => 'applications/xhprof/application/PhabricatorXHProfApplication.php', 'PhabricatorXHProfController' => 'applications/xhprof/controller/PhabricatorXHProfController.php', 'PhabricatorXHProfDAO' => 'applications/xhprof/storage/PhabricatorXHProfDAO.php', + 'PhabricatorXHProfDropController' => 'applications/xhprof/controller/PhabricatorXHProfDropController.php', 'PhabricatorXHProfProfileController' => 'applications/xhprof/controller/PhabricatorXHProfProfileController.php', 'PhabricatorXHProfProfileSymbolView' => 'applications/xhprof/view/PhabricatorXHProfProfileSymbolView.php', 'PhabricatorXHProfProfileTopLevelView' => 'applications/xhprof/view/PhabricatorXHProfProfileTopLevelView.php', 'PhabricatorXHProfProfileView' => 'applications/xhprof/view/PhabricatorXHProfProfileView.php', 'PhabricatorXHProfSample' => 'applications/xhprof/storage/PhabricatorXHProfSample.php', 'PhabricatorXHProfSampleListController' => 'applications/xhprof/controller/PhabricatorXHProfSampleListController.php', - 'PhameBasicBlogSkin' => 'applications/phame/skins/PhameBasicBlogSkin.php', - 'PhameBasicTemplateBlogSkin' => 'applications/phame/skins/PhameBasicTemplateBlogSkin.php', + 'PhabricatorXHProfSampleQuery' => 'applications/xhprof/query/PhabricatorXHProfSampleQuery.php', + 'PhabricatorXHProfSampleSearchEngine' => 'applications/xhprof/query/PhabricatorXHProfSampleSearchEngine.php', + 'PhabricatorYoutubeRemarkupRule' => 'infrastructure/markup/rule/PhabricatorYoutubeRemarkupRule.php', + 'PhabricatorZipSetupCheck' => 'applications/config/check/PhabricatorZipSetupCheck.php', + 'Phame404Response' => 'applications/phame/site/Phame404Response.php', 'PhameBlog' => 'applications/phame/storage/PhameBlog.php', - 'PhameBlogDeleteController' => 'applications/phame/controller/blog/PhameBlogDeleteController.php', + 'PhameBlog404Controller' => 'applications/phame/controller/blog/PhameBlog404Controller.php', + 'PhameBlogArchiveController' => 'applications/phame/controller/blog/PhameBlogArchiveController.php', + 'PhameBlogController' => 'applications/phame/controller/blog/PhameBlogController.php', + 'PhameBlogCreateCapability' => 'applications/phame/capability/PhameBlogCreateCapability.php', + 'PhameBlogDatasource' => 'applications/phame/typeahead/PhameBlogDatasource.php', + 'PhameBlogDescriptionTransaction' => 'applications/phame/xaction/PhameBlogDescriptionTransaction.php', + 'PhameBlogEditConduitAPIMethod' => 'applications/phame/conduit/PhameBlogEditConduitAPIMethod.php', 'PhameBlogEditController' => 'applications/phame/controller/blog/PhameBlogEditController.php', + 'PhameBlogEditEngine' => 'applications/phame/editor/PhameBlogEditEngine.php', + 'PhameBlogEditor' => 'applications/phame/editor/PhameBlogEditor.php', 'PhameBlogFeedController' => 'applications/phame/controller/blog/PhameBlogFeedController.php', + 'PhameBlogFerretEngine' => 'applications/phame/search/PhameBlogFerretEngine.php', + 'PhameBlogFullDomainTransaction' => 'applications/phame/xaction/PhameBlogFullDomainTransaction.php', + 'PhameBlogFulltextEngine' => 'applications/phame/search/PhameBlogFulltextEngine.php', + 'PhameBlogHeaderImageTransaction' => 'applications/phame/xaction/PhameBlogHeaderImageTransaction.php', + 'PhameBlogHeaderPictureController' => 'applications/phame/controller/blog/PhameBlogHeaderPictureController.php', 'PhameBlogListController' => 'applications/phame/controller/blog/PhameBlogListController.php', - 'PhameBlogLiveController' => 'applications/phame/controller/blog/PhameBlogLiveController.php', + 'PhameBlogListView' => 'applications/phame/view/PhameBlogListView.php', + 'PhameBlogManageController' => 'applications/phame/controller/blog/PhameBlogManageController.php', + 'PhameBlogNameTransaction' => 'applications/phame/xaction/PhameBlogNameTransaction.php', + 'PhameBlogParentDomainTransaction' => 'applications/phame/xaction/PhameBlogParentDomainTransaction.php', + 'PhameBlogParentSiteTransaction' => 'applications/phame/xaction/PhameBlogParentSiteTransaction.php', + 'PhameBlogProfileImageTransaction' => 'applications/phame/xaction/PhameBlogProfileImageTransaction.php', + 'PhameBlogProfilePictureController' => 'applications/phame/controller/blog/PhameBlogProfilePictureController.php', 'PhameBlogQuery' => 'applications/phame/query/PhameBlogQuery.php', - 'PhameBlogSkin' => 'applications/phame/skins/PhameBlogSkin.php', + 'PhameBlogReplyHandler' => 'applications/phame/mail/PhameBlogReplyHandler.php', + 'PhameBlogSearchConduitAPIMethod' => 'applications/phame/conduit/PhameBlogSearchConduitAPIMethod.php', + 'PhameBlogSearchEngine' => 'applications/phame/query/PhameBlogSearchEngine.php', + 'PhameBlogSite' => 'applications/phame/site/PhameBlogSite.php', + 'PhameBlogStatusTransaction' => 'applications/phame/xaction/PhameBlogStatusTransaction.php', + 'PhameBlogSubtitleTransaction' => 'applications/phame/xaction/PhameBlogSubtitleTransaction.php', + 'PhameBlogTransaction' => 'applications/phame/storage/PhameBlogTransaction.php', + 'PhameBlogTransactionQuery' => 'applications/phame/query/PhameBlogTransactionQuery.php', + 'PhameBlogTransactionType' => 'applications/phame/xaction/PhameBlogTransactionType.php', 'PhameBlogViewController' => 'applications/phame/controller/blog/PhameBlogViewController.php', + 'PhameConstants' => 'applications/phame/constants/PhameConstants.php', 'PhameController' => 'applications/phame/controller/PhameController.php', 'PhameDAO' => 'applications/phame/storage/PhameDAO.php', + 'PhameDescriptionView' => 'applications/phame/view/PhameDescriptionView.php', + 'PhameDraftListView' => 'applications/phame/view/PhameDraftListView.php', + 'PhameHomeController' => 'applications/phame/controller/PhameHomeController.php', + 'PhameInheritBlogPolicyRule' => 'applications/phame/policyrule/PhameInheritBlogPolicyRule.php', + 'PhameLiveController' => 'applications/phame/controller/PhameLiveController.php', + 'PhameNextPostView' => 'applications/phame/view/PhameNextPostView.php', 'PhamePost' => 'applications/phame/storage/PhamePost.php', - 'PhamePostDeleteController' => 'applications/phame/controller/post/PhamePostDeleteController.php', + 'PhamePostArchiveController' => 'applications/phame/controller/post/PhamePostArchiveController.php', + 'PhamePostBlogTransaction' => 'applications/phame/xaction/PhamePostBlogTransaction.php', + 'PhamePostBodyTransaction' => 'applications/phame/xaction/PhamePostBodyTransaction.php', + 'PhamePostController' => 'applications/phame/controller/post/PhamePostController.php', + 'PhamePostEditConduitAPIMethod' => 'applications/phame/conduit/PhamePostEditConduitAPIMethod.php', 'PhamePostEditController' => 'applications/phame/controller/post/PhamePostEditController.php', - 'PhamePostFramedController' => 'applications/phame/controller/post/PhamePostFramedController.php', + 'PhamePostEditEngine' => 'applications/phame/editor/PhamePostEditEngine.php', + 'PhamePostEditEngineLock' => 'applications/phame/editor/PhamePostEditEngineLock.php', + 'PhamePostEditor' => 'applications/phame/editor/PhamePostEditor.php', + 'PhamePostFerretEngine' => 'applications/phame/search/PhamePostFerretEngine.php', + 'PhamePostFulltextEngine' => 'applications/phame/search/PhamePostFulltextEngine.php', + 'PhamePostHeaderImageTransaction' => 'applications/phame/xaction/PhamePostHeaderImageTransaction.php', + 'PhamePostHeaderPictureController' => 'applications/phame/controller/post/PhamePostHeaderPictureController.php', + 'PhamePostHistoryController' => 'applications/phame/controller/post/PhamePostHistoryController.php', 'PhamePostListController' => 'applications/phame/controller/post/PhamePostListController.php', - 'PhamePostNewController' => 'applications/phame/controller/post/PhamePostNewController.php', - 'PhamePostNotLiveController' => 'applications/phame/controller/post/PhamePostNotLiveController.php', - 'PhamePostPreviewController' => 'applications/phame/controller/post/PhamePostPreviewController.php', + 'PhamePostListView' => 'applications/phame/view/PhamePostListView.php', + 'PhamePostMailReceiver' => 'applications/phame/mail/PhamePostMailReceiver.php', + 'PhamePostMoveController' => 'applications/phame/controller/post/PhamePostMoveController.php', 'PhamePostPublishController' => 'applications/phame/controller/post/PhamePostPublishController.php', 'PhamePostQuery' => 'applications/phame/query/PhamePostQuery.php', - 'PhamePostUnpublishController' => 'applications/phame/controller/post/PhamePostUnpublishController.php', - 'PhamePostView' => 'applications/phame/view/PhamePostView.php', + 'PhamePostRemarkupRule' => 'applications/phame/remarkup/PhamePostRemarkupRule.php', + 'PhamePostReplyHandler' => 'applications/phame/mail/PhamePostReplyHandler.php', + 'PhamePostSearchConduitAPIMethod' => 'applications/phame/conduit/PhamePostSearchConduitAPIMethod.php', + 'PhamePostSearchEngine' => 'applications/phame/query/PhamePostSearchEngine.php', + 'PhamePostSubtitleTransaction' => 'applications/phame/xaction/PhamePostSubtitleTransaction.php', + 'PhamePostTitleTransaction' => 'applications/phame/xaction/PhamePostTitleTransaction.php', + 'PhamePostTransaction' => 'applications/phame/storage/PhamePostTransaction.php', + 'PhamePostTransactionComment' => 'applications/phame/storage/PhamePostTransactionComment.php', + 'PhamePostTransactionQuery' => 'applications/phame/query/PhamePostTransactionQuery.php', + 'PhamePostTransactionType' => 'applications/phame/xaction/PhamePostTransactionType.php', 'PhamePostViewController' => 'applications/phame/controller/post/PhamePostViewController.php', - 'PhameResourceController' => 'applications/phame/controller/PhameResourceController.php', - 'PhameSkinSpecification' => 'applications/phame/skins/PhameSkinSpecification.php', + 'PhamePostVisibilityTransaction' => 'applications/phame/xaction/PhamePostVisibilityTransaction.php', + 'PhameSchemaSpec' => 'applications/phame/storage/PhameSchemaSpec.php', + 'PhameSite' => 'applications/phame/site/PhameSite.php', 'PhluxController' => 'applications/phlux/controller/PhluxController.php', 'PhluxDAO' => 'applications/phlux/storage/PhluxDAO.php', 'PhluxEditController' => 'applications/phlux/controller/PhluxEditController.php', 'PhluxListController' => 'applications/phlux/controller/PhluxListController.php', - 'PhluxPHIDTypeVariable' => 'applications/phlux/phid/PhluxPHIDTypeVariable.php', + 'PhluxSchemaSpec' => 'applications/phlux/storage/PhluxSchemaSpec.php', 'PhluxTransaction' => 'applications/phlux/storage/PhluxTransaction.php', 'PhluxTransactionQuery' => 'applications/phlux/query/PhluxTransactionQuery.php', 'PhluxVariable' => 'applications/phlux/storage/PhluxVariable.php', 'PhluxVariableEditor' => 'applications/phlux/editor/PhluxVariableEditor.php', + 'PhluxVariablePHIDType' => 'applications/phlux/phid/PhluxVariablePHIDType.php', 'PhluxVariableQuery' => 'applications/phlux/query/PhluxVariableQuery.php', 'PhluxViewController' => 'applications/phlux/controller/PhluxViewController.php', - 'PholioConstants' => 'applications/pholio/constants/PholioConstants.php', 'PholioController' => 'applications/pholio/controller/PholioController.php', 'PholioDAO' => 'applications/pholio/storage/PholioDAO.php', + 'PholioDefaultEditCapability' => 'applications/pholio/capability/PholioDefaultEditCapability.php', + 'PholioDefaultViewCapability' => 'applications/pholio/capability/PholioDefaultViewCapability.php', 'PholioImage' => 'applications/pholio/storage/PholioImage.php', - 'PholioImageHistoryController' => 'applications/pholio/controller/PholioImageHistoryController.php', + 'PholioImageDescriptionTransaction' => 'applications/pholio/xaction/PholioImageDescriptionTransaction.php', + 'PholioImageFileTransaction' => 'applications/pholio/xaction/PholioImageFileTransaction.php', + 'PholioImageNameTransaction' => 'applications/pholio/xaction/PholioImageNameTransaction.php', + 'PholioImagePHIDType' => 'applications/pholio/phid/PholioImagePHIDType.php', 'PholioImageQuery' => 'applications/pholio/query/PholioImageQuery.php', + 'PholioImageReplaceTransaction' => 'applications/pholio/xaction/PholioImageReplaceTransaction.php', + 'PholioImageSequenceTransaction' => 'applications/pholio/xaction/PholioImageSequenceTransaction.php', + 'PholioImageTransactionType' => 'applications/pholio/xaction/PholioImageTransactionType.php', 'PholioImageUploadController' => 'applications/pholio/controller/PholioImageUploadController.php', - 'PholioInlineCommentEditView' => 'applications/pholio/view/PholioInlineCommentEditView.php', - 'PholioInlineCommentSaveView' => 'applications/pholio/view/PholioInlineCommentSaveView.php', - 'PholioInlineCommentView' => 'applications/pholio/view/PholioInlineCommentView.php', 'PholioInlineController' => 'applications/pholio/controller/PholioInlineController.php', - 'PholioInlineDeleteController' => 'applications/pholio/controller/PholioInlineDeleteController.php', - 'PholioInlineEditController' => 'applications/pholio/controller/PholioInlineEditController.php', - 'PholioInlineSaveController' => 'applications/pholio/controller/PholioInlineSaveController.php', - 'PholioInlineThumbController' => 'applications/pholio/controller/PholioInlineThumbController.php', - 'PholioInlineViewController' => 'applications/pholio/controller/PholioInlineViewController.php', + 'PholioInlineListController' => 'applications/pholio/controller/PholioInlineListController.php', 'PholioMock' => 'applications/pholio/storage/PholioMock.php', + 'PholioMockArchiveController' => 'applications/pholio/controller/PholioMockArchiveController.php', + 'PholioMockAuthorHeraldField' => 'applications/pholio/herald/PholioMockAuthorHeraldField.php', 'PholioMockCommentController' => 'applications/pholio/controller/PholioMockCommentController.php', + 'PholioMockDescriptionHeraldField' => 'applications/pholio/herald/PholioMockDescriptionHeraldField.php', + 'PholioMockDescriptionTransaction' => 'applications/pholio/xaction/PholioMockDescriptionTransaction.php', 'PholioMockEditController' => 'applications/pholio/controller/PholioMockEditController.php', 'PholioMockEditor' => 'applications/pholio/editor/PholioMockEditor.php', 'PholioMockEmbedView' => 'applications/pholio/view/PholioMockEmbedView.php', + 'PholioMockFerretEngine' => 'applications/pholio/search/PholioMockFerretEngine.php', + 'PholioMockFulltextEngine' => 'applications/pholio/search/PholioMockFulltextEngine.php', + 'PholioMockHasTaskEdgeType' => 'applications/pholio/edge/PholioMockHasTaskEdgeType.php', + 'PholioMockHasTaskRelationship' => 'applications/pholio/relationships/PholioMockHasTaskRelationship.php', + 'PholioMockHeraldField' => 'applications/pholio/herald/PholioMockHeraldField.php', + 'PholioMockHeraldFieldGroup' => 'applications/pholio/herald/PholioMockHeraldFieldGroup.php', 'PholioMockImagesView' => 'applications/pholio/view/PholioMockImagesView.php', + 'PholioMockInlineTransaction' => 'applications/pholio/xaction/PholioMockInlineTransaction.php', 'PholioMockListController' => 'applications/pholio/controller/PholioMockListController.php', 'PholioMockMailReceiver' => 'applications/pholio/mail/PholioMockMailReceiver.php', + 'PholioMockNameHeraldField' => 'applications/pholio/herald/PholioMockNameHeraldField.php', + 'PholioMockNameTransaction' => 'applications/pholio/xaction/PholioMockNameTransaction.php', + 'PholioMockPHIDType' => 'applications/pholio/phid/PholioMockPHIDType.php', 'PholioMockQuery' => 'applications/pholio/query/PholioMockQuery.php', + 'PholioMockRelationship' => 'applications/pholio/relationships/PholioMockRelationship.php', + 'PholioMockRelationshipSource' => 'applications/search/relationship/PholioMockRelationshipSource.php', 'PholioMockSearchEngine' => 'applications/pholio/query/PholioMockSearchEngine.php', + 'PholioMockStatusTransaction' => 'applications/pholio/xaction/PholioMockStatusTransaction.php', + 'PholioMockThumbGridView' => 'applications/pholio/view/PholioMockThumbGridView.php', + 'PholioMockTimelineEngine' => 'applications/pholio/engine/PholioMockTimelineEngine.php', + 'PholioMockTransactionType' => 'applications/pholio/xaction/PholioMockTransactionType.php', 'PholioMockViewController' => 'applications/pholio/controller/PholioMockViewController.php', - 'PholioPHIDTypeImage' => 'applications/pholio/phid/PholioPHIDTypeImage.php', - 'PholioPHIDTypeMock' => 'applications/pholio/phid/PholioPHIDTypeMock.php', 'PholioRemarkupRule' => 'applications/pholio/remarkup/PholioRemarkupRule.php', 'PholioReplyHandler' => 'applications/pholio/mail/PholioReplyHandler.php', - 'PholioSearchIndexer' => 'applications/pholio/search/PholioSearchIndexer.php', + 'PholioSchemaSpec' => 'applications/pholio/storage/PholioSchemaSpec.php', 'PholioTransaction' => 'applications/pholio/storage/PholioTransaction.php', 'PholioTransactionComment' => 'applications/pholio/storage/PholioTransactionComment.php', 'PholioTransactionQuery' => 'applications/pholio/query/PholioTransactionQuery.php', - 'PholioTransactionType' => 'applications/pholio/constants/PholioTransactionType.php', + 'PholioTransactionType' => 'applications/pholio/xaction/PholioTransactionType.php', 'PholioTransactionView' => 'applications/pholio/view/PholioTransactionView.php', 'PholioUploadedImageView' => 'applications/pholio/view/PholioUploadedImageView.php', 'PhortuneAccount' => 'applications/phortune/storage/PhortuneAccount.php', - 'PhortuneAccountBuyController' => 'applications/phortune/controller/PhortuneAccountBuyController.php', + 'PhortuneAccountAddManagerController' => 'applications/phortune/controller/account/PhortuneAccountAddManagerController.php', + 'PhortuneAccountBillingAddressTransaction' => 'applications/phortune/xaction/PhortuneAccountBillingAddressTransaction.php', + 'PhortuneAccountBillingNameTransaction' => 'applications/phortune/xaction/PhortuneAccountBillingNameTransaction.php', + 'PhortuneAccountChargeListController' => 'applications/phortune/controller/account/PhortuneAccountChargeListController.php', + 'PhortuneAccountChargesController' => 'applications/phortune/controller/account/PhortuneAccountChargesController.php', + 'PhortuneAccountController' => 'applications/phortune/controller/account/PhortuneAccountController.php', + 'PhortuneAccountDetailsController' => 'applications/phortune/controller/account/PhortuneAccountDetailsController.php', + 'PhortuneAccountEditController' => 'applications/phortune/controller/account/PhortuneAccountEditController.php', + 'PhortuneAccountEditEngine' => 'applications/phortune/editor/PhortuneAccountEditEngine.php', 'PhortuneAccountEditor' => 'applications/phortune/editor/PhortuneAccountEditor.php', + 'PhortuneAccountEmail' => 'applications/phortune/storage/PhortuneAccountEmail.php', + 'PhortuneAccountEmailAddressTransaction' => 'applications/phortune/xaction/PhortuneAccountEmailAddressTransaction.php', + 'PhortuneAccountEmailAddressesController' => 'applications/phortune/controller/account/PhortuneAccountEmailAddressesController.php', + 'PhortuneAccountEmailEditController' => 'applications/phortune/controller/account/PhortuneAccountEmailEditController.php', + 'PhortuneAccountEmailEditEngine' => 'applications/phortune/editor/PhortuneAccountEmailEditEngine.php', + 'PhortuneAccountEmailEditor' => 'applications/phortune/editor/PhortuneAccountEmailEditor.php', + 'PhortuneAccountEmailPHIDType' => 'applications/phortune/phid/PhortuneAccountEmailPHIDType.php', + 'PhortuneAccountEmailQuery' => 'applications/phortune/query/PhortuneAccountEmailQuery.php', + 'PhortuneAccountEmailRotateController' => 'applications/phortune/controller/account/PhortuneAccountEmailRotateController.php', + 'PhortuneAccountEmailRotateTransaction' => 'applications/phortune/xaction/PhortuneAccountEmailRotateTransaction.php', + 'PhortuneAccountEmailStatus' => 'applications/phortune/constants/PhortuneAccountEmailStatus.php', + 'PhortuneAccountEmailStatusController' => 'applications/phortune/controller/account/PhortuneAccountEmailStatusController.php', + 'PhortuneAccountEmailStatusTransaction' => 'applications/phortune/xaction/PhortuneAccountEmailStatusTransaction.php', + 'PhortuneAccountEmailTransaction' => 'applications/phortune/storage/PhortuneAccountEmailTransaction.php', + 'PhortuneAccountEmailTransactionQuery' => 'applications/phortune/query/PhortuneAccountEmailTransactionQuery.php', + 'PhortuneAccountEmailTransactionType' => 'applications/phortune/xaction/PhortuneAccountEmailTransactionType.php', + 'PhortuneAccountEmailViewController' => 'applications/phortune/controller/account/PhortuneAccountEmailViewController.php', + 'PhortuneAccountHasMemberEdgeType' => 'applications/phortune/edge/PhortuneAccountHasMemberEdgeType.php', + 'PhortuneAccountHasMerchantEdgeType' => 'applications/phortune/edge/PhortuneAccountHasMerchantEdgeType.php', + 'PhortuneAccountListController' => 'applications/phortune/controller/account/PhortuneAccountListController.php', + 'PhortuneAccountManagersController' => 'applications/phortune/controller/account/PhortuneAccountManagersController.php', + 'PhortuneAccountNameTransaction' => 'applications/phortune/xaction/PhortuneAccountNameTransaction.php', + 'PhortuneAccountOrderListController' => 'applications/phortune/controller/account/PhortuneAccountOrderListController.php', + 'PhortuneAccountOrdersController' => 'applications/phortune/controller/account/PhortuneAccountOrdersController.php', + 'PhortuneAccountOverviewController' => 'applications/phortune/controller/account/PhortuneAccountOverviewController.php', + 'PhortuneAccountPHIDType' => 'applications/phortune/phid/PhortuneAccountPHIDType.php', + 'PhortuneAccountPaymentMethodController' => 'applications/phortune/controller/account/PhortuneAccountPaymentMethodController.php', + 'PhortuneAccountPaymentMethodViewController' => 'applications/phortune/controller/account/PhortuneAccountPaymentMethodViewController.php', + 'PhortuneAccountProfileController' => 'applications/phortune/controller/account/PhortuneAccountProfileController.php', 'PhortuneAccountQuery' => 'applications/phortune/query/PhortuneAccountQuery.php', + 'PhortuneAccountSubscriptionAutopayController' => 'applications/phortune/controller/account/PhortuneAccountSubscriptionAutopayController.php', + 'PhortuneAccountSubscriptionController' => 'applications/phortune/controller/account/PhortuneAccountSubscriptionController.php', + 'PhortuneAccountSubscriptionViewController' => 'applications/phortune/controller/account/PhortuneAccountSubscriptionViewController.php', 'PhortuneAccountTransaction' => 'applications/phortune/storage/PhortuneAccountTransaction.php', 'PhortuneAccountTransactionQuery' => 'applications/phortune/query/PhortuneAccountTransactionQuery.php', - 'PhortuneAccountViewController' => 'applications/phortune/controller/PhortuneAccountViewController.php', - 'PhortuneBalancedPaymentProvider' => 'applications/phortune/provider/PhortuneBalancedPaymentProvider.php', + 'PhortuneAccountTransactionType' => 'applications/phortune/xaction/PhortuneAccountTransactionType.php', + 'PhortuneAdHocCart' => 'applications/phortune/cart/PhortuneAdHocCart.php', + 'PhortuneAdHocProduct' => 'applications/phortune/product/PhortuneAdHocProduct.php', + 'PhortuneAddPaymentMethodAction' => 'applications/phortune/action/PhortuneAddPaymentMethodAction.php', 'PhortuneCart' => 'applications/phortune/storage/PhortuneCart.php', + 'PhortuneCartAcceptController' => 'applications/phortune/controller/cart/PhortuneCartAcceptController.php', + 'PhortuneCartCancelController' => 'applications/phortune/controller/cart/PhortuneCartCancelController.php', + 'PhortuneCartCheckoutController' => 'applications/phortune/controller/cart/PhortuneCartCheckoutController.php', + 'PhortuneCartController' => 'applications/phortune/controller/cart/PhortuneCartController.php', + 'PhortuneCartEditor' => 'applications/phortune/editor/PhortuneCartEditor.php', + 'PhortuneCartImplementation' => 'applications/phortune/cart/PhortuneCartImplementation.php', + 'PhortuneCartPHIDType' => 'applications/phortune/phid/PhortuneCartPHIDType.php', + 'PhortuneCartQuery' => 'applications/phortune/query/PhortuneCartQuery.php', + 'PhortuneCartReplyHandler' => 'applications/phortune/mail/PhortuneCartReplyHandler.php', + 'PhortuneCartSearchEngine' => 'applications/phortune/query/PhortuneCartSearchEngine.php', + 'PhortuneCartTransaction' => 'applications/phortune/storage/PhortuneCartTransaction.php', + 'PhortuneCartTransactionQuery' => 'applications/phortune/query/PhortuneCartTransactionQuery.php', + 'PhortuneCartUpdateController' => 'applications/phortune/controller/cart/PhortuneCartUpdateController.php', + 'PhortuneCartViewController' => 'applications/phortune/controller/cart/PhortuneCartViewController.php', + 'PhortuneCartVoidController' => 'applications/phortune/controller/cart/PhortuneCartVoidController.php', 'PhortuneCharge' => 'applications/phortune/storage/PhortuneCharge.php', + 'PhortuneChargePHIDType' => 'applications/phortune/phid/PhortuneChargePHIDType.php', + 'PhortuneChargeQuery' => 'applications/phortune/query/PhortuneChargeQuery.php', + 'PhortuneChargeSearchEngine' => 'applications/phortune/query/PhortuneChargeSearchEngine.php', + 'PhortuneChargeTableView' => 'applications/phortune/view/PhortuneChargeTableView.php', 'PhortuneConstants' => 'applications/phortune/constants/PhortuneConstants.php', 'PhortuneController' => 'applications/phortune/controller/PhortuneController.php', 'PhortuneCreditCardForm' => 'applications/phortune/view/PhortuneCreditCardForm.php', 'PhortuneCurrency' => 'applications/phortune/currency/PhortuneCurrency.php', + 'PhortuneCurrencySerializer' => 'applications/phortune/currency/PhortuneCurrencySerializer.php', 'PhortuneCurrencyTestCase' => 'applications/phortune/currency/__tests__/PhortuneCurrencyTestCase.php', 'PhortuneDAO' => 'applications/phortune/storage/PhortuneDAO.php', + 'PhortuneDisplayException' => 'applications/phortune/exception/PhortuneDisplayException.php', 'PhortuneErrCode' => 'applications/phortune/constants/PhortuneErrCode.php', + 'PhortuneExternalController' => 'applications/phortune/controller/external/PhortuneExternalController.php', + 'PhortuneExternalOrderController' => 'applications/phortune/controller/external/PhortuneExternalOrderController.php', + 'PhortuneExternalOverviewController' => 'applications/phortune/controller/external/PhortuneExternalOverviewController.php', + 'PhortuneExternalUnsubscribeController' => 'applications/phortune/controller/external/PhortuneExternalUnsubscribeController.php', 'PhortuneLandingController' => 'applications/phortune/controller/PhortuneLandingController.php', + 'PhortuneMemberHasAccountEdgeType' => 'applications/phortune/edge/PhortuneMemberHasAccountEdgeType.php', + 'PhortuneMemberHasMerchantEdgeType' => 'applications/phortune/edge/PhortuneMemberHasMerchantEdgeType.php', + 'PhortuneMerchant' => 'applications/phortune/storage/PhortuneMerchant.php', + 'PhortuneMerchantAddManagerController' => 'applications/phortune/controller/merchant/PhortuneMerchantAddManagerController.php', + 'PhortuneMerchantCapability' => 'applications/phortune/capability/PhortuneMerchantCapability.php', + 'PhortuneMerchantContactInfoTransaction' => 'applications/phortune/xaction/PhortuneMerchantContactInfoTransaction.php', + 'PhortuneMerchantController' => 'applications/phortune/controller/merchant/PhortuneMerchantController.php', + 'PhortuneMerchantDescriptionTransaction' => 'applications/phortune/xaction/PhortuneMerchantDescriptionTransaction.php', + 'PhortuneMerchantDetailsController' => 'applications/phortune/controller/merchant/PhortuneMerchantDetailsController.php', + 'PhortuneMerchantEditController' => 'applications/phortune/controller/merchant/PhortuneMerchantEditController.php', + 'PhortuneMerchantEditEngine' => 'applications/phortune/editor/PhortuneMerchantEditEngine.php', + 'PhortuneMerchantEditor' => 'applications/phortune/editor/PhortuneMerchantEditor.php', + 'PhortuneMerchantHasAccountEdgeType' => 'applications/phortune/edge/PhortuneMerchantHasAccountEdgeType.php', + 'PhortuneMerchantHasMemberEdgeType' => 'applications/phortune/edge/PhortuneMerchantHasMemberEdgeType.php', + 'PhortuneMerchantInvoiceCreateController' => 'applications/phortune/controller/merchant/PhortuneMerchantInvoiceCreateController.php', + 'PhortuneMerchantInvoiceEmailTransaction' => 'applications/phortune/xaction/PhortuneMerchantInvoiceEmailTransaction.php', + 'PhortuneMerchantInvoiceFooterTransaction' => 'applications/phortune/xaction/PhortuneMerchantInvoiceFooterTransaction.php', + 'PhortuneMerchantListController' => 'applications/phortune/controller/merchant/PhortuneMerchantListController.php', + 'PhortuneMerchantManagersController' => 'applications/phortune/controller/merchant/PhortuneMerchantManagersController.php', + 'PhortuneMerchantNameTransaction' => 'applications/phortune/xaction/PhortuneMerchantNameTransaction.php', + 'PhortuneMerchantOrderListController' => 'applications/phortune/controller/merchant/PhortuneMerchantOrderListController.php', + 'PhortuneMerchantOrdersController' => 'applications/phortune/controller/merchant/PhortuneMerchantOrdersController.php', + 'PhortuneMerchantOverviewController' => 'applications/phortune/controller/merchant/PhortuneMerchantOverviewController.php', + 'PhortuneMerchantPHIDType' => 'applications/phortune/phid/PhortuneMerchantPHIDType.php', + 'PhortuneMerchantPictureController' => 'applications/phortune/controller/merchant/PhortuneMerchantPictureController.php', + 'PhortuneMerchantPictureTransaction' => 'applications/phortune/xaction/PhortuneMerchantPictureTransaction.php', + 'PhortuneMerchantProfileController' => 'applications/phortune/controller/merchant/PhortuneMerchantProfileController.php', + 'PhortuneMerchantProviderDisableController' => 'applications/phortune/controller/merchant/PhortuneMerchantProviderDisableController.php', + 'PhortuneMerchantProviderEditController' => 'applications/phortune/controller/merchant/PhortuneMerchantProviderEditController.php', + 'PhortuneMerchantProviderViewController' => 'applications/phortune/controller/merchant/PhortuneMerchantProviderViewController.php', + 'PhortuneMerchantProvidersController' => 'applications/phortune/controller/merchant/PhortuneMerchantProvidersController.php', + 'PhortuneMerchantQuery' => 'applications/phortune/query/PhortuneMerchantQuery.php', + 'PhortuneMerchantSearchEngine' => 'applications/phortune/query/PhortuneMerchantSearchEngine.php', + 'PhortuneMerchantSubscriptionListController' => 'applications/phortune/controller/merchant/PhortuneMerchantSubscriptionListController.php', + 'PhortuneMerchantSubscriptionsController' => 'applications/phortune/controller/merchant/PhortuneMerchantSubscriptionsController.php', + 'PhortuneMerchantTransaction' => 'applications/phortune/storage/PhortuneMerchantTransaction.php', + 'PhortuneMerchantTransactionQuery' => 'applications/phortune/query/PhortuneMerchantTransactionQuery.php', + 'PhortuneMerchantTransactionType' => 'applications/phortune/xaction/PhortuneMerchantTransactionType.php', 'PhortuneMonthYearExpiryControl' => 'applications/phortune/control/PhortuneMonthYearExpiryControl.php', - 'PhortuneMultiplePaymentProvidersException' => 'applications/phortune/exception/PhortuneMultiplePaymentProvidersException.php', - 'PhortuneNoPaymentProviderException' => 'applications/phortune/exception/PhortuneNoPaymentProviderException.php', - 'PhortuneNotImplementedException' => 'applications/phortune/exception/PhortuneNotImplementedException.php', + 'PhortuneOrderDescriptionView' => 'applications/phortune/view/PhortuneOrderDescriptionView.php', + 'PhortuneOrderItemsView' => 'applications/phortune/view/PhortuneOrderItemsView.php', + 'PhortuneOrderSummaryView' => 'applications/phortune/view/PhortuneOrderSummaryView.php', + 'PhortuneOrderTableView' => 'applications/phortune/view/PhortuneOrderTableView.php', + 'PhortuneOrderView' => 'applications/phortune/view/PhortuneOrderView.php', + 'PhortunePayPalPaymentProvider' => 'applications/phortune/provider/PhortunePayPalPaymentProvider.php', 'PhortunePaymentMethod' => 'applications/phortune/storage/PhortunePaymentMethod.php', - 'PhortunePaymentMethodEditController' => 'applications/phortune/controller/PhortunePaymentMethodEditController.php', - 'PhortunePaymentMethodListController' => 'applications/phortune/controller/PhortunePaymentMethodListController.php', + 'PhortunePaymentMethodCreateController' => 'applications/phortune/controller/paymentmethod/PhortunePaymentMethodCreateController.php', + 'PhortunePaymentMethodDisableController' => 'applications/phortune/controller/paymentmethod/PhortunePaymentMethodDisableController.php', + 'PhortunePaymentMethodEditController' => 'applications/phortune/controller/paymentmethod/PhortunePaymentMethodEditController.php', + 'PhortunePaymentMethodEditor' => 'applications/phortune/editor/PhortunePaymentMethodEditor.php', + 'PhortunePaymentMethodNameTransaction' => 'applications/phortune/xaction/paymentmethod/PhortunePaymentMethodNameTransaction.php', + 'PhortunePaymentMethodPHIDType' => 'applications/phortune/phid/PhortunePaymentMethodPHIDType.php', + 'PhortunePaymentMethodPolicyCodex' => 'applications/phortune/codex/PhortunePaymentMethodPolicyCodex.php', 'PhortunePaymentMethodQuery' => 'applications/phortune/query/PhortunePaymentMethodQuery.php', - 'PhortunePaymentMethodViewController' => 'applications/phortune/controller/PhortunePaymentMethodViewController.php', + 'PhortunePaymentMethodStatusTransaction' => 'applications/phortune/xaction/paymentmethod/PhortunePaymentMethodStatusTransaction.php', + 'PhortunePaymentMethodTransaction' => 'applications/phortune/storage/PhortunePaymentMethodTransaction.php', + 'PhortunePaymentMethodTransactionQuery' => 'applications/phortune/query/PhortunePaymentMethodTransactionQuery.php', + 'PhortunePaymentMethodTransactionType' => 'applications/phortune/xaction/paymentmethod/PhortunePaymentMethodTransactionType.php', 'PhortunePaymentProvider' => 'applications/phortune/provider/PhortunePaymentProvider.php', + 'PhortunePaymentProviderConfig' => 'applications/phortune/storage/PhortunePaymentProviderConfig.php', + 'PhortunePaymentProviderConfigEditor' => 'applications/phortune/editor/PhortunePaymentProviderConfigEditor.php', + 'PhortunePaymentProviderConfigQuery' => 'applications/phortune/query/PhortunePaymentProviderConfigQuery.php', + 'PhortunePaymentProviderConfigTransaction' => 'applications/phortune/storage/PhortunePaymentProviderConfigTransaction.php', + 'PhortunePaymentProviderConfigTransactionQuery' => 'applications/phortune/query/PhortunePaymentProviderConfigTransactionQuery.php', + 'PhortunePaymentProviderPHIDType' => 'applications/phortune/phid/PhortunePaymentProviderPHIDType.php', 'PhortunePaymentProviderTestCase' => 'applications/phortune/provider/__tests__/PhortunePaymentProviderTestCase.php', - 'PhortunePaypalPaymentProvider' => 'applications/phortune/provider/PhortunePaypalPaymentProvider.php', 'PhortuneProduct' => 'applications/phortune/storage/PhortuneProduct.php', - 'PhortuneProductEditController' => 'applications/phortune/controller/PhortuneProductEditController.php', - 'PhortuneProductEditor' => 'applications/phortune/editor/PhortuneProductEditor.php', - 'PhortuneProductListController' => 'applications/phortune/controller/PhortuneProductListController.php', + 'PhortuneProductImplementation' => 'applications/phortune/product/PhortuneProductImplementation.php', + 'PhortuneProductListController' => 'applications/phortune/controller/product/PhortuneProductListController.php', + 'PhortuneProductPHIDType' => 'applications/phortune/phid/PhortuneProductPHIDType.php', 'PhortuneProductQuery' => 'applications/phortune/query/PhortuneProductQuery.php', - 'PhortuneProductTransaction' => 'applications/phortune/storage/PhortuneProductTransaction.php', - 'PhortuneProductTransactionQuery' => 'applications/phortune/query/PhortuneProductTransactionQuery.php', - 'PhortuneProductViewController' => 'applications/phortune/controller/PhortuneProductViewController.php', - 'PhortuneProviderController' => 'applications/phortune/controller/PhortuneProviderController.php', + 'PhortuneProductViewController' => 'applications/phortune/controller/product/PhortuneProductViewController.php', + 'PhortuneProviderActionController' => 'applications/phortune/controller/provider/PhortuneProviderActionController.php', 'PhortunePurchase' => 'applications/phortune/storage/PhortunePurchase.php', + 'PhortunePurchasePHIDType' => 'applications/phortune/phid/PhortunePurchasePHIDType.php', + 'PhortunePurchaseQuery' => 'applications/phortune/query/PhortunePurchaseQuery.php', + 'PhortuneSchemaSpec' => 'applications/phortune/storage/PhortuneSchemaSpec.php', 'PhortuneStripePaymentProvider' => 'applications/phortune/provider/PhortuneStripePaymentProvider.php', - 'PhortuneTestExtraPaymentProvider' => 'applications/phortune/provider/__tests__/PhortuneTestExtraPaymentProvider.php', + 'PhortuneSubscription' => 'applications/phortune/storage/PhortuneSubscription.php', + 'PhortuneSubscriptionAutopayTransaction' => 'applications/phortune/xaction/subscription/PhortuneSubscriptionAutopayTransaction.php', + 'PhortuneSubscriptionCart' => 'applications/phortune/cart/PhortuneSubscriptionCart.php', + 'PhortuneSubscriptionEditor' => 'applications/phortune/editor/PhortuneSubscriptionEditor.php', + 'PhortuneSubscriptionImplementation' => 'applications/phortune/subscription/PhortuneSubscriptionImplementation.php', + 'PhortuneSubscriptionPHIDType' => 'applications/phortune/phid/PhortuneSubscriptionPHIDType.php', + 'PhortuneSubscriptionPolicyCodex' => 'applications/phortune/codex/PhortuneSubscriptionPolicyCodex.php', + 'PhortuneSubscriptionProduct' => 'applications/phortune/product/PhortuneSubscriptionProduct.php', + 'PhortuneSubscriptionQuery' => 'applications/phortune/query/PhortuneSubscriptionQuery.php', + 'PhortuneSubscriptionSearchEngine' => 'applications/phortune/query/PhortuneSubscriptionSearchEngine.php', + 'PhortuneSubscriptionTableView' => 'applications/phortune/view/PhortuneSubscriptionTableView.php', + 'PhortuneSubscriptionTransaction' => 'applications/phortune/storage/PhortuneSubscriptionTransaction.php', + 'PhortuneSubscriptionTransactionQuery' => 'applications/phortune/query/PhortuneSubscriptionTransactionQuery.php', + 'PhortuneSubscriptionTransactionType' => 'applications/phortune/xaction/subscription/PhortuneSubscriptionTransactionType.php', + 'PhortuneSubscriptionWorker' => 'applications/phortune/worker/PhortuneSubscriptionWorker.php', 'PhortuneTestPaymentProvider' => 'applications/phortune/provider/PhortuneTestPaymentProvider.php', - 'PhortuneWePayPaymentProvider' => 'applications/phortune/provider/PhortuneWePayPaymentProvider.php', + 'PhrequentConduitAPIMethod' => 'applications/phrequent/conduit/PhrequentConduitAPIMethod.php', 'PhrequentController' => 'applications/phrequent/controller/PhrequentController.php', + 'PhrequentCurtainExtension' => 'applications/phrequent/engineextension/PhrequentCurtainExtension.php', 'PhrequentDAO' => 'applications/phrequent/storage/PhrequentDAO.php', 'PhrequentListController' => 'applications/phrequent/controller/PhrequentListController.php', + 'PhrequentPopConduitAPIMethod' => 'applications/phrequent/conduit/PhrequentPopConduitAPIMethod.php', + 'PhrequentPushConduitAPIMethod' => 'applications/phrequent/conduit/PhrequentPushConduitAPIMethod.php', + 'PhrequentSearchEngine' => 'applications/phrequent/query/PhrequentSearchEngine.php', + 'PhrequentTimeBlock' => 'applications/phrequent/storage/PhrequentTimeBlock.php', + 'PhrequentTimeBlockTestCase' => 'applications/phrequent/storage/__tests__/PhrequentTimeBlockTestCase.php', + 'PhrequentTimeSlices' => 'applications/phrequent/storage/PhrequentTimeSlices.php', 'PhrequentTrackController' => 'applications/phrequent/controller/PhrequentTrackController.php', 'PhrequentTrackableInterface' => 'applications/phrequent/interface/PhrequentTrackableInterface.php', + 'PhrequentTrackingConduitAPIMethod' => 'applications/phrequent/conduit/PhrequentTrackingConduitAPIMethod.php', + 'PhrequentTrackingEditor' => 'applications/phrequent/editor/PhrequentTrackingEditor.php', 'PhrequentUIEventListener' => 'applications/phrequent/event/PhrequentUIEventListener.php', 'PhrequentUserTime' => 'applications/phrequent/storage/PhrequentUserTime.php', 'PhrequentUserTimeQuery' => 'applications/phrequent/query/PhrequentUserTimeQuery.php', - 'PhrictionActionConstants' => 'applications/phriction/constants/PhrictionActionConstants.php', - 'PhrictionActionMenuEventListener' => 'applications/phriction/event/PhrictionActionMenuEventListener.php', 'PhrictionChangeType' => 'applications/phriction/constants/PhrictionChangeType.php', + 'PhrictionConduitAPIMethod' => 'applications/phriction/conduit/PhrictionConduitAPIMethod.php', 'PhrictionConstants' => 'applications/phriction/constants/PhrictionConstants.php', 'PhrictionContent' => 'applications/phriction/storage/PhrictionContent.php', + 'PhrictionContentPHIDType' => 'applications/phriction/phid/PhrictionContentPHIDType.php', + 'PhrictionContentQuery' => 'applications/phriction/query/PhrictionContentQuery.php', + 'PhrictionContentSearchConduitAPIMethod' => 'applications/phriction/conduit/PhrictionContentSearchConduitAPIMethod.php', + 'PhrictionContentSearchEngine' => 'applications/phriction/query/PhrictionContentSearchEngine.php', + 'PhrictionContentSearchEngineAttachment' => 'applications/phriction/engineextension/PhrictionContentSearchEngineAttachment.php', 'PhrictionController' => 'applications/phriction/controller/PhrictionController.php', + 'PhrictionCreateConduitAPIMethod' => 'applications/phriction/conduit/PhrictionCreateConduitAPIMethod.php', 'PhrictionDAO' => 'applications/phriction/storage/PhrictionDAO.php', + 'PhrictionDatasourceEngineExtension' => 'applications/phriction/engineextension/PhrictionDatasourceEngineExtension.php', 'PhrictionDeleteController' => 'applications/phriction/controller/PhrictionDeleteController.php', 'PhrictionDiffController' => 'applications/phriction/controller/PhrictionDiffController.php', 'PhrictionDocument' => 'applications/phriction/storage/PhrictionDocument.php', + 'PhrictionDocumentAuthorHeraldField' => 'applications/phriction/herald/PhrictionDocumentAuthorHeraldField.php', + 'PhrictionDocumentContentHeraldField' => 'applications/phriction/herald/PhrictionDocumentContentHeraldField.php', + 'PhrictionDocumentContentTransaction' => 'applications/phriction/xaction/PhrictionDocumentContentTransaction.php', 'PhrictionDocumentController' => 'applications/phriction/controller/PhrictionDocumentController.php', - 'PhrictionDocumentEditor' => 'applications/phriction/editor/PhrictionDocumentEditor.php', - 'PhrictionDocumentPreviewController' => 'applications/phriction/controller/PhrictionDocumentPreviewController.php', + 'PhrictionDocumentDatasource' => 'applications/phriction/typeahead/PhrictionDocumentDatasource.php', + 'PhrictionDocumentDeleteTransaction' => 'applications/phriction/xaction/PhrictionDocumentDeleteTransaction.php', + 'PhrictionDocumentDraftTransaction' => 'applications/phriction/xaction/PhrictionDocumentDraftTransaction.php', + 'PhrictionDocumentEditEngine' => 'applications/phriction/editor/PhrictionDocumentEditEngine.php', + 'PhrictionDocumentEditTransaction' => 'applications/phriction/xaction/PhrictionDocumentEditTransaction.php', + 'PhrictionDocumentFerretEngine' => 'applications/phriction/search/PhrictionDocumentFerretEngine.php', + 'PhrictionDocumentFulltextEngine' => 'applications/phriction/search/PhrictionDocumentFulltextEngine.php', + 'PhrictionDocumentHeraldAdapter' => 'applications/phriction/herald/PhrictionDocumentHeraldAdapter.php', + 'PhrictionDocumentHeraldField' => 'applications/phriction/herald/PhrictionDocumentHeraldField.php', + 'PhrictionDocumentHeraldFieldGroup' => 'applications/phriction/herald/PhrictionDocumentHeraldFieldGroup.php', + 'PhrictionDocumentMoveAwayTransaction' => 'applications/phriction/xaction/PhrictionDocumentMoveAwayTransaction.php', + 'PhrictionDocumentMoveToTransaction' => 'applications/phriction/xaction/PhrictionDocumentMoveToTransaction.php', + 'PhrictionDocumentPHIDType' => 'applications/phriction/phid/PhrictionDocumentPHIDType.php', + 'PhrictionDocumentPathHeraldField' => 'applications/phriction/herald/PhrictionDocumentPathHeraldField.php', + 'PhrictionDocumentPolicyCodex' => 'applications/phriction/codex/PhrictionDocumentPolicyCodex.php', + 'PhrictionDocumentPublishTransaction' => 'applications/phriction/xaction/PhrictionDocumentPublishTransaction.php', + 'PhrictionDocumentPublishedHeraldField' => 'applications/phriction/herald/PhrictionDocumentPublishedHeraldField.php', 'PhrictionDocumentQuery' => 'applications/phriction/query/PhrictionDocumentQuery.php', + 'PhrictionDocumentSearchConduitAPIMethod' => 'applications/phriction/conduit/PhrictionDocumentSearchConduitAPIMethod.php', + 'PhrictionDocumentSearchEngine' => 'applications/phriction/query/PhrictionDocumentSearchEngine.php', 'PhrictionDocumentStatus' => 'applications/phriction/constants/PhrictionDocumentStatus.php', - 'PhrictionDocumentTestCase' => 'applications/phriction/storage/__tests__/PhrictionDocumentTestCase.php', + 'PhrictionDocumentTitleHeraldField' => 'applications/phriction/herald/PhrictionDocumentTitleHeraldField.php', + 'PhrictionDocumentTitleTransaction' => 'applications/phriction/xaction/PhrictionDocumentTitleTransaction.php', + 'PhrictionDocumentTransactionType' => 'applications/phriction/xaction/PhrictionDocumentTransactionType.php', + 'PhrictionDocumentVersionTransaction' => 'applications/phriction/xaction/PhrictionDocumentVersionTransaction.php', + 'PhrictionEditConduitAPIMethod' => 'applications/phriction/conduit/PhrictionEditConduitAPIMethod.php', 'PhrictionEditController' => 'applications/phriction/controller/PhrictionEditController.php', + 'PhrictionEditEngineController' => 'applications/phriction/controller/PhrictionEditEngineController.php', + 'PhrictionHistoryConduitAPIMethod' => 'applications/phriction/conduit/PhrictionHistoryConduitAPIMethod.php', 'PhrictionHistoryController' => 'applications/phriction/controller/PhrictionHistoryController.php', + 'PhrictionInfoConduitAPIMethod' => 'applications/phriction/conduit/PhrictionInfoConduitAPIMethod.php', 'PhrictionListController' => 'applications/phriction/controller/PhrictionListController.php', + 'PhrictionMarkupPreviewController' => 'applications/phriction/controller/PhrictionMarkupPreviewController.php', 'PhrictionMoveController' => 'applications/phriction/controller/PhrictionMoveController.php', 'PhrictionNewController' => 'applications/phriction/controller/PhrictionNewController.php', - 'PhrictionPHIDTypeDocument' => 'applications/phriction/phid/PhrictionPHIDTypeDocument.php', - 'PhrictionRemarkupRule' => 'applications/phriction/remarkup/PhrictionRemarkupRule.php', - 'PhrictionSearchEngine' => 'applications/phriction/query/PhrictionSearchEngine.php', - 'PhrictionSearchIndexer' => 'applications/phriction/search/PhrictionSearchIndexer.php', + 'PhrictionPublishController' => 'applications/phriction/controller/PhrictionPublishController.php', + 'PhrictionRemarkupRule' => 'applications/phriction/markup/PhrictionRemarkupRule.php', + 'PhrictionReplyHandler' => 'applications/phriction/mail/PhrictionReplyHandler.php', + 'PhrictionSchemaSpec' => 'applications/phriction/storage/PhrictionSchemaSpec.php', + 'PhrictionTransaction' => 'applications/phriction/storage/PhrictionTransaction.php', + 'PhrictionTransactionComment' => 'applications/phriction/storage/PhrictionTransactionComment.php', + 'PhrictionTransactionEditor' => 'applications/phriction/editor/PhrictionTransactionEditor.php', + 'PhrictionTransactionQuery' => 'applications/phriction/query/PhrictionTransactionQuery.php', + 'PhutilAPCKeyValueCache' => 'infrastructure/cache/PhutilAPCKeyValueCache.php', + 'PhutilAmazonAuthAdapter' => 'applications/auth/adapter/PhutilAmazonAuthAdapter.php', + 'PhutilAsanaAuthAdapter' => 'applications/auth/adapter/PhutilAsanaAuthAdapter.php', + 'PhutilAuthAdapter' => 'applications/auth/adapter/PhutilAuthAdapter.php', + 'PhutilAuthConfigurationException' => 'applications/auth/exception/PhutilAuthConfigurationException.php', + 'PhutilAuthCredentialException' => 'applications/auth/exception/PhutilAuthCredentialException.php', + 'PhutilAuthException' => 'applications/auth/exception/PhutilAuthException.php', + 'PhutilAuthUserAbortedException' => 'applications/auth/exception/PhutilAuthUserAbortedException.php', + 'PhutilBitbucketAuthAdapter' => 'applications/auth/adapter/PhutilBitbucketAuthAdapter.php', + 'PhutilCLikeCodeSnippetContextFreeGrammar' => 'infrastructure/lipsum/code/PhutilCLikeCodeSnippetContextFreeGrammar.php', + 'PhutilCalendarAbsoluteDateTime' => 'applications/calendar/parser/data/PhutilCalendarAbsoluteDateTime.php', + 'PhutilCalendarContainerNode' => 'applications/calendar/parser/data/PhutilCalendarContainerNode.php', + 'PhutilCalendarDateTime' => 'applications/calendar/parser/data/PhutilCalendarDateTime.php', + 'PhutilCalendarDateTimeTestCase' => 'applications/calendar/parser/data/__tests__/PhutilCalendarDateTimeTestCase.php', + 'PhutilCalendarDocumentNode' => 'applications/calendar/parser/data/PhutilCalendarDocumentNode.php', + 'PhutilCalendarDuration' => 'applications/calendar/parser/data/PhutilCalendarDuration.php', + 'PhutilCalendarEventNode' => 'applications/calendar/parser/data/PhutilCalendarEventNode.php', + 'PhutilCalendarNode' => 'applications/calendar/parser/data/PhutilCalendarNode.php', + 'PhutilCalendarProxyDateTime' => 'applications/calendar/parser/data/PhutilCalendarProxyDateTime.php', + 'PhutilCalendarRawNode' => 'applications/calendar/parser/data/PhutilCalendarRawNode.php', + 'PhutilCalendarRecurrenceList' => 'applications/calendar/parser/data/PhutilCalendarRecurrenceList.php', + 'PhutilCalendarRecurrenceRule' => 'applications/calendar/parser/data/PhutilCalendarRecurrenceRule.php', + 'PhutilCalendarRecurrenceRuleTestCase' => 'applications/calendar/parser/data/__tests__/PhutilCalendarRecurrenceRuleTestCase.php', + 'PhutilCalendarRecurrenceSet' => 'applications/calendar/parser/data/PhutilCalendarRecurrenceSet.php', + 'PhutilCalendarRecurrenceSource' => 'applications/calendar/parser/data/PhutilCalendarRecurrenceSource.php', + 'PhutilCalendarRecurrenceTestCase' => 'applications/calendar/parser/data/__tests__/PhutilCalendarRecurrenceTestCase.php', + 'PhutilCalendarRelativeDateTime' => 'applications/calendar/parser/data/PhutilCalendarRelativeDateTime.php', + 'PhutilCalendarRootNode' => 'applications/calendar/parser/data/PhutilCalendarRootNode.php', + 'PhutilCalendarUserNode' => 'applications/calendar/parser/data/PhutilCalendarUserNode.php', + 'PhutilCodeSnippetContextFreeGrammar' => 'infrastructure/lipsum/code/PhutilCodeSnippetContextFreeGrammar.php', + 'PhutilConsoleSyntaxHighlighter' => 'infrastructure/markup/syntax/highlighter/PhutilConsoleSyntaxHighlighter.php', + 'PhutilContextFreeGrammar' => 'infrastructure/lipsum/PhutilContextFreeGrammar.php', + 'PhutilDaemon' => 'infrastructure/daemon/PhutilDaemon.php', + 'PhutilDaemonHandle' => 'infrastructure/daemon/PhutilDaemonHandle.php', + 'PhutilDaemonOverseer' => 'infrastructure/daemon/PhutilDaemonOverseer.php', + 'PhutilDaemonOverseerModule' => 'infrastructure/daemon/PhutilDaemonOverseerModule.php', + 'PhutilDaemonPool' => 'infrastructure/daemon/PhutilDaemonPool.php', + 'PhutilDefaultSyntaxHighlighter' => 'infrastructure/markup/syntax/highlighter/PhutilDefaultSyntaxHighlighter.php', + 'PhutilDefaultSyntaxHighlighterEngine' => 'infrastructure/markup/syntax/engine/PhutilDefaultSyntaxHighlighterEngine.php', + 'PhutilDefaultSyntaxHighlighterEnginePygmentsFuture' => 'infrastructure/markup/syntax/highlighter/pygments/PhutilDefaultSyntaxHighlighterEnginePygmentsFuture.php', + 'PhutilDefaultSyntaxHighlighterEngineTestCase' => 'infrastructure/markup/syntax/engine/__tests__/PhutilDefaultSyntaxHighlighterEngineTestCase.php', + 'PhutilDirectoryKeyValueCache' => 'infrastructure/cache/PhutilDirectoryKeyValueCache.php', + 'PhutilDisqusAuthAdapter' => 'applications/auth/adapter/PhutilDisqusAuthAdapter.php', + 'PhutilDivinerSyntaxHighlighter' => 'infrastructure/markup/syntax/highlighter/PhutilDivinerSyntaxHighlighter.php', + 'PhutilEmptyAuthAdapter' => 'applications/auth/adapter/PhutilEmptyAuthAdapter.php', + 'PhutilFacebookAuthAdapter' => 'applications/auth/adapter/PhutilFacebookAuthAdapter.php', + 'PhutilGitHubAuthAdapter' => 'applications/auth/adapter/PhutilGitHubAuthAdapter.php', + 'PhutilGoogleAuthAdapter' => 'applications/auth/adapter/PhutilGoogleAuthAdapter.php', + 'PhutilICSParser' => 'applications/calendar/parser/ics/PhutilICSParser.php', + 'PhutilICSParserException' => 'applications/calendar/parser/ics/PhutilICSParserException.php', + 'PhutilICSParserTestCase' => 'applications/calendar/parser/ics/__tests__/PhutilICSParserTestCase.php', + 'PhutilICSWriter' => 'applications/calendar/parser/ics/PhutilICSWriter.php', + 'PhutilICSWriterTestCase' => 'applications/calendar/parser/ics/__tests__/PhutilICSWriterTestCase.php', + 'PhutilInRequestKeyValueCache' => 'infrastructure/cache/PhutilInRequestKeyValueCache.php', + 'PhutilInvisibleSyntaxHighlighter' => 'infrastructure/markup/syntax/highlighter/PhutilInvisibleSyntaxHighlighter.php', + 'PhutilJIRAAuthAdapter' => 'applications/auth/adapter/PhutilJIRAAuthAdapter.php', + 'PhutilJSONFragmentLexerHighlighterTestCase' => 'infrastructure/markup/syntax/highlighter/__tests__/PhutilJSONFragmentLexerHighlighterTestCase.php', + 'PhutilJavaCodeSnippetContextFreeGrammar' => 'infrastructure/lipsum/code/PhutilJavaCodeSnippetContextFreeGrammar.php', + 'PhutilKeyValueCache' => 'infrastructure/cache/PhutilKeyValueCache.php', + 'PhutilKeyValueCacheNamespace' => 'infrastructure/cache/PhutilKeyValueCacheNamespace.php', + 'PhutilKeyValueCacheProfiler' => 'infrastructure/cache/PhutilKeyValueCacheProfiler.php', + 'PhutilKeyValueCacheProxy' => 'infrastructure/cache/PhutilKeyValueCacheProxy.php', + 'PhutilKeyValueCacheStack' => 'infrastructure/cache/PhutilKeyValueCacheStack.php', + 'PhutilKeyValueCacheTestCase' => 'infrastructure/cache/__tests__/PhutilKeyValueCacheTestCase.php', + 'PhutilLDAPAuthAdapter' => 'applications/auth/adapter/PhutilLDAPAuthAdapter.php', + 'PhutilLexerSyntaxHighlighter' => 'infrastructure/markup/syntax/highlighter/PhutilLexerSyntaxHighlighter.php', + 'PhutilLipsumContextFreeGrammar' => 'infrastructure/lipsum/PhutilLipsumContextFreeGrammar.php', + 'PhutilMarkupEngine' => 'infrastructure/markup/PhutilMarkupEngine.php', + 'PhutilMarkupTestCase' => 'infrastructure/markup/__tests__/PhutilMarkupTestCase.php', + 'PhutilMemcacheKeyValueCache' => 'infrastructure/cache/PhutilMemcacheKeyValueCache.php', + 'PhutilOAuth1AuthAdapter' => 'applications/auth/adapter/PhutilOAuth1AuthAdapter.php', + 'PhutilOAuthAuthAdapter' => 'applications/auth/adapter/PhutilOAuthAuthAdapter.php', + 'PhutilOnDiskKeyValueCache' => 'infrastructure/cache/PhutilOnDiskKeyValueCache.php', + 'PhutilPHPCodeSnippetContextFreeGrammar' => 'infrastructure/lipsum/code/PhutilPHPCodeSnippetContextFreeGrammar.php', + 'PhutilPHPFragmentLexerHighlighterTestCase' => 'infrastructure/markup/syntax/highlighter/__tests__/PhutilPHPFragmentLexerHighlighterTestCase.php', + 'PhutilPhabricatorAuthAdapter' => 'applications/auth/adapter/PhutilPhabricatorAuthAdapter.php', + 'PhutilProseDiff' => 'infrastructure/diff/prose/PhutilProseDiff.php', + 'PhutilProseDiffTestCase' => 'infrastructure/diff/prose/__tests__/PhutilProseDiffTestCase.php', + 'PhutilProseDifferenceEngine' => 'infrastructure/diff/prose/PhutilProseDifferenceEngine.php', + 'PhutilPygmentizeParser' => 'infrastructure/parser/PhutilPygmentizeParser.php', + 'PhutilPygmentizeParserTestCase' => 'infrastructure/parser/__tests__/PhutilPygmentizeParserTestCase.php', + 'PhutilPygmentsSyntaxHighlighter' => 'infrastructure/markup/syntax/highlighter/PhutilPygmentsSyntaxHighlighter.php', + 'PhutilQsprintfInterface' => 'infrastructure/storage/xsprintf/PhutilQsprintfInterface.php', + 'PhutilQueryString' => 'infrastructure/storage/xsprintf/PhutilQueryString.php', + 'PhutilRainbowSyntaxHighlighter' => 'infrastructure/markup/syntax/highlighter/PhutilRainbowSyntaxHighlighter.php', + 'PhutilRealNameContextFreeGrammar' => 'infrastructure/lipsum/PhutilRealNameContextFreeGrammar.php', + 'PhutilRemarkupAnchorRule' => 'infrastructure/markup/markuprule/PhutilRemarkupAnchorRule.php', + 'PhutilRemarkupBlockInterpreter' => 'infrastructure/markup/blockrule/PhutilRemarkupBlockInterpreter.php', + 'PhutilRemarkupBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupBlockRule.php', + 'PhutilRemarkupBlockStorage' => 'infrastructure/markup/PhutilRemarkupBlockStorage.php', + 'PhutilRemarkupBoldRule' => 'infrastructure/markup/markuprule/PhutilRemarkupBoldRule.php', + 'PhutilRemarkupCodeBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupCodeBlockRule.php', + 'PhutilRemarkupDefaultBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupDefaultBlockRule.php', + 'PhutilRemarkupDelRule' => 'infrastructure/markup/markuprule/PhutilRemarkupDelRule.php', + 'PhutilRemarkupDocumentLinkRule' => 'infrastructure/markup/markuprule/PhutilRemarkupDocumentLinkRule.php', + 'PhutilRemarkupEngine' => 'infrastructure/markup/remarkup/PhutilRemarkupEngine.php', + 'PhutilRemarkupEngineTestCase' => 'infrastructure/markup/remarkup/__tests__/PhutilRemarkupEngineTestCase.php', + 'PhutilRemarkupEscapeRemarkupRule' => 'infrastructure/markup/markuprule/PhutilRemarkupEscapeRemarkupRule.php', + 'PhutilRemarkupEvalRule' => 'infrastructure/markup/markuprule/PhutilRemarkupEvalRule.php', + 'PhutilRemarkupHeaderBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupHeaderBlockRule.php', + 'PhutilRemarkupHighlightRule' => 'infrastructure/markup/markuprule/PhutilRemarkupHighlightRule.php', + 'PhutilRemarkupHorizontalRuleBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupHorizontalRuleBlockRule.php', + 'PhutilRemarkupHyperlinkEngineExtension' => 'infrastructure/markup/markuprule/PhutilRemarkupHyperlinkEngineExtension.php', + 'PhutilRemarkupHyperlinkRef' => 'infrastructure/markup/markuprule/PhutilRemarkupHyperlinkRef.php', + 'PhutilRemarkupHyperlinkRule' => 'infrastructure/markup/markuprule/PhutilRemarkupHyperlinkRule.php', + 'PhutilRemarkupInlineBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupInlineBlockRule.php', + 'PhutilRemarkupInterpreterBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupInterpreterBlockRule.php', + 'PhutilRemarkupItalicRule' => 'infrastructure/markup/markuprule/PhutilRemarkupItalicRule.php', + 'PhutilRemarkupLinebreaksRule' => 'infrastructure/markup/markuprule/PhutilRemarkupLinebreaksRule.php', + 'PhutilRemarkupListBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupListBlockRule.php', + 'PhutilRemarkupLiteralBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupLiteralBlockRule.php', + 'PhutilRemarkupMonospaceRule' => 'infrastructure/markup/markuprule/PhutilRemarkupMonospaceRule.php', + 'PhutilRemarkupNoteBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupNoteBlockRule.php', + 'PhutilRemarkupQuotedBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupQuotedBlockRule.php', + 'PhutilRemarkupQuotesBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupQuotesBlockRule.php', + 'PhutilRemarkupReplyBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupReplyBlockRule.php', + 'PhutilRemarkupRule' => 'infrastructure/markup/markuprule/PhutilRemarkupRule.php', + 'PhutilRemarkupSimpleTableBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupSimpleTableBlockRule.php', + 'PhutilRemarkupTableBlockRule' => 'infrastructure/markup/blockrule/PhutilRemarkupTableBlockRule.php', + 'PhutilRemarkupTestInterpreterRule' => 'infrastructure/markup/blockrule/PhutilRemarkupTestInterpreterRule.php', + 'PhutilRemarkupUnderlineRule' => 'infrastructure/markup/markuprule/PhutilRemarkupUnderlineRule.php', + 'PhutilSafeHTML' => 'infrastructure/markup/PhutilSafeHTML.php', + 'PhutilSafeHTMLProducerInterface' => 'infrastructure/markup/PhutilSafeHTMLProducerInterface.php', + 'PhutilSafeHTMLTestCase' => 'infrastructure/markup/__tests__/PhutilSafeHTMLTestCase.php', + 'PhutilSearchQueryCompiler' => 'applications/search/compiler/PhutilSearchQueryCompiler.php', + 'PhutilSearchQueryCompilerSyntaxException' => 'applications/search/compiler/PhutilSearchQueryCompilerSyntaxException.php', + 'PhutilSearchQueryCompilerTestCase' => 'applications/search/compiler/__tests__/PhutilSearchQueryCompilerTestCase.php', + 'PhutilSearchQueryToken' => 'applications/search/compiler/PhutilSearchQueryToken.php', + 'PhutilSearchStemmer' => 'applications/search/compiler/PhutilSearchStemmer.php', + 'PhutilSearchStemmerTestCase' => 'applications/search/compiler/__tests__/PhutilSearchStemmerTestCase.php', + 'PhutilSlackAuthAdapter' => 'applications/auth/adapter/PhutilSlackAuthAdapter.php', + 'PhutilSprite' => 'aphront/sprite/PhutilSprite.php', + 'PhutilSpriteSheet' => 'aphront/sprite/PhutilSpriteSheet.php', + 'PhutilSyntaxHighlighter' => 'infrastructure/markup/syntax/highlighter/PhutilSyntaxHighlighter.php', + 'PhutilSyntaxHighlighterEngine' => 'infrastructure/markup/syntax/engine/PhutilSyntaxHighlighterEngine.php', + 'PhutilSyntaxHighlighterException' => 'infrastructure/markup/syntax/highlighter/PhutilSyntaxHighlighterException.php', + 'PhutilTranslatedHTMLTestCase' => 'infrastructure/markup/__tests__/PhutilTranslatedHTMLTestCase.php', + 'PhutilTwitchAuthAdapter' => 'applications/auth/adapter/PhutilTwitchAuthAdapter.php', + 'PhutilTwitterAuthAdapter' => 'applications/auth/adapter/PhutilTwitterAuthAdapter.php', + 'PhutilWordPressAuthAdapter' => 'applications/auth/adapter/PhutilWordPressAuthAdapter.php', + 'PhutilXHPASTSyntaxHighlighter' => 'infrastructure/markup/syntax/highlighter/PhutilXHPASTSyntaxHighlighter.php', + 'PhutilXHPASTSyntaxHighlighterFuture' => 'infrastructure/markup/syntax/highlighter/xhpast/PhutilXHPASTSyntaxHighlighterFuture.php', + 'PhutilXHPASTSyntaxHighlighterTestCase' => 'infrastructure/markup/syntax/highlighter/__tests__/PhutilXHPASTSyntaxHighlighterTestCase.php', + 'PolicyLockOptionType' => 'applications/policy/config/PolicyLockOptionType.php', 'PonderAddAnswerView' => 'applications/ponder/view/PonderAddAnswerView.php', 'PonderAnswer' => 'applications/ponder/storage/PonderAnswer.php', 'PonderAnswerCommentController' => 'applications/ponder/controller/PonderAnswerCommentController.php', + 'PonderAnswerContentTransaction' => 'applications/ponder/xaction/PonderAnswerContentTransaction.php', 'PonderAnswerEditController' => 'applications/ponder/controller/PonderAnswerEditController.php', 'PonderAnswerEditor' => 'applications/ponder/editor/PonderAnswerEditor.php', 'PonderAnswerHistoryController' => 'applications/ponder/controller/PonderAnswerHistoryController.php', + 'PonderAnswerMailReceiver' => 'applications/ponder/mail/PonderAnswerMailReceiver.php', + 'PonderAnswerPHIDType' => 'applications/ponder/phid/PonderAnswerPHIDType.php', 'PonderAnswerQuery' => 'applications/ponder/query/PonderAnswerQuery.php', + 'PonderAnswerQuestionIDTransaction' => 'applications/ponder/xaction/PonderAnswerQuestionIDTransaction.php', + 'PonderAnswerReplyHandler' => 'applications/ponder/mail/PonderAnswerReplyHandler.php', 'PonderAnswerSaveController' => 'applications/ponder/controller/PonderAnswerSaveController.php', + 'PonderAnswerStatus' => 'applications/ponder/constants/PonderAnswerStatus.php', + 'PonderAnswerStatusTransaction' => 'applications/ponder/xaction/PonderAnswerStatusTransaction.php', 'PonderAnswerTransaction' => 'applications/ponder/storage/PonderAnswerTransaction.php', 'PonderAnswerTransactionComment' => 'applications/ponder/storage/PonderAnswerTransactionComment.php', 'PonderAnswerTransactionQuery' => 'applications/ponder/query/PonderAnswerTransactionQuery.php', - 'PonderAnswerViewController' => 'applications/ponder/controller/PonderAnswerViewController.php', - 'PonderComment' => 'applications/ponder/storage/PonderComment.php', - 'PonderCommentQuery' => 'applications/ponder/query/PonderCommentQuery.php', + 'PonderAnswerTransactionType' => 'applications/ponder/xaction/PonderAnswerTransactionType.php', + 'PonderAnswerView' => 'applications/ponder/view/PonderAnswerView.php', 'PonderConstants' => 'applications/ponder/constants/PonderConstants.php', 'PonderController' => 'applications/ponder/controller/PonderController.php', 'PonderDAO' => 'applications/ponder/storage/PonderDAO.php', - 'PonderPHIDTypeAnswer' => 'applications/ponder/phid/PonderPHIDTypeAnswer.php', - 'PonderPHIDTypeQuestion' => 'applications/ponder/phid/PonderPHIDTypeQuestion.php', + 'PonderDefaultViewCapability' => 'applications/ponder/capability/PonderDefaultViewCapability.php', + 'PonderEditor' => 'applications/ponder/editor/PonderEditor.php', + 'PonderFooterView' => 'applications/ponder/view/PonderFooterView.php', + 'PonderModerateCapability' => 'applications/ponder/capability/PonderModerateCapability.php', 'PonderQuestion' => 'applications/ponder/storage/PonderQuestion.php', + 'PonderQuestionAnswerTransaction' => 'applications/ponder/xaction/PonderQuestionAnswerTransaction.php', + 'PonderQuestionAnswerWikiTransaction' => 'applications/ponder/xaction/PonderQuestionAnswerWikiTransaction.php', 'PonderQuestionCommentController' => 'applications/ponder/controller/PonderQuestionCommentController.php', + 'PonderQuestionContentTransaction' => 'applications/ponder/xaction/PonderQuestionContentTransaction.php', + 'PonderQuestionCreateMailReceiver' => 'applications/ponder/mail/PonderQuestionCreateMailReceiver.php', 'PonderQuestionEditController' => 'applications/ponder/controller/PonderQuestionEditController.php', + 'PonderQuestionEditEngine' => 'applications/ponder/editor/PonderQuestionEditEngine.php', 'PonderQuestionEditor' => 'applications/ponder/editor/PonderQuestionEditor.php', + 'PonderQuestionFerretEngine' => 'applications/ponder/search/PonderQuestionFerretEngine.php', + 'PonderQuestionFulltextEngine' => 'applications/ponder/search/PonderQuestionFulltextEngine.php', 'PonderQuestionHistoryController' => 'applications/ponder/controller/PonderQuestionHistoryController.php', 'PonderQuestionListController' => 'applications/ponder/controller/PonderQuestionListController.php', 'PonderQuestionMailReceiver' => 'applications/ponder/mail/PonderQuestionMailReceiver.php', + 'PonderQuestionPHIDType' => 'applications/ponder/phid/PonderQuestionPHIDType.php', 'PonderQuestionQuery' => 'applications/ponder/query/PonderQuestionQuery.php', 'PonderQuestionReplyHandler' => 'applications/ponder/mail/PonderQuestionReplyHandler.php', 'PonderQuestionSearchEngine' => 'applications/ponder/query/PonderQuestionSearchEngine.php', 'PonderQuestionStatus' => 'applications/ponder/constants/PonderQuestionStatus.php', 'PonderQuestionStatusController' => 'applications/ponder/controller/PonderQuestionStatusController.php', + 'PonderQuestionStatusTransaction' => 'applications/ponder/xaction/PonderQuestionStatusTransaction.php', + 'PonderQuestionTitleTransaction' => 'applications/ponder/xaction/PonderQuestionTitleTransaction.php', 'PonderQuestionTransaction' => 'applications/ponder/storage/PonderQuestionTransaction.php', 'PonderQuestionTransactionComment' => 'applications/ponder/storage/PonderQuestionTransactionComment.php', 'PonderQuestionTransactionQuery' => 'applications/ponder/query/PonderQuestionTransactionQuery.php', + 'PonderQuestionTransactionType' => 'applications/ponder/xaction/PonderQuestionTransactionType.php', 'PonderQuestionViewController' => 'applications/ponder/controller/PonderQuestionViewController.php', 'PonderRemarkupRule' => 'applications/ponder/remarkup/PonderRemarkupRule.php', - 'PonderSearchIndexer' => 'applications/ponder/search/PonderSearchIndexer.php', - 'PonderVotableInterface' => 'applications/ponder/storage/PonderVotableInterface.php', - 'PonderVotableView' => 'applications/ponder/view/PonderVotableView.php', - 'PonderVote' => 'applications/ponder/constants/PonderVote.php', - 'PonderVoteEditor' => 'applications/ponder/editor/PonderVoteEditor.php', - 'PonderVoteSaveController' => 'applications/ponder/controller/PonderVoteSaveController.php', + 'PonderSchemaSpec' => 'applications/ponder/storage/PonderSchemaSpec.php', + 'ProjectAddProjectsEmailCommand' => 'applications/project/command/ProjectAddProjectsEmailCommand.php', + 'ProjectBoardTaskCard' => 'applications/project/view/ProjectBoardTaskCard.php', + 'ProjectCanLockProjectsCapability' => 'applications/project/capability/ProjectCanLockProjectsCapability.php', + 'ProjectColumnSearchConduitAPIMethod' => 'applications/project/conduit/ProjectColumnSearchConduitAPIMethod.php', + 'ProjectConduitAPIMethod' => 'applications/project/conduit/ProjectConduitAPIMethod.php', + 'ProjectCreateConduitAPIMethod' => 'applications/project/conduit/ProjectCreateConduitAPIMethod.php', + 'ProjectCreateProjectsCapability' => 'applications/project/capability/ProjectCreateProjectsCapability.php', + 'ProjectDatasourceEngineExtension' => 'applications/project/engineextension/ProjectDatasourceEngineExtension.php', + 'ProjectDefaultEditCapability' => 'applications/project/capability/ProjectDefaultEditCapability.php', + 'ProjectDefaultJoinCapability' => 'applications/project/capability/ProjectDefaultJoinCapability.php', + 'ProjectDefaultViewCapability' => 'applications/project/capability/ProjectDefaultViewCapability.php', + 'ProjectEditConduitAPIMethod' => 'applications/project/conduit/ProjectEditConduitAPIMethod.php', + 'ProjectQueryConduitAPIMethod' => 'applications/project/conduit/ProjectQueryConduitAPIMethod.php', 'ProjectRemarkupRule' => 'applications/project/remarkup/ProjectRemarkupRule.php', + 'ProjectRemarkupRuleTestCase' => 'applications/project/remarkup/__tests__/ProjectRemarkupRuleTestCase.php', + 'ProjectReplyHandler' => 'applications/project/mail/ProjectReplyHandler.php', + 'ProjectSearchConduitAPIMethod' => 'applications/project/conduit/ProjectSearchConduitAPIMethod.php', 'QueryFormattingTestCase' => 'infrastructure/storage/__tests__/QueryFormattingTestCase.php', - 'ReleephAuthorFieldSpecification' => 'applications/releeph/field/specification/ReleephAuthorFieldSpecification.php', - 'ReleephBranch' => 'applications/releeph/storage/ReleephBranch.php', - 'ReleephBranchAccessController' => 'applications/releeph/controller/branch/ReleephBranchAccessController.php', - 'ReleephBranchBoxView' => 'applications/releeph/view/branch/ReleephBranchBoxView.php', - 'ReleephBranchCommitFieldSpecification' => 'applications/releeph/field/specification/ReleephBranchCommitFieldSpecification.php', - 'ReleephBranchCreateController' => 'applications/releeph/controller/branch/ReleephBranchCreateController.php', - 'ReleephBranchEditController' => 'applications/releeph/controller/branch/ReleephBranchEditController.php', - 'ReleephBranchEditor' => 'applications/releeph/editor/ReleephBranchEditor.php', - 'ReleephBranchNamePreviewController' => 'applications/releeph/controller/branch/ReleephBranchNamePreviewController.php', - 'ReleephBranchPreviewView' => 'applications/releeph/view/branch/ReleephBranchPreviewView.php', - 'ReleephBranchQuery' => 'applications/releeph/query/ReleephBranchQuery.php', - 'ReleephBranchTemplate' => 'applications/releeph/view/branch/ReleephBranchTemplate.php', - 'ReleephBranchViewController' => 'applications/releeph/controller/branch/ReleephBranchViewController.php', - 'ReleephCommitFinder' => 'applications/releeph/commitfinder/ReleephCommitFinder.php', - 'ReleephCommitFinderException' => 'applications/releeph/commitfinder/ReleephCommitFinderException.php', - 'ReleephCommitMessageFieldSpecification' => 'applications/releeph/field/specification/ReleephCommitMessageFieldSpecification.php', - 'ReleephController' => 'applications/releeph/controller/ReleephController.php', - 'ReleephDAO' => 'applications/releeph/storage/ReleephDAO.php', - 'ReleephDefaultFieldSelector' => 'applications/releeph/field/selector/ReleephDefaultFieldSelector.php', - 'ReleephDefaultUserView' => 'applications/releeph/view/user/ReleephDefaultUserView.php', - 'ReleephDiffChurnFieldSpecification' => 'applications/releeph/field/specification/ReleephDiffChurnFieldSpecification.php', - 'ReleephDiffMessageFieldSpecification' => 'applications/releeph/field/specification/ReleephDiffMessageFieldSpecification.php', - 'ReleephDiffSizeFieldSpecification' => 'applications/releeph/field/specification/ReleephDiffSizeFieldSpecification.php', - 'ReleephDifferentialRevisionDetailRenderer' => 'applications/releeph/differential/ReleephDifferentialRevisionDetailRenderer.php', - 'ReleephEvent' => 'applications/releeph/storage/event/ReleephEvent.php', - 'ReleephFieldParseException' => 'applications/releeph/field/exception/ReleephFieldParseException.php', - 'ReleephFieldSelector' => 'applications/releeph/field/selector/ReleephFieldSelector.php', - 'ReleephFieldSpecification' => 'applications/releeph/field/specification/ReleephFieldSpecification.php', - 'ReleephFieldSpecificationIncompleteException' => 'applications/releeph/field/exception/ReleephFieldSpecificationIncompleteException.php', - 'ReleephIntentFieldSpecification' => 'applications/releeph/field/specification/ReleephIntentFieldSpecification.php', - 'ReleephLevelFieldSpecification' => 'applications/releeph/field/specification/ReleephLevelFieldSpecification.php', - 'ReleephOriginalCommitFieldSpecification' => 'applications/releeph/field/specification/ReleephOriginalCommitFieldSpecification.php', - 'ReleephPHIDConstants' => 'applications/releeph/ReleephPHIDConstants.php', - 'ReleephPHIDTypeBranch' => 'applications/releeph/phid/ReleephPHIDTypeBranch.php', - 'ReleephPHIDTypeProject' => 'applications/releeph/phid/ReleephPHIDTypeProject.php', - 'ReleephPHIDTypeRequest' => 'applications/releeph/phid/ReleephPHIDTypeRequest.php', - 'ReleephProject' => 'applications/releeph/storage/ReleephProject.php', - 'ReleephProjectActionController' => 'applications/releeph/controller/project/ReleephProjectActionController.php', - 'ReleephProjectController' => 'applications/releeph/controller/ReleephProjectController.php', - 'ReleephProjectCreateController' => 'applications/releeph/controller/project/ReleephProjectCreateController.php', - 'ReleephProjectEditController' => 'applications/releeph/controller/project/ReleephProjectEditController.php', - 'ReleephProjectListController' => 'applications/releeph/controller/project/ReleephProjectListController.php', - 'ReleephProjectQuery' => 'applications/releeph/query/ReleephProjectQuery.php', - 'ReleephProjectSearchEngine' => 'applications/releeph/query/ReleephProjectSearchEngine.php', - 'ReleephProjectView' => 'applications/releeph/view/ReleephProjectView.php', - 'ReleephProjectViewController' => 'applications/releeph/controller/project/ReleephProjectViewController.php', - 'ReleephReasonFieldSpecification' => 'applications/releeph/field/specification/ReleephReasonFieldSpecification.php', - 'ReleephRequest' => 'applications/releeph/storage/ReleephRequest.php', - 'ReleephRequestActionController' => 'applications/releeph/controller/request/ReleephRequestActionController.php', - 'ReleephRequestCommentController' => 'applications/releeph/controller/request/ReleephRequestCommentController.php', - 'ReleephRequestDifferentialCreateController' => 'applications/releeph/controller/request/ReleephRequestDifferentialCreateController.php', - 'ReleephRequestEditController' => 'applications/releeph/controller/request/ReleephRequestEditController.php', - 'ReleephRequestEvent' => 'applications/releeph/storage/request/ReleephRequestEvent.php', - 'ReleephRequestException' => 'applications/releeph/storage/request/exception/ReleephRequestException.php', - 'ReleephRequestHeaderListView' => 'applications/releeph/view/request/header/ReleephRequestHeaderListView.php', - 'ReleephRequestHeaderView' => 'applications/releeph/view/request/header/ReleephRequestHeaderView.php', - 'ReleephRequestIntentsView' => 'applications/releeph/view/request/ReleephRequestIntentsView.php', - 'ReleephRequestMailReceiver' => 'applications/releeph/mail/ReleephRequestMailReceiver.php', - 'ReleephRequestQuery' => 'applications/releeph/query/ReleephRequestQuery.php', - 'ReleephRequestReplyHandler' => 'applications/releeph/mail/ReleephRequestReplyHandler.php', - 'ReleephRequestStatus' => 'applications/releeph/constants/ReleephRequestStatus.php', - 'ReleephRequestStatusView' => 'applications/releeph/view/request/ReleephRequestStatusView.php', - 'ReleephRequestTransaction' => 'applications/releeph/storage/ReleephRequestTransaction.php', - 'ReleephRequestTransactionComment' => 'applications/releeph/storage/ReleephRequestTransactionComment.php', - 'ReleephRequestTransactionQuery' => 'applications/releeph/query/ReleephRequestTransactionQuery.php', - 'ReleephRequestTransactionalEditor' => 'applications/releeph/editor/ReleephRequestTransactionalEditor.php', - 'ReleephRequestTypeaheadControl' => 'applications/releeph/view/request/ReleephRequestTypeaheadControl.php', - 'ReleephRequestTypeaheadController' => 'applications/releeph/controller/request/ReleephRequestTypeaheadController.php', - 'ReleephRequestViewController' => 'applications/releeph/controller/request/ReleephRequestViewController.php', - 'ReleephRequestorFieldSpecification' => 'applications/releeph/field/specification/ReleephRequestorFieldSpecification.php', - 'ReleephRevisionFieldSpecification' => 'applications/releeph/field/specification/ReleephRevisionFieldSpecification.php', - 'ReleephRiskFieldSpecification' => 'applications/releeph/field/specification/ReleephRiskFieldSpecification.php', - 'ReleephSeverityFieldSpecification' => 'applications/releeph/field/specification/ReleephSeverityFieldSpecification.php', - 'ReleephStatusFieldSpecification' => 'applications/releeph/field/specification/ReleephStatusFieldSpecification.php', - 'ReleephSummaryFieldSpecification' => 'applications/releeph/field/specification/ReleephSummaryFieldSpecification.php', - 'ReleephUserView' => 'applications/releeph/view/user/ReleephUserView.php', + 'QueryFuture' => 'infrastructure/storage/future/QueryFuture.php', + 'RemarkupProcessConduitAPIMethod' => 'applications/remarkup/conduit/RemarkupProcessConduitAPIMethod.php', + 'RemarkupValue' => 'applications/remarkup/RemarkupValue.php', + 'RepositoryConduitAPIMethod' => 'applications/repository/conduit/RepositoryConduitAPIMethod.php', + 'RepositoryQueryConduitAPIMethod' => 'applications/repository/conduit/RepositoryQueryConduitAPIMethod.php', + 'ShellLogView' => 'applications/harbormaster/view/ShellLogView.php', + 'SlowvoteConduitAPIMethod' => 'applications/slowvote/conduit/SlowvoteConduitAPIMethod.php', 'SlowvoteEmbedView' => 'applications/slowvote/view/SlowvoteEmbedView.php', + 'SlowvoteInfoConduitAPIMethod' => 'applications/slowvote/conduit/SlowvoteInfoConduitAPIMethod.php', + 'SlowvotePollResponseVisibility' => 'applications/slowvote/constants/SlowvotePollResponseVisibility.php', + 'SlowvotePollStatus' => 'applications/slowvote/constants/SlowvotePollStatus.php', + 'SlowvotePollVotingMethod' => 'applications/slowvote/constants/SlowvotePollVotingMethod.php', 'SlowvoteRemarkupRule' => 'applications/slowvote/remarkup/SlowvoteRemarkupRule.php', + 'SlowvoteSearchConduitAPIMethod' => 'applications/slowvote/conduit/SlowvoteSearchConduitAPIMethod.php', + 'SubscriptionListDialogBuilder' => 'applications/subscriptions/view/SubscriptionListDialogBuilder.php', + 'SubscriptionListStringBuilder' => 'applications/subscriptions/view/SubscriptionListStringBuilder.php', + 'TokenConduitAPIMethod' => 'applications/tokens/conduit/TokenConduitAPIMethod.php', + 'TokenGiveConduitAPIMethod' => 'applications/tokens/conduit/TokenGiveConduitAPIMethod.php', + 'TokenGivenConduitAPIMethod' => 'applications/tokens/conduit/TokenGivenConduitAPIMethod.php', + 'TokenQueryConduitAPIMethod' => 'applications/tokens/conduit/TokenQueryConduitAPIMethod.php', + 'TransactionSearchConduitAPIMethod' => 'applications/transactions/conduit/TransactionSearchConduitAPIMethod.php', + 'UserConduitAPIMethod' => 'applications/people/conduit/UserConduitAPIMethod.php', + 'UserDisableConduitAPIMethod' => 'applications/people/conduit/UserDisableConduitAPIMethod.php', + 'UserEditConduitAPIMethod' => 'applications/people/conduit/UserEditConduitAPIMethod.php', + 'UserEnableConduitAPIMethod' => 'applications/people/conduit/UserEnableConduitAPIMethod.php', + 'UserFindConduitAPIMethod' => 'applications/people/conduit/UserFindConduitAPIMethod.php', + 'UserQueryConduitAPIMethod' => 'applications/people/conduit/UserQueryConduitAPIMethod.php', + 'UserSearchConduitAPIMethod' => 'applications/people/conduit/UserSearchConduitAPIMethod.php', + 'UserWhoAmIConduitAPIMethod' => 'applications/people/conduit/UserWhoAmIConduitAPIMethod.php', ), - 'function' => - array( - '_phabricator_date_format' => 'view/viewutils.php', - 'celerity_generate_unique_node_id' => 'infrastructure/celerity/api.php', - 'celerity_get_resource_uri' => 'infrastructure/celerity/api.php', - 'celerity_register_resource_map' => 'infrastructure/celerity/map.php', - 'implode_selected_handle_links' => 'applications/phid/handle/view/render.php', + 'function' => array( + 'celerity_generate_unique_node_id' => 'applications/celerity/api.php', + 'celerity_get_resource_uri' => 'applications/celerity/api.php', + 'hsprintf' => 'infrastructure/markup/render.php', 'javelin_tag' => 'infrastructure/javelin/markup.php', + 'phabricator_absolute_datetime' => 'view/viewutils.php', 'phabricator_date' => 'view/viewutils.php', 'phabricator_datetime' => 'view/viewutils.php', + 'phabricator_datetimezone' => 'view/viewutils.php', + 'phabricator_dual_datetime' => 'view/viewutils.php', 'phabricator_form' => 'infrastructure/javelin/markup.php', - 'phabricator_format_bytes' => 'view/viewutils.php', 'phabricator_format_local_time' => 'view/viewutils.php', - 'phabricator_format_relative_time' => 'view/viewutils.php', - 'phabricator_format_relative_time_detailed' => 'view/viewutils.php', - 'phabricator_format_units_generic' => 'view/viewutils.php', - 'phabricator_on_relative_date' => 'view/viewutils.php', - 'phabricator_parse_bytes' => 'view/viewutils.php', 'phabricator_relative_date' => 'view/viewutils.php', 'phabricator_time' => 'view/viewutils.php', 'phid_get_subtype' => 'applications/phid/utils.php', 'phid_get_type' => 'applications/phid/utils.php', 'phid_group_by_type' => 'applications/phid/utils.php', - 'require_celerity_resource' => 'infrastructure/celerity/api.php', + 'phutil_escape_html' => 'infrastructure/markup/render.php', + 'phutil_escape_html_newlines' => 'infrastructure/markup/render.php', + 'phutil_implode_html' => 'infrastructure/markup/render.php', + 'phutil_safe_html' => 'infrastructure/markup/render.php', + 'phutil_tag' => 'infrastructure/markup/render.php', + 'phutil_tag_div' => 'infrastructure/markup/render.php', + 'qsprintf' => 'infrastructure/storage/xsprintf/qsprintf.php', + 'qsprintf_check_scalar_type' => 'infrastructure/storage/xsprintf/qsprintf.php', + 'qsprintf_check_type' => 'infrastructure/storage/xsprintf/qsprintf.php', + 'queryfx' => 'infrastructure/storage/xsprintf/queryfx.php', + 'queryfx_all' => 'infrastructure/storage/xsprintf/queryfx.php', + 'queryfx_one' => 'infrastructure/storage/xsprintf/queryfx.php', + 'require_celerity_resource' => 'applications/celerity/api.php', + 'vqsprintf' => 'infrastructure/storage/xsprintf/qsprintf.php', + 'xsprintf_query' => 'infrastructure/storage/xsprintf/qsprintf.php', ), - 'xmap' => - array( + 'xmap' => array( + 'AlmanacAddress' => 'Phobject', + 'AlmanacBinding' => array( + 'AlmanacDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'AlmanacPropertyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorExtendedPolicyInterface', + 'PhabricatorConduitResultInterface', + ), + 'AlmanacBindingDeletePropertyTransaction' => 'AlmanacBindingTransactionType', + 'AlmanacBindingDisableController' => 'AlmanacServiceController', + 'AlmanacBindingDisableTransaction' => 'AlmanacBindingTransactionType', + 'AlmanacBindingEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'AlmanacBindingEditController' => 'AlmanacServiceController', + 'AlmanacBindingEditEngine' => 'PhabricatorEditEngine', + 'AlmanacBindingEditor' => 'AlmanacEditor', + 'AlmanacBindingInterfaceTransaction' => 'AlmanacBindingTransactionType', + 'AlmanacBindingPHIDType' => 'PhabricatorPHIDType', + 'AlmanacBindingPropertyEditEngine' => 'AlmanacPropertyEditEngine', + 'AlmanacBindingQuery' => 'AlmanacQuery', + 'AlmanacBindingSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'AlmanacBindingSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'AlmanacBindingServiceTransaction' => 'AlmanacBindingTransactionType', + 'AlmanacBindingSetPropertyTransaction' => 'AlmanacBindingTransactionType', + 'AlmanacBindingTableView' => 'AphrontView', + 'AlmanacBindingTransaction' => 'AlmanacModularTransaction', + 'AlmanacBindingTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'AlmanacBindingTransactionType' => 'AlmanacTransactionType', + 'AlmanacBindingViewController' => 'AlmanacServiceController', + 'AlmanacBindingsSearchEngineAttachment' => 'AlmanacSearchEngineAttachment', + 'AlmanacCacheEngineExtension' => 'PhabricatorCacheEngineExtension', + 'AlmanacClusterDatabaseServiceType' => 'AlmanacClusterServiceType', + 'AlmanacClusterRepositoryServiceType' => 'AlmanacClusterServiceType', + 'AlmanacClusterServiceType' => 'AlmanacServiceType', + 'AlmanacConsoleController' => 'AlmanacController', + 'AlmanacController' => 'PhabricatorController', + 'AlmanacCreateDevicesCapability' => 'PhabricatorPolicyCapability', + 'AlmanacCreateNamespacesCapability' => 'PhabricatorPolicyCapability', + 'AlmanacCreateNetworksCapability' => 'PhabricatorPolicyCapability', + 'AlmanacCreateServicesCapability' => 'PhabricatorPolicyCapability', + 'AlmanacCustomServiceType' => 'AlmanacServiceType', + 'AlmanacDAO' => 'PhabricatorLiskDAO', + 'AlmanacDeletePropertyEditField' => 'PhabricatorEditField', + 'AlmanacDeletePropertyEditType' => 'PhabricatorEditType', + 'AlmanacDevice' => array( + 'AlmanacDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorProjectInterface', + 'PhabricatorSSHPublicKeyInterface', + 'AlmanacPropertyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorNgramsInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorExtendedPolicyInterface', + ), + 'AlmanacDeviceController' => 'AlmanacController', + 'AlmanacDeviceDeletePropertyTransaction' => 'AlmanacDeviceTransactionType', + 'AlmanacDeviceEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'AlmanacDeviceEditController' => 'AlmanacDeviceController', + 'AlmanacDeviceEditEngine' => 'PhabricatorEditEngine', + 'AlmanacDeviceEditor' => 'AlmanacEditor', + 'AlmanacDeviceListController' => 'AlmanacDeviceController', + 'AlmanacDeviceNameNgrams' => 'PhabricatorSearchNgrams', + 'AlmanacDeviceNameTransaction' => 'AlmanacDeviceTransactionType', + 'AlmanacDevicePHIDType' => 'PhabricatorPHIDType', + 'AlmanacDevicePropertyEditEngine' => 'AlmanacPropertyEditEngine', + 'AlmanacDeviceQuery' => 'AlmanacQuery', + 'AlmanacDeviceSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'AlmanacDeviceSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'AlmanacDeviceSetPropertyTransaction' => 'AlmanacDeviceTransactionType', + 'AlmanacDeviceStatus' => 'Phobject', + 'AlmanacDeviceStatusTransaction' => 'AlmanacDeviceTransactionType', + 'AlmanacDeviceTransaction' => 'AlmanacModularTransaction', + 'AlmanacDeviceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'AlmanacDeviceTransactionType' => 'AlmanacTransactionType', + 'AlmanacDeviceViewController' => 'AlmanacDeviceController', + 'AlmanacDrydockPoolServiceType' => 'AlmanacServiceType', + 'AlmanacEditor' => 'PhabricatorApplicationTransactionEditor', + 'AlmanacInterface' => array( + 'AlmanacDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorExtendedPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorConduitResultInterface', + ), + 'AlmanacInterfaceAddressTransaction' => 'AlmanacInterfaceTransactionType', + 'AlmanacInterfaceDatasource' => 'PhabricatorTypeaheadDatasource', + 'AlmanacInterfaceDeleteController' => 'AlmanacDeviceController', + 'AlmanacInterfaceDestroyTransaction' => 'AlmanacInterfaceTransactionType', + 'AlmanacInterfaceDeviceTransaction' => 'AlmanacInterfaceTransactionType', + 'AlmanacInterfaceEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'AlmanacInterfaceEditController' => 'AlmanacDeviceController', + 'AlmanacInterfaceEditEngine' => 'PhabricatorEditEngine', + 'AlmanacInterfaceEditor' => 'AlmanacEditor', + 'AlmanacInterfaceNetworkTransaction' => 'AlmanacInterfaceTransactionType', + 'AlmanacInterfacePHIDType' => 'PhabricatorPHIDType', + 'AlmanacInterfacePortTransaction' => 'AlmanacInterfaceTransactionType', + 'AlmanacInterfaceQuery' => 'AlmanacQuery', + 'AlmanacInterfaceSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'AlmanacInterfaceSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'AlmanacInterfaceTableView' => 'AphrontView', + 'AlmanacInterfaceTransaction' => 'AlmanacModularTransaction', + 'AlmanacInterfaceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'AlmanacInterfaceTransactionType' => 'AlmanacTransactionType', + 'AlmanacKeys' => 'Phobject', + 'AlmanacManageClusterServicesCapability' => 'PhabricatorPolicyCapability', + 'AlmanacManagementRegisterWorkflow' => 'AlmanacManagementWorkflow', + 'AlmanacManagementTrustKeyWorkflow' => 'AlmanacManagementWorkflow', + 'AlmanacManagementUntrustKeyWorkflow' => 'AlmanacManagementWorkflow', + 'AlmanacManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'AlmanacModularTransaction' => 'PhabricatorModularTransaction', + 'AlmanacNames' => 'Phobject', + 'AlmanacNamesTestCase' => 'PhabricatorTestCase', + 'AlmanacNamespace' => array( + 'AlmanacDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorProjectInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorNgramsInterface', + 'PhabricatorConduitResultInterface', + ), + 'AlmanacNamespaceController' => 'AlmanacController', + 'AlmanacNamespaceEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'AlmanacNamespaceEditController' => 'AlmanacNamespaceController', + 'AlmanacNamespaceEditEngine' => 'PhabricatorEditEngine', + 'AlmanacNamespaceEditor' => 'AlmanacEditor', + 'AlmanacNamespaceListController' => 'AlmanacNamespaceController', + 'AlmanacNamespaceNameNgrams' => 'PhabricatorSearchNgrams', + 'AlmanacNamespaceNameTransaction' => 'AlmanacNamespaceTransactionType', + 'AlmanacNamespacePHIDType' => 'PhabricatorPHIDType', + 'AlmanacNamespaceQuery' => 'AlmanacQuery', + 'AlmanacNamespaceSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'AlmanacNamespaceSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'AlmanacNamespaceTransaction' => 'AlmanacModularTransaction', + 'AlmanacNamespaceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'AlmanacNamespaceTransactionType' => 'AlmanacTransactionType', + 'AlmanacNamespaceViewController' => 'AlmanacNamespaceController', + 'AlmanacNetwork' => array( + 'AlmanacDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorNgramsInterface', + 'PhabricatorConduitResultInterface', + ), + 'AlmanacNetworkController' => 'AlmanacController', + 'AlmanacNetworkEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'AlmanacNetworkEditController' => 'AlmanacNetworkController', + 'AlmanacNetworkEditEngine' => 'PhabricatorEditEngine', + 'AlmanacNetworkEditor' => 'AlmanacEditor', + 'AlmanacNetworkListController' => 'AlmanacNetworkController', + 'AlmanacNetworkNameNgrams' => 'PhabricatorSearchNgrams', + 'AlmanacNetworkNameTransaction' => 'AlmanacNetworkTransactionType', + 'AlmanacNetworkPHIDType' => 'PhabricatorPHIDType', + 'AlmanacNetworkQuery' => 'AlmanacQuery', + 'AlmanacNetworkSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'AlmanacNetworkSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'AlmanacNetworkTransaction' => 'AlmanacModularTransaction', + 'AlmanacNetworkTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'AlmanacNetworkTransactionType' => 'AlmanacTransactionType', + 'AlmanacNetworkViewController' => 'AlmanacNetworkController', + 'AlmanacPropertiesDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', + 'AlmanacPropertiesEditEngineExtension' => 'PhabricatorEditEngineExtension', + 'AlmanacPropertiesSearchEngineAttachment' => 'AlmanacSearchEngineAttachment', + 'AlmanacProperty' => array( + 'AlmanacDAO', + 'PhabricatorPolicyInterface', + ), + 'AlmanacPropertyController' => 'AlmanacController', + 'AlmanacPropertyDeleteController' => 'AlmanacPropertyController', + 'AlmanacPropertyEditController' => 'AlmanacPropertyController', + 'AlmanacPropertyEditEngine' => 'PhabricatorEditEngine', + 'AlmanacPropertyQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'AlmanacQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'AlmanacSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'AlmanacSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'AlmanacService' => array( + 'AlmanacDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorProjectInterface', + 'AlmanacPropertyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorNgramsInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorExtendedPolicyInterface', + ), + 'AlmanacServiceController' => 'AlmanacController', + 'AlmanacServiceDatasource' => 'PhabricatorTypeaheadDatasource', + 'AlmanacServiceDeletePropertyTransaction' => 'AlmanacServiceTransactionType', + 'AlmanacServiceEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'AlmanacServiceEditController' => 'AlmanacServiceController', + 'AlmanacServiceEditEngine' => 'PhabricatorEditEngine', + 'AlmanacServiceEditor' => 'AlmanacEditor', + 'AlmanacServiceListController' => 'AlmanacServiceController', + 'AlmanacServiceNameNgrams' => 'PhabricatorSearchNgrams', + 'AlmanacServiceNameTransaction' => 'AlmanacServiceTransactionType', + 'AlmanacServicePHIDType' => 'PhabricatorPHIDType', + 'AlmanacServicePropertyEditEngine' => 'AlmanacPropertyEditEngine', + 'AlmanacServiceQuery' => 'AlmanacQuery', + 'AlmanacServiceSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'AlmanacServiceSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'AlmanacServiceSetPropertyTransaction' => 'AlmanacServiceTransactionType', + 'AlmanacServiceTransaction' => 'AlmanacModularTransaction', + 'AlmanacServiceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'AlmanacServiceTransactionType' => 'AlmanacTransactionType', + 'AlmanacServiceType' => 'Phobject', + 'AlmanacServiceTypeDatasource' => 'PhabricatorTypeaheadDatasource', + 'AlmanacServiceTypeTestCase' => 'PhabricatorTestCase', + 'AlmanacServiceTypeTransaction' => 'AlmanacServiceTransactionType', + 'AlmanacServiceViewController' => 'AlmanacServiceController', + 'AlmanacSetPropertyEditField' => 'PhabricatorEditField', + 'AlmanacSetPropertyEditType' => 'PhabricatorEditType', + 'AlmanacTransactionType' => 'PhabricatorModularTransactionType', + 'AphlictDropdownDataQuery' => 'Phobject', 'Aphront304Response' => 'AphrontResponse', 'Aphront400Response' => 'AphrontResponse', 'Aphront403Response' => 'AphrontHTMLResponse', 'Aphront404Response' => 'AphrontHTMLResponse', - 'AphrontAbstractAttachedFileView' => 'AphrontView', + 'AphrontAccessDeniedQueryException' => 'AphrontQueryException', 'AphrontAjaxResponse' => 'AphrontResponse', + 'AphrontApplicationConfiguration' => 'Phobject', + 'AphrontAutoIDView' => 'AphrontView', 'AphrontBarView' => 'AphrontView', - 'AphrontCSRFException' => 'AphrontException', + 'AphrontBaseMySQLDatabaseConnection' => 'AphrontDatabaseConnection', + 'AphrontBoolHTTPParameterType' => 'AphrontHTTPParameterType', 'AphrontCalendarEventView' => 'AphrontView', - 'AphrontCalendarMonthView' => 'AphrontView', - 'AphrontContextBarView' => 'AphrontView', + 'AphrontCharacterSetQueryException' => 'AphrontQueryException', + 'AphrontConnectionLostQueryException' => 'AphrontRecoverableQueryException', + 'AphrontConnectionQueryException' => 'AphrontQueryException', 'AphrontController' => 'Phobject', + 'AphrontCountQueryException' => 'AphrontQueryException', 'AphrontCursorPagerView' => 'AphrontView', - 'AphrontDefaultApplicationConfiguration' => 'AphrontApplicationConfiguration', + 'AphrontDatabaseConnection' => array( + 'Phobject', + 'PhutilQsprintfInterface', + ), + 'AphrontDatabaseTableRef' => array( + 'Phobject', + 'AphrontDatabaseTableRefInterface', + ), + 'AphrontDatabaseTransactionState' => 'Phobject', + 'AphrontDeadlockQueryException' => 'AphrontRecoverableQueryException', 'AphrontDialogResponse' => 'AphrontResponse', - 'AphrontDialogView' => 'AphrontView', - 'AphrontErrorView' => 'AphrontView', + 'AphrontDialogView' => array( + 'AphrontView', + 'AphrontResponseProducerInterface', + ), + 'AphrontDuplicateKeyQueryException' => 'AphrontQueryException', + 'AphrontEpochHTTPParameterType' => 'AphrontHTTPParameterType', 'AphrontException' => 'Exception', + 'AphrontFileHTTPParameterType' => 'AphrontHTTPParameterType', 'AphrontFileResponse' => 'AphrontResponse', 'AphrontFormCheckboxControl' => 'AphrontFormControl', 'AphrontFormControl' => 'AphrontView', - 'AphrontFormCountedToggleButtonsControl' => 'AphrontFormControl', - 'AphrontFormCropControl' => 'AphrontFormControl', 'AphrontFormDateControl' => 'AphrontFormControl', + 'AphrontFormDateControlValue' => 'Phobject', 'AphrontFormDividerControl' => 'AphrontFormControl', 'AphrontFormFileControl' => 'AphrontFormControl', - 'AphrontFormImageControl' => 'AphrontFormControl', - 'AphrontFormInsetView' => 'AphrontView', - 'AphrontFormLayoutView' => 'AphrontView', + 'AphrontFormHandlesControl' => 'AphrontFormControl', 'AphrontFormMarkupControl' => 'AphrontFormControl', 'AphrontFormPasswordControl' => 'AphrontFormControl', 'AphrontFormPolicyControl' => 'AphrontFormControl', @@ -2075,618 +6201,1759 @@ 'AphrontFormSubmitControl' => 'AphrontFormControl', 'AphrontFormTextAreaControl' => 'AphrontFormControl', 'AphrontFormTextControl' => 'AphrontFormControl', - 'AphrontFormToggleButtonsControl' => 'AphrontFormControl', + 'AphrontFormTextWithSubmitControl' => 'AphrontFormControl', 'AphrontFormTokenizerControl' => 'AphrontFormControl', + 'AphrontFormTypeaheadControl' => 'AphrontFormControl', 'AphrontFormView' => 'AphrontView', 'AphrontGlyphBarView' => 'AphrontBarView', 'AphrontHTMLResponse' => 'AphrontResponse', + 'AphrontHTTPHeaderParser' => 'Phobject', + 'AphrontHTTPHeaderParserTestCase' => 'PhutilTestCase', + 'AphrontHTTPParameterType' => 'Phobject', + 'AphrontHTTPProxyResponse' => 'AphrontResponse', + 'AphrontHTTPSink' => 'Phobject', 'AphrontHTTPSinkTestCase' => 'PhabricatorTestCase', + 'AphrontIntHTTPParameterType' => 'AphrontHTTPParameterType', + 'AphrontInvalidCredentialsQueryException' => 'AphrontQueryException', + 'AphrontIsolatedDatabaseConnection' => 'AphrontDatabaseConnection', 'AphrontIsolatedDatabaseConnectionTestCase' => 'PhabricatorTestCase', 'AphrontIsolatedHTTPSink' => 'AphrontHTTPSink', + 'AphrontJSONHTTPParameterType' => 'AphrontHTTPParameterType', 'AphrontJSONResponse' => 'AphrontResponse', 'AphrontJavelinView' => 'AphrontView', 'AphrontKeyboardShortcutsAvailableView' => 'AphrontView', 'AphrontListFilterView' => 'AphrontView', - 'AphrontMiniPanelView' => 'AphrontView', + 'AphrontListHTTPParameterType' => 'AphrontHTTPParameterType', + 'AphrontLockTimeoutQueryException' => 'AphrontRecoverableQueryException', + 'AphrontMalformedRequestException' => 'AphrontException', 'AphrontMoreView' => 'AphrontView', 'AphrontMultiColumnView' => 'AphrontView', + 'AphrontMultipartParser' => 'Phobject', + 'AphrontMultipartParserTestCase' => 'PhutilTestCase', + 'AphrontMultipartPart' => 'Phobject', + 'AphrontMySQLDatabaseConnection' => 'AphrontBaseMySQLDatabaseConnection', 'AphrontMySQLDatabaseConnectionTestCase' => 'PhabricatorTestCase', - 'AphrontNoteView' => 'AphrontView', + 'AphrontMySQLiDatabaseConnection' => 'AphrontBaseMySQLDatabaseConnection', + 'AphrontNotSupportedQueryException' => 'AphrontQueryException', 'AphrontNullView' => 'AphrontView', + 'AphrontObjectMissingQueryException' => 'AphrontQueryException', + 'AphrontPHIDHTTPParameterType' => 'AphrontHTTPParameterType', + 'AphrontPHIDListHTTPParameterType' => 'AphrontListHTTPParameterType', 'AphrontPHPHTTPSink' => 'AphrontHTTPSink', 'AphrontPageView' => 'AphrontView', - 'AphrontPagerView' => 'AphrontView', - 'AphrontPanelView' => 'AphrontView', + 'AphrontParameterQueryException' => 'AphrontQueryException', 'AphrontPlainTextResponse' => 'AphrontResponse', 'AphrontProgressBarView' => 'AphrontBarView', - 'AphrontProxyResponse' => 'AphrontResponse', - 'AphrontRedirectException' => 'AphrontException', + 'AphrontProjectListHTTPParameterType' => 'AphrontListHTTPParameterType', + 'AphrontProxyResponse' => array( + 'AphrontResponse', + 'AphrontResponseProducerInterface', + ), + 'AphrontQueryException' => 'Exception', + 'AphrontQueryTimeoutQueryException' => 'AphrontRecoverableQueryException', + 'AphrontRecoverableQueryException' => 'AphrontQueryException', 'AphrontRedirectResponse' => 'AphrontResponse', + 'AphrontRedirectResponseTestCase' => 'PhabricatorTestCase', 'AphrontReloadResponse' => 'AphrontRedirectResponse', - 'AphrontRequestFailureView' => 'AphrontView', + 'AphrontRemarkupHTTPParameterType' => 'AphrontHTTPParameterType', + 'AphrontRequest' => 'Phobject', + 'AphrontRequestExceptionHandler' => 'Phobject', + 'AphrontRequestStream' => 'Phobject', 'AphrontRequestTestCase' => 'PhabricatorTestCase', + 'AphrontResponse' => 'Phobject', + 'AphrontRoutingMap' => 'Phobject', + 'AphrontRoutingMapTestCase' => 'PhabricatorTestCase', + 'AphrontRoutingResult' => 'Phobject', + 'AphrontSchemaQueryException' => 'AphrontQueryException', + 'AphrontScopedUnguardedWriteCapability' => 'Phobject', + 'AphrontSelectHTTPParameterType' => 'AphrontHTTPParameterType', 'AphrontSideNavFilterView' => 'AphrontView', + 'AphrontSite' => 'Phobject', + 'AphrontStackTraceView' => 'AphrontView', + 'AphrontStandaloneHTMLResponse' => 'AphrontHTMLResponse', + 'AphrontStringHTTPParameterType' => 'AphrontHTTPParameterType', + 'AphrontStringListHTTPParameterType' => 'AphrontListHTTPParameterType', 'AphrontTableView' => 'AphrontView', 'AphrontTagView' => 'AphrontView', 'AphrontTokenizerTemplateView' => 'AphrontView', - 'AphrontTwoColumnView' => 'AphrontView', 'AphrontTypeaheadTemplateView' => 'AphrontView', - 'AphrontUsageException' => 'AphrontException', - 'AphrontView' => - array( - 0 => 'Phobject', - 1 => 'PhutilSafeHTMLProducerInterface', + 'AphrontUnhandledExceptionResponse' => 'AphrontStandaloneHTMLResponse', + 'AphrontUserListHTTPParameterType' => 'AphrontListHTTPParameterType', + 'AphrontView' => array( + 'Phobject', + 'PhutilSafeHTMLProducerInterface', ), 'AphrontWebpageResponse' => 'AphrontHTMLResponse', - 'AuditPeopleMenuEventListener' => 'PhutilEventListener', + 'AphrontWriteGuard' => 'Phobject', + 'ArcanistConduitAPIMethod' => 'ConduitAPIMethod', + 'AuditConduitAPIMethod' => 'ConduitAPIMethod', + 'AuditQueryConduitAPIMethod' => 'AuditConduitAPIMethod', + 'AuthManageProvidersCapability' => 'PhabricatorPolicyCapability', + 'BulkParameterType' => 'Phobject', + 'BulkPointsParameterType' => 'BulkParameterType', + 'BulkRemarkupParameterType' => 'BulkParameterType', + 'BulkSelectParameterType' => 'BulkParameterType', + 'BulkStringParameterType' => 'BulkParameterType', + 'BulkTokenizerParameterType' => 'BulkParameterType', + 'CalendarTimeUtil' => 'Phobject', + 'CalendarTimeUtilTestCase' => 'PhabricatorTestCase', + 'CelerityAPI' => 'Phobject', + 'CelerityDarkModePostprocessor' => 'CelerityPostprocessor', + 'CelerityDefaultPostprocessor' => 'CelerityPostprocessor', + 'CelerityHighContrastPostprocessor' => 'CelerityPostprocessor', + 'CelerityLargeFontPostprocessor' => 'CelerityPostprocessor', + 'CelerityManagementMapWorkflow' => 'CelerityManagementWorkflow', + 'CelerityManagementSyntaxWorkflow' => 'CelerityManagementWorkflow', + 'CelerityManagementWorkflow' => 'PhabricatorManagementWorkflow', 'CelerityPhabricatorResourceController' => 'CelerityResourceController', + 'CelerityPhabricatorResources' => 'CelerityResourcesOnDisk', + 'CelerityPhysicalResources' => 'CelerityResources', + 'CelerityPhysicalResourcesTestCase' => 'PhabricatorTestCase', + 'CelerityPostprocessor' => 'Phobject', + 'CelerityPostprocessorTestCase' => 'PhabricatorTestCase', + 'CelerityRedGreenPostprocessor' => 'CelerityPostprocessor', 'CelerityResourceController' => 'PhabricatorController', 'CelerityResourceGraph' => 'AbstractDirectedGraph', + 'CelerityResourceMap' => 'Phobject', + 'CelerityResourceMapGenerator' => 'Phobject', + 'CelerityResourceTransformer' => 'Phobject', 'CelerityResourceTransformerTestCase' => 'PhabricatorTestCase', - 'ConduitAPIMethod' => - array( - 0 => 'Phobject', - 1 => 'PhabricatorPolicyInterface', - ), - 'ConduitAPI_arcanist_Method' => 'ConduitAPIMethod', - 'ConduitAPI_arcanist_projectinfo_Method' => 'ConduitAPI_arcanist_Method', - 'ConduitAPI_audit_Method' => 'ConduitAPIMethod', - 'ConduitAPI_audit_query_Method' => 'ConduitAPI_audit_Method', - 'ConduitAPI_chatlog_Method' => 'ConduitAPIMethod', - 'ConduitAPI_chatlog_query_Method' => 'ConduitAPI_chatlog_Method', - 'ConduitAPI_chatlog_record_Method' => 'ConduitAPI_chatlog_Method', - 'ConduitAPI_conduit_connect_Method' => 'ConduitAPIMethod', - 'ConduitAPI_conduit_getcertificate_Method' => 'ConduitAPIMethod', - 'ConduitAPI_conduit_ping_Method' => 'ConduitAPIMethod', - 'ConduitAPI_conduit_query_Method' => 'ConduitAPIMethod', - 'ConduitAPI_conpherence_Method' => 'ConduitAPIMethod', - 'ConduitAPI_conpherence_createthread_Method' => 'ConduitAPI_conpherence_Method', - 'ConduitAPI_conpherence_querythread_Method' => 'ConduitAPI_conpherence_Method', - 'ConduitAPI_conpherence_querytransaction_Method' => 'ConduitAPI_conpherence_Method', - 'ConduitAPI_conpherence_updatethread_Method' => 'ConduitAPI_conpherence_Method', - 'ConduitAPI_differential_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_close_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_createcomment_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_creatediff_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_createinline_Method' => 'ConduitAPI_differential_Method', - 'ConduitAPI_differential_createrawdiff_Method' => 'ConduitAPI_differential_Method', - 'ConduitAPI_differential_createrevision_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_find_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_finishpostponedlinters_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_getalldiffs_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_getcommitmessage_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_getcommitpaths_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_getdiff_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_getrevision_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_getrevisioncomments_Method' => 'ConduitAPI_differential_Method', - 'ConduitAPI_differential_markcommitted_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_parsecommitmessage_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_query_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_setdiffproperty_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_updaterevision_Method' => 'ConduitAPIMethod', - 'ConduitAPI_differential_updateunitresults_Method' => 'ConduitAPIMethod', - 'ConduitAPI_diffusion_Method' => 'ConduitAPIMethod', - 'ConduitAPI_diffusion_abstractquery_Method' => 'ConduitAPI_diffusion_Method', - 'ConduitAPI_diffusion_branchquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_browsequery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_commitbranchesquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_commitparentsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_diffquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_existsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_expandshortcommitquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_filecontentquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_findsymbols_Method' => 'ConduitAPI_diffusion_Method', - 'ConduitAPI_diffusion_getcommits_Method' => 'ConduitAPI_diffusion_Method', - 'ConduitAPI_diffusion_getlintmessages_Method' => 'ConduitAPI_diffusion_Method', - 'ConduitAPI_diffusion_getrecentcommitsbypath_Method' => 'ConduitAPI_diffusion_Method', - 'ConduitAPI_diffusion_historyquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_lastmodifiedquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_mergedcommitsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_rawdiffquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_readmequery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_refsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_searchquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_stablecommitnamequery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_diffusion_tagsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', - 'ConduitAPI_feed_Method' => 'ConduitAPIMethod', - 'ConduitAPI_feed_publish_Method' => 'ConduitAPI_feed_Method', - 'ConduitAPI_feed_query_Method' => 'ConduitAPI_feed_Method', - 'ConduitAPI_file_Method' => 'ConduitAPIMethod', - 'ConduitAPI_file_download_Method' => 'ConduitAPI_file_Method', - 'ConduitAPI_file_info_Method' => 'ConduitAPI_file_Method', - 'ConduitAPI_file_upload_Method' => 'ConduitAPI_file_Method', - 'ConduitAPI_file_uploadhash_Method' => 'ConduitAPI_file_Method', - 'ConduitAPI_flag_Method' => 'ConduitAPIMethod', - 'ConduitAPI_flag_delete_Method' => 'ConduitAPI_flag_Method', - 'ConduitAPI_flag_edit_Method' => 'ConduitAPI_flag_Method', - 'ConduitAPI_flag_query_Method' => 'ConduitAPI_flag_Method', - 'ConduitAPI_macro_Method' => 'ConduitAPIMethod', - 'ConduitAPI_macro_creatememe_Method' => 'ConduitAPI_macro_Method', - 'ConduitAPI_macro_query_Method' => 'ConduitAPI_macro_Method', - 'ConduitAPI_maniphest_Method' => 'ConduitAPIMethod', - 'ConduitAPI_maniphest_createtask_Method' => 'ConduitAPI_maniphest_Method', - 'ConduitAPI_maniphest_find_Method' => 'ConduitAPI_maniphest_query_Method', - 'ConduitAPI_maniphest_gettasktransactions_Method' => 'ConduitAPI_maniphest_Method', - 'ConduitAPI_maniphest_info_Method' => 'ConduitAPI_maniphest_Method', - 'ConduitAPI_maniphest_query_Method' => 'ConduitAPI_maniphest_Method', - 'ConduitAPI_maniphest_update_Method' => 'ConduitAPI_maniphest_Method', - 'ConduitAPI_owners_Method' => 'ConduitAPIMethod', - 'ConduitAPI_owners_query_Method' => 'ConduitAPI_owners_Method', - 'ConduitAPI_paste_Method' => 'ConduitAPIMethod', - 'ConduitAPI_paste_create_Method' => 'ConduitAPI_paste_Method', - 'ConduitAPI_paste_info_Method' => 'ConduitAPI_paste_Method', - 'ConduitAPI_paste_query_Method' => 'ConduitAPI_paste_Method', - 'ConduitAPI_phid_Method' => 'ConduitAPIMethod', - 'ConduitAPI_phid_info_Method' => 'ConduitAPI_phid_Method', - 'ConduitAPI_phid_lookup_Method' => 'ConduitAPI_phid_Method', - 'ConduitAPI_phid_query_Method' => 'ConduitAPI_phid_Method', - 'ConduitAPI_phpast_Method' => 'ConduitAPIMethod', - 'ConduitAPI_phpast_getast_Method' => 'ConduitAPI_phpast_Method', - 'ConduitAPI_phpast_version_Method' => 'ConduitAPI_phpast_Method', - 'ConduitAPI_phriction_Method' => 'ConduitAPIMethod', - 'ConduitAPI_phriction_edit_Method' => 'ConduitAPI_phriction_Method', - 'ConduitAPI_phriction_history_Method' => 'ConduitAPI_phriction_Method', - 'ConduitAPI_phriction_info_Method' => 'ConduitAPI_phriction_Method', - 'ConduitAPI_project_Method' => 'ConduitAPIMethod', - 'ConduitAPI_project_query_Method' => 'ConduitAPI_project_Method', - 'ConduitAPI_releeph_Method' => 'ConduitAPIMethod', - 'ConduitAPI_releeph_getbranches_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_releeph_projectinfo_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_releeph_queryrequests_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_releeph_request_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_releephwork_canpush_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_releephwork_getauthorinfo_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_releephwork_getbranch_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_releephwork_getbranchcommitmessage_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_releephwork_getcommitmessage_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_releephwork_getorigcommitmessage_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_releephwork_nextrequest_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_releephwork_record_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_releephwork_recordpickstatus_Method' => 'ConduitAPI_releeph_Method', - 'ConduitAPI_remarkup_process_Method' => 'ConduitAPIMethod', - 'ConduitAPI_repository_Method' => 'ConduitAPIMethod', - 'ConduitAPI_repository_create_Method' => 'ConduitAPI_repository_Method', - 'ConduitAPI_repository_query_Method' => 'ConduitAPI_repository_Method', - 'ConduitAPI_slowvote_Method' => 'ConduitAPIMethod', - 'ConduitAPI_slowvote_info_Method' => 'ConduitAPI_slowvote_Method', - 'ConduitAPI_token_Method' => 'ConduitAPIMethod', - 'ConduitAPI_token_give_Method' => 'ConduitAPI_token_Method', - 'ConduitAPI_token_given_Method' => 'ConduitAPI_token_Method', - 'ConduitAPI_token_query_Method' => 'ConduitAPI_token_Method', - 'ConduitAPI_user_Method' => 'ConduitAPIMethod', - 'ConduitAPI_user_addstatus_Method' => 'ConduitAPI_user_Method', - 'ConduitAPI_user_disable_Method' => 'ConduitAPI_user_Method', - 'ConduitAPI_user_enable_Method' => 'ConduitAPI_user_Method', - 'ConduitAPI_user_find_Method' => 'ConduitAPI_user_Method', - 'ConduitAPI_user_info_Method' => 'ConduitAPI_user_Method', - 'ConduitAPI_user_query_Method' => 'ConduitAPI_user_Method', - 'ConduitAPI_user_removestatus_Method' => 'ConduitAPI_user_Method', - 'ConduitAPI_user_whoami_Method' => 'ConduitAPI_user_Method', + 'CelerityResources' => 'Phobject', + 'CelerityResourcesOnDisk' => 'CelerityPhysicalResources', + 'CeleritySpriteGenerator' => 'Phobject', + 'CelerityStaticResourceResponse' => 'Phobject', + 'ChatLogConduitAPIMethod' => 'ConduitAPIMethod', + 'ChatLogQueryConduitAPIMethod' => 'ChatLogConduitAPIMethod', + 'ChatLogRecordConduitAPIMethod' => 'ChatLogConduitAPIMethod', + 'ConduitAPIDocumentationPage' => 'Phobject', + 'ConduitAPIMethod' => array( + 'Phobject', + 'PhabricatorPolicyInterface', + ), + 'ConduitAPIMethodTestCase' => 'PhabricatorTestCase', + 'ConduitAPIRequest' => 'Phobject', + 'ConduitAPIResponse' => 'Phobject', + 'ConduitApplicationNotInstalledException' => 'ConduitMethodNotFoundException', + 'ConduitBoolParameterType' => 'ConduitParameterType', + 'ConduitCall' => 'Phobject', 'ConduitCallTestCase' => 'PhabricatorTestCase', + 'ConduitColumnsParameterType' => 'ConduitParameterType', + 'ConduitConnectConduitAPIMethod' => 'ConduitAPIMethod', + 'ConduitConstantDescription' => 'Phobject', + 'ConduitEpochParameterType' => 'ConduitParameterType', 'ConduitException' => 'Exception', + 'ConduitGetCapabilitiesConduitAPIMethod' => 'ConduitAPIMethod', + 'ConduitGetCertificateConduitAPIMethod' => 'ConduitAPIMethod', + 'ConduitIntListParameterType' => 'ConduitListParameterType', + 'ConduitIntParameterType' => 'ConduitParameterType', + 'ConduitListParameterType' => 'ConduitParameterType', + 'ConduitLogGarbageCollector' => 'PhabricatorGarbageCollector', + 'ConduitMethodDoesNotExistException' => 'ConduitMethodNotFoundException', + 'ConduitMethodNotFoundException' => 'ConduitException', + 'ConduitPHIDListParameterType' => 'ConduitListParameterType', + 'ConduitPHIDParameterType' => 'ConduitParameterType', + 'ConduitParameterType' => 'Phobject', + 'ConduitPingConduitAPIMethod' => 'ConduitAPIMethod', + 'ConduitPointsParameterType' => 'ConduitParameterType', + 'ConduitProjectListParameterType' => 'ConduitListParameterType', + 'ConduitQueryConduitAPIMethod' => 'ConduitAPIMethod', + 'ConduitResultSearchEngineExtension' => 'PhabricatorSearchEngineExtension', 'ConduitSSHWorkflow' => 'PhabricatorSSHWorkflow', - 'ConpherenceConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'ConduitStringListParameterType' => 'ConduitListParameterType', + 'ConduitStringParameterType' => 'ConduitParameterType', + 'ConduitTokenGarbageCollector' => 'PhabricatorGarbageCollector', + 'ConduitUserListParameterType' => 'ConduitListParameterType', + 'ConduitUserParameterType' => 'ConduitParameterType', + 'ConduitWildParameterType' => 'ConduitParameterType', + 'ConpherenceColumnViewController' => 'ConpherenceController', + 'ConpherenceConduitAPIMethod' => 'ConduitAPIMethod', + 'ConpherenceConstants' => 'Phobject', 'ConpherenceController' => 'PhabricatorController', - 'ConpherenceCreateThreadMailReceiver' => 'PhabricatorMailReceiver', + 'ConpherenceCreateThreadConduitAPIMethod' => 'ConpherenceConduitAPIMethod', 'ConpherenceDAO' => 'PhabricatorLiskDAO', + 'ConpherenceDurableColumnView' => 'AphrontTagView', + 'ConpherenceEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'ConpherenceEditEngine' => 'PhabricatorEditEngine', 'ConpherenceEditor' => 'PhabricatorApplicationTransactionEditor', - 'ConpherenceFileWidgetView' => 'ConpherenceWidgetView', - 'ConpherenceHovercardEventListener' => 'PhutilEventListener', - 'ConpherenceLayoutView' => 'AphrontView', + 'ConpherenceFulltextQuery' => 'PhabricatorOffsetPagedQuery', + 'ConpherenceIndex' => 'ConpherenceDAO', + 'ConpherenceLayoutView' => 'AphrontTagView', 'ConpherenceListController' => 'ConpherenceController', 'ConpherenceMenuItemView' => 'AphrontTagView', - 'ConpherenceNewController' => 'ConpherenceController', 'ConpherenceNotificationPanelController' => 'ConpherenceController', 'ConpherenceParticipant' => 'ConpherenceDAO', + 'ConpherenceParticipantController' => 'ConpherenceController', 'ConpherenceParticipantCountQuery' => 'PhabricatorOffsetPagedQuery', 'ConpherenceParticipantQuery' => 'PhabricatorOffsetPagedQuery', - 'ConpherenceParticipationStatus' => 'ConpherenceConstants', - 'ConpherencePeopleMenuEventListener' => 'PhutilEventListener', - 'ConpherencePeopleWidgetView' => 'ConpherenceWidgetView', + 'ConpherenceParticipantView' => 'AphrontView', + 'ConpherenceQueryThreadConduitAPIMethod' => 'ConpherenceConduitAPIMethod', + 'ConpherenceQueryTransactionConduitAPIMethod' => 'ConpherenceConduitAPIMethod', 'ConpherenceReplyHandler' => 'PhabricatorMailReplyHandler', - 'ConpherenceSettings' => 'ConpherenceConstants', - 'ConpherenceThread' => - array( - 0 => 'ConpherenceDAO', - 1 => 'PhabricatorPolicyInterface', + 'ConpherenceRoomEditController' => 'ConpherenceController', + 'ConpherenceRoomListController' => 'ConpherenceController', + 'ConpherenceRoomPictureController' => 'ConpherenceController', + 'ConpherenceRoomPreferencesController' => 'ConpherenceController', + 'ConpherenceRoomSettings' => 'ConpherenceConstants', + 'ConpherenceRoomTestCase' => 'ConpherenceTestCase', + 'ConpherenceSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'ConpherenceTestCase' => 'PhabricatorTestCase', + 'ConpherenceThread' => array( + 'ConpherenceDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorMentionableInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorNgramsInterface', ), + 'ConpherenceThreadDatasource' => 'PhabricatorTypeaheadDatasource', + 'ConpherenceThreadDateMarkerTransaction' => 'ConpherenceThreadTransactionType', + 'ConpherenceThreadIndexEngineExtension' => 'PhabricatorIndexEngineExtension', 'ConpherenceThreadListView' => 'AphrontView', 'ConpherenceThreadMailReceiver' => 'PhabricatorObjectMailReceiver', + 'ConpherenceThreadMembersPolicyRule' => 'PhabricatorPolicyRule', + 'ConpherenceThreadParticipantsTransaction' => 'ConpherenceThreadTransactionType', + 'ConpherenceThreadPictureTransaction' => 'ConpherenceThreadTransactionType', 'ConpherenceThreadQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'ConpherenceTimeUtilTestCase' => 'PhabricatorTestCase', - 'ConpherenceTransaction' => 'PhabricatorApplicationTransaction', + 'ConpherenceThreadRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'ConpherenceThreadSearchController' => 'ConpherenceController', + 'ConpherenceThreadSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'ConpherenceThreadTitleNgrams' => 'PhabricatorSearchNgrams', + 'ConpherenceThreadTitleTransaction' => 'ConpherenceThreadTransactionType', + 'ConpherenceThreadTopicTransaction' => 'ConpherenceThreadTransactionType', + 'ConpherenceThreadTransactionType' => 'PhabricatorModularTransactionType', + 'ConpherenceTransaction' => 'PhabricatorModularTransaction', 'ConpherenceTransactionComment' => 'PhabricatorApplicationTransactionComment', 'ConpherenceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', - 'ConpherenceTransactionType' => 'ConpherenceConstants', + 'ConpherenceTransactionRenderer' => 'Phobject', 'ConpherenceTransactionView' => 'AphrontView', 'ConpherenceUpdateActions' => 'ConpherenceConstants', 'ConpherenceUpdateController' => 'ConpherenceController', + 'ConpherenceUpdateThreadConduitAPIMethod' => 'ConpherenceConduitAPIMethod', 'ConpherenceViewController' => 'ConpherenceController', - 'ConpherenceWidgetController' => 'ConpherenceController', - 'ConpherenceWidgetView' => 'AphrontView', + 'CountdownEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'CountdownSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 'DarkConsoleController' => 'PhabricatorController', + 'DarkConsoleCore' => 'Phobject', 'DarkConsoleDataController' => 'PhabricatorController', 'DarkConsoleErrorLogPlugin' => 'DarkConsolePlugin', + 'DarkConsoleErrorLogPluginAPI' => 'Phobject', 'DarkConsoleEventPlugin' => 'DarkConsolePlugin', - 'DarkConsoleEventPluginAPI' => 'PhutilEventListener', + 'DarkConsoleEventPluginAPI' => 'PhabricatorEventListener', + 'DarkConsolePlugin' => 'Phobject', + 'DarkConsoleRealtimePlugin' => 'DarkConsolePlugin', 'DarkConsoleRequestPlugin' => 'DarkConsolePlugin', 'DarkConsoleServicesPlugin' => 'DarkConsolePlugin', + 'DarkConsoleStartupPlugin' => 'DarkConsolePlugin', 'DarkConsoleXHProfPlugin' => 'DarkConsolePlugin', - 'DefaultDatabaseConfigurationProvider' => 'DatabaseConfigurationProvider', - 'DifferentialActionHasNoEffectException' => 'DifferentialException', - 'DifferentialAddCommentView' => 'AphrontView', + 'DarkConsoleXHProfPluginAPI' => 'Phobject', + 'DifferentialAction' => 'Phobject', + 'DifferentialActionEmailCommand' => 'MetaMTAEmailTransactionCommand', + 'DifferentialAdjustmentMapTestCase' => 'PhabricatorTestCase', 'DifferentialAffectedPath' => 'DifferentialDAO', - 'DifferentialApplyPatchFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialArcanistProjectFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialAsanaRepresentationFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialAuditorsFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialAuthorFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialAuxiliaryField' => 'DifferentialDAO', - 'DifferentialBlameRevisionFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialBranchFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialCCWelcomeMail' => 'DifferentialReviewRequestMail', - 'DifferentialCCsFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialChangeset' => 'DifferentialDAO', + 'DifferentialAffectedPathEngine' => 'Phobject', + 'DifferentialAsanaRepresentationField' => 'DifferentialCustomField', + 'DifferentialAuditorsCommitMessageField' => 'DifferentialCommitMessageCustomField', + 'DifferentialAuditorsField' => 'DifferentialStoredCustomField', + 'DifferentialBlameRevisionCommitMessageField' => 'DifferentialCommitMessageCustomField', + 'DifferentialBlameRevisionField' => 'DifferentialStoredCustomField', + 'DifferentialBlockHeraldAction' => 'HeraldAction', + 'DifferentialBlockingReviewerDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'DifferentialBranchField' => 'DifferentialCustomField', + 'DifferentialBuildableEngine' => 'HarbormasterBuildableEngine', + 'DifferentialChangeDetailMailView' => 'DifferentialMailView', + 'DifferentialChangeHeraldFieldGroup' => 'HeraldFieldGroup', + 'DifferentialChangeType' => 'Phobject', + 'DifferentialChangesSinceLastUpdateField' => 'DifferentialCustomField', + 'DifferentialChangeset' => array( + 'DifferentialDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorConduitResultInterface', + ), 'DifferentialChangesetDetailView' => 'AphrontView', + 'DifferentialChangesetEngine' => 'Phobject', 'DifferentialChangesetHTMLRenderer' => 'DifferentialChangesetRenderer', + 'DifferentialChangesetListController' => 'DifferentialController', 'DifferentialChangesetListView' => 'AphrontView', + 'DifferentialChangesetOneUpMailRenderer' => 'DifferentialChangesetRenderer', 'DifferentialChangesetOneUpRenderer' => 'DifferentialChangesetHTMLRenderer', 'DifferentialChangesetOneUpTestRenderer' => 'DifferentialChangesetTestRenderer', + 'DifferentialChangesetPHIDType' => 'PhabricatorPHIDType', + 'DifferentialChangesetParser' => 'Phobject', 'DifferentialChangesetParserTestCase' => 'PhabricatorTestCase', + 'DifferentialChangesetQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'DifferentialChangesetRenderer' => 'Phobject', + 'DifferentialChangesetSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'DifferentialChangesetSearchEngine' => 'PhabricatorApplicationSearchEngine', 'DifferentialChangesetTestRenderer' => 'DifferentialChangesetRenderer', 'DifferentialChangesetTwoUpRenderer' => 'DifferentialChangesetHTMLRenderer', 'DifferentialChangesetTwoUpTestRenderer' => 'DifferentialChangesetTestRenderer', 'DifferentialChangesetViewController' => 'DifferentialController', - 'DifferentialComment' => - array( - 0 => 'DifferentialDAO', - 1 => 'PhabricatorMarkupInterface', - ), - 'DifferentialCommentEditor' => 'PhabricatorEditor', - 'DifferentialCommentMail' => 'DifferentialMail', - 'DifferentialCommentPreviewController' => 'DifferentialController', - 'DifferentialCommentQuery' => 'PhabricatorOffsetPagedQuery', - 'DifferentialCommentSaveController' => 'DifferentialController', - 'DifferentialCommitsFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialConflictsFieldSpecification' => 'DifferentialFieldSpecification', + 'DifferentialCloseConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialCommitMessageCustomField' => 'DifferentialCommitMessageField', + 'DifferentialCommitMessageField' => 'Phobject', + 'DifferentialCommitMessageFieldTestCase' => 'PhabricatorTestCase', + 'DifferentialCommitMessageParser' => 'Phobject', + 'DifferentialCommitMessageParserTestCase' => 'PhabricatorTestCase', + 'DifferentialCommitsField' => 'DifferentialCustomField', + 'DifferentialCommitsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'DifferentialConduitAPIMethod' => 'ConduitAPIMethod', + 'DifferentialConflictsCommitMessageField' => 'DifferentialCommitMessageField', + 'DifferentialConstantsModule' => 'PhabricatorConfigModule', 'DifferentialController' => 'PhabricatorController', + 'DifferentialCoreCustomField' => 'DifferentialCustomField', + 'DifferentialCreateCommentConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialCreateDiffConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialCreateInlineConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialCreateMailReceiver' => 'PhabricatorApplicationMailReceiver', + 'DifferentialCreateRawDiffConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialCreateRevisionConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialCustomField' => 'PhabricatorCustomField', + 'DifferentialCustomFieldDependsOnParser' => 'PhabricatorCustomFieldMonogramParser', + 'DifferentialCustomFieldDependsOnParserTestCase' => 'PhabricatorTestCase', + 'DifferentialCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage', + 'DifferentialCustomFieldRevertsParser' => 'PhabricatorCustomFieldMonogramParser', + 'DifferentialCustomFieldRevertsParserTestCase' => 'PhabricatorTestCase', + 'DifferentialCustomFieldStorage' => 'PhabricatorCustomFieldStorage', + 'DifferentialCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage', 'DifferentialDAO' => 'PhabricatorLiskDAO', - 'DifferentialDateCreatedFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialDateModifiedFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialDefaultFieldSelector' => 'DifferentialFieldSelector', - 'DifferentialDependenciesFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialDependsOnFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialDiff' => - array( - 0 => 'DifferentialDAO', - 1 => 'PhabricatorPolicyInterface', - ), - 'DifferentialDiffContentMail' => 'DifferentialMail', + 'DifferentialDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'DifferentialDiff' => array( + 'DifferentialDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + 'HarbormasterBuildableInterface', + 'HarbormasterCircleCIBuildableInterface', + 'HarbormasterBuildkiteBuildableInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorConduitResultInterface', + ), + 'DifferentialDiffAffectedFilesHeraldField' => 'DifferentialDiffHeraldField', + 'DifferentialDiffAuthorHeraldField' => 'DifferentialDiffHeraldField', + 'DifferentialDiffAuthorProjectsHeraldField' => 'DifferentialDiffHeraldField', + 'DifferentialDiffContentAddedHeraldField' => 'DifferentialDiffHeraldField', + 'DifferentialDiffContentHeraldField' => 'DifferentialDiffHeraldField', + 'DifferentialDiffContentRemovedHeraldField' => 'DifferentialDiffHeraldField', 'DifferentialDiffCreateController' => 'DifferentialController', + 'DifferentialDiffEditor' => 'PhabricatorApplicationTransactionEditor', + 'DifferentialDiffExtractionEngine' => 'Phobject', + 'DifferentialDiffHeraldField' => 'HeraldField', + 'DifferentialDiffHeraldFieldGroup' => 'HeraldFieldGroup', + 'DifferentialDiffInlineCommentQuery' => 'PhabricatorDiffInlineCommentQuery', + 'DifferentialDiffPHIDType' => 'PhabricatorPHIDType', 'DifferentialDiffProperty' => 'DifferentialDAO', 'DifferentialDiffQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'DifferentialDiffTableOfContentsView' => 'AphrontView', - 'DifferentialDiffTestCase' => 'ArcanistPhutilTestCase', + 'DifferentialDiffRepositoryHeraldField' => 'DifferentialDiffHeraldField', + 'DifferentialDiffRepositoryProjectsHeraldField' => 'DifferentialDiffHeraldField', + 'DifferentialDiffSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'DifferentialDiffSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'DifferentialDiffTestCase' => 'PhutilTestCase', + 'DifferentialDiffTransaction' => 'PhabricatorApplicationTransaction', + 'DifferentialDiffTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'DifferentialDiffViewController' => 'DifferentialController', - 'DifferentialDiffViewPolicyFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialDoorkeeperRevisionFeedStoryPublisher' => 'DoorkeeperFeedStoryPublisher', - 'DifferentialException' => 'Exception', - 'DifferentialExceptionMail' => 'DifferentialMail', - 'DifferentialExportPatchFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialFieldDataNotAvailableException' => 'Exception', + 'DifferentialDraftField' => 'DifferentialCoreCustomField', + 'DifferentialExactUserFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', 'DifferentialFieldParseException' => 'Exception', - 'DifferentialFieldSpecificationIncompleteException' => 'Exception', 'DifferentialFieldValidationException' => 'Exception', - 'DifferentialFreeformFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialFreeformFieldTestCase' => 'PhabricatorTestCase', - 'DifferentialGitSVNIDFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialHostFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialHovercardEventListener' => 'PhutilEventListener', - 'DifferentialHunk' => 'DifferentialDAO', - 'DifferentialHunkParserTestCase' => 'PhabricatorTestCase', - 'DifferentialHunkTestCase' => 'ArcanistPhutilTestCase', - 'DifferentialInlineComment' => - array( - 0 => 'DifferentialDAO', - 1 => 'PhabricatorInlineCommentInterface', + 'DifferentialFileTreeEngine' => 'Phobject', + 'DifferentialGetAllDiffsConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialGetCommitMessageConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialGetCommitPathsConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialGetDiffConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialGetRawDiffConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialGetRevisionCommentsConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialGetRevisionConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialGetWorkingCopy' => 'Phobject', + 'DifferentialGitSVNIDCommitMessageField' => 'DifferentialCommitMessageField', + 'DifferentialHarbormasterField' => 'DifferentialCustomField', + 'DifferentialHeraldStateReasons' => 'HeraldStateReasons', + 'DifferentialHiddenComment' => 'DifferentialDAO', + 'DifferentialHostField' => 'DifferentialCustomField', + 'DifferentialHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension', + 'DifferentialHunk' => array( + 'DifferentialDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', ), + 'DifferentialHunkParser' => 'Phobject', + 'DifferentialHunkParserTestCase' => 'PhabricatorTestCase', + 'DifferentialHunkQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'DifferentialHunkTestCase' => 'PhutilTestCase', + 'DifferentialInlineComment' => 'PhabricatorInlineComment', 'DifferentialInlineCommentEditController' => 'PhabricatorInlineCommentController', - 'DifferentialInlineCommentEditView' => 'AphrontView', - 'DifferentialInlineCommentPreviewController' => 'PhabricatorInlineCommentPreviewController', - 'DifferentialInlineCommentQuery' => 'PhabricatorOffsetPagedQuery', - 'DifferentialInlineCommentView' => 'AphrontView', - 'DifferentialLinesFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialLintFieldSpecification' => 'DifferentialFieldSpecification', + 'DifferentialInlineCommentMailView' => 'DifferentialMailView', + 'DifferentialJIRAIssuesCommitMessageField' => 'DifferentialCommitMessageCustomField', + 'DifferentialJIRAIssuesField' => 'DifferentialStoredCustomField', + 'DifferentialLegacyQuery' => 'Phobject', + 'DifferentialLineAdjustmentMap' => 'Phobject', + 'DifferentialLintField' => 'DifferentialHarbormasterField', + 'DifferentialLintStatus' => 'Phobject', 'DifferentialLocalCommitsView' => 'AphrontView', - 'DifferentialMail' => 'PhabricatorMail', - 'DifferentialManiphestTasksFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialNewDiffMail' => 'DifferentialReviewRequestMail', - 'DifferentialPHIDTypeRevision' => 'PhabricatorPHIDType', + 'DifferentialMailEngineExtension' => 'PhabricatorMailEngineExtension', + 'DifferentialMailView' => 'Phobject', + 'DifferentialManiphestTasksField' => 'DifferentialCoreCustomField', + 'DifferentialNoReviewersDatasource' => 'PhabricatorTypeaheadDatasource', + 'DifferentialParseCacheGarbageCollector' => 'PhabricatorGarbageCollector', + 'DifferentialParseCommitMessageConduitAPIMethod' => 'DifferentialConduitAPIMethod', 'DifferentialParseRenderTestCase' => 'PhabricatorTestCase', - 'DifferentialPathFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialPeopleMenuEventListener' => 'PhutilEventListener', - 'DifferentialPrimaryPaneView' => 'AphrontView', - 'DifferentialReleephRequestFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialRemarkupRule' => 'PhabricatorRemarkupRuleObject', - 'DifferentialReplyHandler' => 'PhabricatorMailReplyHandler', - 'DifferentialResultsTableView' => 'AphrontView', - 'DifferentialRevertPlanFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialReviewRequestMail' => 'DifferentialMail', - 'DifferentialReviewedByFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialReviewersFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialRevision' => - array( - 0 => 'DifferentialDAO', - 1 => 'PhabricatorTokenReceiverInterface', - 2 => 'PhabricatorPolicyInterface', - 3 => 'PhrequentTrackableInterface', - ), - 'DifferentialRevisionCommentListView' => 'AphrontView', - 'DifferentialRevisionCommentView' => 'AphrontView', - 'DifferentialRevisionDetailView' => 'AphrontView', - 'DifferentialRevisionEditController' => 'DifferentialController', - 'DifferentialRevisionEditor' => 'PhabricatorEditor', - 'DifferentialRevisionIDFieldParserTestCase' => 'PhabricatorTestCase', - 'DifferentialRevisionIDFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialRevisionListController' => - array( - 0 => 'DifferentialController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', + 'DifferentialPathField' => 'DifferentialCustomField', + 'DifferentialProjectReviewersField' => 'DifferentialCustomField', + 'DifferentialQueryConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialQueryDiffsConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialRawDiffRenderer' => 'Phobject', + 'DifferentialRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'DifferentialReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'DifferentialRepositoryField' => 'DifferentialCoreCustomField', + 'DifferentialRepositoryLookup' => 'Phobject', + 'DifferentialRequiredSignaturesField' => 'DifferentialCoreCustomField', + 'DifferentialResponsibleDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'DifferentialResponsibleUserDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'DifferentialResponsibleViewerFunctionDatasource' => 'PhabricatorTypeaheadDatasource', + 'DifferentialRevertPlanCommitMessageField' => 'DifferentialCommitMessageCustomField', + 'DifferentialRevertPlanField' => 'DifferentialStoredCustomField', + 'DifferentialReviewedByCommitMessageField' => 'DifferentialCommitMessageField', + 'DifferentialReviewer' => 'DifferentialDAO', + 'DifferentialReviewerDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'DifferentialReviewerForRevisionEdgeType' => 'PhabricatorEdgeType', + 'DifferentialReviewerFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'DifferentialReviewerStatus' => 'Phobject', + 'DifferentialReviewersAddBlockingReviewersHeraldAction' => 'DifferentialReviewersHeraldAction', + 'DifferentialReviewersAddBlockingSelfHeraldAction' => 'DifferentialReviewersHeraldAction', + 'DifferentialReviewersAddReviewersHeraldAction' => 'DifferentialReviewersHeraldAction', + 'DifferentialReviewersAddSelfHeraldAction' => 'DifferentialReviewersHeraldAction', + 'DifferentialReviewersCommitMessageField' => 'DifferentialCommitMessageField', + 'DifferentialReviewersField' => 'DifferentialCoreCustomField', + 'DifferentialReviewersHeraldAction' => 'HeraldAction', + 'DifferentialReviewersSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'DifferentialReviewersView' => 'AphrontView', + 'DifferentialRevision' => array( + 'DifferentialDAO', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + 'PhabricatorFlaggableInterface', + 'PhrequentTrackableInterface', + 'HarbormasterBuildableInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorCustomFieldInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorTimelineInterface', + 'PhabricatorMentionableInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorProjectInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorDraftInterface', ), + 'DifferentialRevisionAbandonTransaction' => 'DifferentialRevisionActionTransaction', + 'DifferentialRevisionAcceptTransaction' => 'DifferentialRevisionReviewTransaction', + 'DifferentialRevisionActionTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialRevisionAffectedFilesHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionAffectedPathsController' => 'DifferentialController', + 'DifferentialRevisionAuthorHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionAuthorPackagesHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionAuthorProjectsHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionAuthorTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialRevisionBuildableTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialRevisionCloseDetailsController' => 'DifferentialController', + 'DifferentialRevisionCloseTransaction' => 'DifferentialRevisionActionTransaction', + 'DifferentialRevisionClosedStatusDatasource' => 'PhabricatorTypeaheadDatasource', + 'DifferentialRevisionCommandeerTransaction' => 'DifferentialRevisionActionTransaction', + 'DifferentialRevisionContentAddedHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionContentHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionContentRemovedHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionControlSystem' => 'Phobject', + 'DifferentialRevisionDependedOnByRevisionEdgeType' => 'PhabricatorEdgeType', + 'DifferentialRevisionDependsOnRevisionEdgeType' => 'PhabricatorEdgeType', + 'DifferentialRevisionDraftEngine' => 'PhabricatorDraftEngine', + 'DifferentialRevisionEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'DifferentialRevisionEditController' => 'DifferentialController', + 'DifferentialRevisionEditEngine' => 'PhabricatorEditEngine', + 'DifferentialRevisionFerretEngine' => 'PhabricatorFerretEngine', + 'DifferentialRevisionFulltextEngine' => 'PhabricatorFulltextEngine', + 'DifferentialRevisionGraph' => 'PhabricatorObjectGraph', + 'DifferentialRevisionHasChildRelationship' => 'DifferentialRevisionRelationship', + 'DifferentialRevisionHasCommitEdgeType' => 'PhabricatorEdgeType', + 'DifferentialRevisionHasCommitRelationship' => 'DifferentialRevisionRelationship', + 'DifferentialRevisionHasParentRelationship' => 'DifferentialRevisionRelationship', + 'DifferentialRevisionHasReviewerEdgeType' => 'PhabricatorEdgeType', + 'DifferentialRevisionHasTaskEdgeType' => 'PhabricatorEdgeType', + 'DifferentialRevisionHasTaskRelationship' => 'DifferentialRevisionRelationship', + 'DifferentialRevisionHeraldField' => 'HeraldField', + 'DifferentialRevisionHeraldFieldGroup' => 'HeraldFieldGroup', + 'DifferentialRevisionHoldDraftTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialRevisionIDCommitMessageField' => 'DifferentialCommitMessageField', + 'DifferentialRevisionInlineTransaction' => 'PhabricatorModularTransactionType', + 'DifferentialRevisionInlinesController' => 'DifferentialController', + 'DifferentialRevisionJIRAIssueURIsHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionListController' => 'DifferentialController', 'DifferentialRevisionListView' => 'AphrontView', 'DifferentialRevisionMailReceiver' => 'PhabricatorObjectMailReceiver', + 'DifferentialRevisionOpenStatusDatasource' => 'PhabricatorTypeaheadDatasource', + 'DifferentialRevisionOperationController' => 'DifferentialController', + 'DifferentialRevisionPHIDType' => 'PhabricatorPHIDType', + 'DifferentialRevisionPackageHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionPackageOwnerHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionPlanChangesTransaction' => 'DifferentialRevisionActionTransaction', 'DifferentialRevisionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'DifferentialRevisionReclaimTransaction' => 'DifferentialRevisionActionTransaction', + 'DifferentialRevisionRejectTransaction' => 'DifferentialRevisionReviewTransaction', + 'DifferentialRevisionRelationship' => 'PhabricatorObjectRelationship', + 'DifferentialRevisionRelationshipSource' => 'PhabricatorObjectRelationshipSource', + 'DifferentialRevisionReopenTransaction' => 'DifferentialRevisionActionTransaction', + 'DifferentialRevisionRepositoryHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionRepositoryProjectsHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionRepositoryTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialRevisionRequestReviewTransaction' => 'DifferentialRevisionActionTransaction', + 'DifferentialRevisionRequiredActionResultBucket' => 'DifferentialRevisionResultBucket', + 'DifferentialRevisionResignTransaction' => 'DifferentialRevisionReviewTransaction', + 'DifferentialRevisionResultBucket' => 'PhabricatorSearchResultBucket', + 'DifferentialRevisionReviewTransaction' => 'DifferentialRevisionActionTransaction', + 'DifferentialRevisionReviewersHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionReviewersTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialRevisionSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 'DifferentialRevisionSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'DifferentialRevisionStatsView' => 'AphrontView', - 'DifferentialRevisionStatusFieldSpecification' => 'DifferentialFieldSpecification', + 'DifferentialRevisionStatus' => 'Phobject', + 'DifferentialRevisionStatusDatasource' => 'PhabricatorTypeaheadDatasource', + 'DifferentialRevisionStatusFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'DifferentialRevisionStatusHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionStatusTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialRevisionSummaryHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionSummaryTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialRevisionTestPlanHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionTestPlanTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialRevisionTimelineEngine' => 'PhabricatorTimelineEngine', + 'DifferentialRevisionTitleHeraldField' => 'DifferentialRevisionHeraldField', + 'DifferentialRevisionTitleTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialRevisionTransactionType' => 'PhabricatorModularTransactionType', 'DifferentialRevisionUpdateHistoryView' => 'AphrontView', + 'DifferentialRevisionUpdateTransaction' => 'DifferentialRevisionTransactionType', 'DifferentialRevisionViewController' => 'DifferentialController', - 'DifferentialSearchIndexer' => 'PhabricatorSearchDocumentIndexer', - 'DifferentialSubscribeController' => 'DifferentialController', - 'DifferentialSummaryFieldSpecification' => 'DifferentialFreeformFieldSpecification', - 'DifferentialTestPlanFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialTitleFieldSpecification' => 'DifferentialFreeformFieldSpecification', - 'DifferentialTransaction' => 'PhabricatorApplicationTransaction', - 'DifferentialTransactionComment' => 'PhabricatorApplicationTransactionComment', - 'DifferentialUnitFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialViewPolicyFieldSpecification' => 'DifferentialFieldSpecification', + 'DifferentialRevisionVoidTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialRevisionWrongBuildsTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialRevisionWrongStateTransaction' => 'DifferentialRevisionTransactionType', + 'DifferentialSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'DifferentialSetDiffPropertyConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialStoredCustomField' => 'DifferentialCustomField', + 'DifferentialSubscribersCommitMessageField' => 'DifferentialCommitMessageField', + 'DifferentialSummaryCommitMessageField' => 'DifferentialCommitMessageField', + 'DifferentialSummaryField' => 'DifferentialCoreCustomField', + 'DifferentialTabReplacementTestCase' => 'PhabricatorTestCase', + 'DifferentialTagsCommitMessageField' => 'DifferentialCommitMessageField', + 'DifferentialTasksCommitMessageField' => 'DifferentialCommitMessageField', + 'DifferentialTestPlanCommitMessageField' => 'DifferentialCommitMessageField', + 'DifferentialTestPlanField' => 'DifferentialCoreCustomField', + 'DifferentialTitleCommitMessageField' => 'DifferentialCommitMessageField', + 'DifferentialTransaction' => 'PhabricatorModularTransaction', + 'DifferentialTransactionComment' => array( + 'PhabricatorApplicationTransactionComment', + 'PhabricatorInlineCommentInterface', + ), + 'DifferentialTransactionEditor' => 'PhabricatorApplicationTransactionEditor', + 'DifferentialTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'DifferentialTransactionView' => 'PhabricatorApplicationTransactionView', + 'DifferentialUnitField' => 'DifferentialCustomField', + 'DifferentialUnitStatus' => 'Phobject', + 'DifferentialUnitTestResult' => 'Phobject', + 'DifferentialUpdateRevisionConduitAPIMethod' => 'DifferentialConduitAPIMethod', + 'DifferentialViewState' => array( + 'DifferentialDAO', + 'PhabricatorPolicyInterface', + ), + 'DifferentialViewStateGarbageCollector' => 'PhabricatorGarbageCollector', + 'DifferentialViewStateQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'DiffusionAuditorDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'DiffusionAuditorFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'DiffusionAuditorsAddAuditorsHeraldAction' => 'DiffusionAuditorsHeraldAction', + 'DiffusionAuditorsAddSelfHeraldAction' => 'DiffusionAuditorsHeraldAction', + 'DiffusionAuditorsHeraldAction' => 'HeraldAction', + 'DiffusionAuditorsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'DiffusionBlameConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionBlameController' => 'DiffusionController', + 'DiffusionBlameQuery' => 'DiffusionQuery', + 'DiffusionBlockHeraldAction' => 'HeraldAction', + 'DiffusionBranchListView' => 'DiffusionView', + 'DiffusionBranchQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 'DiffusionBranchTableController' => 'DiffusionController', - 'DiffusionBranchTableView' => 'DiffusionView', 'DiffusionBrowseController' => 'DiffusionController', - 'DiffusionBrowseFileController' => 'DiffusionController', + 'DiffusionBrowseQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionBrowseResultSet' => 'Phobject', 'DiffusionBrowseTableView' => 'DiffusionView', + 'DiffusionBuildableEngine' => 'HarbormasterBuildableEngine', + 'DiffusionCacheEngineExtension' => 'PhabricatorCacheEngineExtension', + 'DiffusionCachedResolveRefsQuery' => 'DiffusionLowLevelQuery', 'DiffusionChangeController' => 'DiffusionController', - 'DiffusionCommentListView' => 'AphrontView', - 'DiffusionCommentView' => 'AphrontView', + 'DiffusionChangeHeraldFieldGroup' => 'HeraldFieldGroup', + 'DiffusionCloneController' => 'DiffusionController', + 'DiffusionCloneURIView' => 'AphrontView', + 'DiffusionCommandEngine' => 'Phobject', + 'DiffusionCommandEngineTestCase' => 'PhabricatorTestCase', + 'DiffusionCommitAcceptTransaction' => 'DiffusionCommitAuditTransaction', + 'DiffusionCommitActionTransaction' => 'DiffusionCommitTransactionType', + 'DiffusionCommitAffectedFilesHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitAuditStatus' => 'Phobject', + 'DiffusionCommitAuditTransaction' => 'DiffusionCommitActionTransaction', + 'DiffusionCommitAuditorsHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitAuditorsTransaction' => 'DiffusionCommitTransactionType', + 'DiffusionCommitAuthorHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitAuthorPackagesHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitAuthorProjectsHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitAutocloseHeraldField' => 'DiffusionCommitHeraldField', 'DiffusionCommitBranchesController' => 'DiffusionController', - 'DiffusionCommitChangeTableView' => 'DiffusionView', + 'DiffusionCommitBranchesHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitBuildableTransaction' => 'DiffusionCommitTransactionType', + 'DiffusionCommitCommitterHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitCommitterPackagesHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitCommitterProjectsHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitConcernTransaction' => 'DiffusionCommitAuditTransaction', 'DiffusionCommitController' => 'DiffusionController', + 'DiffusionCommitDiffContentAddedHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitDiffContentHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitDiffContentRemovedHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitDiffEnormousHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitDraftEngine' => 'PhabricatorDraftEngine', + 'DiffusionCommitEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', 'DiffusionCommitEditController' => 'DiffusionController', - 'DiffusionCommitParentsQuery' => 'DiffusionQuery', + 'DiffusionCommitEditEngine' => 'PhabricatorEditEngine', + 'DiffusionCommitFerretEngine' => 'PhabricatorFerretEngine', + 'DiffusionCommitFulltextEngine' => 'PhabricatorFulltextEngine', + 'DiffusionCommitGraphView' => 'DiffusionView', + 'DiffusionCommitHasPackageEdgeType' => 'PhabricatorEdgeType', + 'DiffusionCommitHasRevisionEdgeType' => 'PhabricatorEdgeType', + 'DiffusionCommitHasRevisionRelationship' => 'DiffusionCommitRelationship', + 'DiffusionCommitHasTaskEdgeType' => 'PhabricatorEdgeType', + 'DiffusionCommitHasTaskRelationship' => 'DiffusionCommitRelationship', + 'DiffusionCommitHash' => 'Phobject', + 'DiffusionCommitHeraldField' => 'HeraldField', + 'DiffusionCommitHeraldFieldGroup' => 'HeraldFieldGroup', + 'DiffusionCommitHintQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'DiffusionCommitHookEngine' => 'Phobject', + 'DiffusionCommitHookRejectException' => 'Exception', + 'DiffusionCommitListController' => 'DiffusionController', + 'DiffusionCommitMergeHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitMessageHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitPackageAuditHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitPackageHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitPackageOwnerHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitParentsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 'DiffusionCommitQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'DiffusionCommitRef' => 'Phobject', + 'DiffusionCommitRelationship' => 'PhabricatorObjectRelationship', + 'DiffusionCommitRelationshipSource' => 'PhabricatorObjectRelationshipSource', + 'DiffusionCommitRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'DiffusionCommitRemarkupRuleTestCase' => 'PhabricatorTestCase', + 'DiffusionCommitRepositoryHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitRepositoryProjectsHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitRequiredActionResultBucket' => 'DiffusionCommitResultBucket', + 'DiffusionCommitResignTransaction' => 'DiffusionCommitAuditTransaction', + 'DiffusionCommitResultBucket' => 'PhabricatorSearchResultBucket', + 'DiffusionCommitRevertedByCommitEdgeType' => 'PhabricatorEdgeType', + 'DiffusionCommitRevertsCommitEdgeType' => 'PhabricatorEdgeType', + 'DiffusionCommitReviewerHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitRevisionAcceptedHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitRevisionAcceptingReviewersHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitRevisionHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitRevisionQuery' => 'Phobject', + 'DiffusionCommitRevisionReviewersHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitRevisionSubscribersHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCommitSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'DiffusionCommitStateTransaction' => 'DiffusionCommitTransactionType', 'DiffusionCommitTagsController' => 'DiffusionController', + 'DiffusionCommitTimelineEngine' => 'PhabricatorTimelineEngine', + 'DiffusionCommitTransactionType' => 'PhabricatorModularTransactionType', + 'DiffusionCommitVerifyTransaction' => 'DiffusionCommitAuditTransaction', + 'DiffusionCommitWrongBuildsHeraldField' => 'DiffusionCommitHeraldField', + 'DiffusionCompareController' => 'DiffusionController', + 'DiffusionConduitAPIMethod' => 'ConduitAPIMethod', 'DiffusionController' => 'PhabricatorController', + 'DiffusionCreateRepositoriesCapability' => 'PhabricatorPolicyCapability', + 'DiffusionDaemonLockException' => 'Exception', + 'DiffusionDatasourceEngineExtension' => 'PhabricatorDatasourceEngineExtension', + 'DiffusionDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'DiffusionDefaultPushCapability' => 'PhabricatorPolicyCapability', + 'DiffusionDefaultViewCapability' => 'PhabricatorPolicyCapability', 'DiffusionDiffController' => 'DiffusionController', + 'DiffusionDiffInlineCommentQuery' => 'PhabricatorDiffInlineCommentQuery', + 'DiffusionDiffQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionDocumentController' => 'DiffusionController', + 'DiffusionDocumentRenderingEngine' => 'PhabricatorDocumentRenderingEngine', 'DiffusionDoorkeeperCommitFeedStoryPublisher' => 'DoorkeeperFeedStoryPublisher', 'DiffusionEmptyResultView' => 'DiffusionView', - 'DiffusionExpandCommitQueryException' => 'Exception', - 'DiffusionExpandShortNameQuery' => 'DiffusionQuery', + 'DiffusionExistsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 'DiffusionExternalController' => 'DiffusionController', - 'DiffusionFileContentQuery' => 'DiffusionQuery', + 'DiffusionExternalSymbolQuery' => 'Phobject', + 'DiffusionExternalSymbolsSource' => 'Phobject', + 'DiffusionFileContentQuery' => 'DiffusionFileFutureQuery', + 'DiffusionFileContentQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionFileFutureQuery' => 'DiffusionQuery', + 'DiffusionFindSymbolsConduitAPIMethod' => 'DiffusionConduitAPIMethod', + 'DiffusionGetLintMessagesConduitAPIMethod' => 'DiffusionConduitAPIMethod', + 'DiffusionGetRecentCommitsByPathConduitAPIMethod' => 'DiffusionConduitAPIMethod', + 'DiffusionGitBlameQuery' => 'DiffusionBlameQuery', + 'DiffusionGitBranch' => 'Phobject', 'DiffusionGitBranchTestCase' => 'PhabricatorTestCase', - 'DiffusionGitCommitParentsQuery' => 'DiffusionCommitParentsQuery', - 'DiffusionGitExpandShortNameQuery' => 'DiffusionExpandShortNameQuery', + 'DiffusionGitCommandEngine' => 'DiffusionCommandEngine', 'DiffusionGitFileContentQuery' => 'DiffusionFileContentQuery', + 'DiffusionGitLFSAuthenticateWorkflow' => 'DiffusionGitSSHWorkflow', + 'DiffusionGitLFSResponse' => 'AphrontResponse', + 'DiffusionGitLFSTemporaryTokenType' => 'PhabricatorAuthTemporaryTokenType', 'DiffusionGitRawDiffQuery' => 'DiffusionRawDiffQuery', + 'DiffusionGitReceivePackSSHWorkflow' => 'DiffusionGitSSHWorkflow', 'DiffusionGitRequest' => 'DiffusionRequest', - 'DiffusionGitStableCommitNameQuery' => 'DiffusionStableCommitNameQuery', + 'DiffusionGitResponse' => 'AphrontResponse', + 'DiffusionGitSSHWorkflow' => array( + 'DiffusionSSHWorkflow', + 'DiffusionRepositoryClusterEngineLogInterface', + ), + 'DiffusionGitUploadPackSSHWorkflow' => 'DiffusionGitSSHWorkflow', + 'DiffusionGitUploadPackWireProtocol' => 'DiffusionGitWireProtocol', + 'DiffusionGitWireProtocol' => 'Phobject', + 'DiffusionGitWireProtocolCapabilities' => 'Phobject', + 'DiffusionGitWireProtocolRef' => 'Phobject', + 'DiffusionGitWireProtocolRefList' => 'Phobject', 'DiffusionHistoryController' => 'DiffusionController', - 'DiffusionHistoryTableView' => 'DiffusionView', - 'DiffusionHomeController' => 'DiffusionController', - 'DiffusionHovercardEventListener' => 'PhutilEventListener', + 'DiffusionHistoryQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension', + 'DiffusionIdentityAssigneeDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'DiffusionIdentityAssigneeEditField' => 'PhabricatorTokenizerEditField', + 'DiffusionIdentityAssigneeSearchField' => 'PhabricatorSearchTokenizerField', + 'DiffusionIdentityEditController' => 'DiffusionController', + 'DiffusionIdentityListController' => 'DiffusionController', + 'DiffusionIdentityUnassignedDatasource' => 'PhabricatorTypeaheadDatasource', + 'DiffusionIdentityViewController' => 'DiffusionController', 'DiffusionInlineCommentController' => 'PhabricatorInlineCommentController', - 'DiffusionInlineCommentPreviewController' => 'PhabricatorInlineCommentPreviewController', + 'DiffusionInternalAncestorsConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionInternalCommitSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'DiffusionInternalCommitSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'DiffusionInternalGitRawDiffQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 'DiffusionLastModifiedController' => 'DiffusionController', + 'DiffusionLastModifiedQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 'DiffusionLintController' => 'DiffusionController', - 'DiffusionLintDetailsController' => 'DiffusionController', - 'DiffusionMercurialCommitParentsQuery' => 'DiffusionCommitParentsQuery', - 'DiffusionMercurialExpandShortNameQuery' => 'DiffusionExpandShortNameQuery', + 'DiffusionLintCountQuery' => 'PhabricatorQuery', + 'DiffusionLintSaveRunner' => 'Phobject', + 'DiffusionLocalRepositoryFilter' => 'Phobject', + 'DiffusionLogController' => 'DiffusionController', + 'DiffusionLookSoonConduitAPIMethod' => 'DiffusionConduitAPIMethod', + 'DiffusionLowLevelCommitFieldsQuery' => 'DiffusionLowLevelQuery', + 'DiffusionLowLevelCommitQuery' => 'DiffusionLowLevelQuery', + 'DiffusionLowLevelFilesizeQuery' => 'DiffusionLowLevelQuery', + 'DiffusionLowLevelGitRefQuery' => 'DiffusionLowLevelQuery', + 'DiffusionLowLevelMercurialBranchesQuery' => 'DiffusionLowLevelQuery', + 'DiffusionLowLevelMercurialPathsQuery' => 'DiffusionLowLevelQuery', + 'DiffusionLowLevelParentsQuery' => 'DiffusionLowLevelQuery', + 'DiffusionLowLevelQuery' => 'Phobject', + 'DiffusionLowLevelResolveRefsQuery' => 'DiffusionLowLevelQuery', + 'DiffusionMercurialBlameQuery' => 'DiffusionBlameQuery', + 'DiffusionMercurialCommandEngine' => 'DiffusionCommandEngine', + 'DiffusionMercurialCommandEngineTests' => 'PhabricatorTestCase', 'DiffusionMercurialFileContentQuery' => 'DiffusionFileContentQuery', + 'DiffusionMercurialFlagInjectionException' => 'Exception', 'DiffusionMercurialRawDiffQuery' => 'DiffusionRawDiffQuery', 'DiffusionMercurialRequest' => 'DiffusionRequest', - 'DiffusionMercurialStableCommitNameQuery' => 'DiffusionStableCommitNameQuery', + 'DiffusionMercurialResponse' => 'AphrontResponse', + 'DiffusionMercurialSSHWorkflow' => 'DiffusionSSHWorkflow', + 'DiffusionMercurialServeSSHWorkflow' => 'DiffusionMercurialSSHWorkflow', + 'DiffusionMercurialWireClientSSHProtocolChannel' => 'PhutilProtocolChannel', + 'DiffusionMercurialWireProtocol' => 'Phobject', + 'DiffusionMercurialWireProtocolTests' => 'PhabricatorTestCase', + 'DiffusionMercurialWireSSHTestCase' => 'PhabricatorTestCase', + 'DiffusionMergedCommitsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionPathChange' => 'Phobject', + 'DiffusionPathChangeQuery' => 'Phobject', 'DiffusionPathCompleteController' => 'DiffusionController', + 'DiffusionPathIDQuery' => 'Phobject', + 'DiffusionPathQuery' => 'Phobject', 'DiffusionPathQueryTestCase' => 'PhabricatorTestCase', + 'DiffusionPathTreeController' => 'DiffusionController', 'DiffusionPathValidateController' => 'DiffusionController', + 'DiffusionPatternSearchView' => 'DiffusionView', + 'DiffusionPhpExternalSymbolsSource' => 'DiffusionExternalSymbolsSource', + 'DiffusionPreCommitContentAffectedFilesHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentAuthorHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentAuthorPackagesHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentAuthorProjectsHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentAuthorRawHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentBranchesHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentCommitterHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentCommitterPackagesHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentCommitterProjectsHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentCommitterRawHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentDiffContentAddedHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentDiffContentHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentDiffContentRemovedHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentDiffEnormousHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentHeraldField' => 'HeraldField', + 'DiffusionPreCommitContentMergeHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentMessageHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentPackageHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentPackageOwnerHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentPusherHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentPusherIsCommitterHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentPusherProjectsHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentRepositoryHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentRepositoryProjectsHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentRevisionAcceptedHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentRevisionAcceptingReviewersHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentRevisionHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentRevisionReviewersHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentRevisionSubscribersHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitContentWrongBuildsHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPreCommitRefChangeHeraldField' => 'DiffusionPreCommitRefHeraldField', + 'DiffusionPreCommitRefHeraldField' => 'HeraldField', + 'DiffusionPreCommitRefHeraldFieldGroup' => 'HeraldFieldGroup', + 'DiffusionPreCommitRefNameHeraldField' => 'DiffusionPreCommitRefHeraldField', + 'DiffusionPreCommitRefPusherHeraldField' => 'DiffusionPreCommitRefHeraldField', + 'DiffusionPreCommitRefPusherProjectsHeraldField' => 'DiffusionPreCommitRefHeraldField', + 'DiffusionPreCommitRefRepositoryHeraldField' => 'DiffusionPreCommitRefHeraldField', + 'DiffusionPreCommitRefRepositoryProjectsHeraldField' => 'DiffusionPreCommitRefHeraldField', + 'DiffusionPreCommitRefTypeHeraldField' => 'DiffusionPreCommitRefHeraldField', + 'DiffusionPreCommitUsesGitLFSHeraldField' => 'DiffusionPreCommitContentHeraldField', + 'DiffusionPullEventGarbageCollector' => 'PhabricatorGarbageCollector', + 'DiffusionPullLogListController' => 'DiffusionLogController', + 'DiffusionPullLogListView' => 'AphrontView', + 'DiffusionPullLogSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'DiffusionPushCapability' => 'PhabricatorPolicyCapability', + 'DiffusionPushEventViewController' => 'DiffusionLogController', + 'DiffusionPushLogListController' => 'DiffusionLogController', + 'DiffusionPushLogListView' => 'AphrontView', + 'DiffusionPythonExternalSymbolsSource' => 'DiffusionExternalSymbolsSource', 'DiffusionQuery' => 'PhabricatorQuery', - 'DiffusionRawDiffQuery' => 'DiffusionQuery', - 'DiffusionRemarkupRule' => 'PhabricatorRemarkupRuleObject', + 'DiffusionQueryCommitsConduitAPIMethod' => 'DiffusionConduitAPIMethod', + 'DiffusionQueryConduitAPIMethod' => 'DiffusionConduitAPIMethod', + 'DiffusionQueryPathsConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionRawDiffQuery' => 'DiffusionFileFutureQuery', + 'DiffusionRawDiffQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionReadmeView' => 'DiffusionView', + 'DiffusionRefDatasource' => 'PhabricatorTypeaheadDatasource', + 'DiffusionRefNotFoundException' => 'Exception', + 'DiffusionRefTableController' => 'DiffusionController', + 'DiffusionRefsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionRenameHistoryQuery' => 'Phobject', + 'DiffusionRepositoryAutomationManagementPanel' => 'DiffusionRepositoryManagementPanel', + 'DiffusionRepositoryBasicsManagementPanel' => 'DiffusionRepositoryManagementPanel', + 'DiffusionRepositoryBranchesManagementPanel' => 'DiffusionRepositoryManagementPanel', + 'DiffusionRepositoryByIDRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'DiffusionRepositoryClusterEngine' => 'Phobject', 'DiffusionRepositoryController' => 'DiffusionController', - 'DiffusionRepositoryCreateController' => 'DiffusionController', - 'DiffusionRepositoryEditBasicController' => 'DiffusionController', - 'DiffusionRepositoryEditController' => 'DiffusionController', - 'DiffusionRepositoryEditEncodingController' => 'DiffusionController', - 'DiffusionSetupException' => 'AphrontUsageException', - 'DiffusionStableCommitNameQuery' => 'DiffusionQuery', - 'DiffusionSvnCommitParentsQuery' => 'DiffusionCommitParentsQuery', + 'DiffusionRepositoryDatasource' => 'PhabricatorTypeaheadDatasource', + 'DiffusionRepositoryDefaultController' => 'DiffusionController', + 'DiffusionRepositoryEditActivateController' => 'DiffusionRepositoryManageController', + 'DiffusionRepositoryEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'DiffusionRepositoryEditController' => 'DiffusionRepositoryManageController', + 'DiffusionRepositoryEditDangerousController' => 'DiffusionRepositoryManageController', + 'DiffusionRepositoryEditDeleteController' => 'DiffusionRepositoryManageController', + 'DiffusionRepositoryEditEngine' => 'PhabricatorEditEngine', + 'DiffusionRepositoryEditEnormousController' => 'DiffusionRepositoryManageController', + 'DiffusionRepositoryEditPublishingController' => 'DiffusionRepositoryManageController', + 'DiffusionRepositoryEditUpdateController' => 'DiffusionRepositoryManageController', + 'DiffusionRepositoryFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'DiffusionRepositoryHistoryManagementPanel' => 'DiffusionRepositoryManagementPanel', + 'DiffusionRepositoryIdentityDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', + 'DiffusionRepositoryIdentityEditor' => 'PhabricatorApplicationTransactionEditor', + 'DiffusionRepositoryIdentityEngine' => 'Phobject', + 'DiffusionRepositoryIdentitySearchEngine' => 'PhabricatorApplicationSearchEngine', + 'DiffusionRepositoryLimitsManagementPanel' => 'DiffusionRepositoryManagementPanel', + 'DiffusionRepositoryListController' => 'DiffusionController', + 'DiffusionRepositoryManageController' => 'DiffusionController', + 'DiffusionRepositoryManagePanelsController' => 'DiffusionRepositoryManageController', + 'DiffusionRepositoryManagementBuildsPanelGroup' => 'DiffusionRepositoryManagementPanelGroup', + 'DiffusionRepositoryManagementIntegrationsPanelGroup' => 'DiffusionRepositoryManagementPanelGroup', + 'DiffusionRepositoryManagementMainPanelGroup' => 'DiffusionRepositoryManagementPanelGroup', + 'DiffusionRepositoryManagementOtherPanelGroup' => 'DiffusionRepositoryManagementPanelGroup', + 'DiffusionRepositoryManagementPanel' => 'Phobject', + 'DiffusionRepositoryManagementPanelGroup' => 'Phobject', + 'DiffusionRepositoryMetricsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'DiffusionRepositoryPath' => 'Phobject', + 'DiffusionRepositoryPoliciesManagementPanel' => 'DiffusionRepositoryManagementPanel', + 'DiffusionRepositoryProfilePictureController' => 'DiffusionController', + 'DiffusionRepositoryRef' => 'Phobject', + 'DiffusionRepositoryRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'DiffusionRepositorySearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'DiffusionRepositoryStagingManagementPanel' => 'DiffusionRepositoryManagementPanel', + 'DiffusionRepositoryStorageManagementPanel' => 'DiffusionRepositoryManagementPanel', + 'DiffusionRepositorySubversionManagementPanel' => 'DiffusionRepositoryManagementPanel', + 'DiffusionRepositorySymbolsManagementPanel' => 'DiffusionRepositoryManagementPanel', + 'DiffusionRepositoryTag' => 'Phobject', + 'DiffusionRepositoryTestAutomationController' => 'DiffusionRepositoryManageController', + 'DiffusionRepositoryURICredentialController' => 'DiffusionController', + 'DiffusionRepositoryURIDisableController' => 'DiffusionController', + 'DiffusionRepositoryURIEditController' => 'DiffusionController', + 'DiffusionRepositoryURIViewController' => 'DiffusionController', + 'DiffusionRepositoryURIsIndexEngineExtension' => 'PhabricatorIndexEngineExtension', + 'DiffusionRepositoryURIsManagementPanel' => 'DiffusionRepositoryManagementPanel', + 'DiffusionRepositoryURIsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'DiffusionRequest' => 'Phobject', + 'DiffusionResolveRefsConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionResolveUserQuery' => 'Phobject', + 'DiffusionSSHWorkflow' => 'PhabricatorSSHWorkflow', + 'DiffusionSearchQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionServeController' => 'DiffusionController', + 'DiffusionServiceRef' => 'Phobject', + 'DiffusionSetPasswordSettingsPanel' => 'PhabricatorSettingsPanel', + 'DiffusionSetupException' => 'Exception', + 'DiffusionSourceHyperlinkEngineExtension' => 'PhabricatorRemarkupHyperlinkEngineExtension', + 'DiffusionSourceLinkRemarkupRule' => 'PhutilRemarkupRule', + 'DiffusionSourceLinkView' => 'AphrontView', + 'DiffusionSubversionCommandEngine' => 'DiffusionCommandEngine', + 'DiffusionSubversionSSHWorkflow' => 'DiffusionSSHWorkflow', + 'DiffusionSubversionServeSSHWorkflow' => 'DiffusionSubversionSSHWorkflow', + 'DiffusionSubversionWireProtocol' => 'Phobject', + 'DiffusionSubversionWireProtocolTestCase' => 'PhabricatorTestCase', + 'DiffusionSvnBlameQuery' => 'DiffusionBlameQuery', 'DiffusionSvnFileContentQuery' => 'DiffusionFileContentQuery', 'DiffusionSvnRawDiffQuery' => 'DiffusionRawDiffQuery', 'DiffusionSvnRequest' => 'DiffusionRequest', - 'DiffusionSvnStableCommitNameQuery' => 'DiffusionStableCommitNameQuery', 'DiffusionSymbolController' => 'DiffusionController', + 'DiffusionSymbolDatasource' => 'PhabricatorTypeaheadDatasource', 'DiffusionSymbolQuery' => 'PhabricatorOffsetPagedQuery', + 'DiffusionSyncLogListController' => 'DiffusionLogController', + 'DiffusionSyncLogListView' => 'AphrontView', + 'DiffusionSyncLogSearchEngine' => 'PhabricatorApplicationSearchEngine', 'DiffusionTagListController' => 'DiffusionController', 'DiffusionTagListView' => 'DiffusionView', - 'DiffusionURITestCase' => 'ArcanistPhutilTestCase', + 'DiffusionTaggedRepositoriesFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'DiffusionTagsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', + 'DiffusionURIEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'DiffusionURIEditEngine' => 'PhabricatorEditEngine', + 'DiffusionURIEditor' => 'PhabricatorApplicationTransactionEditor', + 'DiffusionURITestCase' => 'PhutilTestCase', + 'DiffusionUpdateCoverageConduitAPIMethod' => 'DiffusionConduitAPIMethod', + 'DiffusionUpdateObjectAfterCommitWorker' => 'PhabricatorWorker', 'DiffusionView' => 'AphrontView', 'DivinerArticleAtomizer' => 'DivinerAtomizer', + 'DivinerAtom' => 'Phobject', 'DivinerAtomCache' => 'DivinerDiskCache', 'DivinerAtomController' => 'DivinerController', - 'DivinerAtomListController' => - array( - 0 => 'DivinerController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), + 'DivinerAtomListController' => 'DivinerController', + 'DivinerAtomPHIDType' => 'PhabricatorPHIDType', 'DivinerAtomQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'DivinerAtomRef' => 'Phobject', 'DivinerAtomSearchEngine' => 'PhabricatorApplicationSearchEngine', 'DivinerAtomizeWorkflow' => 'DivinerWorkflow', + 'DivinerAtomizer' => 'Phobject', 'DivinerBookController' => 'DivinerController', + 'DivinerBookDatasource' => 'PhabricatorTypeaheadDatasource', + 'DivinerBookEditController' => 'DivinerController', + 'DivinerBookItemView' => 'AphrontTagView', + 'DivinerBookPHIDType' => 'PhabricatorPHIDType', 'DivinerBookQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'DivinerController' => 'PhabricatorController', 'DivinerDAO' => 'PhabricatorLiskDAO', + 'DivinerDefaultEditCapability' => 'PhabricatorPolicyCapability', 'DivinerDefaultRenderer' => 'DivinerRenderer', + 'DivinerDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'DivinerDiskCache' => 'Phobject', 'DivinerFileAtomizer' => 'DivinerAtomizer', 'DivinerFindController' => 'DivinerController', 'DivinerGenerateWorkflow' => 'DivinerWorkflow', - 'DivinerLegacyController' => 'DivinerController', 'DivinerLiveAtom' => 'DivinerDAO', - 'DivinerLiveBook' => - array( - 0 => 'DivinerDAO', - 1 => 'PhabricatorPolicyInterface', + 'DivinerLiveBook' => array( + 'DivinerDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorProjectInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorFulltextInterface', ), + 'DivinerLiveBookEditor' => 'PhabricatorApplicationTransactionEditor', + 'DivinerLiveBookFulltextEngine' => 'PhabricatorFulltextEngine', + 'DivinerLiveBookTransaction' => 'PhabricatorApplicationTransaction', + 'DivinerLiveBookTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'DivinerLivePublisher' => 'DivinerPublisher', - 'DivinerLiveSymbol' => - array( - 0 => 'DivinerDAO', - 1 => 'PhabricatorPolicyInterface', - 2 => 'PhabricatorMarkupInterface', - ), - 'DivinerPHIDTypeAtom' => 'PhabricatorPHIDType', - 'DivinerPHIDTypeBook' => 'PhabricatorPHIDType', + 'DivinerLiveSymbol' => array( + 'DivinerDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorMarkupInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorFulltextInterface', + ), + 'DivinerLiveSymbolFulltextEngine' => 'PhabricatorFulltextEngine', + 'DivinerMainController' => 'DivinerController', + 'DivinerPHPAtomizer' => 'DivinerAtomizer', + 'DivinerParameterTableView' => 'AphrontTagView', 'DivinerPublishCache' => 'DivinerDiskCache', - 'DivinerRemarkupRuleSymbol' => 'PhutilRemarkupRule', + 'DivinerPublisher' => 'Phobject', + 'DivinerRenderer' => 'Phobject', + 'DivinerReturnTableView' => 'AphrontTagView', + 'DivinerSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'DivinerSectionView' => 'AphrontTagView', 'DivinerStaticPublisher' => 'DivinerPublisher', - 'DivinerWorkflow' => 'PhutilArgumentWorkflow', + 'DivinerSymbolRemarkupRule' => 'PhutilRemarkupRule', + 'DivinerWorkflow' => 'PhabricatorManagementWorkflow', + 'DoorkeeperAsanaFeedWorker' => 'DoorkeeperFeedWorker', 'DoorkeeperBridge' => 'Phobject', 'DoorkeeperBridgeAsana' => 'DoorkeeperBridge', + 'DoorkeeperBridgeGitHub' => 'DoorkeeperBridge', + 'DoorkeeperBridgeGitHubIssue' => 'DoorkeeperBridgeGitHub', + 'DoorkeeperBridgeGitHubUser' => 'DoorkeeperBridgeGitHub', + 'DoorkeeperBridgeJIRA' => 'DoorkeeperBridge', + 'DoorkeeperBridgeJIRATestCase' => 'PhabricatorTestCase', + 'DoorkeeperBridgedObjectCurtainExtension' => 'PHUICurtainExtension', 'DoorkeeperDAO' => 'PhabricatorLiskDAO', - 'DoorkeeperExternalObject' => - array( - 0 => 'DoorkeeperDAO', - 1 => 'PhabricatorPolicyInterface', + 'DoorkeeperExternalObject' => array( + 'DoorkeeperDAO', + 'PhabricatorPolicyInterface', ), + 'DoorkeeperExternalObjectPHIDType' => 'PhabricatorPHIDType', 'DoorkeeperExternalObjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'DoorkeeperFeedWorkerAsana' => 'FeedPushWorker', + 'DoorkeeperFeedStoryPublisher' => 'Phobject', + 'DoorkeeperFeedWorker' => 'FeedPushWorker', + 'DoorkeeperHyperlinkEngineExtension' => 'PhabricatorRemarkupHyperlinkEngineExtension', 'DoorkeeperImportEngine' => 'Phobject', + 'DoorkeeperJIRAFeedWorker' => 'DoorkeeperFeedWorker', + 'DoorkeeperMissingLinkException' => 'Exception', 'DoorkeeperObjectRef' => 'Phobject', - 'DoorkeeperRemarkupRuleAsana' => 'PhutilRemarkupRule', + 'DoorkeeperSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'DoorkeeperTagView' => 'AphrontView', 'DoorkeeperTagsController' => 'PhabricatorController', - 'DrydockAllocatorWorker' => 'PhabricatorWorker', + 'DoorkeeperURIRef' => 'Phobject', + 'DrydockAcquiredBrokenResourceException' => 'Exception', + 'DrydockAlmanacServiceHostBlueprintImplementation' => 'DrydockBlueprintImplementation', 'DrydockApacheWebrootInterface' => 'DrydockWebrootInterface', + 'DrydockAuthorization' => array( + 'DrydockDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorConduitResultInterface', + ), + 'DrydockAuthorizationAuthorizeController' => 'DrydockController', + 'DrydockAuthorizationListController' => 'DrydockController', + 'DrydockAuthorizationListView' => 'AphrontView', + 'DrydockAuthorizationPHIDType' => 'PhabricatorPHIDType', + 'DrydockAuthorizationQuery' => 'DrydockQuery', + 'DrydockAuthorizationSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'DrydockAuthorizationSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'DrydockAuthorizationViewController' => 'DrydockController', + 'DrydockBlueprint' => array( + 'DrydockDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorCustomFieldInterface', + 'PhabricatorNgramsInterface', + 'PhabricatorProjectInterface', + 'PhabricatorConduitResultInterface', + ), + 'DrydockBlueprintController' => 'DrydockController', + 'DrydockBlueprintCoreCustomField' => array( + 'DrydockBlueprintCustomField', + 'PhabricatorStandardCustomFieldInterface', + ), + 'DrydockBlueprintCustomField' => 'PhabricatorCustomField', + 'DrydockBlueprintDatasource' => 'PhabricatorTypeaheadDatasource', + 'DrydockBlueprintDisableController' => 'DrydockBlueprintController', + 'DrydockBlueprintDisableTransaction' => 'DrydockBlueprintTransactionType', + 'DrydockBlueprintEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'DrydockBlueprintEditController' => 'DrydockBlueprintController', + 'DrydockBlueprintEditEngine' => 'PhabricatorEditEngine', + 'DrydockBlueprintEditor' => 'PhabricatorApplicationTransactionEditor', + 'DrydockBlueprintImplementation' => 'Phobject', + 'DrydockBlueprintImplementationTestCase' => 'PhabricatorTestCase', + 'DrydockBlueprintListController' => 'DrydockBlueprintController', + 'DrydockBlueprintNameNgrams' => 'PhabricatorSearchNgrams', + 'DrydockBlueprintNameTransaction' => 'DrydockBlueprintTransactionType', + 'DrydockBlueprintPHIDType' => 'PhabricatorPHIDType', + 'DrydockBlueprintQuery' => 'DrydockQuery', + 'DrydockBlueprintSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'DrydockBlueprintSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'DrydockBlueprintTransaction' => 'PhabricatorModularTransaction', + 'DrydockBlueprintTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'DrydockBlueprintTransactionType' => 'PhabricatorModularTransactionType', + 'DrydockBlueprintTypeTransaction' => 'DrydockBlueprintTransactionType', + 'DrydockBlueprintViewController' => 'DrydockBlueprintController', + 'DrydockCommand' => array( + 'DrydockDAO', + 'PhabricatorPolicyInterface', + ), + 'DrydockCommandError' => 'Phobject', 'DrydockCommandInterface' => 'DrydockInterface', + 'DrydockCommandQuery' => 'DrydockQuery', + 'DrydockConsoleController' => 'DrydockController', 'DrydockController' => 'PhabricatorController', + 'DrydockCreateBlueprintsCapability' => 'PhabricatorPolicyCapability', 'DrydockDAO' => 'PhabricatorLiskDAO', - 'DrydockLease' => 'DrydockDAO', - 'DrydockLeaseListController' => 'DrydockController', - 'DrydockLeaseQuery' => 'PhabricatorOffsetPagedQuery', - 'DrydockLeaseReleaseController' => 'DrydockController', - 'DrydockLeaseStatus' => 'DrydockConstants', - 'DrydockLeaseViewController' => 'DrydockController', - 'DrydockLocalCommandInterface' => 'DrydockCommandInterface', - 'DrydockLocalHostBlueprint' => 'DrydockBlueprint', - 'DrydockLog' => 'DrydockDAO', + 'DrydockDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'DrydockDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'DrydockFilesystemInterface' => 'DrydockInterface', + 'DrydockInterface' => 'Phobject', + 'DrydockLandRepositoryOperation' => 'DrydockRepositoryOperationType', + 'DrydockLease' => array( + 'DrydockDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorConduitResultInterface', + ), + 'DrydockLeaseAcquiredLogType' => 'DrydockLogType', + 'DrydockLeaseActivatedLogType' => 'DrydockLogType', + 'DrydockLeaseActivationFailureLogType' => 'DrydockLogType', + 'DrydockLeaseActivationYieldLogType' => 'DrydockLogType', + 'DrydockLeaseAllocationFailureLogType' => 'DrydockLogType', + 'DrydockLeaseController' => 'DrydockController', + 'DrydockLeaseDatasource' => 'PhabricatorTypeaheadDatasource', + 'DrydockLeaseDestroyedLogType' => 'DrydockLogType', + 'DrydockLeaseListController' => 'DrydockLeaseController', + 'DrydockLeaseListView' => 'AphrontView', + 'DrydockLeaseNoAuthorizationsLogType' => 'DrydockLogType', + 'DrydockLeaseNoBlueprintsLogType' => 'DrydockLogType', + 'DrydockLeasePHIDType' => 'PhabricatorPHIDType', + 'DrydockLeaseQuery' => 'DrydockQuery', + 'DrydockLeaseQueuedLogType' => 'DrydockLogType', + 'DrydockLeaseReacquireLogType' => 'DrydockLogType', + 'DrydockLeaseReclaimLogType' => 'DrydockLogType', + 'DrydockLeaseReleaseController' => 'DrydockLeaseController', + 'DrydockLeaseReleasedLogType' => 'DrydockLogType', + 'DrydockLeaseSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'DrydockLeaseSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'DrydockLeaseStatus' => 'PhabricatorObjectStatus', + 'DrydockLeaseUpdateWorker' => 'DrydockWorker', + 'DrydockLeaseViewController' => 'DrydockLeaseController', + 'DrydockLeaseWaitingForActivationLogType' => 'DrydockLogType', + 'DrydockLeaseWaitingForReclamationLogType' => 'DrydockLogType', + 'DrydockLeaseWaitingForResourcesLogType' => 'DrydockLogType', + 'DrydockLog' => array( + 'DrydockDAO', + 'PhabricatorPolicyInterface', + ), 'DrydockLogController' => 'DrydockController', - 'DrydockLogQuery' => 'PhabricatorOffsetPagedQuery', - 'DrydockManagementCloseWorkflow' => 'DrydockManagementWorkflow', + 'DrydockLogGarbageCollector' => 'PhabricatorGarbageCollector', + 'DrydockLogListController' => 'DrydockLogController', + 'DrydockLogListView' => 'AphrontView', + 'DrydockLogQuery' => 'DrydockQuery', + 'DrydockLogSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'DrydockLogType' => 'Phobject', + 'DrydockManagementCommandWorkflow' => 'DrydockManagementWorkflow', 'DrydockManagementLeaseWorkflow' => 'DrydockManagementWorkflow', - 'DrydockManagementReleaseWorkflow' => 'DrydockManagementWorkflow', - 'DrydockManagementWaitForLeaseWorkflow' => 'DrydockManagementWorkflow', - 'DrydockManagementWorkflow' => 'PhutilArgumentWorkflow', - 'DrydockResource' => 'DrydockDAO', - 'DrydockResourceCloseController' => 'DrydockController', - 'DrydockResourceListController' => 'DrydockController', - 'DrydockResourceQuery' => 'PhabricatorOffsetPagedQuery', - 'DrydockResourceStatus' => 'DrydockConstants', - 'DrydockResourceViewController' => 'DrydockController', + 'DrydockManagementReclaimWorkflow' => 'DrydockManagementWorkflow', + 'DrydockManagementReleaseLeaseWorkflow' => 'DrydockManagementWorkflow', + 'DrydockManagementReleaseResourceWorkflow' => 'DrydockManagementWorkflow', + 'DrydockManagementUpdateLeaseWorkflow' => 'DrydockManagementWorkflow', + 'DrydockManagementUpdateResourceWorkflow' => 'DrydockManagementWorkflow', + 'DrydockManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'DrydockObjectAuthorizationView' => 'AphrontView', + 'DrydockOperationWorkLogType' => 'DrydockLogType', + 'DrydockQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'DrydockRepositoryOperation' => array( + 'DrydockDAO', + 'PhabricatorPolicyInterface', + ), + 'DrydockRepositoryOperationController' => 'DrydockController', + 'DrydockRepositoryOperationDismissController' => 'DrydockRepositoryOperationController', + 'DrydockRepositoryOperationListController' => 'DrydockRepositoryOperationController', + 'DrydockRepositoryOperationPHIDType' => 'PhabricatorPHIDType', + 'DrydockRepositoryOperationQuery' => 'DrydockQuery', + 'DrydockRepositoryOperationSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'DrydockRepositoryOperationStatusController' => 'DrydockRepositoryOperationController', + 'DrydockRepositoryOperationStatusView' => 'AphrontView', + 'DrydockRepositoryOperationType' => 'Phobject', + 'DrydockRepositoryOperationUpdateWorker' => 'DrydockWorker', + 'DrydockRepositoryOperationViewController' => 'DrydockRepositoryOperationController', + 'DrydockResource' => array( + 'DrydockDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorConduitResultInterface', + ), + 'DrydockResourceActivationFailureLogType' => 'DrydockLogType', + 'DrydockResourceActivationYieldLogType' => 'DrydockLogType', + 'DrydockResourceAllocationFailureLogType' => 'DrydockLogType', + 'DrydockResourceController' => 'DrydockController', + 'DrydockResourceDatasource' => 'PhabricatorTypeaheadDatasource', + 'DrydockResourceListController' => 'DrydockResourceController', + 'DrydockResourceListView' => 'AphrontView', + 'DrydockResourceLockException' => 'Exception', + 'DrydockResourcePHIDType' => 'PhabricatorPHIDType', + 'DrydockResourceQuery' => 'DrydockQuery', + 'DrydockResourceReclaimLogType' => 'DrydockLogType', + 'DrydockResourceReleaseController' => 'DrydockResourceController', + 'DrydockResourceSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'DrydockResourceSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'DrydockResourceStatus' => 'PhabricatorObjectStatus', + 'DrydockResourceUpdateWorker' => 'DrydockWorker', + 'DrydockResourceViewController' => 'DrydockResourceController', + 'DrydockSFTPFilesystemInterface' => 'DrydockFilesystemInterface', 'DrydockSSHCommandInterface' => 'DrydockCommandInterface', + 'DrydockSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'DrydockSlotLock' => 'DrydockDAO', + 'DrydockSlotLockException' => 'Exception', + 'DrydockSlotLockFailureLogType' => 'DrydockLogType', + 'DrydockTestRepositoryOperation' => 'DrydockRepositoryOperationType', + 'DrydockTextLogType' => 'DrydockLogType', 'DrydockWebrootInterface' => 'DrydockInterface', - 'DrydockWorkingCopyBlueprint' => 'DrydockBlueprint', + 'DrydockWorker' => 'PhabricatorWorker', + 'DrydockWorkingCopyBlueprintImplementation' => 'DrydockBlueprintImplementation', + 'EdgeSearchConduitAPIMethod' => 'ConduitAPIMethod', + 'FeedConduitAPIMethod' => 'ConduitAPIMethod', 'FeedPublisherHTTPWorker' => 'FeedPushWorker', 'FeedPublisherWorker' => 'FeedPushWorker', 'FeedPushWorker' => 'PhabricatorWorker', - 'FilesCreateMailReceiver' => 'PhabricatorMailReceiver', + 'FeedQueryConduitAPIMethod' => 'FeedConduitAPIMethod', + 'FeedStoryNotificationGarbageCollector' => 'PhabricatorGarbageCollector', + 'FerretConfigurableSearchFunction' => 'FerretSearchFunction', + 'FerretSearchFunction' => 'Phobject', + 'FileAllocateConduitAPIMethod' => 'FileConduitAPIMethod', + 'FileConduitAPIMethod' => 'ConduitAPIMethod', + 'FileCreateMailReceiver' => 'PhabricatorApplicationMailReceiver', + 'FileDeletionWorker' => 'PhabricatorWorker', + 'FileDownloadConduitAPIMethod' => 'FileConduitAPIMethod', + 'FileInfoConduitAPIMethod' => 'FileConduitAPIMethod', + 'FileMailReceiver' => 'PhabricatorObjectMailReceiver', + 'FileQueryChunksConduitAPIMethod' => 'FileConduitAPIMethod', + 'FileReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'FileTypeIcon' => 'Phobject', + 'FileUploadChunkConduitAPIMethod' => 'FileConduitAPIMethod', + 'FileUploadConduitAPIMethod' => 'FileConduitAPIMethod', + 'FileUploadHashConduitAPIMethod' => 'FileConduitAPIMethod', + 'FilesDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'FlagConduitAPIMethod' => 'ConduitAPIMethod', + 'FlagDeleteConduitAPIMethod' => 'FlagConduitAPIMethod', + 'FlagEditConduitAPIMethod' => 'FlagConduitAPIMethod', + 'FlagQueryConduitAPIMethod' => 'FlagConduitAPIMethod', + 'FuelComponentView' => 'FuelView', + 'FuelGridCellView' => 'FuelComponentView', + 'FuelGridRowView' => 'FuelView', + 'FuelGridView' => 'FuelComponentView', + 'FuelHandleListItemView' => 'FuelView', + 'FuelHandleListView' => 'FuelComponentView', + 'FuelMapItemView' => 'AphrontView', + 'FuelMapView' => 'FuelComponentView', + 'FuelMenuItemView' => 'FuelView', + 'FuelMenuView' => 'FuelComponentView', + 'FuelView' => 'AphrontView', + 'FundBacker' => array( + 'FundDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + ), + 'FundBackerCart' => 'PhortuneCartImplementation', + 'FundBackerEditor' => 'PhabricatorApplicationTransactionEditor', + 'FundBackerListController' => 'FundController', + 'FundBackerPHIDType' => 'PhabricatorPHIDType', + 'FundBackerProduct' => 'PhortuneProductImplementation', + 'FundBackerQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'FundBackerRefundTransaction' => 'FundBackerTransactionType', + 'FundBackerSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'FundBackerStatusTransaction' => 'FundBackerTransactionType', + 'FundBackerTransaction' => 'PhabricatorModularTransaction', + 'FundBackerTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'FundBackerTransactionType' => 'PhabricatorModularTransactionType', + 'FundController' => 'PhabricatorController', + 'FundCreateInitiativesCapability' => 'PhabricatorPolicyCapability', + 'FundDAO' => 'PhabricatorLiskDAO', + 'FundDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'FundInitiative' => array( + 'FundDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorProjectInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorMentionableInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + ), + 'FundInitiativeBackController' => 'FundController', + 'FundInitiativeBackerTransaction' => 'FundInitiativeTransactionType', + 'FundInitiativeCloseController' => 'FundController', + 'FundInitiativeDescriptionTransaction' => 'FundInitiativeTransactionType', + 'FundInitiativeEditController' => 'FundController', + 'FundInitiativeEditEngine' => 'PhabricatorEditEngine', + 'FundInitiativeEditor' => 'PhabricatorApplicationTransactionEditor', + 'FundInitiativeFerretEngine' => 'PhabricatorFerretEngine', + 'FundInitiativeFulltextEngine' => 'PhabricatorFulltextEngine', + 'FundInitiativeListController' => 'FundController', + 'FundInitiativeMerchantTransaction' => 'FundInitiativeTransactionType', + 'FundInitiativeNameTransaction' => 'FundInitiativeTransactionType', + 'FundInitiativePHIDType' => 'PhabricatorPHIDType', + 'FundInitiativeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'FundInitiativeRefundTransaction' => 'FundInitiativeTransactionType', + 'FundInitiativeRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'FundInitiativeReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'FundInitiativeRisksTransaction' => 'FundInitiativeTransactionType', + 'FundInitiativeSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'FundInitiativeStatusTransaction' => 'FundInitiativeTransactionType', + 'FundInitiativeTransaction' => 'PhabricatorModularTransaction', + 'FundInitiativeTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'FundInitiativeTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'FundInitiativeTransactionType' => 'PhabricatorModularTransactionType', + 'FundInitiativeViewController' => 'FundController', + 'FundSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'HarbormasterAbortOlderBuildsBuildStepImplementation' => 'HarbormasterBuildStepImplementation', + 'HarbormasterArcLintBuildStepImplementation' => 'HarbormasterBuildStepImplementation', + 'HarbormasterArcUnitBuildStepImplementation' => 'HarbormasterBuildStepImplementation', + 'HarbormasterArtifact' => 'Phobject', + 'HarbormasterArtifactSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'HarbormasterArtifactSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'HarbormasterAutotargetsTestCase' => 'PhabricatorTestCase', + 'HarbormasterBuild' => array( + 'HarbormasterDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorDestructibleInterface', + ), + 'HarbormasterBuildAbortedException' => 'Exception', + 'HarbormasterBuildActionController' => 'HarbormasterController', + 'HarbormasterBuildArcanistAutoplan' => 'HarbormasterBuildAutoplan', + 'HarbormasterBuildArtifact' => array( + 'HarbormasterDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorConduitResultInterface', + ), + 'HarbormasterBuildArtifactPHIDType' => 'PhabricatorPHIDType', + 'HarbormasterBuildArtifactQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HarbormasterBuildAutoplan' => 'Phobject', + 'HarbormasterBuildDependencyDatasource' => 'PhabricatorTypeaheadDatasource', + 'HarbormasterBuildEditAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'HarbormasterBuildEditEngine' => 'PhabricatorEditEngine', + 'HarbormasterBuildEngine' => 'Phobject', + 'HarbormasterBuildFailureException' => 'Exception', + 'HarbormasterBuildGraph' => 'AbstractDirectedGraph', + 'HarbormasterBuildInitiatorDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'HarbormasterBuildLintMessage' => 'HarbormasterDAO', + 'HarbormasterBuildListController' => 'HarbormasterController', + 'HarbormasterBuildLog' => array( + 'HarbormasterDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorConduitResultInterface', + ), + 'HarbormasterBuildLogChunk' => 'HarbormasterDAO', + 'HarbormasterBuildLogChunkIterator' => 'PhutilBufferedIterator', + 'HarbormasterBuildLogDownloadController' => 'HarbormasterController', + 'HarbormasterBuildLogPHIDType' => 'PhabricatorPHIDType', + 'HarbormasterBuildLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HarbormasterBuildLogRenderController' => 'HarbormasterController', + 'HarbormasterBuildLogSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'HarbormasterBuildLogSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'HarbormasterBuildLogTestCase' => 'PhabricatorTestCase', + 'HarbormasterBuildLogView' => 'AphrontView', + 'HarbormasterBuildLogViewController' => 'HarbormasterController', + 'HarbormasterBuildMessage' => array( + 'HarbormasterDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + ), + 'HarbormasterBuildMessageAbortTransaction' => 'HarbormasterBuildMessageTransaction', + 'HarbormasterBuildMessagePauseTransaction' => 'HarbormasterBuildMessageTransaction', + 'HarbormasterBuildMessageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HarbormasterBuildMessageRestartTransaction' => 'HarbormasterBuildMessageTransaction', + 'HarbormasterBuildMessageResumeTransaction' => 'HarbormasterBuildMessageTransaction', + 'HarbormasterBuildMessageTransaction' => 'HarbormasterBuildTransactionType', + 'HarbormasterBuildPHIDType' => 'PhabricatorPHIDType', + 'HarbormasterBuildPlan' => array( + 'HarbormasterDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorNgramsInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorProjectInterface', + 'PhabricatorPolicyCodexInterface', + ), + 'HarbormasterBuildPlanBehavior' => 'Phobject', + 'HarbormasterBuildPlanBehaviorOption' => 'Phobject', + 'HarbormasterBuildPlanBehaviorTransaction' => 'HarbormasterBuildPlanTransactionType', + 'HarbormasterBuildPlanDatasource' => 'PhabricatorTypeaheadDatasource', + 'HarbormasterBuildPlanDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'HarbormasterBuildPlanDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'HarbormasterBuildPlanEditAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'HarbormasterBuildPlanEditEngine' => 'PhabricatorEditEngine', + 'HarbormasterBuildPlanEditor' => 'PhabricatorApplicationTransactionEditor', + 'HarbormasterBuildPlanNameNgrams' => 'PhabricatorSearchNgrams', + 'HarbormasterBuildPlanNameTransaction' => 'HarbormasterBuildPlanTransactionType', + 'HarbormasterBuildPlanPHIDType' => 'PhabricatorPHIDType', + 'HarbormasterBuildPlanPolicyCodex' => 'PhabricatorPolicyCodex', + 'HarbormasterBuildPlanQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HarbormasterBuildPlanSearchAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'HarbormasterBuildPlanSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'HarbormasterBuildPlanStatusTransaction' => 'HarbormasterBuildPlanTransactionType', + 'HarbormasterBuildPlanTransaction' => 'PhabricatorModularTransaction', + 'HarbormasterBuildPlanTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'HarbormasterBuildPlanTransactionType' => 'PhabricatorModularTransactionType', + 'HarbormasterBuildQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HarbormasterBuildRequest' => 'Phobject', + 'HarbormasterBuildSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'HarbormasterBuildSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'HarbormasterBuildStatus' => 'Phobject', + 'HarbormasterBuildStatusDatasource' => 'PhabricatorTypeaheadDatasource', + 'HarbormasterBuildStep' => array( + 'HarbormasterDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorCustomFieldInterface', + 'PhabricatorConduitResultInterface', + ), + 'HarbormasterBuildStepCoreCustomField' => array( + 'HarbormasterBuildStepCustomField', + 'PhabricatorStandardCustomFieldInterface', + ), + 'HarbormasterBuildStepCustomField' => 'PhabricatorCustomField', + 'HarbormasterBuildStepEditAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'HarbormasterBuildStepEditEngine' => 'PhabricatorEditEngine', + 'HarbormasterBuildStepEditor' => 'PhabricatorApplicationTransactionEditor', + 'HarbormasterBuildStepGroup' => 'Phobject', + 'HarbormasterBuildStepImplementation' => 'Phobject', + 'HarbormasterBuildStepImplementationTestCase' => 'PhabricatorTestCase', + 'HarbormasterBuildStepPHIDType' => 'PhabricatorPHIDType', + 'HarbormasterBuildStepQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HarbormasterBuildStepSearchAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'HarbormasterBuildStepSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'HarbormasterBuildStepTransaction' => 'PhabricatorApplicationTransaction', + 'HarbormasterBuildStepTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'HarbormasterBuildTarget' => array( + 'HarbormasterDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorConduitResultInterface', + ), + 'HarbormasterBuildTargetPHIDType' => 'PhabricatorPHIDType', + 'HarbormasterBuildTargetQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HarbormasterBuildTargetSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'HarbormasterBuildTransaction' => 'PhabricatorModularTransaction', + 'HarbormasterBuildTransactionEditor' => 'PhabricatorApplicationTransactionEditor', + 'HarbormasterBuildTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'HarbormasterBuildTransactionType' => 'PhabricatorModularTransactionType', + 'HarbormasterBuildUnitMessage' => array( + 'HarbormasterDAO', + 'PhabricatorPolicyInterface', + ), + 'HarbormasterBuildUnitMessageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HarbormasterBuildView' => 'AphrontView', + 'HarbormasterBuildViewController' => 'HarbormasterController', + 'HarbormasterBuildWorker' => 'HarbormasterWorker', + 'HarbormasterBuildable' => array( + 'HarbormasterDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'HarbormasterBuildableInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorDestructibleInterface', + ), + 'HarbormasterBuildableActionController' => 'HarbormasterController', + 'HarbormasterBuildableEditAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'HarbormasterBuildableEditEngine' => 'PhabricatorEditEngine', + 'HarbormasterBuildableEngine' => 'Phobject', + 'HarbormasterBuildableListController' => 'HarbormasterController', + 'HarbormasterBuildableMessageTransaction' => 'HarbormasterBuildableTransactionType', + 'HarbormasterBuildablePHIDType' => 'PhabricatorPHIDType', + 'HarbormasterBuildableQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HarbormasterBuildableSearchAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'HarbormasterBuildableSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'HarbormasterBuildableStatus' => 'Phobject', + 'HarbormasterBuildableTransaction' => 'PhabricatorModularTransaction', + 'HarbormasterBuildableTransactionEditor' => 'PhabricatorApplicationTransactionEditor', + 'HarbormasterBuildableTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'HarbormasterBuildableTransactionType' => 'PhabricatorModularTransactionType', + 'HarbormasterBuildableViewController' => 'HarbormasterController', + 'HarbormasterBuildkiteBuildStepImplementation' => 'HarbormasterBuildStepImplementation', + 'HarbormasterBuildkiteHookController' => 'HarbormasterController', + 'HarbormasterBuiltinBuildStepGroup' => 'HarbormasterBuildStepGroup', + 'HarbormasterCircleCIBuildStepImplementation' => 'HarbormasterBuildStepImplementation', + 'HarbormasterCircleCIHookController' => 'HarbormasterController', + 'HarbormasterConduitAPIMethod' => 'ConduitAPIMethod', + 'HarbormasterControlBuildStepGroup' => 'HarbormasterBuildStepGroup', + 'HarbormasterController' => 'PhabricatorController', + 'HarbormasterCreateArtifactConduitAPIMethod' => 'HarbormasterConduitAPIMethod', + 'HarbormasterCreatePlansCapability' => 'PhabricatorPolicyCapability', 'HarbormasterDAO' => 'PhabricatorLiskDAO', + 'HarbormasterDrydockBuildStepGroup' => 'HarbormasterBuildStepGroup', + 'HarbormasterDrydockCommandBuildStepImplementation' => 'HarbormasterBuildStepImplementation', + 'HarbormasterDrydockLeaseArtifact' => 'HarbormasterArtifact', + 'HarbormasterExecFuture' => 'Future', + 'HarbormasterExternalBuildStepGroup' => 'HarbormasterBuildStepGroup', + 'HarbormasterFileArtifact' => 'HarbormasterArtifact', + 'HarbormasterHTTPRequestBuildStepImplementation' => 'HarbormasterBuildStepImplementation', + 'HarbormasterHostArtifact' => 'HarbormasterDrydockLeaseArtifact', + 'HarbormasterLeaseWorkingCopyBuildStepImplementation' => 'HarbormasterBuildStepImplementation', + 'HarbormasterLintMessagesController' => 'HarbormasterController', + 'HarbormasterLintPropertyView' => 'AphrontView', + 'HarbormasterLogWorker' => 'HarbormasterWorker', + 'HarbormasterManagementArchiveLogsWorkflow' => 'HarbormasterManagementWorkflow', + 'HarbormasterManagementBuildWorkflow' => 'HarbormasterManagementWorkflow', + 'HarbormasterManagementPublishWorkflow' => 'HarbormasterManagementWorkflow', + 'HarbormasterManagementRebuildLogWorkflow' => 'HarbormasterManagementWorkflow', + 'HarbormasterManagementRestartWorkflow' => 'HarbormasterManagementWorkflow', + 'HarbormasterManagementUpdateWorkflow' => 'HarbormasterManagementWorkflow', + 'HarbormasterManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'HarbormasterManagementWriteLogWorkflow' => 'HarbormasterManagementWorkflow', + 'HarbormasterMessageException' => 'Exception', + 'HarbormasterMessageType' => 'Phobject', 'HarbormasterObject' => 'HarbormasterDAO', - 'HarbormasterRunnerWorker' => 'PhabricatorWorker', + 'HarbormasterOtherBuildStepGroup' => 'HarbormasterBuildStepGroup', + 'HarbormasterPlanBehaviorController' => 'HarbormasterPlanController', + 'HarbormasterPlanController' => 'HarbormasterController', + 'HarbormasterPlanDisableController' => 'HarbormasterPlanController', + 'HarbormasterPlanEditController' => 'HarbormasterPlanController', + 'HarbormasterPlanListController' => 'HarbormasterPlanController', + 'HarbormasterPlanRunController' => 'HarbormasterPlanController', + 'HarbormasterPlanViewController' => 'HarbormasterPlanController', + 'HarbormasterPrototypeBuildStepGroup' => 'HarbormasterBuildStepGroup', + 'HarbormasterQueryAutotargetsConduitAPIMethod' => 'HarbormasterConduitAPIMethod', + 'HarbormasterQueryBuildablesConduitAPIMethod' => 'HarbormasterConduitAPIMethod', + 'HarbormasterQueryBuildsConduitAPIMethod' => 'HarbormasterConduitAPIMethod', + 'HarbormasterQueryBuildsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'HarbormasterRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'HarbormasterRunBuildPlansHeraldAction' => 'HeraldAction', + 'HarbormasterSchemaSpec' => 'PhabricatorConfigSchemaSpec', 'HarbormasterScratchTable' => 'HarbormasterDAO', - 'HeraldAction' => 'HeraldDAO', - 'HeraldApplyTranscript' => 'HeraldDAO', - 'HeraldCommitAdapter' => 'HeraldAdapter', + 'HarbormasterSendMessageConduitAPIMethod' => 'HarbormasterConduitAPIMethod', + 'HarbormasterSleepBuildStepImplementation' => 'HarbormasterBuildStepImplementation', + 'HarbormasterStepAddController' => 'HarbormasterPlanController', + 'HarbormasterStepDeleteController' => 'HarbormasterPlanController', + 'HarbormasterStepEditController' => 'HarbormasterPlanController', + 'HarbormasterStepViewController' => 'HarbormasterPlanController', + 'HarbormasterString' => 'HarbormasterDAO', + 'HarbormasterTargetEngine' => 'Phobject', + 'HarbormasterTargetSearchAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'HarbormasterTargetWorker' => 'HarbormasterWorker', + 'HarbormasterTestBuildStepGroup' => 'HarbormasterBuildStepGroup', + 'HarbormasterThrowExceptionBuildStep' => 'HarbormasterBuildStepImplementation', + 'HarbormasterUIEventListener' => 'PhabricatorEventListener', + 'HarbormasterURIArtifact' => 'HarbormasterArtifact', + 'HarbormasterUnitMessageListController' => 'HarbormasterController', + 'HarbormasterUnitMessageViewController' => 'HarbormasterController', + 'HarbormasterUnitPropertyView' => 'AphrontView', + 'HarbormasterUnitStatus' => 'Phobject', + 'HarbormasterUnitSummaryView' => 'AphrontView', + 'HarbormasterUploadArtifactBuildStepImplementation' => 'HarbormasterBuildStepImplementation', + 'HarbormasterWaitForPreviousBuildStepImplementation' => 'HarbormasterBuildStepImplementation', + 'HarbormasterWorker' => 'PhabricatorWorker', + 'HarbormasterWorkingCopyArtifact' => 'HarbormasterDrydockLeaseArtifact', + 'HeraldActingUserField' => 'HeraldField', + 'HeraldAction' => 'Phobject', + 'HeraldActionGroup' => 'HeraldGroup', + 'HeraldActionRecord' => 'HeraldDAO', + 'HeraldAdapter' => 'Phobject', + 'HeraldAdapterDatasource' => 'PhabricatorTypeaheadDatasource', + 'HeraldAlwaysField' => 'HeraldField', + 'HeraldAnotherRuleField' => 'HeraldField', + 'HeraldApplicationActionGroup' => 'HeraldActionGroup', + 'HeraldApplyTranscript' => 'Phobject', + 'HeraldBasicFieldGroup' => 'HeraldFieldGroup', + 'HeraldBoolFieldValue' => 'HeraldFieldValue', + 'HeraldBuildableState' => 'HeraldState', + 'HeraldCallWebhookAction' => 'HeraldAction', + 'HeraldCommentAction' => 'HeraldAction', + 'HeraldCommentContentField' => 'HeraldField', + 'HeraldCommitAdapter' => array( + 'HeraldAdapter', + 'HarbormasterBuildableAdapterInterface', + ), 'HeraldCondition' => 'HeraldDAO', + 'HeraldConditionResult' => 'HeraldTranscriptResult', + 'HeraldConditionTranscript' => 'Phobject', + 'HeraldContentSourceField' => 'HeraldField', 'HeraldController' => 'PhabricatorController', + 'HeraldCoreStateReasons' => 'HeraldStateReasons', + 'HeraldCreateWebhooksCapability' => 'PhabricatorPolicyCapability', 'HeraldDAO' => 'PhabricatorLiskDAO', - 'HeraldDeleteController' => 'HeraldController', - 'HeraldDifferentialRevisionAdapter' => 'HeraldAdapter', - 'HeraldEditLogQuery' => 'PhabricatorOffsetPagedQuery', + 'HeraldDeprecatedFieldGroup' => 'HeraldFieldGroup', + 'HeraldDifferentialAdapter' => 'HeraldAdapter', + 'HeraldDifferentialDiffAdapter' => 'HeraldDifferentialAdapter', + 'HeraldDifferentialRevisionAdapter' => array( + 'HeraldDifferentialAdapter', + 'HarbormasterBuildableAdapterInterface', + ), + 'HeraldDisableController' => 'HeraldController', + 'HeraldDoNothingAction' => 'HeraldAction', + 'HeraldEditFieldGroup' => 'HeraldFieldGroup', + 'HeraldEffect' => 'Phobject', + 'HeraldEmptyFieldValue' => 'HeraldFieldValue', + 'HeraldEngine' => 'Phobject', + 'HeraldExactProjectsField' => 'HeraldField', + 'HeraldField' => 'Phobject', + 'HeraldFieldGroup' => 'HeraldGroup', + 'HeraldFieldTestCase' => 'PhutilTestCase', + 'HeraldFieldValue' => 'Phobject', + 'HeraldGroup' => 'Phobject', 'HeraldInvalidActionException' => 'Exception', 'HeraldInvalidConditionException' => 'Exception', - 'HeraldInvalidFieldException' => 'Exception', + 'HeraldMailableState' => 'HeraldState', + 'HeraldManageGlobalRulesCapability' => 'PhabricatorPolicyCapability', + 'HeraldManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'HeraldManiphestTaskAdapter' => 'HeraldAdapter', 'HeraldNewController' => 'HeraldController', - 'HeraldPHIDTypeRule' => 'PhabricatorPHIDType', + 'HeraldNewObjectField' => 'HeraldField', + 'HeraldNotifyActionGroup' => 'HeraldActionGroup', + 'HeraldObjectTranscript' => 'Phobject', + 'HeraldPhameBlogAdapter' => 'HeraldAdapter', + 'HeraldPhamePostAdapter' => 'HeraldAdapter', + 'HeraldPholioMockAdapter' => 'HeraldAdapter', + 'HeraldPonderQuestionAdapter' => 'HeraldAdapter', + 'HeraldPreCommitAdapter' => 'HeraldAdapter', + 'HeraldPreCommitContentAdapter' => 'HeraldPreCommitAdapter', + 'HeraldPreCommitRefAdapter' => 'HeraldPreCommitAdapter', + 'HeraldPreventActionGroup' => 'HeraldActionGroup', + 'HeraldProjectsField' => 'PhabricatorProjectTagsField', 'HeraldRecursiveConditionsException' => 'Exception', - 'HeraldRule' => - array( - 0 => 'HeraldDAO', - 1 => 'PhabricatorPolicyInterface', + 'HeraldRelatedFieldGroup' => 'HeraldFieldGroup', + 'HeraldRemarkupFieldValue' => 'HeraldFieldValue', + 'HeraldRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'HeraldRule' => array( + 'HeraldDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorIndexableInterface', + 'PhabricatorSubscribableInterface', ), + 'HeraldRuleActionAffectsObjectEdgeType' => 'PhabricatorEdgeType', + 'HeraldRuleAdapter' => 'HeraldAdapter', + 'HeraldRuleAdapterField' => 'HeraldRuleField', 'HeraldRuleController' => 'HeraldController', - 'HeraldRuleEdit' => 'HeraldDAO', - 'HeraldRuleEditHistoryController' => 'HeraldController', - 'HeraldRuleEditHistoryView' => 'AphrontView', - 'HeraldRuleListController' => - array( - 0 => 'HeraldController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), + 'HeraldRuleDatasource' => 'PhabricatorTypeaheadDatasource', + 'HeraldRuleDisableTransaction' => 'HeraldRuleTransactionType', + 'HeraldRuleEditTransaction' => 'HeraldRuleTransactionType', + 'HeraldRuleEditor' => 'PhabricatorApplicationTransactionEditor', + 'HeraldRuleEvaluationException' => 'Exception', + 'HeraldRuleField' => 'HeraldField', + 'HeraldRuleFieldGroup' => 'HeraldFieldGroup', + 'HeraldRuleIndexEngineExtension' => 'PhabricatorEdgeIndexEngineExtension', + 'HeraldRuleListController' => 'HeraldController', + 'HeraldRuleListView' => 'AphrontView', + 'HeraldRuleManagementWorkflow' => 'HeraldManagementWorkflow', + 'HeraldRuleNameTransaction' => 'HeraldRuleTransactionType', + 'HeraldRulePHIDType' => 'PhabricatorPHIDType', 'HeraldRuleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HeraldRuleReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'HeraldRuleResult' => 'HeraldTranscriptResult', 'HeraldRuleSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'HeraldRuleTransaction' => 'PhabricatorApplicationTransaction', - 'HeraldRuleTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'HeraldRuleSerializer' => 'Phobject', + 'HeraldRuleTestCase' => 'PhabricatorTestCase', + 'HeraldRuleTransaction' => 'PhabricatorModularTransaction', + 'HeraldRuleTransactionType' => 'PhabricatorModularTransactionType', + 'HeraldRuleTranscript' => 'Phobject', + 'HeraldRuleTypeConfig' => 'Phobject', + 'HeraldRuleTypeDatasource' => 'PhabricatorTypeaheadDatasource', + 'HeraldRuleTypeField' => 'HeraldRuleField', 'HeraldRuleViewController' => 'HeraldController', + 'HeraldSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'HeraldSelectFieldValue' => 'HeraldFieldValue', + 'HeraldSpaceField' => 'HeraldField', + 'HeraldState' => 'Phobject', + 'HeraldStateReasons' => 'Phobject', + 'HeraldSubscribersField' => 'HeraldField', + 'HeraldSupportActionGroup' => 'HeraldActionGroup', + 'HeraldSupportFieldGroup' => 'HeraldFieldGroup', 'HeraldTestConsoleController' => 'HeraldController', - 'HeraldTranscript' => 'HeraldDAO', + 'HeraldTestManagementWorkflow' => 'HeraldManagementWorkflow', + 'HeraldTextFieldValue' => 'HeraldFieldValue', + 'HeraldTokenizerFieldValue' => 'HeraldFieldValue', + 'HeraldTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'HeraldTransactionsFieldGroup' => 'HeraldFieldGroup', + 'HeraldTranscript' => array( + 'HeraldDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + ), 'HeraldTranscriptController' => 'HeraldController', + 'HeraldTranscriptDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', + 'HeraldTranscriptGarbageCollector' => 'PhabricatorGarbageCollector', 'HeraldTranscriptListController' => 'HeraldController', - 'JavelinReactorExample' => 'PhabricatorUIExample', - 'JavelinUIExample' => 'PhabricatorUIExample', - 'JavelinViewExample' => 'PhabricatorUIExample', - 'JavelinViewExampleServerView' => 'AphrontView', + 'HeraldTranscriptPHIDType' => 'PhabricatorPHIDType', + 'HeraldTranscriptQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HeraldTranscriptResult' => 'Phobject', + 'HeraldTranscriptSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'HeraldTranscriptTestCase' => 'PhabricatorTestCase', + 'HeraldUtilityActionGroup' => 'HeraldActionGroup', + 'HeraldWebhook' => array( + 'HeraldDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorProjectInterface', + ), + 'HeraldWebhookCallManagementWorkflow' => 'HeraldWebhookManagementWorkflow', + 'HeraldWebhookController' => 'HeraldController', + 'HeraldWebhookDatasource' => 'PhabricatorTypeaheadDatasource', + 'HeraldWebhookEditController' => 'HeraldWebhookController', + 'HeraldWebhookEditEngine' => 'PhabricatorEditEngine', + 'HeraldWebhookEditor' => 'PhabricatorApplicationTransactionEditor', + 'HeraldWebhookKeyController' => 'HeraldWebhookController', + 'HeraldWebhookListController' => 'HeraldWebhookController', + 'HeraldWebhookManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'HeraldWebhookNameTransaction' => 'HeraldWebhookTransactionType', + 'HeraldWebhookPHIDType' => 'PhabricatorPHIDType', + 'HeraldWebhookQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HeraldWebhookRequest' => array( + 'HeraldDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + ), + 'HeraldWebhookRequestGarbageCollector' => 'PhabricatorGarbageCollector', + 'HeraldWebhookRequestListView' => 'AphrontView', + 'HeraldWebhookRequestPHIDType' => 'PhabricatorPHIDType', + 'HeraldWebhookRequestQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'HeraldWebhookSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'HeraldWebhookStatusTransaction' => 'HeraldWebhookTransactionType', + 'HeraldWebhookTestController' => 'HeraldWebhookController', + 'HeraldWebhookTransaction' => 'PhabricatorModularTransaction', + 'HeraldWebhookTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'HeraldWebhookTransactionType' => 'PhabricatorModularTransactionType', + 'HeraldWebhookURITransaction' => 'HeraldWebhookTransactionType', + 'HeraldWebhookViewController' => 'HeraldWebhookController', + 'HeraldWebhookWorker' => 'PhabricatorWorker', + 'Javelin' => 'Phobject', 'LegalpadController' => 'PhabricatorController', + 'LegalpadCreateDocumentsCapability' => 'PhabricatorPolicyCapability', 'LegalpadDAO' => 'PhabricatorLiskDAO', - 'LegalpadDocument' => - array( - 0 => 'LegalpadDAO', - 1 => 'PhabricatorPolicyInterface', - 2 => 'PhabricatorSubscribableInterface', - 3 => 'PhabricatorApplicationTransactionInterface', - ), - 'LegalpadDocumentBody' => - array( - 0 => 'LegalpadDAO', - 1 => 'PhabricatorMarkupInterface', - ), - 'LegalpadDocumentCommentController' => 'LegalpadController', + 'LegalpadDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'LegalpadDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'LegalpadDocument' => array( + 'LegalpadDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorDestructibleInterface', + ), + 'LegalpadDocumentBody' => array( + 'LegalpadDAO', + 'PhabricatorMarkupInterface', + ), + 'LegalpadDocumentDatasource' => 'PhabricatorTypeaheadDatasource', + 'LegalpadDocumentDoneController' => 'LegalpadController', 'LegalpadDocumentEditController' => 'LegalpadController', + 'LegalpadDocumentEditEngine' => 'PhabricatorEditEngine', 'LegalpadDocumentEditor' => 'PhabricatorApplicationTransactionEditor', - 'LegalpadDocumentListController' => - array( - 0 => 'LegalpadController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), + 'LegalpadDocumentListController' => 'LegalpadController', + 'LegalpadDocumentManageController' => 'LegalpadController', + 'LegalpadDocumentPreambleTransaction' => 'LegalpadDocumentTransactionType', 'LegalpadDocumentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'LegalpadDocumentRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'LegalpadDocumentRequireSignatureTransaction' => 'LegalpadDocumentTransactionType', 'LegalpadDocumentSearchEngine' => 'PhabricatorApplicationSearchEngine', 'LegalpadDocumentSignController' => 'LegalpadController', - 'LegalpadDocumentSignature' => 'LegalpadDAO', - 'LegalpadDocumentViewController' => 'LegalpadController', - 'LegalpadMockMailReceiver' => 'PhabricatorObjectMailReceiver', - 'LegalpadReplyHandler' => 'PhabricatorMailReplyHandler', - 'LegalpadTransaction' => 'PhabricatorApplicationTransaction', + 'LegalpadDocumentSignature' => array( + 'LegalpadDAO', + 'PhabricatorPolicyInterface', + ), + 'LegalpadDocumentSignatureAddController' => 'LegalpadController', + 'LegalpadDocumentSignatureListController' => 'LegalpadController', + 'LegalpadDocumentSignatureQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'LegalpadDocumentSignatureSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'LegalpadDocumentSignatureTypeTransaction' => 'LegalpadDocumentTransactionType', + 'LegalpadDocumentSignatureVerificationController' => 'LegalpadController', + 'LegalpadDocumentSignatureViewController' => 'LegalpadController', + 'LegalpadDocumentTextTransaction' => 'LegalpadDocumentTransactionType', + 'LegalpadDocumentTitleTransaction' => 'LegalpadDocumentTransactionType', + 'LegalpadDocumentTransactionType' => 'PhabricatorModularTransactionType', + 'LegalpadMailReceiver' => 'PhabricatorObjectMailReceiver', + 'LegalpadObjectNeedsSignatureEdgeType' => 'PhabricatorEdgeType', + 'LegalpadReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'LegalpadRequireSignatureHeraldAction' => 'HeraldAction', + 'LegalpadSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'LegalpadSignatureNeededByObjectEdgeType' => 'PhabricatorEdgeType', + 'LegalpadTransaction' => 'PhabricatorModularTransaction', 'LegalpadTransactionComment' => 'PhabricatorApplicationTransactionComment', 'LegalpadTransactionQuery' => 'PhabricatorApplicationTransactionQuery', - 'LegalpadTransactionType' => 'LegalpadConstants', - 'LegalpadTransactionView' => 'PhabricatorApplicationTransactionView', 'LiskChunkTestCase' => 'PhabricatorTestCase', + 'LiskDAO' => array( + 'Phobject', + 'AphrontDatabaseTableRefInterface', + ), 'LiskDAOTestCase' => 'PhabricatorTestCase', 'LiskEphemeralObjectException' => 'Exception', 'LiskFixtureTestCase' => 'PhabricatorTestCase', @@ -2695,421 +7962,1477 @@ 'LiskIsolationTestDAOException' => 'Exception', 'LiskMigrationIterator' => 'PhutilBufferedIterator', 'LiskRawMigrationIterator' => 'PhutilBufferedIterator', - 'ManiphestAction' => 'ManiphestConstants', - 'ManiphestAuxiliaryFieldDefaultSpecification' => 'ManiphestAuxiliaryFieldSpecification', - 'ManiphestAuxiliaryFieldSpecification' => 'PhabricatorMarkupInterface', - 'ManiphestAuxiliaryFieldTypeException' => 'Exception', - 'ManiphestAuxiliaryFieldValidationException' => 'Exception', - 'ManiphestBatchEditController' => 'ManiphestController', + 'MacroConduitAPIMethod' => 'ConduitAPIMethod', + 'MacroCreateMemeConduitAPIMethod' => 'MacroConduitAPIMethod', + 'MacroEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'MacroEmojiExample' => 'PhabricatorUIExample', + 'MacroQueryConduitAPIMethod' => 'MacroConduitAPIMethod', + 'ManiphestAssignEmailCommand' => 'ManiphestEmailCommand', + 'ManiphestAssigneeDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'ManiphestBulkEditCapability' => 'PhabricatorPolicyCapability', + 'ManiphestBulkEditController' => 'ManiphestController', + 'ManiphestClaimEmailCommand' => 'ManiphestEmailCommand', + 'ManiphestCloseEmailCommand' => 'ManiphestEmailCommand', + 'ManiphestConduitAPIMethod' => 'ConduitAPIMethod', + 'ManiphestConfiguredCustomField' => array( + 'ManiphestCustomField', + 'PhabricatorStandardCustomFieldInterface', + ), + 'ManiphestConstants' => 'Phobject', 'ManiphestController' => 'PhabricatorController', - 'ManiphestCreateMailReceiver' => 'PhabricatorMailReceiver', + 'ManiphestCreateMailReceiver' => 'PhabricatorApplicationMailReceiver', + 'ManiphestCreateTaskConduitAPIMethod' => 'ManiphestConduitAPIMethod', + 'ManiphestCustomField' => 'PhabricatorCustomField', + 'ManiphestCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage', + 'ManiphestCustomFieldStatusParser' => 'PhabricatorCustomFieldMonogramParser', + 'ManiphestCustomFieldStatusParserTestCase' => 'PhabricatorTestCase', + 'ManiphestCustomFieldStorage' => 'PhabricatorCustomFieldStorage', + 'ManiphestCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage', 'ManiphestDAO' => 'PhabricatorLiskDAO', - 'ManiphestDefaultTaskExtensions' => 'ManiphestTaskExtensions', - 'ManiphestEdgeEventListener' => 'PhutilEventListener', - 'ManiphestExcelDefaultFormat' => 'ManiphestExcelFormat', - 'ManiphestExportController' => 'ManiphestController', - 'ManiphestHovercardEventListener' => 'PhutilEventListener', - 'ManiphestPHIDTypeTask' => 'PhabricatorPHIDType', - 'ManiphestPeopleMenuEventListener' => 'PhutilEventListener', - 'ManiphestRemarkupRule' => 'PhabricatorRemarkupRuleObject', - 'ManiphestReplyHandler' => 'PhabricatorMailReplyHandler', + 'ManiphestDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'ManiphestDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'ManiphestEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'ManiphestEditEngine' => 'PhabricatorEditEngine', + 'ManiphestEmailCommand' => 'MetaMTAEmailTransactionCommand', + 'ManiphestGetTaskTransactionsConduitAPIMethod' => 'ManiphestConduitAPIMethod', + 'ManiphestHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension', + 'ManiphestInfoConduitAPIMethod' => 'ManiphestConduitAPIMethod', + 'ManiphestMailEngineExtension' => 'PhabricatorMailEngineExtension', + 'ManiphestNameIndex' => 'ManiphestDAO', + 'ManiphestPointsConfigType' => 'PhabricatorJSONConfigType', + 'ManiphestPrioritiesConfigType' => 'PhabricatorJSONConfigType', + 'ManiphestPriorityEmailCommand' => 'ManiphestEmailCommand', + 'ManiphestPrioritySearchConduitAPIMethod' => 'ManiphestConduitAPIMethod', + 'ManiphestProjectNameFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension', + 'ManiphestQueryConduitAPIMethod' => 'ManiphestConduitAPIMethod', + 'ManiphestQueryStatusesConduitAPIMethod' => 'ManiphestConduitAPIMethod', + 'ManiphestRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'ManiphestReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 'ManiphestReportController' => 'ManiphestController', - 'ManiphestSavedQuery' => 'ManiphestDAO', - 'ManiphestSavedQueryDeleteController' => 'ManiphestController', - 'ManiphestSavedQueryEditController' => 'ManiphestController', - 'ManiphestSavedQueryListController' => 'ManiphestController', - 'ManiphestSearchIndexer' => 'PhabricatorSearchDocumentIndexer', - 'ManiphestSubpriorityController' => 'ManiphestController', - 'ManiphestSubscribeController' => 'ManiphestController', - 'ManiphestTask' => - array( - 0 => 'ManiphestDAO', - 1 => 'PhabricatorMarkupInterface', - 2 => 'PhabricatorPolicyInterface', - 3 => 'PhabricatorTokenReceiverInterface', - 4 => 'PhrequentTrackableInterface', - ), - 'ManiphestTaskAuxiliaryStorage' => 'ManiphestDAO', - 'ManiphestTaskDescriptionChangeController' => 'ManiphestController', - 'ManiphestTaskDescriptionPreviewController' => 'ManiphestController', + 'ManiphestSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'ManiphestSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'ManiphestStatusEmailCommand' => 'ManiphestEmailCommand', + 'ManiphestStatusSearchConduitAPIMethod' => 'ManiphestConduitAPIMethod', + 'ManiphestStatusesConfigType' => 'PhabricatorJSONConfigType', + 'ManiphestSubtypesConfigType' => 'PhabricatorJSONConfigType', + 'ManiphestTask' => array( + 'ManiphestDAO', + 'PhabricatorSubscribableInterface', + 'PhabricatorMarkupInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorMentionableInterface', + 'PhrequentTrackableInterface', + 'PhabricatorCustomFieldInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorProjectInterface', + 'PhabricatorSpacesInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + 'DoorkeeperBridgedObjectInterface', + 'PhabricatorEditEngineSubtypeInterface', + 'PhabricatorEditEngineLockableInterface', + 'PhabricatorEditEngineMFAInterface', + 'PhabricatorPolicyCodexInterface', + 'PhabricatorUnlockableInterface', + ), + 'ManiphestTaskAssignHeraldAction' => 'HeraldAction', + 'ManiphestTaskAssignOtherHeraldAction' => 'ManiphestTaskAssignHeraldAction', + 'ManiphestTaskAssignSelfHeraldAction' => 'ManiphestTaskAssignHeraldAction', + 'ManiphestTaskAssigneeHeraldField' => 'ManiphestTaskHeraldField', + 'ManiphestTaskAttachTransaction' => 'ManiphestTaskTransactionType', + 'ManiphestTaskAuthorHeraldField' => 'ManiphestTaskHeraldField', + 'ManiphestTaskAuthorPolicyRule' => 'PhabricatorPolicyRule', + 'ManiphestTaskBulkEngine' => 'PhabricatorBulkEngine', + 'ManiphestTaskCloseAsDuplicateRelationship' => 'ManiphestTaskRelationship', + 'ManiphestTaskClosedStatusDatasource' => 'PhabricatorTypeaheadDatasource', + 'ManiphestTaskCoverImageTransaction' => 'ManiphestTaskTransactionType', + 'ManiphestTaskDependedOnByTaskEdgeType' => 'PhabricatorEdgeType', + 'ManiphestTaskDependsOnTaskEdgeType' => 'PhabricatorEdgeType', + 'ManiphestTaskDescriptionHeraldField' => 'ManiphestTaskHeraldField', + 'ManiphestTaskDescriptionTransaction' => 'ManiphestTaskTransactionType', 'ManiphestTaskDetailController' => 'ManiphestController', + 'ManiphestTaskEdgeTransaction' => 'ManiphestTaskTransactionType', 'ManiphestTaskEditController' => 'ManiphestController', + 'ManiphestTaskEditEngineLock' => 'PhabricatorEditEngineLock', + 'ManiphestTaskFerretEngine' => 'PhabricatorFerretEngine', + 'ManiphestTaskFulltextEngine' => 'PhabricatorFulltextEngine', + 'ManiphestTaskGraph' => 'PhabricatorObjectGraph', + 'ManiphestTaskGraphController' => 'ManiphestController', + 'ManiphestTaskHasCommitEdgeType' => 'PhabricatorEdgeType', + 'ManiphestTaskHasCommitRelationship' => 'ManiphestTaskRelationship', + 'ManiphestTaskHasDuplicateTaskEdgeType' => 'PhabricatorEdgeType', + 'ManiphestTaskHasMockEdgeType' => 'PhabricatorEdgeType', + 'ManiphestTaskHasMockRelationship' => 'ManiphestTaskRelationship', + 'ManiphestTaskHasParentRelationship' => 'ManiphestTaskRelationship', + 'ManiphestTaskHasRevisionEdgeType' => 'PhabricatorEdgeType', + 'ManiphestTaskHasRevisionRelationship' => 'ManiphestTaskRelationship', + 'ManiphestTaskHasSubtaskRelationship' => 'ManiphestTaskRelationship', + 'ManiphestTaskHeraldField' => 'HeraldField', + 'ManiphestTaskHeraldFieldGroup' => 'HeraldFieldGroup', + 'ManiphestTaskIsDuplicateOfTaskEdgeType' => 'PhabricatorEdgeType', 'ManiphestTaskListController' => 'ManiphestController', + 'ManiphestTaskListHTTPParameterType' => 'AphrontListHTTPParameterType', 'ManiphestTaskListView' => 'ManiphestView', + 'ManiphestTaskMFAEngine' => 'PhabricatorEditEngineMFAEngine', 'ManiphestTaskMailReceiver' => 'PhabricatorObjectMailReceiver', - 'ManiphestTaskOwner' => 'ManiphestConstants', + 'ManiphestTaskMergeInRelationship' => 'ManiphestTaskRelationship', + 'ManiphestTaskMergedFromTransaction' => 'ManiphestTaskTransactionType', + 'ManiphestTaskMergedIntoTransaction' => 'ManiphestTaskTransactionType', + 'ManiphestTaskOpenStatusDatasource' => 'PhabricatorTypeaheadDatasource', + 'ManiphestTaskOwnerTransaction' => 'ManiphestTaskTransactionType', + 'ManiphestTaskPHIDResolver' => 'PhabricatorPHIDResolver', + 'ManiphestTaskPHIDType' => 'PhabricatorPHIDType', + 'ManiphestTaskParentTransaction' => 'ManiphestTaskTransactionType', + 'ManiphestTaskPoints' => 'Phobject', + 'ManiphestTaskPointsTransaction' => 'ManiphestTaskTransactionType', + 'ManiphestTaskPolicyCodex' => 'PhabricatorPolicyCodex', 'ManiphestTaskPriority' => 'ManiphestConstants', - 'ManiphestTaskProject' => 'ManiphestDAO', - 'ManiphestTaskProjectsView' => 'ManiphestView', - 'ManiphestTaskQuery' => 'PhabricatorQuery', + 'ManiphestTaskPriorityDatasource' => 'PhabricatorTypeaheadDatasource', + 'ManiphestTaskPriorityHeraldAction' => 'HeraldAction', + 'ManiphestTaskPriorityHeraldField' => 'ManiphestTaskHeraldField', + 'ManiphestTaskPriorityTransaction' => 'ManiphestTaskTransactionType', + 'ManiphestTaskQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'ManiphestTaskRelationship' => 'PhabricatorObjectRelationship', + 'ManiphestTaskRelationshipSource' => 'PhabricatorObjectRelationshipSource', + 'ManiphestTaskResultListView' => 'ManiphestView', + 'ManiphestTaskSearchEngine' => 'PhabricatorApplicationSearchEngine', 'ManiphestTaskStatus' => 'ManiphestConstants', - 'ManiphestTaskSubscriber' => 'ManiphestDAO', - 'ManiphestTransaction' => - array( - 0 => 'ManiphestDAO', - 1 => 'PhabricatorMarkupInterface', - ), - 'ManiphestTransactionDetailView' => 'ManiphestView', - 'ManiphestTransactionEditor' => 'PhabricatorEditor', - 'ManiphestTransactionListView' => 'ManiphestView', - 'ManiphestTransactionPreviewController' => 'ManiphestController', - 'ManiphestTransactionSaveController' => 'ManiphestController', - 'ManiphestTransactionType' => 'ManiphestConstants', + 'ManiphestTaskStatusDatasource' => 'PhabricatorTypeaheadDatasource', + 'ManiphestTaskStatusFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'ManiphestTaskStatusHeraldAction' => 'HeraldAction', + 'ManiphestTaskStatusHeraldField' => 'ManiphestTaskHeraldField', + 'ManiphestTaskStatusTestCase' => 'PhabricatorTestCase', + 'ManiphestTaskStatusTransaction' => 'ManiphestTaskTransactionType', + 'ManiphestTaskSubpriorityTransaction' => 'ManiphestTaskTransactionType', + 'ManiphestTaskSubtaskController' => 'ManiphestController', + 'ManiphestTaskSubtypeDatasource' => 'PhabricatorTypeaheadDatasource', + 'ManiphestTaskTitleHeraldField' => 'ManiphestTaskHeraldField', + 'ManiphestTaskTitleTransaction' => 'ManiphestTaskTransactionType', + 'ManiphestTaskTransactionType' => 'PhabricatorModularTransactionType', + 'ManiphestTaskUnblockTransaction' => 'ManiphestTaskTransactionType', + 'ManiphestTaskUnlockEngine' => 'PhabricatorUnlockEngine', + 'ManiphestTransaction' => 'PhabricatorModularTransaction', + 'ManiphestTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'ManiphestTransactionEditor' => 'PhabricatorApplicationTransactionEditor', + 'ManiphestTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'ManiphestUpdateConduitAPIMethod' => 'ManiphestConduitAPIMethod', 'ManiphestView' => 'AphrontView', - 'MetaMTANotificationType' => 'MetaMTAConstants', - 'MetaMTAReceivedMailStatus' => 'MetaMTAConstants', + 'MetaMTAEmailTransactionCommand' => 'Phobject', + 'MetaMTAEmailTransactionCommandTestCase' => 'PhabricatorTestCase', + 'MetaMTAMailReceivedGarbageCollector' => 'PhabricatorGarbageCollector', + 'MetaMTAMailSentGarbageCollector' => 'PhabricatorGarbageCollector', + 'MetaMTAReceivedMailStatus' => 'Phobject', + 'MultimeterContext' => 'MultimeterDimension', + 'MultimeterControl' => 'Phobject', + 'MultimeterController' => 'PhabricatorController', + 'MultimeterDAO' => 'PhabricatorLiskDAO', + 'MultimeterDimension' => 'MultimeterDAO', + 'MultimeterEvent' => 'MultimeterDAO', + 'MultimeterEventGarbageCollector' => 'PhabricatorGarbageCollector', + 'MultimeterHost' => 'MultimeterDimension', + 'MultimeterLabel' => 'MultimeterDimension', + 'MultimeterSampleController' => 'MultimeterController', + 'MultimeterViewer' => 'MultimeterDimension', + 'NuanceCommandImplementation' => 'Phobject', + 'NuanceConduitAPIMethod' => 'ConduitAPIMethod', + 'NuanceConsoleController' => 'NuanceController', + 'NuanceContentSource' => 'PhabricatorContentSource', + 'NuanceController' => 'PhabricatorController', + 'NuanceDAO' => 'PhabricatorLiskDAO', + 'NuanceFormItemType' => 'NuanceItemType', + 'NuanceGitHubEventItemType' => 'NuanceItemType', + 'NuanceGitHubImportCursor' => 'NuanceImportCursor', + 'NuanceGitHubIssuesImportCursor' => 'NuanceGitHubImportCursor', + 'NuanceGitHubRawEvent' => 'Phobject', + 'NuanceGitHubRawEventTestCase' => 'PhabricatorTestCase', + 'NuanceGitHubRepositoryImportCursor' => 'NuanceGitHubImportCursor', + 'NuanceGitHubRepositorySourceDefinition' => 'NuanceSourceDefinition', + 'NuanceImportCursor' => 'Phobject', + 'NuanceImportCursorData' => array( + 'NuanceDAO', + 'PhabricatorPolicyInterface', + ), + 'NuanceImportCursorDataQuery' => 'NuanceQuery', + 'NuanceImportCursorPHIDType' => 'PhabricatorPHIDType', + 'NuanceItem' => array( + 'NuanceDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + ), + 'NuanceItemActionController' => 'NuanceController', + 'NuanceItemCommand' => array( + 'NuanceDAO', + 'PhabricatorPolicyInterface', + ), + 'NuanceItemCommandQuery' => 'NuanceQuery', + 'NuanceItemCommandSpec' => 'Phobject', + 'NuanceItemCommandTransaction' => 'NuanceItemTransactionType', + 'NuanceItemController' => 'NuanceController', + 'NuanceItemEditor' => 'PhabricatorApplicationTransactionEditor', + 'NuanceItemListController' => 'NuanceItemController', + 'NuanceItemManageController' => 'NuanceController', + 'NuanceItemOwnerTransaction' => 'NuanceItemTransactionType', + 'NuanceItemPHIDType' => 'PhabricatorPHIDType', + 'NuanceItemPropertyTransaction' => 'NuanceItemTransactionType', + 'NuanceItemQuery' => 'NuanceQuery', + 'NuanceItemQueueTransaction' => 'NuanceItemTransactionType', + 'NuanceItemRequestorTransaction' => 'NuanceItemTransactionType', + 'NuanceItemSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'NuanceItemSourceTransaction' => 'NuanceItemTransactionType', + 'NuanceItemStatusTransaction' => 'NuanceItemTransactionType', + 'NuanceItemTransaction' => 'NuanceTransaction', + 'NuanceItemTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'NuanceItemTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'NuanceItemTransactionType' => 'PhabricatorModularTransactionType', + 'NuanceItemType' => 'Phobject', + 'NuanceItemUpdateWorker' => 'NuanceWorker', + 'NuanceItemViewController' => 'NuanceController', + 'NuanceManagementImportWorkflow' => 'NuanceManagementWorkflow', + 'NuanceManagementUpdateWorkflow' => 'NuanceManagementWorkflow', + 'NuanceManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'NuancePhabricatorFormSourceDefinition' => 'NuanceSourceDefinition', + 'NuanceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'NuanceQueue' => array( + 'NuanceDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + ), + 'NuanceQueueController' => 'NuanceController', + 'NuanceQueueDatasource' => 'PhabricatorTypeaheadDatasource', + 'NuanceQueueEditController' => 'NuanceQueueController', + 'NuanceQueueEditEngine' => 'PhabricatorEditEngine', + 'NuanceQueueEditor' => 'PhabricatorApplicationTransactionEditor', + 'NuanceQueueListController' => 'NuanceQueueController', + 'NuanceQueueNameTransaction' => 'NuanceQueueTransactionType', + 'NuanceQueuePHIDType' => 'PhabricatorPHIDType', + 'NuanceQueueQuery' => 'NuanceQuery', + 'NuanceQueueSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'NuanceQueueTransaction' => 'NuanceTransaction', + 'NuanceQueueTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'NuanceQueueTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'NuanceQueueTransactionType' => 'PhabricatorModularTransactionType', + 'NuanceQueueViewController' => 'NuanceQueueController', + 'NuanceQueueWorkController' => 'NuanceQueueController', + 'NuanceSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'NuanceSource' => array( + 'NuanceDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorNgramsInterface', + ), + 'NuanceSourceActionController' => 'NuanceController', + 'NuanceSourceController' => 'NuanceController', + 'NuanceSourceDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'NuanceSourceDefaultQueueTransaction' => 'NuanceSourceTransactionType', + 'NuanceSourceDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'NuanceSourceDefinition' => 'Phobject', + 'NuanceSourceDefinitionTestCase' => 'PhabricatorTestCase', + 'NuanceSourceEditController' => 'NuanceSourceController', + 'NuanceSourceEditEngine' => 'PhabricatorEditEngine', + 'NuanceSourceEditor' => 'PhabricatorApplicationTransactionEditor', + 'NuanceSourceListController' => 'NuanceSourceController', + 'NuanceSourceManageCapability' => 'PhabricatorPolicyCapability', + 'NuanceSourceNameNgrams' => 'PhabricatorSearchNgrams', + 'NuanceSourceNameTransaction' => 'NuanceSourceTransactionType', + 'NuanceSourcePHIDType' => 'PhabricatorPHIDType', + 'NuanceSourceQuery' => 'NuanceQuery', + 'NuanceSourceSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'NuanceSourceTransaction' => 'NuanceTransaction', + 'NuanceSourceTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'NuanceSourceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'NuanceSourceTransactionType' => 'PhabricatorModularTransactionType', + 'NuanceSourceViewController' => 'NuanceSourceController', + 'NuanceTransaction' => 'PhabricatorModularTransaction', + 'NuanceTrashCommand' => 'NuanceCommandImplementation', + 'NuanceWorker' => 'PhabricatorWorker', + 'OwnersConduitAPIMethod' => 'ConduitAPIMethod', + 'OwnersEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', 'OwnersPackageReplyHandler' => 'PhabricatorMailReplyHandler', + 'OwnersSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PHIDConduitAPIMethod' => 'ConduitAPIMethod', + 'PHIDInfoConduitAPIMethod' => 'PHIDConduitAPIMethod', + 'PHIDLookupConduitAPIMethod' => 'PHIDConduitAPIMethod', + 'PHIDQueryConduitAPIMethod' => 'PHIDConduitAPIMethod', + 'PHUI' => 'Phobject', + 'PHUIActionPanelExample' => 'PhabricatorUIExample', + 'PHUIActionPanelView' => 'AphrontTagView', + 'PHUIApplicationMenuView' => 'Phobject', + 'PHUIBadgeBoxView' => 'AphrontTagView', + 'PHUIBadgeExample' => 'PhabricatorUIExample', + 'PHUIBadgeMiniView' => 'AphrontTagView', + 'PHUIBadgeView' => 'AphrontTagView', + 'PHUIBigInfoExample' => 'PhabricatorUIExample', + 'PHUIBigInfoView' => 'AphrontTagView', 'PHUIBoxExample' => 'PhabricatorUIExample', 'PHUIBoxView' => 'AphrontTagView', + 'PHUIButtonBarExample' => 'PhabricatorUIExample', + 'PHUIButtonBarView' => 'AphrontTagView', 'PHUIButtonExample' => 'PhabricatorUIExample', 'PHUIButtonView' => 'AphrontTagView', + 'PHUICMSView' => 'AphrontTagView', + 'PHUICalendarDayView' => 'AphrontView', + 'PHUICalendarListView' => 'AphrontTagView', + 'PHUICalendarMonthView' => 'AphrontView', + 'PHUICalendarWeekView' => 'AphrontView', + 'PHUICalendarWidgetView' => 'AphrontTagView', + 'PHUIColor' => 'Phobject', 'PHUIColorPalletteExample' => 'PhabricatorUIExample', - 'PHUIDocumentExample' => 'PhabricatorUIExample', + 'PHUICrumbView' => 'AphrontView', + 'PHUICrumbsView' => 'AphrontView', + 'PHUICurtainExtension' => 'Phobject', + 'PHUICurtainObjectRefListView' => 'AphrontTagView', + 'PHUICurtainObjectRefView' => 'AphrontTagView', + 'PHUICurtainPanelView' => 'AphrontTagView', + 'PHUICurtainView' => 'AphrontTagView', + 'PHUIDiffGraphView' => 'Phobject', + 'PHUIDiffGraphViewTestCase' => 'PhabricatorTestCase', + 'PHUIDiffInlineCommentDetailView' => 'PHUIDiffInlineCommentView', + 'PHUIDiffInlineCommentEditView' => 'PHUIDiffInlineCommentView', + 'PHUIDiffInlineCommentPreviewListView' => 'AphrontView', + 'PHUIDiffInlineCommentRowScaffold' => 'AphrontView', + 'PHUIDiffInlineCommentTableScaffold' => 'AphrontView', + 'PHUIDiffInlineCommentUndoView' => 'PHUIDiffInlineCommentView', + 'PHUIDiffInlineCommentView' => 'AphrontView', + 'PHUIDiffInlineThreader' => 'Phobject', + 'PHUIDiffOneUpInlineCommentRowScaffold' => 'PHUIDiffInlineCommentRowScaffold', + 'PHUIDiffRevealIconView' => 'AphrontView', + 'PHUIDiffTableOfContentsItemView' => 'AphrontView', + 'PHUIDiffTableOfContentsListView' => 'AphrontView', + 'PHUIDiffTwoUpInlineCommentRowScaffold' => 'PHUIDiffInlineCommentRowScaffold', + 'PHUIDocumentSummaryView' => 'AphrontTagView', 'PHUIDocumentView' => 'AphrontTagView', 'PHUIFeedStoryExample' => 'PhabricatorUIExample', 'PHUIFeedStoryView' => 'AphrontView', 'PHUIFormDividerControl' => 'AphrontFormControl', + 'PHUIFormFileControl' => 'AphrontFormControl', 'PHUIFormFreeformDateControl' => 'AphrontFormControl', - 'PHUIFormMultiSubmitControl' => 'AphrontFormControl', - 'PHUIFormPageView' => 'AphrontView', + 'PHUIFormIconSetControl' => 'AphrontFormControl', + 'PHUIFormInsetView' => 'AphrontView', + 'PHUIFormLayoutView' => 'AphrontView', + 'PHUIFormNumberControl' => 'AphrontFormControl', + 'PHUIFormTimerControl' => 'AphrontFormControl', + 'PHUIFormationColumnDynamicView' => 'PHUIFormationColumnView', + 'PHUIFormationColumnItem' => 'Phobject', + 'PHUIFormationColumnView' => 'AphrontAutoIDView', + 'PHUIFormationContentView' => 'PHUIFormationColumnView', + 'PHUIFormationExpanderView' => 'AphrontAutoIDView', + 'PHUIFormationFlankView' => 'PHUIFormationColumnDynamicView', + 'PHUIFormationResizerView' => 'PHUIFormationColumnView', + 'PHUIFormationView' => 'AphrontAutoIDView', + 'PHUIHandleListView' => 'AphrontTagView', + 'PHUIHandleTagListView' => 'AphrontTagView', + 'PHUIHandleView' => 'AphrontView', + 'PHUIHeadThingView' => 'AphrontTagView', + 'PHUIHeaderView' => 'AphrontTagView', + 'PHUIHomeView' => 'AphrontTagView', + 'PHUIHovercardUIExample' => 'PhabricatorUIExample', + 'PHUIHovercardView' => 'AphrontTagView', + 'PHUIIconCircleView' => 'AphrontTagView', 'PHUIIconExample' => 'PhabricatorUIExample', 'PHUIIconView' => 'AphrontTagView', + 'PHUIImageMaskExample' => 'PhabricatorUIExample', + 'PHUIImageMaskView' => 'AphrontTagView', + 'PHUIInfoExample' => 'PhabricatorUIExample', + 'PHUIInfoView' => 'AphrontTagView', + 'PHUIInvisibleCharacterTestCase' => 'PhabricatorTestCase', + 'PHUIInvisibleCharacterView' => 'AphrontView', + 'PHUILauncherView' => 'AphrontTagView', + 'PHUILeftRightExample' => 'PhabricatorUIExample', + 'PHUILeftRightView' => 'AphrontTagView', + 'PHUILinkView' => 'AphrontTagView', 'PHUIListExample' => 'PhabricatorUIExample', 'PHUIListItemView' => 'AphrontTagView', 'PHUIListView' => 'AphrontTagView', 'PHUIListViewTestCase' => 'PhabricatorTestCase', - 'PHUIPagedFormView' => 'AphrontTagView', + 'PHUIObjectBoxView' => 'AphrontTagView', + 'PHUIObjectItemListExample' => 'PhabricatorUIExample', + 'PHUIObjectItemListView' => 'AphrontTagView', + 'PHUIObjectItemView' => 'AphrontTagView', + 'PHUIPagerView' => 'AphrontView', 'PHUIPinboardItemView' => 'AphrontView', 'PHUIPinboardView' => 'AphrontView', + 'PHUIPolicySectionView' => 'AphrontTagView', + 'PHUIPropertyGroupView' => 'AphrontTagView', + 'PHUIPropertyListExample' => 'PhabricatorUIExample', + 'PHUIPropertyListView' => 'AphrontView', + 'PHUIRemarkupImageView' => 'AphrontView', 'PHUIRemarkupPreviewPanel' => 'AphrontTagView', + 'PHUIRemarkupView' => 'AphrontView', + 'PHUISegmentBarSegmentView' => 'AphrontTagView', + 'PHUISegmentBarView' => 'AphrontTagView', + 'PHUISpacesNamespaceContextView' => 'AphrontView', 'PHUIStatusItemView' => 'AphrontTagView', 'PHUIStatusListView' => 'AphrontTagView', - 'PHUITextExample' => 'PhabricatorUIExample', - 'PHUITextView' => 'AphrontTagView', - 'PackageCreateMail' => 'PackageMail', - 'PackageDeleteMail' => 'PackageMail', - 'PackageMail' => 'PhabricatorMail', - 'PackageModifyMail' => 'PackageMail', - 'PasteCreateMailReceiver' => 'PhabricatorMailReceiver', + 'PHUITabGroupView' => 'AphrontTagView', + 'PHUITabView' => 'AphrontTagView', + 'PHUITagExample' => 'PhabricatorUIExample', + 'PHUITagView' => 'AphrontTagView', + 'PHUITimelineEventView' => 'AphrontView', + 'PHUITimelineExample' => 'PhabricatorUIExample', + 'PHUITimelineView' => 'AphrontView', + 'PHUITwoColumnView' => 'AphrontTagView', + 'PHUITypeaheadExample' => 'PhabricatorUIExample', + 'PHUIUserAvailabilityView' => 'AphrontTagView', + 'PHUIWorkboardView' => 'AphrontTagView', + 'PHUIWorkpanelView' => 'AphrontTagView', + 'PHUIXComponentsExample' => 'PhabricatorUIExample', + 'PassphraseAbstractKey' => 'Phobject', + 'PassphraseConduitAPIMethod' => 'ConduitAPIMethod', + 'PassphraseController' => 'PhabricatorController', + 'PassphraseCredential' => array( + 'PassphraseDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorSpacesInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + ), + 'PassphraseCredentialAuthorPolicyRule' => 'PhabricatorPolicyRule', + 'PassphraseCredentialConduitController' => 'PassphraseController', + 'PassphraseCredentialConduitTransaction' => 'PassphraseCredentialTransactionType', + 'PassphraseCredentialControl' => 'AphrontFormControl', + 'PassphraseCredentialCreateController' => 'PassphraseController', + 'PassphraseCredentialDescriptionTransaction' => 'PassphraseCredentialTransactionType', + 'PassphraseCredentialDestroyController' => 'PassphraseController', + 'PassphraseCredentialDestroyTransaction' => 'PassphraseCredentialTransactionType', + 'PassphraseCredentialEditController' => 'PassphraseController', + 'PassphraseCredentialFerretEngine' => 'PhabricatorFerretEngine', + 'PassphraseCredentialFulltextEngine' => 'PhabricatorFulltextEngine', + 'PassphraseCredentialListController' => 'PassphraseController', + 'PassphraseCredentialLockController' => 'PassphraseController', + 'PassphraseCredentialLockTransaction' => 'PassphraseCredentialTransactionType', + 'PassphraseCredentialLookedAtTransaction' => 'PassphraseCredentialTransactionType', + 'PassphraseCredentialNameTransaction' => 'PassphraseCredentialTransactionType', + 'PassphraseCredentialPHIDType' => 'PhabricatorPHIDType', + 'PassphraseCredentialPublicController' => 'PassphraseController', + 'PassphraseCredentialQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PassphraseCredentialRevealController' => 'PassphraseController', + 'PassphraseCredentialSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PassphraseCredentialSecretIDTransaction' => 'PassphraseCredentialTransactionType', + 'PassphraseCredentialTransaction' => 'PhabricatorModularTransaction', + 'PassphraseCredentialTransactionEditor' => 'PhabricatorApplicationTransactionEditor', + 'PassphraseCredentialTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PassphraseCredentialTransactionType' => 'PhabricatorModularTransactionType', + 'PassphraseCredentialType' => 'Phobject', + 'PassphraseCredentialTypeTestCase' => 'PhabricatorTestCase', + 'PassphraseCredentialUsernameTransaction' => 'PassphraseCredentialTransactionType', + 'PassphraseCredentialViewController' => 'PassphraseController', + 'PassphraseDAO' => 'PhabricatorLiskDAO', + 'PassphraseDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'PassphraseDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'PassphraseNoteCredentialType' => 'PassphraseCredentialType', + 'PassphrasePasswordCredentialType' => 'PassphraseCredentialType', + 'PassphrasePasswordKey' => 'PassphraseAbstractKey', + 'PassphraseQueryConduitAPIMethod' => 'PassphraseConduitAPIMethod', + 'PassphraseRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'PassphraseSSHGeneratedKeyCredentialType' => 'PassphraseSSHPrivateKeyCredentialType', + 'PassphraseSSHKey' => 'PassphraseAbstractKey', + 'PassphraseSSHPrivateKeyCredentialType' => 'PassphraseCredentialType', + 'PassphraseSSHPrivateKeyFileCredentialType' => 'PassphraseSSHPrivateKeyCredentialType', + 'PassphraseSSHPrivateKeyTextCredentialType' => 'PassphraseSSHPrivateKeyCredentialType', + 'PassphraseSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PassphraseSecret' => 'PassphraseDAO', + 'PassphraseTokenCredentialType' => 'PassphraseCredentialType', + 'PasteConduitAPIMethod' => 'ConduitAPIMethod', + 'PasteCreateConduitAPIMethod' => 'PasteConduitAPIMethod', + 'PasteCreateMailReceiver' => 'PhabricatorApplicationMailReceiver', + 'PasteDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'PasteDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'PasteEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', 'PasteEmbedView' => 'AphrontView', - 'PasteMockMailReceiver' => 'PhabricatorObjectMailReceiver', - 'PasteReplyHandler' => 'PhabricatorMailReplyHandler', + 'PasteInfoConduitAPIMethod' => 'PasteConduitAPIMethod', + 'PasteLanguageSelectDatasource' => 'PhabricatorTypeaheadDatasource', + 'PasteMailReceiver' => 'PhabricatorObjectMailReceiver', + 'PasteQueryConduitAPIMethod' => 'PasteConduitAPIMethod', + 'PasteReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PasteSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PeopleBrowseUserDirectoryCapability' => 'PhabricatorPolicyCapability', + 'PeopleCreateUsersCapability' => 'PhabricatorPolicyCapability', + 'PeopleDisableUsersCapability' => 'PhabricatorPolicyCapability', + 'PeopleHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension', + 'PeopleMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension', + 'PeopleUserLogGarbageCollector' => 'PhabricatorGarbageCollector', 'Phabricator404Controller' => 'PhabricatorController', 'PhabricatorAWSConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorAWSSESFuture' => 'PhutilAWSFuture', + 'PhabricatorAccessControlTestCase' => 'PhabricatorTestCase', + 'PhabricatorAccessLog' => 'Phobject', 'PhabricatorAccessLogConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorActionHeaderExample' => 'PhabricatorUIExample', - 'PhabricatorActionHeaderView' => 'AphrontView', - 'PhabricatorActionListExample' => 'PhabricatorUIExample', - 'PhabricatorActionListView' => 'AphrontView', + 'PhabricatorAccessibilitySetting' => 'PhabricatorSelectSetting', + 'PhabricatorAccumulateChartFunction' => 'PhabricatorHigherOrderChartFunction', + 'PhabricatorActionListView' => 'AphrontTagView', 'PhabricatorActionView' => 'AphrontView', - 'PhabricatorAllCapsTranslation' => 'PhabricatorTranslation', + 'PhabricatorActivitySettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorAddEmailUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorAddMultifactorUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorAdministratorsPolicyRule' => 'PhabricatorPolicyRule', + 'PhabricatorAjaxRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler', + 'PhabricatorAlmanacApplication' => 'PhabricatorApplication', + 'PhabricatorAmazonAuthProvider' => 'PhabricatorOAuth2AuthProvider', + 'PhabricatorAmazonSNSFuture' => 'PhutilAWSFuture', + 'PhabricatorAnchorTestCase' => 'PhabricatorTestCase', 'PhabricatorAnchorView' => 'AphrontView', - 'PhabricatorAphrontBarExample' => 'PhabricatorUIExample', + 'PhabricatorAphlictManagementDebugWorkflow' => 'PhabricatorAphlictManagementWorkflow', + 'PhabricatorAphlictManagementNotifyWorkflow' => 'PhabricatorAphlictManagementWorkflow', + 'PhabricatorAphlictManagementRestartWorkflow' => 'PhabricatorAphlictManagementWorkflow', + 'PhabricatorAphlictManagementStartWorkflow' => 'PhabricatorAphlictManagementWorkflow', + 'PhabricatorAphlictManagementStatusWorkflow' => 'PhabricatorAphlictManagementWorkflow', + 'PhabricatorAphlictManagementStopWorkflow' => 'PhabricatorAphlictManagementWorkflow', + 'PhabricatorAphlictManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorAphlictSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorAphrontBarUIExample' => 'PhabricatorUIExample', 'PhabricatorAphrontViewTestCase' => 'PhabricatorTestCase', - 'PhabricatorApplicationApplications' => 'PhabricatorApplication', - 'PhabricatorApplicationAudit' => 'PhabricatorApplication', - 'PhabricatorApplicationAuth' => 'PhabricatorApplication', - 'PhabricatorApplicationCalendar' => 'PhabricatorApplication', - 'PhabricatorApplicationChatLog' => 'PhabricatorApplication', - 'PhabricatorApplicationConduit' => 'PhabricatorApplication', - 'PhabricatorApplicationConfig' => 'PhabricatorApplication', + 'PhabricatorAppSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorApplication' => array( + 'PhabricatorLiskDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + ), + 'PhabricatorApplicationApplicationPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorApplicationApplicationTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorApplicationApplicationTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhabricatorApplicationConfigOptions' => 'Phobject', - 'PhabricatorApplicationConpherence' => 'PhabricatorApplication', - 'PhabricatorApplicationCountdown' => 'PhabricatorApplication', - 'PhabricatorApplicationDaemons' => 'PhabricatorApplication', + 'PhabricatorApplicationConfigurationPanel' => 'Phobject', + 'PhabricatorApplicationConfigurationPanelTestCase' => 'PhabricatorTestCase', + 'PhabricatorApplicationDatasource' => 'PhabricatorTypeaheadDatasource', 'PhabricatorApplicationDetailViewController' => 'PhabricatorApplicationsController', - 'PhabricatorApplicationDifferential' => 'PhabricatorApplication', - 'PhabricatorApplicationDiffusion' => 'PhabricatorApplication', - 'PhabricatorApplicationDiviner' => 'PhabricatorApplication', - 'PhabricatorApplicationDoorkeeper' => 'PhabricatorApplication', - 'PhabricatorApplicationDrydock' => 'PhabricatorApplication', - 'PhabricatorApplicationFact' => 'PhabricatorApplication', - 'PhabricatorApplicationFeed' => 'PhabricatorApplication', - 'PhabricatorApplicationFiles' => 'PhabricatorApplication', - 'PhabricatorApplicationFlags' => 'PhabricatorApplication', - 'PhabricatorApplicationHerald' => 'PhabricatorApplication', - 'PhabricatorApplicationLaunchView' => 'AphrontView', - 'PhabricatorApplicationLegalpad' => 'PhabricatorApplication', - 'PhabricatorApplicationMacro' => 'PhabricatorApplication', - 'PhabricatorApplicationMailingLists' => 'PhabricatorApplication', - 'PhabricatorApplicationManiphest' => 'PhabricatorApplication', - 'PhabricatorApplicationMetaMTA' => 'PhabricatorApplication', - 'PhabricatorApplicationOwners' => 'PhabricatorApplication', - 'PhabricatorApplicationPHPAST' => 'PhabricatorApplication', - 'PhabricatorApplicationPaste' => 'PhabricatorApplication', - 'PhabricatorApplicationPeople' => 'PhabricatorApplication', - 'PhabricatorApplicationPhame' => 'PhabricatorApplication', - 'PhabricatorApplicationPhlux' => 'PhabricatorApplication', - 'PhabricatorApplicationPholio' => 'PhabricatorApplication', - 'PhabricatorApplicationPhortune' => 'PhabricatorApplication', - 'PhabricatorApplicationPhrequent' => 'PhabricatorApplication', - 'PhabricatorApplicationPhriction' => 'PhabricatorApplication', - 'PhabricatorApplicationPonder' => 'PhabricatorApplication', - 'PhabricatorApplicationProject' => 'PhabricatorApplication', - 'PhabricatorApplicationReleeph' => 'PhabricatorApplication', - 'PhabricatorApplicationReleephConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorApplicationRepositories' => 'PhabricatorApplication', - 'PhabricatorApplicationSearch' => 'PhabricatorApplication', + 'PhabricatorApplicationEditController' => 'PhabricatorApplicationsController', + 'PhabricatorApplicationEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorApplicationEditHTTPParameterHelpView' => 'AphrontView', + 'PhabricatorApplicationEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorApplicationEmailCommandsController' => 'PhabricatorApplicationsController', + 'PhabricatorApplicationMailReceiver' => 'PhabricatorMailReceiver', + 'PhabricatorApplicationObjectMailEngineExtension' => 'PhabricatorMailEngineExtension', + 'PhabricatorApplicationPanelController' => 'PhabricatorApplicationsController', + 'PhabricatorApplicationPolicyChangeTransaction' => 'PhabricatorApplicationTransactionType', + 'PhabricatorApplicationProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorApplicationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorApplicationSchemaSpec' => 'PhabricatorConfigSchemaSpec', 'PhabricatorApplicationSearchController' => 'PhabricatorSearchBaseController', - 'PhabricatorApplicationSettings' => 'PhabricatorApplication', - 'PhabricatorApplicationSlowvote' => 'PhabricatorApplication', - 'PhabricatorApplicationStatusView' => 'AphrontView', - 'PhabricatorApplicationSubscriptions' => 'PhabricatorApplication', - 'PhabricatorApplicationTokens' => 'PhabricatorApplication', - 'PhabricatorApplicationTransaction' => - array( - 0 => 'PhabricatorLiskDAO', - 1 => 'PhabricatorPolicyInterface', - ), - 'PhabricatorApplicationTransactionComment' => - array( - 0 => 'PhabricatorLiskDAO', - 1 => 'PhabricatorMarkupInterface', - 2 => 'PhabricatorPolicyInterface', + 'PhabricatorApplicationSearchEngine' => 'Phobject', + 'PhabricatorApplicationSearchEngineTestCase' => 'PhabricatorTestCase', + 'PhabricatorApplicationSearchResultView' => 'Phobject', + 'PhabricatorApplicationTestCase' => 'PhabricatorTestCase', + 'PhabricatorApplicationTransaction' => array( + 'PhabricatorLiskDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorApplicationTransactionComment' => array( + 'PhabricatorLiskDAO', + 'PhabricatorMarkupInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', ), 'PhabricatorApplicationTransactionCommentEditController' => 'PhabricatorApplicationTransactionController', 'PhabricatorApplicationTransactionCommentEditor' => 'PhabricatorEditor', 'PhabricatorApplicationTransactionCommentHistoryController' => 'PhabricatorApplicationTransactionController', 'PhabricatorApplicationTransactionCommentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorApplicationTransactionCommentQuoteController' => 'PhabricatorApplicationTransactionController', + 'PhabricatorApplicationTransactionCommentRawController' => 'PhabricatorApplicationTransactionController', + 'PhabricatorApplicationTransactionCommentRemoveController' => 'PhabricatorApplicationTransactionController', 'PhabricatorApplicationTransactionCommentView' => 'AphrontView', 'PhabricatorApplicationTransactionController' => 'PhabricatorController', + 'PhabricatorApplicationTransactionDetailController' => 'PhabricatorApplicationTransactionController', + 'PhabricatorApplicationTransactionDetailView' => 'AphrontView', 'PhabricatorApplicationTransactionEditor' => 'PhabricatorEditor', 'PhabricatorApplicationTransactionFeedStory' => 'PhabricatorFeedStory', + 'PhabricatorApplicationTransactionJSONDiffDetailView' => 'PhabricatorApplicationTransactionDetailView', 'PhabricatorApplicationTransactionNoEffectException' => 'Exception', 'PhabricatorApplicationTransactionNoEffectResponse' => 'AphrontProxyResponse', - 'PhabricatorApplicationTransactionPHIDTypeTransaction' => 'PhabricatorPHIDType', + 'PhabricatorApplicationTransactionPublishWorker' => 'PhabricatorWorker', 'PhabricatorApplicationTransactionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorApplicationTransactionRemarkupPreviewController' => 'PhabricatorApplicationTransactionController', + 'PhabricatorApplicationTransactionReplyHandler' => 'PhabricatorMailReplyHandler', 'PhabricatorApplicationTransactionResponse' => 'AphrontProxyResponse', - 'PhabricatorApplicationTransactionTextDiffDetailView' => 'AphrontView', + 'PhabricatorApplicationTransactionShowOlderController' => 'PhabricatorApplicationTransactionController', + 'PhabricatorApplicationTransactionStructureException' => 'Exception', + 'PhabricatorApplicationTransactionTemplatedCommentQuery' => 'PhabricatorApplicationTransactionCommentQuery', + 'PhabricatorApplicationTransactionTextDiffDetailView' => 'PhabricatorApplicationTransactionDetailView', + 'PhabricatorApplicationTransactionTransactionPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorApplicationTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorApplicationTransactionValidationError' => 'Phobject', + 'PhabricatorApplicationTransactionValidationException' => 'Exception', + 'PhabricatorApplicationTransactionValidationResponse' => 'AphrontProxyResponse', + 'PhabricatorApplicationTransactionValueController' => 'PhabricatorApplicationTransactionController', 'PhabricatorApplicationTransactionView' => 'AphrontView', - 'PhabricatorApplicationTransactions' => 'PhabricatorApplication', - 'PhabricatorApplicationUIExamples' => 'PhabricatorApplication', + 'PhabricatorApplicationTransactionWarningException' => 'Exception', + 'PhabricatorApplicationTransactionWarningResponse' => 'AphrontProxyResponse', 'PhabricatorApplicationUninstallController' => 'PhabricatorApplicationsController', - 'PhabricatorApplicationXHProf' => 'PhabricatorApplication', + 'PhabricatorApplicationUninstallTransaction' => 'PhabricatorApplicationTransactionType', + 'PhabricatorApplicationsApplication' => 'PhabricatorApplication', 'PhabricatorApplicationsController' => 'PhabricatorController', 'PhabricatorApplicationsListController' => 'PhabricatorApplicationsController', - 'PhabricatorAsanaConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorAuditAddCommentController' => 'PhabricatorAuditController', - 'PhabricatorAuditComment' => - array( - 0 => 'PhabricatorAuditDAO', - 1 => 'PhabricatorMarkupInterface', + 'PhabricatorApplyEditField' => 'PhabricatorEditField', + 'PhabricatorAsanaAuthProvider' => array( + 'PhabricatorOAuth2AuthProvider', + 'DoorkeeperRemarkupURIInterface', ), + 'PhabricatorAsanaConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorAsanaSubtaskHasObjectEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorAsanaTaskHasObjectEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorAudioDocumentEngine' => 'PhabricatorDocumentEngine', + 'PhabricatorAuditActionConstants' => 'Phobject', + 'PhabricatorAuditApplication' => 'PhabricatorApplication', 'PhabricatorAuditCommentEditor' => 'PhabricatorEditor', - 'PhabricatorAuditCommitListView' => 'AphrontView', 'PhabricatorAuditController' => 'PhabricatorController', - 'PhabricatorAuditDAO' => 'PhabricatorLiskDAO', - 'PhabricatorAuditInlineComment' => - array( - 0 => 'PhabricatorAuditDAO', - 1 => 'PhabricatorInlineCommentInterface', - ), - 'PhabricatorAuditListController' => 'PhabricatorAuditController', - 'PhabricatorAuditListView' => 'AphrontView', + 'PhabricatorAuditEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorAuditInlineComment' => 'PhabricatorInlineComment', 'PhabricatorAuditMailReceiver' => 'PhabricatorObjectMailReceiver', 'PhabricatorAuditManagementDeleteWorkflow' => 'PhabricatorAuditManagementWorkflow', - 'PhabricatorAuditManagementWorkflow' => 'PhutilArgumentWorkflow', - 'PhabricatorAuditPreviewController' => 'PhabricatorAuditController', - 'PhabricatorAuditReplyHandler' => 'PhabricatorMailReplyHandler', + 'PhabricatorAuditManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorAuditReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PhabricatorAuditRequestStatus' => 'Phobject', + 'PhabricatorAuditSynchronizeManagementWorkflow' => 'PhabricatorAuditManagementWorkflow', + 'PhabricatorAuditTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorAuditTransactionComment' => array( + 'PhabricatorApplicationTransactionComment', + 'PhabricatorInlineCommentInterface', + ), + 'PhabricatorAuditTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorAuditTransactionView' => 'PhabricatorApplicationTransactionView', + 'PhabricatorAuditUpdateOwnersManagementWorkflow' => 'PhabricatorAuditManagementWorkflow', 'PhabricatorAuthAccountView' => 'AphrontView', + 'PhabricatorAuthApplication' => 'PhabricatorApplication', + 'PhabricatorAuthAuthFactorPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorAuthAuthFactorProviderPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorAuthAuthProviderPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorAuthCSRFEngine' => 'Phobject', + 'PhabricatorAuthChallenge' => array( + 'PhabricatorAuthDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorAuthChallengeGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorAuthChallengePHIDType' => 'PhabricatorPHIDType', + 'PhabricatorAuthChallengeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorAuthChallengeStatusController' => 'PhabricatorAuthController', + 'PhabricatorAuthChallengeUpdate' => 'Phobject', + 'PhabricatorAuthChangePasswordAction' => 'PhabricatorSystemAction', + 'PhabricatorAuthChangeUsernameMessageType' => 'PhabricatorAuthMessageType', + 'PhabricatorAuthConduitAPIMethod' => 'ConduitAPIMethod', + 'PhabricatorAuthConduitTokenRevoker' => 'PhabricatorAuthRevoker', 'PhabricatorAuthConfirmLinkController' => 'PhabricatorAuthController', + 'PhabricatorAuthContactNumber' => array( + 'PhabricatorAuthDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorEditEngineMFAInterface', + ), + 'PhabricatorAuthContactNumberController' => 'PhabricatorAuthController', + 'PhabricatorAuthContactNumberDisableController' => 'PhabricatorAuthContactNumberController', + 'PhabricatorAuthContactNumberEditController' => 'PhabricatorAuthContactNumberController', + 'PhabricatorAuthContactNumberEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorAuthContactNumberEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorAuthContactNumberMFAEngine' => 'PhabricatorEditEngineMFAEngine', + 'PhabricatorAuthContactNumberNumberTransaction' => 'PhabricatorAuthContactNumberTransactionType', + 'PhabricatorAuthContactNumberPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorAuthContactNumberPrimaryController' => 'PhabricatorAuthContactNumberController', + 'PhabricatorAuthContactNumberPrimaryTransaction' => 'PhabricatorAuthContactNumberTransactionType', + 'PhabricatorAuthContactNumberQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorAuthContactNumberStatusTransaction' => 'PhabricatorAuthContactNumberTransactionType', + 'PhabricatorAuthContactNumberTestController' => 'PhabricatorAuthContactNumberController', + 'PhabricatorAuthContactNumberTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorAuthContactNumberTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorAuthContactNumberTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorAuthContactNumberViewController' => 'PhabricatorAuthContactNumberController', 'PhabricatorAuthController' => 'PhabricatorController', 'PhabricatorAuthDAO' => 'PhabricatorLiskDAO', 'PhabricatorAuthDisableController' => 'PhabricatorAuthProviderConfigController', + 'PhabricatorAuthDowngradeSessionController' => 'PhabricatorAuthController', 'PhabricatorAuthEditController' => 'PhabricatorAuthProviderConfigController', + 'PhabricatorAuthEmailLoginAction' => 'PhabricatorSystemAction', + 'PhabricatorAuthEmailLoginMessageType' => 'PhabricatorAuthMessageType', + 'PhabricatorAuthEmailSetPasswordMessageType' => 'PhabricatorAuthMessageType', + 'PhabricatorAuthFactor' => 'Phobject', + 'PhabricatorAuthFactorConfig' => array( + 'PhabricatorAuthDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorAuthFactorConfigQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorAuthFactorProvider' => array( + 'PhabricatorAuthDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + 'PhabricatorEditEngineMFAInterface', + ), + 'PhabricatorAuthFactorProviderController' => 'PhabricatorAuthProviderController', + 'PhabricatorAuthFactorProviderDuoCredentialTransaction' => 'PhabricatorAuthFactorProviderTransactionType', + 'PhabricatorAuthFactorProviderDuoEnrollTransaction' => 'PhabricatorAuthFactorProviderTransactionType', + 'PhabricatorAuthFactorProviderDuoHostnameTransaction' => 'PhabricatorAuthFactorProviderTransactionType', + 'PhabricatorAuthFactorProviderDuoUsernamesTransaction' => 'PhabricatorAuthFactorProviderTransactionType', + 'PhabricatorAuthFactorProviderEditController' => 'PhabricatorAuthFactorProviderController', + 'PhabricatorAuthFactorProviderEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorAuthFactorProviderEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorAuthFactorProviderEnrollMessageTransaction' => 'PhabricatorAuthFactorProviderTransactionType', + 'PhabricatorAuthFactorProviderListController' => 'PhabricatorAuthProviderController', + 'PhabricatorAuthFactorProviderMFAEngine' => 'PhabricatorEditEngineMFAEngine', + 'PhabricatorAuthFactorProviderMessageController' => 'PhabricatorAuthFactorProviderController', + 'PhabricatorAuthFactorProviderNameTransaction' => 'PhabricatorAuthFactorProviderTransactionType', + 'PhabricatorAuthFactorProviderQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorAuthFactorProviderStatus' => 'Phobject', + 'PhabricatorAuthFactorProviderStatusTransaction' => 'PhabricatorAuthFactorProviderTransactionType', + 'PhabricatorAuthFactorProviderTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorAuthFactorProviderTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorAuthFactorProviderTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorAuthFactorProviderViewController' => 'PhabricatorAuthFactorProviderController', + 'PhabricatorAuthFactorResult' => 'Phobject', + 'PhabricatorAuthFactorTestCase' => 'PhabricatorTestCase', + 'PhabricatorAuthFinishController' => 'PhabricatorAuthController', + 'PhabricatorAuthHMACKey' => 'PhabricatorAuthDAO', + 'PhabricatorAuthHighSecurityRequiredException' => 'Exception', + 'PhabricatorAuthHighSecurityToken' => 'Phobject', + 'PhabricatorAuthInvite' => array( + 'PhabricatorUserDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorAuthInviteAccountException' => 'PhabricatorAuthInviteDialogException', + 'PhabricatorAuthInviteAction' => 'Phobject', + 'PhabricatorAuthInviteActionTableView' => 'AphrontView', + 'PhabricatorAuthInviteController' => 'PhabricatorAuthController', + 'PhabricatorAuthInviteDialogException' => 'PhabricatorAuthInviteException', + 'PhabricatorAuthInviteEngine' => 'Phobject', + 'PhabricatorAuthInviteException' => 'Exception', + 'PhabricatorAuthInviteInvalidException' => 'PhabricatorAuthInviteDialogException', + 'PhabricatorAuthInviteLoginException' => 'PhabricatorAuthInviteDialogException', + 'PhabricatorAuthInvitePHIDType' => 'PhabricatorPHIDType', + 'PhabricatorAuthInviteQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorAuthInviteRegisteredException' => 'PhabricatorAuthInviteException', + 'PhabricatorAuthInviteSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorAuthInviteTestCase' => 'PhabricatorTestCase', + 'PhabricatorAuthInviteVerifyException' => 'PhabricatorAuthInviteDialogException', + 'PhabricatorAuthInviteWorker' => 'PhabricatorWorker', 'PhabricatorAuthLinkController' => 'PhabricatorAuthController', + 'PhabricatorAuthLinkMessageType' => 'PhabricatorAuthMessageType', 'PhabricatorAuthListController' => 'PhabricatorAuthProviderConfigController', 'PhabricatorAuthLoginController' => 'PhabricatorAuthController', + 'PhabricatorAuthLoginMessageType' => 'PhabricatorAuthMessageType', + 'PhabricatorAuthLogoutConduitAPIMethod' => 'PhabricatorAuthConduitAPIMethod', + 'PhabricatorAuthMFAEditEngineExtension' => 'PhabricatorEditEngineExtension', + 'PhabricatorAuthMFASyncTemporaryTokenType' => 'PhabricatorAuthTemporaryTokenType', + 'PhabricatorAuthMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension', + 'PhabricatorAuthManagementCachePKCS8Workflow' => 'PhabricatorAuthManagementWorkflow', 'PhabricatorAuthManagementLDAPWorkflow' => 'PhabricatorAuthManagementWorkflow', + 'PhabricatorAuthManagementListFactorsWorkflow' => 'PhabricatorAuthManagementWorkflow', + 'PhabricatorAuthManagementListMFAProvidersWorkflow' => 'PhabricatorAuthManagementWorkflow', + 'PhabricatorAuthManagementLockWorkflow' => 'PhabricatorAuthManagementWorkflow', 'PhabricatorAuthManagementRecoverWorkflow' => 'PhabricatorAuthManagementWorkflow', 'PhabricatorAuthManagementRefreshWorkflow' => 'PhabricatorAuthManagementWorkflow', - 'PhabricatorAuthManagementWorkflow' => 'PhutilArgumentWorkflow', + 'PhabricatorAuthManagementRevokeWorkflow' => 'PhabricatorAuthManagementWorkflow', + 'PhabricatorAuthManagementStripWorkflow' => 'PhabricatorAuthManagementWorkflow', + 'PhabricatorAuthManagementTrustOAuthClientWorkflow' => 'PhabricatorAuthManagementWorkflow', + 'PhabricatorAuthManagementUnlimitWorkflow' => 'PhabricatorAuthManagementWorkflow', + 'PhabricatorAuthManagementUnlockWorkflow' => 'PhabricatorAuthManagementWorkflow', + 'PhabricatorAuthManagementUntrustOAuthClientWorkflow' => 'PhabricatorAuthManagementWorkflow', + 'PhabricatorAuthManagementVerifyWorkflow' => 'PhabricatorAuthManagementWorkflow', + 'PhabricatorAuthManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorAuthMessage' => array( + 'PhabricatorAuthDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorAuthMessageController' => 'PhabricatorAuthProviderController', + 'PhabricatorAuthMessageEditController' => 'PhabricatorAuthMessageController', + 'PhabricatorAuthMessageEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorAuthMessageEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorAuthMessageListController' => 'PhabricatorAuthProviderController', + 'PhabricatorAuthMessagePHIDType' => 'PhabricatorPHIDType', + 'PhabricatorAuthMessageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorAuthMessageTextTransaction' => 'PhabricatorAuthMessageTransactionType', + 'PhabricatorAuthMessageTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorAuthMessageTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorAuthMessageTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorAuthMessageType' => 'Phobject', + 'PhabricatorAuthMessageViewController' => 'PhabricatorAuthMessageController', + 'PhabricatorAuthNeedsApprovalController' => 'PhabricatorAuthController', + 'PhabricatorAuthNeedsMultiFactorController' => 'PhabricatorAuthController', 'PhabricatorAuthNewController' => 'PhabricatorAuthProviderConfigController', + 'PhabricatorAuthNewFactorAction' => 'PhabricatorSystemAction', 'PhabricatorAuthOldOAuthRedirectController' => 'PhabricatorAuthController', - 'PhabricatorAuthProviderConfig' => - array( - 0 => 'PhabricatorAuthDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorAuthOneTimeLoginController' => 'PhabricatorAuthController', + 'PhabricatorAuthOneTimeLoginTemporaryTokenType' => 'PhabricatorAuthTemporaryTokenType', + 'PhabricatorAuthPassword' => array( + 'PhabricatorAuthDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorApplicationTransactionInterface', + ), + 'PhabricatorAuthPasswordEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorAuthPasswordEngine' => 'Phobject', + 'PhabricatorAuthPasswordException' => 'Exception', + 'PhabricatorAuthPasswordPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorAuthPasswordQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorAuthPasswordResetTemporaryTokenType' => 'PhabricatorAuthTemporaryTokenType', + 'PhabricatorAuthPasswordRevokeTransaction' => 'PhabricatorAuthPasswordTransactionType', + 'PhabricatorAuthPasswordRevoker' => 'PhabricatorAuthRevoker', + 'PhabricatorAuthPasswordTestCase' => 'PhabricatorTestCase', + 'PhabricatorAuthPasswordTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorAuthPasswordTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorAuthPasswordTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorAuthPasswordUpgradeTransaction' => 'PhabricatorAuthPasswordTransactionType', + 'PhabricatorAuthProvider' => 'Phobject', + 'PhabricatorAuthProviderConfig' => array( + 'PhabricatorAuthDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', ), - 'PhabricatorAuthProviderConfigController' => 'PhabricatorAuthController', + 'PhabricatorAuthProviderConfigController' => 'PhabricatorAuthProviderController', 'PhabricatorAuthProviderConfigEditor' => 'PhabricatorApplicationTransactionEditor', 'PhabricatorAuthProviderConfigQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorAuthProviderConfigTransaction' => 'PhabricatorApplicationTransaction', 'PhabricatorAuthProviderConfigTransactionQuery' => 'PhabricatorApplicationTransactionQuery', - 'PhabricatorAuthProviderLDAP' => 'PhabricatorAuthProvider', - 'PhabricatorAuthProviderOAuth' => 'PhabricatorAuthProvider', - 'PhabricatorAuthProviderOAuthAmazon' => 'PhabricatorAuthProviderOAuth', - 'PhabricatorAuthProviderOAuthAsana' => 'PhabricatorAuthProviderOAuth', - 'PhabricatorAuthProviderOAuthDisqus' => 'PhabricatorAuthProviderOAuth', - 'PhabricatorAuthProviderOAuthFacebook' => 'PhabricatorAuthProviderOAuth', - 'PhabricatorAuthProviderOAuthGitHub' => 'PhabricatorAuthProviderOAuth', - 'PhabricatorAuthProviderOAuthGoogle' => 'PhabricatorAuthProviderOAuth', - 'PhabricatorAuthProviderOAuthTwitch' => 'PhabricatorAuthProviderOAuth', - 'PhabricatorAuthProviderPassword' => 'PhabricatorAuthProvider', + 'PhabricatorAuthProviderController' => 'PhabricatorAuthController', + 'PhabricatorAuthProviderViewController' => 'PhabricatorAuthProviderConfigController', + 'PhabricatorAuthProvidersGuidanceContext' => 'PhabricatorGuidanceContext', + 'PhabricatorAuthProvidersGuidanceEngineExtension' => 'PhabricatorGuidanceEngineExtension', + 'PhabricatorAuthQueryPublicKeysConduitAPIMethod' => 'PhabricatorAuthConduitAPIMethod', 'PhabricatorAuthRegisterController' => 'PhabricatorAuthController', + 'PhabricatorAuthRevokeTokenController' => 'PhabricatorAuthController', + 'PhabricatorAuthRevoker' => 'Phobject', + 'PhabricatorAuthSSHKey' => array( + 'PhabricatorAuthDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorApplicationTransactionInterface', + ), + 'PhabricatorAuthSSHKeyController' => 'PhabricatorAuthController', + 'PhabricatorAuthSSHKeyEditController' => 'PhabricatorAuthSSHKeyController', + 'PhabricatorAuthSSHKeyEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorAuthSSHKeyGenerateController' => 'PhabricatorAuthSSHKeyController', + 'PhabricatorAuthSSHKeyListController' => 'PhabricatorAuthSSHKeyController', + 'PhabricatorAuthSSHKeyPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorAuthSSHKeyQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorAuthSSHKeyReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PhabricatorAuthSSHKeyRevokeController' => 'PhabricatorAuthSSHKeyController', + 'PhabricatorAuthSSHKeySearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorAuthSSHKeyTableView' => 'AphrontView', + 'PhabricatorAuthSSHKeyTestCase' => 'PhabricatorTestCase', + 'PhabricatorAuthSSHKeyTransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorAuthSSHKeyTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorAuthSSHKeyViewController' => 'PhabricatorAuthSSHKeyController', + 'PhabricatorAuthSSHPrivateKey' => 'Phobject', + 'PhabricatorAuthSSHPrivateKeyException' => 'Exception', + 'PhabricatorAuthSSHPrivateKeyFormatException' => 'PhabricatorAuthSSHPrivateKeyException', + 'PhabricatorAuthSSHPrivateKeyIncorrectPassphraseException' => 'PhabricatorAuthSSHPrivateKeyPassphraseException', + 'PhabricatorAuthSSHPrivateKeyMissingPassphraseException' => 'PhabricatorAuthSSHPrivateKeyPassphraseException', + 'PhabricatorAuthSSHPrivateKeyPassphraseException' => 'PhabricatorAuthSSHPrivateKeyException', + 'PhabricatorAuthSSHPrivateKeySurplusPassphraseException' => 'PhabricatorAuthSSHPrivateKeyPassphraseException', + 'PhabricatorAuthSSHPrivateKeyUnknownException' => 'PhabricatorAuthSSHPrivateKeyException', + 'PhabricatorAuthSSHPublicKey' => 'Phobject', + 'PhabricatorAuthSSHRevoker' => 'PhabricatorAuthRevoker', + 'PhabricatorAuthSession' => array( + 'PhabricatorAuthDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorAuthSessionEngine' => 'Phobject', + 'PhabricatorAuthSessionEngineExtension' => 'Phobject', + 'PhabricatorAuthSessionEngineExtensionModule' => 'PhabricatorConfigModule', + 'PhabricatorAuthSessionGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorAuthSessionInfo' => 'Phobject', + 'PhabricatorAuthSessionPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorAuthSessionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorAuthSessionRevoker' => 'PhabricatorAuthRevoker', + 'PhabricatorAuthSetExternalController' => 'PhabricatorAuthController', + 'PhabricatorAuthSetPasswordController' => 'PhabricatorAuthController', + 'PhabricatorAuthSetupCheck' => 'PhabricatorSetupCheck', 'PhabricatorAuthStartController' => 'PhabricatorAuthController', + 'PhabricatorAuthTemporaryToken' => array( + 'PhabricatorAuthDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorAuthTemporaryTokenGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorAuthTemporaryTokenQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorAuthTemporaryTokenRevoker' => 'PhabricatorAuthRevoker', + 'PhabricatorAuthTemporaryTokenType' => 'Phobject', + 'PhabricatorAuthTemporaryTokenTypeModule' => 'PhabricatorConfigModule', + 'PhabricatorAuthTerminateSessionController' => 'PhabricatorAuthController', + 'PhabricatorAuthTestSMSAction' => 'PhabricatorSystemAction', + 'PhabricatorAuthTryEmailLoginAction' => 'PhabricatorSystemAction', + 'PhabricatorAuthTryFactorAction' => 'PhabricatorSystemAction', + 'PhabricatorAuthTryPasswordAction' => 'PhabricatorSystemAction', + 'PhabricatorAuthTryPasswordWithoutCAPTCHAAction' => 'PhabricatorSystemAction', 'PhabricatorAuthUnlinkController' => 'PhabricatorAuthController', 'PhabricatorAuthValidateController' => 'PhabricatorAuthController', + 'PhabricatorAuthWaitForApprovalMessageType' => 'PhabricatorAuthMessageType', + 'PhabricatorAuthWelcomeMailMessageType' => 'PhabricatorAuthMessageType', 'PhabricatorAuthenticationConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorBarePageExample' => 'PhabricatorUIExample', + 'PhabricatorAutoEventListener' => 'PhabricatorEventListener', + 'PhabricatorBadgesApplication' => 'PhabricatorApplication', + 'PhabricatorBadgesArchiveController' => 'PhabricatorBadgesController', + 'PhabricatorBadgesAward' => array( + 'PhabricatorBadgesDAO', + 'PhabricatorDestructibleInterface', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorBadgesAwardController' => 'PhabricatorBadgesController', + 'PhabricatorBadgesAwardQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorBadgesAwardTestDataGenerator' => 'PhabricatorTestDataGenerator', + 'PhabricatorBadgesBadge' => array( + 'PhabricatorBadgesDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorNgramsInterface', + ), + 'PhabricatorBadgesBadgeAwardTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeDescriptionTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeFlavorTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeIconTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeNameNgrams' => 'PhabricatorSearchNgrams', + 'PhabricatorBadgesBadgeNameTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeQualityTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeRevokeTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeStatusTransaction' => 'PhabricatorBadgesBadgeTransactionType', + 'PhabricatorBadgesBadgeTestDataGenerator' => 'PhabricatorTestDataGenerator', + 'PhabricatorBadgesBadgeTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorBadgesCommentController' => 'PhabricatorBadgesController', + 'PhabricatorBadgesController' => 'PhabricatorController', + 'PhabricatorBadgesCreateCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorBadgesDAO' => 'PhabricatorLiskDAO', + 'PhabricatorBadgesDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorBadgesDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorBadgesEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'PhabricatorBadgesEditController' => 'PhabricatorBadgesController', + 'PhabricatorBadgesEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorBadgesEditRecipientsController' => 'PhabricatorBadgesController', + 'PhabricatorBadgesEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorBadgesIconSet' => 'PhabricatorIconSet', + 'PhabricatorBadgesListController' => 'PhabricatorBadgesController', + 'PhabricatorBadgesLootContextFreeGrammar' => 'PhutilContextFreeGrammar', + 'PhabricatorBadgesMailReceiver' => 'PhabricatorObjectMailReceiver', + 'PhabricatorBadgesPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorBadgesProfileController' => 'PhabricatorController', + 'PhabricatorBadgesQuality' => 'Phobject', + 'PhabricatorBadgesQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorBadgesRecipientsController' => 'PhabricatorBadgesProfileController', + 'PhabricatorBadgesRecipientsListView' => 'AphrontView', + 'PhabricatorBadgesRemoveRecipientsController' => 'PhabricatorBadgesController', + 'PhabricatorBadgesReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PhabricatorBadgesSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorBadgesSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PhabricatorBadgesSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorBadgesTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorBadgesTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'PhabricatorBadgesTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorBadgesViewController' => 'PhabricatorBadgesProfileController', 'PhabricatorBarePageView' => 'AphrontPageView', - 'PhabricatorBaseEnglishTranslation' => 'PhabricatorTranslation', - 'PhabricatorBot' => 'PhabricatorDaemon', - 'PhabricatorBotBaseStreamingProtocolAdapter' => 'PhabricatorBaseProtocolAdapter', - 'PhabricatorBotChannel' => 'PhabricatorBotTarget', - 'PhabricatorBotDebugLogHandler' => 'PhabricatorBotHandler', - 'PhabricatorBotDifferentialNotificationHandler' => 'PhabricatorBotHandler', - 'PhabricatorBotFeedNotificationHandler' => 'PhabricatorBotHandler', - 'PhabricatorBotFlowdockProtocolAdapter' => 'PhabricatorBotBaseStreamingProtocolAdapter', - 'PhabricatorBotLogHandler' => 'PhabricatorBotHandler', - 'PhabricatorBotMacroHandler' => 'PhabricatorBotHandler', - 'PhabricatorBotObjectNameHandler' => 'PhabricatorBotHandler', - 'PhabricatorBotSymbolHandler' => 'PhabricatorBotHandler', - 'PhabricatorBotUser' => 'PhabricatorBotTarget', - 'PhabricatorBotWhatsNewHandler' => 'PhabricatorBotHandler', + 'PhabricatorBaseURISetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorBcryptPasswordHasher' => 'PhabricatorPasswordHasher', + 'PhabricatorBinariesSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorBitbucketAuthProvider' => 'PhabricatorOAuth1AuthProvider', + 'PhabricatorBoardColumnsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'PhabricatorBoardLayoutEngine' => 'Phobject', + 'PhabricatorBoardRenderingEngine' => 'Phobject', + 'PhabricatorBoardResponseEngine' => 'Phobject', + 'PhabricatorBoolConfigType' => 'PhabricatorTextConfigType', + 'PhabricatorBoolEditField' => 'PhabricatorEditField', + 'PhabricatorBoolMailStamp' => 'PhabricatorMailStamp', + 'PhabricatorBritishEnglishTranslation' => 'PhutilTranslation', + 'PhabricatorBuiltinDraftEngine' => 'PhabricatorDraftEngine', + 'PhabricatorBuiltinFileCachePurger' => 'PhabricatorCachePurger', 'PhabricatorBuiltinPatchList' => 'PhabricatorSQLPatchList', - 'PhabricatorBusyExample' => 'PhabricatorUIExample', + 'PhabricatorBulkContentSource' => 'PhabricatorContentSource', + 'PhabricatorBulkEditGroup' => 'Phobject', + 'PhabricatorBulkEngine' => 'Phobject', + 'PhabricatorBulkManagementExportWorkflow' => 'PhabricatorBulkManagementWorkflow', + 'PhabricatorBulkManagementMakeSilentWorkflow' => 'PhabricatorBulkManagementWorkflow', + 'PhabricatorBulkManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorCSVExportFormat' => 'PhabricatorExportFormat', 'PhabricatorCacheDAO' => 'PhabricatorLiskDAO', - 'PhabricatorCacheManagementPurgeWorkflow' => 'PhabricatorSearchManagementWorkflow', - 'PhabricatorCacheManagementWorkflow' => 'PhutilArgumentWorkflow', - 'PhabricatorCalendarBrowseController' => 'PhabricatorCalendarController', + 'PhabricatorCacheEngine' => 'Phobject', + 'PhabricatorCacheEngineExtension' => 'Phobject', + 'PhabricatorCacheGeneralGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorCacheManagementPurgeWorkflow' => 'PhabricatorCacheManagementWorkflow', + 'PhabricatorCacheManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorCacheMarkupGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorCachePurger' => 'Phobject', + 'PhabricatorCacheSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorCacheSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorCacheSpec' => 'Phobject', + 'PhabricatorCacheTTLGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorCachedClassMapQuery' => 'Phobject', + 'PhabricatorCaches' => 'Phobject', + 'PhabricatorCachesTestCase' => 'PhabricatorTestCase', + 'PhabricatorCalendarApplication' => 'PhabricatorApplication', 'PhabricatorCalendarController' => 'PhabricatorController', 'PhabricatorCalendarDAO' => 'PhabricatorLiskDAO', - 'PhabricatorCalendarDeleteStatusController' => 'PhabricatorCalendarController', - 'PhabricatorCalendarEditStatusController' => 'PhabricatorCalendarController', - 'PhabricatorCalendarHoliday' => 'PhabricatorCalendarDAO', - 'PhabricatorCalendarHolidayTestCase' => 'PhabricatorTestCase', - 'PhabricatorCalendarViewStatusController' => 'PhabricatorCalendarController', - 'PhabricatorCampfireProtocolAdapter' => 'PhabricatorBotBaseStreamingProtocolAdapter', + 'PhabricatorCalendarEvent' => array( + 'PhabricatorCalendarDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + 'PhabricatorPolicyCodexInterface', + 'PhabricatorProjectInterface', + 'PhabricatorMarkupInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorMentionableInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorSpacesInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + 'PhabricatorConduitResultInterface', + ), + 'PhabricatorCalendarEventAcceptTransaction' => 'PhabricatorCalendarEventReplyTransaction', + 'PhabricatorCalendarEventAllDayTransaction' => 'PhabricatorCalendarEventTransactionType', + 'PhabricatorCalendarEventAvailabilityController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarEventCancelController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarEventCancelTransaction' => 'PhabricatorCalendarEventTransactionType', + 'PhabricatorCalendarEventDateTransaction' => 'PhabricatorCalendarEventTransactionType', + 'PhabricatorCalendarEventDeclineTransaction' => 'PhabricatorCalendarEventReplyTransaction', + 'PhabricatorCalendarEventDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorCalendarEventDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorCalendarEventDescriptionTransaction' => 'PhabricatorCalendarEventTransactionType', + 'PhabricatorCalendarEventDragController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarEventEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'PhabricatorCalendarEventEditController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarEventEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorCalendarEventEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorCalendarEventEmailCommand' => 'MetaMTAEmailTransactionCommand', + 'PhabricatorCalendarEventEndDateTransaction' => 'PhabricatorCalendarEventDateTransaction', + 'PhabricatorCalendarEventExportController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarEventFerretEngine' => 'PhabricatorFerretEngine', + 'PhabricatorCalendarEventForkTransaction' => 'PhabricatorCalendarEventTransactionType', + 'PhabricatorCalendarEventFrequencyTransaction' => 'PhabricatorCalendarEventTransactionType', + 'PhabricatorCalendarEventFulltextEngine' => 'PhabricatorFulltextEngine', + 'PhabricatorCalendarEventHeraldAdapter' => 'HeraldAdapter', + 'PhabricatorCalendarEventHeraldField' => 'HeraldField', + 'PhabricatorCalendarEventHeraldFieldGroup' => 'HeraldFieldGroup', + 'PhabricatorCalendarEventHostPolicyRule' => 'PhabricatorPolicyRule', + 'PhabricatorCalendarEventHostTransaction' => 'PhabricatorCalendarEventTransactionType', + 'PhabricatorCalendarEventIconTransaction' => 'PhabricatorCalendarEventTransactionType', + 'PhabricatorCalendarEventInviteTransaction' => 'PhabricatorCalendarEventTransactionType', + 'PhabricatorCalendarEventInvitee' => array( + 'PhabricatorCalendarDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorCalendarEventInviteeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorCalendarEventInviteesPolicyRule' => 'PhabricatorPolicyRule', + 'PhabricatorCalendarEventJoinController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarEventListController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarEventMailReceiver' => 'PhabricatorObjectMailReceiver', + 'PhabricatorCalendarEventNameHeraldField' => 'PhabricatorCalendarEventHeraldField', + 'PhabricatorCalendarEventNameTransaction' => 'PhabricatorCalendarEventTransactionType', + 'PhabricatorCalendarEventNotificationView' => 'Phobject', + 'PhabricatorCalendarEventPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorCalendarEventPolicyCodex' => 'PhabricatorPolicyCodex', + 'PhabricatorCalendarEventQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorCalendarEventRSVPEmailCommand' => 'PhabricatorCalendarEventEmailCommand', + 'PhabricatorCalendarEventRecurringTransaction' => 'PhabricatorCalendarEventTransactionType', + 'PhabricatorCalendarEventReplyTransaction' => 'PhabricatorCalendarEventTransactionType', + 'PhabricatorCalendarEventSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PhabricatorCalendarEventSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorCalendarEventStartDateTransaction' => 'PhabricatorCalendarEventDateTransaction', + 'PhabricatorCalendarEventTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorCalendarEventTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'PhabricatorCalendarEventTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorCalendarEventTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorCalendarEventUntilDateTransaction' => 'PhabricatorCalendarEventDateTransaction', + 'PhabricatorCalendarEventViewController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarExport' => array( + 'PhabricatorCalendarDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorCalendarExportDisableController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarExportDisableTransaction' => 'PhabricatorCalendarExportTransactionType', + 'PhabricatorCalendarExportEditController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarExportEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorCalendarExportEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorCalendarExportICSController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarExportListController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarExportModeTransaction' => 'PhabricatorCalendarExportTransactionType', + 'PhabricatorCalendarExportNameTransaction' => 'PhabricatorCalendarExportTransactionType', + 'PhabricatorCalendarExportPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorCalendarExportQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorCalendarExportQueryKeyTransaction' => 'PhabricatorCalendarExportTransactionType', + 'PhabricatorCalendarExportSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorCalendarExportTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorCalendarExportTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorCalendarExportTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorCalendarExportViewController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarExternalInvitee' => array( + 'PhabricatorCalendarDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorCalendarExternalInviteePHIDType' => 'PhabricatorPHIDType', + 'PhabricatorCalendarExternalInviteeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorCalendarICSFileImportEngine' => 'PhabricatorCalendarICSImportEngine', + 'PhabricatorCalendarICSImportEngine' => 'PhabricatorCalendarImportEngine', + 'PhabricatorCalendarICSURIImportEngine' => 'PhabricatorCalendarICSImportEngine', + 'PhabricatorCalendarICSWriter' => 'Phobject', + 'PhabricatorCalendarIconSet' => 'PhabricatorIconSet', + 'PhabricatorCalendarImport' => array( + 'PhabricatorCalendarDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorCalendarImportDefaultLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportDeleteController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarImportDeleteLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportDeleteTransaction' => 'PhabricatorCalendarImportTransactionType', + 'PhabricatorCalendarImportDisableController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarImportDisableTransaction' => 'PhabricatorCalendarImportTransactionType', + 'PhabricatorCalendarImportDropController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarImportDuplicateLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportEditController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarImportEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorCalendarImportEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorCalendarImportEmptyLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportEngine' => 'Phobject', + 'PhabricatorCalendarImportEpochLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportFetchLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportFrequencyLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportFrequencyTransaction' => 'PhabricatorCalendarImportTransactionType', + 'PhabricatorCalendarImportICSFileTransaction' => 'PhabricatorCalendarImportTransactionType', + 'PhabricatorCalendarImportICSLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportICSURITransaction' => 'PhabricatorCalendarImportTransactionType', + 'PhabricatorCalendarImportICSWarningLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportIgnoredNodeLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportListController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarImportLog' => array( + 'PhabricatorCalendarDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorCalendarImportLogListController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarImportLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorCalendarImportLogSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorCalendarImportLogType' => 'Phobject', + 'PhabricatorCalendarImportLogView' => 'AphrontView', + 'PhabricatorCalendarImportNameTransaction' => 'PhabricatorCalendarImportTransactionType', + 'PhabricatorCalendarImportOriginalLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportOrphanLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorCalendarImportQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorCalendarImportQueueLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportReloadController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarImportReloadTransaction' => 'PhabricatorCalendarImportTransactionType', + 'PhabricatorCalendarImportReloadWorker' => 'PhabricatorWorker', + 'PhabricatorCalendarImportSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorCalendarImportTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorCalendarImportTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorCalendarImportTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorCalendarImportTriggerLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportUpdateLogType' => 'PhabricatorCalendarImportLogType', + 'PhabricatorCalendarImportViewController' => 'PhabricatorCalendarController', + 'PhabricatorCalendarInviteeDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorCalendarInviteeUserDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorCalendarInviteeViewerFunctionDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorCalendarManagementNotifyWorkflow' => 'PhabricatorCalendarManagementWorkflow', + 'PhabricatorCalendarManagementReloadWorkflow' => 'PhabricatorCalendarManagementWorkflow', + 'PhabricatorCalendarManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorCalendarNotification' => 'PhabricatorCalendarDAO', + 'PhabricatorCalendarNotificationEngine' => 'Phobject', + 'PhabricatorCalendarRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'PhabricatorCalendarReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PhabricatorCalendarSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorCelerityApplication' => 'PhabricatorApplication', + 'PhabricatorCelerityTestCase' => 'PhabricatorTestCase', + 'PhabricatorChangeParserTestCase' => 'PhabricatorWorkingCopyTestCase', + 'PhabricatorChangePasswordUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorChangesetCachePurger' => 'PhabricatorCachePurger', 'PhabricatorChangesetResponse' => 'AphrontProxyResponse', - 'PhabricatorChatLogChannel' => - array( - 0 => 'PhabricatorChatLogDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorChangesetViewState' => 'Phobject', + 'PhabricatorChangesetViewStateEngine' => 'Phobject', + 'PhabricatorChartAxis' => 'Phobject', + 'PhabricatorChartDataQuery' => 'Phobject', + 'PhabricatorChartDataset' => 'Phobject', + 'PhabricatorChartDisplayData' => 'Phobject', + 'PhabricatorChartEngine' => 'Phobject', + 'PhabricatorChartFunction' => 'Phobject', + 'PhabricatorChartFunctionArgument' => 'Phobject', + 'PhabricatorChartFunctionArgumentParser' => 'Phobject', + 'PhabricatorChartFunctionLabel' => 'Phobject', + 'PhabricatorChartInterval' => 'Phobject', + 'PhabricatorChartRenderingEngine' => 'Phobject', + 'PhabricatorChartStackedAreaDataset' => 'PhabricatorChartDataset', + 'PhabricatorChatLogApplication' => 'PhabricatorApplication', + 'PhabricatorChatLogChannel' => array( + 'PhabricatorChatLogDAO', + 'PhabricatorPolicyInterface', ), 'PhabricatorChatLogChannelListController' => 'PhabricatorChatLogController', 'PhabricatorChatLogChannelLogController' => 'PhabricatorChatLogController', 'PhabricatorChatLogChannelQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorChatLogController' => 'PhabricatorController', 'PhabricatorChatLogDAO' => 'PhabricatorLiskDAO', - 'PhabricatorChatLogEvent' => - array( - 0 => 'PhabricatorChatLogDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorChatLogEvent' => array( + 'PhabricatorChatLogDAO', + 'PhabricatorPolicyInterface', ), - 'PhabricatorChatLogEventType' => 'PhabricatorChatLogConstants', 'PhabricatorChatLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorCheckboxesEditField' => 'PhabricatorEditField', + 'PhabricatorChunkedFileStorageEngine' => 'PhabricatorFileStorageEngine', + 'PhabricatorClassConfigType' => 'PhabricatorTextConfigType', + 'PhabricatorClusterConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorClusterDatabasesConfigType' => 'PhabricatorJSONConfigType', + 'PhabricatorClusterException' => 'Exception', + 'PhabricatorClusterExceptionHandler' => 'PhabricatorRequestExceptionHandler', + 'PhabricatorClusterImpossibleWriteException' => 'PhabricatorClusterException', + 'PhabricatorClusterImproperWriteException' => 'PhabricatorClusterException', + 'PhabricatorClusterMailersConfigType' => 'PhabricatorJSONConfigType', + 'PhabricatorClusterNoHostForRoleException' => 'Exception', + 'PhabricatorClusterSearchConfigType' => 'PhabricatorJSONConfigType', + 'PhabricatorClusterServiceHealthRecord' => 'Phobject', + 'PhabricatorClusterStrandedException' => 'PhabricatorClusterException', + 'PhabricatorColumnsEditField' => 'PhabricatorPHIDListEditField', + 'PhabricatorCommentEditEngineExtension' => 'PhabricatorEditEngineExtension', + 'PhabricatorCommentEditField' => 'PhabricatorEditField', + 'PhabricatorCommentEditType' => 'PhabricatorEditType', + 'PhabricatorCommitBranchesField' => 'PhabricatorCommitCustomField', + 'PhabricatorCommitCustomField' => 'PhabricatorCustomField', + 'PhabricatorCommitMergedCommitsField' => 'PhabricatorCommitCustomField', + 'PhabricatorCommitRepositoryField' => 'PhabricatorCommitCustomField', + 'PhabricatorCommitSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorCommitTagsField' => 'PhabricatorCommitCustomField', + 'PhabricatorCommonPasswords' => 'Phobject', + 'PhabricatorComposeChartFunction' => 'PhabricatorHigherOrderChartFunction', 'PhabricatorConduitAPIController' => 'PhabricatorConduitController', + 'PhabricatorConduitApplication' => 'PhabricatorApplication', + 'PhabricatorConduitCallManagementWorkflow' => 'PhabricatorConduitManagementWorkflow', + 'PhabricatorConduitCertificateFailureUserLogType' => 'PhabricatorUserLogType', 'PhabricatorConduitCertificateToken' => 'PhabricatorConduitDAO', - 'PhabricatorConduitConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorConduitConnectionLog' => 'PhabricatorConduitDAO', + 'PhabricatorConduitCertificateUserLogType' => 'PhabricatorUserLogType', 'PhabricatorConduitConsoleController' => 'PhabricatorConduitController', + 'PhabricatorConduitContentSource' => 'PhabricatorContentSource', 'PhabricatorConduitController' => 'PhabricatorController', 'PhabricatorConduitDAO' => 'PhabricatorLiskDAO', - 'PhabricatorConduitListController' => - array( - 0 => 'PhabricatorConduitController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), + 'PhabricatorConduitEditField' => 'PhabricatorEditField', + 'PhabricatorConduitListController' => 'PhabricatorConduitController', 'PhabricatorConduitLogController' => 'PhabricatorConduitController', 'PhabricatorConduitLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhabricatorConduitMethodCallLog' => - array( - 0 => 'PhabricatorConduitDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorConduitLogSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorConduitManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorConduitMethodCallLog' => array( + 'PhabricatorConduitDAO', + 'PhabricatorPolicyInterface', ), 'PhabricatorConduitMethodQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorConduitRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler', + 'PhabricatorConduitResultInterface' => 'PhabricatorPHIDInterface', 'PhabricatorConduitSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorConduitSearchFieldSpecification' => 'Phobject', + 'PhabricatorConduitTestCase' => 'PhabricatorTestCase', + 'PhabricatorConduitToken' => array( + 'PhabricatorConduitDAO', + 'PhabricatorPolicyInterface', + ), 'PhabricatorConduitTokenController' => 'PhabricatorConduitController', - 'PhabricatorConfigAllController' => 'PhabricatorConfigController', + 'PhabricatorConduitTokenEditController' => 'PhabricatorConduitController', + 'PhabricatorConduitTokenHandshakeController' => 'PhabricatorConduitController', + 'PhabricatorConduitTokenQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorConduitTokenTerminateController' => 'PhabricatorConduitController', + 'PhabricatorConduitTokensSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorConfigApplication' => 'PhabricatorApplication', + 'PhabricatorConfigCacheController' => 'PhabricatorConfigServicesController', + 'PhabricatorConfigClusterDatabasesController' => 'PhabricatorConfigServicesController', + 'PhabricatorConfigClusterNotificationsController' => 'PhabricatorConfigServicesController', + 'PhabricatorConfigClusterRepositoriesController' => 'PhabricatorConfigServicesController', + 'PhabricatorConfigClusterSearchController' => 'PhabricatorConfigServicesController', + 'PhabricatorConfigCollectorsModule' => 'PhabricatorConfigModule', + 'PhabricatorConfigColumnSchema' => 'PhabricatorConfigStorageSchema', + 'PhabricatorConfigConfigPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorConfigConsoleController' => 'PhabricatorConfigController', + 'PhabricatorConfigConstants' => 'Phobject', 'PhabricatorConfigController' => 'PhabricatorController', + 'PhabricatorConfigCoreSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorConfigDatabaseController' => 'PhabricatorConfigServicesController', + 'PhabricatorConfigDatabaseIssueController' => 'PhabricatorConfigDatabaseController', + 'PhabricatorConfigDatabaseSchema' => 'PhabricatorConfigStorageSchema', 'PhabricatorConfigDatabaseSource' => 'PhabricatorConfigProxySource', + 'PhabricatorConfigDatabaseStatusController' => 'PhabricatorConfigDatabaseController', 'PhabricatorConfigDefaultSource' => 'PhabricatorConfigProxySource', 'PhabricatorConfigDictionarySource' => 'PhabricatorConfigSource', - 'PhabricatorConfigEditController' => 'PhabricatorConfigController', + 'PhabricatorConfigEdgeModule' => 'PhabricatorConfigModule', + 'PhabricatorConfigEditController' => 'PhabricatorConfigSettingsController', 'PhabricatorConfigEditor' => 'PhabricatorApplicationTransactionEditor', - 'PhabricatorConfigEntry' => - array( - 0 => 'PhabricatorConfigEntryDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorConfigEntry' => array( + 'PhabricatorConfigEntryDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', ), 'PhabricatorConfigEntryDAO' => 'PhabricatorLiskDAO', 'PhabricatorConfigEntryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorConfigFileSource' => 'PhabricatorConfigProxySource', - 'PhabricatorConfigGroupController' => 'PhabricatorConfigController', - 'PhabricatorConfigIgnoreController' => 'PhabricatorApplicationsController', + 'PhabricatorConfigGroupConstants' => 'PhabricatorConfigConstants', + 'PhabricatorConfigHTTPParameterTypesModule' => 'PhabricatorConfigModule', + 'PhabricatorConfigIgnoreController' => 'PhabricatorConfigController', 'PhabricatorConfigIssueListController' => 'PhabricatorConfigController', + 'PhabricatorConfigIssuePanelController' => 'PhabricatorConfigController', 'PhabricatorConfigIssueViewController' => 'PhabricatorConfigController', - 'PhabricatorConfigListController' => 'PhabricatorConfigController', + 'PhabricatorConfigJSON' => 'Phobject', + 'PhabricatorConfigJSONOptionType' => 'PhabricatorConfigOptionType', + 'PhabricatorConfigKeySchema' => 'PhabricatorConfigStorageSchema', 'PhabricatorConfigLocalSource' => 'PhabricatorConfigProxySource', 'PhabricatorConfigManagementDeleteWorkflow' => 'PhabricatorConfigManagementWorkflow', + 'PhabricatorConfigManagementDoneWorkflow' => 'PhabricatorConfigManagementWorkflow', 'PhabricatorConfigManagementGetWorkflow' => 'PhabricatorConfigManagementWorkflow', 'PhabricatorConfigManagementListWorkflow' => 'PhabricatorConfigManagementWorkflow', + 'PhabricatorConfigManagementMigrateWorkflow' => 'PhabricatorConfigManagementWorkflow', 'PhabricatorConfigManagementSetWorkflow' => 'PhabricatorConfigManagementWorkflow', - 'PhabricatorConfigManagementWorkflow' => 'PhutilArgumentWorkflow', - 'PhabricatorConfigOption' => - array( - 0 => 'Phobject', - 1 => 'PhabricatorMarkupInterface', - ), - 'PhabricatorConfigPHIDTypeConfig' => 'PhabricatorPHIDType', + 'PhabricatorConfigManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorConfigManualActivity' => 'PhabricatorConfigEntryDAO', + 'PhabricatorConfigModule' => 'Phobject', + 'PhabricatorConfigModuleController' => 'PhabricatorConfigController', + 'PhabricatorConfigOption' => 'Phobject', + 'PhabricatorConfigOptionType' => 'Phobject', + 'PhabricatorConfigPHIDModule' => 'PhabricatorConfigModule', 'PhabricatorConfigProxySource' => 'PhabricatorConfigSource', - 'PhabricatorConfigResponse' => 'AphrontHTMLResponse', + 'PhabricatorConfigPurgeCacheController' => 'PhabricatorConfigController', + 'PhabricatorConfigRegexOptionType' => 'PhabricatorConfigJSONOptionType', + 'PhabricatorConfigRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorConfigRequestExceptionHandlerModule' => 'PhabricatorConfigModule', + 'PhabricatorConfigResponse' => 'AphrontStandaloneHTMLResponse', + 'PhabricatorConfigSchemaQuery' => 'Phobject', + 'PhabricatorConfigSchemaSpec' => 'Phobject', + 'PhabricatorConfigServerSchema' => 'PhabricatorConfigStorageSchema', + 'PhabricatorConfigServicesController' => 'PhabricatorConfigController', + 'PhabricatorConfigSettingsController' => 'PhabricatorConfigController', + 'PhabricatorConfigSettingsHistoryController' => 'PhabricatorConfigSettingsController', + 'PhabricatorConfigSettingsListController' => 'PhabricatorConfigSettingsController', + 'PhabricatorConfigSetupCheckModule' => 'PhabricatorConfigModule', + 'PhabricatorConfigSiteModule' => 'PhabricatorConfigModule', + 'PhabricatorConfigSiteSource' => 'PhabricatorConfigProxySource', + 'PhabricatorConfigSource' => 'Phobject', 'PhabricatorConfigStackSource' => 'PhabricatorConfigSource', + 'PhabricatorConfigStorageSchema' => 'Phobject', + 'PhabricatorConfigTableSchema' => 'PhabricatorConfigStorageSchema', 'PhabricatorConfigTransaction' => 'PhabricatorApplicationTransaction', 'PhabricatorConfigTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorConfigType' => 'Phobject', 'PhabricatorConfigValidationException' => 'Exception', - 'PhabricatorConpherencePHIDTypeThread' => 'PhabricatorPHIDType', + 'PhabricatorConpherenceApplication' => 'PhabricatorApplication', + 'PhabricatorConpherenceColumnMinimizeSetting' => 'PhabricatorInternalSetting', + 'PhabricatorConpherenceColumnVisibleSetting' => 'PhabricatorInternalSetting', + 'PhabricatorConpherenceNotificationsSetting' => 'PhabricatorSelectSetting', + 'PhabricatorConpherencePreferencesSettingsPanel' => 'PhabricatorEditEngineSettingsPanel', + 'PhabricatorConpherenceProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorConpherenceRoomContextFreeGrammar' => 'PhutilContextFreeGrammar', + 'PhabricatorConpherenceRoomTestDataGenerator' => 'PhabricatorTestDataGenerator', + 'PhabricatorConpherenceSoundSetting' => 'PhabricatorSelectSetting', + 'PhabricatorConpherenceThreadPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorConpherenceWidgetVisibleSetting' => 'PhabricatorInternalSetting', + 'PhabricatorConsoleApplication' => 'PhabricatorApplication', + 'PhabricatorConsoleContentSource' => 'PhabricatorContentSource', + 'PhabricatorConstantChartFunction' => 'PhabricatorPureChartFunction', + 'PhabricatorContactNumbersSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorContentSource' => 'Phobject', + 'PhabricatorContentSourceModule' => 'PhabricatorConfigModule', 'PhabricatorContentSourceView' => 'AphrontView', + 'PhabricatorContributedToObjectEdgeType' => 'PhabricatorEdgeType', 'PhabricatorController' => 'AphrontController', + 'PhabricatorCookies' => 'Phobject', 'PhabricatorCoreConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorCountdown' => - array( - 0 => 'PhabricatorCountdownDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorCoreCreateTransaction' => 'PhabricatorCoreTransactionType', + 'PhabricatorCoreTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorCoreVoidTransaction' => 'PhabricatorModularTransactionType', + 'PhabricatorCosChartFunction' => 'PhabricatorPureChartFunction', + 'PhabricatorCountFact' => 'PhabricatorFact', + 'PhabricatorCountdown' => array( + 'PhabricatorCountdownDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorSpacesInterface', + 'PhabricatorProjectInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorConduitResultInterface', ), + 'PhabricatorCountdownApplication' => 'PhabricatorApplication', 'PhabricatorCountdownController' => 'PhabricatorController', + 'PhabricatorCountdownCountdownPHIDType' => 'PhabricatorPHIDType', 'PhabricatorCountdownDAO' => 'PhabricatorLiskDAO', - 'PhabricatorCountdownDeleteController' => 'PhabricatorCountdownController', + 'PhabricatorCountdownDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorCountdownDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorCountdownDescriptionTransaction' => 'PhabricatorCountdownTransactionType', 'PhabricatorCountdownEditController' => 'PhabricatorCountdownController', - 'PhabricatorCountdownListController' => - array( - 0 => 'PhabricatorCountdownController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), - 'PhabricatorCountdownPHIDTypeCountdown' => 'PhabricatorPHIDType', + 'PhabricatorCountdownEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorCountdownEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorCountdownEpochTransaction' => 'PhabricatorCountdownTransactionType', + 'PhabricatorCountdownListController' => 'PhabricatorCountdownController', + 'PhabricatorCountdownMailReceiver' => 'PhabricatorObjectMailReceiver', 'PhabricatorCountdownQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhabricatorCountdownRemarkupRule' => 'PhabricatorRemarkupRuleObject', + 'PhabricatorCountdownRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'PhabricatorCountdownReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PhabricatorCountdownSchemaSpec' => 'PhabricatorConfigSchemaSpec', 'PhabricatorCountdownSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'PhabricatorCountdownView' => 'AphrontTagView', + 'PhabricatorCountdownTitleTransaction' => 'PhabricatorCountdownTransactionType', + 'PhabricatorCountdownTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorCountdownTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'PhabricatorCountdownTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorCountdownTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorCountdownView' => 'AphrontView', 'PhabricatorCountdownViewController' => 'PhabricatorCountdownController', - 'PhabricatorCountedToggleButtonsExample' => 'PhabricatorUIExample', - 'PhabricatorCrumbView' => 'AphrontView', - 'PhabricatorCrumbsView' => 'AphrontView', + 'PhabricatorCredentialEditField' => 'PhabricatorEditField', 'PhabricatorCursorPagedPolicyAwareQuery' => 'PhabricatorPolicyAwareQuery', + 'PhabricatorCustomField' => 'Phobject', + 'PhabricatorCustomFieldApplicationSearchAnyFunctionDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorCustomFieldApplicationSearchDatasource' => 'PhabricatorTypeaheadProxyDatasource', + 'PhabricatorCustomFieldApplicationSearchNoneFunctionDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorCustomFieldAttachment' => 'Phobject', 'PhabricatorCustomFieldConfigOptionType' => 'PhabricatorConfigOptionType', 'PhabricatorCustomFieldDataNotAvailableException' => 'Exception', + 'PhabricatorCustomFieldEditEngineExtension' => 'PhabricatorEditEngineExtension', + 'PhabricatorCustomFieldEditField' => 'PhabricatorEditField', + 'PhabricatorCustomFieldEditType' => 'PhabricatorEditType', + 'PhabricatorCustomFieldExportEngineExtension' => 'PhabricatorExportEngineExtension', + 'PhabricatorCustomFieldFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension', + 'PhabricatorCustomFieldHeraldAction' => 'HeraldAction', + 'PhabricatorCustomFieldHeraldActionGroup' => 'HeraldActionGroup', + 'PhabricatorCustomFieldHeraldField' => 'HeraldField', + 'PhabricatorCustomFieldHeraldFieldGroup' => 'HeraldFieldGroup', 'PhabricatorCustomFieldImplementationIncompleteException' => 'Exception', 'PhabricatorCustomFieldIndexStorage' => 'PhabricatorLiskDAO', + 'PhabricatorCustomFieldList' => 'Phobject', + 'PhabricatorCustomFieldMonogramParser' => 'Phobject', 'PhabricatorCustomFieldNotAttachedException' => 'Exception', + 'PhabricatorCustomFieldNotProxyException' => 'Exception', 'PhabricatorCustomFieldNumericIndexStorage' => 'PhabricatorCustomFieldIndexStorage', + 'PhabricatorCustomFieldSearchEngineExtension' => 'PhabricatorSearchEngineExtension', 'PhabricatorCustomFieldStorage' => 'PhabricatorLiskDAO', + 'PhabricatorCustomFieldStorageQuery' => 'Phobject', 'PhabricatorCustomFieldStringIndexStorage' => 'PhabricatorCustomFieldIndexStorage', - 'PhabricatorCustomFieldValidationException' => 'Exception', + 'PhabricatorCustomLogoConfigType' => 'PhabricatorConfigOptionType', + 'PhabricatorCustomUIFooterConfigType' => 'PhabricatorConfigJSONOptionType', 'PhabricatorDaemon' => 'PhutilDaemon', - 'PhabricatorDaemonCombinedLogController' => 'PhabricatorDaemonController', + 'PhabricatorDaemonBulkJobController' => 'PhabricatorDaemonController', + 'PhabricatorDaemonBulkJobListController' => 'PhabricatorDaemonBulkJobController', + 'PhabricatorDaemonBulkJobMonitorController' => 'PhabricatorDaemonBulkJobController', + 'PhabricatorDaemonBulkJobViewController' => 'PhabricatorDaemonBulkJobController', 'PhabricatorDaemonConsoleController' => 'PhabricatorDaemonController', + 'PhabricatorDaemonContentSource' => 'PhabricatorContentSource', 'PhabricatorDaemonController' => 'PhabricatorController', 'PhabricatorDaemonDAO' => 'PhabricatorLiskDAO', - 'PhabricatorDaemonEventListener' => 'PhutilEventListener', - 'PhabricatorDaemonLog' => - array( - 0 => 'PhabricatorDaemonDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorDaemonEventListener' => 'PhabricatorEventListener', + 'PhabricatorDaemonLockLog' => 'PhabricatorDaemonDAO', + 'PhabricatorDaemonLockLogGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorDaemonLog' => array( + 'PhabricatorDaemonDAO', + 'PhabricatorPolicyInterface', ), 'PhabricatorDaemonLogEvent' => 'PhabricatorDaemonDAO', - 'PhabricatorDaemonLogEventViewController' => 'PhabricatorDaemonController', - 'PhabricatorDaemonLogEventsView' => 'AphrontView', + 'PhabricatorDaemonLogEventGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorDaemonLogGarbageCollector' => 'PhabricatorGarbageCollector', 'PhabricatorDaemonLogListController' => 'PhabricatorDaemonController', 'PhabricatorDaemonLogListView' => 'AphrontView', 'PhabricatorDaemonLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', @@ -3118,623 +9441,2322 @@ 'PhabricatorDaemonManagementLaunchWorkflow' => 'PhabricatorDaemonManagementWorkflow', 'PhabricatorDaemonManagementListWorkflow' => 'PhabricatorDaemonManagementWorkflow', 'PhabricatorDaemonManagementLogWorkflow' => 'PhabricatorDaemonManagementWorkflow', + 'PhabricatorDaemonManagementReloadWorkflow' => 'PhabricatorDaemonManagementWorkflow', 'PhabricatorDaemonManagementRestartWorkflow' => 'PhabricatorDaemonManagementWorkflow', 'PhabricatorDaemonManagementStartWorkflow' => 'PhabricatorDaemonManagementWorkflow', 'PhabricatorDaemonManagementStatusWorkflow' => 'PhabricatorDaemonManagementWorkflow', 'PhabricatorDaemonManagementStopWorkflow' => 'PhabricatorDaemonManagementWorkflow', - 'PhabricatorDaemonManagementWorkflow' => 'PhutilArgumentWorkflow', + 'PhabricatorDaemonManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorDaemonOverseerModule' => 'PhutilDaemonOverseerModule', + 'PhabricatorDaemonReference' => 'Phobject', + 'PhabricatorDaemonTaskGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorDaemonTasksTableView' => 'AphrontView', + 'PhabricatorDaemonsApplication' => 'PhabricatorApplication', + 'PhabricatorDaemonsSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorDailyRoutineTriggerClock' => 'PhabricatorTriggerClock', + 'PhabricatorDarkConsoleSetting' => 'PhabricatorSelectSetting', + 'PhabricatorDarkConsoleTabSetting' => 'PhabricatorInternalSetting', + 'PhabricatorDarkConsoleVisibleSetting' => 'PhabricatorInternalSetting', + 'PhabricatorDashboard' => array( + 'PhabricatorDashboardDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorProjectInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + 'PhabricatorDashboardPanelContainerInterface', + ), + 'PhabricatorDashboardAdjustController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardApplication' => 'PhabricatorApplication', + 'PhabricatorDashboardApplicationInstallWorkflow' => 'PhabricatorDashboardInstallWorkflow', + 'PhabricatorDashboardArchiveController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardChartPanelChartTransaction' => 'PhabricatorDashboardPanelPropertyTransaction', + 'PhabricatorDashboardChartPanelType' => 'PhabricatorDashboardPanelType', + 'PhabricatorDashboardColumn' => 'Phobject', + 'PhabricatorDashboardConsoleController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardController' => 'PhabricatorController', + 'PhabricatorDashboardDAO' => 'PhabricatorLiskDAO', + 'PhabricatorDashboardDashboardPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorDashboardDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorDashboardEditController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorDashboardFavoritesInstallWorkflow' => 'PhabricatorDashboardApplicationInstallWorkflow', + 'PhabricatorDashboardFerretEngine' => 'PhabricatorFerretEngine', + 'PhabricatorDashboardFullLayoutMode' => 'PhabricatorDashboardLayoutMode', + 'PhabricatorDashboardFulltextEngine' => 'PhabricatorFulltextEngine', + 'PhabricatorDashboardHalfLayoutMode' => 'PhabricatorDashboardLayoutMode', + 'PhabricatorDashboardHomeInstallWorkflow' => 'PhabricatorDashboardApplicationInstallWorkflow', + 'PhabricatorDashboardIconSet' => 'PhabricatorIconSet', + 'PhabricatorDashboardIconTransaction' => 'PhabricatorDashboardTransactionType', + 'PhabricatorDashboardInstallController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardInstallWorkflow' => 'Phobject', + 'PhabricatorDashboardLayoutMode' => 'Phobject', + 'PhabricatorDashboardLayoutTransaction' => 'PhabricatorDashboardTransactionType', + 'PhabricatorDashboardListController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardNameTransaction' => 'PhabricatorDashboardTransactionType', + 'PhabricatorDashboardObjectInstallWorkflow' => 'PhabricatorDashboardInstallWorkflow', + 'PhabricatorDashboardOneThirdLayoutMode' => 'PhabricatorDashboardLayoutMode', + 'PhabricatorDashboardPanel' => array( + 'PhabricatorDashboardDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + 'PhabricatorDashboardPanelContainerInterface', + ), + 'PhabricatorDashboardPanelArchiveController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardPanelContainerIndexEngineExtension' => 'PhabricatorEdgeIndexEngineExtension', + 'PhabricatorDashboardPanelDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorDashboardPanelEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'PhabricatorDashboardPanelEditController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardPanelEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorDashboardPanelFerretEngine' => 'PhabricatorFerretEngine', + 'PhabricatorDashboardPanelFulltextEngine' => 'PhabricatorFulltextEngine', + 'PhabricatorDashboardPanelListController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardPanelNameTransaction' => 'PhabricatorDashboardPanelTransactionType', + 'PhabricatorDashboardPanelPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorDashboardPanelPropertyTransaction' => 'PhabricatorDashboardPanelTransactionType', + 'PhabricatorDashboardPanelQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorDashboardPanelRef' => 'Phobject', + 'PhabricatorDashboardPanelRefList' => 'Phobject', + 'PhabricatorDashboardPanelRenderController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardPanelRenderingEngine' => 'Phobject', + 'PhabricatorDashboardPanelSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorDashboardPanelStatusTransaction' => 'PhabricatorDashboardPanelTransactionType', + 'PhabricatorDashboardPanelTabsController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardPanelTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorDashboardPanelTransactionEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorDashboardPanelTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorDashboardPanelTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorDashboardPanelType' => 'Phobject', + 'PhabricatorDashboardPanelUsedByObjectEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorDashboardPanelViewController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardPanelsTransaction' => 'PhabricatorDashboardTransactionType', + 'PhabricatorDashboardPortal' => array( + 'PhabricatorDashboardDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorProjectInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + ), + 'PhabricatorDashboardPortalController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardPortalDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorDashboardPortalEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'PhabricatorDashboardPortalEditController' => 'PhabricatorDashboardPortalController', + 'PhabricatorDashboardPortalEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorDashboardPortalEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorDashboardPortalFerretEngine' => 'PhabricatorFerretEngine', + 'PhabricatorDashboardPortalFulltextEngine' => 'PhabricatorFulltextEngine', + 'PhabricatorDashboardPortalInstallWorkflow' => 'PhabricatorDashboardObjectInstallWorkflow', + 'PhabricatorDashboardPortalListController' => 'PhabricatorDashboardPortalController', + 'PhabricatorDashboardPortalMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorDashboardPortalNameTransaction' => 'PhabricatorDashboardPortalTransactionType', + 'PhabricatorDashboardPortalPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorDashboardPortalProfileMenuEngine' => 'PhabricatorProfileMenuEngine', + 'PhabricatorDashboardPortalQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorDashboardPortalSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PhabricatorDashboardPortalSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorDashboardPortalStatus' => 'Phobject', + 'PhabricatorDashboardPortalTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorDashboardPortalTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorDashboardPortalTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorDashboardPortalViewController' => 'PhabricatorDashboardPortalController', + 'PhabricatorDashboardProfileController' => 'PhabricatorController', + 'PhabricatorDashboardProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorDashboardProjectInstallWorkflow' => 'PhabricatorDashboardObjectInstallWorkflow', + 'PhabricatorDashboardQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorDashboardQueryPanelApplicationEditField' => 'PhabricatorEditField', + 'PhabricatorDashboardQueryPanelApplicationTransaction' => 'PhabricatorDashboardPanelPropertyTransaction', + 'PhabricatorDashboardQueryPanelInstallController' => 'PhabricatorDashboardController', + 'PhabricatorDashboardQueryPanelLimitTransaction' => 'PhabricatorDashboardPanelPropertyTransaction', + 'PhabricatorDashboardQueryPanelQueryEditField' => 'PhabricatorEditField', + 'PhabricatorDashboardQueryPanelQueryTransaction' => 'PhabricatorDashboardPanelPropertyTransaction', + 'PhabricatorDashboardQueryPanelType' => 'PhabricatorDashboardPanelType', + 'PhabricatorDashboardRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'PhabricatorDashboardRenderingEngine' => 'Phobject', + 'PhabricatorDashboardSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorDashboardSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorDashboardStatusTransaction' => 'PhabricatorDashboardTransactionType', + 'PhabricatorDashboardTabsPanelTabsTransaction' => 'PhabricatorDashboardPanelPropertyTransaction', + 'PhabricatorDashboardTabsPanelType' => 'PhabricatorDashboardPanelType', + 'PhabricatorDashboardTextPanelTextTransaction' => 'PhabricatorDashboardPanelPropertyTransaction', + 'PhabricatorDashboardTextPanelType' => 'PhabricatorDashboardPanelType', + 'PhabricatorDashboardTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorDashboardTransactionEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorDashboardTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorDashboardTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorDashboardTwoThirdsLayoutMode' => 'PhabricatorDashboardLayoutMode', + 'PhabricatorDashboardViewController' => 'PhabricatorDashboardProfileController', + 'PhabricatorDataCacheSpec' => 'PhabricatorCacheSpec', 'PhabricatorDataNotAttachedException' => 'Exception', + 'PhabricatorDatabaseRef' => 'Phobject', + 'PhabricatorDatabaseRefParser' => 'Phobject', + 'PhabricatorDatabaseSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorDatasourceApplicationEngineExtension' => 'PhabricatorDatasourceEngineExtension', + 'PhabricatorDatasourceEditField' => 'PhabricatorTokenizerEditField', + 'PhabricatorDatasourceEditType' => 'PhabricatorPHIDListEditType', + 'PhabricatorDatasourceEngine' => 'Phobject', + 'PhabricatorDatasourceEngineExtension' => 'Phobject', + 'PhabricatorDatasourceURIEngineExtension' => 'PhabricatorDatasourceEngineExtension', + 'PhabricatorDateFormatSetting' => 'PhabricatorSelectSetting', + 'PhabricatorDateTimeSettingsPanel' => 'PhabricatorEditEngineSettingsPanel', 'PhabricatorDebugController' => 'PhabricatorController', - 'PhabricatorDefaultFileStorageEngineSelector' => 'PhabricatorFileStorageEngineSelector', - 'PhabricatorDefaultSearchEngineSelector' => 'PhabricatorSearchEngineSelector', + 'PhabricatorDefaultRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler', + 'PhabricatorDefaultSyntaxStyle' => 'PhabricatorSyntaxStyle', + 'PhabricatorDefaultUnlockEngine' => 'PhabricatorUnlockEngine', + 'PhabricatorDemoChartEngine' => 'PhabricatorChartEngine', + 'PhabricatorDestructibleCodex' => 'Phobject', + 'PhabricatorDestructionEngine' => 'Phobject', + 'PhabricatorDestructionEngineExtension' => 'Phobject', + 'PhabricatorDestructionEngineExtensionModule' => 'PhabricatorConfigModule', 'PhabricatorDeveloperConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorDeveloperPreferencesSettingsPanel' => 'PhabricatorEditEngineSettingsPanel', + 'PhabricatorDiffInlineCommentContentState' => 'PhabricatorInlineCommentContentState', + 'PhabricatorDiffInlineCommentContext' => 'PhabricatorInlineCommentContext', + 'PhabricatorDiffInlineCommentQuery' => 'PhabricatorApplicationTransactionCommentQuery', + 'PhabricatorDiffPreferencesSettingsPanel' => 'PhabricatorEditEngineSettingsPanel', + 'PhabricatorDiffScopeEngine' => 'Phobject', + 'PhabricatorDiffScopeEngineTestCase' => 'PhabricatorTestCase', + 'PhabricatorDifferenceEngine' => 'Phobject', + 'PhabricatorDifferentialApplication' => 'PhabricatorApplication', + 'PhabricatorDifferentialAttachCommitWorkflow' => 'PhabricatorDifferentialManagementWorkflow', 'PhabricatorDifferentialConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorDifferentialExtractWorkflow' => 'PhabricatorDifferentialManagementWorkflow', + 'PhabricatorDifferentialManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorDifferentialMigrateHunkWorkflow' => 'PhabricatorDifferentialManagementWorkflow', + 'PhabricatorDifferentialRebuildChangesetsWorkflow' => 'PhabricatorDifferentialManagementWorkflow', 'PhabricatorDifferentialRevisionTestDataGenerator' => 'PhabricatorTestDataGenerator', + 'PhabricatorDiffusionApplication' => 'PhabricatorApplication', + 'PhabricatorDiffusionBlameSetting' => 'PhabricatorInternalSetting', 'PhabricatorDiffusionConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorDirectoryController' => 'PhabricatorController', - 'PhabricatorDirectoryMainController' => 'PhabricatorDirectoryController', 'PhabricatorDisabledUserController' => 'PhabricatorAuthController', - 'PhabricatorDisqusConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorDisplayPreferencesSettingsPanel' => 'PhabricatorEditEngineSettingsPanel', + 'PhabricatorDisqusAuthProvider' => 'PhabricatorOAuth2AuthProvider', + 'PhabricatorDividerEditField' => 'PhabricatorEditField', + 'PhabricatorDividerProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorDivinerApplication' => 'PhabricatorApplication', + 'PhabricatorDocumentEngine' => 'Phobject', + 'PhabricatorDocumentEngineBlock' => 'Phobject', + 'PhabricatorDocumentEngineBlockDiff' => 'Phobject', + 'PhabricatorDocumentEngineBlocks' => 'Phobject', + 'PhabricatorDocumentEngineParserException' => 'Exception', + 'PhabricatorDocumentRef' => 'Phobject', + 'PhabricatorDocumentRenderingEngine' => 'Phobject', + 'PhabricatorDoorkeeperApplication' => 'PhabricatorApplication', + 'PhabricatorDoubleExportField' => 'PhabricatorExportField', 'PhabricatorDraft' => 'PhabricatorDraftDAO', 'PhabricatorDraftDAO' => 'PhabricatorLiskDAO', + 'PhabricatorDraftEngine' => 'Phobject', + 'PhabricatorDrydockApplication' => 'PhabricatorApplication', + 'PhabricatorDuoAuthFactor' => 'PhabricatorAuthFactor', + 'PhabricatorDuoFuture' => 'FutureProxy', + 'PhabricatorEdgeChangeRecord' => 'Phobject', + 'PhabricatorEdgeChangeRecordTestCase' => 'PhabricatorTestCase', 'PhabricatorEdgeConfig' => 'PhabricatorEdgeConstants', + 'PhabricatorEdgeConstants' => 'Phobject', 'PhabricatorEdgeCycleException' => 'Exception', - 'PhabricatorEdgeEditor' => 'PhabricatorEditor', + 'PhabricatorEdgeEditType' => 'PhabricatorPHIDListEditType', + 'PhabricatorEdgeEditor' => 'Phobject', 'PhabricatorEdgeGraph' => 'AbstractDirectedGraph', + 'PhabricatorEdgeIndexEngineExtension' => 'PhabricatorIndexEngineExtension', + 'PhabricatorEdgeObject' => array( + 'Phobject', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorEdgeObjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorEdgeQuery' => 'PhabricatorQuery', 'PhabricatorEdgeTestCase' => 'PhabricatorTestCase', + 'PhabricatorEdgeType' => 'Phobject', + 'PhabricatorEdgeTypeTestCase' => 'PhabricatorTestCase', + 'PhabricatorEdgesDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', + 'PhabricatorEditEngine' => array( + 'Phobject', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorEditEngineAPIMethod' => 'ConduitAPIMethod', + 'PhabricatorEditEngineBulkJobType' => 'PhabricatorWorkerBulkJobType', + 'PhabricatorEditEngineCheckboxesCommentAction' => 'PhabricatorEditEngineCommentAction', + 'PhabricatorEditEngineColumnsCommentAction' => 'PhabricatorEditEngineCommentAction', + 'PhabricatorEditEngineCommentAction' => 'Phobject', + 'PhabricatorEditEngineCommentActionGroup' => 'Phobject', + 'PhabricatorEditEngineConfiguration' => array( + 'PhabricatorSearchDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorEditEngineConfigurationDefaultCreateController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineConfigurationDefaultsController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineConfigurationDisableController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineConfigurationEditController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineConfigurationEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorEditEngineConfigurationEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorEditEngineConfigurationIsEditController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineConfigurationListController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineConfigurationLockController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineConfigurationPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorEditEngineConfigurationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorEditEngineConfigurationReorderController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineConfigurationSaveController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineConfigurationSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorEditEngineConfigurationSortController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineConfigurationSubtypeController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineConfigurationTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorEditEngineConfigurationTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorEditEngineConfigurationViewController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineController' => 'PhabricatorApplicationTransactionController', + 'PhabricatorEditEngineCreateOrderTransaction' => 'PhabricatorEditEngineTransactionType', + 'PhabricatorEditEngineDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorEditEngineDefaultCreateTransaction' => 'PhabricatorEditEngineTransactionType', + 'PhabricatorEditEngineDefaultLock' => 'PhabricatorEditEngineLock', + 'PhabricatorEditEngineDefaultTransaction' => 'PhabricatorEditEngineTransactionType', + 'PhabricatorEditEngineDisableTransaction' => 'PhabricatorEditEngineTransactionType', + 'PhabricatorEditEngineEditOrderTransaction' => 'PhabricatorEditEngineTransactionType', + 'PhabricatorEditEngineExtension' => 'Phobject', + 'PhabricatorEditEngineExtensionModule' => 'PhabricatorConfigModule', + 'PhabricatorEditEngineIsEditTransaction' => 'PhabricatorEditEngineTransactionType', + 'PhabricatorEditEngineListController' => 'PhabricatorEditEngineController', + 'PhabricatorEditEngineLock' => 'Phobject', + 'PhabricatorEditEngineLocksTransaction' => 'PhabricatorEditEngineTransactionType', + 'PhabricatorEditEngineMFAEngine' => 'Phobject', + 'PhabricatorEditEngineNameTransaction' => 'PhabricatorEditEngineTransactionType', + 'PhabricatorEditEngineOrderTransaction' => 'PhabricatorEditEngineTransactionType', + 'PhabricatorEditEnginePageState' => 'Phobject', + 'PhabricatorEditEnginePointsCommentAction' => 'PhabricatorEditEngineCommentAction', + 'PhabricatorEditEnginePreambleTransaction' => 'PhabricatorEditEngineTransactionType', + 'PhabricatorEditEngineProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorEditEngineQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorEditEngineSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorEditEngineSelectCommentAction' => 'PhabricatorEditEngineCommentAction', + 'PhabricatorEditEngineSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorEditEngineStaticCommentAction' => 'PhabricatorEditEngineCommentAction', + 'PhabricatorEditEngineSubtype' => 'Phobject', + 'PhabricatorEditEngineSubtypeHeraldField' => 'HeraldField', + 'PhabricatorEditEngineSubtypeMap' => 'Phobject', + 'PhabricatorEditEngineSubtypeTestCase' => 'PhabricatorTestCase', + 'PhabricatorEditEngineSubtypeTransaction' => 'PhabricatorEditEngineTransactionType', + 'PhabricatorEditEngineTokenizerCommentAction' => 'PhabricatorEditEngineCommentAction', + 'PhabricatorEditEngineTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorEditField' => 'Phobject', + 'PhabricatorEditPage' => 'Phobject', + 'PhabricatorEditType' => 'Phobject', 'PhabricatorEditor' => 'Phobject', + 'PhabricatorEditorExtension' => 'Phobject', + 'PhabricatorEditorExtensionModule' => 'PhabricatorConfigModule', + 'PhabricatorEditorMailEngineExtension' => 'PhabricatorMailEngineExtension', + 'PhabricatorEditorSetting' => 'PhabricatorStringSetting', + 'PhabricatorEditorURIEngine' => 'Phobject', + 'PhabricatorEditorURIEngineTestCase' => 'PhabricatorTestCase', + 'PhabricatorEditorURIParserException' => 'Exception', + 'PhabricatorElasticFulltextStorageEngine' => 'PhabricatorFulltextStorageEngine', + 'PhabricatorElasticsearchHost' => 'PhabricatorSearchHost', + 'PhabricatorElasticsearchSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorEmailAddressesSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorEmailContentSource' => 'PhabricatorContentSource', + 'PhabricatorEmailDeliverySettingsPanel' => 'PhabricatorEditEngineSettingsPanel', + 'PhabricatorEmailFormatSetting' => 'PhabricatorSelectSetting', + 'PhabricatorEmailFormatSettingsPanel' => 'PhabricatorEditEngineSettingsPanel', 'PhabricatorEmailLoginController' => 'PhabricatorAuthController', - 'PhabricatorEmailTokenController' => 'PhabricatorAuthController', + 'PhabricatorEmailLoginUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorEmailNotificationsSetting' => 'PhabricatorSelectSetting', + 'PhabricatorEmailPreferencesSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorEmailRePrefixSetting' => 'PhabricatorSelectSetting', + 'PhabricatorEmailSelfActionsSetting' => 'PhabricatorSelectSetting', + 'PhabricatorEmailStampsSetting' => 'PhabricatorSelectSetting', + 'PhabricatorEmailTagsSetting' => 'PhabricatorInternalSetting', + 'PhabricatorEmailVarySubjectsSetting' => 'PhabricatorSelectSetting', 'PhabricatorEmailVerificationController' => 'PhabricatorAuthController', + 'PhabricatorEmbedFileRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'PhabricatorEmojiDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorEmojiRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorEmojiTranslation' => 'PhutilTranslation', 'PhabricatorEmptyQueryException' => 'Exception', - 'PhabricatorEnglishTranslation' => 'PhabricatorBaseEnglishTranslation', + 'PhabricatorEnterHisecUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorEnumConfigType' => 'PhabricatorTextConfigType', + 'PhabricatorEnv' => 'Phobject', 'PhabricatorEnvTestCase' => 'PhabricatorTestCase', - 'PhabricatorErrorExample' => 'PhabricatorUIExample', + 'PhabricatorEpochEditField' => 'PhabricatorEditField', + 'PhabricatorEpochExportField' => 'PhabricatorExportField', 'PhabricatorEvent' => 'PhutilEvent', + 'PhabricatorEventEngine' => 'Phobject', + 'PhabricatorEventListener' => 'PhutilEventListener', 'PhabricatorEventType' => 'PhutilEventType', - 'PhabricatorExampleEventListener' => 'PhutilEventListener', + 'PhabricatorExampleEventListener' => 'PhabricatorEventListener', + 'PhabricatorExcelExportFormat' => 'PhabricatorExportFormat', + 'PhabricatorExecFutureFileUploadSource' => 'PhabricatorFileUploadSource', + 'PhabricatorExitHisecUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorExportEngine' => 'Phobject', + 'PhabricatorExportEngineBulkJobType' => 'PhabricatorWorkerSingleBulkJobType', + 'PhabricatorExportEngineExtension' => 'Phobject', + 'PhabricatorExportField' => 'Phobject', + 'PhabricatorExportFormat' => 'Phobject', + 'PhabricatorExportFormatSetting' => 'PhabricatorInternalSetting', 'PhabricatorExtendingPhabricatorConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorExternalAccount' => - array( - 0 => 'PhabricatorUserDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorExtensionsSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorExternalAccount' => array( + 'PhabricatorUserDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorExternalAccountIdentifier' => array( + 'PhabricatorUserDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', ), + 'PhabricatorExternalAccountIdentifierQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorExternalAccountQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorExternalAccountsSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorExternalEditorSettingsPanel' => 'PhabricatorEditEngineSettingsPanel', + 'PhabricatorExtraConfigSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorFacebookAuthProvider' => 'PhabricatorOAuth2AuthProvider', + 'PhabricatorFact' => 'Phobject', 'PhabricatorFactAggregate' => 'PhabricatorFactDAO', + 'PhabricatorFactApplication' => 'PhabricatorApplication', + 'PhabricatorFactChart' => array( + 'PhabricatorFactDAO', + 'PhabricatorPolicyInterface', + ), 'PhabricatorFactChartController' => 'PhabricatorFactController', + 'PhabricatorFactChartFunction' => 'PhabricatorChartFunction', 'PhabricatorFactController' => 'PhabricatorController', - 'PhabricatorFactCountEngine' => 'PhabricatorFactEngine', 'PhabricatorFactCursor' => 'PhabricatorFactDAO', 'PhabricatorFactDAO' => 'PhabricatorLiskDAO', 'PhabricatorFactDaemon' => 'PhabricatorDaemon', + 'PhabricatorFactDatapointQuery' => 'Phobject', + 'PhabricatorFactDimension' => 'PhabricatorFactDAO', + 'PhabricatorFactEngine' => 'Phobject', + 'PhabricatorFactEngineTestCase' => 'PhabricatorTestCase', 'PhabricatorFactHomeController' => 'PhabricatorFactController', - 'PhabricatorFactLastUpdatedEngine' => 'PhabricatorFactEngine', + 'PhabricatorFactIntDatapoint' => 'PhabricatorFactDAO', + 'PhabricatorFactKeyDimension' => 'PhabricatorFactDimension', 'PhabricatorFactManagementAnalyzeWorkflow' => 'PhabricatorFactManagementWorkflow', 'PhabricatorFactManagementCursorsWorkflow' => 'PhabricatorFactManagementWorkflow', 'PhabricatorFactManagementDestroyWorkflow' => 'PhabricatorFactManagementWorkflow', 'PhabricatorFactManagementListWorkflow' => 'PhabricatorFactManagementWorkflow', - 'PhabricatorFactManagementStatusWorkflow' => 'PhabricatorFactManagementWorkflow', - 'PhabricatorFactManagementWorkflow' => 'PhutilArgumentWorkflow', + 'PhabricatorFactManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorFactObjectController' => 'PhabricatorFactController', + 'PhabricatorFactObjectDimension' => 'PhabricatorFactDimension', 'PhabricatorFactRaw' => 'PhabricatorFactDAO', - 'PhabricatorFactSimpleSpec' => 'PhabricatorFactSpec', 'PhabricatorFactUpdateIterator' => 'PhutilBufferedIterator', + 'PhabricatorFailHisecUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorFaviconController' => 'PhabricatorController', + 'PhabricatorFaviconRef' => 'Phobject', + 'PhabricatorFaviconRefQuery' => 'Phobject', + 'PhabricatorFavoritesApplication' => 'PhabricatorApplication', + 'PhabricatorFavoritesController' => 'PhabricatorController', + 'PhabricatorFavoritesMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension', + 'PhabricatorFavoritesMenuItemController' => 'PhabricatorFavoritesController', + 'PhabricatorFavoritesProfileMenuEngine' => 'PhabricatorProfileMenuEngine', + 'PhabricatorFaxContentSource' => 'PhabricatorContentSource', + 'PhabricatorFeedApplication' => 'PhabricatorApplication', + 'PhabricatorFeedBuilder' => 'Phobject', 'PhabricatorFeedConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorFeedController' => 'PhabricatorController', 'PhabricatorFeedDAO' => 'PhabricatorLiskDAO', 'PhabricatorFeedDetailController' => 'PhabricatorFeedController', - 'PhabricatorFeedListController' => - array( - 0 => 'PhabricatorFeedController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), + 'PhabricatorFeedListController' => 'PhabricatorFeedController', 'PhabricatorFeedManagementRepublishWorkflow' => 'PhabricatorFeedManagementWorkflow', - 'PhabricatorFeedManagementWorkflow' => 'PhutilArgumentWorkflow', - 'PhabricatorFeedPublicStreamController' => 'PhabricatorFeedController', + 'PhabricatorFeedManagementWorkflow' => 'PhabricatorManagementWorkflow', 'PhabricatorFeedQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorFeedSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'PhabricatorFeedStory' => 'PhabricatorPolicyInterface', - 'PhabricatorFeedStoryAggregate' => 'PhabricatorFeedStory', - 'PhabricatorFeedStoryAudit' => 'PhabricatorFeedStory', - 'PhabricatorFeedStoryCommit' => 'PhabricatorFeedStory', - 'PhabricatorFeedStoryData' => 'PhabricatorFeedDAO', - 'PhabricatorFeedStoryDifferential' => 'PhabricatorFeedStory', - 'PhabricatorFeedStoryDifferentialAggregate' => 'PhabricatorFeedStoryAggregate', - 'PhabricatorFeedStoryManiphest' => 'PhabricatorFeedStory', - 'PhabricatorFeedStoryManiphestAggregate' => 'PhabricatorFeedStoryAggregate', + 'PhabricatorFeedStory' => array( + 'Phobject', + 'PhabricatorPolicyInterface', + 'PhabricatorMarkupInterface', + ), + 'PhabricatorFeedStoryData' => array( + 'PhabricatorFeedDAO', + 'PhabricatorDestructibleInterface', + ), 'PhabricatorFeedStoryNotification' => 'PhabricatorFeedDAO', - 'PhabricatorFeedStoryPhriction' => 'PhabricatorFeedStory', - 'PhabricatorFeedStoryProject' => 'PhabricatorFeedStory', + 'PhabricatorFeedStoryPublisher' => 'Phobject', 'PhabricatorFeedStoryReference' => 'PhabricatorFeedDAO', - 'PhabricatorFeedStoryStatus' => 'PhabricatorFeedStory', - 'PhabricatorFeedStoryTypeConstants' => 'PhabricatorFeedConstants', - 'PhabricatorFile' => - array( - 0 => 'PhabricatorFileDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorFeedTransactionListController' => 'PhabricatorFeedController', + 'PhabricatorFeedTransactionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorFeedTransactionSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorFerretEngine' => 'Phobject', + 'PhabricatorFerretEngineTestCase' => 'PhabricatorTestCase', + 'PhabricatorFerretFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension', + 'PhabricatorFerretFulltextStorageEngine' => 'PhabricatorFulltextStorageEngine', + 'PhabricatorFerretMetadata' => 'Phobject', + 'PhabricatorFerretSearchEngineExtension' => 'PhabricatorSearchEngineExtension', + 'PhabricatorFile' => array( + 'PhabricatorFileDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorIndexableInterface', + 'PhabricatorNgramsInterface', + ), + 'PhabricatorFileAES256StorageFormat' => 'PhabricatorFileStorageFormat', + 'PhabricatorFileAltTextTransaction' => 'PhabricatorFileTransactionType', + 'PhabricatorFileAttachment' => array( + 'PhabricatorFileDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', ), + 'PhabricatorFileAttachmentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorFileBundleLoader' => 'Phobject', + 'PhabricatorFileChunk' => array( + 'PhabricatorFileDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorFileChunkIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhabricatorFileChunkQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorFileComposeController' => 'PhabricatorFileController', 'PhabricatorFileController' => 'PhabricatorController', 'PhabricatorFileDAO' => 'PhabricatorLiskDAO', 'PhabricatorFileDataController' => 'PhabricatorFileController', 'PhabricatorFileDeleteController' => 'PhabricatorFileController', + 'PhabricatorFileDeleteTransaction' => 'PhabricatorFileTransactionType', + 'PhabricatorFileDetachController' => 'PhabricatorFileController', + 'PhabricatorFileDocumentController' => 'PhabricatorFileController', + 'PhabricatorFileDocumentRenderingEngine' => 'PhabricatorDocumentRenderingEngine', 'PhabricatorFileDropUploadController' => 'PhabricatorFileController', - 'PhabricatorFileImageMacro' => - array( - 0 => 'PhabricatorFileDAO', - 1 => 'PhabricatorSubscribableInterface', - 2 => 'PhabricatorApplicationTransactionInterface', - 3 => 'PhabricatorPolicyInterface', - ), - 'PhabricatorFileInfoController' => 'PhabricatorFileController', - 'PhabricatorFileLinkListView' => 'AphrontView', - 'PhabricatorFileLinkView' => 'AphrontView', - 'PhabricatorFileListController' => - array( - 0 => 'PhabricatorFileController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), - 'PhabricatorFilePHIDTypeFile' => 'PhabricatorPHIDType', + 'PhabricatorFileEditController' => 'PhabricatorFileController', + 'PhabricatorFileEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorFileEditField' => 'PhabricatorEditField', + 'PhabricatorFileEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorFileExternalRequest' => array( + 'PhabricatorFileDAO', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorFileExternalRequestGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorFileFilePHIDType' => 'PhabricatorPHIDType', + 'PhabricatorFileIconSetSelectController' => 'PhabricatorFileController', + 'PhabricatorFileImageMacro' => array( + 'PhabricatorFileDAO', + 'PhabricatorSubscribableInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorFileImageProxyController' => 'PhabricatorFileController', + 'PhabricatorFileImageTransform' => 'PhabricatorFileTransform', + 'PhabricatorFileIntegrityException' => 'Exception', + 'PhabricatorFileLightboxController' => 'PhabricatorFileController', + 'PhabricatorFileLinkView' => 'AphrontTagView', + 'PhabricatorFileListController' => 'PhabricatorFileController', + 'PhabricatorFileNameNgrams' => 'PhabricatorSearchNgrams', + 'PhabricatorFileNameTransaction' => 'PhabricatorFileTransactionType', 'PhabricatorFileQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorFileROT13StorageFormat' => 'PhabricatorFileStorageFormat', + 'PhabricatorFileRawStorageFormat' => 'PhabricatorFileStorageFormat', + 'PhabricatorFileSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorFileSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 'PhabricatorFileSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'PhabricatorFileShortcutController' => 'PhabricatorFileController', 'PhabricatorFileStorageBlob' => 'PhabricatorFileDAO', 'PhabricatorFileStorageConfigurationException' => 'Exception', + 'PhabricatorFileStorageEngine' => 'Phobject', + 'PhabricatorFileStorageEngineTestCase' => 'PhabricatorTestCase', + 'PhabricatorFileStorageFormat' => 'Phobject', + 'PhabricatorFileStorageFormatTestCase' => 'PhabricatorTestCase', + 'PhabricatorFileTemporaryGarbageCollector' => 'PhabricatorGarbageCollector', 'PhabricatorFileTestCase' => 'PhabricatorTestCase', 'PhabricatorFileTestDataGenerator' => 'PhabricatorTestDataGenerator', + 'PhabricatorFileThumbnailTransform' => 'PhabricatorFileImageTransform', + 'PhabricatorFileTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorFileTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'PhabricatorFileTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorFileTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorFileTransform' => 'Phobject', 'PhabricatorFileTransformController' => 'PhabricatorFileController', + 'PhabricatorFileTransformListController' => 'PhabricatorFileController', + 'PhabricatorFileTransformTestCase' => 'PhabricatorTestCase', + 'PhabricatorFileUICurtainAttachController' => 'PhabricatorFileController', + 'PhabricatorFileUICurtainListController' => 'PhabricatorFileController', 'PhabricatorFileUploadController' => 'PhabricatorFileController', 'PhabricatorFileUploadDialogController' => 'PhabricatorFileController', 'PhabricatorFileUploadException' => 'Exception', + 'PhabricatorFileUploadSource' => 'Phobject', + 'PhabricatorFileUploadSourceByteLimitException' => 'Exception', + 'PhabricatorFileViewController' => 'PhabricatorFileController', + 'PhabricatorFileinfoSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorFilesApplication' => 'PhabricatorApplication', + 'PhabricatorFilesApplicationStorageEnginePanel' => 'PhabricatorApplicationConfigurationPanel', + 'PhabricatorFilesBuiltinFile' => 'Phobject', + 'PhabricatorFilesComposeAvatarBuiltinFile' => 'PhabricatorFilesBuiltinFile', + 'PhabricatorFilesComposeIconBuiltinFile' => 'PhabricatorFilesBuiltinFile', 'PhabricatorFilesConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorFilesCurtainExtension' => 'PHUICurtainExtension', + 'PhabricatorFilesManagementCatWorkflow' => 'PhabricatorFilesManagementWorkflow', + 'PhabricatorFilesManagementCompactWorkflow' => 'PhabricatorFilesManagementWorkflow', + 'PhabricatorFilesManagementCycleWorkflow' => 'PhabricatorFilesManagementWorkflow', + 'PhabricatorFilesManagementEncodeWorkflow' => 'PhabricatorFilesManagementWorkflow', 'PhabricatorFilesManagementEnginesWorkflow' => 'PhabricatorFilesManagementWorkflow', + 'PhabricatorFilesManagementGenerateKeyWorkflow' => 'PhabricatorFilesManagementWorkflow', + 'PhabricatorFilesManagementIntegrityWorkflow' => 'PhabricatorFilesManagementWorkflow', 'PhabricatorFilesManagementMigrateWorkflow' => 'PhabricatorFilesManagementWorkflow', - 'PhabricatorFilesManagementPurgeWorkflow' => 'PhabricatorFilesManagementWorkflow', 'PhabricatorFilesManagementRebuildWorkflow' => 'PhabricatorFilesManagementWorkflow', - 'PhabricatorFilesManagementWorkflow' => 'PhutilArgumentWorkflow', - 'PhabricatorFlag' => 'PhabricatorFlagDAO', + 'PhabricatorFilesManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorFilesOnDiskBuiltinFile' => 'PhabricatorFilesBuiltinFile', + 'PhabricatorFilesOutboundRequestAction' => 'PhabricatorSystemAction', + 'PhabricatorFiletreeVisibleSetting' => 'PhabricatorInternalSetting', + 'PhabricatorFiletreeWidthSetting' => 'PhabricatorInternalSetting', + 'PhabricatorFlag' => array( + 'PhabricatorFlagDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorFlagAddFlagHeraldAction' => 'PhabricatorFlagHeraldAction', 'PhabricatorFlagColor' => 'PhabricatorFlagConstants', + 'PhabricatorFlagConstants' => 'Phobject', 'PhabricatorFlagController' => 'PhabricatorController', 'PhabricatorFlagDAO' => 'PhabricatorLiskDAO', 'PhabricatorFlagDeleteController' => 'PhabricatorFlagController', + 'PhabricatorFlagDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 'PhabricatorFlagEditController' => 'PhabricatorFlagController', + 'PhabricatorFlagHeraldAction' => 'HeraldAction', 'PhabricatorFlagListController' => 'PhabricatorFlagController', - 'PhabricatorFlagListView' => 'AphrontView', - 'PhabricatorFlagsUIEventListener' => 'PhutilEventListener', - 'PhabricatorFormExample' => 'PhabricatorUIExample', - 'PhabricatorGarbageCollectorConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorGarbageCollectorDaemon' => 'PhabricatorDaemon', - 'PhabricatorGestureExample' => 'PhabricatorUIExample', + 'PhabricatorFlagQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorFlagRemoveFlagHeraldAction' => 'PhabricatorFlagHeraldAction', + 'PhabricatorFlagSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorFlagSelectControl' => 'AphrontFormControl', + 'PhabricatorFlaggableInterface' => 'PhabricatorPHIDInterface', + 'PhabricatorFlagsApplication' => 'PhabricatorApplication', + 'PhabricatorFlagsUIEventListener' => 'PhabricatorEventListener', + 'PhabricatorFullLoginUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorFulltextEngine' => 'Phobject', + 'PhabricatorFulltextEngineExtension' => 'Phobject', + 'PhabricatorFulltextEngineExtensionModule' => 'PhabricatorConfigModule', + 'PhabricatorFulltextIndexEngineExtension' => 'PhabricatorIndexEngineExtension', + 'PhabricatorFulltextInterface' => 'PhabricatorIndexableInterface', + 'PhabricatorFulltextResultSet' => 'Phobject', + 'PhabricatorFulltextStorageEngine' => 'Phobject', + 'PhabricatorFulltextToken' => 'Phobject', + 'PhabricatorFundApplication' => 'PhabricatorApplication', + 'PhabricatorGDSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorGarbageCollector' => 'Phobject', + 'PhabricatorGarbageCollectorManagementCollectWorkflow' => 'PhabricatorGarbageCollectorManagementWorkflow', + 'PhabricatorGarbageCollectorManagementCompactEdgesWorkflow' => 'PhabricatorGarbageCollectorManagementWorkflow', + 'PhabricatorGarbageCollectorManagementSetPolicyWorkflow' => 'PhabricatorGarbageCollectorManagementWorkflow', + 'PhabricatorGarbageCollectorManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorGeneralCachePurger' => 'PhabricatorCachePurger', + 'PhabricatorGestureUIExample' => 'PhabricatorUIExample', + 'PhabricatorGitGraphStream' => 'PhabricatorRepositoryGraphStream', + 'PhabricatorGitHubAuthProvider' => 'PhabricatorOAuth2AuthProvider', 'PhabricatorGlobalLock' => 'PhutilLock', + 'PhabricatorGlobalLockTestCase' => 'PhabricatorTestCase', 'PhabricatorGlobalUploadTargetView' => 'AphrontView', + 'PhabricatorGoogleAuthProvider' => 'PhabricatorOAuth2AuthProvider', + 'PhabricatorGuidanceContext' => 'Phobject', + 'PhabricatorGuidanceEngine' => 'Phobject', + 'PhabricatorGuidanceEngineExtension' => 'Phobject', + 'PhabricatorGuidanceMessage' => 'Phobject', + 'PhabricatorGuideApplication' => 'PhabricatorApplication', + 'PhabricatorGuideController' => 'PhabricatorController', + 'PhabricatorGuideInstallModule' => 'PhabricatorGuideModule', + 'PhabricatorGuideItemView' => 'Phobject', + 'PhabricatorGuideListView' => 'AphrontView', + 'PhabricatorGuideModule' => 'Phobject', + 'PhabricatorGuideModuleController' => 'PhabricatorGuideController', + 'PhabricatorGuideQuickStartModule' => 'PhabricatorGuideModule', + 'PhabricatorHMACTestCase' => 'PhabricatorTestCase', + 'PhabricatorHTTPParameterTypeTableView' => 'AphrontView', + 'PhabricatorHandleList' => array( + 'Phobject', + 'Iterator', + 'ArrayAccess', + 'Countable', + ), + 'PhabricatorHandleObjectSelectorDataView' => 'Phobject', + 'PhabricatorHandlePool' => 'Phobject', + 'PhabricatorHandlePoolTestCase' => 'PhabricatorTestCase', 'PhabricatorHandleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorHandleRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorHandlesEditField' => 'PhabricatorPHIDListEditField', + 'PhabricatorHarbormasterApplication' => 'PhabricatorApplication', + 'PhabricatorHash' => 'Phobject', 'PhabricatorHashTestCase' => 'PhabricatorTestCase', - 'PhabricatorHeaderView' => 'AphrontView', + 'PhabricatorHelpApplication' => 'PhabricatorApplication', 'PhabricatorHelpController' => 'PhabricatorController', + 'PhabricatorHelpDocumentationController' => 'PhabricatorHelpController', 'PhabricatorHelpKeyboardShortcutController' => 'PhabricatorHelpController', - 'PhabricatorHovercardExample' => 'PhabricatorUIExample', - 'PhabricatorHovercardView' => 'AphrontView', - 'PhabricatorIRCBot' => 'PhabricatorDaemon', - 'PhabricatorIRCProtocolAdapter' => 'PhabricatorBaseProtocolAdapter', - 'PhabricatorIRCProtocolHandler' => 'PhabricatorBotHandler', + 'PhabricatorHeraldApplication' => 'PhabricatorApplication', + 'PhabricatorHeraldContentSource' => 'PhabricatorContentSource', + 'PhabricatorHexdumpDocumentEngine' => 'PhabricatorDocumentEngine', + 'PhabricatorHighSecurityRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler', + 'PhabricatorHigherOrderChartFunction' => 'PhabricatorChartFunction', + 'PhabricatorHomeApplication' => 'PhabricatorApplication', + 'PhabricatorHomeConstants' => 'PhabricatorHomeController', + 'PhabricatorHomeController' => 'PhabricatorController', + 'PhabricatorHomeLauncherProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorHomeMenuItemController' => 'PhabricatorHomeController', + 'PhabricatorHomeProfileMenuEngine' => 'PhabricatorProfileMenuEngine', + 'PhabricatorHomeProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorHovercardEngineExtension' => 'Phobject', + 'PhabricatorHovercardEngineExtensionModule' => 'PhabricatorConfigModule', + 'PhabricatorIDExportField' => 'PhabricatorExportField', + 'PhabricatorIDsSearchEngineExtension' => 'PhabricatorSearchEngineExtension', + 'PhabricatorIDsSearchField' => 'PhabricatorSearchField', + 'PhabricatorIconDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorIconRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorIconSet' => 'Phobject', + 'PhabricatorIconSetEditField' => 'PhabricatorEditField', + 'PhabricatorIconSetIcon' => 'Phobject', + 'PhabricatorImageDocumentEngine' => 'PhabricatorDocumentEngine', + 'PhabricatorImageMacroRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorImageRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorImageTransformer' => 'Phobject', + 'PhabricatorImagemagickSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorInFlightErrorView' => 'AphrontView', + 'PhabricatorIndexEngine' => 'Phobject', + 'PhabricatorIndexEngineExtension' => 'Phobject', + 'PhabricatorIndexEngineExtensionModule' => 'PhabricatorConfigModule', 'PhabricatorInfrastructureTestCase' => 'PhabricatorTestCase', + 'PhabricatorInlineComment' => array( + 'Phobject', + 'PhabricatorMarkupInterface', + ), + 'PhabricatorInlineCommentAdjustmentEngine' => 'Phobject', + 'PhabricatorInlineCommentContentState' => 'Phobject', + 'PhabricatorInlineCommentContext' => 'Phobject', 'PhabricatorInlineCommentController' => 'PhabricatorController', - 'PhabricatorInlineCommentInterface' => 'PhabricatorMarkupInterface', - 'PhabricatorInlineCommentPreviewController' => 'PhabricatorController', 'PhabricatorInlineSummaryView' => 'AphrontView', + 'PhabricatorInstructionsEditField' => 'PhabricatorEditField', + 'PhabricatorIntConfigType' => 'PhabricatorTextConfigType', + 'PhabricatorIntEditField' => 'PhabricatorEditField', + 'PhabricatorIntExportField' => 'PhabricatorExportField', + 'PhabricatorInternalSetting' => 'PhabricatorSetting', + 'PhabricatorInternationalizationManagementExtractWorkflow' => 'PhabricatorInternationalizationManagementWorkflow', + 'PhabricatorInternationalizationManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorInvalidConfigSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorInvalidQueryCursorException' => 'Exception', + 'PhabricatorIteratedMD5PasswordHasher' => 'PhabricatorPasswordHasher', + 'PhabricatorIteratedMD5PasswordHasherTestCase' => 'PhabricatorTestCase', + 'PhabricatorIteratorFileUploadSource' => 'PhabricatorFileUploadSource', + 'PhabricatorJIRAAuthProvider' => array( + 'PhabricatorOAuth1AuthProvider', + 'DoorkeeperRemarkupURIInterface', + ), + 'PhabricatorJSONConfigType' => 'PhabricatorTextConfigType', + 'PhabricatorJSONDocumentEngine' => 'PhabricatorTextDocumentEngine', + 'PhabricatorJSONExportFormat' => 'PhabricatorExportFormat', 'PhabricatorJavelinLinter' => 'ArcanistLinter', + 'PhabricatorJiraIssueHasObjectEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorJupyterDocumentEngine' => 'PhabricatorDocumentEngine', 'PhabricatorKeyValueDatabaseCache' => 'PhutilKeyValueCache', - 'PhabricatorLegalpadConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorLegalpadPHIDTypeDocument' => 'PhabricatorPHIDType', - 'PhabricatorLintEngine' => 'PhutilLintEngine', + 'PhabricatorKeyValueSerializingCacheProxy' => 'PhutilKeyValueCacheProxy', + 'PhabricatorKeyboardRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorKeyring' => 'Phobject', + 'PhabricatorKeyringConfigOptionType' => 'PhabricatorConfigJSONOptionType', + 'PhabricatorLDAPAuthProvider' => 'PhabricatorAuthProvider', + 'PhabricatorLabelProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorLanguageSettingsPanel' => 'PhabricatorEditEngineSettingsPanel', + 'PhabricatorLegalpadApplication' => 'PhabricatorApplication', + 'PhabricatorLegalpadDocumentPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorLegalpadSignaturePolicyRule' => 'PhabricatorPolicyRule', + 'PhabricatorLibraryTestCase' => 'PhutilLibraryTestCase', + 'PhabricatorLinkProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorLipsumArtist' => 'Phobject', + 'PhabricatorLipsumContentSource' => 'PhabricatorContentSource', 'PhabricatorLipsumGenerateWorkflow' => 'PhabricatorLipsumManagementWorkflow', - 'PhabricatorLipsumManagementWorkflow' => 'PhutilArgumentWorkflow', + 'PhabricatorLipsumManagementWorkflow' => 'PhabricatorManagementWorkflow', 'PhabricatorLipsumMondrianArtist' => 'PhabricatorLipsumArtist', 'PhabricatorLiskDAO' => 'LiskDAO', + 'PhabricatorLiskExportEngineExtension' => 'PhabricatorExportEngineExtension', + 'PhabricatorLiskFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension', + 'PhabricatorLiskSearchEngineExtension' => 'PhabricatorSearchEngineExtension', + 'PhabricatorLiskSerializer' => 'Phobject', + 'PhabricatorListExportField' => 'PhabricatorExportField', 'PhabricatorLocalDiskFileStorageEngine' => 'PhabricatorFileStorageEngine', 'PhabricatorLocalTimeTestCase' => 'PhabricatorTestCase', + 'PhabricatorLocaleScopeGuard' => 'Phobject', + 'PhabricatorLocaleScopeGuardTestCase' => 'PhabricatorTestCase', + 'PhabricatorLockLogManagementWorkflow' => 'PhabricatorLockManagementWorkflow', + 'PhabricatorLockManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorLogTriggerAction' => 'PhabricatorTriggerAction', + 'PhabricatorLoginFailureUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorLoginUserLogType' => 'PhabricatorUserLogType', 'PhabricatorLogoutController' => 'PhabricatorAuthController', - 'PhabricatorMacroCommentController' => 'PhabricatorMacroController', - 'PhabricatorMacroConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorLogoutUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorLunarPhasePolicyRule' => 'PhabricatorPolicyRule', + 'PhabricatorMacroApplication' => 'PhabricatorApplication', + 'PhabricatorMacroAudioBehaviorTransaction' => 'PhabricatorMacroTransactionType', + 'PhabricatorMacroAudioController' => 'PhabricatorMacroController', + 'PhabricatorMacroAudioTransaction' => 'PhabricatorMacroTransactionType', 'PhabricatorMacroController' => 'PhabricatorController', + 'PhabricatorMacroDatasource' => 'PhabricatorTypeaheadDatasource', 'PhabricatorMacroDisableController' => 'PhabricatorMacroController', - 'PhabricatorMacroEditController' => 'PhabricatorMacroController', + 'PhabricatorMacroDisabledTransaction' => 'PhabricatorMacroTransactionType', + 'PhabricatorMacroEditController' => 'PhameBlogController', + 'PhabricatorMacroEditEngine' => 'PhabricatorEditEngine', 'PhabricatorMacroEditor' => 'PhabricatorApplicationTransactionEditor', - 'PhabricatorMacroListController' => - array( - 0 => 'PhabricatorMacroController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), + 'PhabricatorMacroFileTransaction' => 'PhabricatorMacroTransactionType', + 'PhabricatorMacroListController' => 'PhabricatorMacroController', + 'PhabricatorMacroMacroPHIDType' => 'PhabricatorPHIDType', 'PhabricatorMacroMailReceiver' => 'PhabricatorObjectMailReceiver', + 'PhabricatorMacroManageCapability' => 'PhabricatorPolicyCapability', 'PhabricatorMacroMemeController' => 'PhabricatorMacroController', 'PhabricatorMacroMemeDialogController' => 'PhabricatorMacroController', - 'PhabricatorMacroPHIDTypeMacro' => 'PhabricatorPHIDType', + 'PhabricatorMacroNameTransaction' => 'PhabricatorMacroTransactionType', 'PhabricatorMacroQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhabricatorMacroReplyHandler' => 'PhabricatorMailReplyHandler', + 'PhabricatorMacroReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 'PhabricatorMacroSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'PhabricatorMacroTransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorMacroTestCase' => 'PhabricatorTestCase', + 'PhabricatorMacroTransaction' => 'PhabricatorModularTransaction', 'PhabricatorMacroTransactionComment' => 'PhabricatorApplicationTransactionComment', 'PhabricatorMacroTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorMacroTransactionType' => 'PhabricatorModularTransactionType', 'PhabricatorMacroViewController' => 'PhabricatorMacroController', - 'PhabricatorMailImplementationAmazonSESAdapter' => 'PhabricatorMailImplementationPHPMailerLiteAdapter', - 'PhabricatorMailImplementationPHPMailerAdapter' => 'PhabricatorMailImplementationAdapter', - 'PhabricatorMailImplementationPHPMailerLiteAdapter' => 'PhabricatorMailImplementationAdapter', - 'PhabricatorMailImplementationSendGridAdapter' => 'PhabricatorMailImplementationAdapter', - 'PhabricatorMailImplementationTestAdapter' => 'PhabricatorMailImplementationAdapter', - 'PhabricatorMailManagementListInboundWorkflow' => 'PhabricatorSearchManagementWorkflow', - 'PhabricatorMailManagementListOutboundWorkflow' => 'PhabricatorSearchManagementWorkflow', - 'PhabricatorMailManagementReceiveTestWorkflow' => 'PhabricatorSearchManagementWorkflow', - 'PhabricatorMailManagementResendWorkflow' => 'PhabricatorSearchManagementWorkflow', - 'PhabricatorMailManagementSendTestWorkflow' => 'PhabricatorSearchManagementWorkflow', - 'PhabricatorMailManagementShowInboundWorkflow' => 'PhabricatorSearchManagementWorkflow', - 'PhabricatorMailManagementShowOutboundWorkflow' => 'PhabricatorSearchManagementWorkflow', - 'PhabricatorMailManagementWorkflow' => 'PhutilArgumentWorkflow', + 'PhabricatorMailAdapter' => 'Phobject', + 'PhabricatorMailAdapterTestCase' => 'PhabricatorTestCase', + 'PhabricatorMailAmazonSESAdapter' => 'PhabricatorMailAdapter', + 'PhabricatorMailAmazonSNSAdapter' => 'PhabricatorMailAdapter', + 'PhabricatorMailAttachment' => 'Phobject', + 'PhabricatorMailConfigTestCase' => 'PhabricatorTestCase', + 'PhabricatorMailEmailEngine' => 'PhabricatorMailMessageEngine', + 'PhabricatorMailEmailHeraldField' => 'HeraldField', + 'PhabricatorMailEmailHeraldFieldGroup' => 'HeraldFieldGroup', + 'PhabricatorMailEmailMessage' => 'PhabricatorMailExternalMessage', + 'PhabricatorMailEmailSubjectHeraldField' => 'PhabricatorMailEmailHeraldField', + 'PhabricatorMailEngineExtension' => 'Phobject', + 'PhabricatorMailExternalMessage' => 'Phobject', + 'PhabricatorMailHeader' => 'Phobject', + 'PhabricatorMailMailgunAdapter' => 'PhabricatorMailAdapter', + 'PhabricatorMailManagementListInboundWorkflow' => 'PhabricatorMailManagementWorkflow', + 'PhabricatorMailManagementListOutboundWorkflow' => 'PhabricatorMailManagementWorkflow', + 'PhabricatorMailManagementReceiveTestWorkflow' => 'PhabricatorMailManagementWorkflow', + 'PhabricatorMailManagementResendWorkflow' => 'PhabricatorMailManagementWorkflow', + 'PhabricatorMailManagementSendTestWorkflow' => 'PhabricatorMailManagementWorkflow', + 'PhabricatorMailManagementShowInboundWorkflow' => 'PhabricatorMailManagementWorkflow', + 'PhabricatorMailManagementShowOutboundWorkflow' => 'PhabricatorMailManagementWorkflow', + 'PhabricatorMailManagementUnverifyWorkflow' => 'PhabricatorMailManagementWorkflow', + 'PhabricatorMailManagementVolumeWorkflow' => 'PhabricatorMailManagementWorkflow', + 'PhabricatorMailManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorMailMessageEngine' => 'Phobject', + 'PhabricatorMailMustEncryptHeraldAction' => 'HeraldAction', + 'PhabricatorMailOutboundMailHeraldAdapter' => 'HeraldAdapter', + 'PhabricatorMailOutboundRoutingHeraldAction' => 'HeraldAction', + 'PhabricatorMailOutboundRoutingSelfEmailHeraldAction' => 'PhabricatorMailOutboundRoutingHeraldAction', + 'PhabricatorMailOutboundRoutingSelfNotificationHeraldAction' => 'PhabricatorMailOutboundRoutingHeraldAction', + 'PhabricatorMailOutboundStatus' => 'Phobject', + 'PhabricatorMailPostmarkAdapter' => 'PhabricatorMailAdapter', + 'PhabricatorMailPropertiesDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', + 'PhabricatorMailReceiver' => 'Phobject', 'PhabricatorMailReceiverTestCase' => 'PhabricatorTestCase', - 'PhabricatorMailingListPHIDTypeList' => 'PhabricatorPHIDType', - 'PhabricatorMailingListQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhabricatorMailingListSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'PhabricatorMailingListsController' => 'PhabricatorController', - 'PhabricatorMailingListsEditController' => 'PhabricatorMailingListsController', - 'PhabricatorMailingListsListController' => - array( - 0 => 'PhabricatorMailingListsController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), - 'PhabricatorMainMenuGroupView' => 'AphrontView', - 'PhabricatorMainMenuIconView' => 'AphrontView', + 'PhabricatorMailReplyHandler' => 'Phobject', + 'PhabricatorMailRoutingRule' => 'Phobject', + 'PhabricatorMailSMSEngine' => 'PhabricatorMailMessageEngine', + 'PhabricatorMailSMSMessage' => 'PhabricatorMailExternalMessage', + 'PhabricatorMailSMTPAdapter' => 'PhabricatorMailAdapter', + 'PhabricatorMailSendGridAdapter' => 'PhabricatorMailAdapter', + 'PhabricatorMailSendmailAdapter' => 'PhabricatorMailAdapter', + 'PhabricatorMailSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorMailStamp' => 'Phobject', + 'PhabricatorMailTarget' => 'Phobject', + 'PhabricatorMailTestAdapter' => 'PhabricatorMailAdapter', + 'PhabricatorMailTwilioAdapter' => 'PhabricatorMailAdapter', + 'PhabricatorMailUtil' => 'Phobject', + 'PhabricatorMainMenuBarExtension' => 'Phobject', 'PhabricatorMainMenuSearchView' => 'AphrontView', 'PhabricatorMainMenuView' => 'AphrontView', + 'PhabricatorManageProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorManagementWorkflow' => 'PhutilArgumentWorkflow', + 'PhabricatorManiphestApplication' => 'PhabricatorApplication', 'PhabricatorManiphestConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorManiphestTaskFactEngine' => 'PhabricatorTransactionFactEngine', 'PhabricatorManiphestTaskTestDataGenerator' => 'PhabricatorTestDataGenerator', + 'PhabricatorManualActivitySetupCheck' => 'PhabricatorSetupCheck', 'PhabricatorMarkupCache' => 'PhabricatorCacheDAO', - 'PhabricatorMarkupOneOff' => 'PhabricatorMarkupInterface', + 'PhabricatorMarkupEngine' => 'Phobject', + 'PhabricatorMarkupEngineTestCase' => 'PhabricatorTestCase', + 'PhabricatorMarkupOneOff' => array( + 'Phobject', + 'PhabricatorMarkupInterface', + ), 'PhabricatorMarkupPreviewController' => 'PhabricatorController', + 'PhabricatorMaxChartFunction' => 'PhabricatorPureChartFunction', + 'PhabricatorMemeEngine' => 'Phobject', + 'PhabricatorMemeRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorMentionRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorMercurialGraphStream' => 'PhabricatorRepositoryGraphStream', + 'PhabricatorMetaMTAActor' => 'Phobject', 'PhabricatorMetaMTAActorQuery' => 'PhabricatorQuery', + 'PhabricatorMetaMTAApplication' => 'PhabricatorApplication', + 'PhabricatorMetaMTAApplicationEmail' => array( + 'PhabricatorMetaMTADAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorSpacesInterface', + ), + 'PhabricatorMetaMTAApplicationEmailDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorMetaMTAApplicationEmailEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorMetaMTAApplicationEmailHeraldField' => 'HeraldField', + 'PhabricatorMetaMTAApplicationEmailPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorMetaMTAApplicationEmailPanel' => 'PhabricatorApplicationConfigurationPanel', + 'PhabricatorMetaMTAApplicationEmailQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorMetaMTAApplicationEmailTransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorMetaMTAApplicationEmailTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhabricatorMetaMTAConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorMetaMTAController' => 'PhabricatorController', 'PhabricatorMetaMTADAO' => 'PhabricatorLiskDAO', + 'PhabricatorMetaMTAEmailBodyParser' => 'Phobject', 'PhabricatorMetaMTAEmailBodyParserTestCase' => 'PhabricatorTestCase', - 'PhabricatorMetaMTAMail' => 'PhabricatorMetaMTADAO', + 'PhabricatorMetaMTAEmailHeraldAction' => 'HeraldAction', + 'PhabricatorMetaMTAEmailOthersHeraldAction' => 'PhabricatorMetaMTAEmailHeraldAction', + 'PhabricatorMetaMTAEmailSelfHeraldAction' => 'PhabricatorMetaMTAEmailHeraldAction', + 'PhabricatorMetaMTAErrorMailAction' => 'PhabricatorSystemAction', + 'PhabricatorMetaMTAMail' => array( + 'PhabricatorMetaMTADAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorMetaMTAMailBody' => 'Phobject', 'PhabricatorMetaMTAMailBodyTestCase' => 'PhabricatorTestCase', - 'PhabricatorMetaMTAMailTestCase' => 'PhabricatorTestCase', - 'PhabricatorMetaMTAMailingList' => - array( - 0 => 'PhabricatorMetaMTADAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorMetaMTAMailHasRecipientEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorMetaMTAMailListController' => 'PhabricatorMetaMTAController', + 'PhabricatorMetaMTAMailPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorMetaMTAMailProperties' => array( + 'PhabricatorMetaMTADAO', + 'PhabricatorPolicyInterface', ), + 'PhabricatorMetaMTAMailPropertiesQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorMetaMTAMailQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorMetaMTAMailSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorMetaMTAMailSection' => 'Phobject', + 'PhabricatorMetaMTAMailTestCase' => 'PhabricatorTestCase', + 'PhabricatorMetaMTAMailViewController' => 'PhabricatorMetaMTAController', + 'PhabricatorMetaMTAMailableDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorMetaMTAMailableFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorMetaMTAMailgunReceiveController' => 'PhabricatorMetaMTAController', + 'PhabricatorMetaMTAMemberQuery' => 'PhabricatorQuery', + 'PhabricatorMetaMTAPermanentFailureException' => 'Exception', + 'PhabricatorMetaMTAPostmarkReceiveController' => 'PhabricatorMetaMTAController', 'PhabricatorMetaMTAReceivedMail' => 'PhabricatorMetaMTADAO', 'PhabricatorMetaMTAReceivedMailProcessingException' => 'Exception', 'PhabricatorMetaMTAReceivedMailTestCase' => 'PhabricatorTestCase', + 'PhabricatorMetaMTASchemaSpec' => 'PhabricatorConfigSchemaSpec', 'PhabricatorMetaMTASendGridReceiveController' => 'PhabricatorMetaMTAController', 'PhabricatorMetaMTAWorker' => 'PhabricatorWorker', - 'PhabricatorMultiColumnExample' => 'PhabricatorUIExample', + 'PhabricatorMetronome' => 'Phobject', + 'PhabricatorMetronomeTestCase' => 'PhabricatorTestCase', + 'PhabricatorMetronomicTriggerClock' => 'PhabricatorTriggerClock', + 'PhabricatorMinChartFunction' => 'PhabricatorPureChartFunction', + 'PhabricatorModularTransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorModularTransactionType' => 'Phobject', + 'PhabricatorMonogramDatasourceEngineExtension' => 'PhabricatorDatasourceEngineExtension', + 'PhabricatorMonospacedFontSetting' => 'PhabricatorStringSetting', + 'PhabricatorMonospacedTextareasSetting' => 'PhabricatorSelectSetting', + 'PhabricatorMotivatorProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorMultiColumnUIExample' => 'PhabricatorUIExample', + 'PhabricatorMultiFactorSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorMultimeterApplication' => 'PhabricatorApplication', 'PhabricatorMustVerifyEmailController' => 'PhabricatorAuthController', + 'PhabricatorMutedByEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorMutedEdgeType' => 'PhabricatorEdgeType', 'PhabricatorMySQLConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorMySQLFileStorageEngine' => 'PhabricatorFileStorageEngine', - 'PhabricatorNamedQuery' => - array( - 0 => 'PhabricatorSearchDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorMySQLSearchHost' => 'PhabricatorSearchHost', + 'PhabricatorMySQLSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorNamedQuery' => array( + 'PhabricatorSearchDAO', + 'PhabricatorPolicyInterface', ), + 'PhabricatorNamedQueryConfig' => array( + 'PhabricatorSearchDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorNamedQueryConfigQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorNamedQueryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhabricatorNoteExample' => 'PhabricatorUIExample', + 'PhabricatorNavigationRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorNeverTriggerClock' => 'PhabricatorTriggerClock', + 'PhabricatorNgramsIndexEngineExtension' => 'PhabricatorIndexEngineExtension', + 'PhabricatorNgramsInterface' => 'PhabricatorIndexableInterface', + 'PhabricatorNotificationBuilder' => 'Phobject', 'PhabricatorNotificationClearController' => 'PhabricatorNotificationController', + 'PhabricatorNotificationClient' => 'Phobject', 'PhabricatorNotificationConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorNotificationController' => 'PhabricatorController', + 'PhabricatorNotificationDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 'PhabricatorNotificationIndividualController' => 'PhabricatorNotificationController', 'PhabricatorNotificationListController' => 'PhabricatorNotificationController', 'PhabricatorNotificationPanelController' => 'PhabricatorNotificationController', 'PhabricatorNotificationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhabricatorNotificationStatusController' => 'PhabricatorNotificationController', - 'PhabricatorOAuthClientAuthorization' => 'PhabricatorOAuthServerDAO', - 'PhabricatorOAuthClientAuthorizationBaseController' => 'PhabricatorOAuthServerController', - 'PhabricatorOAuthClientAuthorizationDeleteController' => 'PhabricatorOAuthClientAuthorizationBaseController', - 'PhabricatorOAuthClientAuthorizationEditController' => 'PhabricatorOAuthClientAuthorizationBaseController', - 'PhabricatorOAuthClientAuthorizationListController' => 'PhabricatorOAuthClientAuthorizationBaseController', - 'PhabricatorOAuthClientAuthorizationQuery' => 'PhabricatorOffsetPagedQuery', - 'PhabricatorOAuthClientBaseController' => 'PhabricatorOAuthServerController', - 'PhabricatorOAuthClientDeleteController' => 'PhabricatorOAuthClientBaseController', - 'PhabricatorOAuthClientEditController' => 'PhabricatorOAuthClientBaseController', - 'PhabricatorOAuthClientListController' => 'PhabricatorOAuthClientBaseController', - 'PhabricatorOAuthClientViewController' => 'PhabricatorOAuthClientBaseController', + 'PhabricatorNotificationSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorNotificationServerRef' => 'Phobject', + 'PhabricatorNotificationServersConfigType' => 'PhabricatorJSONConfigType', + 'PhabricatorNotificationStatusView' => 'AphrontTagView', + 'PhabricatorNotificationTestController' => 'PhabricatorNotificationController', + 'PhabricatorNotificationUIExample' => 'PhabricatorUIExample', + 'PhabricatorNotificationsApplication' => 'PhabricatorApplication', + 'PhabricatorNotificationsSetting' => 'PhabricatorInternalSetting', + 'PhabricatorNotificationsSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorNuanceApplication' => 'PhabricatorApplication', + 'PhabricatorOAuth1AuthProvider' => 'PhabricatorOAuthAuthProvider', + 'PhabricatorOAuth1SecretTemporaryTokenType' => 'PhabricatorAuthTemporaryTokenType', + 'PhabricatorOAuth2AuthProvider' => 'PhabricatorOAuthAuthProvider', + 'PhabricatorOAuthAuthProvider' => 'PhabricatorAuthProvider', + 'PhabricatorOAuthClientAuthorization' => array( + 'PhabricatorOAuthServerDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorOAuthClientAuthorizationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorOAuthClientController' => 'PhabricatorOAuthServerController', + 'PhabricatorOAuthClientDisableController' => 'PhabricatorOAuthClientController', + 'PhabricatorOAuthClientEditController' => 'PhabricatorOAuthClientController', + 'PhabricatorOAuthClientListController' => 'PhabricatorOAuthClientController', + 'PhabricatorOAuthClientSecretController' => 'PhabricatorOAuthClientController', + 'PhabricatorOAuthClientTestController' => 'PhabricatorOAuthClientController', + 'PhabricatorOAuthClientViewController' => 'PhabricatorOAuthClientController', 'PhabricatorOAuthResponse' => 'AphrontResponse', + 'PhabricatorOAuthServer' => 'Phobject', 'PhabricatorOAuthServerAccessToken' => 'PhabricatorOAuthServerDAO', - 'PhabricatorOAuthServerAuthController' => 'PhabricatorAuthController', + 'PhabricatorOAuthServerApplication' => 'PhabricatorApplication', + 'PhabricatorOAuthServerAuthController' => 'PhabricatorOAuthServerController', 'PhabricatorOAuthServerAuthorizationCode' => 'PhabricatorOAuthServerDAO', - 'PhabricatorOAuthServerClient' => 'PhabricatorOAuthServerDAO', - 'PhabricatorOAuthServerClientQuery' => 'PhabricatorOffsetPagedQuery', + 'PhabricatorOAuthServerAuthorizationsSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorOAuthServerClient' => array( + 'PhabricatorOAuthServerDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorOAuthServerClientAuthorizationPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorOAuthServerClientPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorOAuthServerClientQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorOAuthServerClientSearchEngine' => 'PhabricatorApplicationSearchEngine', 'PhabricatorOAuthServerController' => 'PhabricatorController', + 'PhabricatorOAuthServerCreateClientsCapability' => 'PhabricatorPolicyCapability', 'PhabricatorOAuthServerDAO' => 'PhabricatorLiskDAO', + 'PhabricatorOAuthServerEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorOAuthServerEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorOAuthServerSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorOAuthServerScope' => 'Phobject', 'PhabricatorOAuthServerTestCase' => 'PhabricatorTestCase', - 'PhabricatorOAuthServerTestController' => 'PhabricatorOAuthServerController', - 'PhabricatorOAuthServerTokenController' => 'PhabricatorAuthController', - 'PhabricatorObjectHandle' => 'PhabricatorPolicyInterface', - 'PhabricatorObjectHandleStatus' => 'PhabricatorObjectHandleConstants', - 'PhabricatorObjectItemListExample' => 'PhabricatorUIExample', - 'PhabricatorObjectItemListView' => 'AphrontTagView', - 'PhabricatorObjectItemView' => 'AphrontTagView', - 'PhabricatorObjectListView' => 'AphrontView', + 'PhabricatorOAuthServerTokenController' => 'PhabricatorOAuthServerController', + 'PhabricatorOAuthServerTransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorOAuthServerTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorObjectGraph' => 'AbstractDirectedGraph', + 'PhabricatorObjectHandle' => array( + 'Phobject', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorObjectHasAsanaSubtaskEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorObjectHasAsanaTaskEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorObjectHasContributorEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorObjectHasDraftEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorObjectHasJiraIssueEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorObjectHasSubscriberEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorObjectHasUnsubscriberEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorObjectHasWatcherEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorObjectListQuery' => 'Phobject', + 'PhabricatorObjectListQueryTestCase' => 'PhabricatorTestCase', 'PhabricatorObjectMailReceiver' => 'PhabricatorMailReceiver', 'PhabricatorObjectMailReceiverTestCase' => 'PhabricatorTestCase', + 'PhabricatorObjectMentionedByObjectEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorObjectMentionsObjectEdgeType' => 'PhabricatorEdgeType', 'PhabricatorObjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorObjectRelationship' => 'Phobject', + 'PhabricatorObjectRelationshipList' => 'Phobject', + 'PhabricatorObjectRelationshipSource' => 'Phobject', + 'PhabricatorObjectRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorObjectSelectorDialog' => 'Phobject', + 'PhabricatorObjectStatus' => 'Phobject', + 'PhabricatorObjectUsesDashboardPanelEdgeType' => 'PhabricatorEdgeType', 'PhabricatorOffsetPagedQuery' => 'PhabricatorQuery', + 'PhabricatorOldWorldContentSource' => 'PhabricatorContentSource', + 'PhabricatorOlderInlinesSetting' => 'PhabricatorSelectSetting', + 'PhabricatorOneTimeTriggerClock' => 'PhabricatorTriggerClock', + 'PhabricatorOpcodeCacheSpec' => 'PhabricatorCacheSpec', + 'PhabricatorOptionExportField' => 'PhabricatorExportField', + 'PhabricatorOptionGroupSetting' => 'PhabricatorSetting', + 'PhabricatorOwnerPathQuery' => 'Phobject', + 'PhabricatorOwnersApplication' => 'PhabricatorApplication', + 'PhabricatorOwnersArchiveController' => 'PhabricatorOwnersController', + 'PhabricatorOwnersAuditRule' => 'Phobject', 'PhabricatorOwnersConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorOwnersConfiguredCustomField' => array( + 'PhabricatorOwnersCustomField', + 'PhabricatorStandardCustomFieldInterface', + ), 'PhabricatorOwnersController' => 'PhabricatorController', + 'PhabricatorOwnersCustomField' => 'PhabricatorCustomField', + 'PhabricatorOwnersCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage', + 'PhabricatorOwnersCustomFieldStorage' => 'PhabricatorCustomFieldStorage', + 'PhabricatorOwnersCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage', 'PhabricatorOwnersDAO' => 'PhabricatorLiskDAO', - 'PhabricatorOwnersDeleteController' => 'PhabricatorOwnersController', + 'PhabricatorOwnersDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorOwnersDefaultViewCapability' => 'PhabricatorPolicyCapability', 'PhabricatorOwnersDetailController' => 'PhabricatorOwnersController', 'PhabricatorOwnersEditController' => 'PhabricatorOwnersController', + 'PhabricatorOwnersHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension', 'PhabricatorOwnersListController' => 'PhabricatorOwnersController', 'PhabricatorOwnersOwner' => 'PhabricatorOwnersDAO', - 'PhabricatorOwnersPHIDTypePackage' => 'PhabricatorPHIDType', - 'PhabricatorOwnersPackage' => - array( - 0 => 'PhabricatorOwnersDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorOwnersPackage' => array( + 'PhabricatorOwnersDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorCustomFieldInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + 'PhabricatorNgramsInterface', ), + 'PhabricatorOwnersPackageAuditingTransaction' => 'PhabricatorOwnersPackageTransactionType', + 'PhabricatorOwnersPackageAuthorityTransaction' => 'PhabricatorOwnersPackageTransactionType', + 'PhabricatorOwnersPackageAutoreviewTransaction' => 'PhabricatorOwnersPackageTransactionType', + 'PhabricatorOwnersPackageContextFreeGrammar' => 'PhutilContextFreeGrammar', + 'PhabricatorOwnersPackageDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorOwnersPackageDescriptionTransaction' => 'PhabricatorOwnersPackageTransactionType', + 'PhabricatorOwnersPackageDominionTransaction' => 'PhabricatorOwnersPackageTransactionType', + 'PhabricatorOwnersPackageEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorOwnersPackageFerretEngine' => 'PhabricatorFerretEngine', + 'PhabricatorOwnersPackageFulltextEngine' => 'PhabricatorFulltextEngine', + 'PhabricatorOwnersPackageFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorOwnersPackageIgnoredTransaction' => 'PhabricatorOwnersPackageTransactionType', + 'PhabricatorOwnersPackageNameNgrams' => 'PhabricatorSearchNgrams', + 'PhabricatorOwnersPackageNameTransaction' => 'PhabricatorOwnersPackageTransactionType', + 'PhabricatorOwnersPackageOwnerDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorOwnersPackageOwnersTransaction' => 'PhabricatorOwnersPackageTransactionType', + 'PhabricatorOwnersPackagePHIDType' => 'PhabricatorPHIDType', + 'PhabricatorOwnersPackagePathsTransaction' => 'PhabricatorOwnersPackageTransactionType', + 'PhabricatorOwnersPackagePrimaryTransaction' => 'PhabricatorOwnersPackageTransactionType', 'PhabricatorOwnersPackageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorOwnersPackageRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'PhabricatorOwnersPackageSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorOwnersPackageStatusTransaction' => 'PhabricatorOwnersPackageTransactionType', 'PhabricatorOwnersPackageTestCase' => 'PhabricatorTestCase', + 'PhabricatorOwnersPackageTestDataGenerator' => 'PhabricatorTestDataGenerator', + 'PhabricatorOwnersPackageTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorOwnersPackageTransactionEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorOwnersPackageTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorOwnersPackageTransactionType' => 'PhabricatorModularTransactionType', 'PhabricatorOwnersPath' => 'PhabricatorOwnersDAO', + 'PhabricatorOwnersPathContextFreeGrammar' => 'PhutilContextFreeGrammar', + 'PhabricatorOwnersPathsController' => 'PhabricatorOwnersController', + 'PhabricatorOwnersPathsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'PhabricatorOwnersSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorOwnersSearchField' => 'PhabricatorSearchTokenizerField', + 'PhabricatorPDFCatalogObject' => 'PhabricatorPDFObject', + 'PhabricatorPDFContentsObject' => 'PhabricatorPDFObject', + 'PhabricatorPDFDocumentEngine' => 'PhabricatorDocumentEngine', + 'PhabricatorPDFFontObject' => 'PhabricatorPDFObject', + 'PhabricatorPDFFragment' => 'Phobject', + 'PhabricatorPDFFragmentOffset' => 'Phobject', + 'PhabricatorPDFGenerator' => 'Phobject', + 'PhabricatorPDFHeadFragment' => 'PhabricatorPDFFragment', + 'PhabricatorPDFInfoObject' => 'PhabricatorPDFObject', + 'PhabricatorPDFIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhabricatorPDFObject' => 'PhabricatorPDFFragment', + 'PhabricatorPDFPageObject' => 'PhabricatorPDFObject', + 'PhabricatorPDFPagesObject' => 'PhabricatorPDFObject', + 'PhabricatorPDFResourcesObject' => 'PhabricatorPDFObject', + 'PhabricatorPDFTailFragment' => 'PhabricatorPDFFragment', 'PhabricatorPHDConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorPHPMailerConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorPagedFormExample' => 'PhabricatorUIExample', - 'PhabricatorPaste' => - array( - 0 => 'PhabricatorPasteDAO', - 1 => 'PhabricatorSubscribableInterface', - 2 => 'PhabricatorTokenReceiverInterface', - 3 => 'PhabricatorPolicyInterface', - ), - 'PhabricatorPasteCommentController' => 'PhabricatorPasteController', - 'PhabricatorPasteConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorPHID' => 'Phobject', + 'PhabricatorPHIDConstants' => 'Phobject', + 'PhabricatorPHIDExportField' => 'PhabricatorExportField', + 'PhabricatorPHIDListEditField' => 'PhabricatorEditField', + 'PhabricatorPHIDListEditType' => 'PhabricatorEditType', + 'PhabricatorPHIDListExportField' => 'PhabricatorListExportField', + 'PhabricatorPHIDMailStamp' => 'PhabricatorMailStamp', + 'PhabricatorPHIDResolver' => 'Phobject', + 'PhabricatorPHIDType' => 'Phobject', + 'PhabricatorPHIDTypeTestCase' => 'PhutilTestCase', + 'PhabricatorPHIDsSearchField' => 'PhabricatorSearchField', + 'PhabricatorPHPASTApplication' => 'PhabricatorApplication', + 'PhabricatorPHPConfigSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorPHPPreflightSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorPackagesApplication' => 'PhabricatorApplication', + 'PhabricatorPackagesController' => 'PhabricatorController', + 'PhabricatorPackagesCreatePublisherCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorPackagesDAO' => 'PhabricatorLiskDAO', + 'PhabricatorPackagesEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorPackagesEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorPackagesNgrams' => 'PhabricatorSearchNgrams', + 'PhabricatorPackagesPackage' => array( + 'PhabricatorPackagesDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorProjectInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorNgramsInterface', + ), + 'PhabricatorPackagesPackageController' => 'PhabricatorPackagesController', + 'PhabricatorPackagesPackageDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorPackagesPackageDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorPackagesPackageDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorPackagesPackageEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'PhabricatorPackagesPackageEditController' => 'PhabricatorPackagesPackageController', + 'PhabricatorPackagesPackageEditEngine' => 'PhabricatorPackagesEditEngine', + 'PhabricatorPackagesPackageEditor' => 'PhabricatorPackagesEditor', + 'PhabricatorPackagesPackageKeyTransaction' => 'PhabricatorPackagesPackageTransactionType', + 'PhabricatorPackagesPackageListController' => 'PhabricatorPackagesPackageController', + 'PhabricatorPackagesPackageListView' => 'PhabricatorPackagesView', + 'PhabricatorPackagesPackageNameNgrams' => 'PhabricatorPackagesNgrams', + 'PhabricatorPackagesPackageNameTransaction' => 'PhabricatorPackagesPackageTransactionType', + 'PhabricatorPackagesPackagePHIDType' => 'PhabricatorPHIDType', + 'PhabricatorPackagesPackagePublisherTransaction' => 'PhabricatorPackagesPackageTransactionType', + 'PhabricatorPackagesPackageQuery' => 'PhabricatorPackagesQuery', + 'PhabricatorPackagesPackageSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PhabricatorPackagesPackageSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorPackagesPackageTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorPackagesPackageTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorPackagesPackageTransactionType' => 'PhabricatorPackagesTransactionType', + 'PhabricatorPackagesPackageViewController' => 'PhabricatorPackagesPackageController', + 'PhabricatorPackagesPublisher' => array( + 'PhabricatorPackagesDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorProjectInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorNgramsInterface', + ), + 'PhabricatorPackagesPublisherController' => 'PhabricatorPackagesController', + 'PhabricatorPackagesPublisherDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorPackagesPublisherDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorPackagesPublisherEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'PhabricatorPackagesPublisherEditController' => 'PhabricatorPackagesPublisherController', + 'PhabricatorPackagesPublisherEditEngine' => 'PhabricatorPackagesEditEngine', + 'PhabricatorPackagesPublisherEditor' => 'PhabricatorPackagesEditor', + 'PhabricatorPackagesPublisherKeyTransaction' => 'PhabricatorPackagesPublisherTransactionType', + 'PhabricatorPackagesPublisherListController' => 'PhabricatorPackagesPublisherController', + 'PhabricatorPackagesPublisherListView' => 'PhabricatorPackagesView', + 'PhabricatorPackagesPublisherNameNgrams' => 'PhabricatorPackagesNgrams', + 'PhabricatorPackagesPublisherNameTransaction' => 'PhabricatorPackagesPublisherTransactionType', + 'PhabricatorPackagesPublisherPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorPackagesPublisherQuery' => 'PhabricatorPackagesQuery', + 'PhabricatorPackagesPublisherSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PhabricatorPackagesPublisherSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorPackagesPublisherTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorPackagesPublisherTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorPackagesPublisherTransactionType' => 'PhabricatorPackagesTransactionType', + 'PhabricatorPackagesPublisherViewController' => 'PhabricatorPackagesPublisherController', + 'PhabricatorPackagesQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorPackagesSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorPackagesTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorPackagesVersion' => array( + 'PhabricatorPackagesDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorProjectInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorNgramsInterface', + ), + 'PhabricatorPackagesVersionController' => 'PhabricatorPackagesController', + 'PhabricatorPackagesVersionEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'PhabricatorPackagesVersionEditController' => 'PhabricatorPackagesVersionController', + 'PhabricatorPackagesVersionEditEngine' => 'PhabricatorPackagesEditEngine', + 'PhabricatorPackagesVersionEditor' => 'PhabricatorPackagesEditor', + 'PhabricatorPackagesVersionListController' => 'PhabricatorPackagesVersionController', + 'PhabricatorPackagesVersionListView' => 'PhabricatorPackagesView', + 'PhabricatorPackagesVersionNameNgrams' => 'PhabricatorPackagesNgrams', + 'PhabricatorPackagesVersionNameTransaction' => 'PhabricatorPackagesVersionTransactionType', + 'PhabricatorPackagesVersionPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorPackagesVersionPackageTransaction' => 'PhabricatorPackagesVersionTransactionType', + 'PhabricatorPackagesVersionQuery' => 'PhabricatorPackagesQuery', + 'PhabricatorPackagesVersionSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PhabricatorPackagesVersionSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorPackagesVersionTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorPackagesVersionTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorPackagesVersionTransactionType' => 'PhabricatorPackagesTransactionType', + 'PhabricatorPackagesVersionViewController' => 'PhabricatorPackagesVersionController', + 'PhabricatorPackagesView' => 'AphrontView', + 'PhabricatorPagerUIExample' => 'PhabricatorUIExample', + 'PhabricatorPartialLoginUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorPassphraseApplication' => 'PhabricatorApplication', + 'PhabricatorPasswordAuthProvider' => 'PhabricatorAuthProvider', + 'PhabricatorPasswordDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', + 'PhabricatorPasswordHasher' => 'Phobject', + 'PhabricatorPasswordHasherTestCase' => 'PhabricatorTestCase', + 'PhabricatorPasswordHasherUnavailableException' => 'Exception', + 'PhabricatorPasswordSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorPaste' => array( + 'PhabricatorPasteDAO', + 'PhabricatorSubscribableInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorMentionableInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorProjectInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorSpacesInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorFerretInterface', + 'PhabricatorFulltextInterface', + ), + 'PhabricatorPasteApplication' => 'PhabricatorApplication', + 'PhabricatorPasteArchiveController' => 'PhabricatorPasteController', + 'PhabricatorPasteContentSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'PhabricatorPasteContentTransaction' => 'PhabricatorPasteTransactionType', 'PhabricatorPasteController' => 'PhabricatorController', 'PhabricatorPasteDAO' => 'PhabricatorLiskDAO', 'PhabricatorPasteEditController' => 'PhabricatorPasteController', + 'PhabricatorPasteEditEngine' => 'PhabricatorEditEngine', 'PhabricatorPasteEditor' => 'PhabricatorApplicationTransactionEditor', - 'PhabricatorPasteListController' => - array( - 0 => 'PhabricatorPasteController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), - 'PhabricatorPastePHIDTypePaste' => 'PhabricatorPHIDType', + 'PhabricatorPasteFerretEngine' => 'PhabricatorFerretEngine', + 'PhabricatorPasteFilenameContextFreeGrammar' => 'PhutilContextFreeGrammar', + 'PhabricatorPasteFulltextEngine' => 'PhabricatorFulltextEngine', + 'PhabricatorPasteLanguageTransaction' => 'PhabricatorPasteTransactionType', + 'PhabricatorPasteListController' => 'PhabricatorPasteController', + 'PhabricatorPastePastePHIDType' => 'PhabricatorPHIDType', 'PhabricatorPasteQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhabricatorPasteRemarkupRule' => 'PhabricatorRemarkupRuleObject', + 'PhabricatorPasteRawController' => 'PhabricatorPasteController', + 'PhabricatorPasteRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'PhabricatorPasteSchemaSpec' => 'PhabricatorConfigSchemaSpec', 'PhabricatorPasteSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorPasteSnippet' => 'Phobject', + 'PhabricatorPasteStatusTransaction' => 'PhabricatorPasteTransactionType', 'PhabricatorPasteTestDataGenerator' => 'PhabricatorTestDataGenerator', - 'PhabricatorPasteTransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorPasteTitleTransaction' => 'PhabricatorPasteTransactionType', + 'PhabricatorPasteTransaction' => 'PhabricatorModularTransaction', 'PhabricatorPasteTransactionComment' => 'PhabricatorApplicationTransactionComment', 'PhabricatorPasteTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorPasteTransactionType' => 'PhabricatorModularTransactionType', 'PhabricatorPasteViewController' => 'PhabricatorPasteController', + 'PhabricatorPathSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorPeopleAnyOwnerDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorPeopleApplication' => 'PhabricatorApplication', + 'PhabricatorPeopleApproveController' => 'PhabricatorPeopleController', + 'PhabricatorPeopleAvailabilitySearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'PhabricatorPeopleBadgesProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorPeopleCommitsProfileMenuItem' => 'PhabricatorProfileMenuItem', 'PhabricatorPeopleController' => 'PhabricatorController', - 'PhabricatorPeopleEditController' => 'PhabricatorPeopleController', - 'PhabricatorPeopleHovercardEventListener' => 'PhutilEventListener', - 'PhabricatorPeopleLdapController' => 'PhabricatorPeopleController', - 'PhabricatorPeopleListController' => - array( - 0 => 'PhabricatorPeopleController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), + 'PhabricatorPeopleCreateController' => 'PhabricatorPeopleController', + 'PhabricatorPeopleCreateGuidanceContext' => 'PhabricatorGuidanceContext', + 'PhabricatorPeopleDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorPeopleDatasourceEngineExtension' => 'PhabricatorDatasourceEngineExtension', + 'PhabricatorPeopleDeleteController' => 'PhabricatorPeopleController', + 'PhabricatorPeopleDetailsProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorPeopleDisableController' => 'PhabricatorPeopleController', + 'PhabricatorPeopleEmailLoginMailEngine' => 'PhabricatorPeopleMailEngine', + 'PhabricatorPeopleEmpowerController' => 'PhabricatorPeopleController', + 'PhabricatorPeopleExternalIdentifierPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorPeopleExternalPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorPeopleIconSet' => 'PhabricatorIconSet', + 'PhabricatorPeopleInviteController' => 'PhabricatorPeopleController', + 'PhabricatorPeopleInviteListController' => 'PhabricatorPeopleInviteController', + 'PhabricatorPeopleInviteSendController' => 'PhabricatorPeopleInviteController', + 'PhabricatorPeopleListController' => 'PhabricatorPeopleController', + 'PhabricatorPeopleLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorPeopleLogSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorPeopleLogViewController' => 'PhabricatorPeopleController', 'PhabricatorPeopleLogsController' => 'PhabricatorPeopleController', - 'PhabricatorPeoplePHIDTypeExternal' => 'PhabricatorPHIDType', - 'PhabricatorPeoplePHIDTypeUser' => 'PhabricatorPHIDType', + 'PhabricatorPeopleMailEngine' => 'Phobject', + 'PhabricatorPeopleMailEngineException' => 'Exception', + 'PhabricatorPeopleManageProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorPeopleManagementApproveWorkflow' => 'PhabricatorPeopleManagementWorkflow', + 'PhabricatorPeopleManagementEmpowerWorkflow' => 'PhabricatorPeopleManagementWorkflow', + 'PhabricatorPeopleManagementEnableWorkflow' => 'PhabricatorPeopleManagementWorkflow', + 'PhabricatorPeopleManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorPeopleNewController' => 'PhabricatorPeopleController', + 'PhabricatorPeopleNoOwnerDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorPeopleOwnerDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorPeoplePictureProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorPeopleProfileBadgesController' => 'PhabricatorPeopleProfileController', + 'PhabricatorPeopleProfileCommitsController' => 'PhabricatorPeopleProfileController', 'PhabricatorPeopleProfileController' => 'PhabricatorPeopleController', - 'PhabricatorPeopleProfileEditController' => 'PhabricatorPeopleController', - 'PhabricatorPeopleProfilePictureController' => 'PhabricatorPeopleController', + 'PhabricatorPeopleProfileEditController' => 'PhabricatorPeopleProfileController', + 'PhabricatorPeopleProfileManageController' => 'PhabricatorPeopleProfileController', + 'PhabricatorPeopleProfileMenuEngine' => 'PhabricatorProfileMenuEngine', + 'PhabricatorPeopleProfilePictureController' => 'PhabricatorPeopleProfileController', + 'PhabricatorPeopleProfileRevisionsController' => 'PhabricatorPeopleProfileController', + 'PhabricatorPeopleProfileTasksController' => 'PhabricatorPeopleProfileController', + 'PhabricatorPeopleProfileViewController' => 'PhabricatorPeopleProfileController', 'PhabricatorPeopleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorPeopleRenameController' => 'PhabricatorPeopleController', + 'PhabricatorPeopleRevisionsProfileMenuItem' => 'PhabricatorProfileMenuItem', 'PhabricatorPeopleSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorPeopleTasksProfileMenuItem' => 'PhabricatorProfileMenuItem', 'PhabricatorPeopleTestDataGenerator' => 'PhabricatorTestDataGenerator', - 'PhabricatorPhameConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorPhamePHIDTypeBlog' => 'PhabricatorPHIDType', - 'PhabricatorPhamePHIDTypePost' => 'PhabricatorPHIDType', - 'PhabricatorPholioConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorPeopleTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorPeopleUserEmailPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorPeopleUserEmailQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorPeopleUserFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorPeopleUserPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorPeopleUsernameMailEngine' => 'PhabricatorPeopleMailEngine', + 'PhabricatorPeopleWelcomeController' => 'PhabricatorPeopleController', + 'PhabricatorPeopleWelcomeMailEngine' => 'PhabricatorPeopleMailEngine', + 'PhabricatorPhabricatorAuthProvider' => 'PhabricatorOAuth2AuthProvider', + 'PhabricatorPhameApplication' => 'PhabricatorApplication', + 'PhabricatorPhameBlogPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorPhamePostPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorPhluxApplication' => 'PhabricatorApplication', + 'PhabricatorPholioApplication' => 'PhabricatorApplication', 'PhabricatorPholioMockTestDataGenerator' => 'PhabricatorTestDataGenerator', - 'PhabricatorPhortuneConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorPhrequentConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorPhrictionConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorPhoneNumber' => 'Phobject', + 'PhabricatorPhoneNumberTestCase' => 'PhabricatorTestCase', + 'PhabricatorPhortuneApplication' => 'PhabricatorApplication', + 'PhabricatorPhortuneContentSource' => 'PhabricatorContentSource', + 'PhabricatorPhortuneManagementInvoiceWorkflow' => 'PhabricatorPhortuneManagementWorkflow', + 'PhabricatorPhortuneManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorPhortuneTestCase' => 'PhabricatorTestCase', + 'PhabricatorPhrequentApplication' => 'PhabricatorApplication', + 'PhabricatorPhrictionApplication' => 'PhabricatorApplication', + 'PhabricatorPhurlApplication' => 'PhabricatorApplication', + 'PhabricatorPhurlConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorPhurlController' => 'PhabricatorController', + 'PhabricatorPhurlDAO' => 'PhabricatorLiskDAO', + 'PhabricatorPhurlLinkRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorPhurlRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'PhabricatorPhurlSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorPhurlShortURLController' => 'PhabricatorPhurlController', + 'PhabricatorPhurlShortURLDefaultController' => 'PhabricatorPhurlController', + 'PhabricatorPhurlURL' => array( + 'PhabricatorPhurlDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorProjectInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorMentionableInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorSpacesInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorNgramsInterface', + ), + 'PhabricatorPhurlURLAccessController' => 'PhabricatorPhurlController', + 'PhabricatorPhurlURLAliasTransaction' => 'PhabricatorPhurlURLTransactionType', + 'PhabricatorPhurlURLCreateCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorPhurlURLDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorPhurlURLDescriptionTransaction' => 'PhabricatorPhurlURLTransactionType', + 'PhabricatorPhurlURLEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'PhabricatorPhurlURLEditController' => 'PhabricatorPhurlController', + 'PhabricatorPhurlURLEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorPhurlURLEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorPhurlURLListController' => 'PhabricatorPhurlController', + 'PhabricatorPhurlURLLongURLTransaction' => 'PhabricatorPhurlURLTransactionType', + 'PhabricatorPhurlURLMailReceiver' => 'PhabricatorObjectMailReceiver', + 'PhabricatorPhurlURLNameNgrams' => 'PhabricatorSearchNgrams', + 'PhabricatorPhurlURLNameTransaction' => 'PhabricatorPhurlURLTransactionType', + 'PhabricatorPhurlURLPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorPhurlURLQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorPhurlURLReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PhabricatorPhurlURLSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PhabricatorPhurlURLSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorPhurlURLTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorPhurlURLTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'PhabricatorPhurlURLTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorPhurlURLTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorPhurlURLViewController' => 'PhabricatorPhurlController', + 'PhabricatorPinnedApplicationsSetting' => 'PhabricatorInternalSetting', + 'PhabricatorPirateEnglishTranslation' => 'PhutilTranslation', + 'PhabricatorPlatform404Controller' => 'PhabricatorController', + 'PhabricatorPlatformSite' => 'PhabricatorSite', + 'PhabricatorPointsEditField' => 'PhabricatorEditField', + 'PhabricatorPointsFact' => 'PhabricatorFact', 'PhabricatorPolicies' => 'PhabricatorPolicyConstants', + 'PhabricatorPolicy' => array( + 'PhabricatorPolicyDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorPolicyApplication' => 'PhabricatorApplication', 'PhabricatorPolicyAwareQuery' => 'PhabricatorOffsetPagedQuery', 'PhabricatorPolicyAwareTestQuery' => 'PhabricatorPolicyAwareQuery', - 'PhabricatorPolicyCapability' => 'PhabricatorPolicyConstants', + 'PhabricatorPolicyCanEditCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorPolicyCanInteractCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorPolicyCanJoinCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorPolicyCanViewCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorPolicyCapability' => 'Phobject', + 'PhabricatorPolicyCapabilityTestCase' => 'PhabricatorTestCase', + 'PhabricatorPolicyCodex' => 'Phobject', + 'PhabricatorPolicyCodexRuleDescription' => 'Phobject', 'PhabricatorPolicyConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorPolicyConstants' => 'Phobject', + 'PhabricatorPolicyController' => 'PhabricatorController', + 'PhabricatorPolicyDAO' => 'PhabricatorLiskDAO', + 'PhabricatorPolicyDataTestCase' => 'PhabricatorTestCase', + 'PhabricatorPolicyEditController' => 'PhabricatorPolicyController', + 'PhabricatorPolicyEditEngineExtension' => 'PhabricatorEditEngineExtension', + 'PhabricatorPolicyEditField' => 'PhabricatorEditField', 'PhabricatorPolicyException' => 'Exception', - 'PhabricatorPolicyQuery' => 'PhabricatorQuery', + 'PhabricatorPolicyExplainController' => 'PhabricatorPolicyController', + 'PhabricatorPolicyFavoritesSetting' => 'PhabricatorInternalSetting', + 'PhabricatorPolicyFilter' => 'Phobject', + 'PhabricatorPolicyFilterSet' => 'Phobject', + 'PhabricatorPolicyInterface' => 'PhabricatorPHIDInterface', + 'PhabricatorPolicyManagementShowWorkflow' => 'PhabricatorPolicyManagementWorkflow', + 'PhabricatorPolicyManagementUnlockWorkflow' => 'PhabricatorPolicyManagementWorkflow', + 'PhabricatorPolicyManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorPolicyPHIDTypePolicy' => 'PhabricatorPHIDType', + 'PhabricatorPolicyQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorPolicyRef' => 'Phobject', + 'PhabricatorPolicyRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler', + 'PhabricatorPolicyRule' => 'Phobject', + 'PhabricatorPolicyRulesView' => 'AphrontView', + 'PhabricatorPolicySearchEngineExtension' => 'PhabricatorSearchEngineExtension', 'PhabricatorPolicyTestCase' => 'PhabricatorTestCase', - 'PhabricatorPolicyTestObject' => 'PhabricatorPolicyInterface', + 'PhabricatorPolicyTestObject' => array( + 'Phobject', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + ), 'PhabricatorPolicyType' => 'PhabricatorPolicyConstants', - 'PhabricatorProject' => - array( - 0 => 'PhabricatorProjectDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorPonderApplication' => 'PhabricatorApplication', + 'PhabricatorPreambleTestCase' => 'PhabricatorTestCase', + 'PhabricatorPrimaryEmailUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorProfileMenuEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorProfileMenuEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorProfileMenuEngine' => 'Phobject', + 'PhabricatorProfileMenuItem' => 'Phobject', + 'PhabricatorProfileMenuItemAffectsObjectEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorProfileMenuItemConfiguration' => array( + 'PhabricatorSearchDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorIndexableInterface', + ), + 'PhabricatorProfileMenuItemConfigurationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorProfileMenuItemConfigurationTransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorProfileMenuItemConfigurationTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorProfileMenuItemIconSet' => 'PhabricatorIconSet', + 'PhabricatorProfileMenuItemIndexEngineExtension' => 'PhabricatorEdgeIndexEngineExtension', + 'PhabricatorProfileMenuItemPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorProfileMenuItemView' => 'Phobject', + 'PhabricatorProfileMenuItemViewList' => 'Phobject', + 'PhabricatorProject' => array( + 'PhabricatorProjectDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + 'PhabricatorCustomFieldInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorColumnProxyInterface', + 'PhabricatorSpacesInterface', + 'PhabricatorEditEngineSubtypeInterface', + 'PhabricatorWorkboardInterface', + ), + 'PhabricatorProjectActivityChartEngine' => 'PhabricatorChartEngine', + 'PhabricatorProjectAddHeraldAction' => 'PhabricatorProjectHeraldAction', + 'PhabricatorProjectApplication' => 'PhabricatorApplication', + 'PhabricatorProjectArchiveController' => 'PhabricatorProjectController', + 'PhabricatorProjectBoardBackgroundController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectBoardController' => 'PhabricatorProjectController', + 'PhabricatorProjectBoardDefaultController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectBoardDisableController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectBoardFilterController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectBoardImportController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectBoardManageController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectBoardReloadController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectBoardReorderController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectBoardViewController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectBuiltinsExample' => 'PhabricatorUIExample', + 'PhabricatorProjectBurndownChartEngine' => 'PhabricatorChartEngine', + 'PhabricatorProjectCardView' => 'AphrontTagView', + 'PhabricatorProjectColorTransaction' => 'PhabricatorProjectTransactionType', + 'PhabricatorProjectColorsConfigType' => 'PhabricatorJSONConfigType', + 'PhabricatorProjectColumn' => array( + 'PhabricatorProjectDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorExtendedPolicyInterface', + 'PhabricatorConduitResultInterface', + ), + 'PhabricatorProjectColumnAuthorOrder' => 'PhabricatorProjectColumnOrder', + 'PhabricatorProjectColumnBulkEditController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectColumnBulkMoveController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectColumnCreatedOrder' => 'PhabricatorProjectColumnOrder', + 'PhabricatorProjectColumnDetailController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectColumnEditController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectColumnHeader' => 'Phobject', + 'PhabricatorProjectColumnHideController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectColumnLimitTransaction' => 'PhabricatorProjectColumnTransactionType', + 'PhabricatorProjectColumnNameTransaction' => 'PhabricatorProjectColumnTransactionType', + 'PhabricatorProjectColumnNaturalOrder' => 'PhabricatorProjectColumnOrder', + 'PhabricatorProjectColumnOrder' => 'Phobject', + 'PhabricatorProjectColumnOwnerOrder' => 'PhabricatorProjectColumnOrder', + 'PhabricatorProjectColumnPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorProjectColumnPointsOrder' => 'PhabricatorProjectColumnOrder', + 'PhabricatorProjectColumnPosition' => array( + 'PhabricatorProjectDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorProjectColumnPositionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorProjectColumnPriorityOrder' => 'PhabricatorProjectColumnOrder', + 'PhabricatorProjectColumnQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorProjectColumnRemoveTriggerController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectColumnSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorProjectColumnStatusOrder' => 'PhabricatorProjectColumnOrder', + 'PhabricatorProjectColumnStatusTransaction' => 'PhabricatorProjectColumnTransactionType', + 'PhabricatorProjectColumnTitleOrder' => 'PhabricatorProjectColumnOrder', + 'PhabricatorProjectColumnTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorProjectColumnTransactionEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorProjectColumnTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorProjectColumnTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorProjectColumnTriggerTransaction' => 'PhabricatorProjectColumnTransactionType', + 'PhabricatorProjectColumnViewQueryController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorProjectConfiguredCustomField' => array( + 'PhabricatorProjectStandardCustomField', + 'PhabricatorStandardCustomFieldInterface', ), 'PhabricatorProjectController' => 'PhabricatorController', - 'PhabricatorProjectCreateController' => 'PhabricatorProjectController', + 'PhabricatorProjectCoreTestCase' => 'PhabricatorTestCase', + 'PhabricatorProjectCoverController' => 'PhabricatorProjectController', + 'PhabricatorProjectCustomField' => 'PhabricatorCustomField', + 'PhabricatorProjectCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage', + 'PhabricatorProjectCustomFieldStorage' => 'PhabricatorCustomFieldStorage', + 'PhabricatorProjectCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage', 'PhabricatorProjectDAO' => 'PhabricatorLiskDAO', - 'PhabricatorProjectEditor' => 'PhabricatorEditor', - 'PhabricatorProjectEditorTestCase' => 'PhabricatorTestCase', - 'PhabricatorProjectListController' => - array( - 0 => 'PhabricatorProjectController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), - 'PhabricatorProjectMembersEditController' => 'PhabricatorProjectController', - 'PhabricatorProjectNameCollisionException' => 'Exception', - 'PhabricatorProjectPHIDTypeProject' => 'PhabricatorPHIDType', - 'PhabricatorProjectProfile' => 'PhabricatorProjectDAO', + 'PhabricatorProjectDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorProjectDescriptionField' => 'PhabricatorProjectStandardCustomField', + 'PhabricatorProjectDetailsProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorProjectDropEffect' => 'Phobject', + 'PhabricatorProjectEditController' => 'PhabricatorProjectController', + 'PhabricatorProjectEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorProjectEditPictureController' => 'PhabricatorProjectController', + 'PhabricatorProjectFerretEngine' => 'PhabricatorFerretEngine', + 'PhabricatorProjectFilterTransaction' => 'PhabricatorProjectTransactionType', + 'PhabricatorProjectFulltextEngine' => 'PhabricatorFulltextEngine', + 'PhabricatorProjectHeraldAction' => 'HeraldAction', + 'PhabricatorProjectHeraldAdapter' => 'HeraldAdapter', + 'PhabricatorProjectHeraldFieldGroup' => 'HeraldFieldGroup', + 'PhabricatorProjectHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension', + 'PhabricatorProjectIconSet' => 'PhabricatorIconSet', + 'PhabricatorProjectIconTransaction' => 'PhabricatorProjectTransactionType', + 'PhabricatorProjectIconsConfigType' => 'PhabricatorJSONConfigType', + 'PhabricatorProjectImageTransaction' => 'PhabricatorProjectTransactionType', + 'PhabricatorProjectListController' => 'PhabricatorProjectController', + 'PhabricatorProjectListView' => 'AphrontView', + 'PhabricatorProjectLockController' => 'PhabricatorProjectController', + 'PhabricatorProjectLockTransaction' => 'PhabricatorProjectTransactionType', + 'PhabricatorProjectLogicalAncestorDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorProjectLogicalDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorProjectLogicalOnlyDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorProjectLogicalOrNotDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorProjectLogicalUserDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorProjectLogicalViewerDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorProjectManageController' => 'PhabricatorProjectController', + 'PhabricatorProjectManageProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorProjectMaterializedMemberEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorProjectMemberListView' => 'PhabricatorProjectUserListView', + 'PhabricatorProjectMemberOfProjectEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorProjectMembersAddController' => 'PhabricatorProjectController', + 'PhabricatorProjectMembersDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorProjectMembersPolicyRule' => 'PhabricatorPolicyRule', + 'PhabricatorProjectMembersProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorProjectMembersRemoveController' => 'PhabricatorProjectController', + 'PhabricatorProjectMembersViewController' => 'PhabricatorProjectController', + 'PhabricatorProjectMenuItemController' => 'PhabricatorProjectController', + 'PhabricatorProjectMilestoneTransaction' => 'PhabricatorProjectTypeTransaction', + 'PhabricatorProjectMoveController' => 'PhabricatorProjectController', + 'PhabricatorProjectNameContextFreeGrammar' => 'PhutilContextFreeGrammar', + 'PhabricatorProjectNameTransaction' => 'PhabricatorProjectTransactionType', + 'PhabricatorProjectNoProjectsDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorProjectObjectHasProjectEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorProjectOrUserDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorProjectOrUserFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorProjectPHIDResolver' => 'PhabricatorPHIDResolver', + 'PhabricatorProjectParentTransaction' => 'PhabricatorProjectTypeTransaction', + 'PhabricatorProjectPictureProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorProjectPointsProfileMenuItem' => 'PhabricatorProfileMenuItem', 'PhabricatorProjectProfileController' => 'PhabricatorProjectController', - 'PhabricatorProjectProfileEditController' => 'PhabricatorProjectController', + 'PhabricatorProjectProfileMenuEngine' => 'PhabricatorProfileMenuEngine', + 'PhabricatorProjectProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorProjectProjectHasMemberEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorProjectProjectHasObjectEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorProjectProjectPHIDType' => 'PhabricatorPHIDType', 'PhabricatorProjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorProjectRemoveHeraldAction' => 'PhabricatorProjectHeraldAction', + 'PhabricatorProjectReportsController' => 'PhabricatorProjectController', + 'PhabricatorProjectReportsProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorProjectSchemaSpec' => 'PhabricatorConfigSchemaSpec', 'PhabricatorProjectSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorProjectSearchField' => 'PhabricatorSearchTokenizerField', + 'PhabricatorProjectSilenceController' => 'PhabricatorProjectController', + 'PhabricatorProjectSilencedEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorProjectSlug' => 'PhabricatorProjectDAO', + 'PhabricatorProjectSlugsTransaction' => 'PhabricatorProjectTransactionType', + 'PhabricatorProjectSortTransaction' => 'PhabricatorProjectTransactionType', + 'PhabricatorProjectStandardCustomField' => array( + 'PhabricatorProjectCustomField', + 'PhabricatorStandardCustomFieldInterface', + ), + 'PhabricatorProjectStatus' => 'Phobject', + 'PhabricatorProjectStatusTransaction' => 'PhabricatorProjectTransactionType', + 'PhabricatorProjectSubprojectWarningController' => 'PhabricatorProjectController', + 'PhabricatorProjectSubprojectsController' => 'PhabricatorProjectController', + 'PhabricatorProjectSubprojectsProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorProjectSubtypeDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorProjectSubtypesConfigType' => 'PhabricatorJSONConfigType', + 'PhabricatorProjectTagsAddedField' => 'PhabricatorProjectTagsField', + 'PhabricatorProjectTagsField' => 'HeraldField', + 'PhabricatorProjectTagsRemovedField' => 'PhabricatorProjectTagsField', 'PhabricatorProjectTestDataGenerator' => 'PhabricatorTestDataGenerator', - 'PhabricatorProjectTransaction' => 'PhabricatorProjectDAO', - 'PhabricatorProjectTransactionType' => 'PhabricatorProjectConstants', + 'PhabricatorProjectTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorProjectTransactionEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorProjectTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorProjectTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorProjectTrigger' => array( + 'PhabricatorProjectDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorIndexableInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorProjectTriggerAddProjectsRule' => 'PhabricatorProjectTriggerRule', + 'PhabricatorProjectTriggerController' => 'PhabricatorProjectController', + 'PhabricatorProjectTriggerCorruptionException' => 'Exception', + 'PhabricatorProjectTriggerEditController' => 'PhabricatorProjectTriggerController', + 'PhabricatorProjectTriggerEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorProjectTriggerInvalidRule' => 'PhabricatorProjectTriggerRule', + 'PhabricatorProjectTriggerListController' => 'PhabricatorProjectTriggerController', + 'PhabricatorProjectTriggerManiphestOwnerRule' => 'PhabricatorProjectTriggerRule', + 'PhabricatorProjectTriggerManiphestPriorityRule' => 'PhabricatorProjectTriggerRule', + 'PhabricatorProjectTriggerManiphestStatusRule' => 'PhabricatorProjectTriggerRule', + 'PhabricatorProjectTriggerNameTransaction' => 'PhabricatorProjectTriggerTransactionType', + 'PhabricatorProjectTriggerPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorProjectTriggerPlaySoundRule' => 'PhabricatorProjectTriggerRule', + 'PhabricatorProjectTriggerQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorProjectTriggerRemoveProjectsRule' => 'PhabricatorProjectTriggerRule', + 'PhabricatorProjectTriggerRule' => 'Phobject', + 'PhabricatorProjectTriggerRuleRecord' => 'Phobject', + 'PhabricatorProjectTriggerRulesetTransaction' => 'PhabricatorProjectTriggerTransactionType', + 'PhabricatorProjectTriggerSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorProjectTriggerTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorProjectTriggerTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorProjectTriggerTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorProjectTriggerUnknownRule' => 'PhabricatorProjectTriggerRule', + 'PhabricatorProjectTriggerUsage' => 'PhabricatorProjectDAO', + 'PhabricatorProjectTriggerUsageIndexEngineExtension' => 'PhabricatorIndexEngineExtension', + 'PhabricatorProjectTriggerViewController' => 'PhabricatorProjectTriggerController', + 'PhabricatorProjectTypeTransaction' => 'PhabricatorProjectTransactionType', + 'PhabricatorProjectUIEventListener' => 'PhabricatorEventListener', 'PhabricatorProjectUpdateController' => 'PhabricatorProjectController', - 'PhabricatorPropertyListExample' => 'PhabricatorUIExample', - 'PhabricatorPropertyListView' => 'AphrontView', + 'PhabricatorProjectUserFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorProjectUserListView' => 'AphrontView', + 'PhabricatorProjectViewController' => 'PhabricatorProjectController', + 'PhabricatorProjectWatchController' => 'PhabricatorProjectController', + 'PhabricatorProjectWatcherListView' => 'PhabricatorProjectUserListView', + 'PhabricatorProjectWorkboardBackgroundColor' => 'Phobject', + 'PhabricatorProjectWorkboardBackgroundTransaction' => 'PhabricatorProjectTransactionType', + 'PhabricatorProjectWorkboardProfileMenuItem' => 'PhabricatorProfileMenuItem', + 'PhabricatorProjectWorkboardTransaction' => 'PhabricatorProjectTransactionType', + 'PhabricatorProjectsAllPolicyRule' => 'PhabricatorProjectsBasePolicyRule', + 'PhabricatorProjectsAncestorsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'PhabricatorProjectsBasePolicyRule' => 'PhabricatorPolicyRule', + 'PhabricatorProjectsCurtainExtension' => 'PHUICurtainExtension', + 'PhabricatorProjectsEditEngineExtension' => 'PhabricatorEditEngineExtension', + 'PhabricatorProjectsEditField' => 'PhabricatorTokenizerEditField', + 'PhabricatorProjectsExportEngineExtension' => 'PhabricatorExportEngineExtension', + 'PhabricatorProjectsFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension', + 'PhabricatorProjectsMailEngineExtension' => 'PhabricatorMailEngineExtension', + 'PhabricatorProjectsMembersSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'PhabricatorProjectsMembershipIndexEngineExtension' => 'PhabricatorIndexEngineExtension', + 'PhabricatorProjectsPolicyRule' => 'PhabricatorProjectsBasePolicyRule', + 'PhabricatorProjectsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'PhabricatorProjectsSearchEngineExtension' => 'PhabricatorSearchEngineExtension', + 'PhabricatorProjectsWatchersSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'PhabricatorPronounSetting' => 'PhabricatorSelectSetting', + 'PhabricatorProtocolLog' => 'Phobject', + 'PhabricatorPureChartFunction' => 'PhabricatorChartFunction', + 'PhabricatorPygmentSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorQuery' => 'Phobject', + 'PhabricatorQueryConstraint' => 'Phobject', + 'PhabricatorQueryCursor' => 'Phobject', + 'PhabricatorQueryIterator' => 'PhutilBufferedIterator', + 'PhabricatorQueryOrderItem' => 'Phobject', + 'PhabricatorQueryOrderTestCase' => 'PhabricatorTestCase', + 'PhabricatorQueryOrderVector' => array( + 'Phobject', + 'Iterator', + ), + 'PhabricatorRateLimitRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler', + 'PhabricatorReassignEmailUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorRebuildIndexesWorker' => 'PhabricatorWorker', 'PhabricatorRecaptchaConfigOptions' => 'PhabricatorApplicationConfigOptions', 'PhabricatorRedirectController' => 'PhabricatorController', 'PhabricatorRefreshCSRFController' => 'PhabricatorAuthController', + 'PhabricatorRegexListConfigType' => 'PhabricatorTextListConfigType', 'PhabricatorRegistrationProfile' => 'Phobject', + 'PhabricatorRemarkupCachePurger' => 'PhabricatorCachePurger', 'PhabricatorRemarkupControl' => 'AphrontFormTextAreaControl', - 'PhabricatorRemarkupRuleEmbedFile' => 'PhutilRemarkupRule', - 'PhabricatorRemarkupRuleImageMacro' => 'PhutilRemarkupRule', - 'PhabricatorRemarkupRuleMeme' => 'PhutilRemarkupRule', - 'PhabricatorRemarkupRuleMention' => 'PhutilRemarkupRule', - 'PhabricatorRemarkupRuleObject' => 'PhutilRemarkupRule', - 'PhabricatorRemarkupRuleYoutube' => 'PhutilRemarkupRule', - 'PhabricatorRepository' => - array( - 0 => 'PhabricatorRepositoryDAO', - 1 => 'PhabricatorPolicyInterface', - 2 => 'PhabricatorMarkupInterface', - ), - 'PhabricatorRepositoryArcanistProject' => - array( - 0 => 'PhabricatorRepositoryDAO', - 1 => 'PhabricatorPolicyInterface', - ), - 'PhabricatorRepositoryArcanistProjectDeleteController' => 'PhabricatorRepositoryController', - 'PhabricatorRepositoryArcanistProjectEditController' => 'PhabricatorRepositoryController', - 'PhabricatorRepositoryArcanistProjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhabricatorRepositoryAuditRequest' => 'PhabricatorRepositoryDAO', + 'PhabricatorRemarkupCowsayBlockInterpreter' => 'PhutilRemarkupBlockInterpreter', + 'PhabricatorRemarkupCustomBlockRule' => 'PhutilRemarkupBlockRule', + 'PhabricatorRemarkupCustomInlineRule' => 'PhutilRemarkupRule', + 'PhabricatorRemarkupDocumentEngine' => 'PhabricatorDocumentEngine', + 'PhabricatorRemarkupEditField' => 'PhabricatorEditField', + 'PhabricatorRemarkupFigletBlockInterpreter' => 'PhutilRemarkupBlockInterpreter', + 'PhabricatorRemarkupHyperlinkEngineExtension' => 'PhutilRemarkupHyperlinkEngineExtension', + 'PhabricatorRemarkupUIExample' => 'PhabricatorUIExample', + 'PhabricatorRemoveEmailUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorRemoveMultifactorUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorRepositoriesSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorRepository' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorMarkupInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorDestructibleCodexInterface', + 'PhabricatorProjectInterface', + 'PhabricatorSpacesInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + ), + 'PhabricatorRepositoryActivateTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryAuditRequest' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorRepositoryBlueprintsTransaction' => 'PhabricatorRepositoryTransactionType', 'PhabricatorRepositoryBranch' => 'PhabricatorRepositoryDAO', - 'PhabricatorRepositoryCommit' => - array( - 0 => 'PhabricatorRepositoryDAO', - 1 => 'PhabricatorPolicyInterface', - 2 => 'PhabricatorTokenReceiverInterface', + 'PhabricatorRepositoryCallsignTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryCommit' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorProjectInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorMentionableInterface', + 'HarbormasterBuildableInterface', + 'HarbormasterCircleCIBuildableInterface', + 'HarbormasterBuildkiteBuildableInterface', + 'PhabricatorCustomFieldInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorTimelineInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorDraftInterface', ), 'PhabricatorRepositoryCommitChangeParserWorker' => 'PhabricatorRepositoryCommitParserWorker', 'PhabricatorRepositoryCommitData' => 'PhabricatorRepositoryDAO', - 'PhabricatorRepositoryCommitHeraldWorker' => 'PhabricatorRepositoryCommitParserWorker', + 'PhabricatorRepositoryCommitHint' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorPolicyInterface', + ), 'PhabricatorRepositoryCommitMessageParserWorker' => 'PhabricatorRepositoryCommitParserWorker', - 'PhabricatorRepositoryCommitOwnersWorker' => 'PhabricatorRepositoryCommitParserWorker', + 'PhabricatorRepositoryCommitPHIDType' => 'PhabricatorPHIDType', 'PhabricatorRepositoryCommitParserWorker' => 'PhabricatorWorker', - 'PhabricatorRepositoryCommitSearchIndexer' => 'PhabricatorSearchDocumentIndexer', + 'PhabricatorRepositoryCommitPublishWorker' => 'PhabricatorRepositoryCommitParserWorker', + 'PhabricatorRepositoryCommitRef' => 'Phobject', + 'PhabricatorRepositoryCommitTestCase' => 'PhabricatorTestCase', 'PhabricatorRepositoryConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorRepositoryController' => 'PhabricatorController', - 'PhabricatorRepositoryCreateController' => 'PhabricatorRepositoryController', + 'PhabricatorRepositoryCopyTimeLimitTransaction' => 'PhabricatorRepositoryTransactionType', 'PhabricatorRepositoryDAO' => 'PhabricatorLiskDAO', - 'PhabricatorRepositoryDeleteController' => 'PhabricatorRepositoryController', + 'PhabricatorRepositoryDangerousTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryDefaultBranchTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryDescriptionTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryDestructibleCodex' => 'PhabricatorDestructibleCodex', 'PhabricatorRepositoryDiscoveryEngine' => 'PhabricatorRepositoryEngine', - 'PhabricatorRepositoryEditController' => 'PhabricatorRepositoryController', 'PhabricatorRepositoryEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorRepositoryEncodingTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryEngine' => 'Phobject', + 'PhabricatorRepositoryEnormousTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryFerretEngine' => 'PhabricatorFerretEngine', + 'PhabricatorRepositoryFetchRefsTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryFilesizeLimitTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryFulltextEngine' => 'PhabricatorFulltextEngine', 'PhabricatorRepositoryGitCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', 'PhabricatorRepositoryGitCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', - 'PhabricatorRepositoryListController' => 'PhabricatorRepositoryController', - 'PhabricatorRepositoryManagementDeleteWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryGitLFSRef' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorRepositoryGitLFSRefQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorRepositoryGraphCache' => 'Phobject', + 'PhabricatorRepositoryGraphStream' => 'Phobject', + 'PhabricatorRepositoryIdentity' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + ), + 'PhabricatorRepositoryIdentityAssignTransaction' => 'PhabricatorRepositoryIdentityTransactionType', + 'PhabricatorRepositoryIdentityChangeWorker' => 'PhabricatorWorker', + 'PhabricatorRepositoryIdentityEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorRepositoryIdentityFerretEngine' => 'PhabricatorFerretEngine', + 'PhabricatorRepositoryIdentityPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorRepositoryIdentityQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorRepositoryIdentityTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorRepositoryIdentityTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorRepositoryIdentityTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorRepositoryMaintenanceTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryManagementCacheWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementClusterizeWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 'PhabricatorRepositoryManagementDiscoverWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementHintWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementImportingWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementListPathsWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 'PhabricatorRepositoryManagementListWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementLockWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementMaintenanceWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementMarkImportedWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementMarkReachableWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementMirrorWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementMovePathsWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementParentsWorkflow' => 'PhabricatorRepositoryManagementWorkflow', 'PhabricatorRepositoryManagementPullWorkflow' => 'PhabricatorRepositoryManagementWorkflow', - 'PhabricatorRepositoryManagementWorkflow' => 'PhutilArgumentWorkflow', + 'PhabricatorRepositoryManagementRebuildIdentitiesWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementRefsWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementReparseWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementThawWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementUnpublishWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementUpdateWorkflow' => 'PhabricatorRepositoryManagementWorkflow', + 'PhabricatorRepositoryManagementWorkflow' => 'PhabricatorManagementWorkflow', 'PhabricatorRepositoryMercurialCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', 'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', - 'PhabricatorRepositoryPHIDTypeArcanistProject' => 'PhabricatorPHIDType', - 'PhabricatorRepositoryPHIDTypeCommit' => 'PhabricatorPHIDType', - 'PhabricatorRepositoryPHIDTypeRepository' => 'PhabricatorPHIDType', + 'PhabricatorRepositoryMirror' => 'PhabricatorRepositoryDAO', + 'PhabricatorRepositoryMirrorEngine' => 'PhabricatorRepositoryEngine', + 'PhabricatorRepositoryNameTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryNotifyTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryOldRef' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorRepositoryParsedChange' => 'Phobject', + 'PhabricatorRepositoryPermanentRefsTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryPublisher' => 'Phobject', + 'PhabricatorRepositoryPublisherHoldReason' => 'Phobject', 'PhabricatorRepositoryPullEngine' => 'PhabricatorRepositoryEngine', + 'PhabricatorRepositoryPullEvent' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorRepositoryPullEventPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorRepositoryPullEventQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorRepositoryPullLocalDaemon' => 'PhabricatorDaemon', + 'PhabricatorRepositoryPullLocalDaemonModule' => 'PhutilDaemonOverseerModule', + 'PhabricatorRepositoryPushEvent' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorRepositoryPushEventPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorRepositoryPushEventQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorRepositoryPushLog' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorRepositoryPushLogPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorRepositoryPushLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorRepositoryPushLogSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorRepositoryPushMailWorker' => 'PhabricatorWorker', + 'PhabricatorRepositoryPushPolicyTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryPushReplyHandler' => 'PhabricatorMailReplyHandler', 'PhabricatorRepositoryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhabricatorRepositoryShortcut' => 'PhabricatorRepositoryDAO', + 'PhabricatorRepositoryRefCursor' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorRepositoryRefCursorPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorRepositoryRefCursorQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorRepositoryRefEngine' => 'PhabricatorRepositoryEngine', + 'PhabricatorRepositoryRefPosition' => 'PhabricatorRepositoryDAO', + 'PhabricatorRepositoryRepositoryPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorRepositorySVNSubpathTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositorySchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorRepositorySearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorRepositoryServiceTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositorySlugTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryStagingURITransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryStatusMessage' => 'PhabricatorRepositoryDAO', 'PhabricatorRepositorySvnCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', 'PhabricatorRepositorySvnCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', 'PhabricatorRepositorySymbol' => 'PhabricatorRepositoryDAO', + 'PhabricatorRepositorySymbolLanguagesTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositorySymbolSourcesTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositorySyncEvent' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorRepositorySyncEventPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorRepositorySyncEventQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorRepositoryTestCase' => 'PhabricatorTestCase', - 'PhabricatorRepositoryTransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorRepositoryTouchLimitTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryTrackOnlyTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryTransaction' => 'PhabricatorModularTransaction', 'PhabricatorRepositoryTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorRepositoryTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorRepositoryType' => 'Phobject', + 'PhabricatorRepositoryURI' => array( + 'PhabricatorRepositoryDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + 'PhabricatorConduitResultInterface', + ), + 'PhabricatorRepositoryURIIndex' => 'PhabricatorRepositoryDAO', + 'PhabricatorRepositoryURIPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorRepositoryURIQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorRepositoryURITestCase' => 'PhabricatorTestCase', + 'PhabricatorRepositoryURITransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorRepositoryURITransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorRepositoryVCSTransaction' => 'PhabricatorRepositoryTransactionType', + 'PhabricatorRepositoryWorkingCopyVersion' => 'PhabricatorRepositoryDAO', + 'PhabricatorRequestExceptionHandler' => 'AphrontRequestExceptionHandler', + 'PhabricatorResetPasswordUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorResourceSite' => 'PhabricatorSite', + 'PhabricatorRobotsBlogController' => 'PhabricatorRobotsController', + 'PhabricatorRobotsController' => 'PhabricatorController', + 'PhabricatorRobotsPlatformController' => 'PhabricatorRobotsController', + 'PhabricatorRobotsResourceController' => 'PhabricatorRobotsController', + 'PhabricatorRobotsShortController' => 'PhabricatorRobotsController', 'PhabricatorS3FileStorageEngine' => 'PhabricatorFileStorageEngine', + 'PhabricatorSMSAuthFactor' => 'PhabricatorAuthFactor', + 'PhabricatorSQLPatchList' => 'Phobject', + 'PhabricatorSSHKeyGenerator' => 'Phobject', + 'PhabricatorSSHKeysSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorSSHLog' => 'Phobject', + 'PhabricatorSSHPassthruCommand' => 'Phobject', 'PhabricatorSSHWorkflow' => 'PhutilArgumentWorkflow', - 'PhabricatorSavedQuery' => - array( - 0 => 'PhabricatorSearchDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorSavedQuery' => array( + 'PhabricatorSearchDAO', + 'PhabricatorPolicyInterface', ), 'PhabricatorSavedQueryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhabricatorSearchAttachController' => 'PhabricatorSearchBaseController', + 'PhabricatorScaleChartFunction' => 'PhabricatorPureChartFunction', + 'PhabricatorScheduleTaskTriggerAction' => 'PhabricatorTriggerAction', + 'PhabricatorScopedEnv' => 'Phobject', + 'PhabricatorSearchAbstractDocument' => 'Phobject', + 'PhabricatorSearchApplication' => 'PhabricatorApplication', + 'PhabricatorSearchApplicationSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorSearchApplicationStorageEnginePanel' => 'PhabricatorApplicationConfigurationPanel', 'PhabricatorSearchBaseController' => 'PhabricatorController', - 'PhabricatorSearchConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorSearchCheckboxesField' => 'PhabricatorSearchField', + 'PhabricatorSearchConstraintException' => 'Exception', 'PhabricatorSearchController' => 'PhabricatorSearchBaseController', + 'PhabricatorSearchCustomFieldProxyField' => 'PhabricatorSearchField', 'PhabricatorSearchDAO' => 'PhabricatorLiskDAO', + 'PhabricatorSearchDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorSearchDatasourceField' => 'PhabricatorSearchTokenizerField', + 'PhabricatorSearchDateControlField' => 'PhabricatorSearchField', + 'PhabricatorSearchDateField' => 'PhabricatorSearchField', + 'PhabricatorSearchDefaultController' => 'PhabricatorSearchBaseController', 'PhabricatorSearchDeleteController' => 'PhabricatorSearchBaseController', 'PhabricatorSearchDocument' => 'PhabricatorSearchDAO', - 'PhabricatorSearchDocumentField' => 'PhabricatorSearchDAO', + 'PhabricatorSearchDocumentFieldType' => 'Phobject', + 'PhabricatorSearchDocumentQuery' => 'PhabricatorPolicyAwareQuery', 'PhabricatorSearchDocumentRelationship' => 'PhabricatorSearchDAO', + 'PhabricatorSearchDocumentTypeDatasource' => 'PhabricatorTypeaheadDatasource', 'PhabricatorSearchEditController' => 'PhabricatorSearchBaseController', - 'PhabricatorSearchEngineElastic' => 'PhabricatorSearchEngine', - 'PhabricatorSearchEngineMySQL' => 'PhabricatorSearchEngine', + 'PhabricatorSearchEngineAPIMethod' => 'ConduitAPIMethod', + 'PhabricatorSearchEngineAttachment' => 'Phobject', + 'PhabricatorSearchEngineExtension' => 'Phobject', + 'PhabricatorSearchEngineExtensionModule' => 'PhabricatorConfigModule', + 'PhabricatorSearchFerretNgramGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorSearchField' => 'Phobject', + 'PhabricatorSearchHandleController' => 'PhabricatorSearchBaseController', + 'PhabricatorSearchHost' => 'Phobject', 'PhabricatorSearchHovercardController' => 'PhabricatorSearchBaseController', + 'PhabricatorSearchIndexVersion' => 'PhabricatorSearchDAO', + 'PhabricatorSearchIndexVersionDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', + 'PhabricatorSearchIntField' => 'PhabricatorSearchField', 'PhabricatorSearchManagementIndexWorkflow' => 'PhabricatorSearchManagementWorkflow', - 'PhabricatorSearchManagementWorkflow' => 'PhutilArgumentWorkflow', + 'PhabricatorSearchManagementInitWorkflow' => 'PhabricatorSearchManagementWorkflow', + 'PhabricatorSearchManagementNgramsWorkflow' => 'PhabricatorSearchManagementWorkflow', + 'PhabricatorSearchManagementQueryWorkflow' => 'PhabricatorSearchManagementWorkflow', + 'PhabricatorSearchManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorSearchNgramEngine' => 'Phobject', + 'PhabricatorSearchNgrams' => 'PhabricatorSearchDAO', + 'PhabricatorSearchNgramsDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 'PhabricatorSearchOrderController' => 'PhabricatorSearchBaseController', - 'PhabricatorSearchQuery' => 'PhabricatorSearchDAO', + 'PhabricatorSearchOrderField' => 'PhabricatorSearchField', + 'PhabricatorSearchRelationship' => 'Phobject', + 'PhabricatorSearchRelationshipController' => 'PhabricatorSearchBaseController', + 'PhabricatorSearchRelationshipSourceController' => 'PhabricatorSearchBaseController', + 'PhabricatorSearchResultBucket' => 'Phobject', + 'PhabricatorSearchResultBucketGroup' => 'Phobject', 'PhabricatorSearchResultView' => 'AphrontView', - 'PhabricatorSearchSelectController' => 'PhabricatorSearchBaseController', + 'PhabricatorSearchSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorSearchScopeSetting' => 'PhabricatorSelectSetting', + 'PhabricatorSearchSelectField' => 'PhabricatorSearchField', + 'PhabricatorSearchService' => 'Phobject', + 'PhabricatorSearchSettingsPanel' => 'PhabricatorEditEngineSettingsPanel', + 'PhabricatorSearchStringListField' => 'PhabricatorSearchField', + 'PhabricatorSearchSubscribersField' => 'PhabricatorSearchTokenizerField', + 'PhabricatorSearchTextField' => 'PhabricatorSearchField', + 'PhabricatorSearchThreeStateField' => 'PhabricatorSearchField', + 'PhabricatorSearchTokenizerField' => 'PhabricatorSearchField', + 'PhabricatorSearchWorker' => 'PhabricatorWorker', 'PhabricatorSecurityConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorSendGridConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorSecuritySetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorSelectEditField' => 'PhabricatorEditField', + 'PhabricatorSelectSetting' => 'PhabricatorSetting', + 'PhabricatorSelfHyperlinkEngineExtension' => 'PhabricatorRemarkupHyperlinkEngineExtension', + 'PhabricatorSessionsSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorSetConfigType' => 'PhabricatorTextConfigType', + 'PhabricatorSetting' => 'Phobject', + 'PhabricatorSettingsAccountPanelGroup' => 'PhabricatorSettingsPanelGroup', + 'PhabricatorSettingsAddEmailAction' => 'PhabricatorSystemAction', 'PhabricatorSettingsAdjustController' => 'PhabricatorController', + 'PhabricatorSettingsApplication' => 'PhabricatorApplication', + 'PhabricatorSettingsApplicationsPanelGroup' => 'PhabricatorSettingsPanelGroup', + 'PhabricatorSettingsAuthenticationPanelGroup' => 'PhabricatorSettingsPanelGroup', + 'PhabricatorSettingsDeveloperPanelGroup' => 'PhabricatorSettingsPanelGroup', + 'PhabricatorSettingsEditEngine' => 'PhabricatorEditEngine', + 'PhabricatorSettingsEmailPanelGroup' => 'PhabricatorSettingsPanelGroup', + 'PhabricatorSettingsIssueController' => 'PhabricatorController', + 'PhabricatorSettingsListController' => 'PhabricatorController', + 'PhabricatorSettingsLogsPanelGroup' => 'PhabricatorSettingsPanelGroup', 'PhabricatorSettingsMainController' => 'PhabricatorController', - 'PhabricatorSettingsPanelAccount' => 'PhabricatorSettingsPanel', - 'PhabricatorSettingsPanelConduit' => 'PhabricatorSettingsPanel', - 'PhabricatorSettingsPanelConpherencePreferences' => 'PhabricatorSettingsPanel', - 'PhabricatorSettingsPanelDeveloperPreferences' => 'PhabricatorSettingsPanel', - 'PhabricatorSettingsPanelDiffPreferences' => 'PhabricatorSettingsPanel', - 'PhabricatorSettingsPanelDisplayPreferences' => 'PhabricatorSettingsPanel', - 'PhabricatorSettingsPanelEmailAddresses' => 'PhabricatorSettingsPanel', - 'PhabricatorSettingsPanelEmailPreferences' => 'PhabricatorSettingsPanel', - 'PhabricatorSettingsPanelExternalAccounts' => 'PhabricatorSettingsPanel', - 'PhabricatorSettingsPanelHomePreferences' => 'PhabricatorSettingsPanel', - 'PhabricatorSettingsPanelPassword' => 'PhabricatorSettingsPanel', - 'PhabricatorSettingsPanelSSHKeys' => 'PhabricatorSettingsPanel', - 'PhabricatorSettingsPanelSearchPreferences' => 'PhabricatorSettingsPanel', - 'PhabricatorSetupCheckAPC' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckAuth' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckBaseURI' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckBinaries' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckDatabase' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckExtensions' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckExtraConfig' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckFileinfo' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckGD' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckImagemagick' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckInvalidConfig' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckMail' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckMySQL' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckPHPConfig' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckPath' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckPygment' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckStorage' => 'PhabricatorSetupCheck', - 'PhabricatorSetupCheckTimezone' => 'PhabricatorSetupCheck', - 'PhabricatorSetupIssueExample' => 'PhabricatorUIExample', + 'PhabricatorSettingsPanel' => 'Phobject', + 'PhabricatorSettingsPanelGroup' => 'Phobject', + 'PhabricatorSettingsTimezoneController' => 'PhabricatorController', + 'PhabricatorSetupCheck' => 'Phobject', + 'PhabricatorSetupCheckTestCase' => 'PhabricatorTestCase', + 'PhabricatorSetupEngine' => 'Phobject', + 'PhabricatorSetupIssue' => 'Phobject', + 'PhabricatorSetupIssueUIExample' => 'PhabricatorUIExample', 'PhabricatorSetupIssueView' => 'AphrontView', + 'PhabricatorShiftChartFunction' => 'PhabricatorPureChartFunction', + 'PhabricatorShortSite' => 'PhabricatorSite', + 'PhabricatorSignDocumentsUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorSimpleEditType' => 'PhabricatorEditType', + 'PhabricatorSinChartFunction' => 'PhabricatorPureChartFunction', + 'PhabricatorSite' => 'AphrontSite', + 'PhabricatorSlackAuthProvider' => 'PhabricatorOAuth2AuthProvider', + 'PhabricatorSlowvoteApplication' => 'PhabricatorApplication', 'PhabricatorSlowvoteChoice' => 'PhabricatorSlowvoteDAO', - 'PhabricatorSlowvoteComment' => 'PhabricatorSlowvoteDAO', + 'PhabricatorSlowvoteCloseController' => 'PhabricatorSlowvoteController', 'PhabricatorSlowvoteCommentController' => 'PhabricatorSlowvoteController', 'PhabricatorSlowvoteController' => 'PhabricatorController', 'PhabricatorSlowvoteDAO' => 'PhabricatorLiskDAO', + 'PhabricatorSlowvoteDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'PhabricatorSlowvoteDescriptionTransaction' => 'PhabricatorSlowvoteTransactionType', 'PhabricatorSlowvoteEditController' => 'PhabricatorSlowvoteController', 'PhabricatorSlowvoteEditor' => 'PhabricatorApplicationTransactionEditor', - 'PhabricatorSlowvoteListController' => - array( - 0 => 'PhabricatorSlowvoteController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), + 'PhabricatorSlowvoteListController' => 'PhabricatorSlowvoteController', + 'PhabricatorSlowvoteMailReceiver' => 'PhabricatorObjectMailReceiver', 'PhabricatorSlowvoteOption' => 'PhabricatorSlowvoteDAO', - 'PhabricatorSlowvotePHIDTypePoll' => 'PhabricatorPHIDType', - 'PhabricatorSlowvotePoll' => - array( - 0 => 'PhabricatorSlowvoteDAO', - 1 => 'PhabricatorPolicyInterface', - 2 => 'PhabricatorSubscribableInterface', - 3 => 'PhabricatorTokenReceiverInterface', + 'PhabricatorSlowvotePoll' => array( + 'PhabricatorSlowvoteDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorProjectInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorSpacesInterface', + 'PhabricatorConduitResultInterface', ), 'PhabricatorSlowvotePollController' => 'PhabricatorSlowvoteController', + 'PhabricatorSlowvotePollPHIDType' => 'PhabricatorPHIDType', 'PhabricatorSlowvoteQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorSlowvoteQuestionTransaction' => 'PhabricatorSlowvoteTransactionType', + 'PhabricatorSlowvoteReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PhabricatorSlowvoteResponsesTransaction' => 'PhabricatorSlowvoteTransactionType', + 'PhabricatorSlowvoteSchemaSpec' => 'PhabricatorConfigSchemaSpec', 'PhabricatorSlowvoteSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'PhabricatorSlowvoteTransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorSlowvoteShuffleTransaction' => 'PhabricatorSlowvoteTransactionType', + 'PhabricatorSlowvoteStatusTransaction' => 'PhabricatorSlowvoteTransactionType', + 'PhabricatorSlowvoteTransaction' => 'PhabricatorModularTransaction', 'PhabricatorSlowvoteTransactionComment' => 'PhabricatorApplicationTransactionComment', 'PhabricatorSlowvoteTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorSlowvoteTransactionType' => 'PhabricatorModularTransactionType', 'PhabricatorSlowvoteVoteController' => 'PhabricatorSlowvoteController', + 'PhabricatorSlowvoteVotingMethodTransaction' => 'PhabricatorSlowvoteTransactionType', + 'PhabricatorSlug' => 'Phobject', 'PhabricatorSlugTestCase' => 'PhabricatorTestCase', - 'PhabricatorSortTableExample' => 'PhabricatorUIExample', 'PhabricatorSourceCodeView' => 'AphrontView', + 'PhabricatorSourceDocumentEngine' => 'PhabricatorTextDocumentEngine', + 'PhabricatorSpaceEditField' => 'PhabricatorEditField', + 'PhabricatorSpacesApplication' => 'PhabricatorApplication', + 'PhabricatorSpacesArchiveController' => 'PhabricatorSpacesController', + 'PhabricatorSpacesCapabilityCreateSpaces' => 'PhabricatorPolicyCapability', + 'PhabricatorSpacesCapabilityDefaultEdit' => 'PhabricatorPolicyCapability', + 'PhabricatorSpacesCapabilityDefaultView' => 'PhabricatorPolicyCapability', + 'PhabricatorSpacesController' => 'PhabricatorController', + 'PhabricatorSpacesDAO' => 'PhabricatorLiskDAO', + 'PhabricatorSpacesEditController' => 'PhabricatorSpacesController', + 'PhabricatorSpacesExportEngineExtension' => 'PhabricatorExportEngineExtension', + 'PhabricatorSpacesInterface' => 'PhabricatorPHIDInterface', + 'PhabricatorSpacesListController' => 'PhabricatorSpacesController', + 'PhabricatorSpacesMailEngineExtension' => 'PhabricatorMailEngineExtension', + 'PhabricatorSpacesNamespace' => array( + 'PhabricatorSpacesDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorSpacesNamespaceArchiveTransaction' => 'PhabricatorSpacesNamespaceTransactionType', + 'PhabricatorSpacesNamespaceDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorSpacesNamespaceDefaultTransaction' => 'PhabricatorSpacesNamespaceTransactionType', + 'PhabricatorSpacesNamespaceDescriptionTransaction' => 'PhabricatorSpacesNamespaceTransactionType', + 'PhabricatorSpacesNamespaceEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorSpacesNamespaceNameTransaction' => 'PhabricatorSpacesNamespaceTransactionType', + 'PhabricatorSpacesNamespacePHIDType' => 'PhabricatorPHIDType', + 'PhabricatorSpacesNamespaceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorSpacesNamespaceSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorSpacesNamespaceTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorSpacesNamespaceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorSpacesNamespaceTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorSpacesNoAccessController' => 'PhabricatorSpacesController', + 'PhabricatorSpacesRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'PhabricatorSpacesSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorSpacesSearchEngineExtension' => 'PhabricatorSearchEngineExtension', + 'PhabricatorSpacesSearchField' => 'PhabricatorSearchTokenizerField', + 'PhabricatorSpacesTestCase' => 'PhabricatorTestCase', + 'PhabricatorSpacesViewController' => 'PhabricatorSpacesController', 'PhabricatorStandardCustomField' => 'PhabricatorCustomField', - 'PhabricatorStandardPageView' => 'PhabricatorBarePageView', + 'PhabricatorStandardCustomFieldBlueprints' => 'PhabricatorStandardCustomFieldTokenizer', + 'PhabricatorStandardCustomFieldBool' => 'PhabricatorStandardCustomField', + 'PhabricatorStandardCustomFieldCredential' => 'PhabricatorStandardCustomField', + 'PhabricatorStandardCustomFieldDatasource' => 'PhabricatorStandardCustomFieldTokenizer', + 'PhabricatorStandardCustomFieldDate' => 'PhabricatorStandardCustomField', + 'PhabricatorStandardCustomFieldHeader' => 'PhabricatorStandardCustomField', + 'PhabricatorStandardCustomFieldInt' => 'PhabricatorStandardCustomField', + 'PhabricatorStandardCustomFieldLink' => 'PhabricatorStandardCustomField', + 'PhabricatorStandardCustomFieldPHIDs' => 'PhabricatorStandardCustomField', + 'PhabricatorStandardCustomFieldRemarkup' => 'PhabricatorStandardCustomField', + 'PhabricatorStandardCustomFieldSelect' => 'PhabricatorStandardCustomField', + 'PhabricatorStandardCustomFieldText' => 'PhabricatorStandardCustomField', + 'PhabricatorStandardCustomFieldTokenizer' => 'PhabricatorStandardCustomFieldPHIDs', + 'PhabricatorStandardCustomFieldUsers' => 'PhabricatorStandardCustomFieldTokenizer', + 'PhabricatorStandardPageView' => array( + 'PhabricatorBarePageView', + 'AphrontResponseProducerInterface', + ), + 'PhabricatorStandardSelectCustomFieldDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorStandardTimelineEngine' => 'PhabricatorTimelineEngine', + 'PhabricatorStaticEditField' => 'PhabricatorEditField', 'PhabricatorStatusController' => 'PhabricatorController', + 'PhabricatorStatusUIExample' => 'PhabricatorUIExample', + 'PhabricatorStorageFixtureScopeGuard' => 'Phobject', + 'PhabricatorStorageManagementAPI' => 'Phobject', + 'PhabricatorStorageManagementAdjustWorkflow' => 'PhabricatorStorageManagementWorkflow', + 'PhabricatorStorageManagementAnalyzeWorkflow' => 'PhabricatorStorageManagementWorkflow', 'PhabricatorStorageManagementDatabasesWorkflow' => 'PhabricatorStorageManagementWorkflow', 'PhabricatorStorageManagementDestroyWorkflow' => 'PhabricatorStorageManagementWorkflow', 'PhabricatorStorageManagementDumpWorkflow' => 'PhabricatorStorageManagementWorkflow', + 'PhabricatorStorageManagementOptimizeWorkflow' => 'PhabricatorStorageManagementWorkflow', + 'PhabricatorStorageManagementPartitionWorkflow' => 'PhabricatorStorageManagementWorkflow', 'PhabricatorStorageManagementProbeWorkflow' => 'PhabricatorStorageManagementWorkflow', + 'PhabricatorStorageManagementQuickstartWorkflow' => 'PhabricatorStorageManagementWorkflow', + 'PhabricatorStorageManagementRenamespaceWorkflow' => 'PhabricatorStorageManagementWorkflow', + 'PhabricatorStorageManagementShellWorkflow' => 'PhabricatorStorageManagementWorkflow', 'PhabricatorStorageManagementStatusWorkflow' => 'PhabricatorStorageManagementWorkflow', 'PhabricatorStorageManagementUpgradeWorkflow' => 'PhabricatorStorageManagementWorkflow', - 'PhabricatorStorageManagementWorkflow' => 'PhutilArgumentWorkflow', + 'PhabricatorStorageManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorStoragePatch' => 'Phobject', + 'PhabricatorStorageSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorStorageSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorStringConfigType' => 'PhabricatorTextConfigType', + 'PhabricatorStringExportField' => 'PhabricatorExportField', + 'PhabricatorStringListConfigType' => 'PhabricatorTextListConfigType', + 'PhabricatorStringListEditField' => 'PhabricatorEditField', + 'PhabricatorStringListExportField' => 'PhabricatorListExportField', + 'PhabricatorStringMailStamp' => 'PhabricatorMailStamp', + 'PhabricatorStringSetting' => 'PhabricatorSetting', + 'PhabricatorSubmitEditField' => 'PhabricatorEditField', + 'PhabricatorSubscribedToObjectEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorSubscribersEditField' => 'PhabricatorTokenizerEditField', 'PhabricatorSubscribersQuery' => 'PhabricatorQuery', + 'PhabricatorSubscriptionTriggerClock' => 'PhabricatorTriggerClock', + 'PhabricatorSubscriptionsAddSelfHeraldAction' => 'PhabricatorSubscriptionsHeraldAction', + 'PhabricatorSubscriptionsAddSubscribersHeraldAction' => 'PhabricatorSubscriptionsHeraldAction', + 'PhabricatorSubscriptionsApplication' => 'PhabricatorApplication', + 'PhabricatorSubscriptionsCurtainExtension' => 'PHUICurtainExtension', 'PhabricatorSubscriptionsEditController' => 'PhabricatorController', + 'PhabricatorSubscriptionsEditEngineExtension' => 'PhabricatorEditEngineExtension', 'PhabricatorSubscriptionsEditor' => 'PhabricatorEditor', - 'PhabricatorSubscriptionsUIEventListener' => 'PhutilEventListener', - 'PhabricatorSymbolNameLinter' => 'ArcanistXHPASTLintNamingHook', + 'PhabricatorSubscriptionsExportEngineExtension' => 'PhabricatorExportEngineExtension', + 'PhabricatorSubscriptionsFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension', + 'PhabricatorSubscriptionsHeraldAction' => 'HeraldAction', + 'PhabricatorSubscriptionsListController' => 'PhabricatorController', + 'PhabricatorSubscriptionsMailEngineExtension' => 'PhabricatorMailEngineExtension', + 'PhabricatorSubscriptionsMuteController' => 'PhabricatorController', + 'PhabricatorSubscriptionsRemoveSelfHeraldAction' => 'PhabricatorSubscriptionsHeraldAction', + 'PhabricatorSubscriptionsRemoveSubscribersHeraldAction' => 'PhabricatorSubscriptionsHeraldAction', + 'PhabricatorSubscriptionsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', + 'PhabricatorSubscriptionsSearchEngineExtension' => 'PhabricatorSearchEngineExtension', + 'PhabricatorSubscriptionsSubscribeEmailCommand' => 'MetaMTAEmailTransactionCommand', + 'PhabricatorSubscriptionsSubscribersPolicyRule' => 'PhabricatorPolicyRule', + 'PhabricatorSubscriptionsTransactionController' => 'PhabricatorController', + 'PhabricatorSubscriptionsUIEventListener' => 'PhabricatorEventListener', + 'PhabricatorSubscriptionsUnsubscribeEmailCommand' => 'MetaMTAEmailTransactionCommand', + 'PhabricatorSubtypeEditEngineExtension' => 'PhabricatorEditEngineExtension', + 'PhabricatorSumChartFunction' => 'PhabricatorHigherOrderChartFunction', + 'PhabricatorSupportApplication' => 'PhabricatorApplication', + 'PhabricatorSyntaxHighlighter' => 'Phobject', 'PhabricatorSyntaxHighlightingConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorTagExample' => 'PhabricatorUIExample', - 'PhabricatorTagView' => 'AphrontView', + 'PhabricatorSyntaxStyle' => 'Phobject', + 'PhabricatorSystemAction' => 'Phobject', + 'PhabricatorSystemActionEngine' => 'Phobject', + 'PhabricatorSystemActionGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorSystemActionLog' => 'PhabricatorSystemDAO', + 'PhabricatorSystemActionRateLimitException' => 'Exception', + 'PhabricatorSystemApplication' => 'PhabricatorApplication', + 'PhabricatorSystemDAO' => 'PhabricatorLiskDAO', + 'PhabricatorSystemDebugUIEventListener' => 'PhabricatorEventListener', + 'PhabricatorSystemDestructionGarbageCollector' => 'PhabricatorGarbageCollector', + 'PhabricatorSystemDestructionLog' => 'PhabricatorSystemDAO', + 'PhabricatorSystemObjectController' => 'PhabricatorController', + 'PhabricatorSystemReadOnlyController' => 'PhabricatorController', + 'PhabricatorSystemRemoveDestroyWorkflow' => 'PhabricatorSystemRemoveWorkflow', + 'PhabricatorSystemRemoveLogWorkflow' => 'PhabricatorSystemRemoveWorkflow', + 'PhabricatorSystemRemoveWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorSystemSelectEncodingController' => 'PhabricatorController', + 'PhabricatorSystemSelectHighlightController' => 'PhabricatorController', + 'PhabricatorSystemSelectViewAsController' => 'PhabricatorController', + 'PhabricatorTOTPAuthFactor' => 'PhabricatorAuthFactor', + 'PhabricatorTOTPAuthFactorTestCase' => 'PhabricatorTestCase', 'PhabricatorTaskmasterDaemon' => 'PhabricatorDaemon', - 'PhabricatorTestCase' => 'ArcanistPhutilTestCase', + 'PhabricatorTaskmasterDaemonModule' => 'PhutilDaemonOverseerModule', + 'PhabricatorTestApplication' => 'PhabricatorApplication', + 'PhabricatorTestCase' => 'PhutilTestCase', + 'PhabricatorTestController' => 'PhabricatorController', + 'PhabricatorTestDataGenerator' => 'Phobject', + 'PhabricatorTestNoCycleEdgeType' => 'PhabricatorEdgeType', 'PhabricatorTestStorageEngine' => 'PhabricatorFileStorageEngine', 'PhabricatorTestWorker' => 'PhabricatorWorker', + 'PhabricatorTextAreaEditField' => 'PhabricatorEditField', + 'PhabricatorTextConfigType' => 'PhabricatorConfigType', + 'PhabricatorTextDocumentEngine' => 'PhabricatorDocumentEngine', + 'PhabricatorTextEditField' => 'PhabricatorEditField', + 'PhabricatorTextExportFormat' => 'PhabricatorExportFormat', + 'PhabricatorTextListConfigType' => 'PhabricatorTextConfigType', + 'PhabricatorTime' => 'Phobject', + 'PhabricatorTimeFormatSetting' => 'PhabricatorSelectSetting', + 'PhabricatorTimeGuard' => 'Phobject', 'PhabricatorTimeTestCase' => 'PhabricatorTestCase', - 'PhabricatorTimelineEventView' => 'AphrontView', - 'PhabricatorTimelineExample' => 'PhabricatorUIExample', - 'PhabricatorTimelineView' => 'AphrontView', - 'PhabricatorToken' => - array( - 0 => 'PhabricatorTokenDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorTimelineEngine' => 'Phobject', + 'PhabricatorTimezoneIgnoreOffsetSetting' => 'PhabricatorInternalSetting', + 'PhabricatorTimezoneSetting' => 'PhabricatorOptionGroupSetting', + 'PhabricatorTimezoneSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorTitleGlyphsSetting' => 'PhabricatorSelectSetting', + 'PhabricatorToken' => array( + 'PhabricatorTokenDAO', + 'PhabricatorPolicyInterface', ), 'PhabricatorTokenController' => 'PhabricatorController', 'PhabricatorTokenCount' => 'PhabricatorTokenDAO', 'PhabricatorTokenCountQuery' => 'PhabricatorOffsetPagedQuery', 'PhabricatorTokenDAO' => 'PhabricatorLiskDAO', + 'PhabricatorTokenDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 'PhabricatorTokenGiveController' => 'PhabricatorTokenController', - 'PhabricatorTokenGiven' => - array( - 0 => 'PhabricatorTokenDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhabricatorTokenGiven' => array( + 'PhabricatorTokenDAO', + 'PhabricatorPolicyInterface', ), 'PhabricatorTokenGivenController' => 'PhabricatorTokenController', 'PhabricatorTokenGivenEditor' => 'PhabricatorEditor', @@ -3743,445 +11765,1036 @@ 'PhabricatorTokenLeaderController' => 'PhabricatorTokenController', 'PhabricatorTokenQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorTokenReceiverQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhabricatorTokenUIEventListener' => 'PhutilEventListener', - 'PhabricatorTransactionView' => 'AphrontView', + 'PhabricatorTokenTokenPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorTokenUIEventListener' => 'PhabricatorEventListener', + 'PhabricatorTokenizerEditField' => 'PhabricatorPHIDListEditField', + 'PhabricatorTokensApplication' => 'PhabricatorApplication', + 'PhabricatorTokensCurtainExtension' => 'PHUICurtainExtension', + 'PhabricatorTokensSettingsPanel' => 'PhabricatorSettingsPanel', + 'PhabricatorTokensToken' => array( + 'PhabricatorTokenDAO', + 'PhabricatorDestructibleInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorConduitResultInterface', + ), + 'PhabricatorTransactionChange' => 'Phobject', + 'PhabricatorTransactionFactEngine' => 'PhabricatorFactEngine', + 'PhabricatorTransactionRemarkupChange' => 'PhabricatorTransactionChange', + 'PhabricatorTransactionWarning' => 'Phobject', + 'PhabricatorTransactions' => 'Phobject', + 'PhabricatorTransactionsApplication' => 'PhabricatorApplication', + 'PhabricatorTransactionsDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', + 'PhabricatorTransactionsFulltextEngineExtension' => 'PhabricatorFulltextEngineExtension', + 'PhabricatorTransactionsObjectTypeDatasource' => 'PhabricatorTypeaheadDatasource', 'PhabricatorTransformedFile' => 'PhabricatorFileDAO', + 'PhabricatorTranslationSetting' => 'PhabricatorOptionGroupSetting', 'PhabricatorTranslationsConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorTriggerAction' => 'Phobject', + 'PhabricatorTriggerClock' => 'Phobject', + 'PhabricatorTriggerClockTestCase' => 'PhabricatorTestCase', + 'PhabricatorTriggerDaemon' => 'PhabricatorDaemon', 'PhabricatorTrivialTestCase' => 'PhabricatorTestCase', - 'PhabricatorTwoColumnExample' => 'PhabricatorUIExample', - 'PhabricatorTypeaheadCommonDatasourceController' => 'PhabricatorTypeaheadDatasourceController', + 'PhabricatorTwilioFuture' => 'FutureProxy', + 'PhabricatorTwitchAuthProvider' => 'PhabricatorOAuth2AuthProvider', + 'PhabricatorTwitterAuthProvider' => 'PhabricatorOAuth1AuthProvider', + 'PhabricatorTypeaheadApplication' => 'PhabricatorApplication', + 'PhabricatorTypeaheadCompositeDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorTypeaheadDatasource' => 'Phobject', 'PhabricatorTypeaheadDatasourceController' => 'PhabricatorController', + 'PhabricatorTypeaheadDatasourceTestCase' => 'PhabricatorTestCase', + 'PhabricatorTypeaheadFunctionHelpController' => 'PhabricatorTypeaheadDatasourceController', + 'PhabricatorTypeaheadInvalidTokenException' => 'Exception', + 'PhabricatorTypeaheadModularDatasourceController' => 'PhabricatorTypeaheadDatasourceController', + 'PhabricatorTypeaheadMonogramDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorTypeaheadProxyDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorTypeaheadResult' => 'Phobject', + 'PhabricatorTypeaheadRuntimeCompositeDatasource' => 'PhabricatorTypeaheadCompositeDatasource', + 'PhabricatorTypeaheadTestNumbersDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorTypeaheadTokenView' => 'AphrontTagView', + 'PhabricatorUIConfigOptions' => 'PhabricatorApplicationConfigOptions', + 'PhabricatorUIExample' => 'Phobject', 'PhabricatorUIExampleRenderController' => 'PhabricatorController', - 'PhabricatorUIListFilterExample' => 'PhabricatorUIExample', - 'PhabricatorUINotificationExample' => 'PhabricatorUIExample', - 'PhabricatorUIPagerExample' => 'PhabricatorUIExample', - 'PhabricatorUIStatusExample' => 'PhabricatorUIExample', - 'PhabricatorUITooltipExample' => 'PhabricatorUIExample', + 'PhabricatorUIExamplesApplication' => 'PhabricatorApplication', + 'PhabricatorURIExportField' => 'PhabricatorExportField', + 'PhabricatorUSEnglishTranslation' => 'PhutilTranslation', + 'PhabricatorUnifiedDiffsSetting' => 'PhabricatorSelectSetting', + 'PhabricatorUnitTestContentSource' => 'PhabricatorContentSource', 'PhabricatorUnitsTestCase' => 'PhabricatorTestCase', - 'PhabricatorUser' => - array( - 0 => 'PhabricatorUserDAO', - 1 => 'PhutilPerson', - 2 => 'PhabricatorPolicyInterface', - 3 => 'PhabricatorCustomFieldInterface', + 'PhabricatorUnknownContentSource' => 'PhabricatorContentSource', + 'PhabricatorUnlockEngine' => 'Phobject', + 'PhabricatorUnsubscribedFromObjectEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorUser' => array( + 'PhabricatorUserDAO', + 'PhutilPerson', + 'PhabricatorPolicyInterface', + 'PhabricatorCustomFieldInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorSSHPublicKeyInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorAuthPasswordHashInterface', ), + 'PhabricatorUserApproveTransaction' => 'PhabricatorUserTransactionType', + 'PhabricatorUserBadgesCacheType' => 'PhabricatorUserCacheType', 'PhabricatorUserBlurbField' => 'PhabricatorUserCustomField', + 'PhabricatorUserCache' => 'PhabricatorUserDAO', + 'PhabricatorUserCachePurger' => 'PhabricatorCachePurger', + 'PhabricatorUserCacheType' => 'Phobject', + 'PhabricatorUserCardView' => 'AphrontTagView', 'PhabricatorUserConfigOptions' => 'PhabricatorApplicationConfigOptions', - 'PhabricatorUserCustomField' => - array( - 0 => 'PhabricatorCustomField', - 1 => 'PhabricatorUserCustomFieldInterface', + 'PhabricatorUserConfiguredCustomField' => array( + 'PhabricatorUserCustomField', + 'PhabricatorStandardCustomFieldInterface', ), + 'PhabricatorUserConfiguredCustomFieldStorage' => 'PhabricatorCustomFieldStorage', + 'PhabricatorUserCustomField' => 'PhabricatorCustomField', + 'PhabricatorUserCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage', + 'PhabricatorUserCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage', 'PhabricatorUserDAO' => 'PhabricatorLiskDAO', + 'PhabricatorUserDisableTransaction' => 'PhabricatorUserTransactionType', + 'PhabricatorUserEditEngine' => 'PhabricatorEditEngine', 'PhabricatorUserEditor' => 'PhabricatorEditor', - 'PhabricatorUserEmail' => 'PhabricatorUserDAO', - 'PhabricatorUserLog' => 'PhabricatorUserDAO', - 'PhabricatorUserPreferences' => 'PhabricatorUserDAO', + 'PhabricatorUserEditorTestCase' => 'PhabricatorTestCase', + 'PhabricatorUserEmail' => array( + 'PhabricatorUserDAO', + 'PhabricatorDestructibleInterface', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorUserEmailTestCase' => 'PhabricatorTestCase', + 'PhabricatorUserEmpowerTransaction' => 'PhabricatorUserTransactionType', + 'PhabricatorUserFerretEngine' => 'PhabricatorFerretEngine', + 'PhabricatorUserFulltextEngine' => 'PhabricatorFulltextEngine', + 'PhabricatorUserIconField' => 'PhabricatorUserCustomField', + 'PhabricatorUserLog' => array( + 'PhabricatorUserDAO', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorUserLogType' => 'Phobject', + 'PhabricatorUserLogTypeDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorUserLogView' => 'AphrontView', + 'PhabricatorUserMessageCountCacheType' => 'PhabricatorUserCacheType', + 'PhabricatorUserNotificationCountCacheType' => 'PhabricatorUserCacheType', + 'PhabricatorUserNotifyTransaction' => 'PhabricatorUserTransactionType', + 'PhabricatorUserPHIDResolver' => 'PhabricatorPHIDResolver', + 'PhabricatorUserPreferences' => array( + 'PhabricatorUserDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorApplicationTransactionInterface', + ), + 'PhabricatorUserPreferencesCacheType' => 'PhabricatorUserCacheType', + 'PhabricatorUserPreferencesEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorUserPreferencesPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorUserPreferencesQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorUserPreferencesSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorUserPreferencesTransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorUserPreferencesTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhabricatorUserProfile' => 'PhabricatorUserDAO', - 'PhabricatorUserProfileEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorUserProfileImageCacheType' => 'PhabricatorUserCacheType', 'PhabricatorUserRealNameField' => 'PhabricatorUserCustomField', 'PhabricatorUserRolesField' => 'PhabricatorUserCustomField', - 'PhabricatorUserSSHKey' => 'PhabricatorUserDAO', - 'PhabricatorUserSearchIndexer' => 'PhabricatorSearchDocumentIndexer', + 'PhabricatorUserSchemaSpec' => 'PhabricatorConfigSchemaSpec', 'PhabricatorUserSinceField' => 'PhabricatorUserCustomField', - 'PhabricatorUserStatus' => 'PhabricatorUserDAO', 'PhabricatorUserStatusField' => 'PhabricatorUserCustomField', - 'PhabricatorUserStatusInvalidEpochException' => 'Exception', - 'PhabricatorUserStatusOverlapException' => 'Exception', 'PhabricatorUserTestCase' => 'PhabricatorTestCase', 'PhabricatorUserTitleField' => 'PhabricatorUserCustomField', - 'PhabricatorUserTransaction' => 'PhabricatorApplicationTransaction', - 'PhabricatorWorkboardExample' => 'PhabricatorUIExample', - 'PhabricatorWorkboardView' => 'AphrontView', + 'PhabricatorUserTransaction' => 'PhabricatorModularTransaction', + 'PhabricatorUserTransactionEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorUserTransactionType' => 'PhabricatorModularTransactionType', + 'PhabricatorUserUsernameTransaction' => 'PhabricatorUserTransactionType', + 'PhabricatorUsersEditField' => 'PhabricatorTokenizerEditField', + 'PhabricatorUsersPolicyRule' => 'PhabricatorPolicyRule', + 'PhabricatorUsersSearchField' => 'PhabricatorSearchTokenizerField', + 'PhabricatorVCSResponse' => 'AphrontResponse', + 'PhabricatorVerifyEmailUserLogType' => 'PhabricatorUserLogType', + 'PhabricatorVersionedDraft' => 'PhabricatorDraftDAO', + 'PhabricatorVeryWowEnglishTranslation' => 'PhutilTranslation', + 'PhabricatorVideoDocumentEngine' => 'PhabricatorDocumentEngine', + 'PhabricatorViewerDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhabricatorVoidDocumentEngine' => 'PhabricatorDocumentEngine', + 'PhabricatorWatcherHasObjectEdgeType' => 'PhabricatorEdgeType', + 'PhabricatorWebContentSource' => 'PhabricatorContentSource', + 'PhabricatorWebServerSetupCheck' => 'PhabricatorSetupCheck', + 'PhabricatorWeekStartDaySetting' => 'PhabricatorSelectSetting', + 'PhabricatorWildConfigType' => 'PhabricatorJSONConfigType', + 'PhabricatorWordPressAuthProvider' => 'PhabricatorOAuth2AuthProvider', + 'PhabricatorWorkboardViewState' => 'Phobject', + 'PhabricatorWorker' => 'Phobject', 'PhabricatorWorkerActiveTask' => 'PhabricatorWorkerTask', + 'PhabricatorWorkerActiveTaskQuery' => 'PhabricatorWorkerTaskQuery', 'PhabricatorWorkerArchiveTask' => 'PhabricatorWorkerTask', + 'PhabricatorWorkerArchiveTaskQuery' => 'PhabricatorWorkerTaskQuery', + 'PhabricatorWorkerBulkJob' => array( + 'PhabricatorWorkerDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorDestructibleInterface', + ), + 'PhabricatorWorkerBulkJobCreateWorker' => 'PhabricatorWorkerBulkJobWorker', + 'PhabricatorWorkerBulkJobEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhabricatorWorkerBulkJobPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorWorkerBulkJobQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorWorkerBulkJobSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorWorkerBulkJobTaskWorker' => 'PhabricatorWorkerBulkJobWorker', + 'PhabricatorWorkerBulkJobTestCase' => 'PhabricatorTestCase', + 'PhabricatorWorkerBulkJobTransaction' => 'PhabricatorApplicationTransaction', + 'PhabricatorWorkerBulkJobTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhabricatorWorkerBulkJobType' => 'Phobject', + 'PhabricatorWorkerBulkJobWorker' => 'PhabricatorWorker', + 'PhabricatorWorkerBulkTask' => 'PhabricatorWorkerDAO', 'PhabricatorWorkerDAO' => 'PhabricatorLiskDAO', + 'PhabricatorWorkerDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 'PhabricatorWorkerLeaseQuery' => 'PhabricatorQuery', + 'PhabricatorWorkerManagementCancelWorkflow' => 'PhabricatorWorkerManagementWorkflow', + 'PhabricatorWorkerManagementDelayWorkflow' => 'PhabricatorWorkerManagementWorkflow', + 'PhabricatorWorkerManagementExecuteWorkflow' => 'PhabricatorWorkerManagementWorkflow', + 'PhabricatorWorkerManagementFloodWorkflow' => 'PhabricatorWorkerManagementWorkflow', + 'PhabricatorWorkerManagementFreeWorkflow' => 'PhabricatorWorkerManagementWorkflow', + 'PhabricatorWorkerManagementPriorityWorkflow' => 'PhabricatorWorkerManagementWorkflow', + 'PhabricatorWorkerManagementRetryWorkflow' => 'PhabricatorWorkerManagementWorkflow', + 'PhabricatorWorkerManagementWorkflow' => 'PhabricatorManagementWorkflow', 'PhabricatorWorkerPermanentFailureException' => 'Exception', + 'PhabricatorWorkerSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhabricatorWorkerSingleBulkJobType' => 'PhabricatorWorkerBulkJobType', 'PhabricatorWorkerTask' => 'PhabricatorWorkerDAO', 'PhabricatorWorkerTaskData' => 'PhabricatorWorkerDAO', 'PhabricatorWorkerTaskDetailController' => 'PhabricatorDaemonController', - 'PhabricatorWorkerTaskUpdateController' => 'PhabricatorDaemonController', + 'PhabricatorWorkerTaskQuery' => 'PhabricatorQuery', 'PhabricatorWorkerTestCase' => 'PhabricatorTestCase', + 'PhabricatorWorkerTrigger' => array( + 'PhabricatorWorkerDAO', + 'PhabricatorDestructibleInterface', + 'PhabricatorPolicyInterface', + ), + 'PhabricatorWorkerTriggerEvent' => 'PhabricatorWorkerDAO', + 'PhabricatorWorkerTriggerManagementFireWorkflow' => 'PhabricatorWorkerTriggerManagementWorkflow', + 'PhabricatorWorkerTriggerManagementWorkflow' => 'PhabricatorManagementWorkflow', + 'PhabricatorWorkerTriggerPHIDType' => 'PhabricatorPHIDType', + 'PhabricatorWorkerTriggerQuery' => 'PhabricatorPolicyAwareQuery', + 'PhabricatorWorkerYieldException' => 'Exception', 'PhabricatorWorkingCopyDiscoveryTestCase' => 'PhabricatorWorkingCopyTestCase', 'PhabricatorWorkingCopyPullTestCase' => 'PhabricatorWorkingCopyTestCase', 'PhabricatorWorkingCopyTestCase' => 'PhabricatorTestCase', - 'PhabricatorWorkpanelView' => 'AphrontView', + 'PhabricatorXHPASTDAO' => 'PhabricatorLiskDAO', + 'PhabricatorXHPASTParseTree' => 'PhabricatorXHPASTDAO', 'PhabricatorXHPASTViewController' => 'PhabricatorController', - 'PhabricatorXHPASTViewDAO' => 'PhabricatorLiskDAO', 'PhabricatorXHPASTViewFrameController' => 'PhabricatorXHPASTViewController', 'PhabricatorXHPASTViewFramesetController' => 'PhabricatorXHPASTViewController', 'PhabricatorXHPASTViewInputController' => 'PhabricatorXHPASTViewPanelController', 'PhabricatorXHPASTViewPanelController' => 'PhabricatorXHPASTViewController', - 'PhabricatorXHPASTViewParseTree' => 'PhabricatorXHPASTViewDAO', 'PhabricatorXHPASTViewRunController' => 'PhabricatorXHPASTViewController', 'PhabricatorXHPASTViewStreamController' => 'PhabricatorXHPASTViewPanelController', 'PhabricatorXHPASTViewTreeController' => 'PhabricatorXHPASTViewPanelController', + 'PhabricatorXHProfApplication' => 'PhabricatorApplication', 'PhabricatorXHProfController' => 'PhabricatorController', 'PhabricatorXHProfDAO' => 'PhabricatorLiskDAO', + 'PhabricatorXHProfDropController' => 'PhabricatorXHProfController', 'PhabricatorXHProfProfileController' => 'PhabricatorXHProfController', 'PhabricatorXHProfProfileSymbolView' => 'PhabricatorXHProfProfileView', 'PhabricatorXHProfProfileTopLevelView' => 'PhabricatorXHProfProfileView', 'PhabricatorXHProfProfileView' => 'AphrontView', - 'PhabricatorXHProfSample' => 'PhabricatorXHProfDAO', + 'PhabricatorXHProfSample' => array( + 'PhabricatorXHProfDAO', + 'PhabricatorPolicyInterface', + ), 'PhabricatorXHProfSampleListController' => 'PhabricatorXHProfController', - 'PhameBasicBlogSkin' => 'PhameBlogSkin', - 'PhameBasicTemplateBlogSkin' => 'PhameBasicBlogSkin', - 'PhameBlog' => - array( - 0 => 'PhameDAO', - 1 => 'PhabricatorPolicyInterface', - 2 => 'PhabricatorMarkupInterface', - ), - 'PhameBlogDeleteController' => 'PhameController', - 'PhameBlogEditController' => 'PhameController', - 'PhameBlogFeedController' => 'PhameController', - 'PhameBlogListController' => 'PhameController', - 'PhameBlogLiveController' => 'PhameController', + 'PhabricatorXHProfSampleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorXHProfSampleSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhabricatorYoutubeRemarkupRule' => 'PhutilRemarkupRule', + 'PhabricatorZipSetupCheck' => 'PhabricatorSetupCheck', + 'Phame404Response' => 'AphrontHTMLResponse', + 'PhameBlog' => array( + 'PhameDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorMarkupInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorProjectInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + ), + 'PhameBlog404Controller' => 'PhameLiveController', + 'PhameBlogArchiveController' => 'PhameBlogController', + 'PhameBlogController' => 'PhameController', + 'PhameBlogCreateCapability' => 'PhabricatorPolicyCapability', + 'PhameBlogDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhameBlogDescriptionTransaction' => 'PhameBlogTransactionType', + 'PhameBlogEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'PhameBlogEditController' => 'PhameBlogController', + 'PhameBlogEditEngine' => 'PhabricatorEditEngine', + 'PhameBlogEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhameBlogFeedController' => 'PhameBlogController', + 'PhameBlogFerretEngine' => 'PhabricatorFerretEngine', + 'PhameBlogFullDomainTransaction' => 'PhameBlogTransactionType', + 'PhameBlogFulltextEngine' => 'PhabricatorFulltextEngine', + 'PhameBlogHeaderImageTransaction' => 'PhameBlogTransactionType', + 'PhameBlogHeaderPictureController' => 'PhameBlogController', + 'PhameBlogListController' => 'PhameBlogController', + 'PhameBlogListView' => 'AphrontTagView', + 'PhameBlogManageController' => 'PhameBlogController', + 'PhameBlogNameTransaction' => 'PhameBlogTransactionType', + 'PhameBlogParentDomainTransaction' => 'PhameBlogTransactionType', + 'PhameBlogParentSiteTransaction' => 'PhameBlogTransactionType', + 'PhameBlogProfileImageTransaction' => 'PhameBlogTransactionType', + 'PhameBlogProfilePictureController' => 'PhameBlogController', 'PhameBlogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhameBlogSkin' => 'PhabricatorController', - 'PhameBlogViewController' => 'PhameController', + 'PhameBlogReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PhameBlogSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PhameBlogSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhameBlogSite' => 'PhameSite', + 'PhameBlogStatusTransaction' => 'PhameBlogTransactionType', + 'PhameBlogSubtitleTransaction' => 'PhameBlogTransactionType', + 'PhameBlogTransaction' => 'PhabricatorModularTransaction', + 'PhameBlogTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhameBlogTransactionType' => 'PhabricatorModularTransactionType', + 'PhameBlogViewController' => 'PhameLiveController', + 'PhameConstants' => 'Phobject', 'PhameController' => 'PhabricatorController', 'PhameDAO' => 'PhabricatorLiskDAO', - 'PhamePost' => - array( - 0 => 'PhameDAO', - 1 => 'PhabricatorPolicyInterface', - 2 => 'PhabricatorMarkupInterface', - 3 => 'PhabricatorTokenReceiverInterface', - ), - 'PhamePostDeleteController' => 'PhameController', - 'PhamePostEditController' => 'PhameController', - 'PhamePostFramedController' => 'PhameController', - 'PhamePostListController' => 'PhameController', - 'PhamePostNewController' => 'PhameController', - 'PhamePostNotLiveController' => 'PhameController', - 'PhamePostPreviewController' => 'PhameController', - 'PhamePostPublishController' => 'PhameController', + 'PhameDescriptionView' => 'AphrontTagView', + 'PhameDraftListView' => 'AphrontTagView', + 'PhameHomeController' => 'PhamePostController', + 'PhameInheritBlogPolicyRule' => 'PhabricatorPolicyRule', + 'PhameLiveController' => 'PhameController', + 'PhameNextPostView' => 'AphrontTagView', + 'PhamePost' => array( + 'PhameDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorMarkupInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorProjectInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorEditEngineLockableInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + ), + 'PhamePostArchiveController' => 'PhamePostController', + 'PhamePostBlogTransaction' => 'PhamePostTransactionType', + 'PhamePostBodyTransaction' => 'PhamePostTransactionType', + 'PhamePostController' => 'PhameController', + 'PhamePostEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'PhamePostEditController' => 'PhamePostController', + 'PhamePostEditEngine' => 'PhabricatorEditEngine', + 'PhamePostEditEngineLock' => 'PhabricatorEditEngineLock', + 'PhamePostEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhamePostFerretEngine' => 'PhabricatorFerretEngine', + 'PhamePostFulltextEngine' => 'PhabricatorFulltextEngine', + 'PhamePostHeaderImageTransaction' => 'PhamePostTransactionType', + 'PhamePostHeaderPictureController' => 'PhamePostController', + 'PhamePostHistoryController' => 'PhamePostController', + 'PhamePostListController' => 'PhamePostController', + 'PhamePostListView' => 'AphrontTagView', + 'PhamePostMailReceiver' => 'PhabricatorObjectMailReceiver', + 'PhamePostMoveController' => 'PhamePostController', + 'PhamePostPublishController' => 'PhamePostController', 'PhamePostQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhamePostUnpublishController' => 'PhameController', - 'PhamePostView' => 'AphrontView', - 'PhamePostViewController' => 'PhameController', - 'PhameResourceController' => 'CelerityResourceController', + 'PhamePostRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'PhamePostReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PhamePostSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PhamePostSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhamePostSubtitleTransaction' => 'PhamePostTransactionType', + 'PhamePostTitleTransaction' => 'PhamePostTransactionType', + 'PhamePostTransaction' => 'PhabricatorModularTransaction', + 'PhamePostTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'PhamePostTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhamePostTransactionType' => 'PhabricatorModularTransactionType', + 'PhamePostViewController' => 'PhameLiveController', + 'PhamePostVisibilityTransaction' => 'PhamePostTransactionType', + 'PhameSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhameSite' => 'PhabricatorSite', 'PhluxController' => 'PhabricatorController', 'PhluxDAO' => 'PhabricatorLiskDAO', 'PhluxEditController' => 'PhluxController', 'PhluxListController' => 'PhluxController', - 'PhluxPHIDTypeVariable' => 'PhabricatorPHIDType', + 'PhluxSchemaSpec' => 'PhabricatorConfigSchemaSpec', 'PhluxTransaction' => 'PhabricatorApplicationTransaction', 'PhluxTransactionQuery' => 'PhabricatorApplicationTransactionQuery', - 'PhluxVariable' => - array( - 0 => 'PhluxDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhluxVariable' => array( + 'PhluxDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorPolicyInterface', ), 'PhluxVariableEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhluxVariablePHIDType' => 'PhabricatorPHIDType', 'PhluxVariableQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhluxViewController' => 'PhluxController', 'PholioController' => 'PhabricatorController', 'PholioDAO' => 'PhabricatorLiskDAO', - 'PholioImage' => - array( - 0 => 'PholioDAO', - 1 => 'PhabricatorMarkupInterface', - 2 => 'PhabricatorPolicyInterface', + 'PholioDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'PholioDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'PholioImage' => array( + 'PholioDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', ), - 'PholioImageHistoryController' => 'PholioController', + 'PholioImageDescriptionTransaction' => 'PholioImageTransactionType', + 'PholioImageFileTransaction' => 'PholioImageTransactionType', + 'PholioImageNameTransaction' => 'PholioImageTransactionType', + 'PholioImagePHIDType' => 'PhabricatorPHIDType', 'PholioImageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PholioImageReplaceTransaction' => 'PholioImageTransactionType', + 'PholioImageSequenceTransaction' => 'PholioImageTransactionType', + 'PholioImageTransactionType' => 'PholioTransactionType', 'PholioImageUploadController' => 'PholioController', - 'PholioInlineCommentEditView' => 'AphrontView', - 'PholioInlineCommentSaveView' => 'AphrontView', - 'PholioInlineCommentView' => 'AphrontView', 'PholioInlineController' => 'PholioController', - 'PholioInlineDeleteController' => 'PholioController', - 'PholioInlineEditController' => 'PholioController', - 'PholioInlineSaveController' => 'PholioController', - 'PholioInlineThumbController' => 'PholioController', - 'PholioInlineViewController' => 'PholioController', - 'PholioMock' => - array( - 0 => 'PholioDAO', - 1 => 'PhabricatorMarkupInterface', - 2 => 'PhabricatorPolicyInterface', - 3 => 'PhabricatorSubscribableInterface', - 4 => 'PhabricatorTokenReceiverInterface', - 5 => 'PhabricatorApplicationTransactionInterface', + 'PholioInlineListController' => 'PholioController', + 'PholioMock' => array( + 'PholioDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorTimelineInterface', + 'PhabricatorProjectInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorSpacesInterface', + 'PhabricatorMentionableInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', ), + 'PholioMockArchiveController' => 'PholioController', + 'PholioMockAuthorHeraldField' => 'PholioMockHeraldField', 'PholioMockCommentController' => 'PholioController', + 'PholioMockDescriptionHeraldField' => 'PholioMockHeraldField', + 'PholioMockDescriptionTransaction' => 'PholioMockTransactionType', 'PholioMockEditController' => 'PholioController', 'PholioMockEditor' => 'PhabricatorApplicationTransactionEditor', 'PholioMockEmbedView' => 'AphrontView', + 'PholioMockFerretEngine' => 'PhabricatorFerretEngine', + 'PholioMockFulltextEngine' => 'PhabricatorFulltextEngine', + 'PholioMockHasTaskEdgeType' => 'PhabricatorEdgeType', + 'PholioMockHasTaskRelationship' => 'PholioMockRelationship', + 'PholioMockHeraldField' => 'HeraldField', + 'PholioMockHeraldFieldGroup' => 'HeraldFieldGroup', 'PholioMockImagesView' => 'AphrontView', - 'PholioMockListController' => - array( - 0 => 'PholioController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), + 'PholioMockInlineTransaction' => 'PholioMockTransactionType', + 'PholioMockListController' => 'PholioController', 'PholioMockMailReceiver' => 'PhabricatorObjectMailReceiver', + 'PholioMockNameHeraldField' => 'PholioMockHeraldField', + 'PholioMockNameTransaction' => 'PholioMockTransactionType', + 'PholioMockPHIDType' => 'PhabricatorPHIDType', 'PholioMockQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PholioMockRelationship' => 'PhabricatorObjectRelationship', + 'PholioMockRelationshipSource' => 'PhabricatorObjectRelationshipSource', 'PholioMockSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PholioMockStatusTransaction' => 'PholioMockTransactionType', + 'PholioMockThumbGridView' => 'AphrontView', + 'PholioMockTimelineEngine' => 'PhabricatorTimelineEngine', + 'PholioMockTransactionType' => 'PholioTransactionType', 'PholioMockViewController' => 'PholioController', - 'PholioPHIDTypeImage' => 'PhabricatorPHIDType', - 'PholioPHIDTypeMock' => 'PhabricatorPHIDType', - 'PholioRemarkupRule' => 'PhabricatorRemarkupRuleObject', - 'PholioReplyHandler' => 'PhabricatorMailReplyHandler', - 'PholioSearchIndexer' => 'PhabricatorSearchDocumentIndexer', - 'PholioTransaction' => 'PhabricatorApplicationTransaction', + 'PholioRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'PholioReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PholioSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PholioTransaction' => 'PhabricatorModularTransaction', 'PholioTransactionComment' => 'PhabricatorApplicationTransactionComment', 'PholioTransactionQuery' => 'PhabricatorApplicationTransactionQuery', - 'PholioTransactionType' => 'PholioConstants', + 'PholioTransactionType' => 'PhabricatorModularTransactionType', 'PholioTransactionView' => 'PhabricatorApplicationTransactionView', 'PholioUploadedImageView' => 'AphrontView', - 'PhortuneAccount' => - array( - 0 => 'PhortuneDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhortuneAccount' => array( + 'PhortuneDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', ), - 'PhortuneAccountBuyController' => 'PhortuneController', + 'PhortuneAccountAddManagerController' => 'PhortuneAccountController', + 'PhortuneAccountBillingAddressTransaction' => 'PhortuneAccountTransactionType', + 'PhortuneAccountBillingNameTransaction' => 'PhortuneAccountTransactionType', + 'PhortuneAccountChargeListController' => 'PhortuneAccountProfileController', + 'PhortuneAccountChargesController' => 'PhortuneAccountProfileController', + 'PhortuneAccountController' => 'PhortuneController', + 'PhortuneAccountDetailsController' => 'PhortuneAccountProfileController', + 'PhortuneAccountEditController' => 'PhortuneController', + 'PhortuneAccountEditEngine' => 'PhabricatorEditEngine', 'PhortuneAccountEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhortuneAccountEmail' => array( + 'PhortuneDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + ), + 'PhortuneAccountEmailAddressTransaction' => 'PhortuneAccountEmailTransactionType', + 'PhortuneAccountEmailAddressesController' => 'PhortuneAccountProfileController', + 'PhortuneAccountEmailEditController' => 'PhortuneAccountController', + 'PhortuneAccountEmailEditEngine' => 'PhabricatorEditEngine', + 'PhortuneAccountEmailEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhortuneAccountEmailPHIDType' => 'PhabricatorPHIDType', + 'PhortuneAccountEmailQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhortuneAccountEmailRotateController' => 'PhortuneAccountController', + 'PhortuneAccountEmailRotateTransaction' => 'PhortuneAccountEmailTransactionType', + 'PhortuneAccountEmailStatus' => 'Phobject', + 'PhortuneAccountEmailStatusController' => 'PhortuneAccountController', + 'PhortuneAccountEmailStatusTransaction' => 'PhortuneAccountEmailTransactionType', + 'PhortuneAccountEmailTransaction' => 'PhabricatorModularTransaction', + 'PhortuneAccountEmailTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhortuneAccountEmailTransactionType' => 'PhabricatorModularTransactionType', + 'PhortuneAccountEmailViewController' => 'PhortuneAccountController', + 'PhortuneAccountHasMemberEdgeType' => 'PhabricatorEdgeType', + 'PhortuneAccountHasMerchantEdgeType' => 'PhabricatorEdgeType', + 'PhortuneAccountListController' => 'PhortuneController', + 'PhortuneAccountManagersController' => 'PhortuneAccountProfileController', + 'PhortuneAccountNameTransaction' => 'PhortuneAccountTransactionType', + 'PhortuneAccountOrderListController' => 'PhortuneAccountProfileController', + 'PhortuneAccountOrdersController' => 'PhortuneAccountProfileController', + 'PhortuneAccountOverviewController' => 'PhortuneAccountProfileController', + 'PhortuneAccountPHIDType' => 'PhabricatorPHIDType', + 'PhortuneAccountPaymentMethodController' => 'PhortuneAccountProfileController', + 'PhortuneAccountPaymentMethodViewController' => 'PhortuneAccountController', + 'PhortuneAccountProfileController' => 'PhortuneAccountController', 'PhortuneAccountQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhortuneAccountTransaction' => 'PhabricatorApplicationTransaction', + 'PhortuneAccountSubscriptionAutopayController' => 'PhortuneAccountController', + 'PhortuneAccountSubscriptionController' => 'PhortuneAccountProfileController', + 'PhortuneAccountSubscriptionViewController' => 'PhortuneAccountController', + 'PhortuneAccountTransaction' => 'PhabricatorModularTransaction', 'PhortuneAccountTransactionQuery' => 'PhabricatorApplicationTransactionQuery', - 'PhortuneAccountViewController' => 'PhortuneController', - 'PhortuneBalancedPaymentProvider' => 'PhortunePaymentProvider', - 'PhortuneCart' => 'PhortuneDAO', - 'PhortuneCharge' => 'PhortuneDAO', + 'PhortuneAccountTransactionType' => 'PhabricatorModularTransactionType', + 'PhortuneAdHocCart' => 'PhortuneCartImplementation', + 'PhortuneAdHocProduct' => 'PhortuneProductImplementation', + 'PhortuneAddPaymentMethodAction' => 'PhabricatorSystemAction', + 'PhortuneCart' => array( + 'PhortuneDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + ), + 'PhortuneCartAcceptController' => 'PhortuneCartController', + 'PhortuneCartCancelController' => 'PhortuneCartController', + 'PhortuneCartCheckoutController' => 'PhortuneCartController', + 'PhortuneCartController' => 'PhortuneController', + 'PhortuneCartEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhortuneCartImplementation' => 'Phobject', + 'PhortuneCartPHIDType' => 'PhabricatorPHIDType', + 'PhortuneCartQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhortuneCartReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PhortuneCartSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhortuneCartTransaction' => 'PhabricatorApplicationTransaction', + 'PhortuneCartTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhortuneCartUpdateController' => 'PhortuneCartController', + 'PhortuneCartViewController' => 'PhortuneCartController', + 'PhortuneCartVoidController' => 'PhortuneCartController', + 'PhortuneCharge' => array( + 'PhortuneDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + ), + 'PhortuneChargePHIDType' => 'PhabricatorPHIDType', + 'PhortuneChargeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhortuneChargeSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhortuneChargeTableView' => 'AphrontView', + 'PhortuneConstants' => 'Phobject', 'PhortuneController' => 'PhabricatorController', + 'PhortuneCreditCardForm' => 'Phobject', + 'PhortuneCurrency' => 'Phobject', + 'PhortuneCurrencySerializer' => 'PhabricatorLiskSerializer', 'PhortuneCurrencyTestCase' => 'PhabricatorTestCase', 'PhortuneDAO' => 'PhabricatorLiskDAO', + 'PhortuneDisplayException' => 'Exception', 'PhortuneErrCode' => 'PhortuneConstants', + 'PhortuneExternalController' => 'PhortuneController', + 'PhortuneExternalOrderController' => 'PhortuneExternalController', + 'PhortuneExternalOverviewController' => 'PhortuneExternalController', + 'PhortuneExternalUnsubscribeController' => 'PhortuneExternalController', 'PhortuneLandingController' => 'PhortuneController', + 'PhortuneMemberHasAccountEdgeType' => 'PhabricatorEdgeType', + 'PhortuneMemberHasMerchantEdgeType' => 'PhabricatorEdgeType', + 'PhortuneMerchant' => array( + 'PhortuneDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorPolicyInterface', + ), + 'PhortuneMerchantAddManagerController' => 'PhortuneMerchantController', + 'PhortuneMerchantCapability' => 'PhabricatorPolicyCapability', + 'PhortuneMerchantContactInfoTransaction' => 'PhortuneMerchantTransactionType', + 'PhortuneMerchantController' => 'PhortuneController', + 'PhortuneMerchantDescriptionTransaction' => 'PhortuneMerchantTransactionType', + 'PhortuneMerchantDetailsController' => 'PhortuneMerchantProfileController', + 'PhortuneMerchantEditController' => 'PhortuneController', + 'PhortuneMerchantEditEngine' => 'PhabricatorEditEngine', + 'PhortuneMerchantEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhortuneMerchantHasAccountEdgeType' => 'PhabricatorEdgeType', + 'PhortuneMerchantHasMemberEdgeType' => 'PhabricatorEdgeType', + 'PhortuneMerchantInvoiceCreateController' => 'PhortuneMerchantController', + 'PhortuneMerchantInvoiceEmailTransaction' => 'PhortuneMerchantTransactionType', + 'PhortuneMerchantInvoiceFooterTransaction' => 'PhortuneMerchantTransactionType', + 'PhortuneMerchantListController' => 'PhortuneController', + 'PhortuneMerchantManagersController' => 'PhortuneMerchantProfileController', + 'PhortuneMerchantNameTransaction' => 'PhortuneMerchantTransactionType', + 'PhortuneMerchantOrderListController' => 'PhortuneMerchantProfileController', + 'PhortuneMerchantOrdersController' => 'PhortuneMerchantProfileController', + 'PhortuneMerchantOverviewController' => 'PhortuneMerchantProfileController', + 'PhortuneMerchantPHIDType' => 'PhabricatorPHIDType', + 'PhortuneMerchantPictureController' => 'PhortuneMerchantController', + 'PhortuneMerchantPictureTransaction' => 'PhortuneMerchantTransactionType', + 'PhortuneMerchantProfileController' => 'PhortuneMerchantController', + 'PhortuneMerchantProviderDisableController' => 'PhortuneMerchantController', + 'PhortuneMerchantProviderEditController' => 'PhortuneMerchantController', + 'PhortuneMerchantProviderViewController' => 'PhortuneMerchantController', + 'PhortuneMerchantProvidersController' => 'PhortuneMerchantProfileController', + 'PhortuneMerchantQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhortuneMerchantSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhortuneMerchantSubscriptionListController' => 'PhortuneMerchantProfileController', + 'PhortuneMerchantSubscriptionsController' => 'PhortuneMerchantProfileController', + 'PhortuneMerchantTransaction' => 'PhabricatorModularTransaction', + 'PhortuneMerchantTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhortuneMerchantTransactionType' => 'PhabricatorModularTransactionType', 'PhortuneMonthYearExpiryControl' => 'AphrontFormControl', - 'PhortuneMultiplePaymentProvidersException' => 'Exception', - 'PhortuneNoPaymentProviderException' => 'Exception', - 'PhortuneNotImplementedException' => 'Exception', - 'PhortunePaymentMethod' => - array( - 0 => 'PhortuneDAO', - 1 => 'PhabricatorPolicyInterface', + 'PhortuneOrderDescriptionView' => 'AphrontView', + 'PhortuneOrderItemsView' => 'PhortuneOrderView', + 'PhortuneOrderSummaryView' => 'PhortuneOrderView', + 'PhortuneOrderTableView' => 'AphrontView', + 'PhortuneOrderView' => 'AphrontView', + 'PhortunePayPalPaymentProvider' => 'PhortunePaymentProvider', + 'PhortunePaymentMethod' => array( + 'PhortuneDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + 'PhabricatorPolicyCodexInterface', + 'PhabricatorApplicationTransactionInterface', ), + 'PhortunePaymentMethodCreateController' => 'PhortuneController', + 'PhortunePaymentMethodDisableController' => 'PhortuneController', 'PhortunePaymentMethodEditController' => 'PhortuneController', - 'PhortunePaymentMethodListController' => 'PhabricatorController', + 'PhortunePaymentMethodEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhortunePaymentMethodNameTransaction' => 'PhortunePaymentMethodTransactionType', + 'PhortunePaymentMethodPHIDType' => 'PhabricatorPHIDType', + 'PhortunePaymentMethodPolicyCodex' => 'PhabricatorPolicyCodex', 'PhortunePaymentMethodQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhortunePaymentMethodViewController' => 'PhabricatorController', + 'PhortunePaymentMethodStatusTransaction' => 'PhortunePaymentMethodTransactionType', + 'PhortunePaymentMethodTransaction' => 'PhabricatorModularTransaction', + 'PhortunePaymentMethodTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhortunePaymentMethodTransactionType' => 'PhabricatorModularTransactionType', + 'PhortunePaymentProvider' => 'Phobject', + 'PhortunePaymentProviderConfig' => array( + 'PhortuneDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorApplicationTransactionInterface', + ), + 'PhortunePaymentProviderConfigEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhortunePaymentProviderConfigQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhortunePaymentProviderConfigTransaction' => 'PhabricatorApplicationTransaction', + 'PhortunePaymentProviderConfigTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhortunePaymentProviderPHIDType' => 'PhabricatorPHIDType', 'PhortunePaymentProviderTestCase' => 'PhabricatorTestCase', - 'PhortunePaypalPaymentProvider' => 'PhortunePaymentProvider', - 'PhortuneProduct' => - array( - 0 => 'PhortuneDAO', - 1 => 'PhabricatorPolicyInterface', - ), - 'PhortuneProductEditController' => 'PhabricatorController', - 'PhortuneProductEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhortuneProduct' => array( + 'PhortuneDAO', + 'PhabricatorPolicyInterface', + ), + 'PhortuneProductImplementation' => 'Phobject', 'PhortuneProductListController' => 'PhabricatorController', + 'PhortuneProductPHIDType' => 'PhabricatorPHIDType', 'PhortuneProductQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhortuneProductTransaction' => 'PhabricatorApplicationTransaction', - 'PhortuneProductTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhortuneProductViewController' => 'PhortuneController', - 'PhortuneProviderController' => 'PhortuneController', - 'PhortunePurchase' => 'PhortuneDAO', + 'PhortuneProviderActionController' => 'PhortuneController', + 'PhortunePurchase' => array( + 'PhortuneDAO', + 'PhabricatorPolicyInterface', + ), + 'PhortunePurchasePHIDType' => 'PhabricatorPHIDType', + 'PhortunePurchaseQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhortuneSchemaSpec' => 'PhabricatorConfigSchemaSpec', 'PhortuneStripePaymentProvider' => 'PhortunePaymentProvider', - 'PhortuneTestExtraPaymentProvider' => 'PhortunePaymentProvider', + 'PhortuneSubscription' => array( + 'PhortuneDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorExtendedPolicyInterface', + 'PhabricatorPolicyCodexInterface', + 'PhabricatorApplicationTransactionInterface', + ), + 'PhortuneSubscriptionAutopayTransaction' => 'PhortuneSubscriptionTransactionType', + 'PhortuneSubscriptionCart' => 'PhortuneCartImplementation', + 'PhortuneSubscriptionEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhortuneSubscriptionImplementation' => 'Phobject', + 'PhortuneSubscriptionPHIDType' => 'PhabricatorPHIDType', + 'PhortuneSubscriptionPolicyCodex' => 'PhabricatorPolicyCodex', + 'PhortuneSubscriptionProduct' => 'PhortuneProductImplementation', + 'PhortuneSubscriptionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhortuneSubscriptionSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhortuneSubscriptionTableView' => 'AphrontView', + 'PhortuneSubscriptionTransaction' => 'PhabricatorModularTransaction', + 'PhortuneSubscriptionTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhortuneSubscriptionTransactionType' => 'PhabricatorModularTransactionType', + 'PhortuneSubscriptionWorker' => 'PhabricatorWorker', 'PhortuneTestPaymentProvider' => 'PhortunePaymentProvider', - 'PhortuneWePayPaymentProvider' => 'PhortunePaymentProvider', + 'PhrequentConduitAPIMethod' => 'ConduitAPIMethod', 'PhrequentController' => 'PhabricatorController', + 'PhrequentCurtainExtension' => 'PHUICurtainExtension', 'PhrequentDAO' => 'PhabricatorLiskDAO', 'PhrequentListController' => 'PhrequentController', + 'PhrequentPopConduitAPIMethod' => 'PhrequentConduitAPIMethod', + 'PhrequentPushConduitAPIMethod' => 'PhrequentConduitAPIMethod', + 'PhrequentSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhrequentTimeBlock' => 'Phobject', + 'PhrequentTimeBlockTestCase' => 'PhabricatorTestCase', + 'PhrequentTimeSlices' => 'Phobject', 'PhrequentTrackController' => 'PhrequentController', - 'PhrequentUIEventListener' => 'PhutilEventListener', - 'PhrequentUserTime' => 'PhrequentDAO', - 'PhrequentUserTimeQuery' => 'PhabricatorOffsetPagedQuery', - 'PhrictionActionConstants' => 'PhrictionConstants', - 'PhrictionActionMenuEventListener' => 'PhutilEventListener', + 'PhrequentTrackingConduitAPIMethod' => 'PhrequentConduitAPIMethod', + 'PhrequentTrackingEditor' => 'PhabricatorEditor', + 'PhrequentUIEventListener' => 'PhabricatorEventListener', + 'PhrequentUserTime' => array( + 'PhrequentDAO', + 'PhabricatorPolicyInterface', + ), + 'PhrequentUserTimeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhrictionChangeType' => 'PhrictionConstants', - 'PhrictionContent' => - array( - 0 => 'PhrictionDAO', - 1 => 'PhabricatorMarkupInterface', + 'PhrictionConduitAPIMethod' => 'ConduitAPIMethod', + 'PhrictionConstants' => 'Phobject', + 'PhrictionContent' => array( + 'PhrictionDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorConduitResultInterface', ), + 'PhrictionContentPHIDType' => 'PhabricatorPHIDType', + 'PhrictionContentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhrictionContentSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PhrictionContentSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhrictionContentSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', 'PhrictionController' => 'PhabricatorController', + 'PhrictionCreateConduitAPIMethod' => 'PhrictionConduitAPIMethod', 'PhrictionDAO' => 'PhabricatorLiskDAO', + 'PhrictionDatasourceEngineExtension' => 'PhabricatorDatasourceEngineExtension', 'PhrictionDeleteController' => 'PhrictionController', 'PhrictionDiffController' => 'PhrictionController', - 'PhrictionDocument' => - array( - 0 => 'PhrictionDAO', - 1 => 'PhabricatorPolicyInterface', - 2 => 'PhabricatorSubscribableInterface', - 3 => 'PhabricatorTokenReceiverInterface', + 'PhrictionDocument' => array( + 'PhrictionDAO', + 'PhabricatorPolicyInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', + 'PhabricatorProjectInterface', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorConduitResultInterface', + 'PhabricatorPolicyCodexInterface', + 'PhabricatorSpacesInterface', ), + 'PhrictionDocumentAuthorHeraldField' => 'PhrictionDocumentHeraldField', + 'PhrictionDocumentContentHeraldField' => 'PhrictionDocumentHeraldField', + 'PhrictionDocumentContentTransaction' => 'PhrictionDocumentEditTransaction', 'PhrictionDocumentController' => 'PhrictionController', - 'PhrictionDocumentEditor' => 'PhabricatorEditor', - 'PhrictionDocumentPreviewController' => 'PhrictionController', + 'PhrictionDocumentDatasource' => 'PhabricatorTypeaheadDatasource', + 'PhrictionDocumentDeleteTransaction' => 'PhrictionDocumentVersionTransaction', + 'PhrictionDocumentDraftTransaction' => 'PhrictionDocumentEditTransaction', + 'PhrictionDocumentEditEngine' => 'PhabricatorEditEngine', + 'PhrictionDocumentEditTransaction' => 'PhrictionDocumentVersionTransaction', + 'PhrictionDocumentFerretEngine' => 'PhabricatorFerretEngine', + 'PhrictionDocumentFulltextEngine' => 'PhabricatorFulltextEngine', + 'PhrictionDocumentHeraldAdapter' => 'HeraldAdapter', + 'PhrictionDocumentHeraldField' => 'HeraldField', + 'PhrictionDocumentHeraldFieldGroup' => 'HeraldFieldGroup', + 'PhrictionDocumentMoveAwayTransaction' => 'PhrictionDocumentVersionTransaction', + 'PhrictionDocumentMoveToTransaction' => 'PhrictionDocumentVersionTransaction', + 'PhrictionDocumentPHIDType' => 'PhabricatorPHIDType', + 'PhrictionDocumentPathHeraldField' => 'PhrictionDocumentHeraldField', + 'PhrictionDocumentPolicyCodex' => 'PhabricatorPolicyCodex', + 'PhrictionDocumentPublishTransaction' => 'PhrictionDocumentTransactionType', + 'PhrictionDocumentPublishedHeraldField' => 'PhrictionDocumentHeraldField', 'PhrictionDocumentQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PhrictionDocumentStatus' => 'PhrictionConstants', - 'PhrictionDocumentTestCase' => 'PhabricatorTestCase', + 'PhrictionDocumentSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'PhrictionDocumentSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'PhrictionDocumentStatus' => 'PhabricatorObjectStatus', + 'PhrictionDocumentTitleHeraldField' => 'PhrictionDocumentHeraldField', + 'PhrictionDocumentTitleTransaction' => 'PhrictionDocumentVersionTransaction', + 'PhrictionDocumentTransactionType' => 'PhabricatorModularTransactionType', + 'PhrictionDocumentVersionTransaction' => 'PhrictionDocumentTransactionType', + 'PhrictionEditConduitAPIMethod' => 'PhrictionConduitAPIMethod', 'PhrictionEditController' => 'PhrictionController', + 'PhrictionEditEngineController' => 'PhrictionController', + 'PhrictionHistoryConduitAPIMethod' => 'PhrictionConduitAPIMethod', 'PhrictionHistoryController' => 'PhrictionController', - 'PhrictionListController' => - array( - 0 => 'PhrictionController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), + 'PhrictionInfoConduitAPIMethod' => 'PhrictionConduitAPIMethod', + 'PhrictionListController' => 'PhrictionController', + 'PhrictionMarkupPreviewController' => 'PhabricatorController', 'PhrictionMoveController' => 'PhrictionController', 'PhrictionNewController' => 'PhrictionController', - 'PhrictionPHIDTypeDocument' => 'PhabricatorPHIDType', + 'PhrictionPublishController' => 'PhrictionController', 'PhrictionRemarkupRule' => 'PhutilRemarkupRule', - 'PhrictionSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'PhrictionSearchIndexer' => 'PhabricatorSearchDocumentIndexer', + 'PhrictionReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'PhrictionSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'PhrictionTransaction' => 'PhabricatorModularTransaction', + 'PhrictionTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'PhrictionTransactionEditor' => 'PhabricatorApplicationTransactionEditor', + 'PhrictionTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PhutilAPCKeyValueCache' => 'PhutilKeyValueCache', + 'PhutilAmazonAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilAsanaAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilAuthAdapter' => 'Phobject', + 'PhutilAuthConfigurationException' => 'PhutilAuthException', + 'PhutilAuthCredentialException' => 'PhutilAuthException', + 'PhutilAuthException' => 'Exception', + 'PhutilAuthUserAbortedException' => 'PhutilAuthException', + 'PhutilBitbucketAuthAdapter' => 'PhutilOAuth1AuthAdapter', + 'PhutilCLikeCodeSnippetContextFreeGrammar' => 'PhutilCodeSnippetContextFreeGrammar', + 'PhutilCalendarAbsoluteDateTime' => 'PhutilCalendarDateTime', + 'PhutilCalendarContainerNode' => 'PhutilCalendarNode', + 'PhutilCalendarDateTime' => 'Phobject', + 'PhutilCalendarDateTimeTestCase' => 'PhutilTestCase', + 'PhutilCalendarDocumentNode' => 'PhutilCalendarContainerNode', + 'PhutilCalendarDuration' => 'Phobject', + 'PhutilCalendarEventNode' => 'PhutilCalendarContainerNode', + 'PhutilCalendarNode' => 'Phobject', + 'PhutilCalendarProxyDateTime' => 'PhutilCalendarDateTime', + 'PhutilCalendarRawNode' => 'PhutilCalendarContainerNode', + 'PhutilCalendarRecurrenceList' => 'PhutilCalendarRecurrenceSource', + 'PhutilCalendarRecurrenceRule' => 'PhutilCalendarRecurrenceSource', + 'PhutilCalendarRecurrenceRuleTestCase' => 'PhutilTestCase', + 'PhutilCalendarRecurrenceSet' => 'Phobject', + 'PhutilCalendarRecurrenceSource' => 'Phobject', + 'PhutilCalendarRecurrenceTestCase' => 'PhutilTestCase', + 'PhutilCalendarRelativeDateTime' => 'PhutilCalendarProxyDateTime', + 'PhutilCalendarRootNode' => 'PhutilCalendarContainerNode', + 'PhutilCalendarUserNode' => 'PhutilCalendarNode', + 'PhutilCodeSnippetContextFreeGrammar' => 'PhutilContextFreeGrammar', + 'PhutilConsoleSyntaxHighlighter' => 'Phobject', + 'PhutilContextFreeGrammar' => 'Phobject', + 'PhutilDaemon' => 'Phobject', + 'PhutilDaemonHandle' => 'Phobject', + 'PhutilDaemonOverseer' => 'Phobject', + 'PhutilDaemonOverseerModule' => 'Phobject', + 'PhutilDaemonPool' => 'Phobject', + 'PhutilDefaultSyntaxHighlighter' => 'Phobject', + 'PhutilDefaultSyntaxHighlighterEngine' => 'PhutilSyntaxHighlighterEngine', + 'PhutilDefaultSyntaxHighlighterEnginePygmentsFuture' => 'FutureProxy', + 'PhutilDefaultSyntaxHighlighterEngineTestCase' => 'PhutilTestCase', + 'PhutilDirectoryKeyValueCache' => 'PhutilKeyValueCache', + 'PhutilDisqusAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilDivinerSyntaxHighlighter' => 'Phobject', + 'PhutilEmptyAuthAdapter' => 'PhutilAuthAdapter', + 'PhutilFacebookAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilGitHubAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilGoogleAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilICSParser' => 'Phobject', + 'PhutilICSParserException' => 'Exception', + 'PhutilICSParserTestCase' => 'PhutilTestCase', + 'PhutilICSWriter' => 'Phobject', + 'PhutilICSWriterTestCase' => 'PhutilTestCase', + 'PhutilInRequestKeyValueCache' => 'PhutilKeyValueCache', + 'PhutilInvisibleSyntaxHighlighter' => 'Phobject', + 'PhutilJIRAAuthAdapter' => 'PhutilOAuth1AuthAdapter', + 'PhutilJSONFragmentLexerHighlighterTestCase' => 'PhutilTestCase', + 'PhutilJavaCodeSnippetContextFreeGrammar' => 'PhutilCLikeCodeSnippetContextFreeGrammar', + 'PhutilKeyValueCache' => 'Phobject', + 'PhutilKeyValueCacheNamespace' => 'PhutilKeyValueCacheProxy', + 'PhutilKeyValueCacheProfiler' => 'PhutilKeyValueCacheProxy', + 'PhutilKeyValueCacheProxy' => 'PhutilKeyValueCache', + 'PhutilKeyValueCacheStack' => 'PhutilKeyValueCache', + 'PhutilKeyValueCacheTestCase' => 'PhutilTestCase', + 'PhutilLDAPAuthAdapter' => 'PhutilAuthAdapter', + 'PhutilLexerSyntaxHighlighter' => 'PhutilSyntaxHighlighter', + 'PhutilLipsumContextFreeGrammar' => 'PhutilContextFreeGrammar', + 'PhutilMarkupEngine' => 'Phobject', + 'PhutilMarkupTestCase' => 'PhutilTestCase', + 'PhutilMemcacheKeyValueCache' => 'PhutilKeyValueCache', + 'PhutilOAuth1AuthAdapter' => 'PhutilAuthAdapter', + 'PhutilOAuthAuthAdapter' => 'PhutilAuthAdapter', + 'PhutilOnDiskKeyValueCache' => 'PhutilKeyValueCache', + 'PhutilPHPCodeSnippetContextFreeGrammar' => 'PhutilCLikeCodeSnippetContextFreeGrammar', + 'PhutilPHPFragmentLexerHighlighterTestCase' => 'PhutilTestCase', + 'PhutilPhabricatorAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilProseDiff' => 'Phobject', + 'PhutilProseDiffTestCase' => 'PhabricatorTestCase', + 'PhutilProseDifferenceEngine' => 'Phobject', + 'PhutilPygmentizeParser' => 'Phobject', + 'PhutilPygmentizeParserTestCase' => 'PhutilTestCase', + 'PhutilPygmentsSyntaxHighlighter' => 'Phobject', + 'PhutilQueryString' => 'Phobject', + 'PhutilRainbowSyntaxHighlighter' => 'Phobject', + 'PhutilRealNameContextFreeGrammar' => 'PhutilContextFreeGrammar', + 'PhutilRemarkupAnchorRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupBlockInterpreter' => 'Phobject', + 'PhutilRemarkupBlockRule' => 'Phobject', + 'PhutilRemarkupBlockStorage' => 'Phobject', + 'PhutilRemarkupBoldRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupCodeBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupDefaultBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupDelRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupDocumentLinkRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupEngine' => 'PhutilMarkupEngine', + 'PhutilRemarkupEngineTestCase' => 'PhutilTestCase', + 'PhutilRemarkupEscapeRemarkupRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupEvalRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupHeaderBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupHighlightRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupHorizontalRuleBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupHyperlinkEngineExtension' => 'Phobject', + 'PhutilRemarkupHyperlinkRef' => 'Phobject', + 'PhutilRemarkupHyperlinkRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupInlineBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupInterpreterBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupItalicRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupLinebreaksRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupListBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupLiteralBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupMonospaceRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupNoteBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupQuotedBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupQuotesBlockRule' => 'PhutilRemarkupQuotedBlockRule', + 'PhutilRemarkupReplyBlockRule' => 'PhutilRemarkupQuotedBlockRule', + 'PhutilRemarkupRule' => 'Phobject', + 'PhutilRemarkupSimpleTableBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupTableBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupTestInterpreterRule' => 'PhutilRemarkupBlockInterpreter', + 'PhutilRemarkupUnderlineRule' => 'PhutilRemarkupRule', + 'PhutilSafeHTML' => 'Phobject', + 'PhutilSafeHTMLTestCase' => 'PhutilTestCase', + 'PhutilSearchQueryCompiler' => 'Phobject', + 'PhutilSearchQueryCompilerSyntaxException' => 'Exception', + 'PhutilSearchQueryCompilerTestCase' => 'PhutilTestCase', + 'PhutilSearchQueryToken' => 'Phobject', + 'PhutilSearchStemmer' => 'Phobject', + 'PhutilSearchStemmerTestCase' => 'PhutilTestCase', + 'PhutilSlackAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilSprite' => 'Phobject', + 'PhutilSpriteSheet' => 'Phobject', + 'PhutilSyntaxHighlighter' => 'Phobject', + 'PhutilSyntaxHighlighterEngine' => 'Phobject', + 'PhutilSyntaxHighlighterException' => 'Exception', + 'PhutilTranslatedHTMLTestCase' => 'PhutilTestCase', + 'PhutilTwitchAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilTwitterAuthAdapter' => 'PhutilOAuth1AuthAdapter', + 'PhutilWordPressAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilXHPASTSyntaxHighlighter' => 'Phobject', + 'PhutilXHPASTSyntaxHighlighterFuture' => 'FutureProxy', + 'PhutilXHPASTSyntaxHighlighterTestCase' => 'PhutilTestCase', + 'PolicyLockOptionType' => 'PhabricatorConfigJSONOptionType', 'PonderAddAnswerView' => 'AphrontView', - 'PonderAnswer' => - array( - 0 => 'PonderDAO', - 1 => 'PhabricatorMarkupInterface', - 2 => 'PonderVotableInterface', - 3 => 'PhabricatorPolicyInterface', - 4 => 'PhabricatorSubscribableInterface', - 5 => 'PhabricatorTokenReceiverInterface', + 'PonderAnswer' => array( + 'PonderDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorMarkupInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorDestructibleInterface', ), 'PonderAnswerCommentController' => 'PonderController', + 'PonderAnswerContentTransaction' => 'PonderAnswerTransactionType', 'PonderAnswerEditController' => 'PonderController', - 'PonderAnswerEditor' => 'PhabricatorApplicationTransactionEditor', + 'PonderAnswerEditor' => 'PonderEditor', 'PonderAnswerHistoryController' => 'PonderController', + 'PonderAnswerMailReceiver' => 'PhabricatorObjectMailReceiver', + 'PonderAnswerPHIDType' => 'PhabricatorPHIDType', 'PonderAnswerQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PonderAnswerQuestionIDTransaction' => 'PonderAnswerTransactionType', + 'PonderAnswerReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 'PonderAnswerSaveController' => 'PonderController', - 'PonderAnswerTransaction' => 'PhabricatorApplicationTransaction', + 'PonderAnswerStatus' => 'PonderConstants', + 'PonderAnswerStatusTransaction' => 'PonderAnswerTransactionType', + 'PonderAnswerTransaction' => 'PhabricatorModularTransaction', 'PonderAnswerTransactionComment' => 'PhabricatorApplicationTransactionComment', 'PonderAnswerTransactionQuery' => 'PhabricatorApplicationTransactionQuery', - 'PonderAnswerViewController' => 'PonderController', - 'PonderComment' => - array( - 0 => 'PonderDAO', - 1 => 'PhabricatorMarkupInterface', - ), - 'PonderCommentQuery' => 'PhabricatorQuery', + 'PonderAnswerTransactionType' => 'PhabricatorModularTransactionType', + 'PonderAnswerView' => 'AphrontTagView', + 'PonderConstants' => 'Phobject', 'PonderController' => 'PhabricatorController', 'PonderDAO' => 'PhabricatorLiskDAO', - 'PonderPHIDTypeAnswer' => 'PhabricatorPHIDType', - 'PonderPHIDTypeQuestion' => 'PhabricatorPHIDType', - 'PonderQuestion' => - array( - 0 => 'PonderDAO', - 1 => 'PhabricatorMarkupInterface', - 2 => 'PonderVotableInterface', - 3 => 'PhabricatorSubscribableInterface', - 4 => 'PhabricatorPolicyInterface', - 5 => 'PhabricatorTokenReceiverInterface', + 'PonderDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'PonderEditor' => 'PhabricatorApplicationTransactionEditor', + 'PonderFooterView' => 'AphrontTagView', + 'PonderModerateCapability' => 'PhabricatorPolicyCapability', + 'PonderQuestion' => array( + 'PonderDAO', + 'PhabricatorApplicationTransactionInterface', + 'PhabricatorMarkupInterface', + 'PhabricatorSubscribableInterface', + 'PhabricatorFlaggableInterface', + 'PhabricatorPolicyInterface', + 'PhabricatorTokenReceiverInterface', + 'PhabricatorProjectInterface', + 'PhabricatorDestructibleInterface', + 'PhabricatorSpacesInterface', + 'PhabricatorFulltextInterface', + 'PhabricatorFerretInterface', ), + 'PonderQuestionAnswerTransaction' => 'PonderQuestionTransactionType', + 'PonderQuestionAnswerWikiTransaction' => 'PonderQuestionTransactionType', 'PonderQuestionCommentController' => 'PonderController', + 'PonderQuestionContentTransaction' => 'PonderQuestionTransactionType', + 'PonderQuestionCreateMailReceiver' => 'PhabricatorApplicationMailReceiver', 'PonderQuestionEditController' => 'PonderController', - 'PonderQuestionEditor' => 'PhabricatorApplicationTransactionEditor', + 'PonderQuestionEditEngine' => 'PhabricatorEditEngine', + 'PonderQuestionEditor' => 'PonderEditor', + 'PonderQuestionFerretEngine' => 'PhabricatorFerretEngine', + 'PonderQuestionFulltextEngine' => 'PhabricatorFulltextEngine', 'PonderQuestionHistoryController' => 'PonderController', - 'PonderQuestionListController' => - array( - 0 => 'PonderController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), + 'PonderQuestionListController' => 'PonderController', 'PonderQuestionMailReceiver' => 'PhabricatorObjectMailReceiver', + 'PonderQuestionPHIDType' => 'PhabricatorPHIDType', 'PonderQuestionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'PonderQuestionReplyHandler' => 'PhabricatorMailReplyHandler', + 'PonderQuestionReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 'PonderQuestionSearchEngine' => 'PhabricatorApplicationSearchEngine', 'PonderQuestionStatus' => 'PonderConstants', 'PonderQuestionStatusController' => 'PonderController', - 'PonderQuestionTransaction' => 'PhabricatorApplicationTransaction', + 'PonderQuestionStatusTransaction' => 'PonderQuestionTransactionType', + 'PonderQuestionTitleTransaction' => 'PonderQuestionTransactionType', + 'PonderQuestionTransaction' => 'PhabricatorModularTransaction', 'PonderQuestionTransactionComment' => 'PhabricatorApplicationTransactionComment', 'PonderQuestionTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'PonderQuestionTransactionType' => 'PhabricatorModularTransactionType', 'PonderQuestionViewController' => 'PonderController', - 'PonderRemarkupRule' => 'PhabricatorRemarkupRuleObject', - 'PonderSearchIndexer' => 'PhabricatorSearchDocumentIndexer', - 'PonderVotableView' => 'AphrontView', - 'PonderVote' => 'PonderConstants', - 'PonderVoteEditor' => 'PhabricatorEditor', - 'PonderVoteSaveController' => 'PonderController', - 'ProjectRemarkupRule' => 'PhabricatorRemarkupRuleObject', + 'PonderRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'PonderSchemaSpec' => 'PhabricatorConfigSchemaSpec', + 'ProjectAddProjectsEmailCommand' => 'MetaMTAEmailTransactionCommand', + 'ProjectBoardTaskCard' => 'Phobject', + 'ProjectCanLockProjectsCapability' => 'PhabricatorPolicyCapability', + 'ProjectColumnSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'ProjectConduitAPIMethod' => 'ConduitAPIMethod', + 'ProjectCreateConduitAPIMethod' => 'ProjectConduitAPIMethod', + 'ProjectCreateProjectsCapability' => 'PhabricatorPolicyCapability', + 'ProjectDatasourceEngineExtension' => 'PhabricatorDatasourceEngineExtension', + 'ProjectDefaultEditCapability' => 'PhabricatorPolicyCapability', + 'ProjectDefaultJoinCapability' => 'PhabricatorPolicyCapability', + 'ProjectDefaultViewCapability' => 'PhabricatorPolicyCapability', + 'ProjectEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'ProjectQueryConduitAPIMethod' => 'ProjectConduitAPIMethod', + 'ProjectRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'ProjectRemarkupRuleTestCase' => 'PhabricatorTestCase', + 'ProjectReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', + 'ProjectSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 'QueryFormattingTestCase' => 'PhabricatorTestCase', - 'ReleephAuthorFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephBranch' => - array( - 0 => 'ReleephDAO', - 1 => 'PhabricatorPolicyInterface', - ), - 'ReleephBranchAccessController' => 'ReleephProjectController', - 'ReleephBranchBoxView' => 'AphrontView', - 'ReleephBranchCommitFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephBranchCreateController' => 'ReleephProjectController', - 'ReleephBranchEditController' => 'ReleephProjectController', - 'ReleephBranchEditor' => 'PhabricatorEditor', - 'ReleephBranchNamePreviewController' => 'ReleephController', - 'ReleephBranchPreviewView' => 'AphrontFormControl', - 'ReleephBranchQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'ReleephBranchViewController' => 'ReleephProjectController', - 'ReleephCommitFinderException' => 'Exception', - 'ReleephCommitMessageFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephController' => 'PhabricatorController', - 'ReleephDAO' => 'PhabricatorLiskDAO', - 'ReleephDefaultFieldSelector' => 'ReleephFieldSelector', - 'ReleephDefaultUserView' => 'ReleephUserView', - 'ReleephDiffChurnFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephDiffMessageFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephDiffSizeFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephEvent' => 'ReleephDAO', - 'ReleephFieldParseException' => 'Exception', - 'ReleephFieldSpecification' => 'PhabricatorMarkupInterface', - 'ReleephFieldSpecificationIncompleteException' => 'Exception', - 'ReleephIntentFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephLevelFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephOriginalCommitFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephPHIDTypeBranch' => 'PhabricatorPHIDType', - 'ReleephPHIDTypeProject' => 'PhabricatorPHIDType', - 'ReleephPHIDTypeRequest' => 'PhabricatorPHIDType', - 'ReleephProject' => - array( - 0 => 'ReleephDAO', - 1 => 'PhabricatorPolicyInterface', - ), - 'ReleephProjectActionController' => 'ReleephProjectController', - 'ReleephProjectController' => 'ReleephController', - 'ReleephProjectCreateController' => 'ReleephProjectController', - 'ReleephProjectEditController' => 'ReleephProjectController', - 'ReleephProjectListController' => - array( - 0 => 'ReleephController', - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', - ), - 'ReleephProjectQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'ReleephProjectSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'ReleephProjectView' => 'AphrontView', - 'ReleephProjectViewController' => 'ReleephProjectController', - 'ReleephReasonFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephRequest' => - array( - 0 => 'ReleephDAO', - 1 => 'PhabricatorPolicyInterface', - ), - 'ReleephRequestActionController' => 'ReleephProjectController', - 'ReleephRequestCommentController' => 'ReleephProjectController', - 'ReleephRequestDifferentialCreateController' => 'ReleephProjectController', - 'ReleephRequestEditController' => 'ReleephProjectController', - 'ReleephRequestEvent' => 'ReleephDAO', - 'ReleephRequestException' => 'Exception', - 'ReleephRequestHeaderListView' => 'AphrontView', - 'ReleephRequestHeaderView' => 'AphrontView', - 'ReleephRequestIntentsView' => 'AphrontView', - 'ReleephRequestMailReceiver' => 'PhabricatorObjectMailReceiver', - 'ReleephRequestQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', - 'ReleephRequestReplyHandler' => 'PhabricatorMailReplyHandler', - 'ReleephRequestStatusView' => 'AphrontView', - 'ReleephRequestTransaction' => 'PhabricatorApplicationTransaction', - 'ReleephRequestTransactionComment' => 'PhabricatorApplicationTransactionComment', - 'ReleephRequestTransactionQuery' => 'PhabricatorApplicationTransactionQuery', - 'ReleephRequestTransactionalEditor' => 'PhabricatorApplicationTransactionEditor', - 'ReleephRequestTypeaheadControl' => 'AphrontFormControl', - 'ReleephRequestTypeaheadController' => 'PhabricatorTypeaheadDatasourceController', - 'ReleephRequestViewController' => 'ReleephProjectController', - 'ReleephRequestorFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephRevisionFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephRiskFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephSeverityFieldSpecification' => 'ReleephLevelFieldSpecification', - 'ReleephStatusFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephSummaryFieldSpecification' => 'ReleephFieldSpecification', - 'ReleephUserView' => 'AphrontView', + 'QueryFuture' => 'Future', + 'RemarkupProcessConduitAPIMethod' => 'ConduitAPIMethod', + 'RemarkupValue' => 'Phobject', + 'RepositoryConduitAPIMethod' => 'ConduitAPIMethod', + 'RepositoryQueryConduitAPIMethod' => 'RepositoryConduitAPIMethod', + 'ShellLogView' => 'AphrontView', + 'SlowvoteConduitAPIMethod' => 'ConduitAPIMethod', 'SlowvoteEmbedView' => 'AphrontView', - 'SlowvoteRemarkupRule' => 'PhabricatorRemarkupRuleObject', + 'SlowvoteInfoConduitAPIMethod' => 'SlowvoteConduitAPIMethod', + 'SlowvotePollResponseVisibility' => 'Phobject', + 'SlowvotePollStatus' => 'Phobject', + 'SlowvotePollVotingMethod' => 'Phobject', + 'SlowvoteRemarkupRule' => 'PhabricatorObjectRemarkupRule', + 'SlowvoteSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'SubscriptionListDialogBuilder' => 'Phobject', + 'SubscriptionListStringBuilder' => 'Phobject', + 'TokenConduitAPIMethod' => 'ConduitAPIMethod', + 'TokenGiveConduitAPIMethod' => 'TokenConduitAPIMethod', + 'TokenGivenConduitAPIMethod' => 'TokenConduitAPIMethod', + 'TokenQueryConduitAPIMethod' => 'TokenConduitAPIMethod', + 'TransactionSearchConduitAPIMethod' => 'ConduitAPIMethod', + 'UserConduitAPIMethod' => 'ConduitAPIMethod', + 'UserDisableConduitAPIMethod' => 'UserConduitAPIMethod', + 'UserEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', + 'UserEnableConduitAPIMethod' => 'UserConduitAPIMethod', + 'UserFindConduitAPIMethod' => 'UserConduitAPIMethod', + 'UserQueryConduitAPIMethod' => 'UserConduitAPIMethod', + 'UserSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', + 'UserWhoAmIConduitAPIMethod' => 'UserConduitAPIMethod', ), )); diff --git a/src/__tests__/PhabricatorCelerityTestCase.php b/src/__tests__/PhabricatorCelerityTestCase.php new file mode 100644 index 0000000000..a91b214502 --- /dev/null +++ b/src/__tests__/PhabricatorCelerityTestCase.php @@ -0,0 +1,36 @@ +generate(); + + // Don't actually compare these values with assertEqual(), since the diff + // isn't helpful and is often enormously huge. + + $maps_are_identical = + ($new_map->getNameMap() === $old_map->getNameMap()) && + ($new_map->getSymbolMap() === $old_map->getSymbolMap()) && + ($new_map->getRequiresMap() === $old_map->getRequiresMap()) && + ($new_map->getPackageMap() === $old_map->getPackageMap()); + + $this->assertTrue( + $maps_are_identical, + pht( + 'When this test fails, it means the Celerity resource map is out '. + 'of date. Run `%s` to rebuild it.', + 'bin/celerity map')); + } + } + +} diff --git a/src/__tests__/PhabricatorConduitTestCase.php b/src/__tests__/PhabricatorConduitTestCase.php new file mode 100644 index 0000000000..3a9c6911bc --- /dev/null +++ b/src/__tests__/PhabricatorConduitTestCase.php @@ -0,0 +1,19 @@ +setAncestorClass('ConduitAPIMethod') + ->execute(); + + // We're just looking for a side effect of ConduitCall construction + // here: it will throw if any methods define reserved parameter names. + + foreach ($methods as $method) { + new ConduitCall($method->getAPIMethodName(), array()); + } + + $this->assertTrue(true); + } +} diff --git a/src/__tests__/PhabricatorInfrastructureTestCase.php b/src/__tests__/PhabricatorInfrastructureTestCase.php new file mode 100644 index 0000000000..19d034eb34 --- /dev/null +++ b/src/__tests__/PhabricatorInfrastructureTestCase.php @@ -0,0 +1,42 @@ + true, + ); + } + + public function testApplicationsInstalled() { + $all = PhabricatorApplication::getAllApplications(); + $installed = PhabricatorApplication::getAllInstalledApplications(); + + $this->assertEqual( + count($all), + count($installed), + pht('In test cases, all applications should default to installed.')); + } + + public function testRejectMySQLNonUTF8Queries() { + $table = new HarbormasterScratchTable(); + $conn_r = $table->establishConnection('w'); + + $snowman = "\xE2\x98\x83"; + $invalid = "\xE6\x9D"; + + qsprintf($conn_r, 'SELECT %B', $snowman); + qsprintf($conn_r, 'SELECT %s', $snowman); + qsprintf($conn_r, 'SELECT %B', $invalid); + + $caught = null; + try { + qsprintf($conn_r, 'SELECT %s', $invalid); + } catch (AphrontCharacterSetQueryException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof AphrontCharacterSetQueryException); + } + +} diff --git a/src/__tests__/PhabricatorLibraryTestCase.php b/src/__tests__/PhabricatorLibraryTestCase.php new file mode 100644 index 0000000000..61ffdb00a5 --- /dev/null +++ b/src/__tests__/PhabricatorLibraryTestCase.php @@ -0,0 +1,3 @@ +delegatingController = $delegating_controller; @@ -28,29 +24,51 @@ public function willProcessRequest(array $uri_data) { return; } - public function didProcessRequest($response) { - return $response; + public function handleRequest(AphrontRequest $request) { + if (method_exists($this, 'processRequest')) { + return $this->processRequest(); + } + + throw new PhutilMethodNotImplementedException( + pht( + 'Controllers must implement either %s (recommended) '. + 'or %s (deprecated).', + 'handleRequest()', + 'processRequest()')); } - abstract public function processRequest(); + public function willSendResponse(AphrontResponse $response) { + return $response; + } - final public function __construct(AphrontRequest $request) { + final public function setRequest(AphrontRequest $request) { $this->request = $request; + return $this; } final public function getRequest() { + if (!$this->request) { + throw new PhutilInvalidStateException('setRequest'); + } return $this->request; } + final public function getViewer() { + return $this->getRequest()->getViewer(); + } + final public function delegateToController(AphrontController $controller) { + $request = $this->getRequest(); + $controller->setDelegatingController($this); + $controller->setRequest($request); $application = $this->getCurrentApplication(); if ($application) { $controller->setCurrentApplication($application); } - return $controller->processRequest(); + return $controller->handleRequest($request); } final public function setCurrentApplication( @@ -64,4 +82,26 @@ final public function getCurrentApplication() { return $this->currentApplication; } + public function getDefaultResourceSource() { + throw new PhutilMethodNotImplementedException( + pht( + 'A Controller must implement %s before you can invoke %s or %s.', + 'getDefaultResourceSource()', + 'requireResource()', + 'initBehavior()')); + } + + public function requireResource($symbol) { + $response = CelerityAPI::getStaticResourceResponse(); + $response->requireResource($symbol, $this->getDefaultResourceSource()); + return $this; + } + + public function initBehavior($name, $config = array()) { + Javelin::initBehavior( + $name, + $config, + $this->getDefaultResourceSource()); + } + } diff --git a/src/aphront/AphrontRequest.php b/src/aphront/AphrontRequest.php index 6f3b127d66..56d9e85cc5 100644 --- a/src/aphront/AphrontRequest.php +++ b/src/aphront/AphrontRequest.php @@ -1,12 +1,11 @@ host = $host; $this->path = $path; } - final public function setApplicationConfiguration( + public function setURIMap(array $uri_data) { + $this->uriData = $uri_data; + return $this; + } + + public function getURIMap() { + return $this->uriData; + } + + public function getURIData($key, $default = null) { + return idx($this->uriData, $key, $default); + } + + /** + * Read line range parameter data from the request. + * + * Applications like Paste, Diffusion, and Harbormaster use "$12-14" in the + * URI to allow users to link to particular lines. + * + * @param string URI data key to pull line range information from. + * @param int|null Maximum length of the range. + * @return null|pair Null, or beginning and end of the range. + */ + public function getURILineRange($key, $limit) { + $range = $this->getURIData($key); + return self::parseURILineRange($range, $limit); + } + + public static function parseURILineRange($range, $limit) { + if ($range === null || !strlen($range)) { + return null; + } + + $range = explode('-', $range, 2); + + foreach ($range as $key => $value) { + $value = (int)$value; + if (!$value) { + // If either value is "0", discard the range. + return null; + } + $range[$key] = $value; + } + + // If the range is like "$10", treat it like "$10-10". + if (count($range) == 1) { + $range[] = head($range); + } + + // If the range is "$7-5", treat it like "$5-7". + if ($range[1] < $range[0]) { + $range = array_reverse($range); + } + + // If the user specified something like "$1-999999999" and we have a limit, + // clamp it to a more reasonable range. + if ($limit !== null) { + if ($range[1] - $range[0] > $limit) { + $range[1] = $range[0] + $limit; + } + } + + return $range; + } + + public function setApplicationConfiguration( $application_configuration) { $this->applicationConfiguration = $application_configuration; return $this; } - final public function getApplicationConfiguration() { + public function getApplicationConfiguration() { return $this->applicationConfiguration; } - final public function setPath($path) { + public function setPath($path) { $this->path = $path; return $this; } - final public function getPath() { + public function getPath() { return $this->path; } - final public function getHost() { + public function getHost() { // The "Host" header may include a port number, or may be a malicious // header in the form "realdomain.com:ignored@evil.com". Invoke the full // parser to extract the real domain correctly. See here for coverage of @@ -61,6 +132,24 @@ final public function getHost() { return $uri->getDomain(); } + public function setSite(AphrontSite $site) { + $this->site = $site; + return $this; + } + + public function getSite() { + return $this->site; + } + + public function setController(AphrontController $controller) { + $this->controller = $controller; + return $this; + } + + public function getController() { + return $this->controller; + } + /* -( Accessing Request Data )--------------------------------------------- */ @@ -68,7 +157,7 @@ final public function getHost() { /** * @task data */ - final public function setRequestData(array $request_data) { + public function setRequestData(array $request_data) { $this->requestData = $request_data; return $this; } @@ -77,7 +166,7 @@ final public function setRequestData(array $request_data) { /** * @task data */ - final public function getRequestData() { + public function getRequestData() { return $this->requestData; } @@ -85,8 +174,13 @@ final public function getRequestData() { /** * @task data */ - final public function getInt($name, $default = null) { + public function getInt($name, $default = null) { if (isset($this->requestData[$name])) { + // Converting from array to int is "undefined". Don't rely on whatever + // PHP decides to do. + if (is_array($this->requestData[$name])) { + return $default; + } return (int)$this->requestData[$name]; } else { return $default; @@ -97,7 +191,7 @@ final public function getInt($name, $default = null) { /** * @task data */ - final public function getBool($name, $default = null) { + public function getBool($name, $default = null) { if (isset($this->requestData[$name])) { if ($this->requestData[$name] === 'true') { return true; @@ -115,7 +209,7 @@ final public function getBool($name, $default = null) { /** * @task data */ - final public function getStr($name, $default = null) { + public function getStr($name, $default = null) { if (isset($this->requestData[$name])) { $str = (string)$this->requestData[$name]; // Normalize newline craziness. @@ -133,7 +227,44 @@ final public function getStr($name, $default = null) { /** * @task data */ - final public function getArr($name, $default = array()) { + public function getJSONMap($name, $default = array()) { + if (!isset($this->requestData[$name])) { + return $default; + } + + $raw_data = phutil_string_cast($this->requestData[$name]); + $raw_data = trim($raw_data); + if (!strlen($raw_data)) { + return $default; + } + + if ($raw_data[0] !== '{') { + throw new Exception( + pht( + 'Request parameter "%s" is not formatted properly. Expected a '. + 'JSON object, but value does not start with "{".', + $name)); + } + + try { + $json_object = phutil_json_decode($raw_data); + } catch (PhutilJSONParserException $ex) { + throw new Exception( + pht( + 'Request parameter "%s" is not formatted properly. Expected a '. + 'JSON object, but encountered a syntax error: %s.', + $name, + $ex->getMessage())); + } + + return $json_object; + } + + + /** + * @task data + */ + public function getArr($name, $default = array()) { if (isset($this->requestData[$name]) && is_array($this->requestData[$name])) { return $this->requestData[$name]; @@ -146,7 +277,7 @@ final public function getArr($name, $default = array()) { /** * @task data */ - final public function getStrList($name, $default = array()) { + public function getStrList($name, $default = array()) { if (!isset($this->requestData[$name])) { return $default; } @@ -159,28 +290,36 @@ final public function getStrList($name, $default = array()) { /** * @task data */ - final public function getExists($name) { + public function getExists($name) { return array_key_exists($name, $this->requestData); } - final public function getFileExists($name) { + public function getFileExists($name) { return isset($_FILES[$name]) && (idx($_FILES[$name], 'error') !== UPLOAD_ERR_NO_FILE); } - final public function isHTTPPost() { + public function isHTTPGet() { + return ($_SERVER['REQUEST_METHOD'] == 'GET'); + } + + public function isHTTPPost() { return ($_SERVER['REQUEST_METHOD'] == 'POST'); } - final public function isAjax() { - return $this->getExists(self::TYPE_AJAX); + public function isAjax() { + return $this->getExists(self::TYPE_AJAX) && !$this->isQuicksand(); } - final public function isJavelinWorkflow() { - return $this->getExists(self::TYPE_WORKFLOW); + public function isWorkflow() { + return $this->getExists(self::TYPE_WORKFLOW) && !$this->isQuicksand(); } - final public function isConduit() { + public function isQuicksand() { + return $this->getExists(self::TYPE_QUICKSAND); + } + + public function isConduit() { return $this->getExists(self::TYPE_CONDUIT); } @@ -192,7 +331,11 @@ public static function getCSRFHeaderName() { return 'X-Phabricator-Csrf'; } - final public function validateCSRF() { + public static function getViaHeaderName() { + return 'X-Phabricator-Via'; + } + + public function validateCSRF() { $token_name = self::getCSRFTokenName(); $token = $this->getStr($token_name); @@ -208,58 +351,67 @@ final public function validateCSRF() { // Add some diagnostic details so we can figure out if some CSRF issues // are JS problems or people accessing Ajax URIs directly with their // browsers. - if ($token) { - $token_info = "with an invalid CSRF token"; + $info = array(); + + $info[] = pht( + 'You are trying to save some data to permanent storage, but the '. + 'request your browser made included an incorrect token. Reload the '. + 'page and try again. You may need to clear your cookies.'); + + if ($this->isAjax()) { + $info[] = pht('This was an Ajax request.'); } else { - $token_info = "without a CSRF token"; + $info[] = pht('This was a Web request.'); } - if ($this->isAjax()) { - $more_info = "(This was an Ajax request, {$token_info}.)"; + if ($token) { + $info[] = pht('This request had an invalid CSRF token.'); } else { - $more_info = "(This was a web request, {$token_info}.)"; + $info[] = pht('This request had no CSRF token.'); } // Give a more detailed explanation of how to avoid the exception // in developer mode. if (PhabricatorEnv::getEnvConfig('phabricator.developer-mode')) { - $more_info = $more_info . - "To avoid this error, use phabricator_form() to construct forms. " . - "If you are already using phabricator_form(), make sure the form " . - "'action' uses a relative URI (i.e., begins with a '/'). Forms " . - "using absolute URIs do not include CSRF tokens, to prevent " . - "leaking tokens to external sites.\n\n" . - "If this page performs writes which do not require CSRF " . - "protection (usually, filling caches or logging), you can use " . - "AphrontWriteGuard::beginScopedUnguardedWrites() to temporarily " . - "bypass CSRF protection while writing. You should use this only " . - "for writes which can not be protected with normal CSRF " . - "mechanisms.\n\n" . - "Some UI elements (like PhabricatorActionListView) also have " . - "methods which will allow you to render links as forms (like " . - "setRenderAsForm(true))."; + // TODO: Clean this up, see T1921. + $info[] = pht( + "To avoid this error, use %s to construct forms. If you are already ". + "using %s, make sure the form 'action' uses a relative URI (i.e., ". + "begins with a '%s'). Forms using absolute URIs do not include CSRF ". + "tokens, to prevent leaking tokens to external sites.\n\n". + "If this page performs writes which do not require CSRF protection ". + "(usually, filling caches or logging), you can use %s to ". + "temporarily bypass CSRF protection while writing. You should use ". + "this only for writes which can not be protected with normal CSRF ". + "mechanisms.\n\n". + "Some UI elements (like %s) also have methods which will allow you ". + "to render links as forms (like %s).", + 'phabricator_form()', + 'phabricator_form()', + '/', + 'AphrontWriteGuard::beginScopedUnguardedWrites()', + 'PhabricatorActionListView', + 'setRenderAsForm(true)'); } + $message = implode("\n", $info); + // This should only be able to happen if you load a form, pull your // internet for 6 hours, and then reconnect and immediately submit, // but give the user some indication of what happened since the workflow // is incredibly confusing otherwise. - throw new AphrontCSRFException( - "The form you just submitted did not include a valid CSRF token. ". - "This token is a technical security measure which prevents a ". - "certain type of login hijacking attack. However, the token can ". - "become invalid if you leave a page open for more than six hours ". - "without a connection to the internet. To fix this problem: reload ". - "the page, and then resubmit it. All data inserted to the form will ". - "be lost in some browsers so copy them somewhere before reloading.\n\n". - $more_info); + throw new AphrontMalformedRequestException( + pht('Invalid Request (CSRF)'), + $message, + true); } return true; } - final public function isFormPost() { + public function isFormPost() { $post = $this->getExists(self::TYPE_FORM) && + !$this->getExists(self::TYPE_HISEC) && $this->isHTTPPost(); if (!$post) { @@ -269,125 +421,286 @@ final public function isFormPost() { return $this->validateCSRF(); } - final public function getCookie($name, $default = null) { - return idx($_COOKIE, $name, $default); + public function hasCSRF() { + try { + $this->validateCSRF(); + return true; + } catch (AphrontMalformedRequestException $ex) { + return false; + } + } + + public function isFormOrHisecPost() { + $post = $this->getExists(self::TYPE_FORM) && + $this->isHTTPPost(); + + if (!$post) { + return false; + } + + return $this->validateCSRF(); + } + + + public function setCookiePrefix($prefix) { + $this->cookiePrefix = $prefix; + return $this; + } + + private function getPrefixedCookieName($name) { + if ($this->cookiePrefix !== null && strlen($this->cookiePrefix)) { + return $this->cookiePrefix.'_'.$name; + } + return $name; + } + + public function getCookie($name, $default = null) { + $name = $this->getPrefixedCookieName($name); + $value = idx($_COOKIE, $name, $default); + + // Internally, PHP deletes cookies by setting them to the value 'deleted' + // with an expiration date in the past. + + // At least in Safari, the browser may send this cookie anyway in some + // circumstances. After logging out, the 302'd GET to /login/ consistently + // includes deleted cookies on my local install. If a cookie value is + // literally 'deleted', pretend it does not exist. + + if ($value === 'deleted') { + return null; + } + + return $value; } - final public function clearCookie($name) { - $this->setCookie($name, '', time() - (60 * 60 * 24 * 30)); + public function clearCookie($name) { + $this->setCookieWithExpiration($name, '', time() - (60 * 60 * 24 * 30)); unset($_COOKIE[$name]); } - final public function setCookie($name, $value, $expire = null) { + /** + * Get the domain which cookies should be set on for this request, or null + * if the request does not correspond to a valid cookie domain. + * + * @return PhutilURI|null Domain URI, or null if no valid domain exists. + * + * @task cookie + */ + private function getCookieDomainURI() { + if (PhabricatorEnv::getEnvConfig('security.require-https') && + !$this->isHTTPS()) { + return null; + } - $is_secure = false; + $host = $this->getHost(); - // If a base URI has been configured, ensure cookies are only set on that - // domain. Also, use the URI protocol to control SSL-only cookies. + // If there's no base domain configured, just use whatever the request + // domain is. This makes setup easier, and we'll tell administrators to + // configure a base domain during the setup process. $base_uri = PhabricatorEnv::getEnvConfig('phabricator.base-uri'); - if ($base_uri) { - $alternates = PhabricatorEnv::getEnvConfig('phabricator.allowed-uris'); - $allowed_uris = array_merge( - array($base_uri), - $alternates); - - $host = $this->getHost(); - - $match = null; - foreach ($allowed_uris as $allowed_uri) { - $uri = new PhutilURI($allowed_uri); - $domain = $uri->getDomain(); - if ($host == $domain) { - $match = $uri; - break; - } - } + if ($base_uri === null || !strlen($base_uri)) { + return new PhutilURI('http://'.$host.'/'); + } - if ($match === null) { - if (count($allowed_uris) > 1) { - throw new Exception( - pht( - 'This Phabricator install is configured as "%s", but you are '. - 'accessing it via "%s". Access Phabricator via the primary '. - 'configured domain, or one of the permitted alternate '. - 'domains: %s. Phabricator will not set cookies on other domains '. - 'for security reasons.', - $base_uri, - $host, - implode(', ', $alternates))); - } else { - throw new Exception( - pht( - 'This Phabricator install is configured as "%s", but you are '. - 'accessing it via "%s". Acccess Phabricator via the primary '. - 'configured domain. Phabricator will not set cookies on other '. - 'domains for security reasons.', - $base_uri, - $host)); - } - } + $alternates = PhabricatorEnv::getEnvConfig('phabricator.allowed-uris'); + $allowed_uris = array_merge( + array($base_uri), + $alternates); - $base_domain = $match->getDomain(); - $is_secure = ($match->getProtocol() == 'https'); - } else { - $base_uri = new PhutilURI(PhabricatorEnv::getRequestBaseURI()); - $base_domain = $base_uri->getDomain(); + foreach ($allowed_uris as $allowed_uri) { + $uri = new PhutilURI($allowed_uri); + if ($uri->getDomain() == $host) { + return $uri; + } } - if ($expire === null) { - $expire = time() + (60 * 60 * 24 * 365 * 5); + return null; + } + + /** + * Determine if security policy rules will allow cookies to be set when + * responding to the request. + * + * @return bool True if setCookie() will succeed. If this method returns + * false, setCookie() will throw. + * + * @task cookie + */ + public function canSetCookies() { + return (bool)$this->getCookieDomainURI(); + } + + + /** + * Set a cookie which does not expire for a long time. + * + * To set a temporary cookie, see @{method:setTemporaryCookie}. + * + * @param string Cookie name. + * @param string Cookie value. + * @return this + * @task cookie + */ + public function setCookie($name, $value) { + $far_future = time() + (60 * 60 * 24 * 365 * 5); + return $this->setCookieWithExpiration($name, $value, $far_future); + } + + + /** + * Set a cookie which expires soon. + * + * To set a durable cookie, see @{method:setCookie}. + * + * @param string Cookie name. + * @param string Cookie value. + * @return this + * @task cookie + */ + public function setTemporaryCookie($name, $value) { + return $this->setCookieWithExpiration($name, $value, 0); + } + + + /** + * Set a cookie with a given expiration policy. + * + * @param string Cookie name. + * @param string Cookie value. + * @param int Epoch timestamp for cookie expiration. + * @return this + * @task cookie + */ + private function setCookieWithExpiration( + $name, + $value, + $expire) { + + $is_secure = false; + + $base_domain_uri = $this->getCookieDomainURI(); + if (!$base_domain_uri) { + $configured_as = PhabricatorEnv::getEnvConfig('phabricator.base-uri'); + $accessed_as = $this->getHost(); + + throw new AphrontMalformedRequestException( + pht('Bad Host Header'), + pht( + 'This server is configured as "%s", but you are using the domain '. + 'name "%s" to access a page which is trying to set a cookie. '. + 'Access this service on the configured primary domain or a '. + 'configured alternate domain. Cookies will not be set on other '. + 'domains for security reasons.', + $configured_as, + $accessed_as), + true); } - setcookie( - $name, - $value, - $expire, - $path = '/', - $base_domain, - $is_secure, - $http_only = true); + $base_domain = $base_domain_uri->getDomain(); + $is_secure = ($base_domain_uri->getProtocol() == 'https'); + + $name = $this->getPrefixedCookieName($name); + + if (php_sapi_name() == 'cli') { + // Do nothing, to avoid triggering "Cannot modify header information" + // warnings. + + // TODO: This is effectively a test for whether we're running in a unit + // test or not. Move this actual call to HTTPSink? + } else { + setcookie( + $name, + $value, + $expire, + $path = '/', + $base_domain, + $is_secure, + $http_only = true); + } $_COOKIE[$name] = $value; return $this; } - final public function setUser($user) { + public function setUser($user) { $this->user = $user; return $this; } - final public function getUser() { + public function getUser() { + return $this->user; + } + + public function getViewer() { return $this->user; } - final public function getRequestURI() { - $get = $_GET; - unset($get['__path__']); - $path = phutil_escape_uri($this->getPath()); - return id(new PhutilURI($path))->setQueryParams($get); + public function getRequestURI() { + $uri_path = phutil_escape_uri($this->getPath()); + $uri_query = idx($_SERVER, 'QUERY_STRING', ''); + + return id(new PhutilURI($uri_path.'?'.$uri_query)) + ->removeQueryParam('__path__'); } - final public function isDialogFormPost() { + public function getAbsoluteRequestURI() { + $uri = $this->getRequestURI(); + $uri->setDomain($this->getHost()); + + if ($this->isHTTPS()) { + $protocol = 'https'; + } else { + $protocol = 'http'; + } + + $uri->setProtocol($protocol); + + // If the request used a nonstandard port, preserve it while building the + // absolute URI. + + // First, get the default port for the request protocol. + $default_port = id(new PhutilURI($protocol.'://example.com/')) + ->getPortWithProtocolDefault(); + + // NOTE: See note in getHost() about malicious "Host" headers. This + // construction defuses some obscure potential attacks. + $port = id(new PhutilURI($protocol.'://'.$this->host)) + ->getPort(); + + if (($port !== null) && ($port !== $default_port)) { + $uri->setPort($port); + } + + return $uri; + } + + public function isDialogFormPost() { return $this->isFormPost() && $this->getStr('__dialog__'); } - final public function getRemoteAddr() { - return $_SERVER['REMOTE_ADDR']; + public function getRemoteAddress() { + $address = PhabricatorEnv::getRemoteAddress(); + + if (!$address) { + return null; + } + + return $address->getAddress(); } public function isHTTPS() { if (empty($_SERVER['HTTPS'])) { return false; } - if (!strcasecmp($_SERVER["HTTPS"], "off")) { + if (!strcasecmp($_SERVER['HTTPS'], 'off')) { return false; } return true; } public function isContinueRequest() { - return $this->isFormPost() && $this->getStr('__continue__'); + return $this->isFormOrHisecPost() && $this->getStr('__continue__'); } public function isPreviewRequest() { @@ -402,8 +715,9 @@ public function isPreviewRequest() { * * @return dict Original request parameters. */ - public function getPassthroughRequestParameters() { - return self::flattenData($this->getPassthroughRequestData()); + public function getPassthroughRequestParameters($include_quicksand = false) { + return self::flattenData( + $this->getPassthroughRequestData($include_quicksand)); } /** @@ -411,12 +725,15 @@ public function getPassthroughRequestParameters() { * * @return dict Request data, with magic filtered out. */ - public function getPassthroughRequestData() { + public function getPassthroughRequestData($include_quicksand = false) { $data = $this->getRequestData(); // Remove magic parameters like __dialog__ and __ajax__. foreach ($data as $key => $value) { - if (strncmp($key, '__', 2)) { + if ($include_quicksand && $key == self::TYPE_QUICKSAND) { + continue; + } + if (!strncmp($key, '__', 2)) { unset($data[$key]); } } @@ -453,14 +770,200 @@ public static function flattenData(array $data) { } - public static function getHTTPHeader($name, $default = null) { + /** + * Read the value of an HTTP header from `$_SERVER`, or a similar datasource. + * + * This function accepts a canonical header name, like `"Accept-Encoding"`, + * and looks up the appropriate value in `$_SERVER` (in this case, + * `"HTTP_ACCEPT_ENCODING"`). + * + * @param string Canonical header name, like `"Accept-Encoding"`. + * @param wild Default value to return if header is not present. + * @param array? Read this instead of `$_SERVER`. + * @return string|wild Header value if present, or `$default` if not. + */ + public static function getHTTPHeader($name, $default = null, $data = null) { // PHP mangles HTTP headers by uppercasing them and replacing hyphens with // underscores, then prepending 'HTTP_'. $php_index = strtoupper($name); $php_index = str_replace('-', '_', $php_index); - $php_index = 'HTTP_'.$php_index; - return idx($_SERVER, $php_index, $default); + $try_names = array(); + + $try_names[] = 'HTTP_'.$php_index; + if ($php_index == 'CONTENT_TYPE' || $php_index == 'CONTENT_LENGTH') { + // These headers may be available under alternate names. See + // http://www.php.net/manual/en/reserved.variables.server.php#110763 + $try_names[] = $php_index; + } + + if ($data === null) { + $data = $_SERVER; + } + + foreach ($try_names as $try_name) { + if (array_key_exists($try_name, $data)) { + return $data[$try_name]; + } + } + + return $default; + } + + +/* -( Working With a Phabricator Cluster )--------------------------------- */ + + + /** + * Is this a proxied request originating from within the Phabricator cluster? + * + * IMPORTANT: This means the request is dangerous! + * + * These requests are **more dangerous** than normal requests (they can not + * be safely proxied, because proxying them may cause a loop). Cluster + * requests are not guaranteed to come from a trusted source, and should + * never be treated as safer than normal requests. They are strictly less + * safe. + */ + public function isProxiedClusterRequest() { + return (bool)self::getHTTPHeader('X-Phabricator-Cluster'); + } + + + /** + * Build a new @{class:HTTPSFuture} which proxies this request to another + * node in the cluster. + * + * IMPORTANT: This is very dangerous! + * + * The future forwards authentication information present in the request. + * Proxied requests must only be sent to trusted hosts. (We attempt to + * enforce this.) + * + * This is not a general-purpose proxying method; it is a specialized + * method with niche applications and severe security implications. + * + * @param string URI identifying the host we are proxying the request to. + * @return HTTPSFuture New proxy future. + * + * @phutil-external-symbol class PhabricatorStartup + */ + public function newClusterProxyFuture($uri) { + $uri = new PhutilURI($uri); + + $domain = $uri->getDomain(); + $ip = gethostbyname($domain); + if (!$ip) { + throw new Exception( + pht( + 'Unable to resolve domain "%s"!', + $domain)); + } + + if (!PhabricatorEnv::isClusterAddress($ip)) { + throw new Exception( + pht( + 'Refusing to proxy a request to IP address ("%s") which is not '. + 'in the cluster address block (this address was derived by '. + 'resolving the domain "%s").', + $ip, + $domain)); + } + + $uri->setPath($this->getPath()); + $uri->removeAllQueryParams(); + foreach (self::flattenData($_GET) as $query_key => $query_value) { + $uri->appendQueryParam($query_key, $query_value); + } + + $input = PhabricatorStartup::getRawInput(); + + $future = id(new HTTPSFuture($uri)) + ->addHeader('Host', self::getHost()) + ->addHeader('X-Phabricator-Cluster', true) + ->setMethod($_SERVER['REQUEST_METHOD']) + ->write($input); + + if (isset($_SERVER['PHP_AUTH_USER'])) { + $future->setHTTPBasicAuthCredentials( + $_SERVER['PHP_AUTH_USER'], + new PhutilOpaqueEnvelope(idx($_SERVER, 'PHP_AUTH_PW', ''))); + } + + $headers = array(); + $seen = array(); + + // NOTE: apache_request_headers() might provide a nicer way to do this, + // but isn't available under FCGI until PHP 5.4.0. + foreach ($_SERVER as $key => $value) { + if (!preg_match('/^HTTP_/', $key)) { + continue; + } + + // Unmangle the header as best we can. + $key = substr($key, strlen('HTTP_')); + $key = str_replace('_', ' ', $key); + $key = strtolower($key); + $key = ucwords($key); + $key = str_replace(' ', '-', $key); + + // By default, do not forward headers. + $should_forward = false; + + // Forward "X-Hgarg-..." headers. + if (preg_match('/^X-Hgarg-/', $key)) { + $should_forward = true; + } + + if ($should_forward) { + $headers[] = array($key, $value); + $seen[$key] = true; + } + } + + // In some situations, this may not be mapped into the HTTP_X constants. + // CONTENT_LENGTH is similarly affected, but we trust cURL to take care + // of that if it matters, since we're handing off a request body. + if (empty($seen['Content-Type'])) { + if (isset($_SERVER['CONTENT_TYPE'])) { + $headers[] = array('Content-Type', $_SERVER['CONTENT_TYPE']); + } + } + + foreach ($headers as $header) { + list($key, $value) = $header; + switch ($key) { + case 'Host': + case 'Authorization': + // Don't forward these headers, we've already handled them elsewhere. + unset($headers[$key]); + break; + default: + break; + } + } + + foreach ($headers as $header) { + list($key, $value) = $header; + $future->addHeader($key, $value); + } + + return $future; + } + + public function updateEphemeralCookies() { + $submit_cookie = PhabricatorCookies::COOKIE_SUBMIT; + + $submit_key = $this->getCookie($submit_cookie); + if ($submit_key !== null && strlen($submit_key)) { + $this->clearCookie($submit_cookie); + $this->submitKey = $submit_key; + } + + } + + public function getSubmitKey() { + return $this->submitKey; } } diff --git a/src/aphront/AphrontURIMapper.php b/src/aphront/AphrontURIMapper.php deleted file mode 100644 index 20ae87db97..0000000000 --- a/src/aphront/AphrontURIMapper.php +++ /dev/null @@ -1,52 +0,0 @@ -map = $map; - } - - final public function mapPath($path) { - $map = $this->map; - foreach ($map as $rule => $value) { - list($controller, $data) = $this->tryRule($rule, $value, $path); - if ($controller) { - foreach ($data as $k => $v) { - if (is_numeric($k)) { - unset($data[$k]); - } - } - return array($controller, $data); - } - } - - return array(null, null); - } - - final private function tryRule($rule, $value, $path) { - $match = null; - $pattern = '#^'.$rule.(is_array($value) ? '' : '$').'#'; - if (!preg_match($pattern, $path, $match)) { - return array(null, null); - } - - if (!is_array($value)) { - return array($value, $match); - } - - $path = substr($path, strlen($match[0])); - foreach ($value as $srule => $sval) { - list($controller, $data) = $this->tryRule($srule, $sval, $path); - if ($controller) { - return array($controller, $data + $match); - } - } - - return array(null, null); - } -} diff --git a/src/aphront/__tests__/AphrontRequestTestCase.php b/src/aphront/__tests__/AphrontRequestTestCase.php index 95bc224c11..88fe97761f 100644 --- a/src/aphront/__tests__/AphrontRequestTestCase.php +++ b/src/aphront/__tests__/AphrontRequestTestCase.php @@ -75,7 +75,7 @@ public function testHostAttacks() { $this->assertEqual( $expect, $r->getHost(), - 'Host: '.$input); + pht('Host: %s', $input)); } } @@ -131,4 +131,21 @@ public function testFlattenRequestData() { } } + public function testGetHTTPHeader() { + $server_data = array( + 'HTTP_ACCEPT_ENCODING' => 'duck/quack', + 'CONTENT_TYPE' => 'cow/moo', + ); + + $this->assertEqual( + 'duck/quack', + AphrontRequest::getHTTPHeader('AcCePt-EncOdING', null, $server_data)); + $this->assertEqual( + 'cow/moo', + AphrontRequest::getHTTPHeader('cONTent-TyPE', null, $server_data)); + $this->assertEqual( + null, + AphrontRequest::getHTTPHeader('Pie-Flavor', null, $server_data)); + } + } diff --git a/src/aphront/__tests__/AphrontRoutingMapTestCase.php b/src/aphront/__tests__/AphrontRoutingMapTestCase.php new file mode 100644 index 0000000000..42d79d1089 --- /dev/null +++ b/src/aphront/__tests__/AphrontRoutingMapTestCase.php @@ -0,0 +1,85 @@ +getRoutingMaps(); + foreach ($maps as $map) { + foreach ($map->getRoutes() as $rule => $value) { + $this->assertRoutable($site, $map, array(), $rule, $value); + $count++; + } + } + } + + if (!$count) { + $this->assertSkipped( + pht('No sites define any routing rules.')); + } + } + + private function assertRoutable( + AphrontSite $site, + AphrontRoutingMap $map, + array $path, + $rule, + $value) { + + $path[] = $rule; + + $site_description = $site->getDescription(); + $rule_path = implode(' > ', $path); + + $pattern = implode('', $path); + $pattern = '('.$pattern.')'; + $ok = @preg_match($pattern, ''); + + $this->assertTrue( + ($ok !== false), + pht( + 'Routing rule ("%s", for site "%s") does not compile into a '. + 'valid regular expression.', + $rule_path, + $site_description)); + + if (is_array($value)) { + $this->assertTrue( + (count($value) > 0), + pht( + 'Routing rule ("%s", for site "%s") does not have any targets.', + $rule_path, + $site_description)); + + foreach ($value as $sub_rule => $sub_value) { + $this->assertRoutable($site, $map, $path, $sub_rule, $sub_value); + } + return; + } + + if (is_string($value)) { + $this->assertTrue( + class_exists($value), + pht( + 'Routing rule ("%s", for site "%s") points at controller ("%s") '. + 'which does not exist.', + $rule_path, + $site_description, + $value)); + return; + } + + $this->assertFailure( + pht( + 'Routing rule ("%s", for site "%s") points at unknown value '. + '(of type "%s"), expected a controller class name string.', + $rule_path, + $site_description, + phutil_describe_type($value))); + } + +} diff --git a/src/aphront/configuration/AphrontApplicationConfiguration.php b/src/aphront/configuration/AphrontApplicationConfiguration.php index b3abbb1036..550a5a0316 100644 --- a/src/aphront/configuration/AphrontApplicationConfiguration.php +++ b/src/aphront/configuration/AphrontApplicationConfiguration.php @@ -1,59 +1,383 @@ parseQueryString(idx($_SERVER, 'QUERY_STRING', '')); + + $cookie_prefix = PhabricatorEnv::getEnvConfig('phabricator.cookie-prefix'); + + $request = new AphrontRequest($this->getHost(), $this->getPath()); + $request->setRequestData($data); + $request->setApplicationConfiguration($this); + $request->setCookiePrefix($cookie_prefix); + + $request->updateEphemeralCookies(); + + return $request; + } + + public function buildRedirectController($uri, $external) { + return array( + new PhabricatorRedirectController(), + array( + 'uri' => $uri, + 'external' => $external, + ), + ); + } + + public function setRequest(AphrontRequest $request) { $this->request = $request; return $this; } - final public function getRequest() { + public function getRequest() { return $this->request; } - final public function getConsole() { + public function getConsole() { return $this->console; } - final public function setConsole($console) { + public function setConsole($console) { $this->console = $console; return $this; } - final public function setHost($host) { + public function setHost($host) { $this->host = $host; return $this; } - final public function getHost() { + public function getHost() { return $this->host; } - final public function setPath($path) { + public function setPath($path) { $this->path = $path; return $this; } - final public function getPath() { + public function getPath() { return $this->path; } - public function willBuildRequest() { + + /** + * @phutil-external-symbol class PhabricatorStartup + */ + public static function runHTTPRequest(AphrontHTTPSink $sink) { + if (isset($_SERVER['HTTP_X_SETUP_SELFCHECK'])) { + $response = self::newSelfCheckResponse(); + return self::writeResponse($sink, $response); + } + + PhabricatorStartup::beginStartupPhase('multimeter'); + $multimeter = MultimeterControl::newInstance(); + $multimeter->setEventContext(''); + $multimeter->setEventViewer(''); + + // Build a no-op write guard for the setup phase. We'll replace this with a + // real write guard later on, but we need to survive setup and build a + // request object first. + $write_guard = new AphrontWriteGuard('id'); + + PhabricatorStartup::beginStartupPhase('preflight'); + + $response = PhabricatorSetupCheck::willPreflightRequest(); + if ($response) { + return self::writeResponse($sink, $response); + } + + PhabricatorStartup::beginStartupPhase('env.init'); + + self::readHTTPPOSTData(); + + try { + PhabricatorEnv::initializeWebEnvironment(); + $database_exception = null; + } catch (PhabricatorClusterStrandedException $ex) { + $database_exception = $ex; + } + + // If we're in developer mode, set a flag so that top-level exception + // handlers can add more information. + if (PhabricatorEnv::getEnvConfig('phabricator.developer-mode')) { + $sink->setShowStackTraces(true); + } + + if ($database_exception) { + $issue = PhabricatorSetupIssue::newDatabaseConnectionIssue( + $database_exception, + true); + $response = PhabricatorSetupCheck::newIssueResponse($issue); + return self::writeResponse($sink, $response); + } + + $multimeter->setSampleRate( + PhabricatorEnv::getEnvConfig('debug.sample-rate')); + + $debug_time_limit = PhabricatorEnv::getEnvConfig('debug.time-limit'); + if ($debug_time_limit) { + PhabricatorStartup::setDebugTimeLimit($debug_time_limit); + } + + // This is the earliest we can get away with this, we need env config first. + PhabricatorStartup::beginStartupPhase('log.access'); + PhabricatorAccessLog::init(); + $access_log = PhabricatorAccessLog::getLog(); + PhabricatorStartup::setAccessLog($access_log); + + $address = PhabricatorEnv::getRemoteAddress(); + if ($address) { + $address_string = $address->getAddress(); + } else { + $address_string = '-'; + } + + $access_log->setData( + array( + 'R' => AphrontRequest::getHTTPHeader('Referer', '-'), + 'r' => $address_string, + 'M' => idx($_SERVER, 'REQUEST_METHOD', '-'), + )); + + DarkConsoleXHProfPluginAPI::hookProfiler(); + + // We just activated the profiler, so we don't need to keep track of + // startup phases anymore: it can take over from here. + PhabricatorStartup::beginStartupPhase('startup.done'); + + DarkConsoleErrorLogPluginAPI::registerErrorHandler(); + + $response = PhabricatorSetupCheck::willProcessRequest(); + if ($response) { + return self::writeResponse($sink, $response); + } + + $host = AphrontRequest::getHTTPHeader('Host'); + $path = PhabricatorStartup::getRequestPath(); + + $application = new self(); + + $application->setHost($host); + $application->setPath($path); + $request = $application->buildRequest(); + + // Now that we have a request, convert the write guard into one which + // actually checks CSRF tokens. + $write_guard->dispose(); + $write_guard = new AphrontWriteGuard(array($request, 'validateCSRF')); + + // Build the server URI implied by the request headers. If an administrator + // has not configured "phabricator.base-uri" yet, we'll use this to generate + // links. + + $request_protocol = ($request->isHTTPS() ? 'https' : 'http'); + $request_base_uri = "{$request_protocol}://{$host}/"; + PhabricatorEnv::setRequestBaseURI($request_base_uri); + + $access_log->setData( + array( + 'U' => (string)$request->getRequestURI()->getPath(), + )); + + $processing_exception = null; + try { + $response = $application->processRequest( + $request, + $access_log, + $sink, + $multimeter); + $response_code = $response->getHTTPResponseCode(); + } catch (Exception $ex) { + $processing_exception = $ex; + $response_code = 500; + } + + $write_guard->dispose(); + + $access_log->setData( + array( + 'c' => $response_code, + 'T' => PhabricatorStartup::getMicrosecondsSinceStart(), + )); + + $multimeter->newEvent( + MultimeterEvent::TYPE_REQUEST_TIME, + $multimeter->getEventContext(), + PhabricatorStartup::getMicrosecondsSinceStart()); + + $access_log->write(); + + $multimeter->saveEvents(); + + DarkConsoleXHProfPluginAPI::saveProfilerSample($access_log); + + PhabricatorStartup::disconnectRateLimits( + array( + 'viewer' => $request->getUser(), + )); + + if ($processing_exception) { + throw $processing_exception; + } + } + + + public function processRequest( + AphrontRequest $request, + PhutilDeferredLog $access_log, + AphrontHTTPSink $sink, + MultimeterControl $multimeter) { + + $this->setRequest($request); + + list($controller, $uri_data) = $this->buildController(); + + $controller_class = get_class($controller); + $access_log->setData( + array( + 'C' => $controller_class, + )); + $multimeter->setEventContext('web.'.$controller_class); + + $request->setController($controller); + $request->setURIMap($uri_data); + + $controller->setRequest($request); + + // If execution throws an exception and then trying to render that + // exception throws another exception, we want to show the original + // exception, as it is likely the root cause of the rendering exception. + $original_exception = null; + try { + $response = $controller->willBeginExecution(); + + if ($request->getUser() && $request->getUser()->getPHID()) { + $access_log->setData( + array( + 'u' => $request->getUser()->getUserName(), + 'P' => $request->getUser()->getPHID(), + )); + $multimeter->setEventViewer('user.'.$request->getUser()->getPHID()); + } + + if (!$response) { + $controller->willProcessRequest($uri_data); + $response = $controller->handleRequest($request); + $this->validateControllerResponse($controller, $response); + } + } catch (Exception $ex) { + $original_exception = $ex; + } catch (Throwable $ex) { + $original_exception = $ex; + } + + $response_exception = null; + try { + if ($original_exception) { + $response = $this->handleThrowable($original_exception); + } + + $response = $this->produceResponse($request, $response); + $response = $controller->willSendResponse($response); + $response->setRequest($request); + + self::writeResponse($sink, $response); + } catch (Exception $ex) { + $response_exception = $ex; + } catch (Throwable $ex) { + $response_exception = $ex; + } + + if ($response_exception) { + // If we encountered an exception while building a normal response, then + // encountered another exception while building a response for the first + // exception, throw an aggregate exception that will be unpacked by the + // higher-level handler. This is above our pay grade. + if ($original_exception) { + throw new PhutilAggregateException( + pht( + 'Encountered a processing exception, then another exception when '. + 'trying to build a response for the first exception.'), + array( + $response_exception, + $original_exception, + )); + } + + // If we built a response successfully and then ran into an exception + // trying to render it, try to handle and present that exception to the + // user using the standard handler. + + // The problem here might be in rendering (more common) or in the actual + // response mechanism (less common). If it's in rendering, we can likely + // still render a nice exception page: the majority of rendering issues + // are in main page content, not content shared with the exception page. + + $handling_exception = null; + try { + $response = $this->handleThrowable($response_exception); + + $response = $this->produceResponse($request, $response); + $response = $controller->willSendResponse($response); + $response->setRequest($request); + + self::writeResponse($sink, $response); + } catch (Exception $ex) { + $handling_exception = $ex; + } catch (Throwable $ex) { + $handling_exception = $ex; + } + + // If we didn't have any luck with that, raise the original response + // exception. As above, this is the root cause exception and more likely + // to be useful. This will go to the fallback error handler at top + // level. + + if ($handling_exception) { + throw $response_exception; + } + } + + return $response; + } + + private static function writeResponse( + AphrontHTTPSink $sink, + AphrontResponse $response) { + + $unexpected_output = PhabricatorStartup::endOutputCapture(); + if ($unexpected_output) { + $unexpected_output = pht( + "Unexpected output:\n\n%s", + $unexpected_output); + + phlog($unexpected_output); + + if ($response instanceof AphrontWebpageResponse) { + $response->setUnexpectedOutput($unexpected_output); + } + } + + $sink->writeResponse($response); } @@ -61,171 +385,495 @@ public function willBuildRequest() { /** - * Using builtin and application routes, build the appropriate - * @{class:AphrontController} class for the request. To route a request, we - * first test if the HTTP_HOST is configured as a valid Phabricator URI. If - * it isn't, we do a special check to see if it's a custom domain for a blog - * in the Phame application and if that fails we error. Otherwise, we test - * the URI against all builtin routes from @{method:getURIMap}, then against - * all application routes from installed @{class:PhabricatorApplication}s. - * - * If we match a route, we construct the controller it points at, build it, - * and return it. - * - * If we fail to match a route, but the current path is missing a trailing - * "/", we try routing the same path with a trailing "/" and do a redirect - * if that has a valid route. The idea is to canoncalize URIs for consistency, - * but avoid breaking noncanonical URIs that we can easily salvage. - * - * NOTE: We only redirect on GET. On POST, we'd drop parameters and most - * likely mutate the request implicitly, and a bad POST usually indicates a - * programming error rather than a sloppy typist. - * - * If the failing path already has a trailing "/", or we can't route the - * version with a "/", we call @{method:build404Controller}, which build a - * fallback @{class:AphrontController}. + * Build a controller to respond to the request. * * @return pair Controller and dictionary of request * parameters. * @task routing */ - final public function buildController() { + private function buildController() { $request = $this->getRequest(); - if (PhabricatorEnv::getEnvConfig('security.require-https')) { + // If we're configured to operate in cluster mode, reject requests which + // were not received on a cluster interface. + // + // For example, a host may have an internal address like "170.0.0.1", and + // also have a public address like "51.23.95.16". Assuming the cluster + // is configured on a range like "170.0.0.0/16", we want to reject the + // requests received on the public interface. + // + // Ideally, nodes in a cluster should only be listening on internal + // interfaces, but they may be configured in such a way that they also + // listen on external interfaces, since this is easy to forget about or + // get wrong. As a broad security measure, reject requests received on any + // interfaces which aren't on the whitelist. + + $cluster_addresses = PhabricatorEnv::getEnvConfig('cluster.addresses'); + if ($cluster_addresses) { + $server_addr = idx($_SERVER, 'SERVER_ADDR'); + if (!$server_addr) { + if (php_sapi_name() == 'cli') { + // This is a command line script (probably something like a unit + // test) so it's fine that we don't have SERVER_ADDR defined. + } else { + throw new AphrontMalformedRequestException( + pht('No %s', 'SERVER_ADDR'), + pht( + 'This service is configured to operate in cluster mode, but '. + '%s is not defined in the request context. Your webserver '. + 'configuration needs to forward %s to PHP so the software can '. + 'reject requests received on external interfaces.', + 'SERVER_ADDR', + 'SERVER_ADDR')); + } + } else { + if (!PhabricatorEnv::isClusterAddress($server_addr)) { + throw new AphrontMalformedRequestException( + pht('External Interface'), + pht( + 'This service is configured in cluster mode and the address '. + 'this request was received on ("%s") is not whitelisted as '. + 'a cluster address.', + $server_addr)); + } + } + } + + $site = $this->buildSiteForRequest($request); + + if ($site->shouldRequireHTTPS()) { if (!$request->isHTTPS()) { + + // Don't redirect intracluster requests: doing so drops headers and + // parameters, imposes a performance penalty, and indicates a + // misconfiguration. + if ($request->isProxiedClusterRequest()) { + throw new AphrontMalformedRequestException( + pht('HTTPS Required'), + pht( + 'This request reached a site which requires HTTPS, but the '. + 'request is not marked as HTTPS.')); + } + $https_uri = $request->getRequestURI(); $https_uri->setDomain($request->getHost()); $https_uri->setProtocol('https'); - return $this->buildRedirectController($https_uri); + + // In this scenario, we'll be redirecting to HTTPS using an absolute + // URI, so we need to permit an external redirect. + return $this->buildRedirectController($https_uri, true); } } - $path = $request->getPath(); - $host = $request->getHost(); - $base_uri = PhabricatorEnv::getEnvConfig('phabricator.base-uri'); - $prod_uri = PhabricatorEnv::getEnvConfig('phabricator.production-uri'); - $file_uri = PhabricatorEnv::getEnvConfig( - 'security.alternate-file-domain'); - $conduit_uris = PhabricatorEnv::getEnvConfig('conduit.servers'); - $allowed_uris = PhabricatorEnv::getEnvConfig('phabricator.allowed-uris'); + $maps = $site->getRoutingMaps(); + $path = $request->getPath(); - $uris = array_merge( - array( - $base_uri, - $prod_uri, - $file_uri, - ), - $conduit_uris, - $allowed_uris); + $result = $this->routePath($maps, $path); + if ($result) { + return $result; + } - $host_match = false; - foreach ($uris as $uri) { - if ($host === id(new PhutilURI($uri))->getDomain()) { - $host_match = true; - break; + // If we failed to match anything but don't have a trailing slash, try + // to add a trailing slash and issue a redirect if that resolves. + + // NOTE: We only do this for GET, since redirects switch to GET and drop + // data like POST parameters. + if (!preg_match('@/$@', $path) && $request->isHTTPGet()) { + $result = $this->routePath($maps, $path.'/'); + if ($result) { + $target_uri = $request->getAbsoluteRequestURI(); + + // We need to restore URI encoding because the webserver has + // interpreted it. For example, this allows us to redirect a path + // like `/tag/aa%20bb` to `/tag/aa%20bb/`, which may eventually be + // resolved meaningfully by an application. + $target_path = phutil_escape_uri($path.'/'); + $target_uri->setPath($target_path); + $target_uri = (string)$target_uri; + + return $this->buildRedirectController($target_uri, true); } } - // NOTE: If the base URI isn't defined yet, don't activate alternate - // domains. - if ($base_uri && !$host_match) { + $result = $site->new404Controller($request); + if ($result) { + return array($result, array()); + } - try { - $blog = id(new PhameBlogQuery()) - ->setViewer(new PhabricatorUser()) - ->withDomain($host) - ->executeOne(); - } catch (PhabricatorPolicyException $ex) { - throw new Exception( - "This blog is not visible to logged out users, so it can not be ". - "visited from a custom domain."); + throw new Exception( + pht( + 'Aphront site ("%s") failed to build a 404 controller.', + get_class($site))); + } + + /** + * Map a specific path to the corresponding controller. For a description + * of routing, see @{method:buildController}. + * + * @param list List of routing maps. + * @param string Path to route. + * @return pair Controller and dictionary of request + * parameters. + * @task routing + */ + private function routePath(array $maps, $path) { + foreach ($maps as $map) { + $result = $map->routePath($path); + if ($result) { + return array($result->getController(), $result->getURIData()); } + } + } - if (!$blog) { - if ($prod_uri && $prod_uri != $base_uri) { - $prod_str = ' or '.$prod_uri; - } else { - $prod_str = ''; - } - throw new Exception( - 'Specified domain '.$host.' is not configured for Phabricator '. - 'requests. Please use '.$base_uri.$prod_str.' to visit this instance.' - ); + private function buildSiteForRequest(AphrontRequest $request) { + $sites = PhabricatorSite::getAllSites(); + + $site = null; + foreach ($sites as $candidate) { + $site = $candidate->newSiteForRequest($request); + if ($site) { + break; } + } + + if (!$site) { + $path = $request->getPath(); + $host = $request->getHost(); + throw new AphrontMalformedRequestException( + pht('Site Not Found'), + pht( + 'This request asked for "%s" on host "%s", but no site is '. + 'configured which can serve this request.', + $path, + $host), + true); + } + + $request->setSite($site); + + return $site; + } + - // TODO: Make this more flexible and modular so any application can - // do crazy stuff here if it wants. +/* -( Response Handling )-------------------------------------------------- */ - $path = '/phame/live/'.$blog->getID().'/'.$path; + + /** + * Tests if a response is of a valid type. + * + * @param wild Supposedly valid response. + * @return bool True if the object is of a valid type. + * @task response + */ + private function isValidResponseObject($response) { + if ($response instanceof AphrontResponse) { + return true; } - list($controller, $uri_data) = $this->buildControllerForPath($path); - if (!$controller) { - if (!preg_match('@/$@', $path)) { - // If we failed to match anything but don't have a trailing slash, try - // to add a trailing slash and issue a redirect if that resolves. - list($controller, $uri_data) = $this->buildControllerForPath($path.'/'); + if ($response instanceof AphrontResponseProducerInterface) { + return true; + } - // NOTE: For POST, just 404 instead of redirecting, since the redirect - // will be a GET without parameters. + return false; + } - if ($controller && !$request->isHTTPPost()) { - $slash_uri = $request->getRequestURI()->setPath($path.'/'); - return $this->buildRedirectController($slash_uri); - } - } - return $this->build404Controller(); + + /** + * Verifies that the return value from an @{class:AphrontController} is + * of an allowed type. + * + * @param AphrontController Controller which returned the response. + * @param wild Supposedly valid response. + * @return void + * @task response + */ + private function validateControllerResponse( + AphrontController $controller, + $response) { + + if ($this->isValidResponseObject($response)) { + return; } - return array($controller, $uri_data); + throw new Exception( + pht( + 'Controller "%s" returned an invalid response from call to "%s". '. + 'This method must return an object of class "%s", or an object '. + 'which implements the "%s" interface.', + get_class($controller), + 'handleRequest()', + 'AphrontResponse', + 'AphrontResponseProducerInterface')); } /** - * Map a specific path to the corresponding controller. For a description - * of routing, see @{method:buildController}. + * Verifies that the return value from an + * @{class:AphrontResponseProducerInterface} is of an allowed type. * - * @return pair Controller and dictionary of request - * parameters. - * @task routing + * @param AphrontResponseProducerInterface Object which produced + * this response. + * @param wild Supposedly valid response. + * @return void + * @task response */ - final public function buildControllerForPath($path) { - $maps = array(); - $maps[] = array(null, $this->getURIMap()); + private function validateProducerResponse( + AphrontResponseProducerInterface $producer, + $response) { - $applications = PhabricatorApplication::getAllInstalledApplications(); - foreach ($applications as $application) { - $maps[] = array($application, $application->getRoutes()); + if ($this->isValidResponseObject($response)) { + return; } - $current_application = null; - $controller_class = null; - foreach ($maps as $map_info) { - list($application, $map) = $map_info; + throw new Exception( + pht( + 'Producer "%s" returned an invalid response from call to "%s". '. + 'This method must return an object of class "%s", or an object '. + 'which implements the "%s" interface.', + get_class($producer), + 'produceAphrontResponse()', + 'AphrontResponse', + 'AphrontResponseProducerInterface')); + } - $mapper = new AphrontURIMapper($map); - list($controller_class, $uri_data) = $mapper->mapPath($path); - if ($controller_class) { - if ($application) { - $current_application = $application; - } + /** + * Verifies that the return value from an + * @{class:AphrontRequestExceptionHandler} is of an allowed type. + * + * @param AphrontRequestExceptionHandler Object which produced this + * response. + * @param wild Supposedly valid response. + * @return void + * @task response + */ + private function validateErrorHandlerResponse( + AphrontRequestExceptionHandler $handler, + $response) { + + if ($this->isValidResponseObject($response)) { + return; + } + + throw new Exception( + pht( + 'Exception handler "%s" returned an invalid response from call to '. + '"%s". This method must return an object of class "%s", or an object '. + 'which implements the "%s" interface.', + get_class($handler), + 'handleRequestException()', + 'AphrontResponse', + 'AphrontResponseProducerInterface')); + } + + + /** + * Resolves a response object into an @{class:AphrontResponse}. + * + * Controllers are permitted to return actual responses of class + * @{class:AphrontResponse}, or other objects which implement + * @{interface:AphrontResponseProducerInterface} and can produce a response. + * + * If a controller returns a response producer, invoke it now and produce + * the real response. + * + * @param AphrontRequest Request being handled. + * @param AphrontResponse|AphrontResponseProducerInterface Response, or + * response producer. + * @return AphrontResponse Response after any required production. + * @task response + */ + private function produceResponse(AphrontRequest $request, $response) { + $original = $response; + + // Detect cycles on the exact same objects. It's still possible to produce + // infinite responses as long as they're all unique, but we can only + // reasonably detect cycles, not guarantee that response production halts. + + $seen = array(); + while (true) { + // NOTE: It is permissible for an object to be both a response and a + // response producer. If so, being a producer is "stronger". This is + // used by AphrontProxyResponse. + + // If this response is a valid response, hand over the request first. + if ($response instanceof AphrontResponse) { + $response->setRequest($request); + } + + // If this isn't a producer, we're all done. + if (!($response instanceof AphrontResponseProducerInterface)) { break; } - } - if (!$controller_class) { - return array(null, null); + $hash = spl_object_hash($response); + if (isset($seen[$hash])) { + throw new Exception( + pht( + 'Failure while producing response for object of class "%s": '. + 'encountered production cycle (identical object, of class "%s", '. + 'was produced twice).', + get_class($original), + get_class($response))); + } + + $seen[$hash] = true; + + $new_response = $response->produceAphrontResponse(); + $this->validateProducerResponse($response, $new_response); + $response = $new_response; } + return $response; + } + + +/* -( Error Handling )----------------------------------------------------- */ + + + /** + * Convert an exception which has escaped the controller into a response. + * + * This method delegates exception handling to available subclasses of + * @{class:AphrontRequestExceptionHandler}. + * + * @param Throwable Exception which needs to be handled. + * @return wild Response or response producer, or null if no available + * handler can produce a response. + * @task exception + */ + private function handleThrowable($throwable) { + $handlers = AphrontRequestExceptionHandler::getAllHandlers(); + $request = $this->getRequest(); + foreach ($handlers as $handler) { + if ($handler->canHandleRequestThrowable($request, $throwable)) { + $response = $handler->handleRequestThrowable($request, $throwable); + $this->validateErrorHandlerResponse($handler, $response); + return $response; + } + } + + throw $throwable; + } + + private static function newSelfCheckResponse() { + $path = PhabricatorStartup::getRequestPath(); + $query = idx($_SERVER, 'QUERY_STRING', ''); - $controller = newv($controller_class, array($request)); - if ($current_application) { - $controller->setCurrentApplication($current_application); + $pairs = id(new PhutilQueryStringParser()) + ->parseQueryStringToPairList($query); + + $params = array(); + foreach ($pairs as $v) { + $params[] = array( + 'name' => $v[0], + 'value' => $v[1], + ); + } + + $raw_input = @file_get_contents('php://input'); + if ($raw_input !== false) { + $base64_input = base64_encode($raw_input); + } else { + $base64_input = null; + } + + $result = array( + 'path' => $path, + 'params' => $params, + 'user' => idx($_SERVER, 'PHP_AUTH_USER'), + 'pass' => idx($_SERVER, 'PHP_AUTH_PW'), + + 'raw.base64' => $base64_input, + + // This just makes sure that the response compresses well, so reasonable + // algorithms should want to gzip or deflate it. + 'filler' => str_repeat('Q', 1024 * 16), + ); + + return id(new AphrontJSONResponse()) + ->setAddJSONShield(false) + ->setContent($result); + } + + private static function readHTTPPOSTData() { + $request_method = idx($_SERVER, 'REQUEST_METHOD'); + if ($request_method === 'PUT') { + // For PUT requests, do nothing: in particular, do NOT read input. This + // allows us to stream input later and process very large PUT requests, + // like those coming from Git LFS. + return; } - return array($controller, $uri_data); + + // For POST requests, we're going to read the raw input ourselves here + // if we can. Among other things, this corrects variable names with + // the "." character in them, which PHP normally converts into "_". + + // If "enable_post_data_reading" is on, the documentation suggests we + // can not read the body. In practice, we seem to be able to. This may + // need to be resolved at some point, likely by instructing installs + // to disable this option. + + // If the content type is "multipart/form-data", we need to build both + // $_POST and $_FILES, which is involved. The body itself is also more + // difficult to parse than other requests. + + $raw_input = PhabricatorStartup::getRawInput(); + $parser = new PhutilQueryStringParser(); + + if (strlen($raw_input)) { + $content_type = idx($_SERVER, 'CONTENT_TYPE'); + $is_multipart = preg_match('@^multipart/form-data@i', $content_type); + if ($is_multipart) { + $multipart_parser = id(new AphrontMultipartParser()) + ->setContentType($content_type); + + $multipart_parser->beginParse(); + $multipart_parser->continueParse($raw_input); + $parts = $multipart_parser->endParse(); + + // We're building and then parsing a query string so that requests + // with arrays (like "x[]=apple&x[]=banana") work correctly. This also + // means we can't use "phutil_build_http_querystring()", since it + // can't build a query string with duplicate names. + + $query_string = array(); + foreach ($parts as $part) { + if (!$part->isVariable()) { + continue; + } + + $name = $part->getName(); + $value = $part->getVariableValue(); + $query_string[] = rawurlencode($name).'='.rawurlencode($value); + } + $query_string = implode('&', $query_string); + $post = $parser->parseQueryString($query_string); + + $files = array(); + foreach ($parts as $part) { + if ($part->isVariable()) { + continue; + } + + $files[$part->getName()] = $part->getPHPFileDictionary(); + } + $_FILES = $files; + } else { + $post = $parser->parseQueryString($raw_input); + } + + $_POST = $post; + PhabricatorStartup::rebuildRequest(); + } else if ($_POST) { + $post = filter_input_array(INPUT_POST, FILTER_UNSAFE_RAW); + if (is_array($post)) { + $_POST = $post; + PhabricatorStartup::rebuildRequest(); + } + } } + } diff --git a/src/aphront/configuration/AphrontDefaultApplicationConfiguration.php b/src/aphront/configuration/AphrontDefaultApplicationConfiguration.php deleted file mode 100644 index 7126f63995..0000000000 --- a/src/aphront/configuration/AphrontDefaultApplicationConfiguration.php +++ /dev/null @@ -1,371 +0,0 @@ -getResourceURIMapRules() + array( - '/(?:(?P(?:jump))/)?' => - 'PhabricatorDirectoryMainController', - - '/typeahead/' => array( - 'common/(?P\w+)/' - => 'PhabricatorTypeaheadCommonDatasourceController', - ), - - '/oauthserver/' => array( - 'auth/' => 'PhabricatorOAuthServerAuthController', - 'test/' => 'PhabricatorOAuthServerTestController', - 'token/' => 'PhabricatorOAuthServerTokenController', - 'clientauthorization/' => array( - '' => 'PhabricatorOAuthClientAuthorizationListController', - 'delete/(?P[^/]+)/' => - 'PhabricatorOAuthClientAuthorizationDeleteController', - 'edit/(?P[^/]+)/' => - 'PhabricatorOAuthClientAuthorizationEditController', - ), - 'client/' => array( - '' => 'PhabricatorOAuthClientListController', - 'create/' => 'PhabricatorOAuthClientEditController', - 'delete/(?P[^/]+)/' => 'PhabricatorOAuthClientDeleteController', - 'edit/(?P[^/]+)/' => 'PhabricatorOAuthClientEditController', - 'view/(?P[^/]+)/' => 'PhabricatorOAuthClientViewController', - ), - ), - - '/~/' => array( - '' => 'DarkConsoleController', - 'data/(?P[^/]+)/' => 'DarkConsoleDataController', - ), - - '/status/' => 'PhabricatorStatusController', - - - '/help/' => array( - 'keyboardshortcut/' => 'PhabricatorHelpKeyboardShortcutController', - ), - - '/notification/' => array( - '(?:(?Pall|unread)/)?' - => 'PhabricatorNotificationListController', - 'panel/' => 'PhabricatorNotificationPanelController', - 'individual/' => 'PhabricatorNotificationIndividualController', - 'status/' => 'PhabricatorNotificationStatusController', - 'clear/' => 'PhabricatorNotificationClearController', - ), - - '/debug/' => 'PhabricatorDebugController', - ); - } - - protected function getResourceURIMapRules() { - return array( - '/res/' => array( - '(?:(?P[0-9]+)T/)?'. - '(?Ppkg/)?'. - '(?P[a-f0-9]{8})/'. - '(?P.+\.(?:css|js|jpg|png|swf|gif))' - => 'CelerityPhabricatorResourceController', - ), - ); - } - - /** - * @phutil-external-symbol class PhabricatorStartup - */ - public function buildRequest() { - $parser = new PhutilQueryStringParser(); - $data = array(); - - // If the request has "multipart/form-data" content, we can't use - // PhutilQueryStringParser to parse it, and the raw data supposedly is not - // available anyway (according to the PHP documentation, "php://input" is - // not available for "multipart/form-data" requests). However, it is - // available at least some of the time (see T3673), so double check that - // we aren't trying to parse data we won't be able to parse correctly by - // examining the Content-Type header. - $content_type = idx($_SERVER, 'CONTENT_TYPE'); - $is_form_data = preg_match('@^multipart/form-data@i', $content_type); - - $raw_input = PhabricatorStartup::getRawInput(); - if (strlen($raw_input) && !$is_form_data) { - $data += $parser->parseQueryString($raw_input); - } else if ($_POST) { - $data += $_POST; - } - - $data += $parser->parseQueryString(idx($_SERVER, 'QUERY_STRING', '')); - - $request = new AphrontRequest($this->getHost(), $this->getPath()); - $request->setRequestData($data); - $request->setApplicationConfiguration($this); - - return $request; - } - - public function handleException(Exception $ex) { - $request = $this->getRequest(); - - // For Conduit requests, return a Conduit response. - if ($request->isConduit()) { - $response = new ConduitAPIResponse(); - $response->setErrorCode(get_class($ex)); - $response->setErrorInfo($ex->getMessage()); - - return id(new AphrontJSONResponse()) - ->setAddJSONShield(false) - ->setContent($response->toDictionary()); - } - - // For non-workflow requests, return a Ajax response. - if ($request->isAjax() && !$request->isJavelinWorkflow()) { - // Log these; they don't get shown on the client and can be difficult - // to debug. - phlog($ex); - - $response = new AphrontAjaxResponse(); - $response->setError( - array( - 'code' => get_class($ex), - 'info' => $ex->getMessage(), - )); - return $response; - } - - $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business'); - - $user = $request->getUser(); - if (!$user) { - // If we hit an exception very early, we won't have a user. - $user = new PhabricatorUser(); - } - - if ($ex instanceof PhabricatorPolicyException) { - - if (!$user->isLoggedIn()) { - // If the user isn't logged in, just give them a login form. This is - // probably a generally more useful response than a policy dialog that - // they have to click through to get a login form. - // - // Possibly we should add a header here like "you need to login to see - // the thing you are trying to look at". - $login_controller = new PhabricatorAuthStartController($request); - return $login_controller->processRequest(); - } - - $content = hsprintf( - '
    %s
    ', - $ex->getMessage()); - - $dialog = new AphrontDialogView(); - $dialog - ->setTitle( - $is_serious - ? 'Access Denied' - : "You Shall Not Pass") - ->setClass('aphront-access-dialog') - ->setUser($user) - ->appendChild($content); - - if ($this->getRequest()->isAjax()) { - $dialog->addCancelButton('/', 'Close'); - } else { - $dialog->addCancelButton('/', $is_serious ? 'OK' : 'Away With Thee'); - } - - $response = new AphrontDialogResponse(); - $response->setDialog($dialog); - return $response; - } - - if ($ex instanceof AphrontUsageException) { - $error = new AphrontErrorView(); - $error->setTitle($ex->getTitle()); - $error->appendChild($ex->getMessage()); - - $view = new PhabricatorStandardPageView(); - $view->setRequest($this->getRequest()); - $view->appendChild($error); - - $response = new AphrontWebpageResponse(); - $response->setContent($view->render()); - - return $response; - } - - - // Always log the unhandled exception. - phlog($ex); - - $class = get_class($ex); - $message = $ex->getMessage(); - - if ($ex instanceof AphrontQuerySchemaException) { - $message .= - "\n\n". - "NOTE: This usually indicates that the MySQL schema has not been ". - "properly upgraded. Run 'bin/storage upgrade' to ensure your ". - "schema is up to date."; - } - - if (PhabricatorEnv::getEnvConfig('phabricator.developer-mode')) { - $trace = $this->renderStackTrace($ex->getTrace(), $user); - } else { - $trace = null; - } - - $content = hsprintf( - '
    '. - '
    %s
    '. - '%s'. - '
    ', - $message, - $trace); - - $dialog = new AphrontDialogView(); - $dialog - ->setTitle('Unhandled Exception ("'.$class.'")') - ->setClass('aphront-exception-dialog') - ->setUser($user) - ->appendChild($content); - - if ($this->getRequest()->isAjax()) { - $dialog->addCancelButton('/', 'Close'); - } - - $response = new AphrontDialogResponse(); - $response->setDialog($dialog); - - return $response; - } - - public function willSendResponse(AphrontResponse $response) { - return $response; - } - - public function build404Controller() { - return array(new Phabricator404Controller($this->getRequest()), array()); - } - - public function buildRedirectController($uri) { - return array( - new PhabricatorRedirectController($this->getRequest()), - array( - 'uri' => $uri, - )); - } - - private function renderStackTrace($trace, PhabricatorUser $user) { - - $libraries = PhutilBootloader::getInstance()->getAllLibraries(); - - // TODO: Make this configurable? - $path = 'https://secure.phabricator.com/diffusion/%s/browse/master/src/'; - - $callsigns = array( - 'arcanist' => 'ARC', - 'phutil' => 'PHU', - 'phabricator' => 'P', - ); - - $rows = array(); - $depth = count($trace); - foreach ($trace as $part) { - $lib = null; - $file = idx($part, 'file'); - $relative = $file; - foreach ($libraries as $library) { - $root = phutil_get_library_root($library); - if (Filesystem::isDescendant($file, $root)) { - $lib = $library; - $relative = Filesystem::readablePath($file, $root); - break; - } - } - - $where = ''; - if (isset($part['class'])) { - $where .= $part['class'].'::'; - } - if (isset($part['function'])) { - $where .= $part['function'].'()'; - } - - if ($file) { - if (isset($callsigns[$lib])) { - $attrs = array('title' => $file); - try { - $attrs['href'] = $user->loadEditorLink( - '/src/'.$relative, - $part['line'], - $callsigns[$lib]); - } catch (Exception $ex) { - // The database can be inaccessible. - } - if (empty($attrs['href'])) { - $attrs['href'] = sprintf($path, $callsigns[$lib]). - str_replace(DIRECTORY_SEPARATOR, '/', $relative). - '$'.$part['line']; - $attrs['target'] = '_blank'; - } - $file_name = phutil_tag( - 'a', - $attrs, - $relative); - } else { - $file_name = phutil_tag( - 'span', - array( - 'title' => $file, - ), - $relative); - } - $file_name = hsprintf('%s : %d', $file_name, $part['line']); - } else { - $file_name = phutil_tag('em', array(), '(Internal)'); - } - - - $rows[] = array( - $depth--, - $lib, - $file_name, - $where, - ); - } - $table = new AphrontTableView($rows); - $table->setHeaders( - array( - 'Depth', - 'Library', - 'File', - 'Where', - )); - $table->setColumnClasses( - array( - 'n', - '', - '', - 'wide', - )); - - return hsprintf( - '
    '. - '
    Stack Trace
    '. - '%s'. - '
    ', - $table->render()); - } - -} diff --git a/src/aphront/console/DarkConsoleController.php b/src/aphront/console/DarkConsoleController.php deleted file mode 100644 index 6f46716312..0000000000 --- a/src/aphront/console/DarkConsoleController.php +++ /dev/null @@ -1,32 +0,0 @@ -getRequest(); - $user = $request->getUser(); - - $visible = $request->getStr('visible'); - if (strlen($visible)) { - $user->setConsoleVisible((int)$visible); - $user->save(); - return id(new AphrontAjaxResponse())->setDisableConsole(true); - } - - $tab = $request->getStr('tab'); - if (strlen($tab)) { - $user->setConsoleTab($tab); - $user->save(); - return id(new AphrontAjaxResponse())->setDisableConsole(true); - } - - return new Aphront404Response(); - } - -} diff --git a/src/aphront/console/DarkConsoleCore.php b/src/aphront/console/DarkConsoleCore.php deleted file mode 100644 index 36598026b5..0000000000 --- a/src/aphront/console/DarkConsoleCore.php +++ /dev/null @@ -1,129 +0,0 @@ -setType('class') - ->setAncestorClass('DarkConsolePlugin') - ->selectAndLoadSymbols(); - - foreach ($symbols as $symbol) { - $plugin = newv($symbol['name'], array()); - if (!$plugin->shouldStartup()) { - continue; - } - $plugin->setConsoleCore($this); - $plugin->didStartup(); - $this->plugins[$symbol['name']] = $plugin; - } - } - - public function getPlugins() { - return $this->plugins; - } - - public function getKey(AphrontRequest $request) { - $plugins = $this->getPlugins(); - - foreach ($plugins as $plugin) { - $plugin->setRequest($request); - $plugin->willShutdown(); - } - - foreach ($plugins as $plugin) { - $plugin->didShutdown(); - } - - foreach ($plugins as $plugin) { - $plugin->setData($plugin->generateData()); - } - - $plugins = msort($plugins, 'getOrderKey'); - - $key = Filesystem::readRandomCharacters(24); - - $tabs = array(); - $data = array(); - foreach ($plugins as $plugin) { - $class = get_class($plugin); - $tabs[] = array( - 'class' => $class, - 'name' => $plugin->getName(), - 'color' => $plugin->getColor(), - ); - $data[$class] = $this->sanitizeForJSON($plugin->getData()); - } - - $storage = array( - 'vers' => self::STORAGE_VERSION, - 'tabs' => $tabs, - 'data' => $data, - 'user' => $request->getUser() - ? $request->getUser()->getPHID() - : null, - ); - - $cache = new PhabricatorKeyValueDatabaseCache(); - $cache = new PhutilKeyValueCacheProfiler($cache); - $cache->setProfiler(PhutilServiceProfiler::getInstance()); - - $cache->setKeys( - array( - 'darkconsole:'.$key => json_encode($storage), - ), - $ttl = (60 * 60 * 6)); - - return $key; - } - - public function getColor() { - foreach ($this->getPlugins() as $plugin) { - if ($plugin->getColor()) { - return $plugin->getColor(); - } - } - } - - public function render(AphrontRequest $request) { - $user = $request->getUser(); - $visible = $user ? $user->getConsoleVisible() : true; - - return javelin_tag( - 'div', - array( - 'id' => 'darkconsole', - 'class' => 'dark-console', - 'style' => $visible ? '' : 'display: none;', - 'data-console-key' => $this->getKey($request), - 'data-console-color' => $this->getColor(), - ), - ''); - } - - /** - * Sometimes, tab data includes binary information (like INSERT queries which - * write file data into the database). To successfully JSON encode it, we - * need to convert it to UTF-8. - */ - private function sanitizeForJSON($data) { - if (is_object($data)) { - return ''; - } else if (is_array($data)) { - foreach ($data as $key => $value) { - $data[$key] = $this->sanitizeForJSON($value); - } - return $data; - } else { - return phutil_utf8ize($data); - } - } - -} - diff --git a/src/aphront/console/DarkConsoleDataController.php b/src/aphront/console/DarkConsoleDataController.php deleted file mode 100644 index af5364fea6..0000000000 --- a/src/aphront/console/DarkConsoleDataController.php +++ /dev/null @@ -1,70 +0,0 @@ -key = $data['key']; - } - - public function processRequest() { - $request = $this->getRequest(); - $user = $request->getUser(); - - $cache = new PhabricatorKeyValueDatabaseCache(); - $cache = new PhutilKeyValueCacheProfiler($cache); - $cache->setProfiler(PhutilServiceProfiler::getInstance()); - - $result = $cache->getKey('darkconsole:'.$this->key); - if (!$result) { - return new Aphront400Response(); - } - - $result = json_decode($result, true); - - if (!is_array($result)) { - return new Aphront400Response(); - } - - if ($result['vers'] != DarkConsoleCore::STORAGE_VERSION) { - return new Aphront400Response(); - } - - if ($result['user'] != $user->getPHID()) { - return new Aphront400Response(); - } - - $output = array(); - $output['tabs'] = $result['tabs']; - $output['panel'] = array(); - - foreach ($result['data'] as $class => $data) { - try { - $obj = newv($class, array()); - $obj->setData($data); - $obj->setRequest($request); - - $panel = $obj->renderPanel(); - - if (!empty($_COOKIE['phsid'])) { - $panel = PhutilSafeHTML::applyFunction( - 'str_replace', - $_COOKIE['phsid'], - '(session-key)', - $panel); - } - - $output['panel'][$class] = $panel; - } catch (Exception $ex) { - $output['panel'][$class] = 'error'; - } - } - - return id(new AphrontAjaxResponse())->setContent($output); - } - -} diff --git a/src/aphront/console/plugin/DarkConsoleErrorLogPlugin.php b/src/aphront/console/plugin/DarkConsoleErrorLogPlugin.php deleted file mode 100644 index e0d3cd5f8e..0000000000 --- a/src/aphront/console/plugin/DarkConsoleErrorLogPlugin.php +++ /dev/null @@ -1,156 +0,0 @@ -getData()); - if ($count) { - return pht('Error Log (%d)', $count); - } - return pht('Error Log'); - } - - public function getOrder() { - return 0; - } - - public function getColor() { - if (count($this->getData())) { - return '#ff0000'; - } - return null; - } - - public function getDescription() { - return pht('Shows errors and warnings.'); - } - - public function generateData() { - return DarkConsoleErrorLogPluginAPI::getErrors(); - } - - public function renderPanel() { - $data = $this->getData(); - - $rows = array(); - $details = array(); - - foreach ($data as $index => $row) { - $file = $row['file']; - $line = $row['line']; - - $tag = phutil_tag( - 'a', - array( - 'onclick' => jsprintf('show_details(%d)', $index), - ), - $row['str'].' at ['.basename($file).':'.$line.']'); - $rows[] = array($tag); - - $details[] = hsprintf( - '
    '. - "%s\nStack trace:\n", - $index, - $row['details']); - - foreach ($row['trace'] as $key => $entry) { - $line = ''; - if (isset($entry['class'])) { - $line .= $entry['class'].'::'; - } - $line .= idx($entry, 'function', ''); - $href = null; - if (isset($entry['file'])) { - $line .= ' called at ['.$entry['file'].':'.$entry['line'].']'; - try { - $user = $this->getRequest()->getUser(); - $href = $user->loadEditorLink($entry['file'], $entry['line'], ''); - } catch (Exception $ex) { - // The database can be inaccessible. - } - } - - $details[] = phutil_tag( - 'a', - array( - 'href' => $href, - ), - $line); - $details[] = "\n"; - } - - $details[] = hsprintf('
    '); - } - - $table = new AphrontTableView($rows); - $table->setClassName('error-log'); - $table->setHeaders(array('Error')); - $table->setNoDataString('No errors.'); - - return hsprintf( - '
    '. - '
    %s
    '. - '
    %s
    '. - '
    ', - $table->render(), - phutil_implode_html('', $details)); - } -} - -/* - $data = $this->getData(); - if (!$data) { - return - -
    No errors.
    -
    ; - } - - $markup = ; - $alt = false; - foreach ($data as $error) { - $row = ; - - $text = $error['error']; - $text = preg_replace('/\(in .* on line \d+\)$/', '', trim($text)); - - $trace = $error['trace']; - $trace = explode("\n", $trace); - if (!$trace) { - $trace = array('unknown@0@unknown'); - } - - foreach ($trace as $idx => $traceline) { - list($file, $line, $where) = array_merge( - explode('@', $traceline), - array('?', '?', '?')); - if ($where == 'DarkConsole->addError' || - $where == 'debug_rlog') { - unset($trace[$idx]); - } - } - - $row->appendChild(); - - foreach ($trace as $traceline) { - list($file, $line, $where) = array_merge( - explode('@', $traceline), - array('?', '?', '?')); - $row->appendChild(); - $row->appendChild(); - $markup->appendChild($row); - $row = ; - } - - $alt = !$alt; - } - - return - -

    Errors

    -
    {$markup}
    -
    ; -*/ diff --git a/src/aphront/console/plugin/DarkConsoleEventPlugin.php b/src/aphront/console/plugin/DarkConsoleEventPlugin.php deleted file mode 100644 index 3b9236b4a2..0000000000 --- a/src/aphront/console/plugin/DarkConsoleEventPlugin.php +++ /dev/null @@ -1,98 +0,0 @@ -getAllListeners(); - foreach ($listeners as $key => $listener) { - $listeners[$key] = array( - 'id' => $listener->getListenerID(), - 'class' => get_class($listener), - ); - } - - $events = DarkConsoleEventPluginAPI::getEvents(); - foreach ($events as $key => $event) { - $events[$key] = array( - 'type' => $event->getType(), - 'stopped' => $event->isStopped(), - ); - } - - return array( - 'listeners' => $listeners, - 'events' => $events, - ); - } - - public function renderPanel() { - $data = $this->getData(); - - $out = array(); - - $out[] = hsprintf( - '
    '. - '

    Registered Event Listeners

    '. - '
    '); - - $rows = array(); - foreach ($data['listeners'] as $listener) { - $rows[] = array($listener['id'], $listener['class']); - } - - $table = new AphrontTableView($rows); - $table->setHeaders( - array( - 'Internal ID', - 'Listener Class', - )); - $table->setColumnClasses( - array( - '', - 'wide', - )); - - $out[] = $table->render(); - - $out[] = hsprintf( - '
    '. - '

    Event Log

    '. - '
    '); - - $rows = array(); - foreach ($data['events'] as $event) { - $rows[] = array( - $event['type'], - $event['stopped'] ? 'STOPPED' : null, - ); - } - - $table = new AphrontTableView($rows); - $table->setColumnClasses( - array( - 'wide', - )); - $table->setHeaders( - array( - 'Event Type', - 'Stopped', - )); - - $out[] = $table->render(); - - - return phutil_implode_html("\n", $out); - } -} diff --git a/src/aphront/console/plugin/DarkConsoleRequestPlugin.php b/src/aphront/console/plugin/DarkConsoleRequestPlugin.php deleted file mode 100644 index 5d43f93745..0000000000 --- a/src/aphront/console/plugin/DarkConsoleRequestPlugin.php +++ /dev/null @@ -1,78 +0,0 @@ - $_REQUEST, - 'Server' => $_SERVER, - ); - } - - public function renderPanel() { - $data = $this->getData(); - - $sections = array( - 'Basics' => array( - 'Machine' => php_uname('n'), - ), - ); - - // NOTE: This may not be present for some SAPIs, like php-fpm. - if (!empty($data['Server']['SERVER_ADDR'])) { - $addr = $data['Server']['SERVER_ADDR']; - $sections['Basics']['Host'] = $addr; - $sections['Basics']['Hostname'] = @gethostbyaddr($addr); - } - - $sections = array_merge($sections, $data); - - $mask = array( - 'HTTP_COOKIE' => true, - 'HTTP_X_PHABRICATOR_CSRF' => true, - ); - - $out = array(); - foreach ($sections as $header => $map) { - $rows = array(); - foreach ($map as $key => $value) { - if (isset($mask[$key])) { - $rows[] = array( - $key, - phutil_tag('em', array(), '(Masked)')); - } else { - $rows[] = array( - $key, - (is_array($value) ? json_encode($value) : $value), - ); - } - } - - $table = new AphrontTableView($rows); - $table->setHeaders( - array( - $header, - null, - )); - $table->setColumnClasses( - array( - 'header', - 'wide wrap', - )); - $out[] = $table->render(); - } - - return phutil_implode_html("\n", $out); - } -} diff --git a/src/aphront/console/plugin/DarkConsoleServicesPlugin.php b/src/aphront/console/plugin/DarkConsoleServicesPlugin.php deleted file mode 100644 index a43a83c785..0000000000 --- a/src/aphront/console/plugin/DarkConsoleServicesPlugin.php +++ /dev/null @@ -1,278 +0,0 @@ -getServiceCallLog(); - foreach ($log as $key => $entry) { - $config = idx($entry, 'config', array()); - unset($log[$key]['config']); - - if (empty($_REQUEST['__analyze__'])) { - $log[$key]['explain'] = array( - 'sev' => 7, - 'size' => null, - 'reason' => 'Disabled', - ); - // Query analysis is disabled for this request, so don't do any of it. - continue; - } - - if ($entry['type'] != 'query') { - continue; - } - - // For each SELECT query, go issue an EXPLAIN on it so we can flag stuff - // causing table scans, etc. - if (preg_match('/^\s*SELECT\b/i', $entry['query'])) { - $conn = PhabricatorEnv::newObjectFromConfig( - 'mysql.implementation', - array($entry['config'])); - try { - $explain = queryfx_all( - $conn, - 'EXPLAIN %Q', - $entry['query']); - - $badness = 0; - $size = 1; - $reason = null; - - foreach ($explain as $table) { - $size *= (int)$table['rows']; - - switch ($table['type']) { - case 'index': - $cur_badness = 1; - $cur_reason = 'Index'; - break; - case 'const': - $cur_badness = 1; - $cur_reason = 'Const'; - break; - case 'eq_ref'; - $cur_badness = 2; - $cur_reason = 'EqRef'; - break; - case 'range': - $cur_badness = 3; - $cur_reason = 'Range'; - break; - case 'ref': - $cur_badness = 3; - $cur_reason = 'Ref'; - break; - case 'fulltext': - $cur_badness = 3; - $cur_reason = 'Fulltext'; - break; - case 'ALL': - if (preg_match('/Using where/', $table['Extra'])) { - if ($table['rows'] < 256 && !empty($table['possible_keys'])) { - $cur_badness = 2; - $cur_reason = 'Small Table Scan'; - } else { - $cur_badness = 6; - $cur_reason = 'TABLE SCAN!'; - } - } else { - $cur_badness = 3; - $cur_reason = 'Whole Table'; - } - break; - default: - if (preg_match('/No tables used/i', $table['Extra'])) { - $cur_badness = 1; - $cur_reason = 'No Tables'; - } else if (preg_match('/Impossible/i', $table['Extra'])) { - $cur_badness = 1; - $cur_reason = 'Empty'; - } else { - $cur_badness = 4; - $cur_reason = "Can't Analyze"; - } - break; - } - - if ($cur_badness > $badness) { - $badness = $cur_badness; - $reason = $cur_reason; - } - } - - $log[$key]['explain'] = array( - 'sev' => $badness, - 'size' => $size, - 'reason' => $reason, - ); - } catch (Exception $ex) { - $log[$key]['explain'] = array( - 'sev' => 5, - 'size' => null, - 'reason' => $ex->getMessage(), - ); - } - } - } - - return array( - 'start' => PhabricatorStartup::getStartTime(), - 'end' => microtime(true), - 'log' => $log, - 'analyzeURI' => (string)$this - ->getRequestURI() - ->alter('__analyze__', true), - 'didAnalyze' => isset($_REQUEST['__analyze__']), - ); - } - - public function renderPanel() { - $data = $this->getData(); - - $log = $data['log']; - $results = array(); - - $results[] = hsprintf( - '
    '. - '%s'. - '

    Calls to External Services

    '. - '
    '. - '
    ', - phutil_tag( - 'a', - array( - 'href' => $data['analyzeURI'], - 'class' => $data['didAnalyze'] - ? 'disabled button' - : 'green button', - ), - 'Analyze Query Plans')); - - $page_total = $data['end'] - $data['start']; - $totals = array(); - $counts = array(); - - foreach ($log as $row) { - $totals[$row['type']] = idx($totals, $row['type'], 0) + $row['duration']; - $counts[$row['type']] = idx($counts, $row['type'], 0) + 1; - } - $totals['All Services'] = array_sum($totals); - $counts['All Services'] = array_sum($counts); - - $totals['Entire Page'] = $page_total; - $counts['Entire Page'] = 0; - - $summary = array(); - foreach ($totals as $type => $total) { - $summary[] = array( - $type, - number_format($counts[$type]), - number_format((int)(1000000 * $totals[$type])).' us', - sprintf('%.1f%%', 100 * $totals[$type] / $page_total), - ); - } - $summary_table = new AphrontTableView($summary); - $summary_table->setColumnClasses( - array( - '', - 'n', - 'n', - 'wide', - )); - $summary_table->setHeaders( - array( - 'Type', - 'Count', - 'Total Cost', - 'Page Weight', - )); - - $results[] = $summary_table->render(); - - $rows = array(); - foreach ($log as $row) { - - $analysis = null; - - switch ($row['type']) { - case 'query': - $info = $row['query']; - $info = wordwrap($info, 128, "\n", true); - - if (!empty($row['explain'])) { - $analysis = phutil_tag( - 'span', - array( - 'class' => 'explain-sev-'.$row['explain']['sev'], - ), - $row['explain']['reason']); - } - - break; - case 'connect': - $info = $row['host'].':'.$row['database']; - break; - case 'exec': - $info = $row['command']; - break; - case 'conduit': - $info = $row['method']; - break; - case 'http': - $info = $row['uri']; - break; - default: - $info = '-'; - break; - } - - $rows[] = array( - $row['type'], - '+'.number_format(1000 * ($row['begin'] - $data['start'])).' ms', - number_format(1000000 * $row['duration']).' us', - $info, - $analysis, - ); - } - - $table = new AphrontTableView($rows); - $table->setColumnClasses( - array( - null, - 'n', - 'n', - 'wide', - '', - )); - $table->setHeaders( - array( - 'Event', - 'Start', - 'Duration', - 'Details', - 'Analysis', - )); - - $results[] = $table->render(); - - return phutil_implode_html("\n", $results); - } -} - diff --git a/src/aphront/console/plugin/DarkConsoleXHProfPlugin.php b/src/aphront/console/plugin/DarkConsoleXHProfPlugin.php deleted file mode 100644 index db40e92e9d..0000000000 --- a/src/aphront/console/plugin/DarkConsoleXHProfPlugin.php +++ /dev/null @@ -1,107 +0,0 @@ -getData(); - if ($data['profileFilePHID']) { - return '#ff00ff'; - } - return null; - } - - public function getDescription() { - return 'Provides detailed PHP profiling information through XHProf.'; - } - - public function generateData() { - return array( - 'profileFilePHID' => $this->profileFilePHID, - 'profileURI' => (string)$this - ->getRequestURI() - ->alter('__profile__', 'page'), - ); - } - - public function getXHProfRunID() { - return $this->profileFilePHID; - } - - public function renderPanel() { - $data = $this->getData(); - - $run = $data['profileFilePHID']; - $profile_uri = $data['profileURI']; - - if (!DarkConsoleXHProfPluginAPI::isProfilerAvailable()) { - $href = PhabricatorEnv::getDoclink('article/Installation_Guide.html'); - $install_guide = phutil_tag( - 'a', - array( - 'href' => $href, - 'class' => 'bright-link', - ), - 'Installation Guide'); - return hsprintf( - '
    '. - 'The "xhprof" PHP extension is not available. Install xhprof '. - 'to enable the XHProf console plugin. You can find instructions in '. - 'the %s.'. - '
    ', - $install_guide); - } - - $result = array(); - - $header = hsprintf( - '
    '. - '%s'. - '

    XHProf Profiler

    '. - '
    ', - phutil_tag( - 'a', - array( - 'href' => $profile_uri, - 'class' => $run - ? 'disabled button' - : 'green button', - ), - 'Profile Page')); - $result[] = $header; - - if ($run) { - $result[] = hsprintf( - 'Profile Permalink'. - '', - $run, - $run); - } else { - $result[] = hsprintf( - '
    '. - 'Profiling was not enabled for this page. Use the button above '. - 'to enable it.'. - '
    '); - } - - return phutil_implode_html("\n", $result); - } - - - public function willShutdown() { - $this->profileFilePHID = DarkConsoleXHProfPluginAPI::getProfileFilePHID(); - } - -} diff --git a/src/aphront/exception/AphrontCSRFException.php b/src/aphront/exception/AphrontCSRFException.php deleted file mode 100644 index 58e00f0b61..0000000000 --- a/src/aphront/exception/AphrontCSRFException.php +++ /dev/null @@ -1,5 +0,0 @@ -title = $title; + $this->isUnlogged = $unlogged; + parent::__construct($message); + } + + public function getTitle() { + return $this->title; + } + + public function getIsUnlogged() { + return $this->isUnlogged; + } + +} diff --git a/src/aphront/exception/AphrontRedirectException.php b/src/aphront/exception/AphrontRedirectException.php deleted file mode 100644 index f7b2a5fd42..0000000000 --- a/src/aphront/exception/AphrontRedirectException.php +++ /dev/null @@ -1,18 +0,0 @@ -uri = $uri; - } - - public function getURI() { - return $this->uri; - } - -} diff --git a/src/aphront/exception/AphrontUsageException.php b/src/aphront/exception/AphrontUsageException.php deleted file mode 100644 index d242b56dea..0000000000 --- a/src/aphront/exception/AphrontUsageException.php +++ /dev/null @@ -1,21 +0,0 @@ -title = $title; - parent::__construct($message); - } - - public function getTitle() { - return $this->title; - } - -} diff --git a/src/aphront/handler/AphrontRequestExceptionHandler.php b/src/aphront/handler/AphrontRequestExceptionHandler.php new file mode 100644 index 0000000000..e626f53cc6 --- /dev/null +++ b/src/aphront/handler/AphrontRequestExceptionHandler.php @@ -0,0 +1,30 @@ +setAncestorClass(__CLASS__) + ->setSortMethod('getRequestExceptionHandlerPriority') + ->execute(); + } + +} diff --git a/src/aphront/handler/PhabricatorAjaxRequestExceptionHandler.php b/src/aphront/handler/PhabricatorAjaxRequestExceptionHandler.php new file mode 100644 index 0000000000..d519c83fb5 --- /dev/null +++ b/src/aphront/handler/PhabricatorAjaxRequestExceptionHandler.php @@ -0,0 +1,39 @@ +isAjax() && !$request->isWorkflow()); + } + + public function handleRequestThrowable( + AphrontRequest $request, + $throwable) { + + // Log these; they don't get shown on the client and can be difficult + // to debug. + phlog($throwable); + + $response = new AphrontAjaxResponse(); + $response->setError( + array( + 'code' => get_class($throwable), + 'info' => $throwable->getMessage(), + )); + + return $response; + } + +} diff --git a/src/aphront/handler/PhabricatorConduitRequestExceptionHandler.php b/src/aphront/handler/PhabricatorConduitRequestExceptionHandler.php new file mode 100644 index 0000000000..db8a5d5ecc --- /dev/null +++ b/src/aphront/handler/PhabricatorConduitRequestExceptionHandler.php @@ -0,0 +1,33 @@ +isConduit(); + } + + public function handleRequestThrowable( + AphrontRequest $request, + $throwable) { + + $response = id(new ConduitAPIResponse()) + ->setErrorCode(get_class($throwable)) + ->setErrorInfo($throwable->getMessage()); + + return id(new AphrontJSONResponse()) + ->setAddJSONShield(false) + ->setContent($response->toDictionary()); + } + +} diff --git a/src/aphront/handler/PhabricatorDefaultRequestExceptionHandler.php b/src/aphront/handler/PhabricatorDefaultRequestExceptionHandler.php new file mode 100644 index 0000000000..b13100b05d --- /dev/null +++ b/src/aphront/handler/PhabricatorDefaultRequestExceptionHandler.php @@ -0,0 +1,86 @@ +isPhabricatorSite($request)) { + return false; + } + + return true; + } + + public function handleRequestThrowable( + AphrontRequest $request, + $throwable) { + + $viewer = $this->getViewer($request); + + // Some types of uninteresting request exceptions don't get logged, usually + // because they are caused by the background radiation of bot traffic on + // the internet. These include requests with bad CSRF tokens and + // questionable "Host" headers. + $should_log = true; + if ($throwable instanceof AphrontMalformedRequestException) { + $should_log = !$throwable->getIsUnlogged(); + } + + if ($should_log) { + phlog($throwable); + } + + $class = get_class($throwable); + $message = $throwable->getMessage(); + + if ($throwable instanceof AphrontSchemaQueryException) { + $message .= "\n\n".pht( + "NOTE: This usually indicates that the MySQL schema has not been ". + "properly upgraded. Run '%s' to ensure your schema is up to date.", + 'bin/storage upgrade'); + } + + if (PhabricatorEnv::getEnvConfig('phabricator.developer-mode')) { + $trace = id(new AphrontStackTraceView()) + ->setUser($viewer) + ->setTrace($throwable->getTrace()); + } else { + $trace = null; + } + + $content = phutil_tag( + 'div', + array('class' => 'aphront-unhandled-exception'), + array( + phutil_tag('div', array('class' => 'exception-message'), $message), + $trace, + )); + + $dialog = new AphrontDialogView(); + $dialog + ->setTitle(pht('Unhandled Exception ("%s")', $class)) + ->setClass('aphront-exception-dialog') + ->setUser($viewer) + ->appendChild($content); + + if ($request->isAjax()) { + $dialog->addCancelButton('/', pht('Close')); + } + + return id(new AphrontDialogResponse()) + ->setDialog($dialog) + ->setHTTPResponseCode(500); + } + +} diff --git a/src/aphront/handler/PhabricatorHighSecurityRequestExceptionHandler.php b/src/aphront/handler/PhabricatorHighSecurityRequestExceptionHandler.php new file mode 100644 index 0000000000..5d1d923d0c --- /dev/null +++ b/src/aphront/handler/PhabricatorHighSecurityRequestExceptionHandler.php @@ -0,0 +1,133 @@ +isPhabricatorSite($request)) { + return false; + } + + return ($throwable instanceof PhabricatorAuthHighSecurityRequiredException); + } + + public function handleRequestThrowable( + AphrontRequest $request, + $throwable) { + + $viewer = $this->getViewer($request); + $results = $throwable->getFactorValidationResults(); + + $form = id(new PhabricatorAuthSessionEngine())->renderHighSecurityForm( + $throwable->getFactors(), + $results, + $viewer, + $request); + + $is_wait = false; + $is_continue = false; + foreach ($results as $result) { + if ($result->getIsWait()) { + $is_wait = true; + } + + if ($result->getIsContinue()) { + $is_continue = true; + } + } + + $is_upgrade = $throwable->getIsSessionUpgrade(); + + if ($is_upgrade) { + $title = pht('Enter High Security'); + } else { + $title = pht('Provide MFA Credentials'); + } + + if ($is_wait) { + $submit = pht('Wait Patiently'); + } else if ($is_upgrade && !$is_continue) { + $submit = pht('Enter High Security'); + } else { + $submit = pht('Continue'); + } + + $dialog = id(new AphrontDialogView()) + ->setUser($viewer) + ->setTitle($title) + ->setShortTitle(pht('Security Checkpoint')) + ->setWidth(AphrontDialogView::WIDTH_FORM) + ->addHiddenInput(AphrontRequest::TYPE_HISEC, true) + ->setSubmitURI($request->getPath()) + ->addCancelButton($throwable->getCancelURI()) + ->addSubmitButton($submit); + + $form_layout = $form->buildLayoutView(); + + if ($is_upgrade) { + $message = pht( + 'You are taking an action which requires you to enter '. + 'high security.'); + + $info_view = id(new PHUIInfoView()) + ->setSeverity(PHUIInfoView::SEVERITY_MFA) + ->setErrors(array($message)); + + $dialog + ->appendChild($info_view) + ->appendParagraph( + pht( + 'To enter high security mode, confirm your credentials:')) + ->appendChild($form_layout) + ->appendParagraph( + pht( + 'Your account will remain in high security mode for a short '. + 'period of time. When you are finished taking sensitive '. + 'actions, you should leave high security.')); + } else { + $message = pht( + 'You are taking an action which requires you to provide '. + 'multi-factor credentials.'); + + $info_view = id(new PHUIInfoView()) + ->setSeverity(PHUIInfoView::SEVERITY_MFA) + ->setErrors(array($message)); + + $dialog + ->appendChild($info_view) + ->setErrors( + array( + )) + ->appendChild($form_layout); + } + + $request_parameters = $request->getPassthroughRequestParameters( + $respect_quicksand = true); + foreach ($request_parameters as $key => $value) { + $dialog->addHiddenInput($key, $value); + } + + // See T13289. If the user hit a "some transactions have no effect" dialog + // and elected to continue, we want to pass that flag through the MFA + // dialog even though it is not normally a passthrough request parameter. + if ($request->isContinueRequest()) { + $dialog->addHiddenInput(AphrontRequest::TYPE_CONTINUE, 1); + } + + return $dialog; + } + +} diff --git a/src/aphront/handler/PhabricatorPolicyRequestExceptionHandler.php b/src/aphront/handler/PhabricatorPolicyRequestExceptionHandler.php new file mode 100644 index 0000000000..442cb08f66 --- /dev/null +++ b/src/aphront/handler/PhabricatorPolicyRequestExceptionHandler.php @@ -0,0 +1,107 @@ +isPhabricatorSite($request)) { + return false; + } + + return ($throwable instanceof PhabricatorPolicyException); + } + + public function handleRequestThrowable( + AphrontRequest $request, + $throwable) { + + $viewer = $this->getViewer($request); + + if (!$viewer->isLoggedIn()) { + // If the user isn't logged in, just give them a login form. This is + // probably a generally more useful response than a policy dialog that + // they have to click through to get a login form. + // + // Possibly we should add a header here like "you need to login to see + // the thing you are trying to look at". + $auth_app_class = 'PhabricatorAuthApplication'; + $auth_app = PhabricatorApplication::getByClass($auth_app_class); + + return id(new PhabricatorAuthStartController()) + ->setRequest($request) + ->setCurrentApplication($auth_app) + ->handleRequest($request); + } + + $content = array( + phutil_tag( + 'div', + array( + 'class' => 'aphront-policy-rejection', + ), + $throwable->getRejection()), + ); + + $list = null; + if ($throwable->getCapabilityName()) { + $list = $throwable->getMoreInfo(); + foreach ($list as $key => $item) { + $list[$key] = $item; + } + + $content[] = phutil_tag( + 'div', + array( + 'class' => 'aphront-capability-details', + ), + pht( + 'Users with the "%s" capability:', + $throwable->getCapabilityName())); + + } + + $dialog = id(new AphrontDialogView()) + ->setTitle($throwable->getTitle()) + ->setClass('aphront-access-dialog') + ->setUser($viewer) + ->appendChild($content); + + if ($list) { + $dialog->appendList($list); + } + + // If the install is in developer mode, include a stack trace for the + // exception. When debugging things, it isn't always obvious where a + // policy exception came from and this can make it easier to hunt down + // bugs or improve ambiguous/confusing messaging. + + $is_developer = PhabricatorEnv::getEnvConfig('phabricator.developer-mode'); + if ($is_developer) { + $dialog->appendChild( + id(new AphrontStackTraceView()) + ->setTrace($throwable->getTrace())); + } + + if ($request->isAjax()) { + $dialog->addCancelButton('/', pht('Close')); + } else { + $dialog->addCancelButton('/', pht('OK')); + } + + return $dialog; + } + +} diff --git a/src/aphront/handler/PhabricatorRateLimitRequestExceptionHandler.php b/src/aphront/handler/PhabricatorRateLimitRequestExceptionHandler.php new file mode 100644 index 0000000000..78dad564b4 --- /dev/null +++ b/src/aphront/handler/PhabricatorRateLimitRequestExceptionHandler.php @@ -0,0 +1,42 @@ +isPhabricatorSite($request)) { + return false; + } + + return ($throwable instanceof PhabricatorSystemActionRateLimitException); + } + + public function handleRequestThrowable( + AphrontRequest $request, + $throwable) { + + $viewer = $this->getViewer($request); + + return id(new AphrontDialogView()) + ->setTitle(pht('Slow Down!')) + ->setUser($viewer) + ->setErrors(array(pht('You are being rate limited.'))) + ->appendParagraph($throwable->getMessage()) + ->appendParagraph($throwable->getRateExplanation()) + ->addCancelButton('/', pht('Okaaaaaaaaaaaaaay...')); + } + +} diff --git a/src/aphront/handler/PhabricatorRequestExceptionHandler.php b/src/aphront/handler/PhabricatorRequestExceptionHandler.php new file mode 100644 index 0000000000..81e21b9107 --- /dev/null +++ b/src/aphront/handler/PhabricatorRequestExceptionHandler.php @@ -0,0 +1,26 @@ +getSite(); + if (!$site) { + return false; + } + + return ($site instanceof PhabricatorSite); + } + + protected function getViewer(AphrontRequest $request) { + $viewer = $request->getUser(); + + if ($viewer) { + return $viewer; + } + + // If we hit an exception very early, we won't have a user yet. + return new PhabricatorUser(); + } + +} diff --git a/src/aphront/headerparser/AphrontHTTPHeaderParser.php b/src/aphront/headerparser/AphrontHTTPHeaderParser.php new file mode 100644 index 0000000000..cc55520949 --- /dev/null +++ b/src/aphront/headerparser/AphrontHTTPHeaderParser.php @@ -0,0 +1,150 @@ +name = null; + $this->content = null; + + $parts = explode(':', $raw_header, 2); + $this->name = trim($parts[0]); + if (count($parts) > 1) { + $this->content = trim($parts[1]); + } + + $this->pairs = null; + + return $this; + } + + public function getHeaderName() { + $this->requireParse(); + return $this->name; + } + + public function getHeaderContent() { + $this->requireParse(); + return $this->content; + } + + public function getHeaderContentAsPairs() { + $content = $this->getHeaderContent(); + + + $state = 'prekey'; + $length = strlen($content); + + $pair_name = null; + $pair_value = null; + + $pairs = array(); + $ii = 0; + while ($ii < $length) { + $c = $content[$ii]; + + switch ($state) { + case 'prekey'; + // We're eating space in front of a key. + if ($c == ' ') { + $ii++; + break; + } + $pair_name = ''; + $state = 'key'; + break; + case 'key'; + // We're parsing a key name until we find "=" or ";". + if ($c == ';') { + $state = 'done'; + break; + } + + if ($c == '=') { + $ii++; + $state = 'value'; + break; + } + + $ii++; + $pair_name .= $c; + break; + case 'value': + // We found an "=", so now figure out if the value is quoted + // or not. + if ($c == '"') { + $ii++; + $state = 'quoted'; + break; + } + $state = 'unquoted'; + break; + case 'quoted': + // We're in a quoted string, parse until we find the closing quote. + if ($c == '"') { + $ii++; + $state = 'done'; + break; + } + + $ii++; + $pair_value .= $c; + break; + case 'unquoted': + // We're in an unquoted string, parse until we find a space or a + // semicolon. + if ($c == ' ' || $c == ';') { + $state = 'done'; + break; + } + $ii++; + $pair_value .= $c; + break; + case 'done': + // We parsed something, so eat any trailing whitespace and semicolons + // and look for a new value. + if ($c == ' ' || $c == ';') { + $ii++; + break; + } + + $pairs[] = array( + $pair_name, + $pair_value, + ); + + $pair_name = null; + $pair_value = null; + + $state = 'prekey'; + break; + } + } + + if ($state == 'quoted') { + throw new Exception( + pht( + 'Header has unterminated double quote for key "%s".', + $pair_name)); + } + + if ($pair_name !== null) { + $pairs[] = array( + $pair_name, + $pair_value, + ); + } + + return $pairs; + } + + private function requireParse() { + if ($this->name === null) { + throw new PhutilInvalidStateException('parseRawHeader'); + } + } + +} diff --git a/src/aphront/headerparser/__tests__/AphrontHTTPHeaderParserTestCase.php b/src/aphront/headerparser/__tests__/AphrontHTTPHeaderParserTestCase.php new file mode 100644 index 0000000000..b26f1c1a6f --- /dev/null +++ b/src/aphront/headerparser/__tests__/AphrontHTTPHeaderParserTestCase.php @@ -0,0 +1,108 @@ +parseRawHeader($input); + + $actual_name = $parser->getHeaderName(); + $actual_content = $parser->getHeaderContent(); + + $this->assertEqual( + $expect_name, + $actual_name, + pht('Header name for: %s', $input)); + + $this->assertEqual( + $expect_content, + $actual_content, + pht('Header content for: %s', $input)); + + if (isset($case[3])) { + $expect_pairs = $case[3]; + + $caught = null; + try { + $actual_pairs = $parser->getHeaderContentAsPairs(); + } catch (Exception $ex) { + $caught = $ex; + } + + if ($expect_pairs === false) { + $this->assertEqual( + true, + ($caught instanceof Exception), + pht('Expect exception for header pairs of: %s', $input)); + } else { + $this->assertEqual( + $expect_pairs, + $actual_pairs, + pht('Header pairs for: %s', $input)); + } + } + } + } + + +} diff --git a/src/aphront/httpparametertype/AphrontBoolHTTPParameterType.php b/src/aphront/httpparametertype/AphrontBoolHTTPParameterType.php new file mode 100644 index 0000000000..43aec72a56 --- /dev/null +++ b/src/aphront/httpparametertype/AphrontBoolHTTPParameterType.php @@ -0,0 +1,46 @@ +getExists($key)) { + return true; + } + + $checkbox_key = $this->getCheckboxKey($key); + if ($request->getExists($checkbox_key)) { + return true; + } + + return false; + } + + protected function getParameterValue(AphrontRequest $request, $key) { + return (bool)$request->getBool($key); + } + + protected function getParameterTypeName() { + return 'bool'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('A boolean value (true or false).'), + ); + } + + protected function getParameterExamples() { + return array( + 'v=true', + 'v=false', + 'v=1', + 'v=0', + ); + } + + public function getCheckboxKey($key) { + return "{$key}.exists"; + } + +} diff --git a/src/aphront/httpparametertype/AphrontEpochHTTPParameterType.php b/src/aphront/httpparametertype/AphrontEpochHTTPParameterType.php new file mode 100644 index 0000000000..1b74d8f736 --- /dev/null +++ b/src/aphront/httpparametertype/AphrontEpochHTTPParameterType.php @@ -0,0 +1,54 @@ +allowNull = $allow_null; + return $this; + } + + public function getAllowNull() { + return $this->allowNull; + } + + protected function getParameterExists(AphrontRequest $request, $key) { + return $request->getExists($key) || + $request->getExists($key.'_d'); + } + + protected function getParameterValue(AphrontRequest $request, $key) { + $value = AphrontFormDateControlValue::newFromRequest($request, $key); + + if ($this->getAllowNull()) { + $value->setOptional(true); + } + + return $value; + } + + protected function getParameterTypeName() { + return 'epoch'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('An epoch timestamp, as an integer.'), + pht('An absolute date, as a string.'), + pht('A relative date, as a string.'), + pht('Separate date and time inputs, as strings.'), + ); + } + + protected function getParameterExamples() { + return array( + 'v=1460050737', + 'v=2022-01-01', + 'v=yesterday', + 'v_d=2022-01-01&v_t=12:34', + ); + } + +} diff --git a/src/aphront/httpparametertype/AphrontFileHTTPParameterType.php b/src/aphront/httpparametertype/AphrontFileHTTPParameterType.php new file mode 100644 index 0000000000..c2e5f47f8f --- /dev/null +++ b/src/aphront/httpparametertype/AphrontFileHTTPParameterType.php @@ -0,0 +1,68 @@ +getFileKey($key); + $default_key = $this->getDefaultKey($key); + + return $request->getExists($key) || + $request->getFileExists($file_key) || + $request->getExists($default_key); + } + + protected function getParameterValue(AphrontRequest $request, $key) { + $value = $request->getStrList($key); + if ($value) { + return head($value); + } + + // NOTE: At least for now, we'll attempt to read a direct upload if we + // miss on a PHID. Currently, PHUIFormFileControl does a client-side + // upload on workflow forms (which is good) but doesn't have a hook for + // non-workflow forms (which isn't as good). Giving it a hook is desirable, + // but complicated. Even if we do hook it, it may be reasonable to keep + // this code around as a fallback if the client-side JS goes awry. + + $file_key = $this->getFileKey($key); + $default_key = $this->getDefaultKey($key); + if (!$request->getFileExists($file_key)) { + return $request->getStr($default_key); + } + + $viewer = $this->getViewer(); + $file = PhabricatorFile::newFromPHPUpload( + idx($_FILES, $file_key), + array( + 'authorPHID' => $viewer->getPHID(), + 'viewPolicy' => PhabricatorPolicies::POLICY_NOONE, + )); + return $file->getPHID(); + } + + protected function getParameterTypeName() { + return 'file'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('A file PHID.'), + ); + } + + protected function getParameterExamples() { + return array( + 'v=PHID-FILE-wxyz', + ); + } + +} diff --git a/src/aphront/httpparametertype/AphrontHTTPParameterType.php b/src/aphront/httpparametertype/AphrontHTTPParameterType.php new file mode 100644 index 0000000000..78a62a663c --- /dev/null +++ b/src/aphront/httpparametertype/AphrontHTTPParameterType.php @@ -0,0 +1,309 @@ +viewer = $viewer; + return $this; + } + + + /** + * Get the current viewer. + * + * @return PhabricatorUser Current viewer. + * @task read + */ + final public function getViewer() { + if (!$this->viewer) { + throw new PhutilInvalidStateException('setViewer'); + } + return $this->viewer; + } + + + /** + * Test if a value is present in a request. + * + * @param AphrontRequest The incoming request. + * @param string The key to examine. + * @return bool True if a readable value is present in the request. + * @task read + */ + final public function getExists(AphrontRequest $request, $key) { + return $this->getParameterExists($request, $key); + } + + + /** + * Read a value from a request. + * + * If the value is not present, a default value is returned (usually `null`). + * Use @{method:getExists} to test if a value is present. + * + * @param AphrontRequest The incoming request. + * @param string The key to examine. + * @return wild Value, or default if value is not present. + * @task read + */ + final public function getValue(AphrontRequest $request, $key) { + + if (!$this->getExists($request, $key)) { + return $this->getParameterDefault(); + } + + return $this->getParameterValue($request, $key); + } + + + /** + * Get the default value for this parameter type. + * + * @return wild Default value for this type. + * @task read + */ + final public function getDefaultValue() { + return $this->getParameterDefault(); + } + + +/* -( Information About the Type )----------------------------------------- */ + + + /** + * Get a short name for this type, like `string` or `list`. + * + * @return string Short type name. + * @task info + */ + final public function getTypeName() { + return $this->getParameterTypeName(); + } + + + /** + * Get a list of human-readable descriptions of acceptable formats for this + * type. + * + * For example, a type might return strings like these: + * + * > Any positive integer. + * > A comma-separated list of PHIDs. + * + * This is used to explain to users how to specify a type when generating + * documentation. + * + * @return list Human-readable list of acceptable formats. + * @task info + */ + final public function getFormatDescriptions() { + return $this->getParameterFormatDescriptions(); + } + + + /** + * Get a list of human-readable examples of how to format this type as an + * HTTP GET parameter. + * + * For example, a type might return strings like these: + * + * > v=123 + * > v[]=1&v[]=2 + * + * This is used to show users how to specify parameters of this type in + * generated documentation. + * + * @return list Human-readable list of format examples. + * @task info + */ + final public function getExamples() { + return $this->getParameterExamples(); + } + + +/* -( Utilities )---------------------------------------------------------- */ + + + /** + * Call another type's existence check. + * + * This method allows a type to reuse the existence behavior of a different + * type. For example, a "list of users" type may have the same basic + * existence check that a simpler "list of strings" type has, and can just + * call the simpler type to reuse its behavior. + * + * @param AphrontHTTPParameterType The other type. + * @param AphrontRequest Incoming request. + * @param string Key to examine. + * @return bool True if the parameter exists. + * @task util + */ + final protected function getExistsWithType( + AphrontHTTPParameterType $type, + AphrontRequest $request, + $key) { + + $type->setViewer($this->getViewer()); + + return $type->getParameterExists($request, $key); + } + + + /** + * Call another type's value parser. + * + * This method allows a type to reuse the parsing behavior of a different + * type. For example, a "list of users" type may start by running the same + * basic parsing that a simpler "list of strings" type does. + * + * @param AphrontHTTPParameterType The other type. + * @param AphrontRequest Incoming request. + * @param string Key to examine. + * @return wild Parsed value. + * @task util + */ + final protected function getValueWithType( + AphrontHTTPParameterType $type, + AphrontRequest $request, + $key) { + + $type->setViewer($this->getViewer()); + + return $type->getValue($request, $key); + } + + + /** + * Get a list of all available parameter types. + * + * @return list List of all available types. + * @task util + */ + final public static function getAllTypes() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->setUniqueMethod('getTypeName') + ->setSortMethod('getTypeName') + ->execute(); + } + + +/* -( Implementation )----------------------------------------------------- */ + + + /** + * Test if a parameter exists in a request. + * + * See @{method:getExists}. By default, this method tests if the key is + * present in the request. + * + * To call another type's behavior in order to perform this check, use + * @{method:getExistsWithType}. + * + * @param AphrontRequest The incoming request. + * @param string The key to examine. + * @return bool True if a readable value is present in the request. + * @task impl + */ + protected function getParameterExists(AphrontRequest $request, $key) { + return $request->getExists($key); + } + + + /** + * Parse a value from a request. + * + * See @{method:getValue}. This method will //only// be called if this type + * has already asserted that the value exists with + * @{method:getParameterExists}. + * + * To call another type's behavior in order to parse a value, use + * @{method:getValueWithType}. + * + * @param AphrontRequest The incoming request. + * @param string The key to examine. + * @return wild Parsed value. + * @task impl + */ + abstract protected function getParameterValue(AphrontRequest $request, $key); + + + /** + * Return a simple type name string, like "string" or "list". + * + * See @{method:getTypeName}. + * + * @return string Short type name. + * @task impl + */ + abstract protected function getParameterTypeName(); + + + /** + * Return a human-readable list of format descriptions. + * + * See @{method:getFormatDescriptions}. + * + * @return list Human-readable list of acceptable formats. + * @task impl + */ + abstract protected function getParameterFormatDescriptions(); + + + /** + * Return a human-readable list of examples. + * + * See @{method:getExamples}. + * + * @return list Human-readable list of format examples. + * @task impl + */ + abstract protected function getParameterExamples(); + + + /** + * Return the default value for this parameter type. + * + * See @{method:getDefaultValue}. If unspecified, the default is `null`. + * + * @return wild Default value. + * @task impl + */ + protected function getParameterDefault() { + return null; + } + +} diff --git a/src/aphront/httpparametertype/AphrontIntHTTPParameterType.php b/src/aphront/httpparametertype/AphrontIntHTTPParameterType.php new file mode 100644 index 0000000000..e32614da02 --- /dev/null +++ b/src/aphront/httpparametertype/AphrontIntHTTPParameterType.php @@ -0,0 +1,26 @@ +getInt($key); + } + + protected function getParameterTypeName() { + return 'int'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('An integer.'), + ); + } + + protected function getParameterExamples() { + return array( + 'v=123', + ); + } + +} diff --git a/src/aphront/httpparametertype/AphrontJSONHTTPParameterType.php b/src/aphront/httpparametertype/AphrontJSONHTTPParameterType.php new file mode 100644 index 0000000000..3a1081bd75 --- /dev/null +++ b/src/aphront/httpparametertype/AphrontJSONHTTPParameterType.php @@ -0,0 +1,31 @@ +getStr($key); + return phutil_json_decode($str); + } + + protected function getParameterTypeName() { + return 'string (json object)'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('A JSON-encoded object.'), + ); + } + + protected function getParameterExamples() { + return array( + 'v={...}', + ); + } + +} diff --git a/src/aphront/httpparametertype/AphrontListHTTPParameterType.php b/src/aphront/httpparametertype/AphrontListHTTPParameterType.php new file mode 100644 index 0000000000..af972d0f29 --- /dev/null +++ b/src/aphront/httpparametertype/AphrontListHTTPParameterType.php @@ -0,0 +1,10 @@ +getStr($key); + } + + protected function getParameterTypeName() { + return 'phid'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('A single object PHID.'), + ); + } + + protected function getParameterExamples() { + return array( + 'v=PHID-XXXX-1111', + ); + } + +} diff --git a/src/aphront/httpparametertype/AphrontPHIDListHTTPParameterType.php b/src/aphront/httpparametertype/AphrontPHIDListHTTPParameterType.php new file mode 100644 index 0000000000..f41aaa9f46 --- /dev/null +++ b/src/aphront/httpparametertype/AphrontPHIDListHTTPParameterType.php @@ -0,0 +1,30 @@ +getValueWithType($type, $request, $key); + } + + protected function getParameterTypeName() { + return 'list'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('Comma-separated list of PHIDs.'), + pht('List of PHIDs, as array.'), + ); + } + + protected function getParameterExamples() { + return array( + 'v=PHID-XXXX-1111', + 'v=PHID-XXXX-1111,PHID-XXXX-2222', + 'v[]=PHID-XXXX-1111&v[]=PHID-XXXX-2222', + ); + } + +} diff --git a/src/aphront/httpparametertype/AphrontProjectListHTTPParameterType.php b/src/aphront/httpparametertype/AphrontProjectListHTTPParameterType.php new file mode 100644 index 0000000000..e4633796fe --- /dev/null +++ b/src/aphront/httpparametertype/AphrontProjectListHTTPParameterType.php @@ -0,0 +1,42 @@ +getValueWithType($type, $request, $key); + + return id(new PhabricatorProjectPHIDResolver()) + ->setViewer($this->getViewer()) + ->resolvePHIDs($list); + } + + protected function getParameterTypeName() { + return 'list'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('Comma-separated list of project PHIDs.'), + pht('List of project PHIDs, as array.'), + pht('Comma-separated list of project hashtags.'), + pht('List of project hashtags, as array.'), + pht('Mixture of hashtags and PHIDs.'), + ); + } + + protected function getParameterExamples() { + return array( + 'v=PHID-PROJ-1111', + 'v=PHID-PROJ-1111,PHID-PROJ-2222', + 'v=hashtag', + 'v=frontend,backend', + 'v[]=PHID-PROJ-1111&v[]=PHID-PROJ-2222', + 'v[]=frontend&v[]=backend', + 'v=PHID-PROJ-1111,frontend', + 'v[]=PHID-PROJ-1111&v[]=backend', + ); + } + +} diff --git a/src/aphront/httpparametertype/AphrontRemarkupHTTPParameterType.php b/src/aphront/httpparametertype/AphrontRemarkupHTTPParameterType.php new file mode 100644 index 0000000000..7970878f49 --- /dev/null +++ b/src/aphront/httpparametertype/AphrontRemarkupHTTPParameterType.php @@ -0,0 +1,50 @@ +newRemarkupValue(); + } + + protected function getParameterValue(AphrontRequest $request, $key) { + $corpus_key = $key; + $corpus_type = new AphrontStringHTTPParameterType(); + $corpus_value = $this->getValueWithType( + $corpus_type, + $request, + $corpus_key); + + $metadata_key = $key.'_metadata'; + $metadata_type = new AphrontJSONHTTPParameterType(); + $metadata_value = $this->getValueWithType( + $metadata_type, + $request, + $metadata_key); + + return $this->newRemarkupValue() + ->setCorpus($corpus_value) + ->setMetadata($metadata_value); + } + + protected function getParameterTypeName() { + return 'string (remarkup)'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('Remarkup text.'), + ); + } + + protected function getParameterExamples() { + return array( + 'v=Lorem...', + ); + } + + private function newRemarkupValue() { + return new RemarkupValue(); + } + +} diff --git a/src/aphront/httpparametertype/AphrontSelectHTTPParameterType.php b/src/aphront/httpparametertype/AphrontSelectHTTPParameterType.php new file mode 100644 index 0000000000..017900666c --- /dev/null +++ b/src/aphront/httpparametertype/AphrontSelectHTTPParameterType.php @@ -0,0 +1,26 @@ +getStr($key); + } + + protected function getParameterTypeName() { + return 'select'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('A single value from the allowed set.'), + ); + } + + protected function getParameterExamples() { + return array( + 'v=value', + ); + } + +} diff --git a/src/aphront/httpparametertype/AphrontStringHTTPParameterType.php b/src/aphront/httpparametertype/AphrontStringHTTPParameterType.php new file mode 100644 index 0000000000..ebcc21cb1e --- /dev/null +++ b/src/aphront/httpparametertype/AphrontStringHTTPParameterType.php @@ -0,0 +1,27 @@ +getStr($key); + } + + protected function getParameterTypeName() { + return 'string'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('A URL-encoded string.'), + ); + } + + protected function getParameterExamples() { + return array( + 'v=simple', + 'v=properly%20escaped%20text', + ); + } + +} diff --git a/src/aphront/httpparametertype/AphrontStringListHTTPParameterType.php b/src/aphront/httpparametertype/AphrontStringListHTTPParameterType.php new file mode 100644 index 0000000000..7212b124d8 --- /dev/null +++ b/src/aphront/httpparametertype/AphrontStringListHTTPParameterType.php @@ -0,0 +1,38 @@ +getArr($key, null); + + if ($list === null) { + $list = $request->getStrList($key); + } + + return $list; + } + + protected function getParameterDefault() { + return array(); + } + + protected function getParameterTypeName() { + return 'list'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('Comma-separated list of strings.'), + pht('List of strings, as array.'), + ); + } + + protected function getParameterExamples() { + return array( + 'v=cat,dog,pig', + 'v[]=cat&v[]=dog', + ); + } + +} diff --git a/src/aphront/httpparametertype/AphrontUserListHTTPParameterType.php b/src/aphront/httpparametertype/AphrontUserListHTTPParameterType.php new file mode 100644 index 0000000000..9599ea49e1 --- /dev/null +++ b/src/aphront/httpparametertype/AphrontUserListHTTPParameterType.php @@ -0,0 +1,42 @@ +getValueWithType($type, $request, $key); + + return id(new PhabricatorUserPHIDResolver()) + ->setViewer($this->getViewer()) + ->resolvePHIDs($list); + } + + protected function getParameterTypeName() { + return 'list'; + } + + protected function getParameterFormatDescriptions() { + return array( + pht('Comma-separated list of user PHIDs.'), + pht('List of user PHIDs, as array.'), + pht('Comma-separated list of usernames.'), + pht('List of usernames, as array.'), + pht('Mixture of usernames and PHIDs.'), + ); + } + + protected function getParameterExamples() { + return array( + 'v=PHID-USER-1111', + 'v=PHID-USER-1111,PHID-USER-2222', + 'v=username', + 'v=alincoln,htaft', + 'v[]=PHID-USER-1111&v[]=PHID-USER-2222', + 'v[]=htaft&v[]=alincoln', + 'v=PHID-USER-1111,alincoln', + 'v[]=PHID-USER-1111&v[]=htaft', + ); + } + +} diff --git a/src/aphront/interface/AphrontResponseProducerInterface.php b/src/aphront/interface/AphrontResponseProducerInterface.php new file mode 100644 index 0000000000..84eba28b35 --- /dev/null +++ b/src/aphront/interface/AphrontResponseProducerInterface.php @@ -0,0 +1,24 @@ +contentType = $content_type; + return $this; + } + + public function getContentType() { + return $this->contentType; + } + + public function beginParse() { + $content_type = $this->getContentType(); + if ($content_type === null) { + throw new PhutilInvalidStateException('setContentType'); + } + + if (!preg_match('(^multipart/form-data)', $content_type)) { + throw new Exception( + pht( + 'Expected "multipart/form-data" content type when executing a '. + 'multipart body read.')); + } + + $type_parts = preg_split('(\s*;\s*)', $content_type); + $boundary = null; + foreach ($type_parts as $type_part) { + $matches = null; + if (preg_match('(^boundary=(.*))', $type_part, $matches)) { + $boundary = $matches[1]; + break; + } + } + + if ($boundary === null) { + throw new Exception( + pht('Received "multipart/form-data" request with no "boundary".')); + } + + $this->parts = array(); + $this->part = null; + + $this->buffer = ''; + $this->boundary = $boundary; + + // We're looking for a (usually empty) body before the first boundary. + $this->state = 'bodynewline'; + } + + public function continueParse($bytes) { + $this->buffer .= $bytes; + + $continue = true; + while ($continue) { + switch ($this->state) { + case 'endboundary': + // We've just parsed a boundary. Next, we expect either "--" (which + // indicates we've reached the end of the parts) or "\r\n" (which + // indicates we should read the headers for the next part). + + if (strlen($this->buffer) < 2) { + // We don't have enough bytes yet, so wait for more. + $continue = false; + break; + } + + if (!strncmp($this->buffer, '--', 2)) { + // This is "--" after a boundary, so we're done. We'll read the + // rest of the body (the "epilogue") and discard it. + $this->buffer = substr($this->buffer, 2); + $this->state = 'epilogue'; + + $this->part = null; + break; + } + + if (!strncmp($this->buffer, "\r\n", 2)) { + // This is "\r\n" after a boundary, so we're going to going to + // read the headers for a part. + $this->buffer = substr($this->buffer, 2); + $this->state = 'header'; + + // Create the object to hold the part we're about to read. + $part = new AphrontMultipartPart(); + $this->parts[] = $part; + $this->part = $part; + break; + } + + throw new Exception( + pht('Expected "\r\n" or "--" after multipart data boundary.')); + case 'header': + // We've just parsed a boundary, followed by "\r\n". We are going + // to read the headers for this part. They are in the form of HTTP + // headers and terminated by "\r\n". The section is terminated by + // a line with no header on it. + + if (strlen($this->buffer) < 2) { + // We don't have enough data to find a "\r\n", so wait for more. + $continue = false; + break; + } + + if (!strncmp("\r\n", $this->buffer, 2)) { + // This line immediately began "\r\n", so we're done with parsing + // headers. Start parsing the body. + $this->buffer = substr($this->buffer, 2); + $this->state = 'body'; + break; + } + + // This is an actual header, so look for the end of it. + $header_len = strpos($this->buffer, "\r\n"); + if ($header_len === false) { + // We don't have a full header yet, so wait for more data. + $continue = false; + break; + } + + $header_buf = substr($this->buffer, 0, $header_len); + $this->part->appendRawHeader($header_buf); + + $this->buffer = substr($this->buffer, $header_len + 2); + break; + case 'body': + // We've parsed a boundary and headers, and are parsing the data for + // this part. The data is terminated by "\r\n--", then the boundary. + + // We'll look for "\r\n", then switch to the "bodynewline" state if + // we find it. + + $marker = "\r"; + $marker_pos = strpos($this->buffer, $marker); + + if ($marker_pos === false) { + // There's no "\r" anywhere in the buffer, so we can just read it + // as provided. Then, since we read all the data, we're done until + // we get more. + + // Note that if we're in the preamble, we won't have a "part" + // object and will just discard the data. + if ($this->part) { + $this->part->appendData($this->buffer); + } + $this->buffer = ''; + $continue = false; + break; + } + + if ($marker_pos > 0) { + // If there are bytes before the "\r", + if ($this->part) { + $this->part->appendData(substr($this->buffer, 0, $marker_pos)); + } + $this->buffer = substr($this->buffer, $marker_pos); + } + + $expect = "\r\n"; + $expect_len = strlen($expect); + if (strlen($this->buffer) < $expect_len) { + // We don't have enough bytes yet to know if this is "\r\n" + // or not. + $continue = false; + break; + } + + if (strncmp($this->buffer, $expect, $expect_len)) { + // The next two bytes aren't "\r\n", so eat them and go looking + // for more newlines. + if ($this->part) { + $this->part->appendData(substr($this->buffer, 0, $expect_len)); + } + $this->buffer = substr($this->buffer, $expect_len); + break; + } + + // Eat the "\r\n". + $this->buffer = substr($this->buffer, $expect_len); + $this->state = 'bodynewline'; + break; + case 'bodynewline': + // We've parsed a newline in a body, or we just started parsing the + // request. In either case, we're looking for "--", then the boundary. + // If we find it, this section is done. If we don't, we consume the + // bytes and move on. + + $expect = '--'.$this->boundary; + $expect_len = strlen($expect); + + if (strlen($this->buffer) < $expect_len) { + // We don't have enough bytes yet, so wait for more. + $continue = false; + break; + } + + if (strncmp($this->buffer, $expect, $expect_len)) { + // This wasn't the boundary, so return to the "body" state and + // consume it. (But first, we need to append the "\r\n" which we + // ate earlier.) + if ($this->part) { + $this->part->appendData("\r\n"); + } + $this->state = 'body'; + break; + } + + // This is the boundary, so toss it and move on. + $this->buffer = substr($this->buffer, $expect_len); + $this->state = 'endboundary'; + break; + case 'epilogue': + // We just discard any epilogue. + $this->buffer = ''; + $continue = false; + break; + default: + throw new Exception( + pht( + 'Unknown parser state "%s".\n', + $this->state)); + } + } + } + + public function endParse() { + if ($this->state !== 'epilogue') { + throw new Exception( + pht( + 'Expected "multipart/form-data" parse to end '. + 'in state "epilogue".')); + } + + return $this->parts; + } + + +} diff --git a/src/aphront/multipartparser/AphrontMultipartPart.php b/src/aphront/multipartparser/AphrontMultipartPart.php new file mode 100644 index 0000000000..04e79e9c5b --- /dev/null +++ b/src/aphront/multipartparser/AphrontMultipartPart.php @@ -0,0 +1,96 @@ +parseRawHeader($bytes); + + $header_name = $parser->getHeaderName(); + + $this->headers[] = array( + $header_name, + $parser->getHeaderContent(), + ); + + if (strtolower($header_name) === 'content-disposition') { + $pairs = $parser->getHeaderContentAsPairs(); + foreach ($pairs as $pair) { + list($key, $value) = $pair; + switch ($key) { + case 'filename': + $this->filename = $value; + break; + case 'name': + $this->name = $value; + break; + } + } + } + + return $this; + } + + public function appendData($bytes) { + $this->byteSize += strlen($bytes); + + if ($this->isVariable()) { + $this->value .= $bytes; + } else { + if (!$this->tempFile) { + $this->tempFile = new TempFile(getmypid().'.upload'); + } + Filesystem::appendFile($this->tempFile, $bytes); + } + + return $this; + } + + public function isVariable() { + return ($this->filename === null); + } + + public function getName() { + return $this->name; + } + + public function getVariableValue() { + if (!$this->isVariable()) { + throw new Exception(pht('This part is not a variable!')); + } + + return $this->value; + } + + public function getPHPFileDictionary() { + if (!$this->tempFile) { + $this->appendData(''); + } + + $mime_type = 'application/octet-stream'; + foreach ($this->headers as $header) { + list($name, $value) = $header; + if (strtolower($name) == 'content-type') { + $mime_type = $value; + break; + } + } + + return array( + 'name' => $this->filename, + 'type' => $mime_type, + 'tmp_name' => (string)$this->tempFile, + 'error' => 0, + 'size' => $this->byteSize, + ); + } + +} diff --git a/src/aphront/multipartparser/__tests__/AphrontMultipartParserTestCase.php b/src/aphront/multipartparser/__tests__/AphrontMultipartParserTestCase.php new file mode 100644 index 0000000000..845ac10f5d --- /dev/null +++ b/src/aphront/multipartparser/__tests__/AphrontMultipartParserTestCase.php @@ -0,0 +1,45 @@ + 'simple.txt', + 'variables' => array( + array('a', 'b'), + ), + ), + ); + + $data_dir = dirname(__FILE__).'/data/'; + foreach ($map as $test_case) { + $data = Filesystem::readFile($data_dir.$test_case['data']); + $data = str_replace("\n", "\r\n", $data); + + $parser = id(new AphrontMultipartParser()) + ->setContentType('multipart/form-data; boundary=ABCDEFG'); + $parser->beginParse(); + $parser->continueParse($data); + $parts = $parser->endParse(); + + $variables = array(); + foreach ($parts as $part) { + if (!$part->isVariable()) { + continue; + } + + $variables[] = array( + $part->getName(), + $part->getVariableValue(), + ); + } + + $expect_variables = idx($test_case, 'variables', array()); + $this->assertEqual($expect_variables, $variables); + } + } + + + +} diff --git a/src/aphront/multipartparser/__tests__/data/simple.txt b/src/aphront/multipartparser/__tests__/data/simple.txt new file mode 100644 index 0000000000..92df22f0be --- /dev/null +++ b/src/aphront/multipartparser/__tests__/data/simple.txt @@ -0,0 +1,5 @@ +--ABCDEFG +Content-Disposition: form-data; name="a" + +b +--ABCDEFG-- diff --git a/src/aphront/requeststream/AphrontRequestStream.php b/src/aphront/requeststream/AphrontRequestStream.php new file mode 100644 index 0000000000..009451c3ad --- /dev/null +++ b/src/aphront/requeststream/AphrontRequestStream.php @@ -0,0 +1,113 @@ +encoding = $encoding; + return $this; + } + + public function getEncoding() { + return $this->encoding; + } + + public function getIterator() { + if (!$this->iterator) { + $this->iterator = new PhutilStreamIterator($this->getStream()); + } + return $this->iterator; + } + + public function readData() { + if (!$this->iterator) { + $iterator = $this->getIterator(); + $iterator->rewind(); + } else { + $iterator = $this->getIterator(); + } + + if (!$iterator->valid()) { + return null; + } + + $data = $iterator->current(); + $iterator->next(); + + return $data; + } + + private function getStream() { + if (!$this->stream) { + $this->stream = $this->newStream(); + } + + return $this->stream; + } + + private function newStream() { + $stream = fopen('php://input', 'rb'); + if (!$stream) { + throw new Exception( + pht( + 'Failed to open stream "%s" for reading.', + 'php://input')); + } + + $encoding = $this->getEncoding(); + if ($encoding === 'gzip') { + // This parameter is magic. Values 0-15 express a time/memory tradeoff, + // but the largest value (15) corresponds to only 32KB of memory and + // data encoded with a smaller window size than the one we pass can not + // be decompressed. Always pass the maximum window size. + + // Additionally, you can add 16 (to enable gzip) or 32 (to enable both + // gzip and zlib). Add 32 to support both. + $zlib_window = 15 + 32; + + $ok = stream_filter_append( + $stream, + 'zlib.inflate', + STREAM_FILTER_READ, + array( + 'window' => $zlib_window, + )); + if (!$ok) { + throw new Exception( + pht( + 'Failed to append filter "%s" to input stream while processing '. + 'a request with "%s" encoding.', + 'zlib.inflate', + $encoding)); + } + } + + return $stream; + } + + public static function supportsGzip() { + if (!function_exists('gzencode') || !function_exists('gzdecode')) { + return false; + } + + $has_zlib = false; + + // NOTE: At least locally, this returns "zlib.*", which is not terribly + // reassuring. We care about "zlib.inflate". + + $filters = stream_get_filters(); + foreach ($filters as $filter) { + if (!strncasecmp($filter, 'zlib.', strlen('zlib.'))) { + $has_zlib = true; + break; + } + } + + return $has_zlib; + } + +} diff --git a/src/aphront/response/Aphront304Response.php b/src/aphront/response/Aphront304Response.php index 4a1d93c773..bdf1e4f980 100644 --- a/src/aphront/response/Aphront304Response.php +++ b/src/aphront/response/Aphront304Response.php @@ -1,8 +1,5 @@ getForbiddenText(); if (!$forbidden_text) { $forbidden_text = - 'You do not have privileges to access the requested page.'; + pht('You do not have privileges to access the requested page.'); } - $failure = new AphrontRequestFailureView(); - $failure->setHeader('403 Forbidden'); - $failure->appendChild(phutil_tag('p', array(), $forbidden_text)); - - $view = new PhabricatorStandardPageView(); - $view->setTitle('403 Forbidden'); - $view->setRequest($this->getRequest()); - $view->appendChild($failure); + + $request = $this->getRequest(); + $user = $request->getUser(); + + $dialog = id(new AphrontDialogView()) + ->setUser($user) + ->setTitle(pht('403 Forbidden')) + ->addCancelButton('/', pht('Yikes!')) + ->appendParagraph($forbidden_text); + + $view = id(new PhabricatorStandardPageView()) + ->setTitle(pht('403 Forbidden')) + ->setRequest($request) + ->setDeviceReady(true) + ->appendChild($dialog); return $view->render(); } diff --git a/src/aphront/response/Aphront404Response.php b/src/aphront/response/Aphront404Response.php index fbfa41a0da..5f2e9f1115 100644 --- a/src/aphront/response/Aphront404Response.php +++ b/src/aphront/response/Aphront404Response.php @@ -1,8 +1,5 @@ setHeader('404 Not Found'); - $failure->appendChild(phutil_tag('p', array(), pht( - 'The page you requested was not found.'))); - - $view = new PhabricatorStandardPageView(); - $view->setTitle('404 Not Found'); - $view->setRequest($this->getRequest()); - $view->appendChild($failure); + $request = $this->getRequest(); + $viewer = $request->getViewer(); + + // See T13636. Note that this response may be served from a Site other than + // the primary PlatformSite. For now, always link to the PlatformSite. + + // (This may not be the best possible place to send users who are currently + // on "real" sites, like the BlogSite.) + $return_uri = PhabricatorEnv::getURI('/'); + + $dialog = id(new AphrontDialogView()) + ->setViewer($viewer) + ->setTitle(pht('404 Not Found')) + ->addCancelButton($return_uri, pht('Return to Charted Waters')) + ->appendParagraph( + pht( + 'You arrive at your destination, but there is nothing here.')) + ->appendParagraph( + pht( + 'Perhaps the real treasure was the friends you made '. + 'along the way.')); + + $view = id(new PhabricatorStandardPageView()) + ->setTitle(pht('404 Not Found')) + ->setRequest($request) + ->setDeviceReady(true) + ->appendChild($dialog); return $view->render(); } diff --git a/src/aphront/response/AphrontAjaxResponse.php b/src/aphront/response/AphrontAjaxResponse.php index 032f11e120..fe5cbffd47 100644 --- a/src/aphront/response/AphrontAjaxResponse.php +++ b/src/aphront/response/AphrontAjaxResponse.php @@ -1,8 +1,5 @@ getRequest(); $console = $this->getConsole(); if ($console) { // NOTE: We're stripping query parameters here both for readability and // to mitigate BREACH and similar attacks. The parameters are available // in the "Request" tab, so this should not impact usability. See T3684. - $uri = $this->getRequest()->getRequestURI(); - $uri = new PhutilURI($uri); - $uri->setQueryParams(array()); + $path = $request->getPath(); Javelin::initBehavior( 'dark-console', array( - 'uri' => (string)$uri, - 'key' => $console->getKey($this->getRequest()), - 'color' => $console->getColor(), + 'uri' => $path, + 'key' => $console->getKey($request), + 'color' => $console->getColor(), + 'quicksand' => $request->isQuicksand(), )); } @@ -61,6 +58,18 @@ public function buildResponseString() { $this->encodeJSONForHTTPResponse($content); $response = CelerityAPI::getStaticResourceResponse(); + + if ($request) { + $viewer = $request->getViewer(); + if ($viewer) { + $postprocessor_key = $viewer->getUserSetting( + PhabricatorAccessibilitySetting::SETTINGKEY); + if ($postprocessor_key !== null && strlen($postprocessor_key)) { + $response->setPostprocessorKey($postprocessor_key); + } + } + } + $object = $response->buildAjaxResponse( $content['payload'], $this->error); diff --git a/src/aphront/response/AphrontDialogResponse.php b/src/aphront/response/AphrontDialogResponse.php index 7aa34db8ae..e2db051077 100644 --- a/src/aphront/response/AphrontDialogResponse.php +++ b/src/aphront/response/AphrontDialogResponse.php @@ -1,8 +1,5 @@ allowOrigins[] = $origin; + return $this; + } public function setDownload($download) { - $download = preg_replace('/[^A-Za-z0-9_.-]/', '_', $download); - if (!strlen($download)) { - $download = 'untitled_document.txt'; + if ($download === null || !strlen($download)) { + $download = 'untitled'; } $this->download = $download; return $this; @@ -32,27 +40,95 @@ public function getMimeType() { } public function setContent($content) { + $this->setContentLength(strlen($content)); $this->content = $content; return $this; } + public function setContentIterator($iterator) { + $this->contentIterator = $iterator; + return $this; + } + public function buildResponseString() { return $this->content; } + public function getContentIterator() { + if ($this->contentIterator) { + return $this->contentIterator; + } + return parent::getContentIterator(); + } + + public function setContentLength($length) { + $this->contentLength = $length; + return $this; + } + + public function getContentLength() { + return $this->contentLength; + } + + public function setCompressResponse($compress_response) { + $this->compressResponse = $compress_response; + return $this; + } + + public function getCompressResponse() { + return $this->compressResponse; + } + + public function setRange($min, $max) { + $this->rangeMin = $min; + $this->rangeMax = $max; + return $this; + } + public function getHeaders() { $headers = array( array('Content-Type', $this->getMimeType()), - array('Content-Length', strlen($this->content)), + // This tells clients that we can support requests with a "Range" header, + // which allows downloads to be resumed, in some browsers, some of the + // time, if the stars align. + array('Accept-Ranges', 'bytes'), ); - if (strlen($this->getDownload())) { + if ($this->rangeMin !== null || $this->rangeMax !== null) { + $len = $this->getContentLength(); + $min = $this->rangeMin; + + $max = $this->rangeMax; + if ($max === null) { + $max = ($len - 1); + } + + $headers[] = array('Content-Range', "bytes {$min}-{$max}/{$len}"); + $content_len = ($max - $min) + 1; + } else { + $content_len = $this->getContentLength(); + } + + if (!$this->shouldCompressResponse()) { + $headers[] = array('Content-Length', $content_len); + } + + $download = $this->getDownload(); + if ($download !== null && strlen($download)) { $headers[] = array('X-Download-Options', 'noopen'); $filename = $this->getDownload(); + $filename = addcslashes($filename, '"\\'); $headers[] = array( 'Content-Disposition', - 'attachment; filename='.$filename, + 'attachment; filename="'.$filename.'"', + ); + } + + if ($this->allowOrigins) { + $headers[] = array( + 'Access-Control-Allow-Origin', + implode(',', $this->allowOrigins), ); } @@ -60,4 +136,33 @@ public function getHeaders() { return $headers; } + protected function shouldCompressResponse() { + return $this->getCompressResponse(); + } + + public function parseHTTPRange($range) { + $begin = null; + $end = null; + + $matches = null; + if (preg_match('/^bytes=(\d+)-(\d*)$/', $range, $matches)) { + // Note that the "Range" header specifies bytes differently than + // we do internally: the range 0-1 has 2 bytes (byte 0 and byte 1). + $begin = (int)$matches[1]; + + // The "Range" may be "200-299" or "200-", meaning "until end of file". + if ($matches[2] !== null && strlen($matches[2])) { + $range_end = (int)$matches[2]; + $end = $range_end + 1; + } else { + $range_end = null; + } + + $this->setHTTPResponseCode(206); + $this->setRange($begin, $range_end); + } + + return array($begin, $end); + } + } diff --git a/src/aphront/response/AphrontHTMLResponse.php b/src/aphront/response/AphrontHTMLResponse.php index 4448fcdf12..ae3264d287 100644 --- a/src/aphront/response/AphrontHTMLResponse.php +++ b/src/aphront/response/AphrontHTMLResponse.php @@ -1,8 +1,5 @@ future = $future; + return $this; + } + + public function getHTTPFuture() { + return $this->future; + } + + public function getCacheHeaders() { + return array(); + } + + public function getHeaders() { + $this->readRequestHeaders(); + return array_merge( + parent::getHeaders(), + $this->headers, + array( + array('X-Phabricator-Proxy', 'true'), + )); + } + + public function buildResponseString() { + // TODO: AphrontResponse needs to support streaming responses. + return $this->readRequest(); + } + + public function getHTTPResponseCode() { + $this->readRequestHeaders(); + return $this->httpCode; + } + + private function readRequestHeaders() { + // TODO: This should read only the headers. + $this->readRequest(); + } + + private function readRequest() { + // TODO: This is grossly inefficient for large requests. + + list($status, $body, $headers) = $this->future->resolve(); + $this->httpCode = $status->getStatusCode(); + + // Strip "Transfer-Encoding" headers. Particularly, the server we proxied + // may have chunked the response, but cURL will already have un-chunked it. + // If we emit the header and unchunked data, the response becomes invalid. + + // See T13517. Strip "Content-Encoding" and "Content-Length" headers, since + // they may reflect compressed content. + + foreach ($headers as $key => $header) { + list($header_head, $header_body) = $header; + $header_head = phutil_utf8_strtolower($header_head); + switch ($header_head) { + case 'transfer-encoding': + case 'content-encoding': + case 'content-length': + unset($headers[$key]); + break; + } + } + + $this->headers = $headers; + + return $body; + } + +} diff --git a/src/aphront/response/AphrontJSONResponse.php b/src/aphront/response/AphrontJSONResponse.php index f5666db642..228a1a1721 100644 --- a/src/aphront/response/AphrontJSONResponse.php +++ b/src/aphront/response/AphrontJSONResponse.php @@ -1,8 +1,5 @@ addJSONShield === null) { return true; } - return (bool) $this->addJSONShield; + return (bool)$this->addJSONShield; } public function buildResponseString() { @@ -34,10 +31,11 @@ public function buildResponseString() { } public function getHeaders() { - $headers = array( - array('Content-Type', 'application/json'), - ); - $headers = array_merge(parent::getHeaders(), $headers); + $headers = parent::getHeaders(); + + $headers[] = array('Content-Type', 'application/json'); + return $headers; } + } diff --git a/src/aphront/response/AphrontPlainTextResponse.php b/src/aphront/response/AphrontPlainTextResponse.php index ac8fe3c236..d8289ab2f9 100644 --- a/src/aphront/response/AphrontPlainTextResponse.php +++ b/src/aphront/response/AphrontPlainTextResponse.php @@ -1,10 +1,9 @@ content = $content; return $this; @@ -16,7 +15,7 @@ public function buildResponseString() { public function getHeaders() { $headers = array( - array('Content-Type', 'text/plain'), + array('Content-Type', 'text/plain; charset=utf-8'), ); return array_merge(parent::getHeaders(), $headers); diff --git a/src/aphront/response/AphrontProxyResponse.php b/src/aphront/response/AphrontProxyResponse.php index 8e031a977c..eda9e9b719 100644 --- a/src/aphront/response/AphrontProxyResponse.php +++ b/src/aphront/response/AphrontProxyResponse.php @@ -7,10 +7,10 @@ * instantiating an @{class:AphrontAjaxResponse} in @{method:buildProxy}, and * then constructing a real @{class:AphrontAjaxResponse} in * @{method:reduceProxyResponse}. - * - * @group aphront */ -abstract class AphrontProxyResponse extends AphrontResponse { +abstract class AphrontProxyResponse + extends AphrontResponse + implements AphrontResponseProducerInterface { private $proxy; @@ -39,6 +39,11 @@ public function setCacheDurationInSeconds($duration) { return $this; } + public function setCanCDN($can_cdn) { + $this->getProxy()->setCanCDN($can_cdn); + return $this; + } + public function setLastModified($epoch_timestamp) { $this->getProxy()->setLastModified($epoch_timestamp); return $this; @@ -67,8 +72,18 @@ abstract public function reduceProxyResponse(); final public function buildResponseString() { throw new Exception( - "AphrontProxyResponse must implement reduceProxyResponse()."); + pht( + '%s must implement %s.', + __CLASS__, + 'reduceProxyResponse()')); } +/* -( AphrontResponseProducerInterface )----------------------------------- */ + + + public function produceAphrontResponse() { + return $this->reduceProxyResponse(); + } + } diff --git a/src/aphront/response/AphrontRedirectResponse.php b/src/aphront/response/AphrontRedirectResponse.php index b01cc3644d..390ad193c9 100644 --- a/src/aphront/response/AphrontRedirectResponse.php +++ b/src/aphront/response/AphrontRedirectResponse.php @@ -2,12 +2,25 @@ /** * TODO: Should be final but isn't because of AphrontReloadResponse. - * - * @group aphront */ class AphrontRedirectResponse extends AphrontResponse { private $uri; + private $stackWhenCreated; + private $isExternal; + private $closeDialogBeforeRedirect; + + public function setIsExternal($external) { + $this->isExternal = $external; + return $this; + } + + public function __construct() { + if ($this->shouldStopForDebugging()) { + // If we're going to stop, capture the stack so we can print it out. + $this->stackWhenCreated = id(new Exception())->getTrace(); + } + } public function setURI($uri) { $this->uri = $uri; @@ -15,17 +28,30 @@ public function setURI($uri) { } public function getURI() { - return (string)$this->uri; + // NOTE: When we convert a RedirectResponse into an AjaxResponse, we pull + // the URI through this method. Make sure it passes checks before we + // hand it over to callers. + return self::getURIForRedirect($this->uri, $this->isExternal); } public function shouldStopForDebugging() { return PhabricatorEnv::getEnvConfig('debug.stop-on-redirect'); } + public function setCloseDialogBeforeRedirect($close) { + $this->closeDialogBeforeRedirect = $close; + return $this; + } + + public function getCloseDialogBeforeRedirect() { + return $this->closeDialogBeforeRedirect; + } + public function getHeaders() { $headers = array(); if (!$this->shouldStopForDebugging()) { - $headers[] = array('Location', $this->uri); + $uri = self::getURIForRedirect($this->uri, $this->isExternal); + $headers[] = array('Location', $uri); } $headers = array_merge(parent::getHeaders(), $headers); return $headers; @@ -33,29 +59,45 @@ public function getHeaders() { public function buildResponseString() { if ($this->shouldStopForDebugging()) { + $request = $this->getRequest(); + $viewer = $request->getUser(); + $view = new PhabricatorStandardPageView(); $view->setRequest($this->getRequest()); - $view->setApplicationName('Debug'); - $view->setTitle('Stopped on Redirect'); + $view->setApplicationName(pht('Debug')); + $view->setTitle(pht('Stopped on Redirect')); - $error = new AphrontErrorView(); - $error->setSeverity(AphrontErrorView::SEVERITY_NOTICE); - $error->setTitle('Stopped on Redirect'); + $dialog = new AphrontDialogView(); + $dialog->setUser($viewer); + $dialog->setTitle(pht('Stopped on Redirect')); - $link = phutil_tag( - 'a', - array( - 'href' => $this->getURI(), - ), - 'Continue to: '.$this->getURI()); + $dialog->appendParagraph( + pht( + 'You were stopped here because %s is set in your configuration.', + phutil_tag('tt', array(), 'debug.stop-on-redirect'))); - $error->appendChild(hsprintf( - '

    You were stopped here because debug.stop-on-redirect '. - 'is set in your configuration.

    '. - '

    %s

    ', - $link)); + $dialog->appendParagraph( + pht( + 'You are being redirected to: %s', + phutil_tag('tt', array(), $this->getURI()))); - $view->appendChild($error); + $dialog->addCancelButton($this->getURI(), pht('Continue')); + + $dialog->appendChild(phutil_tag('br')); + + $dialog->appendChild( + id(new AphrontStackTraceView()) + ->setUser($viewer) + ->setTrace($this->stackWhenCreated)); + + $dialog->setIsStandalone(true); + $dialog->setWidth(AphrontDialogView::WIDTH_FULL); + + $box = id(new PHUIBoxView()) + ->addMargin(PHUI::MARGIN_LARGE) + ->appendChild($dialog); + + $view->appendChild($box); return $view->render(); } @@ -63,4 +105,72 @@ public function buildResponseString() { return ''; } + + /** + * Format a URI for use in a "Location:" header. + * + * Verifies that a URI redirects to the expected type of resource (local or + * remote) and formats it for use in a "Location:" header. + * + * The HTTP spec says "Location:" headers must use absolute URIs. Although + * browsers work with relative URIs, we return absolute URIs to avoid + * ambiguity. For example, Chrome interprets "Location: /\evil.com" to mean + * "perform a protocol-relative redirect to evil.com". + * + * @param string URI to redirect to. + * @param bool True if this URI identifies a remote resource. + * @return string URI for use in a "Location:" header. + */ + public static function getURIForRedirect($uri, $is_external) { + $uri_object = new PhutilURI($uri); + if ($is_external) { + // If this is a remote resource it must have a domain set. This + // would also be caught below, but testing for it explicitly first allows + // us to raise a better error message. + if (!strlen($uri_object->getDomain())) { + throw new Exception( + pht( + 'Refusing to redirect to external URI "%s". This URI '. + 'is not fully qualified, and is missing a domain name. To '. + 'redirect to a local resource, remove the external flag.', + (string)$uri)); + } + + // Check that it's a valid remote resource. + if (!PhabricatorEnv::isValidURIForLink($uri)) { + throw new Exception( + pht( + 'Refusing to redirect to external URI "%s". This URI '. + 'is not a valid remote web resource.', + (string)$uri)); + } + } else { + // If this is a local resource, it must not have a domain set. This allows + // us to raise a better error message than the check below can. + if (strlen($uri_object->getDomain())) { + throw new Exception( + pht( + 'Refusing to redirect to local resource "%s". The URI has a '. + 'domain, but the redirect is not marked external. Mark '. + 'redirects as external to allow redirection off the local '. + 'domain.', + (string)$uri)); + } + + // If this is a local resource, it must be a valid local resource. + if (!PhabricatorEnv::isValidLocalURIForLink($uri)) { + throw new Exception( + pht( + 'Refusing to redirect to local resource "%s". This URI is not '. + 'formatted in a recognizable way.', + (string)$uri)); + } + + // Fully qualify the result URI. + $uri = PhabricatorEnv::getURI((string)$uri); + } + + return (string)$uri; + } + } diff --git a/src/aphront/response/AphrontReloadResponse.php b/src/aphront/response/AphrontReloadResponse.php index 2b16512620..a95f02963e 100644 --- a/src/aphront/response/AphrontReloadResponse.php +++ b/src/aphront/response/AphrontReloadResponse.php @@ -5,8 +5,6 @@ * if the action is javascript-driven but redirect if it isn't. This preserves * query parameters in the javascript case. A reload response behaves like * a redirect response but causes a page reload when received via workflow. - * - * @group aphront */ final class AphrontReloadResponse extends AphrontRedirectResponse { diff --git a/src/aphront/response/AphrontResponse.php b/src/aphront/response/AphrontResponse.php index 20ce8f7a62..5dae168c73 100644 --- a/src/aphront/response/AphrontResponse.php +++ b/src/aphront/response/AphrontResponse.php @@ -1,16 +1,16 @@ request = $request; @@ -21,20 +21,236 @@ public function getRequest() { return $this->request; } + final public function addContentSecurityPolicyURI($kind, $uri) { + if ($this->contentSecurityPolicyURIs === null) { + $this->contentSecurityPolicyURIs = array( + 'script-src' => array(), + 'connect-src' => array(), + 'frame-src' => array(), + 'form-action' => array(), + 'object-src' => array(), + ); + } + + if (!isset($this->contentSecurityPolicyURIs[$kind])) { + throw new Exception( + pht( + 'Unknown Content-Security-Policy URI kind "%s".', + $kind)); + } + + $this->contentSecurityPolicyURIs[$kind][] = (string)$uri; + + return $this; + } + + final public function setDisableContentSecurityPolicy($disable) { + $this->disableContentSecurityPolicy = $disable; + return $this; + } + + final public function addHeader($key, $value) { + $this->headers[] = array($key, $value); + return $this; + } + + +/* -( Content )------------------------------------------------------------ */ + + + public function getContentIterator() { + // By default, make sure responses are truly returning a string, not some + // kind of object that behaves like a string. + + // We're going to remove the execution time limit before dumping the + // response into the sink, and want any rendering that's going to occur + // to happen BEFORE we release the limit. + + return array( + (string)$this->buildResponseString(), + ); + } + + public function buildResponseString() { + throw new PhutilMethodNotImplementedException(); + } + + +/* -( Metadata )----------------------------------------------------------- */ + + public function getHeaders() { $headers = array(); if (!$this->frameable) { $headers[] = array('X-Frame-Options', 'Deny'); } + if ($this->getRequest() && $this->getRequest()->isHTTPS()) { + $hsts_key = 'security.strict-transport-security'; + $use_hsts = PhabricatorEnv::getEnvConfig($hsts_key); + if ($use_hsts) { + $duration = phutil_units('365 days in seconds'); + } else { + // If HSTS has been disabled, tell browsers to turn it off. This may + // not be effective because we can only disable it over a valid HTTPS + // connection, but it best represents the configured intent. + $duration = 0; + } + + $headers[] = array( + 'Strict-Transport-Security', + "max-age={$duration}; includeSubdomains; preload", + ); + } + + $csp = $this->newContentSecurityPolicyHeader(); + if ($csp !== null) { + $headers[] = array('Content-Security-Policy', $csp); + } + + $headers[] = array('Referrer-Policy', 'no-referrer'); + + foreach ($this->headers as $header) { + $headers[] = $header; + } + return $headers; } + private function newContentSecurityPolicyHeader() { + if ($this->disableContentSecurityPolicy) { + return null; + } + + // NOTE: We may return a response during preflight checks (for example, + // if a user has a bad version of PHP). + + // In this case, setup isn't complete yet and we can't access environmental + // configuration. If we aren't able to read the environment, just decline + // to emit a Content-Security-Policy header. + + try { + $cdn = PhabricatorEnv::getEnvConfig('security.alternate-file-domain'); + $base_uri = PhabricatorEnv::getURI('/'); + } catch (Exception $ex) { + return null; + } + + $csp = array(); + if ($cdn) { + $default = $this->newContentSecurityPolicySource($cdn); + } else { + // If an alternate file domain is not configured and the user is viewing + // a Phame blog on a custom domain or some other custom site, we'll still + // serve resources from the main site. Include the main site explicitly. + $base_uri = $this->newContentSecurityPolicySource($base_uri); + + $default = "'self' {$base_uri}"; + } + + $csp[] = "default-src {$default}"; + + // We use "data:" URIs to inline small images into CSS. This policy allows + // "data:" URIs to be used anywhere, but there doesn't appear to be a way + // to say that "data:" URIs are okay in CSS files but not in the document. + $csp[] = "img-src {$default} data:"; + + // We use inline style="..." attributes in various places, many of which + // are legitimate. We also currently use a ', + $monospaced); + } + return hsprintf( - '%s%s', + '%s%s%s', parent::getHead(), - phutil_safe_html($monospaced), - phutil_safe_html($monospaced_win), - $response->renderSingleResource('javelin-magical-init')); + $font_css, + $response->renderSingleResource('javelin-magical-init', 'phabricator')); } public function setGlyph($glyph) { @@ -286,8 +440,6 @@ protected function willSendResponse($response) { } protected function getBody() { - $console = $this->getConsole(); - $user = null; $request = $this->getRequest(); if ($request) { @@ -299,105 +451,153 @@ protected function getBody() { $header_chrome = $this->menuContent; } + $classes = array(); + $classes[] = 'main-page-frame'; $developer_warning = null; if (PhabricatorEnv::getEnvConfig('phabricator.developer-mode') && DarkConsoleErrorLogPluginAPI::getErrors()) { - $developer_warning = phutil_tag( - 'div', - array( - 'class' => 'aphront-developer-error-callout', - ), + $developer_warning = phutil_tag_div( + 'aphront-developer-error-callout', pht( 'This page raised PHP errors. Find them in DarkConsole '. 'or the error log.')); } - // Render the "you have unresolved setup issues..." warning. - $setup_warning = null; - if ($user && $user->getIsAdmin()) { - $open = PhabricatorSetupCheck::getOpenSetupIssueCount(); - if ($open) { - $setup_warning = phutil_tag( + $main_page = phutil_tag( + 'div', + array( + 'id' => 'phabricator-standard-page', + 'class' => 'phabricator-standard-page', + ), + array( + $developer_warning, + $header_chrome, + phutil_tag( 'div', array( - 'class' => 'setup-warning-callout', + 'id' => 'phabricator-standard-page-body', + 'class' => 'phabricator-standard-page-body', ), - phutil_tag( - 'a', - array( - 'href' => '/config/issue/', - ), - pht('You have %d unresolved setup issue(s)...', $open))); + $this->renderPageBodyContent()), + )); + + $durable_column = null; + if ($this->getShowDurableColumn()) { + $is_visible = $this->getDurableColumnVisible(); + $is_minimize = $this->getDurableColumnMinimize(); + $durable_column = id(new ConpherenceDurableColumnView()) + ->setSelectedConpherence(null) + ->setUser($user) + ->setQuicksandConfig($this->buildQuicksandConfig()) + ->setVisible($is_visible) + ->setMinimize($is_minimize) + ->setInitialLoad(true); + if ($is_minimize) { + $this->classes[] = 'minimize-column'; } } - return - phutil_tag( - 'div', - array( - 'id' => 'base-page', - 'class' => 'phabricator-standard-page', - ), - hsprintf( - '%s%s%s'. - '
    '. - '%s%s
    '. - '
    ', - $developer_warning, - $setup_warning, - $header_chrome, - ($console ? hsprintf('') : null), - parent::getBody())); + Javelin::initBehavior('quicksand-blacklist', array( + 'patterns' => $this->getQuicksandURIPatternBlacklist(), + )); + + return phutil_tag( + 'div', + array( + 'class' => implode(' ', $classes), + 'id' => 'main-page-frame', + ), + array( + $main_page, + $durable_column, + )); } - protected function getTail() { - $request = $this->getRequest(); - $user = $request->getUser(); + private function renderPageBodyContent() { + $console = $this->getConsole(); - $container = null; - if ($user->isLoggedIn()) { + $body = parent::getBody(); - $aphlict_object_id = celerity_generate_unique_node_id(); - $aphlict_container_id = celerity_generate_unique_node_id(); + $nav = $this->getNavigation(); + $tabs = $this->getTabs(); + if ($nav) { + $crumbs = $this->getCrumbs(); + if ($crumbs) { + $nav->setCrumbs($crumbs); + } + $nav->appendChild($body); + $nav->appendFooter($this->footer); + $content = phutil_implode_html('', array($nav->render())); + } else { + $content = array(); + + $crumbs = $this->getCrumbs(); + if ($crumbs) { + if ($this->getTabs()) { + $crumbs->setBorder(true); + } + $content[] = $crumbs; + } - $client_uri = PhabricatorEnv::getEnvConfig('notification.client-uri'); - $client_uri = new PhutilURI($client_uri); - if ($client_uri->getDomain() == 'localhost') { - $this_host = $this->getRequest()->getHost(); - $this_host = new PhutilURI('http://'.$this_host.'/'); - $client_uri->setDomain($this_host->getDomain()); + $tabs = $this->getTabs(); + if ($tabs) { + $content[] = $tabs; } - $enable_debug = PhabricatorEnv::getEnvConfig('notification.debug'); - Javelin::initBehavior( - 'aphlict-listen', - array( - 'id' => $aphlict_object_id, - 'containerID' => $aphlict_container_id, - 'server' => $client_uri->getDomain(), - 'port' => $client_uri->getPort(), - 'debug' => $enable_debug, - 'pageObjects' => array_fill_keys($this->pageObjects, true), - )); - $container = phutil_tag( - 'div', - array( - 'id' => $aphlict_container_id, - 'style' => - 'position: absolute; width: 0; height: 0; overflow: hidden;', - ), - ''); + $content[] = $body; + $content[] = $this->footer; + + $content = phutil_implode_html('', $content); } - $response = CelerityAPI::getStaticResourceResponse(); + return array( + ($console ? hsprintf('') : null), + $content, + ); + } + + protected function getTail() { + $request = $this->getRequest(); + $user = $request->getUser(); $tail = array( parent::getTail(), - $container, - $response->renderHTMLFooter(), ); - return phutil_implode_html("\n", $tail); + $response = CelerityAPI::getStaticResourceResponse(); + + if ($request->isHTTPS()) { + $with_protocol = 'https'; + } else { + $with_protocol = 'http'; + } + + $servers = PhabricatorNotificationServerRef::getEnabledClientServers( + $with_protocol); + + if ($servers) { + if ($user && $user->isLoggedIn()) { + // TODO: We could tell the browser about all the servers and let it + // do random reconnects to improve reliability. + shuffle($servers); + $server = head($servers); + + $client_uri = $server->getWebsocketURI(); + + Javelin::initBehavior( + 'aphlict-listen', + array( + 'websocketURI' => (string)$client_uri, + ) + $this->buildAphlictListenConfigData()); + + CelerityAPI::getStaticResourceResponse() + ->addContentSecurityPolicyURI('connect-src', $client_uri); + } + } + + $tail[] = $response->renderHTMLFooter($this->getFrameable()); + + return $tail; } protected function getBodyClasses() { @@ -407,10 +607,6 @@ protected function getBodyClasses() { $classes[] = 'phabricator-chromeless-page'; } - if ($this->getDust()) { - $classes[] = 'make-me-sneeze'; - } - $agent = AphrontRequest::getHTTPHeader('User-Agent'); // Try to guess the device resolution based on UA strings to avoid a flash @@ -432,6 +628,19 @@ protected function getBodyClasses() { $classes[] = 'platform-linux'; } + if ($this->getRequest()->getStr('__print__')) { + $classes[] = 'printable'; + } + + if ($this->getRequest()->getStr('__aural__')) { + $classes[] = 'audible'; + } + + $classes[] = 'phui-theme-'.PhabricatorEnv::getEnvConfig('ui.header-color'); + foreach ($this->classes as $class) { + $classes[] = $class; + } + return implode(' ', $classes); } @@ -442,4 +651,264 @@ private function getConsole() { return $this->getRequest()->getApplicationConfiguration()->getConsole(); } + private function getConsoleConfig() { + $user = $this->getRequest()->getUser(); + + $headers = array(); + if (DarkConsoleXHProfPluginAPI::isProfilerStarted()) { + $headers[DarkConsoleXHProfPluginAPI::getProfilerHeader()] = 'page'; + } + if (DarkConsoleServicesPlugin::isQueryAnalyzerRequested()) { + $headers[DarkConsoleServicesPlugin::getQueryAnalyzerHeader()] = true; + } + + if ($user) { + $setting_tab = PhabricatorDarkConsoleTabSetting::SETTINGKEY; + $setting_visible = PhabricatorDarkConsoleVisibleSetting::SETTINGKEY; + $tab = $user->getUserSetting($setting_tab); + $visible = $user->getUserSetting($setting_visible); + } else { + $tab = null; + $visible = true; + } + + return array( + // NOTE: We use a generic label here to prevent input reflection + // and mitigate compression attacks like BREACH. See discussion in + // T3684. + 'uri' => pht('Main Request'), + 'selected' => $tab, + 'visible' => $visible, + 'headers' => $headers, + ); + } + + private function getHighSecurityWarningConfig() { + $user = $this->getRequest()->getUser(); + + $show = false; + if ($user->hasSession()) { + $hisec = ($user->getSession()->getHighSecurityUntil() - time()); + if ($hisec > 0) { + $show = true; + } + } + + return array( + 'show' => $show, + 'uri' => '/auth/session/downgrade/', + 'message' => pht( + 'Your session is in high security mode. When you '. + 'finish using it, click here to leave.'), + ); + } + + private function renderFooter() { + if (!$this->getShowChrome()) { + return null; + } + + if (!$this->getShowFooter()) { + return null; + } + + $items = PhabricatorEnv::getEnvConfig('ui.footer-items'); + if (!$items) { + return null; + } + + $foot = array(); + foreach ($items as $item) { + $name = idx($item, 'name', pht('Unnamed Footer Item')); + + $href = idx($item, 'href'); + if (!PhabricatorEnv::isValidURIForLink($href)) { + $href = null; + } + + if ($href !== null) { + $tag = 'a'; + } else { + $tag = 'span'; + } + + $foot[] = phutil_tag( + $tag, + array( + 'href' => $href, + ), + $name); + } + $foot = phutil_implode_html(" \xC2\xB7 ", $foot); + + return phutil_tag( + 'div', + array( + 'class' => 'phabricator-standard-page-footer grouped', + ), + $foot); + } + + public function renderForQuicksand() { + parent::willRenderPage(); + $response = $this->renderPageBodyContent(); + $response = $this->willSendResponse($response); + + $extra_config = $this->getQuicksandConfig(); + + return array( + 'content' => hsprintf('%s', $response), + ) + $this->buildQuicksandConfig() + + $extra_config; + } + + private function buildQuicksandConfig() { + $viewer = $this->getRequest()->getUser(); + $controller = $this->getController(); + + $dropdown_query = id(new AphlictDropdownDataQuery()) + ->setViewer($viewer); + $dropdown_query->execute(); + + $hisec_warning_config = $this->getHighSecurityWarningConfig(); + + $console_config = null; + $console = $this->getConsole(); + if ($console) { + $console_config = $this->getConsoleConfig(); + } + + $upload_enabled = false; + if ($controller) { + $upload_enabled = $controller->isGlobalDragAndDropUploadEnabled(); + } + + $application_class = null; + $application_search_icon = null; + $application_help = null; + $controller = $this->getController(); + if ($controller) { + $application = $controller->getCurrentApplication(); + if ($application) { + $application_class = get_class($application); + if ($application->getApplicationSearchDocumentTypes()) { + $application_search_icon = $application->getIcon(); + } + + $help_items = $application->getHelpMenuItems($viewer); + if ($help_items) { + $help_list = id(new PhabricatorActionListView()) + ->setViewer($viewer); + foreach ($help_items as $help_item) { + $help_list->addAction($help_item); + } + $application_help = $help_list->getDropdownMenuMetadata(); + } + } + } + + return array( + 'title' => $this->getTitle(), + 'bodyClasses' => $this->getBodyClasses(), + 'aphlictDropdownData' => array( + $dropdown_query->getNotificationData(), + $dropdown_query->getConpherenceData(), + ), + 'globalDragAndDrop' => $upload_enabled, + 'hisecWarningConfig' => $hisec_warning_config, + 'consoleConfig' => $console_config, + 'applicationClass' => $application_class, + 'applicationSearchIcon' => $application_search_icon, + 'helpItems' => $application_help, + ) + $this->buildAphlictListenConfigData(); + } + + private function buildAphlictListenConfigData() { + $user = $this->getRequest()->getUser(); + $subscriptions = $this->pageObjects; + $subscriptions[] = $user->getPHID(); + + return array( + 'pageObjects' => array_fill_keys($this->pageObjects, true), + 'subscriptions' => $subscriptions, + ); + } + + private function getQuicksandURIPatternBlacklist() { + $applications = PhabricatorApplication::getAllApplications(); + + $blacklist = array(); + foreach ($applications as $application) { + $blacklist[] = $application->getQuicksandURIPatternBlacklist(); + } + + // See T4340. Currently, Phortune and Auth both require pulling in external + // Javascript (for Stripe card management and Recaptcha, respectively). + // This can put us in a position where the user loads a page with a + // restrictive Content-Security-Policy, then uses Quicksand to navigate to + // a page which needs to load external scripts. For now, just blacklist + // these entire applications since we aren't giving up anything + // significant by doing so. + + $blacklist[] = array( + '/phortune/.*', + '/auth/.*', + ); + + return array_mergev($blacklist); + } + + private function getUserPreference($key, $default = null) { + $request = $this->getRequest(); + if (!$request) { + return $default; + } + + $user = $request->getUser(); + if (!$user) { + return $default; + } + + return $user->getUserSetting($key); + } + + public function produceAphrontResponse() { + $controller = $this->getController(); + + $viewer = $this->getUser(); + if ($viewer && $viewer->getPHID()) { + $object_phids = $this->pageObjects; + foreach ($object_phids as $object_phid) { + PhabricatorFeedStoryNotification::updateObjectNotificationViews( + $viewer, + $object_phid); + } + } + + if ($this->getRequest()->isQuicksand()) { + $content = $this->renderForQuicksand(); + $response = id(new AphrontAjaxResponse()) + ->setContent($content); + } else { + // See T13247. Try to find some navigational menu items to create a + // mobile navigation menu from. + $application_menu = $controller->buildApplicationMenu(); + if (!$application_menu) { + $navigation = $this->getNavigation(); + if ($navigation) { + $application_menu = $navigation->getMenu(); + } + } + $this->applicationMenu = $application_menu; + + $content = $this->render(); + + $response = id(new AphrontWebpageResponse()) + ->setContent($content) + ->setFrameable($this->getFrameable()); + } + + return $response; + } + } diff --git a/src/view/page/menu/PhabricatorMainMenuBarExtension.php b/src/view/page/menu/PhabricatorMainMenuBarExtension.php new file mode 100644 index 0000000000..e66b1f2c7d --- /dev/null +++ b/src/view/page/menu/PhabricatorMainMenuBarExtension.php @@ -0,0 +1,107 @@ +viewer = $viewer; + return $this; + } + + public function getViewer() { + return $this->viewer; + } + + public function setApplication(PhabricatorApplication $application) { + $this->application = $application; + return $this; + } + + public function getApplication() { + return $this->application; + } + + public function setController(PhabricatorController $controller) { + $this->controller = $controller; + return $this; + } + + public function getController() { + return $this->controller; + } + + public function setIsFullSession($is_full_session) { + $this->isFullSession = $is_full_session; + return $this; + } + + public function getIsFullSession() { + return $this->isFullSession; + } + + final public function getExtensionKey() { + return $this->getPhobjectClassConstant('MAINMENUBARKEY'); + } + + public function isExtensionEnabled() { + return true; + } + + public function shouldRequireFullSession() { + return true; + } + + public function isExtensionEnabledForViewer(PhabricatorUser $viewer) { + if (!$viewer->isLoggedIn()) { + return false; + } + + if (!$viewer->isUserActivated()) { + return false; + } + + // Don't show menus for users with partial sessions. This usually means + // they have logged in but have not made it through MFA, so we don't want + // to show notification counts, saved queries, etc. + if (!$viewer->hasSession()) { + return false; + } + + if ($viewer->getSession()->getIsPartial()) { + return false; + } + + return true; + } + + public function getExtensionOrder() { + return 1000; + } + + abstract public function buildMainMenus(); + + final public static function getAllExtensions() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->setUniqueMethod('getExtensionKey') + ->setSortMethod('getExtensionOrder') + ->execute(); + } + + final public static function getAllEnabledExtensions() { + $extensions = self::getAllExtensions(); + + foreach ($extensions as $key => $extension) { + if (!$extension->isExtensionEnabled()) { + unset($extensions[$key]); + } + } + + return $extensions; + } + +} diff --git a/src/view/page/menu/PhabricatorMainMenuGroupView.php b/src/view/page/menu/PhabricatorMainMenuGroupView.php deleted file mode 100644 index 1eca04c3c6..0000000000 --- a/src/view/page/menu/PhabricatorMainMenuGroupView.php +++ /dev/null @@ -1,39 +0,0 @@ -classes[] = $class; - return $this; - } - - public function setCollapsible($collapsible) { - $this->collapsible = $collapsible; - return $this; - } - - public function render() { - $classes = array( - 'phabricator-main-menu-group', - ); - - if ($this->collapsible) { - $classes[] = 'phabricator-main-menu-collapsible'; - } - - if ($this->classes) { - $classes = array_merge($classes, $this->classes); - } - - return phutil_tag( - 'div', - array( - 'class' => implode(' ', $classes), - ), - $this->renderChildren()); - } - -} diff --git a/src/view/page/menu/PhabricatorMainMenuIconView.php b/src/view/page/menu/PhabricatorMainMenuIconView.php deleted file mode 100644 index 7d7de47601..0000000000 --- a/src/view/page/menu/PhabricatorMainMenuIconView.php +++ /dev/null @@ -1,76 +0,0 @@ -name = $name; - return $this; - } - - public function setWorkflow($workflow) { - $this->workflow = $workflow; - return $this; - } - - public function getName() { - return $this->name; - } - - public function setHref($href) { - $this->href = $href; - return $this; - } - - public function getHref() { - return $this->href; - } - - public function addClass($class) { - $this->classes[] = $class; - return $this; - } - - public function addStyle($style) { - $this->style = $style; - return $this; - } - - public function render() { - $name = $this->getName(); - $href = $this->getHref(); - - $classes = $this->classes; - $classes[] = 'phabricator-main-menu-icon'; - - $label = javelin_tag( - 'a', - array( - 'href' => $href, - 'class' => 'phabricator-main-menu-icon-label', - ), - $name); - - $item = javelin_tag( - 'a', - array( - 'href' => $href, - 'class' => implode(' ', $classes), - 'style' => $this->style, - 'sigil' => $this->workflow ? 'workflow' : null, - ), - ''); - - $group = new PhabricatorMainMenuGroupView(); - $group->appendChild($item); - $group->appendChild($label); - - return $group->render(); - } - -} diff --git a/src/view/page/menu/PhabricatorMainMenuSearchView.php b/src/view/page/menu/PhabricatorMainMenuSearchView.php index 1f416a1f94..e038eec6c8 100644 --- a/src/view/page/menu/PhabricatorMainMenuSearchView.php +++ b/src/view/page/menu/PhabricatorMainMenuSearchView.php @@ -2,14 +2,20 @@ final class PhabricatorMainMenuSearchView extends AphrontView { - private $scope; + const DEFAULT_APPLICATION_ICON = 'fa-dot-circle-o'; + private $id; + private $application; - public function setScope($scope) { - $this->scope = $scope; + public function setApplication(PhabricatorApplication $application) { + $this->application = $application; return $this; } + public function getApplication() { + return $this->application; + } + public function getID() { if (!$this->id) { $this->id = celerity_generate_unique_node_id(); @@ -18,10 +24,13 @@ public function getID() { } public function render() { - $user = $this->user; + $viewer = $this->getViewer(); - $target_id = celerity_generate_unique_node_id(); + $target_id = celerity_generate_unique_node_id(); $search_id = $this->getID(); + $button_id = celerity_generate_unique_node_id(); + $selector_id = celerity_generate_unique_node_id(); + $application_id = celerity_generate_unique_node_id(); $input = phutil_tag( 'input', @@ -30,10 +39,11 @@ public function render() { 'name' => 'query', 'id' => $search_id, 'autocomplete' => 'off', + 'autocorrect' => 'off', + 'autocapitalize' => 'off', + 'spellcheck' => 'false', )); - $scope = $this->scope; - $target = javelin_tag( 'div', array( @@ -42,39 +52,213 @@ public function render() { ), ''); + $search_datasource = new PhabricatorSearchDatasource(); + $scope_key = PhabricatorSearchScopeSetting::SETTINGKEY; + Javelin::initBehavior( 'phabricator-search-typeahead', array( - 'id' => $target_id, - 'input' => $search_id, - 'src' => '/typeahead/common/mainsearch/', - 'limit' => 10, - 'placeholder' => PhabricatorSearchScope::getScopePlaceholder($scope), + 'id' => $target_id, + 'input' => $search_id, + 'button' => $button_id, + 'selectorID' => $selector_id, + 'applicationID' => $application_id, + 'defaultApplicationIcon' => self::DEFAULT_APPLICATION_ICON, + 'appScope' => PhabricatorSearchController::SCOPE_CURRENT_APPLICATION, + 'src' => $search_datasource->getDatasourceURI(), + 'limit' => 10, + 'placeholder' => pht('Search'), + 'scopeUpdateURI' => '/settings/adjust/?key='.$scope_key, )); - $scope_input = phutil_tag( + $primary_input = phutil_tag( 'input', array( 'type' => 'hidden', - 'name' => 'scope', - 'value' => $scope, + 'name' => 'search:primary', + 'value' => 'true', )); + $search_text = javelin_tag( + 'span', + array( + 'aural' => true, + ), + pht('Search')); + + $selector = $this->buildModeSelector($selector_id, $application_id); + $form = phabricator_form( - $user, + $viewer, array( 'action' => '/search/', 'method' => 'POST', ), - hsprintf( - '
    '. - '%s%s%s'. - '
    ', - $input, - $scope_input, - $target)); + phutil_tag( + 'div', + array( + 'class' => 'phabricator-main-menu-search-container', + ), + array( + $input, + phutil_tag( + 'button', + array( + 'id' => $button_id, + 'class' => 'phui-icon-view phui-font-fa fa-search', + ), + $search_text), + $selector, + $primary_input, + $target, + ))); return $form; } + public static function getGlobalSearchScopeItems( + PhabricatorUser $viewer, + PhabricatorApplication $application = null, + $global_only = false) { + + $items = array(); + $items[] = array( + 'name' => pht('Search'), + ); + + $items[] = array( + 'icon' => 'fa-globe', + 'name' => pht('All Documents'), + 'value' => 'all', + ); + + $application_value = null; + $application_icon = self::DEFAULT_APPLICATION_ICON; + if ($application) { + $application_value = get_class($application); + if ($application->getApplicationSearchDocumentTypes()) { + $application_icon = $application->getIcon(); + } + } + + $items[] = array( + 'icon' => $application_icon, + 'name' => pht('Current Application'), + 'value' => PhabricatorSearchController::SCOPE_CURRENT_APPLICATION, + ); + + $items[] = array( + 'name' => pht('Saved Queries'), + ); + + + $engine = id(new PhabricatorSearchApplicationSearchEngine()) + ->setViewer($viewer); + $engine_queries = $engine->loadEnabledNamedQueries(); + foreach ($engine_queries as $query) { + $query_key = $query->getQueryKey(); + if ($query_key == 'all') { + // Skip the builtin "All" query since it's redundant with the default + // setting. + continue; + } + + // In the global "Settings" panel, we don't want to offer personal + // queries the viewer may have saved. + if ($global_only) { + if (!$query->isGlobal()) { + continue; + } + } + + $query_name = $query->getQueryName(); + + $items[] = array( + 'icon' => 'fa-certificate', + 'name' => $query_name, + 'value' => $query_key, + ); + } + + $items[] = array( + 'name' => pht('More Options'), + ); + + $items[] = array( + 'icon' => 'fa-search-plus', + 'name' => pht('Advanced Search'), + 'href' => '/search/query/advanced/', + ); + + $items[] = array( + 'icon' => 'fa-book', + 'name' => pht('User Guide: Search'), + 'href' => PhabricatorEnv::getDoclink('Search User Guide'), + ); + + return $items; + } + + private function buildModeSelector($selector_id, $application_id) { + $viewer = $this->getViewer(); + + $items = self::getGlobalSearchScopeItems($viewer, $this->getApplication()); + + $scope_key = PhabricatorSearchScopeSetting::SETTINGKEY; + $current_value = $viewer->getUserSetting($scope_key); + + $current_icon = 'fa-globe'; + foreach ($items as $item) { + if (idx($item, 'value') == $current_value) { + $current_icon = $item['icon']; + break; + } + } + + $application = $this->getApplication(); + + $application_value = null; + if ($application) { + $application_value = get_class($application); + } + + $selector = id(new PHUIButtonView()) + ->setID($selector_id) + ->addClass('phabricator-main-menu-search-dropdown') + ->addSigil('global-search-dropdown') + ->setMetadata( + array( + 'items' => $items, + 'icon' => $current_icon, + 'value' => $current_value, + )) + ->setIcon( + id(new PHUIIconView()) + ->addSigil('global-search-dropdown-icon') + ->setIcon($current_icon)) + ->setAuralLabel(pht('Configure Global Search')) + ->setDropdown(true); + + $input = javelin_tag( + 'input', + array( + 'type' => 'hidden', + 'sigil' => 'global-search-dropdown-input', + 'name' => 'search:scope', + 'value' => $current_value, + )); + + $application_input = javelin_tag( + 'input', + array( + 'type' => 'hidden', + 'id' => $application_id, + 'sigil' => 'global-search-dropdown-app', + 'name' => 'search:application', + 'value' => $application_value, + )); + + return array($selector, $input, $application_input); + } + } diff --git a/src/view/page/menu/PhabricatorMainMenuView.php b/src/view/page/menu/PhabricatorMainMenuView.php index 102958d2e7..28d3d91f58 100644 --- a/src/view/page/menu/PhabricatorMainMenuView.php +++ b/src/view/page/menu/PhabricatorMainMenuView.php @@ -2,7 +2,6 @@ final class PhabricatorMainMenuView extends AphrontView { - private $defaultSearchScope; private $controller; private $applicationMenu; @@ -24,51 +23,139 @@ public function getController() { return $this->controller; } - public function setDefaultSearchScope($default_search_scope) { - $this->defaultSearchScope = $default_search_scope; - return $this; - } + private static function getFavicons() { + $refs = array(); + + $refs['favicon'] = id(new PhabricatorFaviconRef()) + ->setWidth(64) + ->setHeight(64); + + $refs['message_favicon'] = id(new PhabricatorFaviconRef()) + ->setWidth(64) + ->setHeight(64) + ->setEmblems( + array( + 'dot-pink', + null, + null, + null, + )); - public function getDefaultSearchScope() { - return $this->defaultSearchScope; + id(new PhabricatorFaviconRefQuery()) + ->withRefs($refs) + ->execute(); + + return mpull($refs, 'getURI'); } public function render() { - $user = $this->user; + $viewer = $this->getViewer(); require_celerity_resource('phabricator-main-menu-view'); $header_id = celerity_generate_unique_node_id(); - $menus = array(); + $menu_bar = array(); $alerts = array(); $search_button = ''; $app_button = ''; + $aural = null; + + $is_full = $this->isFullSession($viewer); - if ($user->isLoggedIn()) { - list($menu, $dropdowns) = $this->renderNotificationMenu(); - $alerts[] = $menu; - $menus = array_merge($menus, $dropdowns); - $app_button = $this->renderApplicationMenuButton($header_id); + if ($is_full) { + list($menu, $dropdowns, $aural) = $this->renderNotificationMenu(); + if (array_filter($menu)) { + $alerts[] = $menu; + } + $menu_bar = array_merge($menu_bar, $dropdowns); + $app_button = $this->renderApplicationMenuButton(); $search_button = $this->renderSearchMenuButton($header_id); + } else if (!$viewer->isLoggedIn()) { + $app_button = $this->renderApplicationMenuButton(); + if (PhabricatorEnv::getEnvConfig('policy.allow-public')) { + $search_button = $this->renderSearchMenuButton($header_id); + } } - $search_menu = $this->renderPhabricatorSearchMenu(); + if ($search_button) { + $search_menu = $this->renderPhabricatorSearchMenu(); + } else { + $search_menu = null; + } if ($alerts) { - $alerts = phutil_tag( + $alerts = javelin_tag( 'div', array( 'class' => 'phabricator-main-menu-alerts', + 'aural' => false, ), $alerts); } - $application_menu = $this->renderApplicationMenu(); + if ($aural) { + $aural = javelin_tag( + 'span', + array( + 'aural' => true, + ), + phutil_implode_html(' ', $aural)); + } + + $extensions = PhabricatorMainMenuBarExtension::getAllEnabledExtensions(); + foreach ($extensions as $extension) { + $extension + ->setViewer($viewer) + ->setIsFullSession($is_full); + + $controller = $this->getController(); + if ($controller) { + $extension->setController($controller); + $application = $controller->getCurrentApplication(); + if ($application) { + $extension->setApplication($application); + } + } + } + + if (!$is_full) { + foreach ($extensions as $key => $extension) { + if ($extension->shouldRequireFullSession()) { + unset($extensions[$key]); + } + } + } + + foreach ($extensions as $key => $extension) { + if (!$extension->isExtensionEnabledForViewer($extension->getViewer())) { + unset($extensions[$key]); + } + } + + $menus = array(); + foreach ($extensions as $extension) { + foreach ($extension->buildMainMenus() as $menu) { + $menus[] = $menu; + } + } + + // Because we display these with "float: right", reverse their order before + // rendering them into the document so that the extension order and display + // order are the same. + $menus = array_reverse($menus); + + foreach ($menus as $menu) { + $menu_bar[] = $menu; + } + + $classes = array(); + $classes[] = 'phabricator-main-menu'; + $classes[] = 'phabricator-main-menu-background'; return phutil_tag( 'div', array( - 'class' => 'phabricator-main-menu', + 'class' => implode(' ', $classes), 'id' => $header_id, ), array( @@ -76,14 +163,14 @@ public function render() { $search_button, $this->renderPhabricatorLogo(), $alerts, - $application_menu, + $aural, $search_menu, - $menus, + $menu_bar, )); } private function renderSearch() { - $user = $this->user; + $viewer = $this->getViewer(); $result = null; @@ -91,19 +178,37 @@ private function renderSearch() { 'helpURI' => '/help/keyboardshortcut/', ); - if ($user->isLoggedIn()) { + if ($viewer->isLoggedIn()) { + $show_search = $viewer->isUserActivated(); + } else { + $show_search = PhabricatorEnv::getEnvConfig('policy.allow-public'); + } + + if ($show_search) { $search = new PhabricatorMainMenuSearchView(); - $search->setUser($user); - $search->setScope($this->getDefaultSearchScope()); - $result = $search; + $search->setViewer($viewer); - $pref_shortcut = PhabricatorUserPreferences::PREFERENCE_SEARCH_SHORTCUT; - if ($user->loadPreferences()->getPreference($pref_shortcut, true)) { - $keyboard_config['searchID'] = $search->getID(); + $application = null; + $controller = $this->getController(); + if ($controller) { + $application = $controller->getCurrentApplication(); + } + if ($application) { + $search->setApplication($application); } + + $result = $search; + $keyboard_config['searchID'] = $search->getID(); } - Javelin::initBehavior('phabricator-keyboard-shortcuts', $keyboard_config); + $keyboard_config['pht'] = array( + '/' => pht('Give keyboard focus to the search box.'), + '?' => pht('Show keyboard shortcut help for the current page.'), + ); + + Javelin::initBehavior( + 'phabricator-keyboard-shortcuts', + $keyboard_config); if ($result) { $result = id(new PHUIListItemView()) @@ -114,71 +219,38 @@ private function renderSearch() { return $result; } - public function renderApplicationMenuButton($header_id) { - $button_id = celerity_generate_unique_node_id(); - return javelin_tag( - 'a', - array( - 'class' => 'phabricator-main-menu-expand-button '. - 'phabricator-expand-search-menu', - 'sigil' => 'jx-toggle-class', - 'meta' => array( - 'map' => array( - $header_id => 'phabricator-application-menu-expanded', - $button_id => 'menu-icon-app-blue', - ), - ), - ), - phutil_tag( - 'span', - array( - 'class' => 'phabricator-menu-button-icon sprite-menu menu-icon-app', - 'id' => $button_id, - ), - '')); - } - - public function renderApplicationMenu() { - $user = $this->getUser(); - $controller = $this->getController(); - - $applications = PhabricatorApplication::getAllInstalledApplications(); - - $actions = array(); - foreach ($applications as $application) { - $app_actions = $application->buildMainMenuItems($user, $controller); - foreach ($app_actions as $action) { - $actions[] = $action; - } + public function renderApplicationMenuButton() { + $dropdown = $this->renderApplicationMenu(); + if (!$dropdown) { + return null; } - $view = $this->getApplicationMenu(); - - if (!$view) { - $view = new PHUIListView(); - } + return id(new PHUIButtonView()) + ->setTag('a') + ->setHref('#') + ->setIcon('fa-bars') + ->addClass('phabricator-core-user-menu') + ->addClass('phabricator-core-user-mobile-menu') + ->setNoCSS(true) + ->setDropdownMenu($dropdown) + ->setAuralLabel(pht('Page Menu')); + } - $view->addClass('phabricator-dark-menu'); - $view->addClass('phabricator-application-menu'); - - if ($actions) { - $view->addMenuItem( - id(new PHUIListItemView()) - ->setType(PHUIListItemView::TYPE_LABEL) - ->setName(pht('Actions'))); - foreach ($actions as $action) { - $icon = $action->getIcon(); - if ($icon) { - if ($action->getSelected()) { - $action->appendChild($this->renderMenuIcon($icon.'-blue-large')); - } else { - $action->appendChild($this->renderMenuIcon($icon.'-light-large')); - } - } - $view->addMenuItem($action); + private function renderApplicationMenu() { + $viewer = $this->getViewer(); + $view = $this->getApplicationMenu(); + if ($view) { + $items = $view->getItems(); + $view = id(new PhabricatorActionListView()) + ->setViewer($viewer); + foreach ($items as $item) { + $view->addAction( + id(new PhabricatorActionView()) + ->setName($item->getName()) + ->setHref($item->getHref()) + ->setType($item->getType())); } } - return $view; } @@ -193,14 +265,15 @@ public function renderSearchMenuButton($header_id) { 'meta' => array( 'map' => array( $header_id => 'phabricator-search-menu-expanded', - $button_id => 'menu-icon-search-blue', + $button_id => 'menu-icon-selected', ), ), ), phutil_tag( 'span', array( - 'class' => 'phabricator-menu-button-icon sprite-menu menu-icon-search', + 'class' => 'phabricator-menu-button-icon phui-icon-view '. + 'phui-font-fa fa-search', 'id' => $button_id, ), '')); @@ -209,7 +282,6 @@ public function renderSearchMenuButton($header_id) { private function renderPhabricatorSearchMenu() { $view = new PHUIListView(); - $view->addClass('phabricator-dark-menu'); $view->addClass('phabricator-search-menu'); $search = $this->renderSearch(); @@ -221,62 +293,126 @@ private function renderPhabricatorSearchMenu() { } private function renderPhabricatorLogo() { + $custom_header = PhabricatorCustomLogoConfigType::getLogoImagePHID(); + + $logo_style = array(); + if ($custom_header) { + $cache = PhabricatorCaches::getImmutableCache(); + $cache_key_logo = 'ui.custom-header.logo-phid.v3.'.$custom_header; + + $logo_uri = $cache->getKey($cache_key_logo); + if (!$logo_uri) { + // NOTE: If the file policy has been changed to be restrictive, we'll + // miss here and just show the default logo. The cache will fill later + // when someone who can see the file loads the page. This might be a + // little spooky, see T11982. + $files = id(new PhabricatorFileQuery()) + ->setViewer($this->getViewer()) + ->withPHIDs(array($custom_header)) + ->execute(); + $file = head($files); + if ($file) { + $logo_uri = $file->getViewURI(); + $cache->setKey($cache_key_logo, $logo_uri); + } + } + + if ($logo_uri) { + $logo_style[] = 'background-size: 40px 40px;'; + $logo_style[] = 'background-position: 0 0;'; + $logo_style[] = 'background-image: url('http://github.com/.$logo_uri.')'; + } + } + + $logo_node = phutil_tag( + 'span', + array( + 'class' => 'phabricator-main-menu-eye', + 'style' => implode(' ', $logo_style), + )); + + + $wordmark_text = PhabricatorCustomLogoConfigType::getLogoWordmark(); + if ($wordmark_text === null || !strlen($wordmark_text)) { + $wordmark_text = PlatformSymbols::getPlatformServerName(); + } + + $wordmark_node = phutil_tag( + 'span', + array( + 'class' => 'phabricator-wordmark', + ), + $wordmark_text); + return phutil_tag( 'a', array( - 'class' => 'phabricator-main-menu-logo', + 'class' => 'phabricator-main-menu-brand', 'href' => '/', ), - phutil_tag( - 'span', - array( - 'class' => 'sprite-menu phabricator-main-menu-logo-image', - ), - '')); + array( + javelin_tag( + 'span', + array( + 'aural' => true, + ), + pht('Home')), + $logo_node, + $wordmark_node, + )); } private function renderNotificationMenu() { - $user = $this->user; + $viewer = $this->getViewer(); require_celerity_resource('phabricator-notification-css'); require_celerity_resource('phabricator-notification-menu-css'); - require_celerity_resource('sprite-menu-css'); - $container_classes = array( - 'sprite-menu', - 'alert-notifications', - ); + $container_classes = array('alert-notifications'); + $aural = array(); + + $dropdown_query = id(new AphlictDropdownDataQuery()) + ->setViewer($viewer); + $dropdown_data = $dropdown_query->execute(); $message_tag = ''; $message_notification_dropdown = ''; - $conpherence = 'PhabricatorApplicationConpherence'; - if (PhabricatorApplication::isClassInstalled($conpherence)) { + $conpherence_app = 'PhabricatorConpherenceApplication'; + $conpherence_data = $dropdown_data[$conpherence_app]; + if ($conpherence_data['isInstalled']) { $message_id = celerity_generate_unique_node_id(); $message_count_id = celerity_generate_unique_node_id(); $message_dropdown_id = celerity_generate_unique_node_id(); - $unread_status = ConpherenceParticipationStatus::BEHIND; - $unread = id(new ConpherenceParticipantCountQuery()) - ->withParticipantPHIDs(array($user->getPHID())) - ->withParticipationStatus($unread_status) - ->execute(); - $message_count_number = idx($unread, $user->getPHID(), 0); - if ($message_count_number > 999) { - $message_count_number = "\xE2\x88\x9E"; + $message_count_number = $conpherence_data['rawCount']; + + if ($message_count_number) { + $aural[] = phutil_tag( + 'a', + array( + 'href' => '/conpherence/', + ), + pht( + '%s unread messages.', + new PhutilNumber($message_count_number))); + } else { + $aural[] = pht('No messages.'); } $message_count_tag = phutil_tag( 'span', array( 'id' => $message_count_id, - 'class' => 'phabricator-main-menu-message-count' + 'class' => 'phabricator-main-menu-message-count', ), - $message_count_number); + $conpherence_data['count']); - $message_icon_tag = phutil_tag( + $message_icon_tag = javelin_tag( 'span', array( - 'class' => 'sprite-menu phabricator-main-menu-message-icon', + 'class' => 'phabricator-main-menu-message-icon phui-icon-view '. + 'phui-font-fa fa-comments', + 'sigil' => 'menu-icon', ), ''); @@ -304,7 +440,10 @@ private function renderNotificationMenu() { 'dropdownID' => $message_dropdown_id, 'loadingText' => pht('Loading...'), 'uri' => '/conpherence/panel/', - )); + 'countType' => $conpherence_data['countType'], + 'countNumber' => $message_count_number, + 'unreadClass' => 'message-unread', + ) + self::getFavicons()); $message_notification_dropdown = javelin_tag( 'div', @@ -317,83 +456,281 @@ private function renderNotificationMenu() { ''); } - $count_id = celerity_generate_unique_node_id(); - $dropdown_id = celerity_generate_unique_node_id(); - $bubble_id = celerity_generate_unique_node_id(); + $bubble_tag = ''; + $notification_dropdown = ''; + $notification_app = 'PhabricatorNotificationsApplication'; + $notification_data = $dropdown_data[$notification_app]; + if ($notification_data['isInstalled']) { + $count_id = celerity_generate_unique_node_id(); + $dropdown_id = celerity_generate_unique_node_id(); + $bubble_id = celerity_generate_unique_node_id(); + + $count_number = $notification_data['rawCount']; + + if ($count_number) { + $aural[] = phutil_tag( + 'a', + array( + 'href' => '/notification/', + ), + pht( + '%s unread notifications.', + new PhutilNumber($count_number))); + } else { + $aural[] = pht('No notifications.'); + } - $count_number = id(new PhabricatorFeedStoryNotification()) - ->countUnread($user); + $count_tag = phutil_tag( + 'span', + array( + 'id' => $count_id, + 'class' => 'phabricator-main-menu-alert-count', + ), + $notification_data['count']); - if ($count_number > 999) { - $count_number = "\xE2\x88\x9E"; - } + $icon_tag = javelin_tag( + 'span', + array( + 'class' => 'phabricator-main-menu-alert-icon phui-icon-view '. + 'phui-font-fa fa-bell', + 'sigil' => 'menu-icon', + ), + ''); - $count_tag = phutil_tag( - 'span', - array( - 'id' => $count_id, - 'class' => 'phabricator-main-menu-alert-count' - ), - $count_number); + if ($count_number) { + $container_classes[] = 'alert-unread'; + } - $icon_tag = phutil_tag( - 'span', - array( - 'class' => 'sprite-menu phabricator-main-menu-alert-icon', - ), - ''); + $bubble_tag = phutil_tag( + 'a', + array( + 'href' => '/notification/', + 'class' => implode(' ', $container_classes), + 'id' => $bubble_id, + ), + array($icon_tag, $count_tag)); - if ($count_number) { - $container_classes[] = 'alert-unread'; + Javelin::initBehavior( + 'aphlict-dropdown', + array( + 'bubbleID' => $bubble_id, + 'countID' => $count_id, + 'dropdownID' => $dropdown_id, + 'loadingText' => pht('Loading...'), + 'uri' => '/notification/panel/', + 'countType' => $notification_data['countType'], + 'countNumber' => $count_number, + 'unreadClass' => 'alert-unread', + ) + self::getFavicons()); + + $notification_dropdown = javelin_tag( + 'div', + array( + 'id' => $dropdown_id, + 'class' => 'phabricator-notification-menu', + 'sigil' => 'phabricator-notification-menu', + 'style' => 'display: none;', + ), + ''); } - $bubble_tag = phutil_tag( - 'a', - array( - 'href' => '/notification/', - 'class' => implode(' ', $container_classes), - 'id' => $bubble_id, - ), - array($icon_tag, $count_tag)); + // Admin Level Urgent Notification Channel + $setup_tag = ''; + $setup_notification_dropdown = ''; + if ($viewer && $viewer->getIsAdmin()) { + $open = PhabricatorSetupCheck::getOpenSetupIssueKeys(); + if ($open) { + $setup_id = celerity_generate_unique_node_id(); + $setup_count_id = celerity_generate_unique_node_id(); + $setup_dropdown_id = celerity_generate_unique_node_id(); + + $setup_count_number = count($open); + + if ($setup_count_number) { + $aural[] = phutil_tag( + 'a', + array( + 'href' => '/config/issue/', + ), + pht( + '%s unresolved issues.', + new PhutilNumber($setup_count_number))); + } else { + $aural[] = pht('No issues.'); + } - Javelin::initBehavior( - 'aphlict-dropdown', - array( - 'bubbleID' => $bubble_id, - 'countID' => $count_id, - 'dropdownID' => $dropdown_id, - 'loadingText' => pht('Loading...'), - 'uri' => '/notification/panel/', - )); + $setup_count_tag = phutil_tag( + 'span', + array( + 'id' => $setup_count_id, + 'class' => 'phabricator-main-menu-setup-count', + ), + $setup_count_number); + + $setup_icon_tag = javelin_tag( + 'span', + array( + 'class' => 'phabricator-main-menu-setup-icon phui-icon-view '. + 'phui-font-fa fa-exclamation-circle', + 'sigil' => 'menu-icon', + ), + ''); - $notification_dropdown = javelin_tag( - 'div', - array( - 'id' => $dropdown_id, - 'class' => 'phabricator-notification-menu', - 'sigil' => 'phabricator-notification-menu', - 'style' => 'display: none;', - ), - ''); + if ($setup_count_number) { + $container_classes[] = 'setup-unread'; + } + + $setup_tag = phutil_tag( + 'a', + array( + 'href' => '/config/issue/', + 'class' => implode(' ', $container_classes), + 'id' => $setup_id, + ), + array( + $setup_icon_tag, + $setup_count_tag, + )); + + Javelin::initBehavior( + 'aphlict-dropdown', + array( + 'bubbleID' => $setup_id, + 'countID' => $setup_count_id, + 'dropdownID' => $setup_dropdown_id, + 'loadingText' => pht('Loading...'), + 'uri' => '/config/issue/panel/', + 'countType' => null, + 'countNumber' => null, + 'unreadClass' => 'setup-unread', + ) + self::getFavicons()); + + $setup_notification_dropdown = javelin_tag( + 'div', + array( + 'id' => $setup_dropdown_id, + 'class' => 'phabricator-notification-menu', + 'sigil' => 'phabricator-notification-menu', + 'style' => 'display: none;', + ), + ''); + } + } + + $user_dropdown = null; + $user_tag = null; + if ($viewer->isLoggedIn()) { + if (!$viewer->getIsEmailVerified()) { + $bubble_id = celerity_generate_unique_node_id(); + $count_id = celerity_generate_unique_node_id(); + $dropdown_id = celerity_generate_unique_node_id(); + + $settings_uri = id(new PhabricatorEmailAddressesSettingsPanel()) + ->setViewer($viewer) + ->setUser($viewer) + ->getPanelURI(); + + $user_icon = javelin_tag( + 'span', + array( + 'class' => 'phabricator-main-menu-setup-icon phui-icon-view '. + 'phui-font-fa fa-user', + 'sigil' => 'menu-icon', + )); + + $user_count = javelin_tag( + 'span', + array( + 'class' => 'phabricator-main-menu-setup-count', + 'id' => $count_id, + ), + 1); + + $user_tag = phutil_tag( + 'a', + array( + 'href' => $settings_uri, + 'class' => 'setup-unread', + 'id' => $bubble_id, + ), + array( + $user_icon, + $user_count, + )); + + Javelin::initBehavior( + 'aphlict-dropdown', + array( + 'bubbleID' => $bubble_id, + 'countID' => $count_id, + 'dropdownID' => $dropdown_id, + 'loadingText' => pht('Loading...'), + 'uri' => '/settings/issue/', + 'unreadClass' => 'setup-unread', + )); + + $user_dropdown = javelin_tag( + 'div', + array( + 'id' => $dropdown_id, + 'class' => 'phabricator-notification-menu', + 'sigil' => 'phabricator-notification-menu', + 'style' => 'display: none;', + )); + } + } $dropdowns = array( $notification_dropdown, - $message_notification_dropdown); + $message_notification_dropdown, + $setup_notification_dropdown, + $user_dropdown, + ); return array( - hsprintf('%s%s', $bubble_tag, $message_tag), - $dropdowns + array( + $bubble_tag, + $message_tag, + $setup_tag, + $user_tag, + ), + $dropdowns, + $aural, ); } - private function renderMenuIcon($name) { - return phutil_tag( - 'span', - array( - 'class' => 'phabricator-core-menu-icon '. - 'sprite-apps-large apps-'.$name, - ), - ''); + private function isFullSession(PhabricatorUser $viewer) { + if (!$viewer->isLoggedIn()) { + return false; + } + + if (!$viewer->isUserActivated()) { + return false; + } + + if (!$viewer->hasSession()) { + return false; + } + + $session = $viewer->getSession(); + if ($session->getIsPartial()) { + return false; + } + + if (!$session->getSignedLegalpadDocuments()) { + return false; + } + + $mfa_key = 'security.require-multi-factor-auth'; + $need_mfa = PhabricatorEnv::getEnvConfig($mfa_key); + if ($need_mfa) { + $have_mfa = $viewer->getIsEnrolledInMultiFactor(); + if (!$have_mfa) { + return false; + } + } + + return true; } } diff --git a/src/view/phui/PHUI.php b/src/view/phui/PHUI.php index 8848b99e1d..bf8efbeaaf 100644 --- a/src/view/phui/PHUI.php +++ b/src/view/phui/PHUI.php @@ -1,6 +1,6 @@ href = $href; + return $this; + } + + public function setIcon($image) { + $this->fontIcon = $image; + return $this; + } + + public function setImage($image) { + $this->image = $image; + return $this; + } + + public function setBigText($text) { + $this->bigText = $text; + return $this; + } + + public function setHeader($header) { + $this->header = $header; + return $this; + } + + public function setSubHeader($sub) { + $this->subHeader = $sub; + return $this; + } + + public function setState($state) { + $this->state = $state; + return $this; + } + + public function setStatus($text) { + $this->status = $text; + return $this; + } + + protected function getTagName() { + return 'div'; + } + + protected function getTagAttributes() { + require_celerity_resource('phui-action-panel-css'); + + $classes = array(); + $classes[] = 'phui-action-panel'; + if ($this->state) { + $classes[] = $this->state; + } + if ($this->bigText) { + $classes[] = 'phui-action-panel-bigtext'; + } + + return array( + 'class' => implode(' ', $classes), + ); + } + + protected function getTagContent() { + + $icon = null; + if ($this->fontIcon) { + $fonticon = id(new PHUIIconView()) + ->setIcon($this->fontIcon); + $icon = phutil_tag( + 'span', + array( + 'class' => 'phui-action-panel-icon', + ), + $fonticon); + } + + if ($this->image) { + $image = phutil_tag( + 'img', + array( + 'class' => 'phui-action-panel-image', + 'src' => $this->image, + )); + $icon = phutil_tag( + 'span', + array( + 'class' => 'phui-action-panel-icon', + ), + $image); + } + + $header = null; + if ($this->header) { + $header = phutil_tag( + 'span', + array( + 'class' => 'phui-action-panel-header', + ), + $this->header); + } + + $subheader = null; + if ($this->subHeader) { + $subheader = phutil_tag( + 'span', + array( + 'class' => 'phui-action-panel-subheader', + ), + $this->subHeader); + } + + $row = phutil_tag( + 'span', + array( + 'class' => 'phui-action-panel-row', + ), + array( + $icon, + $subheader, + )); + + $table = phutil_tag( + 'span', + array( + 'class' => 'phui-action-panel-table', + ), + $row); + + return phutil_tag( + 'a', + array( + 'href' => $this->href, + 'class' => 'phui-action-panel-hitarea', + ), + array($header, $table)); + + } + +} diff --git a/src/view/phui/PHUIBadgeBoxView.php b/src/view/phui/PHUIBadgeBoxView.php new file mode 100644 index 0000000000..facceace3a --- /dev/null +++ b/src/view/phui/PHUIBadgeBoxView.php @@ -0,0 +1,57 @@ +items[] = $item; + return $this; + } + + public function setCollapsed($collapsed) { + $this->collapsed = $collapsed; + return $this; + } + + public function addItems($items) { + foreach ($items as $item) { + $this->items[] = $item; + } + return $this; + } + + protected function getTagName() { + return 'ul'; + } + + protected function getTagAttributes() { + require_celerity_resource('phui-badge-view-css'); + + $classes = array(); + $classes[] = 'phui-badge-flex-view'; + $classes[] = 'grouped'; + if ($this->collapsed) { + $classes[] = 'flex-view-collapsed'; + } + + return array( + 'class' => implode(' ', $classes), + ); + } + + protected function getTagContent() { + $items = array(); + foreach ($this->items as $item) { + $items[] = phutil_tag( + 'li', + array( + 'class' => 'phui-badge-flex-item', + ), + $item); + } + return $items; + + } +} diff --git a/src/view/phui/PHUIBadgeMiniView.php b/src/view/phui/PHUIBadgeMiniView.php new file mode 100644 index 0000000000..4e058ed29d --- /dev/null +++ b/src/view/phui/PHUIBadgeMiniView.php @@ -0,0 +1,73 @@ +icon = $icon; + return $this; + } + + public function setHref($href) { + $this->href = $href; + return $this; + } + + public function setQuality($quality) { + $this->quality = $quality; + return $this; + } + + public function setHeader($header) { + $this->header = $header; + return $this; + } + + public function setTipDirection($direction) { + $this->tipDirection = $direction; + return $this; + } + + protected function getTagName() { + if ($this->href) { + return 'a'; + } else { + return 'span'; + } + } + + protected function getTagAttributes() { + require_celerity_resource('phui-badge-view-css'); + Javelin::initBehavior('phabricator-tooltips'); + + $classes = array(); + $classes[] = 'phui-badge-mini'; + if ($this->quality) { + $quality_color = PhabricatorBadgesQuality::getQualityColor( + $this->quality); + $classes[] = 'phui-badge-mini-'.$quality_color; + } + + return array( + 'class' => implode(' ', $classes), + 'sigil' => 'has-tooltip', + 'href' => $this->href, + 'meta' => array( + 'tip' => $this->header, + 'align' => $this->tipDirection, + 'size' => 300, + ), + ); + } + + protected function getTagContent() { + return id(new PHUIIconView()) + ->setIcon($this->icon); + } + +} diff --git a/src/view/phui/PHUIBadgeView.php b/src/view/phui/PHUIBadgeView.php new file mode 100644 index 0000000000..5ff6e297b0 --- /dev/null +++ b/src/view/phui/PHUIBadgeView.php @@ -0,0 +1,196 @@ +icon = $icon; + return $this; + } + + public function setHref($href) { + $this->href = $href; + return $this; + } + + public function setQuality($quality) { + $this->quality = $quality; + return $this; + } + + private function getQualityColor() { + return PhabricatorBadgesQuality::getQualityColor($this->quality); + } + + private function getQualityName() { + return PhabricatorBadgesQuality::getQualityName($this->quality); + } + + public function setSource($source) { + $this->source = $source; + return $this; + } + + public function setHeader($header) { + $this->header = $header; + return $this; + } + + public function setSubhead($subhead) { + $this->subhead = $subhead; + return $this; + } + + public function addByline($byline) { + $this->bylines[] = $byline; + return $this; + } + + protected function getTagName() { + return 'span'; + } + + protected function getTagAttributes() { + require_celerity_resource('phui-badge-view-css'); + $id = celerity_generate_unique_node_id(); + + Javelin::initBehavior('badge-view', array()); + + $classes = array(); + $classes[] = 'phui-badge-view'; + if ($this->quality) { + $color = $this->getQualityColor(); + $classes[] = 'phui-badge-view-'.$color; + } + + return array( + 'class' => implode(' ', $classes), + 'sigil' => 'jx-badge-view', + 'id' => $id, + 'meta' => array( + 'map' => array( + $id => 'card-flipped', + ), + ), + ); + } + + protected function getTagContent() { + + $icon = id(new PHUIIconView()) + ->setIcon($this->icon); + + $illustration = phutil_tag_div('phui-badge-illustration', $icon); + + $header = null; + if ($this->header) { + $header = phutil_tag( + ($this->href) ? 'a' : 'span', + array( + 'class' => 'phui-badge-view-header', + 'href' => $this->href, + ), + $this->header); + } + + $subhead = null; + if ($this->subhead) { + $subhead = phutil_tag_div('phui-badge-view-subhead', $this->subhead); + } + + $information = phutil_tag( + 'div', + array( + 'class' => 'phui-badge-view-information', + ), + array($header, $subhead)); + + $quality = phutil_tag_div('phui-badge-quality', $this->getQualityName()); + $source = phutil_tag_div('phui-badge-source', $this->source); + + $bylines = array(); + if ($this->bylines) { + foreach ($this->bylines as $byline) { + $bylines[] = phutil_tag_div('phui-badge-byline', $byline); + } + } + + $card_front_1 = phutil_tag( + 'div', + array( + 'class' => 'phui-badge-inner-front', + ), + array( + $illustration, + )); + + $card_front_2 = phutil_tag( + 'div', + array( + 'class' => 'phui-badge-inner-front', + ), + array( + $information, + )); + + $back_info = phutil_tag( + 'div', + array( + 'class' => 'phui-badge-view-information', + ), + array( + $quality, + $source, + $bylines, + )); + + $card_back = phutil_tag( + 'div', + array( + 'class' => 'phui-badge-inner-back', + ), + array( + $back_info, + )); + + $inner_front = phutil_tag( + 'div', + array( + 'class' => 'phui-badge-front-view', + ), + array( + $card_front_1, + $card_front_2, + )); + + $inner_back = phutil_tag_div('phui-badge-back-view', $card_back); + $front = phutil_tag_div('phui-badge-card-front', $inner_front); + $back = phutil_tag_div('phui-badge-card-back', $inner_back); + + $card = phutil_tag( + 'div', + array( + 'class' => 'phui-badge-card', + ), + array( + $front, + $back, + )); + + return phutil_tag( + 'div', + array( + 'class' => 'phui-badge-card-container', + ), + $card); + + } + +} diff --git a/src/view/phui/PHUIBigInfoView.php b/src/view/phui/PHUIBigInfoView.php new file mode 100644 index 0000000000..31a458ed60 --- /dev/null +++ b/src/view/phui/PHUIBigInfoView.php @@ -0,0 +1,119 @@ +icon = $icon; + return $this; + } + + public function setTitle($title) { + $this->title = $title; + return $this; + } + + public function setDescription($description) { + $this->description = $description; + return $this; + } + + public function setImage($image) { + $this->image = $image; + return $this; + } + + public function addAction(PHUIButtonView $button) { + $this->actions[] = $button; + return $this; + } + + protected function getTagName() { + return 'div'; + } + + protected function getTagAttributes() { + $classes = array(); + $classes[] = 'phui-big-info-view'; + + return array( + 'class' => implode(' ', $classes), + ); + } + + protected function getTagContent() { + require_celerity_resource('phui-big-info-view-css'); + + $icon = null; + if ($this->icon) { + $icon = id(new PHUIIconView()) + ->setIcon($this->icon) + ->addClass('phui-big-info-icon'); + + $icon = phutil_tag( + 'div', + array( + 'class' => 'phui-big-info-icon-container', + ), + $icon); + } + + if ($this->image) { + $image = phutil_tag( + 'img', + array( + 'class' => 'phui-big-info-image', + 'src' => $this->image, + )); + $icon = phutil_tag( + 'span', + array( + 'class' => 'phui-big-info-icon-container', + ), + $image); + } + + $title = phutil_tag( + 'div', + array( + 'class' => 'phui-big-info-title', + ), + $this->title); + + $description = phutil_tag( + 'div', + array( + 'class' => 'phui-big-info-description', + ), + $this->description); + + $buttons = array(); + foreach ($this->actions as $button) { + $buttons[] = phutil_tag( + 'div', + array( + 'class' => 'phui-big-info-button', + ), + $button); + } + + $actions = null; + if ($buttons) { + $actions = phutil_tag( + 'div', + array( + 'class' => 'phui-big-info-actions', + ), + $buttons); + } + + return array($icon, $title, $description, $actions); + + } + +} diff --git a/src/view/phui/PHUIBoxView.php b/src/view/phui/PHUIBoxView.php index 6dbf90f34a..7068f8811c 100644 --- a/src/view/phui/PHUIBoxView.php +++ b/src/view/phui/PHUIBoxView.php @@ -4,7 +4,11 @@ final class PHUIBoxView extends AphrontTagView { private $margin = array(); private $padding = array(); - private $shadow = false; + private $border = false; + private $color; + + const BLUE = 'phui-box-blue'; + const GREY = 'phui-box-grey'; public function addMargin($margin) { $this->margin[] = $margin; @@ -16,42 +20,45 @@ public function addPadding($padding) { return $this; } - public function setShadow($shadow) { - $this->shadow = $shadow; + public function setBorder($border) { + $this->border = $border; return $this; } - public function getTagContent() { + public function setColor($color) { + $this->color = $color; + return $this; + } + protected function getTagAttributes() { require_celerity_resource('phui-box-css'); - $outer_classes = array(); $outer_classes[] = 'phui-box'; - if ($this->shadow) { - $outer_classes[] = 'phui-box-shadow'; + + if ($this->border) { + $outer_classes[] = 'phui-box-border'; } + foreach ($this->margin as $margin) { $outer_classes[] = $margin; } - $inner_classes = array(); - $inner_classes[] = 'phui-box-inner'; foreach ($this->padding as $padding) { - $inner_classes[] = $padding; + $outer_classes[] = $padding; } - $inner = phutil_tag( - 'div', - array( - 'class' => implode(' ', $inner_classes) - ), - $this->renderChildren()); - - return phutil_tag( - 'div', - array( - 'class' => implode(' ', $outer_classes) - ), - $inner); + if ($this->color) { + $outer_classes[] = $this->color; + } + + return array('class' => $outer_classes); + } + + protected function getTagName() { + return 'div'; + } + + protected function getTagContent() { + return $this->renderChildren(); } } diff --git a/src/view/phui/PHUIButtonBarView.php b/src/view/phui/PHUIButtonBarView.php new file mode 100644 index 0000000000..78443929d8 --- /dev/null +++ b/src/view/phui/PHUIButtonBarView.php @@ -0,0 +1,53 @@ +buttons[] = $button; + return $this; + } + + public function setBorderless($borderless) { + $this->borderless = $borderless; + return $this; + } + + protected function getTagAttributes() { + $classes = array(); + $classes[] = 'phui-button-bar'; + if ($this->borderless) { + $classes[] = 'phui-button-bar-borderless'; + } + return array('class' => implode(' ', $classes)); + } + + protected function getTagName() { + return 'span'; + } + + protected function getTagContent() { + require_celerity_resource('phui-button-bar-css'); + + $i = 1; + $j = count($this->buttons); + foreach ($this->buttons as $button) { + // LeeLoo Dallas Multi-Pass + if ($j > 1) { + if ($i == 1) { + $button->addClass('phui-button-bar-first'); + } else if ($i == $j) { + $button->addClass('phui-button-bar-last'); + } else if ($j > 1) { + $button->addClass('phui-button-bar-middle'); + } + } + $this->appendChild($button); + $i++; + } + + return $this->renderChildren(); + } +} diff --git a/src/view/phui/PHUIButtonView.php b/src/view/phui/PHUIButtonView.php index 3970b882f2..2231649f12 100644 --- a/src/view/phui/PHUIButtonView.php +++ b/src/view/phui/PHUIButtonView.php @@ -4,12 +4,16 @@ final class PHUIButtonView extends AphrontTagView { const GREEN = 'green'; const GREY = 'grey'; - const BLACK = 'black'; + const BLUE = 'blue'; + const RED = 'red'; const DISABLED = 'disabled'; const SMALL = 'small'; const BIG = 'big'; + const BUTTONTYPE_DEFAULT = 'buttontype.default'; + const BUTTONTYPE_SIMPLE = 'buttontype.simple'; + private $size; private $text; private $subtext; @@ -17,12 +21,42 @@ final class PHUIButtonView extends AphrontTagView { private $tag = 'button'; private $dropdown; private $icon; + private $iconFirst; + private $href = null; + private $title = null; + private $disabled; + private $selected; + private $name; + private $tooltip; + private $noCSS; + private $hasCaret; + private $buttonType = self::BUTTONTYPE_DEFAULT; + private $auralLabel; + + public function setName($name) { + $this->name = $name; + return $this; + } + + public function getName() { + return $this->name; + } public function setText($text) { $this->text = $text; return $this; } + public function setHref($href) { + $this->href = $href; + return $this; + } + + public function setTitle($title) { + $this->title = $title; + return $this; + } + public function setSubtext($subtext) { $this->subtext = $subtext; return $this; @@ -33,6 +67,20 @@ public function setColor($color) { return $this; } + public function getColor() { + return $this->color; + } + + public function setDisabled($disabled) { + $this->disabled = $disabled; + return $this; + } + + public function setSelected($selected) { + $this->selected = $selected; + return $this; + } + public function setTag($tag) { $this->tag = $tag; return $this; @@ -48,24 +96,89 @@ public function setDropdown($dd) { return $this; } - public function setIcon(PHUIIconView $icon) { + public function setTooltip($text) { + $this->tooltip = $text; + return $this; + } + + public function setNoCSS($no_css) { + $this->noCSS = $no_css; + return $this; + } + + public function setHasCaret($has_caret) { + $this->hasCaret = $has_caret; + return $this; + } + + public function getHasCaret() { + return $this->hasCaret; + } + + public function setButtonType($button_type) { + $this->buttonType = $button_type; + return $this; + } + + public function getButtonType() { + return $this->buttonType; + } + + public function setAuralLabel($aural_label) { + $this->auralLabel = $aural_label; + return $this; + } + + public function getAuralLabel() { + return $this->auralLabel; + } + + public function setIcon($icon, $first = true) { + if (!($icon instanceof PHUIIconView)) { + $icon = id(new PHUIIconView()) + ->setIcon($icon); + } $this->icon = $icon; + $this->iconFirst = $first; return $this; } - public function getTagName() { + protected function getTagName() { return $this->tag; } + public function setDropdownMenu(PhabricatorActionListView $actions) { + Javelin::initBehavior('phui-dropdown-menu'); + + $this->addSigil('phui-dropdown-menu'); + $this->setDropdown(true); + $this->setMetadata($actions->getDropdownMenuMetadata()); + + return $this; + } + + public function setDropdownMenuID($id) { + Javelin::initBehavior('phui-dropdown-menu'); + + $this->addSigil('phui-dropdown-menu'); + $this->setMetadata( + array( + 'menuID' => $id, + )); + + return $this; + } + protected function getTagAttributes() { require_celerity_resource('phui-button-css'); + require_celerity_resource('phui-button-simple-css'); $classes = array(); $classes[] = 'button'; if ($this->color) { - $classes[] = $this->color; + $classes[] = 'button-'.$this->color; } if ($this->size) { @@ -80,30 +193,122 @@ protected function getTagAttributes() { $classes[] = 'has-icon'; } - return array('class' => $classes); + if ($this->text !== null) { + $classes[] = 'has-text'; + } + + if ($this->iconFirst == false) { + $classes[] = 'icon-last'; + } + + if ($this->disabled) { + $classes[] = 'disabled'; + } + + if ($this->selected) { + $classes[] = 'selected'; + } + + switch ($this->getButtonType()) { + case self::BUTTONTYPE_DEFAULT: + $classes[] = 'phui-button-default'; + break; + case self::BUTTONTYPE_SIMPLE: + $classes[] = 'phui-button-simple'; + break; + } + + $sigil = null; + $meta = null; + if ($this->tooltip) { + Javelin::initBehavior('phabricator-tooltips'); + require_celerity_resource('aphront-tooltip-css'); + $sigil = 'has-tooltip'; + $meta = array( + 'tip' => $this->tooltip, + ); + } + + if ($this->noCSS) { + $classes = array(); + } + + // See PHI823. If we aren't rendering a "
    belongs to. If it's a sub-table, like a + // table in an inline comment, don't copy it. + if (JX.DOM.findAbove(rows[ii], 'table') !== src) { + continue; + } + + if (before) { + dst.insertBefore(rows[ii], before); + } else { + dst.appendChild(rows[ii]); + } + } + }, + + /** + * Get parameters which define the current rendering options. + */ + _getViewParameters: function(state) { + var parameters = { + ref: this._ref, + device: this._getDefaultDeviceRenderer() + }; + + if (state) { + JX.copy(parameters, state); + } + + return parameters; + }, + + /** + * Get the active @{class:JX.Routable} for this changeset. + * + * After issuing a request with @{method:load} or @{method:reload}, you + * can adjust routable settings (like priority) by querying the routable + * with this method. Note that there may not be a current routable. + * + * @return JX.Routable|null Active routable, if one exists. + */ + getRoutable: function() { + return JX.Router.getInstance().getRoutableByKey(this._getRoutableKey()); + }, + + getRendererKey: function() { + return this._rendererKey; + }, + + _getDefaultDeviceRenderer: function() { + // NOTE: If you load the page at one device resolution and then resize to + // a different one we don't re-render the diffs, because it's a + // complicated mess and you could lose inline comments, cursor positions, + // etc. + return (JX.Device.getDevice() == 'desktop') ? '2up' : '1up'; + }, + + getUndoTemplates: function() { + return this._undoTemplates; + }, + + getCharacterEncoding: function() { + return this._characterEncoding; + }, + + getHighlight: function() { + return this._highlight; + }, + + getRequestDocumentEngineKey: function() { + return this._requestDocumentEngineKey; + }, + + getResponseDocumentEngineKey: function() { + return this._responseDocumentEngineKey; + }, + + getAvailableDocumentEngineKeys: function() { + return this._availableDocumentEngineKeys; + }, + + getSelectableItems: function() { + var items = []; + + items.push({ + type: 'file', + changeset: this, + target: this, + nodes: { + begin: this._node, + end: null + } + }); + + if (!this._visible) { + return items; + } + + var rows = JX.DOM.scry(this._node, 'tr'); + + var blocks = []; + var block; + var ii; + var parent_node = null; + for (ii = 0; ii < rows.length; ii++) { + var type = this._getRowType(rows[ii]); + + // This row might be part of a diff inside an inline comment, showing + // an inline edit suggestion. Before we accept it as a possible target + // for selection, make sure it's a child of the right parent. + + if (parent_node === null) { + parent_node = rows[ii].parentNode; + } + + if (type !== null) { + if (rows[ii].parentNode !== parent_node) { + type = null; + } + } + + if (!block || (block.type !== type)) { + block = { + type: type, + items: [] + }; + blocks.push(block); + } + + block.items.push(rows[ii]); + } + + var last_inline = null; + var last_inline_item = null; + for (ii = 0; ii < blocks.length; ii++) { + block = blocks[ii]; + + if (block.type == 'change') { + items.push({ + type: block.type, + changeset: this, + target: block.items[0], + nodes: { + begin: block.items[0], + end: block.items[block.items.length - 1] + } + }); + } + + if (block.type == 'comment') { + for (var jj = 0; jj < block.items.length; jj++) { + var inline = this.getInlineForRow(block.items[jj]); + + // When comments are being edited, they have a hidden row with + // the actual comment and then a visible row with the editor. + + // In this case, we only want to generate one item, but it should + // use the editor as a scroll target. To accomplish this, check if + // this row has the same inline as the previous row. If so, update + // the last item to use this row's nodes. + + if (inline === last_inline) { + last_inline_item.nodes.begin = block.items[jj]; + last_inline_item.nodes.end = block.items[jj]; + continue; + } else { + last_inline = inline; + } + + var is_saved = (!inline.isDraft() && !inline.isEditing()); + + last_inline_item = { + type: block.type, + changeset: this, + target: inline, + hidden: inline.isHidden(), + collapsed: inline.isCollapsed(), + deleted: !inline.getID() && !inline.isEditing(), + nodes: { + begin: block.items[jj], + end: block.items[jj] + }, + attributes: { + unsaved: inline.isEditing(), + anyDraft: inline.isDraft() || inline.isDraftDone(), + undone: (is_saved && !inline.isDone()), + done: (is_saved && inline.isDone()) + } + }; + + items.push(last_inline_item); + } + } + } + + return items; + }, + + _getRowType: function(row) { + // NOTE: Don't do "className.indexOf()" elsewhere. This is evil legacy + // magic. + + if (row.className.indexOf('inline') !== -1) { + return 'comment'; + } + + var cells = JX.DOM.scry(row, 'td'); + for (var ii = 0; ii < cells.length; ii++) { + if (cells[ii].className.indexOf('old') !== -1 || + cells[ii].className.indexOf('new') !== -1) { + return 'change'; + } + } + }, + + _getNodeData: function() { + return JX.Stratcom.getData(this._node); + }, + + getVectors: function() { + return { + pos: JX.$V(this._node), + dim: JX.Vector.getDim(this._node) + }; + }, + + _onresponse: function(sequence, response) { + if (sequence != this._sequence) { + // If this isn't the most recent request, ignore it. This normally + // means the user changed view settings between the time the page loaded + // and the content filled. + return; + } + + // As we populate the changeset list, we try to hold the document scroll + // position steady, so that, e.g., users who want to leave a comment on a + // diff with a large number of changes don't constantly have the text + // area scrolled off the bottom of the screen until the entire diff loads. + // + // There are several major cases here: + // + // - If we're near the top of the document, never scroll. + // - If we're near the bottom of the document, always scroll, unless + // we have an anchor. + // - Otherwise, scroll if the changes were above (or, at least, + // almost entirely above) the viewport. + // + // We don't scroll if the changes were just near the top of the viewport + // because this makes us scroll incorrectly when an anchored change is + // visible. See T12779. + + var target = this._node; + + var old_pos = JX.Vector.getScroll(); + var old_view = JX.Vector.getViewport(); + var old_dim = JX.Vector.getDocument(); + + // Number of pixels away from the top or bottom of the document which + // count as "nearby". + var sticky = 480; + + var near_top = (old_pos.y <= sticky); + var near_bot = ((old_pos.y + old_view.y) >= (old_dim.y - sticky)); + + // If we have an anchor in the URL, never stick to the bottom of the + // page. See T11784 for discussion. + if (window.location.hash) { + near_bot = false; + } + + var target_pos = JX.Vector.getPos(target); + var target_dim = JX.Vector.getDim(target); + var target_bot = (target_pos.y + target_dim.y); + + // Detect if the changeset is entirely (or, at least, almost entirely) + // above us. The height here is roughly the height of the persistent + // banner. + var above_screen = (target_bot < old_pos.y + 64); + + // If we have a URL anchor and are currently nearby, stick to it + // no matter what. + var on_target = null; + if (window.location.hash) { + try { + var anchor = JX.$(window.location.hash.replace('#', '')); + if (anchor) { + var anchor_pos = JX.$V(anchor); + if ((anchor_pos.y > old_pos.y) && + (anchor_pos.y < old_pos.y + 96)) { + on_target = anchor; + } + } + } catch (ignored) { + // If we have a bogus anchor, just ignore it. + } + } + + var frame = this._getContentFrame(); + JX.DOM.setContent(frame, JX.$H(response.changeset)); + + if (this._stabilize) { + if (on_target) { + JX.DOM.scrollToPosition(old_pos.x, JX.$V(on_target).y - 60); + } else if (!near_top) { + if (near_bot || above_screen) { + // Figure out how much taller the document got. + var delta = (JX.Vector.getDocument().y - old_dim.y); + JX.DOM.scrollToPosition(old_pos.x, old_pos.y + delta); + } + } + this._stabilize = false; + } + + this._onchangesetresponse(response); + }, + + _onchangesetresponse: function(response) { + // Code shared by autoload and context responses. + + this._loadChangesetState(response); + this._rebuildAllInlines(); + + JX.Stratcom.invoke('resize'); + }, + + _loadChangesetState: function(state) { + if (state.coverage) { + for (var k in state.coverage) { + try { + JX.DOM.replace(JX.$(k), JX.$H(state.coverage[k])); + } catch (ignored) { + // Not terribly important. + } + } + } + + if (state.undoTemplates) { + this._undoTemplates = state.undoTemplates; + } + + this._rendererKey = state.rendererKey; + this._highlight = state.highlight; + this._characterEncoding = state.characterEncoding; + this._requestDocumentEngineKey = state.requestDocumentEngineKey; + this._responseDocumentEngineKey = state.responseDocumentEngineKey; + this._availableDocumentEngineKeys = state.availableDocumentEngineKeys; + this._isHidden = state.isHidden; + + var is_hidden = !this.isVisible(); + if (this._isHidden != is_hidden) { + this.setVisible(!this._isHidden); + } + + this._isLoading = false; + this.getPathView().setIsLoading(this._isLoading); + }, + + _getContentFrame: function() { + return JX.DOM.find(this._node, 'div', 'changeset-view-content'); + }, + + _getRoutableKey: function() { + return 'changeset-view.' + this._ref + '.' + this._sequence; + }, + + getInlineForRow: function(node) { + var data = JX.Stratcom.getData(node); + + if (!data.inline) { + var inline = this._newInlineForRow(node); + this.getInlines().push(inline); + } + + return data.inline; + }, + + _newInlineForRow: function(node) { + return new JX.DiffInline() + .setChangeset(this) + .bindToRow(node); + }, + + newInlineForRange: function(origin, target, options) { + var list = this.getChangesetList(); + + var src = list.getLineNumberFromHeader(origin); + var dst = list.getLineNumberFromHeader(target); + + var changeset_id = null; + var side = list.getDisplaySideFromHeader(origin); + if (side == 'right') { + changeset_id = this.getRightChangesetID(); + } else { + changeset_id = this.getLeftChangesetID(); + } + + var is_new = false; + if (side == 'right') { + is_new = true; + } else if (this.getRightChangesetID() != this.getLeftChangesetID()) { + is_new = true; + } + + var data = { + origin: origin, + target: target, + number: src, + length: dst - src, + changesetID: changeset_id, + displaySide: side, + isNewFile: is_new + }; + + JX.copy(data, options || {}); + + var inline = new JX.DiffInline() + .setChangeset(this) + .bindToRange(data); + + this.getInlines().push(inline); + + inline.create(); + + return inline; + }, + + newInlineReply: function(original, state) { + var inline = new JX.DiffInline() + .setChangeset(this) + .bindToReply(original); + + this._inlines.push(inline); + + inline.create(state); + + return inline; + }, + + getInlineByID: function(id) { + return this._queryInline('id', id); + }, + + getInlineByPHID: function(phid) { + return this._queryInline('phid', phid); + }, + + _queryInline: function(field, value) { + // First, look for the inline in the objects we've already built. + var inline = this._findInline(field, value); + if (inline) { + return inline; + } + + // If we haven't found a matching inline yet, rebuild all the inlines + // present in the document, then look again. + this._rebuildAllInlines(); + return this._findInline(field, value); + }, + + _findInline: function(field, value) { + var inlines = this.getInlines(); + + for (var ii = 0; ii < inlines.length; ii++) { + var inline = inlines[ii]; + + var target; + switch (field) { + case 'id': + target = inline.getID(); + break; + case 'phid': + target = inline.getPHID(); + break; + } + + if (target == value) { + return inline; + } + } + + return null; + }, + + getInlines: function() { + if (this._inlines === null) { + this._rebuildAllInlines(); + } + + return this._inlines; + }, + + _rebuildAllInlines: function() { + this._inlines = []; + + var rows = JX.DOM.scry(this._node, 'tr'); + var ii; + for (ii = 0; ii < rows.length; ii++) { + var row = rows[ii]; + if (this._getRowType(row) != 'comment') { + continue; + } + + this._inlines.push(this._newInlineForRow(row)); + } + }, + + redrawFileTree: function() { + var inlines = this.getInlines(); + var done = []; + var undone = []; + var inline; + + for (var ii = 0; ii < inlines.length; ii++) { + inline = inlines[ii]; + + if (inline.isDeleted()) { + continue; + } + + if (inline.isUndo()) { + continue; + } + + if (inline.isSynthetic()) { + continue; + } + + if (inline.isEditing()) { + continue; + } + + if (!inline.getID()) { + // These are new comments which have been cancelled, and do not + // count as anything. + continue; + } + + if (inline.isDraft()) { + continue; + } + + if (!inline.isDone()) { + undone.push(inline); + } else { + done.push(inline); + } + } + + var total = done.length + undone.length; + + var hint; + var is_visible; + var is_completed; + if (total) { + if (done.length) { + hint = [done.length, '/', total]; + } else { + hint = total; + } + is_visible = true; + is_completed = (done.length == total); + } else { + hint = '-'; + is_visible = false; + is_completed = false; + } + + var node = this.getPathView().getInlineNode(); + + JX.DOM.setContent(node, hint); + + JX.DOM.alterClass(node, 'diff-tree-path-inlines-visible', is_visible); + JX.DOM.alterClass(node, 'diff-tree-path-inlines-completed', is_completed); + }, + + _onClickHeader: function(e) { + // If the user clicks the actual path name text, don't count this as + // a selection action: we want to let them select the path. + var path_name = e.getNode('changeset-header-path-name'); + if (path_name) { + return; + } + + // Don't allow repeatedly clicking a header to begin a "select word" or + // "select line" operation. + if (e.getType() === 'selectstart') { + e.kill(); + return; + } + + // NOTE: Don't prevent or kill the event. If the user has text selected, + // clicking a header should clear the selection (and dismiss any inline + // context menu, if one exists) as clicking elsewhere in the document + // normally would. + + if (this._isSelected) { + this.getChangesetList().selectChangeset(null); + } else { + this.select(false); + } + }, + + toggleVisibility: function() { + this.setVisible(!this._visible); + + var attrs = { + hidden: this.isVisible() ? 0 : 1, + discard: 1 + }; + + var workflow = this._newReloadWorkflow(attrs) + .setHandler(JX.bag); + + this._startContentWorkflow(workflow); + }, + + setVisible: function(visible) { + this._visible = visible; + + var diff = this._getDiffNode(); + var options = this._getViewButtonNode(); + var show = this._getShowButtonNode(); + + if (this._visible) { + JX.DOM.show(diff); + JX.DOM.show(options); + JX.DOM.hide(show); + } else { + JX.DOM.hide(diff); + JX.DOM.hide(options); + JX.DOM.show(show); + + if (this._viewMenu) { + this._viewMenu.close(); + } + } + + JX.Stratcom.invoke('resize'); + + var node = this._node; + JX.DOM.alterClass(node, 'changeset-content-hidden', !this._visible); + + this.getPathView().setIsHidden(!this._visible); + }, + + setIsSelected: function(is_selected) { + this._isSelected = !!is_selected; + + var node = this._node; + JX.DOM.alterClass(node, 'changeset-selected', this._isSelected); + + return this; + }, + + _getDiffNode: function() { + if (!this._diffNode) { + this._diffNode = JX.DOM.find(this._node, 'table', 'differential-diff'); + } + return this._diffNode; + }, + + _getViewButtonNode: function() { + if (!this._viewButtonNode) { + this._viewButtonNode = JX.DOM.find( + this._node, + 'a', + 'differential-view-options'); + } + return this._viewButtonNode; + }, + + _getShowButtonNode: function() { + if (!this._showButtonNode) { + var pht = this.getChangesetList().getTranslations(); + + var show_button = new JX.PHUIXButtonView() + .setIcon('fa-angle-double-down') + .setText(pht('Show Changeset')) + .setColor('grey'); + + var button_node = show_button.getNode(); + this._getViewButtonNode().parentNode.appendChild(button_node); + + var onshow = JX.bind(this, this._onClickShowButton); + JX.DOM.listen(button_node, 'click', null, onshow); + + this._showButtonNode = button_node; + } + return this._showButtonNode; + }, + + _onClickShowButton: function(e) { + e.prevent(); + + // We're always showing the changeset, but want to make sure the state + // change is persisted on the server. + this.toggleVisibility(); + }, + + isVisible: function() { + return this._visible; + }, + + getPathView: function() { + if (!this._pathView) { + var view = new JX.DiffPathView() + .setChangeset(this) + .setPath(this._pathParts) + .setIsLowImportance(this._isLowImportance) + .setIsOwned(this._isOwned) + .setIsLoading(this._isLoading); + + view.getIcon() + .setIcon(this._pathIconIcon) + .setColor(this._pathIconColor); + + this._pathView = view; + } + + return this._pathView; + }, + + select: function(scroll) { + this.getChangesetList().selectChangeset(this, scroll); + return this; + } + }, + + statics: { + getForNode: function(node) { + var data = JX.Stratcom.getData(node); + if (!data.changesetViewManager) { + data.changesetViewManager = new JX.DiffChangeset(node); + } + return data.changesetViewManager; + } + } +}); diff --git a/webroot/rsrc/js/application/diff/DiffChangesetList.js b/webroot/rsrc/js/application/diff/DiffChangesetList.js new file mode 100644 index 0000000000..7293f89fe0 --- /dev/null +++ b/webroot/rsrc/js/application/diff/DiffChangesetList.js @@ -0,0 +1,2855 @@ +/** + * @provides phabricator-diff-changeset-list + * @requires javelin-install + * phuix-button-view + * phabricator-diff-tree-view + * @javelin + */ + +JX.install('DiffChangesetList', { + + construct: function() { + this._changesets = []; + + var onload = JX.bind(this, this._ifawake, this._onload); + JX.Stratcom.listen('click', 'differential-load', onload); + + var onmore = JX.bind(this, this._ifawake, this._onmore); + JX.Stratcom.listen('click', 'show-more', onmore); + + var onmenu = JX.bind(this, this._ifawake, this._onmenu); + JX.Stratcom.listen('click', 'differential-view-options', onmenu); + + var onexpand = JX.bind(this, this._ifawake, this._oncollapse, false); + JX.Stratcom.listen('click', 'reveal-inline', onexpand); + + var onresize = JX.bind(this, this._ifawake, this._onresize); + JX.Stratcom.listen('resize', null, onresize); + + var onscroll = JX.bind(this, this._ifawake, this._onscroll); + JX.Stratcom.listen('scroll', null, onscroll); + + JX.enableDispatch(window, 'selectstart'); + + var onselect = JX.bind(this, this._ifawake, this._onselect); + JX.Stratcom.listen( + ['mousedown', 'selectstart'], + ['differential-inline-comment', 'differential-inline-header'], + onselect); + + var onhover = JX.bind(this, this._ifawake, this._onhover); + JX.Stratcom.listen( + ['mouseover', 'mouseout'], + 'differential-inline-comment', + onhover); + + var onrangedown = JX.bind(this, this._ifawake, this._onrangedown); + JX.Stratcom.listen( + 'mousedown', + ['differential-changeset', 'tag:td'], + onrangedown); + + var onrangemove = JX.bind(this, this._ifawake, this._onrangemove); + JX.Stratcom.listen( + ['mouseover', 'mouseout'], + ['differential-changeset', 'tag:td'], + onrangemove); + + var onrangeup = JX.bind(this, this._ifawake, this._onrangeup); + JX.Stratcom.listen( + 'mouseup', + null, + onrangeup); + + var onrange = JX.bind(this, this._ifawake, this._onSelectRange); + JX.enableDispatch(window, 'selectionchange'); + JX.Stratcom.listen('selectionchange', null, onrange); + + this._setupInlineCommentListeners(); + }, + + properties: { + translations: null, + inlineURI: null, + inlineListURI: null, + isStandalone: false, + formationView: null + }, + + members: { + _initialized: false, + _asleep: true, + _changesets: null, + + _cursorItem: null, + + _focusNode: null, + _focusStart: null, + _focusEnd: null, + + _hoverInline: null, + _hoverOrigin: null, + _hoverTarget: null, + + _rangeActive: false, + _rangeOrigin: null, + _rangeTarget: null, + + _bannerNode: null, + _unsavedButton: null, + _unsubmittedButton: null, + _doneButton: null, + _doneMode: null, + + _dropdownMenu: null, + _menuButton: null, + _menuItems: null, + _selectedChangeset: null, + + sleep: function() { + this._asleep = true; + + this._redrawFocus(); + this._redrawSelection(); + this.resetHover(); + + this._bannerChangeset = null; + this._redrawBanner(); + }, + + wake: function() { + this._asleep = false; + + this._redrawFocus(); + this._redrawSelection(); + + this._bannerChangeset = null; + this._redrawBanner(); + + this._redrawFiletree(); + + if (this._initialized) { + return; + } + + this._initialized = true; + var pht = this.getTranslations(); + + // We may be viewing the normal "/D123" view (with all the changesets) + // or the standalone view (with just one changeset). In the standalone + // view, some options (like jumping to next or previous file) do not + // make sense and do not function. + var standalone = this.getIsStandalone(); + + var label; + + if (!standalone) { + label = pht('Jump to the table of contents.'); + this._installKey('t', 'diff-nav', label, this._ontoc); + + label = pht('Jump to the comment area.'); + this._installKey('x', 'diff-nav', label, this._oncomments); + } + + label = pht('Jump to next change.'); + this._installJumpKey('j', label, 1); + + label = pht('Jump to previous change.'); + this._installJumpKey('k', label, -1); + + if (!standalone) { + label = pht('Jump to next file.'); + this._installJumpKey('J', label, 1, 'file'); + + label = pht('Jump to previous file.'); + this._installJumpKey('K', label, -1, 'file'); + } + + label = pht('Jump to next inline comment.'); + this._installJumpKey('n', label, 1, 'comment'); + + label = pht('Jump to previous inline comment.'); + this._installJumpKey('p', label, -1, 'comment'); + + label = pht('Jump to next inline comment, including collapsed comments.'); + this._installJumpKey('N', label, 1, 'comment', true); + + label = pht( + 'Jump to previous inline comment, including collapsed comments.'); + this._installJumpKey('P', label, -1, 'comment', true); + + var formation = this.getFormationView(); + if (formation) { + var filetree = formation.getColumn(0); + var toggletree = JX.bind(filetree, filetree.toggleVisibility); + label = pht('Hide or show the paths panel.'); + this._installKey('f', 'diff-vis', label, toggletree); + } + + if (!standalone) { + label = pht('Hide or show the current changeset.'); + this._installKey('h', 'diff-vis', label, this._onkeytogglefile); + } + + label = pht('Reply to selected inline comment or change.'); + this._installKey('r', 'inline', label, + JX.bind(this, this._onkeyreply, false)); + + label = pht('Reply and quote selected inline comment.'); + this._installKey('R', 'inline', label, + JX.bind(this, this._onkeyreply, true)); + + label = pht('Add new inline comment on selected source text.'); + this._installKey('c', 'inline', label, + JX.bind(this, this._onKeyCreate)); + + label = pht('Edit selected inline comment.'); + this._installKey('e', 'inline', label, this._onkeyedit); + + label = pht('Mark or unmark selected inline comment as done.'); + this._installKey('w', 'inline', label, this._onkeydone); + + label = pht('Collapse or expand inline comment.'); + this._installKey('q', 'diff-vis', label, this._onkeycollapse); + + label = pht('Hide or show all inline comments.'); + this._installKey('A', 'diff-vis', label, this._onkeyhideall); + + label = pht('Show path in repository.'); + this._installKey('d', 'diff-nav', label, this._onkeyshowpath); + + label = pht('Show directory in repository.'); + this._installKey('D', 'diff-nav', label, this._onkeyshowdirectory); + + label = pht('Open file in external editor.'); + this._installKey('\\', 'diff-nav', label, this._onkeyopeneditor); + }, + + isAsleep: function() { + return this._asleep; + }, + + newChangesetForNode: function(node) { + var changeset = JX.DiffChangeset.getForNode(node); + + this._changesets.push(changeset); + changeset.setChangesetList(this); + + return changeset; + }, + + getChangesetForNode: function(node) { + return JX.DiffChangeset.getForNode(node); + }, + + getInlineByID: function(id) { + var inline = null; + + for (var ii = 0; ii < this._changesets.length; ii++) { + inline = this._changesets[ii].getInlineByID(id); + if (inline) { + break; + } + } + + return inline; + }, + + _ifawake: function(f) { + // This function takes another function and only calls it if the + // changeset list is awake, so we basically just ignore events when we + // are asleep. This may move up the stack at some point as we do more + // with Quicksand/Sheets. + + if (this.isAsleep()) { + return; + } + + return f.apply(this, [].slice.call(arguments, 1)); + }, + + _onload: function(e) { + var data = e.getNodeData('differential-load'); + + // NOTE: We can trigger a load from either an explicit "Load" link on + // the changeset, or by clicking a link in the table of contents. If + // the event was a table of contents link, we let the anchor behavior + // run normally. + if (data.kill) { + e.kill(); + } + + var node = JX.$(data.id); + var changeset = this.getChangesetForNode(node); + + changeset.load(); + + // TODO: Move this into Changeset. + var routable = changeset.getRoutable(); + if (routable) { + routable.setPriority(2000); + } + }, + + _installKey: function(key, group, label, handler) { + handler = JX.bind(this, this._ifawake, handler); + + return new JX.KeyboardShortcut(key, label) + .setHandler(handler) + .setGroup(group) + .register(); + }, + + _installJumpKey: function(key, label, delta, filter, show_collapsed) { + filter = filter || null; + + var options = { + filter: filter, + collapsed: show_collapsed + }; + + var handler = JX.bind(this, this._onjumpkey, delta, options); + return this._installKey(key, 'diff-nav', label, handler); + }, + + _ontoc: function(manager) { + var toc = JX.$('toc'); + manager.scrollTo(toc); + }, + + _oncomments: function(manager) { + var reply = JX.$('reply'); + manager.scrollTo(reply); + }, + + getSelectedInline: function() { + var cursor = this._cursorItem; + + if (cursor) { + if (cursor.type == 'comment') { + return cursor.target; + } + } + + return null; + }, + + _onkeyreply: function(is_quote) { + var cursor = this._cursorItem; + + if (cursor) { + if (cursor.type == 'comment') { + var inline = cursor.target; + if (inline.canReply()) { + this.setFocus(null); + inline.reply(is_quote); + return; + } + } + + // If the keyboard cursor is selecting a range of lines, we may have + // a mixture of old and new changes on the selected rows. It is not + // entirely unambiguous what the user means when they say they want + // to reply to this, but we use this logic: reply on the new file if + // there are any new lines. Otherwise (if there are only removed + // lines) reply on the old file. + + if (cursor.type == 'change') { + var cells = this._getLineNumberCellsForChangeBlock( + cursor.nodes.begin, + cursor.nodes.end); + + cursor.changeset.newInlineForRange(cells.src, cells.dst); + + this.setFocus(null); + return; + } + } + + var pht = this.getTranslations(); + this._warnUser(pht('You must select a comment or change to reply to.')); + }, + + _getLineNumberCellsForChangeBlock: function(origin, target) { + // The "origin" and "target" are entire rows, but we need to find + // a range of cell nodes to actually create an inline, so go + // fishing. + + var old_list = []; + var new_list = []; + + var row = origin; + while (row) { + var header = row.firstChild; + while (header) { + if (this.getLineNumberFromHeader(header)) { + if (header.className.indexOf('old') !== -1) { + old_list.push(header); + } else if (header.className.indexOf('new') !== -1) { + new_list.push(header); + } + } + header = header.nextSibling; + } + + if (row == target) { + break; + } + + row = row.nextSibling; + } + + var use_list; + if (new_list.length) { + use_list = new_list; + } else { + use_list = old_list; + } + + var src = use_list[0]; + var dst = use_list[use_list.length - 1]; + + return { + src: src, + dst: dst + }; + }, + + _onkeyedit: function() { + var cursor = this._cursorItem; + + if (cursor) { + if (cursor.type == 'comment') { + var inline = cursor.target; + if (inline.canEdit()) { + this.setFocus(null); + + inline.edit(); + return; + } + } + } + + var pht = this.getTranslations(); + this._warnUser(pht('You must select a comment to edit.')); + }, + + _onKeyCreate: function() { + var start = this._sourceSelectionStart; + var end = this._sourceSelectionEnd; + + if (!this._sourceSelectionStart) { + var pht = this.getTranslations(); + this._warnUser( + pht( + 'You must select source text to create a new inline comment.')); + return; + } + + this._setSourceSelection(null, null); + + var changeset = start.changeset; + + var config = {}; + if (changeset.getResponseDocumentEngineKey() === null) { + // If the changeset is using a document renderer, we ignore the + // selection range and just treat this as a comment from the first + // block to the last block. + + // If we don't discard the range, we later render a bogus highlight + // if the block content is complex (like a Jupyter notebook cell + // with images). + + config.startOffset = start.offset; + config.endOffset = end.offset; + } + + changeset.newInlineForRange(start.targetNode, end.targetNode, config); + }, + + _onkeydone: function() { + var cursor = this._cursorItem; + + if (cursor) { + if (cursor.type == 'comment') { + var inline = cursor.target; + if (inline.canDone()) { + this.setFocus(null); + + inline.toggleDone(); + return; + } + } + } + + var pht = this.getTranslations(); + this._warnUser(pht('You must select a comment to mark done.')); + }, + + _onkeytogglefile: function() { + var pht = this.getTranslations(); + var changeset = this._getChangesetForKeyCommand(); + + if (!changeset) { + this._warnUser(pht('You must select a file to hide or show.')); + return; + } + + changeset.toggleVisibility(); + }, + + _getChangesetForKeyCommand: function() { + var cursor = this._cursorItem; + + var changeset; + if (cursor) { + changeset = cursor.changeset; + } + + if (!changeset) { + changeset = this._getVisibleChangeset(); + } + + return changeset; + }, + + _onkeyopeneditor: function(e) { + var pht = this.getTranslations(); + var changeset = this._getChangesetForKeyCommand(); + + if (!changeset) { + this._warnUser(pht('You must select a file to edit.')); + return; + } + + this._openEditor(changeset); + }, + + _openEditor: function(changeset) { + var pht = this.getTranslations(); + + var editor_template = changeset.getEditorURITemplate(); + if (editor_template === null) { + this._warnUser(pht('No external editor is configured.')); + return; + } + + var line = null; + + // See PHI1749. We aren't exactly sure what the user intends when they + // use the keyboard to select a change block and then activate the + // "Open in Editor" function: they might mean to open the old or new + // offset, and may have the old or new state (or some other state) in + // their working copy. + + // For now, pick: the new state line number if one exists; or the old + // state line number if one does not. If nothing else, this behavior is + // simple. + + // If there's a document engine, just open the file to the first line. + // We currently can not map display blocks to source lines. + + // If there's an inline, open the file to that line. + + if (changeset.getResponseDocumentEngineKey() === null) { + var cursor = this._cursorItem; + if (cursor && (cursor.changeset === changeset)) { + if (cursor.type == 'change') { + var cells = this._getLineNumberCellsForChangeBlock( + cursor.nodes.begin, + cursor.nodes.end); + line = this.getLineNumberFromHeader(cells.src); + } + + if (cursor.type === 'comment') { + var inline = cursor.target; + line = inline.getLineNumber(); + } + } + } + + var variables = { + l: line || 1 + }; + + var editor_uri = new JX.ExternalEditorLinkEngine() + .setTemplate(editor_template) + .setVariables(variables) + .newURI(); + + JX.$U(editor_uri).go(); + }, + + _onkeyshowpath: function() { + this._onrepositorykey(false); + }, + + _onkeyshowdirectory: function() { + this._onrepositorykey(true); + }, + + _onrepositorykey: function(is_directory) { + var pht = this.getTranslations(); + var changeset = this._getChangesetForKeyCommand(); + + if (!changeset) { + this._warnUser(pht('You must select a file to open.')); + return; + } + + var show_uri; + if (is_directory) { + show_uri = changeset.getShowDirectoryURI(); + } else { + show_uri = changeset.getShowPathURI(); + } + + if (show_uri === null) { + return; + } + + window.open(show_uri); + }, + + _onkeycollapse: function() { + var cursor = this._cursorItem; + + if (cursor) { + if (cursor.type == 'comment') { + var inline = cursor.target; + if (inline.canCollapse()) { + this.setFocus(null); + + inline.setCollapsed(!inline.isCollapsed()); + return; + } + } + } + + var pht = this.getTranslations(); + this._warnUser(pht('You must select a comment to hide.')); + }, + + _onkeyhideall: function() { + var inlines = this._getInlinesByType(); + if (inlines.visible.length) { + this._toggleInlines('all'); + } else { + this._toggleInlines('show'); + } + }, + + _warnUser: function(message) { + new JX.Notification() + .setContent(message) + .alterClassName('jx-notification-alert', true) + .setDuration(3000) + .show(); + }, + + _onjumpkey: function(delta, options) { + var state = this._getSelectionState(); + + var filter = options.filter || null; + var collapsed = options.collapsed || false; + var wrap = options.wrap || false; + var attribute = options.attribute || null; + var show = options.show || false; + + var cursor = state.cursor; + var items = state.items; + + // If there's currently no selection and the user tries to go back, + // don't do anything. + if ((cursor === null) && (delta < 0)) { + return; + } + + var did_wrap = false; + while (true) { + if (cursor === null) { + cursor = 0; + } else { + cursor = cursor + delta; + } + + // If we've gone backward past the first change, bail out. + if (cursor < 0) { + return; + } + + // If we've gone forward off the end of the list, figure out where we + // should end up. + if (cursor >= items.length) { + if (!wrap) { + // If we aren't wrapping around, we're done. + return; + } + + if (did_wrap) { + // If we're already wrapped around, we're done. + return; + } + + // Otherwise, wrap the cursor back to the top. + cursor = 0; + did_wrap = true; + } + + // If we're selecting things of a particular type (like only files) + // and the next item isn't of that type, move past it. + if (filter !== null) { + if (items[cursor].type !== filter) { + continue; + } + } + + // If the item is collapsed, don't select it when iterating with jump + // keys. It can still potentially be selected in other ways. + if (!collapsed) { + if (items[cursor].collapsed) { + continue; + } + } + + // If the item has been deleted, don't select it when iterating. The + // cursor may remain on it until it is removed. + if (items[cursor].deleted) { + continue; + } + + // If we're selecting things with a particular attribute, like + // "unsaved", skip items without the attribute. + if (attribute !== null) { + if (!(items[cursor].attributes || {})[attribute]) { + continue; + } + } + + // If this item is a hidden inline but we're clicking a button which + // selects inlines of a particular type, make it visible again. + if (items[cursor].hidden) { + if (!show) { + continue; + } + items[cursor].target.setHidden(false); + } + + // Otherwise, we've found a valid item to select. + break; + } + + this._setSelectionState(items[cursor], true); + }, + + _getSelectionState: function() { + var items = this._getSelectableItems(); + + var cursor = null; + if (this._cursorItem !== null) { + for (var ii = 0; ii < items.length; ii++) { + var item = items[ii]; + if (this._cursorItem.target === item.target) { + cursor = ii; + break; + } + } + } + + return { + cursor: cursor, + items: items + }; + }, + + selectChangeset: function(changeset, scroll) { + var items = this._getSelectableItems(); + + var cursor = null; + for (var ii = 0; ii < items.length; ii++) { + var item = items[ii]; + if (changeset === item.target) { + cursor = ii; + break; + } + } + + if (cursor !== null) { + this._setSelectionState(items[cursor], scroll); + } else { + this._setSelectionState(null, false); + } + + return this; + }, + + _setSelectionState: function(item, scroll) { + var old = this._cursorItem; + + if (old) { + if (old.type === 'comment') { + old.target.setIsSelected(false); + } + } + + this._cursorItem = item; + + if (item) { + if (item.type === 'comment') { + item.target.setIsSelected(true); + } + } + + this._redrawSelection(scroll); + + return this; + }, + + _redrawSelection: function(scroll) { + var cursor = this._cursorItem; + if (!cursor) { + this.setFocus(null); + return; + } + + // If this item has been removed from the document (for example: create + // a new empty comment, then use the "Unsaved" button to select it, then + // cancel it), we can still keep the cursor here but do not want to show + // a selection reticle over an invisible node. + if (cursor.deleted) { + this.setFocus(null); + return; + } + + var changeset = cursor.changeset; + + var tree = this._getTreeView(); + if (changeset) { + tree.setSelectedPath(cursor.changeset.getPathView()); + } else { + tree.setSelectedPath(null); + } + + this._selectChangeset(changeset); + + this.setFocus(cursor.nodes.begin, cursor.nodes.end); + + if (scroll) { + var pos = JX.$V(cursor.nodes.begin); + JX.DOM.scrollToPosition(0, pos.y - 60); + } + + return this; + }, + + redrawCursor: function() { + // NOTE: This is setting the cursor to the current cursor. Usually, this + // would have no effect. + + // However, if the old cursor pointed at an inline and the inline has + // been edited so the rows have changed, this updates the cursor to point + // at the new inline with the proper rows for the current state, and + // redraws the reticle correctly. + + var state = this._getSelectionState(); + if (state.cursor !== null) { + this._setSelectionState(state.items[state.cursor], false); + } + }, + + _getSelectableItems: function() { + var result = []; + + for (var ii = 0; ii < this._changesets.length; ii++) { + var items = this._changesets[ii].getSelectableItems(); + for (var jj = 0; jj < items.length; jj++) { + result.push(items[jj]); + } + } + + return result; + }, + + _onhover: function(e) { + if (e.getIsTouchEvent()) { + return; + } + + var inline; + if (e.getType() == 'mouseout') { + inline = null; + } else { + inline = this._getInlineForEvent(e); + } + + this._setHoverInline(inline); + }, + + _onmore: function(e) { + e.kill(); + + var node = e.getNode('differential-changeset'); + var changeset = this.getChangesetForNode(node); + + var data = e.getNodeData('show-more'); + var target = e.getNode('context-target'); + + changeset.loadContext(data.range, target); + }, + + _onmenu: function(e) { + var button = e.getNode('differential-view-options'); + + var data = JX.Stratcom.getData(button); + if (data.menu) { + // We've already built this menu, so we can let the menu itself handle + // the event. + return; + } + + e.prevent(); + + var pht = this.getTranslations(); + + var node = JX.DOM.findAbove( + button, + 'div', + 'differential-changeset'); + + var changeset_list = this; + var changeset = this.getChangesetForNode(node); + + var menu = new JX.PHUIXDropdownMenu(button) + .setWidth(240); + var list = new JX.PHUIXActionListView(); + + var add_link = function(icon, name, href, local) { + var link = new JX.PHUIXActionView() + .setIcon(icon) + .setName(name) + .setHandler(function(e) { + if (local) { + window.location.assign(href); + } else { + window.open(href); + } + menu.close(); + e.prevent(); + }); + + if (href) { + link.setHref(href); + } else { + link + .setDisabled(true) + .setUnresponsive(true); + } + + list.addItem(link); + return link; + }; + + var visible_item = new JX.PHUIXActionView() + .setKeyCommand('h') + .setHandler(function(e) { + e.prevent(); + menu.close(); + + changeset.select(false); + changeset.toggleVisibility(); + }); + list.addItem(visible_item); + + var reveal_item = new JX.PHUIXActionView() + .setIcon('fa-eye'); + list.addItem(reveal_item); + + list.addItem( + new JX.PHUIXActionView() + .setDivider(true)); + + var up_item = new JX.PHUIXActionView() + .setHandler(function(e) { + if (changeset.isLoaded()) { + + // Don't let the user swap display modes if a comment is being + // edited, since they might lose their work. See PHI180. + var inlines = changeset.getInlines(); + for (var ii = 0; ii < inlines.length; ii++) { + if (inlines[ii].isEditing()) { + changeset_list._warnUser( + pht( + 'Finish editing inline comments before changing display ' + + 'modes.')); + e.prevent(); + menu.close(); + return; + } + } + + var renderer = changeset.getRendererKey(); + if (renderer == '1up') { + renderer = '2up'; + } else { + renderer = '1up'; + } + changeset.reload({renderer: renderer}); + } else { + changeset.reload(); + } + + e.prevent(); + menu.close(); + }); + list.addItem(up_item); + + var encoding_item = new JX.PHUIXActionView() + .setIcon('fa-font') + .setName(pht('Change Text Encoding...')) + .setHandler(function(e) { + var params = { + encoding: changeset.getCharacterEncoding() + }; + + new JX.Workflow('/services/encoding/', params) + .setHandler(function(r) { + changeset.reload({encoding: r.encoding}); + }) + .start(); + + e.prevent(); + menu.close(); + }); + list.addItem(encoding_item); + + var highlight_item = new JX.PHUIXActionView() + .setIcon('fa-sun-o') + .setName(pht('Highlight As...')) + .setHandler(function(e) { + var params = { + highlight: changeset.getHighlight() + }; + + new JX.Workflow('/services/highlight/', params) + .setHandler(function(r) { + changeset.reload({highlight: r.highlight}); + }) + .start(); + + e.prevent(); + menu.close(); + }); + list.addItem(highlight_item); + + var engine_item = new JX.PHUIXActionView() + .setIcon('fa-file-image-o') + .setName(pht('View As Document Type...')) + .setHandler(function(e) { + var options = changeset.getAvailableDocumentEngineKeys() || []; + options = options.join(','); + + var params = { + engine: changeset.getResponseDocumentEngineKey(), + options: options + }; + + new JX.Workflow('/services/viewas/', params) + .setHandler(function(r) { + changeset.reload({engine: r.engine}); + }) + .start(); + + e.prevent(); + menu.close(); + }); + list.addItem(engine_item); + + list.addItem( + new JX.PHUIXActionView() + .setDivider(true)); + + add_link('fa-external-link', pht('View Standalone'), data.standaloneURI); + + add_link('fa-arrow-left', pht('Show Raw File (Left)'), data.leftURI); + add_link('fa-arrow-right', pht('Show Raw File (Right)'), data.rightURI); + + add_link( + 'fa-folder-open-o', + pht('Show Directory in Repository'), + changeset.getShowDirectoryURI()) + .setKeyCommand('D'); + + add_link( + 'fa-file-text-o', + pht('Show Path in Repository'), + changeset.getShowPathURI()) + .setKeyCommand('d'); + + var editor_template = changeset.getEditorURITemplate(); + if (editor_template !== null) { + var editor_item = new JX.PHUIXActionView() + .setIcon('fa-i-cursor') + .setName(pht('Open in Editor')) + .setKeyCommand('\\') + .setHandler(function(e) { + + changeset_list._openEditor(changeset); + + e.prevent(); + menu.close(); + }); + + list.addItem(editor_item); + } else { + var configure_uri = changeset.getEditorConfigureURI(); + if (configure_uri !== null) { + add_link('fa-wrench', pht('Configure Editor'), configure_uri); + } + } + + menu.setContent(list.getNode()); + + menu.listen('open', function() { + // When the user opens the menu, check if there are any "Show More" + // links in the changeset body. If there aren't, disable the "Show + // Entire File" menu item since it won't change anything. + + var nodes = JX.DOM.scry(JX.$(data.containerID), 'a', 'show-more'); + if (nodes.length) { + reveal_item + .setDisabled(false) + .setName(pht('Show All Context')) + .setIcon('fa-arrows-v') + .setHandler(function(e) { + changeset.loadAllContext(); + e.prevent(); + menu.close(); + }); + } else { + reveal_item + .setDisabled(true) + .setUnresponsive(true) + .setIcon('fa-file') + .setName(pht('All Context Shown')) + .setHref(null); + } + + encoding_item.setDisabled(!changeset.isLoaded()); + highlight_item.setDisabled(!changeset.isLoaded()); + engine_item.setDisabled(!changeset.isLoaded()); + + if (changeset.isLoaded()) { + if (changeset.getRendererKey() == '2up') { + up_item + .setIcon('fa-list-alt') + .setName(pht('View Unified Diff')); + } else { + up_item + .setIcon('fa-columns') + .setName(pht('View Side-by-Side Diff')); + } + } else { + up_item + .setIcon('fa-refresh') + .setName(pht('Load Changes')); + } + + visible_item + .setDisabled(true) + .setIcon('fa-eye-slash') + .setName(pht('Hide Changeset')); + + var diffs = JX.DOM.scry( + JX.$(data.containerID), + 'table', + 'differential-diff'); + + if (diffs.length > 1) { + JX.$E( + 'More than one node with sigil "differential-diff" was found in "'+ + data.containerID+'."'); + } else if (diffs.length == 1) { + visible_item.setDisabled(false); + } else { + // Do nothing when there is no diff shown in the table. For example, + // the file is binary. + } + + }); + + data.menu = menu; + changeset.setViewMenu(menu); + menu.open(); + }, + + _oncollapse: function(is_collapse, e) { + e.kill(); + + var inline = this._getInlineForEvent(e); + + inline.setCollapsed(is_collapse); + }, + + _onresize: function() { + this._redrawFocus(); + this._redrawSelection(); + + // Force a banner redraw after a resize event. Particularly, this makes + // sure the inline state updates immediately after an inline edit + // operation, even if the changeset itself has not changed. + this._bannerChangeset = null; + + this._redrawBanner(); + + var changesets = this._changesets; + for (var ii = 0; ii < changesets.length; ii++) { + changesets[ii].redrawFileTree(); + } + }, + + _onscroll: function() { + this._redrawBanner(); + }, + + _onselect: function(e) { + // If the user clicked some element inside the header, like an action + // icon, ignore the event. They have to click the header element itself. + if (e.getTarget() !== e.getNode('differential-inline-header')) { + return; + } + + // If the user has double-clicked or triple-clicked a header, we want to + // toggle the inline selection mode, not select text. Kill select events + // originating with this element as the target. + if (e.getType() === 'selectstart') { + e.kill(); + return; + } + + var inline = this._getInlineForEvent(e); + if (!inline) { + return; + } + + // NOTE: Don't kill or prevent the event. In particular, we want this + // click to clear any text selection as it normally would. + + this.selectInline(inline); + }, + + selectInline: function(inline, force, scroll) { + var selection = this._getSelectionState(); + var item; + + if (!force) { + // If the comment the user clicked is currently selected, deselect it. + // This makes it easy to undo things if you clicked by mistake. + if (selection.cursor !== null) { + item = selection.items[selection.cursor]; + if (item.target === inline) { + this._setSelectionState(null, false); + return; + } + } + } + + // Otherwise, select the item that the user clicked. This makes it + // easier to resume keyboard operations after using the mouse to do + // something else. + var items = selection.items; + for (var ii = 0; ii < items.length; ii++) { + item = items[ii]; + if (item.target === inline) { + this._setSelectionState(item, scroll); + } + } + + }, + + redrawPreview: function() { + // TODO: This isn't the cleanest way to find the preview form, but + // rendering no longer has direct access to it. + var forms = JX.DOM.scry(document.body, 'form', 'transaction-append'); + if (forms.length) { + JX.DOM.invoke(forms[0], 'shouldRefresh'); + } + + // Clear the mouse hover reticle after a substantive edit: we don't get + // a "mouseout" event if the row vanished because of row being removed + // after an edit. + this.resetHover(); + }, + + setFocus: function(node, extended_node) { + if (!node) { + var tree = this._getTreeView(); + tree.setSelectedPath(null); + this._selectChangeset(null); + } + + this._focusStart = node; + this._focusEnd = extended_node; + this._redrawFocus(); + }, + + _selectChangeset: function(changeset) { + if (this._selectedChangeset === changeset) { + return; + } + + if (this._selectedChangeset !== null) { + this._selectedChangeset.setIsSelected(false); + this._selectedChangeset = null; + } + + this._selectedChangeset = changeset; + if (this._selectedChangeset !== null) { + this._selectedChangeset.setIsSelected(true); + } + }, + + _redrawFocus: function() { + var node = this._focusStart; + var extended_node = this._focusEnd || node; + + var reticle = this._getFocusNode(); + if (!node || this.isAsleep()) { + JX.DOM.remove(reticle); + return; + } + + // Outset the reticle some pixels away from the element, so there's some + // space between the focused element and the outline. + var p = JX.Vector.getPos(node); + var s = JX.Vector.getAggregateScrollForNode(node); + var d = JX.Vector.getDim(node); + + p.add(s).add(d.x + 1, 4).setPos(reticle); + // Compute the size we need to extend to the full extent of the focused + // nodes. + JX.Vector.getPos(extended_node) + .add(-p.x, -p.y) + .add(0, JX.Vector.getDim(extended_node).y) + .add(10, -4) + .setDim(reticle); + + JX.DOM.getContentFrame().appendChild(reticle); + }, + + _getFocusNode: function() { + if (!this._focusNode) { + var node = JX.$N('div', {className : 'keyboard-focus-focus-reticle'}); + this._focusNode = node; + } + return this._focusNode; + }, + + _setHoverInline: function(inline) { + var origin = null; + var target = null; + + if (inline) { + var changeset = inline.getChangeset(); + + var changeset_id; + var side = inline.getDisplaySide(); + if (side == 'right') { + changeset_id = changeset.getRightChangesetID(); + } else { + changeset_id = changeset.getLeftChangesetID(); + } + + var new_part; + if (inline.isNewFile()) { + new_part = 'N'; + } else { + new_part = 'O'; + } + + var prefix = 'C' + changeset_id + new_part + 'L'; + + var number = inline.getLineNumber(); + var length = inline.getLineLength(); + + try { + origin = JX.$(prefix + number); + target = JX.$(prefix + (number + length)); + } catch (error) { + // There may not be any nodes present in the document. A case where + // this occurs is when you reply to a ghost inline which was made + // on lines near the bottom of "long.txt" in an earlier diff, and + // the file was later shortened so those lines no longer exist. For + // more details, see T11662. + + origin = null; + target = null; + } + } + + this._setHoverRange(origin, target, inline); + }, + + _setHoverRange: function(origin, target, inline) { + inline = inline || null; + + var origin_dirty = (origin !== this._hoverOrigin); + var target_dirty = (target !== this._hoverTarget); + var inline_dirty = (inline !== this._hoverInline); + + var any_dirty = (origin_dirty || target_dirty || inline_dirty); + if (any_dirty) { + this._hoverOrigin = origin; + this._hoverTarget = target; + this._hoverInline = inline; + this._redrawHover(); + } + }, + + resetHover: function() { + this._setHoverRange(null, null, null); + }, + + _redrawHover: function() { + var map = this._hoverMap; + if (map) { + this._hoverMap = null; + this._applyHoverHighlight(map, false); + } + + var rows = this._hoverRows; + if (rows) { + this._hoverRows = null; + this._applyHoverHighlight(rows, false); + } + + if (!this._hoverOrigin || this.isAsleep()) { + return; + } + + var top = this._hoverOrigin; + var bot = this._hoverTarget; + if (JX.$V(top).y > JX.$V(bot).y) { + var tmp = top; + top = bot; + bot = tmp; + } + + // Find the leftmost cell that we're going to highlight. This is the + // next sibling with a "data-copy-mode" attribute, which is a marker + // for the cell with actual content in it. + var content_cell = top; + while (content_cell && !this._isContentCell(content_cell)) { + content_cell = content_cell.nextSibling; + } + + // If we didn't find a cell to highlight, don't highlight anything. + if (!content_cell) { + return; + } + + rows = this._findContentCells(top, bot, content_cell); + + var inline = this._hoverInline; + if (!inline) { + this._hoverRows = rows; + this._applyHoverHighlight(this._hoverRows, true); + return; + } + + if (!inline.hoverMap) { + inline.hoverMap = this._newHoverMap(rows, inline); + } + + this._hoverMap = inline.hoverMap; + this._applyHoverHighlight(this._hoverMap, true); + }, + + _applyHoverHighlight: function(items, on) { + for (var ii = 0; ii < items.length; ii++) { + var item = items[ii]; + + JX.DOM.alterClass(item.lineNode, 'inline-hover', on); + JX.DOM.alterClass(item.cellNode, 'inline-hover', on); + + if (item.bright) { + JX.DOM.alterClass(item.cellNode, 'inline-hover-bright', on); + } + + if (item.hoverNode) { + if (on) { + item.cellNode.insertBefore( + item.hoverNode, + item.cellNode.firstChild); + } else { + JX.DOM.remove(item.hoverNode); + } + } + } + }, + + _findContentCells: function(top, bot, content_cell) { + var head_row = JX.DOM.findAbove(top, 'tr'); + var last_row = JX.DOM.findAbove(bot, 'tr'); + + var cursor = head_row; + var rows = []; + var idx = null; + var ii; + var line_cell = null; + do { + line_cell = null; + for (ii = 0; ii < cursor.childNodes.length; ii++) { + var child = cursor.childNodes[ii]; + if (!JX.DOM.isType(child, 'td')) { + continue; + } + + if (child.getAttribute('data-n')) { + line_cell = child; + } + + if (child === content_cell) { + idx = ii; + } + + if (ii !== idx) { + continue; + } + + if (this._isContentCell(child)) { + rows.push({ + lineNode: line_cell, + cellNode: child + }); + } + + break; + } + + if (cursor === last_row) { + break; + } + + cursor = cursor.nextSibling; + } while (cursor); + + return rows; + }, + + _newHoverMap: function(rows, inline) { + var start = inline.getStartOffset(); + var end = inline.getEndOffset(); + + var info; + var content; + for (ii = 0; ii < rows.length; ii++) { + info = this._getSelectionOffset(rows[ii].cellNode, null); + + content = info.content; + content = content.replace(/\n+$/, ''); + + rows[ii].content = content; + } + + var attr_dull = { + className: 'inline-hover-text' + }; + + var attr_bright = { + className: 'inline-hover-text inline-hover-text-bright' + }; + + var attr_container = { + className: 'inline-hover-container' + }; + + var min = 0; + var max = rows.length - 1; + var offset_min; + var offset_max; + var len; + var node; + var text; + var any_highlight = false; + for (ii = 0; ii < rows.length; ii++) { + content = rows[ii].content; + len = content.length; + + if (ii === min && (start !== null)) { + offset_min = start; + } else { + offset_min = 0; + } + + if (ii === max && (end !== null)) { + offset_max = Math.min(end, len); + } else { + offset_max = len; + } + + var has_min = (offset_min > 0); + var has_max = (offset_max < len); + + if (has_min || has_max) { + any_highlight = true; + } + + rows[ii].min = offset_min; + rows[ii].max = offset_max; + rows[ii].hasMin = has_min; + rows[ii].hasMax = has_max; + } + + for (ii = 0; ii < rows.length; ii++) { + content = rows[ii].content; + offset_min = rows[ii].min; + offset_max = rows[ii].max; + + var has_highlight = (rows[ii].hasMin || rows[ii].hasMax); + + if (any_highlight) { + var parts = []; + + if (offset_min > 0) { + text = content.substring(0, offset_min); + node = JX.$N('span', attr_dull, text); + parts.push(node); + } + + if (len) { + text = content.substring(offset_min, offset_max); + node = JX.$N('span', attr_bright, text); + parts.push(node); + } + + if (offset_max < len) { + text = content.substring(offset_max, len); + node = JX.$N('span', attr_dull, text); + parts.push(node); + } + + rows[ii].hoverNode = JX.$N('div', attr_container, parts); + } else { + rows[ii].hoverNode = null; + } + + rows[ii].bright = (any_highlight && !has_highlight); + } + + return rows; + }, + + _deleteInlineByID: function(id) { + var uri = this.getInlineURI(); + var data = { + op: 'refdelete', + id: id + }; + + var handler = JX.bind(this, this.redrawPreview); + + new JX.Workflow(uri, data) + .setHandler(handler) + .start(); + }, + + _getInlineForEvent: function(e) { + var node = e.getNode('differential-changeset'); + if (!node) { + return null; + } + + var changeset = this.getChangesetForNode(node); + + var inline_row = e.getNode('inline-row'); + return changeset.getInlineForRow(inline_row); + }, + + getLineNumberFromHeader: function(node) { + var n = parseInt(node.getAttribute('data-n')); + + if (!n) { + return null; + } + + // If this is a line number that's part of a row showing more context, + // we don't want to let users leave inlines here. + + try { + JX.DOM.findAbove(node, 'tr', 'context-target'); + return null; + } catch (ex) { + // Ignore. + } + + return n; + }, + + getDisplaySideFromHeader: function(th) { + return (th.parentNode.firstChild != th) ? 'right' : 'left'; + }, + + _onrangedown: function(e) { + // NOTE: We're allowing "mousedown" from a touch event through so users + // can leave inlines on a single line. + + // See PHI985. We want to exclude both right-mouse and middle-mouse + // clicks from continuing. + if (!e.isLeftButton()) { + return; + } + + if (this._rangeActive) { + return; + } + + var target = e.getTarget(); + var number = this.getLineNumberFromHeader(target); + if (!number) { + return; + } + + e.kill(); + this._rangeActive = true; + + this._rangeOrigin = target; + this._rangeTarget = target; + + this._setHoverRange(this._rangeOrigin, this._rangeTarget); + }, + + _onrangemove: function(e) { + if (e.getIsTouchEvent()) { + return; + } + + var is_out = (e.getType() == 'mouseout'); + var target = e.getTarget(); + + this._updateRange(target, is_out); + }, + + _updateRange: function(target, is_out) { + // Don't update the range if this target doesn't correspond to a line + // number. For instance, this may be a dead line number, like the empty + // line numbers on the left hand side of a newly added file. + var number = this.getLineNumberFromHeader(target); + if (!number) { + return; + } + + if (this._rangeActive) { + var origin = this._hoverOrigin; + + // Don't update the reticle if we're selecting a line range and the + // "". + + // If the fragment is a direct child of a "" parent, assume the + // user has done this and select the last child of the previous row + // instead. It's possible there are other ways to do this, so this may + // not always be the right rule. + + // Otherwise, select the containing "" is selectable but no content in the node is + // selectable. (We have to leave the "" itself selectable because + // of how Firefox applies "user-select" rules.) + + // The nodes we get here can also start and end more or less anywhere. + + // One saving grace is that we use "content: attr(data-n);" to render + // the line numbers and no browsers copy this content, so we don't have + // to worry about figuring out when text is line numbers. + + for (var jj = 0; jj < fragment.childNodes.length; jj++) { + var node = fragment.childNodes[jj]; + text.push(extract_text(node)); + } } - result = result.join("\n"); - if (e.clipboardData) { - // Safari and Chrome support this easy, straightforward mechanism. - e.clipboardData.setData('Text', result); - e.preventDefault(); + text = flatten_list(text); + text = text.join(''); + + var rawEvent = e.getRawEvent(); + var data; + if ('clipboardData' in rawEvent) { + data = rawEvent.clipboardData; } else { + data = window.clipboardData; + } + data.setData('Text', text); + + e.prevent(); + } + + function extract_text(node) { + var ii; + var text = []; + + if (JX.DOM.isType(node, 'tr')) { + // This is an inline comment row, so we never want to copy any + // content inside of it. + if (JX.Stratcom.hasSigil(node, 'inline-row')) { + return null; + } + + // This is a "Show More Context" row, so we never want to copy any + // of the content inside. + if (JX.Stratcom.hasSigil(node, 'context-target')) { + return null; + } + + // Assume anything else is a source code row. Keep only "
    {$text}{$file}:{$line}{$where}()
    " and "" so that the header widths + are correct if the table has no rows. */ +.aphront-table-view th.wide, .aphront-table-view td.wide { white-space: normal; width: 100%; } +.aphront-table-view th.right, .aphront-table-view td.right { text-align: right; } .aphront-table-view td.mono { font-family: "Monaco", monospace; - font-size: 11px; + font-size: {$smallestfontsize}; } .aphront-table-view td.n { font-family: "Monaco", monospace; - font-size: 11px; + font-size: {$smallestfontsize}; text-align: right; } +.aphront-table-view td.nudgeright, .aphront-table-view th.nudgeright { + padding-right: 0; +} + .aphront-table-view td.wrap { - white-space: normal; + white-space: normal; } .aphront-table-view td.prewrap { font-family: "Monaco", monospace; - font-size: 11px; + font-size: {$smallestfontsize}; white-space: pre-wrap; } .aphront-table-view td.narrow { - width: 1px; + width: 1px; +} + +.aphront-table-view td.icon, .aphront-table-view th.icon { + width: 1px; + padding: 0px; +} + +.aphront-table-view td.icon + td.icon { + padding-left: 8px; } div.single-display-line-bounds { @@ -189,18 +232,59 @@ span.single-display-line-content { position: absolute; } +.device-phone span.single-display-line-content { + white-space: nowrap; + position: static; +} + +.aphront-table-view td.object-link { + white-space: nowrap; + word-wrap: break-word; + overflow: hidden; + text-overflow: ellipsis; + min-width: 320px; + max-width: 320px; +} + +.aphront-table-view tr.closed td.object-link .object-name, +.aphront-table-view tr.alt-closed td.object-link .object-name { + text-decoration: line-through; + color: rgba({$alphablack}, 0.5); +} + +.aphront-table-view tr.closed td.object-link a, +.aphront-table-view tr.alt-closed td.object-link a { + color: rgba({$alphablack}, 0.5); +} + +.aphront-table-view tr.closed td.graph-status, +.aphront-table-view tr.alt-closed td.graph-status, +.object-graph-table em { + color: {$lightgreytext}; +} + .aphront-table-view tr.highlighted { - background: #fcf8e2; + background: #fdf9e4; } .aphront-table-view tr.alt-highlighted { - background: #fcf2bb; + background: {$sh-yellowbackground}; +} + +.aphront-table-view tr.diff-removed, +.aphront-table-view tr.alt-diff-removed { + background: {$lightred} +} + +.aphront-table-view tr.diff-added, +.aphront-table-view tr.alt-diff-added { + background: {$lightgreen} } .aphront-table-view tr.no-data td { - padding: 1em; + padding: 16px; text-align: center; - color: #888888; + color: {$lightgreytext}; font-style: italic; } @@ -212,7 +296,7 @@ span.single-display-line-content { .aphront-table-view td.threads { font-family: monospace; white-space: pre; - padding: 0; + padding: 0 0 0 8px; } .aphront-table-view td.threads canvas { @@ -224,6 +308,17 @@ span.single-display-line-content { padding: 2px 4px 0px; } +.aphront-table-view th.center, +.aphront-table-view td.center { + text-align: center; +} + +.device .aphront-table-view td + td.center, +.device .aphront-table-view th + th.center { + padding-left: 3px; + padding-right: 3px; +} + .device-desktop .aphront-table-view-device { display: none; } @@ -233,11 +328,6 @@ span.single-display-line-content { display: none; } -.aphront-table-view-device-ready { - width: 99%; - margin: 8px auto; -} - .aphront-table-view td.link { padding: 0; } @@ -247,3 +337,44 @@ span.single-display-line-content { padding: 6px 8px; font-weight: bold; } + +.phui-object-box .aphront-table-view { + border: none; +} + +.object-graph-header { + padding: 8px 12px; + overflow: hidden; + background: {$lightyellow}; + border-bottom: 1px solid {$lightblueborder}; + vertical-align: middle; +} + +.object-graph-header .object-graph-header-icon { + float: left; + margin-top: 10px; +} + +.object-graph-header a.button { + float: right; +} + +.object-graph-header-message { + margin: 8px 200px 8px 20px; +} + +.device .object-graph-header .object-graph-header-icon { + display: none; +} + +.device .object-graph-header-message { + clear: both; + margin: 0; +} + +.device .object-graph-header a.button { + margin: 0 auto 12px; + display: block; + width: 180px; + float: none; +} diff --git a/webroot/rsrc/css/aphront/tokenizer.css b/webroot/rsrc/css/aphront/tokenizer.css index 00efb65051..b0b638f062 100644 --- a/webroot/rsrc/css/aphront/tokenizer.css +++ b/webroot/rsrc/css/aphront/tokenizer.css @@ -1,18 +1,20 @@ /** * @provides aphront-tokenizer-control-css * @requires aphront-typeahead-control-css + * @requires phui-tag-view-css */ body div.jx-tokenizer { background: transparent; position: relative; width: 100%; + overflow: hidden; } body div.jx-tokenizer-container { position: relative; display: block; - padding: 0; + padding: 0 0 2px 0; min-height: 30px; height: auto; } @@ -33,9 +35,10 @@ body input.jx-tokenizer-input { border-shadow: none; box-shadow: none; -webkit-box-shadow: none; - font-size: 13px; + font-size: {$normalfontsize}; color: #333; height: 26px; + background: transparent; } body input.jx-tokenizer-input:focus { @@ -46,31 +49,147 @@ body input.jx-tokenizer-input:focus { body input.jx-typeahead-placeholder { margin-left: 4px; - color: #777 + color: {$greytext}; } a.jx-tokenizer-x { - padding-left: 4px; + margin-left: 4px; + color: {$bluetext}; + float: right; } a.jx-tokenizer-x:hover { - color: #000; + color: {$darkbluetext}; text-decoration: none; } a.jx-tokenizer-token { - padding: 2px 6px 3px; - border: 1px solid #a4bdec; + padding: 1px 6px; + border: 1px solid {$lightblueborder}; margin: 3px 2px 0 4px; - background: #dee7f8; + background-color: {$sh-bluebackground}; float: left; cursor: pointer; border-radius: 3px; - color: #333; + color: {$sh-bluetext}; + /* See T13495. Certain Chinese glyphs can cause layout artifacts unless + we're fairly aggressive about specifying element sizing. */ + + line-height: 18px; + min-height: 20px; + max-height: 20px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 95%; } a.jx-tokenizer-token:hover { text-decoration: none; - background: #bbcef1; + border-color: {$sh-blueborder}; +} + +.jx-tokenizer-token .phui-icon-view { + display: inline-block; + margin: 2px 4px -3px 0; + color: {$sh-blueicon}; +} + +a.jx-tokenizer-token-function { + border-color: {$sh-lightgreyborder}; + background: {$page.content}; +} + +a.jx-tokenizer-token-function:hover { + background: {$page.content}; +} + +a.jx-tokenizer-token-disabled { + background-color: {$sh-disabledbackground}; + border-color: {$sh-lightdisabledborder}; + color: {$sh-disabledtext}; +} + +a.jx-tokenizer-token-disabled:hover { + border-color: {$sh-disabledborder}; + background-color: {$sh-disabledbackground}; +} + +.jx-tokenizer-token-disabled .phui-icon-view { + color: {$sh-disabledicon}; +} + +a.jx-tokenizer-token-invalid { + border-color: {$sh-lightredborder}; + background: {$sh-redbackground}; + color: {$sh-redtext}; +} + +a.jx-tokenizer-token-invalid:hover { + border-color: {$sh-redborder}; + background: {$sh-redbackground}; +} + +.jx-tokenizer-token-invalid .phui-icon-view { + color: {$sh-redicon}; +} + +.tokenizer-result { + position: relative; + padding: 5px 8px 5px 28px; +} + +.tokenizer-result .phui-icon-view { + display: inline-block; + width: 24px; + height: 24px; + position: absolute; + top: 5px; + left: 8px; +} + +.tokenizer-result-closed { + color: {$greytext}; +} + +.tokenizer-closed { + margin-top: 2px; +} + +.jx-tokenizer-frame .button.tokenizer-browse-button { + display: none; +} + +.jx-tokenizer-frame.has-browse .button.tokenizer-browse-button { + display: block; +} + +.jx-tokenizer-frame.has-browse { + position: relative; +} + +.jx-tokenizer-frame.has-browse div.jx-tokenizer-container { + padding-right: 32px; +} + +.button.tokenizer-browse-button { + position: absolute; + top: 1px; + right: 1px; + bottom: 1px; + border-radius: 0; + border-right: none; + border-top: none; + border-bottom: none; + padding: 0; + width: 30px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +.button.tokenizer-browse-button .phui-icon-view { + top: 7px; + left: 9px; + position: absolute; } diff --git a/webroot/rsrc/css/aphront/tooltip.css b/webroot/rsrc/css/aphront/tooltip.css index e9d5d961ed..754e647d0a 100644 --- a/webroot/rsrc/css/aphront/tooltip.css +++ b/webroot/rsrc/css/aphront/tooltip.css @@ -4,19 +4,52 @@ .jx-tooltip-container { position: absolute; + padding: 5px; + + /* In Chrome, moving the cursor into the empty space next to the "caret" on + the caret side of the tooltip can cause the tooltip to flicker rapidly + because the cursor hits the container. To stop this, prevent cursor + events on the container. See T8440. */ + pointer-events: none; } -.jx-tooltip { +.jx-tooltip-appear { + animation: 0.5s tooltip-appear; + + /* Without this, there's a nasty pop-in effect at the end of the animation + when Safari changes font smoothing. The text becomes visibly more bold + after the last frame of animation. */ + -webkit-font-smoothing: subpixel-antialiased; +} + +@keyframes tooltip-appear { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +.jx-tooltip-hidden { + opacity: 0; +} + +.jx-tooltip-inner { + position: relative; background: #000; - color: #f9f9f9; - font-size: 12px; - padding: 4px 8px; - overflow: hidden; - white-space: pre-wrap; border-radius: 3px; - opacity: 0.9; +} - box-shadow: 0 0 2px rgba(255, 255, 255, 0.5); +.jx-tooltip { + color: #fff; + font-size: {$normalfontsize}; + -webkit-font-smoothing: antialiased; + font-weight: bold; + padding: 6px 8px; + overflow: hidden; + white-space: pre-wrap; } .jx-tooltip:after { @@ -26,7 +59,7 @@ width: 0; position: absolute; pointer-events: none; - border-color: rgba(0, 0, 0, 0); + border-color: rgba({$alphablack}, 0); border-width: 5px; } @@ -41,6 +74,10 @@ top: 50%; } +.jx-tooltip-align-E { + margin-right: 5px; +} + .jx-tooltip-align-W .jx-tooltip:after { margin-top: -5px; border-left-color: #000; @@ -49,7 +86,7 @@ } .jx-tooltip-align-N { - margin-top: -5px; + margin-bottom: 5px; } .jx-tooltip-align-N .jx-tooltip:after { @@ -59,6 +96,10 @@ left: 50%; } +.jx-tooltip-align-N { + margin-top: 5px; +} + .jx-tooltip-align-S .jx-tooltip:after { margin-left: -5px; border-bottom-color: #000; diff --git a/webroot/rsrc/css/aphront/transaction.css b/webroot/rsrc/css/aphront/transaction.css deleted file mode 100644 index d16361bc90..0000000000 --- a/webroot/rsrc/css/aphront/transaction.css +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @provides phabricator-transaction-view-css - */ - -.phabricator-transaction-view { - background: 0px 2px no-repeat; - margin: 1em 0 1.25em; - min-height: 50px; - padding: 2px 0px; -} - -.device-phone .phabricator-transaction-view { - margin: 10px 0; -} - -.phabricator-transaction-detail { - border-color: #dddddd; - border-width: 1px 10px; - border-style: solid; - margin-left: 54px; -} - -.device-phone .phabricator-transaction-detail { - margin: 0; - min-height: 50px; - background: #fff; -} - -.phabricator-transaction-header { - background: #f3f3f3; - padding: 4px 1em; -} - -.phabricator-transaction-header a { - font-weight: bold; -} - -.phabricator-transaction-info { - color: #777; - float: right; - font-size: 11px; -} - -.device-phone .phabricator-transaction-info { - display: none; -} - -.phabricator-transaction-content { - background: #fcfcfc; - line-height: 1.4em; - padding: .3em 1em; - overflow: auto; -} - -.phabricator-transaction-subheader { - color: #888888; - border-bottom: 1px solid #e0e0e0; - padding-bottom: 4px; - margin-bottom: 4px; -} - -div.phabricator-remarkup + .phabricator-transaction-subheader { - margin-top: 12px; -} diff --git a/webroot/rsrc/css/aphront/two-column.css b/webroot/rsrc/css/aphront/two-column.css deleted file mode 100644 index e9a0217e8c..0000000000 --- a/webroot/rsrc/css/aphront/two-column.css +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @provides aphront-two-column-view-css - */ - -.aphront-two-column { - position: relative; -} - -.device-desktop .aphront-two-column.aphront-two-column-padded { - margin: 20px; -} - -.device-desktop .aphront-two-column .aphront-main-column { - margin-right: 300px; -} - -.device-desktop .aphront-two-column .aphront-side-column { - width: 300px; - position: absolute; - top: 0; - right: 0; -} - -.device-desktop .aphront-two-column-centered { - width: 980px; - margin: 0 auto; -} - -.device-desktop .aphront-two-column-centered .aphront-main-column { - float: left; - width: 820px; -} - -.device-desktop .aphront-two-column-centered .aphront-side-column { - width: 160px; - float: right; -} - -.device-phone .aphront-two-column.aphront-two-column-padded { - margin: 10px; -} diff --git a/webroot/rsrc/css/aphront/typeahead-browse.css b/webroot/rsrc/css/aphront/typeahead-browse.css new file mode 100644 index 0000000000..8746d9db4e --- /dev/null +++ b/webroot/rsrc/css/aphront/typeahead-browse.css @@ -0,0 +1,66 @@ +/** + * @provides typeahead-browse-css + */ + +.typeahead-browse-more, +.typeahead-browse-hard-limit { + display: block; + padding: 8px; + margin: 4px 6px 6px; + text-align: center; +} + +.typeahead-browse-more { + background: {$lightbluebackground}; + border: 1px solid {$lightblueborder}; + color: {$blue}; +} + +.typeahead-browse-more.loading { + opacity: 0.8; +} + +.typeahead-browse-hard-limit { + background: {$lightgreybackground}; + border: 1px solid {$lightgreyborder}; + color: {$lightgreytext}; +} + +.typeahead-browse-frame { + overflow-x: hidden; + overflow-y: auto; + height: 260px; + border: 1px solid {$lightblueborder}; + border-bottom: 1px solid {$blueborder}; +} + +.typeahead-browse-frame.loading { + opacity: 0.8; +} + +.typeahead-browse-header { + padding: 0 0 8px 0; +} + +input.typeahead-browse-input { + margin: 0; + width: 100%; +} + +.typeahead-browse-item { + padding: 2px 0; +} + +.typeahead-browse-item + .typeahead-browse-item { + border-top: 1px solid {$thinblueborder}; +} + +.typeahead-browse-item button { + float: right; + margin: 8px 6px 0; +} + +.typeahead-browse-item a.jx-tokenizer-token { + margin-top: 1px; + margin-left: 6px; +} diff --git a/webroot/rsrc/css/aphront/typeahead.css b/webroot/rsrc/css/aphront/typeahead.css index 3004b3814f..05fec1e70c 100644 --- a/webroot/rsrc/css/aphront/typeahead.css +++ b/webroot/rsrc/css/aphront/typeahead.css @@ -4,47 +4,77 @@ div.jx-typeahead-hardpoint { position: relative; - _zoom: 1; /* Some kind of IE6 fix? */ /* yes */ + _zoom: 1; /* Some kind of IE6 fix? */ /* yes */ /* why? */ /* still need? */ } div.jx-typeahead-results { position: absolute; - border: 1px solid #96a6c7; + border: 1px solid {$thinblueborder}; border-top: 0px; padding: 0; - background: #fefefe; + background: {$page.content}; width: 98%; - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2); + box-shadow: 0px 1px 2px rgba({$alphablack}, 0.2); margin: -1px 1% 0; } +.aphront-form-control-typeahead div.jx-typeahead-results { + width: 100%; + margin: 0; + box-sizing: border-box; +} + div.jx-typeahead-results a.jx-result { - color: #333; + color: {$darkgreytext}; display: block; - padding: 5px 8px; - font-size: 13px; - border-bottom: 1px solid #e7e7e7; - border-top: 1px solid #fff; + font-size: {$normalfontsize}; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +div.jx-typeahead-results a.jx-result + a.jx-result { + border-top: 1px solid {$thinblueborder}; } div.jx-typeahead-results a.jx-result:hover, div.jx-typeahead-results a.focused { display: block; - background: #dde6f9; - border-top: 1px solid #dde6f9; - border-bottom: 1px solid #d0dbf3; + background: {$hoverblue}; text-decoration: none; } +div.jx-typeahead-results .phui-icon-view { + margin-top: 2px; +} + table.jx-typeahead button { margin-left: 3px; } table.jx-typeahead input { - font-size: 13px; + font-size: {$normalfontsize}; padding: 2px; } input.jx-typeahead-placeholder { - color: #888888; + color: {$lightgreytext}; +} + +div.jx-tokenizer-container-focused.jx-typeahead-waiting { + border-color: {$lightblueborder}; +} + +div.jx-typeahead-results a.diffusion-locate-file { + padding: 4px 8px; + color: {$darkgreytext} +} + +.diffusion-locate-file strong { + color: {$fire}; + text-decoration: underline; +} + +.diffusion-locate-file .phui-icon-view { + padding-right: 8px; } diff --git a/webroot/rsrc/css/application/almanac/almanac.css b/webroot/rsrc/css/application/almanac/almanac.css new file mode 100644 index 0000000000..9091aff761 --- /dev/null +++ b/webroot/rsrc/css/application/almanac/almanac.css @@ -0,0 +1,7 @@ +/** + * @provides almanac-css + */ + +.almanac-default-property-value { + color: {$lightgreytext}; +} diff --git a/webroot/rsrc/css/application/auth/auth.css b/webroot/rsrc/css/application/auth/auth.css index cf820bb070..28b18b85c5 100644 --- a/webroot/rsrc/css/application/auth/auth.css +++ b/webroot/rsrc/css/application/auth/auth.css @@ -24,13 +24,24 @@ } .auth-account-view { - border: 1px solid #aaaaaa; - background-repeat: no-repeat; - background-position: 4px 4px; - padding: 4px 4px 4px 62px; + background-color: {$lightbluebackground}; + border: 1px solid {$thinblueborder}; + border-radius: 3px; min-height: 50px; - border-radius: 2px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); + position: relative; + padding: 4px 4px 4px 64px; +} + +.auth-account-view-profile-image { + width: 50px; + height: 50px; + top: 6px; + left: 6px; + + background-repeat: no-repeat; + background-size: 100%; + box-shadow: {$borderinset}; + position: absolute; } .auth-account-view-name { @@ -38,5 +49,18 @@ } .auth-account-view-provider-name { - color: #888888; + color: {$lightgreytext}; +} + +.auth-account-view-account-uri { + word-break: break-word; +} + +.auth-custom-message { + margin: 32px auto 48px; + max-width: 548px; + background: #fff; + padding: 16px; + border: 1px solid {$lightblueborder}; + border-radius: 4px; } diff --git a/webroot/rsrc/css/application/base/main-menu-view.css b/webroot/rsrc/css/application/base/main-menu-view.css index bb29422130..66f81da0bc 100644 --- a/webroot/rsrc/css/application/base/main-menu-view.css +++ b/webroot/rsrc/css/application/base/main-menu-view.css @@ -1,5 +1,6 @@ /** * @provides phabricator-main-menu-view + * @requires phui-theme-css */ @@ -11,16 +12,16 @@ */ .phabricator-main-menu { - background: #2d3236; - background-image: url(http://github.com/rsrc/image/texture/phlnx-bg.png); - background-repeat: repeat-x; position: relative; - box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.25); +} + +.phabricator-main-menu-background { min-height: 44px; } .device-desktop .phabricator-main-menu { height: 44px; + padding-right: 4px; } .phabricator-main-menu a:hover { @@ -39,33 +40,41 @@ float: left; } -.phabricator-main-menu-logo { - display: inline-block; - width: 149px; +.phabricator-main-menu-brand { height: 44px; float: left; margin-right: 6px; - padding-right: 6px; padding-left: 6px; } -.device-desktop .phabricator-main-menu-logo:hover { - background-color: rgba(0,0,0,.6); +.phabricator-main-menu-eye { + margin: 2px 0; + width: 40px; + height: 40px; + float: left; + display: block; + background-image: url(http://github.com/rsrc/image/logo/light-eye.png); + background-size: 40px 40px; } -.phabricator-main-menu-logo-image { - position: absolute; - width: 149px; - height: 26px; - top: 9px; +.device-desktop .phabricator-main-menu-brand:hover { + background-color: rgba({$alphagrey},.2); + cursor: hand; } -.device-phone .phabricator-main-menu-logo { - margin-left: -45px; +.device-phone .phabricator-wordmark { + display: none; } -.device .phabricator-main-menu-logo:hover { - background-color: transparent; +.phabricator-wordmark { + float: left; + color: #fff; + font-size: 18px; + margin: 9px 4px 9px 6px; + padding-right: 8px; + max-width: 175px; + overflow: hidden; + white-space: nowrap; } /* - Expand/Collapse Button ---------------------------------------------------- @@ -76,10 +85,20 @@ */ .phabricator-menu-button-icon { - width: 24px; - height: 24px; + width: 20px; + height: 32px; float: left; - margin: 10px 10px 0 5px; + margin: 10px 8px 0 8px; +} + +.phabricator-menu-button-icon.phui-icon-view { + font-size: 20px; + height: 20px; + width: 20px; + color: {$hoverwhite}; + text-align: center; + vertical-align: middle; + line-height: 24px; } .phabricator-expand-application-menu, @@ -100,7 +119,7 @@ */ .device-desktop .phabricator-main-menu-search { - width: 220px; + width: 298px; } .device .phabricator-main-menu-search { @@ -108,20 +127,19 @@ } .phabricator-main-menu-search-container { - padding: 9px 0 10px 0; + padding: 8px 0; position: relative; height: 24px; - margin: 0 8px; + margin: 0 8px 0 0; } .phabricator-main-menu-search-target { position: absolute; - top: 46px; + top: 42px; } .device-desktop .phabricator-main-menu-search-target { - width: 320px; - margin-left: -150px; + width: 360px; } .device .phabricator-main-menu-search-target { @@ -131,6 +149,7 @@ .device .phabricator-main-menu-search-container { padding: 4px 0; + margin: 0 4px; } .phabricator-main-menu .phabricator-main-menu-search input { @@ -139,87 +158,177 @@ box-shadow: none; transition: none; - color: #999; + color: {$bluetext}; width: 100%; right: 0; position: absolute; - font-size: 13px; - border: 1px solid #333; - border-radius: 12px; - background-color: #555; - height: 26px; - line-height: 12px; - box-shadow: 0px 1px 1px rgba(128, 128, 128, 0.25); - padding: 6px 32px 6px 10px; + font-size: {$normalfontsize}; + border: none; + background-color: {$page.content}; + height: 28px; + padding: 3px 28px 3px 48px; + float: left; + width: 280px; } .device .phabricator-main-menu-search input { - height: 30px; - font-size: 15px; - border-radius: 15px; + height: 32px; + font-size: {$biggestfontsize}; + width: 100%; + padding-left: 50px; + border: 1px solid {$lightblueborder}; } .phabricator-main-menu .phabricator-main-menu-search input:focus { - background: #fff; - color: #333; - border-color: #e7e7e7; + background: {$page.content}; + opacity: 1; + color: {$darkbluetext}; box-shadow: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; } .phabricator-main-menu-search input.jx-typeahead-placeholder { - color: #999; + color: {$bluetext}; } .phabricator-main-menu-search button { + color: {$bluetext}; position: absolute; - color: transparent; - background: transparent 5px 6px url(http://github.com/rsrc/image/search.png) no-repeat; + background: transparent; border: none; outline: none; box-shadow: none; text-shadow: none; min-width: 0; + height: 24px; + width: 28px; + top: 9px; + right: -6px; + margin: 0 8px 0 0; + padding: 0; + border-radius: 0; +} - height: 20px; - width: 20px; - top: 10px; - right: 6px; +.phabricator-main-menu-search button.phabricator-main-menu-search-dropdown { + position: absolute; + right: auto; + left: 12px; + width: 40px; + background: {$greybackground}; + z-index: 1; +} + +.device-desktop .phabricator-main-menu-search + button.phabricator-main-menu-search-dropdown { + height: 24px; + top: 10px; + border-radius: 3px; + } + +.device-desktop .phabricator-main-menu-search + button.phabricator-main-menu-search-dropdown:hover .phui-icon-view { + color: {$sky}; +} + +.device .phabricator-main-menu-search + button.phabricator-main-menu-search-dropdown { + left: 2px; + background: {$greybackground}; +} + +button.phabricator-main-menu-search-dropdown .caret:before, +a.phabricator-core-user-menu .caret:before { + content: "\f107"; + font-family: FontAwesome; +} + +.phabricator-main-menu-search button.phabricator-main-menu-search-dropdown + .phui-icon-view { + color: {$bluetext}; + font-size: 15px; + top: 4px; + left: 8px; + position: absolute; +} + +.phabricator-main-menu-search-dropdown .caret { + position: absolute; + right: 20px; + top: 2px; + border: none; + margin-top: 1px; +} + +.phabricator-main-menu-search button:hover { + color: {$sky}; } .device .phabricator-main-menu-search button { - top: 7px; + top: 6px; + border-radius: 0; + height: 28px; + right: -6px; } .phabricator-main-menu-search-target div.jx-typeahead-results { - background: #ffffff; + background: {$page.content}; word-wrap: break-word; overflow-y: auto; - box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.5); - border: 2px solid #33393d; + box-shadow: {$dropshadow}; + border: 1px solid {$lightgreyborder}; border-radius: 3px; - margin-left: 40px; + margin-left: -64px; +} + +.device .phabricator-main-menu-search-target div.jx-typeahead-results { + margin-left: 28px; +} + +.phabricator-main-search-typeahead-result .phabricator-search-icon { + width: 28px; + height: 28px; + position: absolute; + top: 8px; + left: 8px; + font-size: 24px; + text-align: center; + vertical-align: bottom; } .phabricator-main-search-typeahead-result { display: block; - padding: 1px 4px 1px 38px; - background-position: 4px 4px; - background-size: 25px 25px; + padding: 6px 8px 8px 44px; + background-position: 8px; + background-size: 30px 30px; background-repeat: no-repeat; + position: relative; } .phabricator-main-search-typeahead-result .result-name { display: block; - font-size: 12px; + font-size: {$normalfontsize}; font-weight: bold; - color: #333; + color: {$darkgreytext}; +} + +.phabricator-main-search-typeahead-result.result-closed { + opacity: .8; + -webkit-filter: grayscale(100%); + filter: grayscale(100%); +} + +.phabricator-main-search-typeahead-result.result-closed + .result-name { + text-decoration: line-through; + color: {$lightgreytext}; +} + +.phabricator-main-search-typeahead-result.has-image { + padding-left: 48px; } .phabricator-main-search-typeahead-result .result-type { - color: #888; - font-size: 11px; + color: {$lightgreytext}; + font-size: {$smallestfontsize}; font-weight: normal; } @@ -228,6 +337,14 @@ padding: 0; } +.device-phone .phabricator-main-search-typeahead-result .result-name { + font-size: {$biggestfontsize}; +} + +.device-phone .phabricator-main-search-typeahead-result .result-type { + font-size: {$normalfontsize}; +} + /* - Alert --------------------------------------------------------------------- @@ -237,71 +354,95 @@ .phabricator-main-menu-alerts { display: inline-block; - border-radius: 15px; float: left; - background: rgba(0,0,0,.5); - height: 20px; - padding: 2px 10px 3px 8px; - margin-top: 10px; + padding: 4px 0; +} + +.alert-notifications { + float: left; +} + +.alert-notifications .phui-icon-view { + color: {$hoverwhite}; +} + +.device-desktop .alert-notifications:hover { + margin-top: -2px; + transition-duration: .2s; + + /* See T13508. Avoid animation flickering behavior if the user's cursor is + at the very bottom of the element. */ + padding-bottom: 2px; +} + +.device-desktop .alert-notifications:hover .phui-icon-view { + color: #fff; } .phabricator-main-menu-alert-icon, -.phabricator-main-menu-message-icon { +.phabricator-main-menu-message-icon, +.phabricator-main-menu-setup-icon { width: 18px; height: 18px; - display: block; float: left; - margin: 2px 0 0 0; + padding: 8px 6px 8px 4px; + color: #fff; + font-size: 18px; + line-height: 20px; + text-align: right; } -.alert-notifications .phabricator-main-menu-message-icon { - margin: 2px 0 0 6px; +.phui-icon-view.menu-icon-selected { + color: #fff; } -.phabricator-main-menu-alert-count, -.phabricator-main-menu-message-count { - font-weight: bold; - line-height: 20px; - color: #ffffff; - text-align: center; - display: none; - float: left; - margin-left: 3px; +.phabricator-main-menu-alert-icon { + font-size: 16px; + margin-top: 2px; } -.alert-unread .phabricator-main-menu-alert-count, -.message-unread .phabricator-main-menu-message-count { - display: block; +.setup-unread .phui-icon-view.phabricator-main-menu-setup-icon { + color: #ecf36c; + font-size: 16px; + margin-top: 2px; + width: 15px; } -/* - Dark Menu ----------------------------------------------------------------- - - Styles shared between the "core" menu (left button on mobile) and - "application" menu (right button on mobile). These styles give the menu a - white-on-black appearance. +.setup-unread .phabricator-main-menu-setup-count { + color: #ecf36c; + margin-top: 10px; +} -*/ +.device-desktop .alert-notifications.setup-unread:hover .phui-icon-view { + color: #ecf36c; +} -.device .phabricator-dark-menu, -.device .phabricator-dark-menu a.phui-list-item-href { +.phabricator-main-menu-alert-count, +.phabricator-main-menu-message-count, +.phabricator-main-menu-setup-count { color: #fff; + text-align: center; + display: none; + float: left; + margin: 11px 6px 0 -2px; + font-size: {$smallerfontsize}; } -.device .phabricator-dark-menu .phui-list-item-type-label { - text-transform: uppercase; - font-size: 12px; - background-color: #151719; - padding: 5px 0; - display: block; - font-weight: bold; +.device-phone .alert-unread .phabricator-main-menu-alert-count, +.device-phone .message-unread .phabricator-main-menu-message-count, +.device-phone .setup-unread .phabricator-main-menu-setup-count { + display: none; } -.device .phabricator-dark-menu .phui-list-item-href { - border-width: 1px 0; - border-style: solid; - border-color: #34373b transparent #282c2d; - background-image: url(http://github.com/rsrc/image/texture/dark-menu.png); - padding: 4px 0; +.alert-unread .phabricator-main-menu-alert-icon, +.message-unread .phabricator-main-menu-message-icon, +.setup-unread .phabricator-main-menu-setup-icon { + color: #fff; +} + +.alert-unread .phabricator-main-menu-alert-count, +.message-unread .phabricator-main-menu-message-count, +.setup-unread .phabricator-main-menu-setup-count { display: block; } @@ -312,10 +453,6 @@ */ -.phabricator-core-menu-profile-image { - background-size: 28px 28px; -} - .device .phabricator-search-menu { display: none; } @@ -326,18 +463,14 @@ .device .phabricator-search-menu-expanded .phabricator-search-menu { display: block; - padding-top: 44px; -} - -.device .phabricator-dark-menu .phui-list-item-type-link { - font-size: 15px; - min-height: 30px; - line-height: 28px; -} - -.device .phui-list-item-type-link - .phabricator-core-menu-icon + .phui-list-item-name { - margin-left: 30px; + position: absolute; + top: 38px; + left: 8px; + right: 8px; + border: 1px solid {$lightblueborder}; + border-radius: 3px; + box-shadow: {$dropshadow}; + background: {$page.background}; } .device-desktop .phabricator-application-menu { @@ -349,29 +482,58 @@ display: none; } -.device-desktop .phabricator-application-menu .phui-list-item-view.core-menu-item { +.phabricator-application-menu .phui-list-item-href { display: block; } +.phabricator-application-menu .phui-list-item-icon.phui-font-fa { + font-size: 20px; + height: 20px; + width: 20px; + color: {$hoverwhite}; + margin: 8px; + text-align: center; + vertical-align: middle; +} + +.device .phabricator-application-menu .phui-list-item-icon.phui-font-fa { + margin: 4px 12px 4px 0; +} + +.phabricator-application-menu .phui-list-item-icon.fa-plus { + line-height: 22px; +} + .device-desktop .phabricator-application-menu - .core-menu-item.phui-list-item-view:hover { - background-color: rgba(0,0,0,.6); + .core-menu-item.phui-list-item-view:hover + .phui-list-item-icon.phui-font-fa { + color: #fff; + } + +.device-desktop .phabricator-application-menu + .phui-list-item-view.core-menu-item { + display: block; } .device-desktop .phabricator-application-menu .phui-list-item-view { float: left; position: relative; - min-width: 40px; - height: 44px; + min-width: 36px; + height: 36px; + margin-top: 4px; } .device-desktop .phabricator-core-menu-icon { - top: 9px; - left: 6px; + top: 4px; + left: 4px; } .device .phabricator-core-menu-icon { - left: 6px; + left: 16px; + height: 24px; + width: 24px; + background-size: 24px; + margin: 2px; } .phabricator-core-menu-icon { @@ -381,22 +543,135 @@ height: 28px; } -/* - Application Menu ---------------------------------------------------------- +.phabricator-main-menu-dropdown.phui-list-sidenav { + position: absolute; + background: #fff; + top: 42px; + padding: 6px 0; + margin: 0 20px 0 0; + box-shadow: {$dropshadow}; + border: 1px solid {$lightblueborder}; + border-radius: 3px; +} + +.phabricator-main-menu-dropdown.phui-list-sidenav .phui-list-item-has-icon + .phui-list-item-href { + padding: 4px 40px 4px 12px; + white-space: nowrap; +} - Styles unique to the application menu (right button on mobile). +.phabricator-main-menu-dropdown.phui-list-sidenav .phui-list-item-type-label + .phui-list-item-name { + padding-left: 12px; +} + +/* - User Menu ----------------------------------------------------------------- + + Styles unique to the user profile menu. */ -.device .phabricator-application-menu-expanded .phabricator-application-menu { - display: block; - padding-top: 44px; +.phabricator-core-user-menu { + float: right; + display: inline-block; + padding: 9px 24px 0 8px; + height: 35px; + position: relative; } -.device .phabricator-application-menu, -.device-desktop .phabricator-dark-menu .phui-list-item-type-label { +.phabricator-core-user-mobile-menu { display: none; } -.phabricator-application-menu .phui-list-item-name { - padding-left: 12px; +.phabricator-core-user-menu span.phui-icon-view.phuihead-small { + height: 24px; + width: 24px; + background-size: 24px; + border-radius: 3px; + display: inline-block; + margin: 1px 0 0 0; +} + +.phabricator-core-user-menu .phui-icon-view { + color: {$hoverwhite}; + font-size: 18px; + margin: 4px 0 0 0; +} + +.phabricator-core-user-menu .caret { + position: absolute; + right: 17px; + top: 13px; + border: none; + margin: 1px; + color: {$hoverwhite}; +} + +.phabricator-core-login-button { + float: right; + display: inline-block; + padding: 4px 12px; + border-radius: 3px; + margin: 8px 6px 4px; + border: 1px solid {$hoverwhite}; + color: {$hoverwhite}; +} + +.device-desktop .phabricator-core-login-button:hover { + border: 1px solid #fff; + color: #fff; +} + +.device-desktop .phabricator-core-user-menu:hover .caret, +.device-desktop .phabricator-core-user-menu:hover .phui-icon-view { + color: #fff; +} + +.device .phabricator-core-user-menu .caret { + display: none; +} + +.device .phabricator-core-user-mobile-menu { + display: block; +} + +.device .phabricator-core-user-menu { + padding: 9px 8px 0 8px; +} + +.device .phabricator-core-user-menu .phui-icon-view { + font-size: 20px; + margin: 3px 0 0 0; +} + +ul.phabricator-core-user-profile-object .phui-oi-objname { + font-size: {$biggestfontsize}; +} + +ul.phabricator-core-user-profile-object li.phui-oi, +ul.phabricator-core-user-profile-object .phui-oi-name, +ul.phabricator-core-user-profile-object .phui-oi-content, +ul.phabricator-core-user-profile-object .phui-oi-subhead { + padding: 0; + margin: 0; + background: transparent; +} + +ul.phabricator-core-user-profile-object.phui-oi-list-simple .phui-oi-image { + height: 36px; + width: 36px; +} + +ul.phabricator-core-user-profile-object.phui-oi-list-simple + .phui-oi-content-box { + margin-left: 44px; +} + + + +/* - Print --------------------------------------------------------------------- +*/ + +!print .phabricator-main-menu { + display: none; } diff --git a/webroot/rsrc/css/application/base/notification-menu.css b/webroot/rsrc/css/application/base/notification-menu.css index 666c69d7ee..5886798600 100644 --- a/webroot/rsrc/css/application/base/notification-menu.css +++ b/webroot/rsrc/css/application/base/notification-menu.css @@ -3,79 +3,168 @@ */ .phabricator-notification-menu { - background: #ffffff; - font-size: 11px; + background: {$page.content}; + font-size: {$smallerfontsize}; + line-height: 18px; word-wrap: break-word; overflow-y: auto; - box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.5); - border: 2px solid #33393d; - border-top-width: 0; + box-shadow: {$dropshadow}; + border: 1px solid {$lightgreyborder}; border-radius: 3px; } +.phabricator-notification { + padding: 8px 12px; + color: {$darkgreytext}; +} + .phabricator-notification-menu-loading { text-align: center; padding: 10px 0; - color: #888888; + color: {$lightgreytext}; } .device-desktop .phabricator-notification-menu, .device-tablet .phabricator-notification-menu { - position: fixed; + position: absolute; width: 360px; top: 42px; } .device-phone .phabricator-notification-menu { - border-bottom: 1px solid #222222; + border-bottom: 1px solid {$thinblueborder}; width: 94%; max-width: 390px; top: 42px !important; left: 3% !important; position: absolute; +} +.phabricator-notification-list.pm { + padding: 0; } -.phabricator-notification { - padding: 6px; +.phabricator-notification-list .phabricator-notification { + padding: 8px; +} + +.phabricator-notification-menu .phabricator-notification { cursor: pointer; } .device-desktop .phabricator-notification-menu .phabricator-notification:hover { - background: #e6ebf5; + background: {$lightgreybackground}; +} + +.device-desktop .phabricator-notification-menu + .phabricator-notification-unread.phabricator-notification:hover { + background: {$hoverselectedblue}; } .phabricator-notification + .phabricator-notification { - border-top: 1px solid #e9e9e9; + border-top: 1px solid {$thinblueborder}; } .no-notifications { - color: #999999; + color: {$lightgreytext}; } -.phabricator-notification-list { - font-size: 11px; +.phabricator-notification-warning { + background: {$sh-yellowbackground}; } .phabricator-notification-list .phabricator-notification-unread, .phabricator-notification-menu .phabricator-notification-unread { - background: #eceff5; - border-color: #e3e8f0; + background: {$hoverblue}; +} + +.phabricator-notification-read { + color: {$lightgreytext}; +} + +.phabricator-notification-foot { + color: {$lightgreytext}; + font-size: {$smallestfontsize}; + line-height: 18px; + position: relative; +} + +.phabricator-notification-unread .phabricator-notification-foot { + padding-left: 10px; +} + +.phabricator-notification-foot .phabricator-notification-status { + display: none; +} + +.phabricator-notification-unread .phabricator-notification-foot + .phabricator-notification-status { + font-size: 7px; + color: {$lightbluetext}; + position: absolute; + display: inline-block; + top: 6px; + left: 0; } .phabricator-notification-header { font-weight: bold; - padding: 6px; - font-size: 12px; - border-bottom: 1px solid #e9e9e9; + padding: 10px 12px; + font-size: {$smallerfontsize}; + border-bottom: 1px solid {$thinblueborder}; } -.phabricator-notification-view-all { - text-align: center; - font-weight: bold; - background: #f7f7f7; - border-top: 1px solid #e9e9e9; +.phabricator-notification-header a { + color: {$anchor}; +} + +.phabricator-notification-header a:hover { + text-decoration: underline; +} + +.phabricator-notification-header .phabricator-notification-clear-all { + color: {$anchor}; + float: right; + font-weight: normal; +} + +.phabricator-notification-footer { + background: {$greybackground}; + border-top: 1px solid {$thinblueborder}; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; - padding: 6px; + padding: 8px; + font-size: {$smallerfontsize}; + color: {$darkgreytext}; +} + +.phabricator-notification-footer a { + color: {$darkgreytext}; +} + +.phabricator-notification-footer a:hover { + text-decoration: underline; +} + +.phabricator-notification-menu .aphlict-connection-status { + color: {$lightgreytext}; +} + +.aphlict-connection-status { + position: relative; +} + +.aphlict-connection-status .phui-icon-view { + font-size: 9px; + position: absolute; + top: 4px; +} + +.aphlict-connection-status .connection-status-text { + margin-left: 12px; +} + +.phabricator-notification .phui-timeline-value { + font-style: italic; + color: #000; } diff --git a/webroot/rsrc/css/application/base/phabricator-application-launch-view.css b/webroot/rsrc/css/application/base/phabricator-application-launch-view.css deleted file mode 100644 index 9f5899c42c..0000000000 --- a/webroot/rsrc/css/application/base/phabricator-application-launch-view.css +++ /dev/null @@ -1,194 +0,0 @@ -/** - * @provides phabricator-application-launch-view-css - */ - - -/* - Application List ---------------------------------------------------------- - - Spacing container for the list of large application buttons. - -*/ - - -.application-tile-group { - overflow: hidden; -} - - -/* - Application Launch Button ------------------------------------------------- - - Spacing container for the list of large application buttons. - -*/ - -a.phabricator-application-launch-container, -div.phabricator-application-launch-container { - display: block; - float: left; - width: 78px; - height: 66px; - overflow: hidden; - position: relative; - border: 1px solid #1c1e22; - text-decoration: none; -} - -a.application-tile-full { - width: 100%; - height: 52px; - border-bottom: none; - border-left: none; - border-right: none; -} - -.device-phone div.phabricator-application-launch-container { - display: none; -} - -a.application-tile-full.application-tile-create { - width: 88%; - height: 52px; - border-right: none; -} - -.application-tile-full + .phabricator-application-launch-create { - float: right; - width: 12%; - height: 52px; - position: relative; - border-top: 1px solid #000; - border-bottom: none; - display: inline-block; - text-align: center; -} - -.device-desktop a.phabricator-application-launch-create:hover { - background-color: #1e2225; - color: #fff; - text-decoration: none; -} - -.device-desktop a.phabricator-application-launch-container:hover { - background-color: #1e2225; - text-decoration: none; -} - -.phabricator-application-launch-icon { - display: block; - position: absolute; - left: 25px; - top: 10px; - width: 28px; - height: 28px; -} - -.phabricator-application-create-icon { - display: inline-block; - margin: 20px auto; - width: 14px; - height: 14px; -} - -.application-tile-full .phabricator-application-launch-icon { - top: 12px; - left: 10px; -} - -.phabricator-application-launch-name { - display: block; - margin-top: 42px; - font-weight: bold; - font-size: 11px; - text-align: center; - color: #ffffff; - text-shadow: 0px 1px 1px #000000; -} - -.application-tile-full .phabricator-application-launch-name { - font-size: 13px; - margin-top: 11px; - text-align: left; - margin-left: 48px; - -} - -.application-tile-full .phabricator-application-launch-description { - color: #bfbfbf; - font-size: 11px; - margin-top: 24px; - margin-left: 48px; -} - -.phabricator-application-beta { - position: absolute; - top: 4px; - border-radius: 10px; - color: white; - font-weight: bold; - padding: 1px 6px 2px; - border: 2px solid #333; - font-size: 11px; - box-shadow: 0 0px 2px #000; -} - -.phabricator-application-launch-attention { - position: absolute; - top: 4px; - border-radius: 10px; - color: white; - font-weight: bold; - padding: 1px 0 2px; - border: 2px solid #333; - font-size: 11px; - box-shadow: 0 0px 2px #000; -} - -.phabricator-application-attention-count { - background-color: rgb(0, 122, 255); - border-radius: 10px; - color: white; - font-weight: bold; - padding: 1px 6px 2px; - border: 1px solid #333; - font-size: 11px; -} - -.phabricator-application-warning-count { - padding: 6px; -} - -.phabricator-application-attention-count + .phabricator-application-warning-count { - margin-left: -2px; -} - -.phabricator-application-launch-attention { - right: 4px; - background-color: rgb(119, 119, 119); -} - -.phabricator-application-beta { - left: 4px; - background-color: rgb(109, 92, 41); -} - -.application-tile-full .phabricator-application-launch-attention { - top: 16px; - right: 8px; -} - -.application-tile-full .phabricator-application-launch-create { - display: inline-block; - float: right; - background: rgb(0, 122, 255); - border-radius: 5px; - color: white; - font-weight: bold; - padding: 1px 6px 2px; - border: 2px solid #333; - font-size: 11px; - box-shadow: 0 0px 2px #000; -} - -.phabricator-application-launch-create { - display: none; -} diff --git a/webroot/rsrc/css/application/base/phui-theme.css b/webroot/rsrc/css/application/base/phui-theme.css new file mode 100644 index 0000000000..d2a2c85ac7 --- /dev/null +++ b/webroot/rsrc/css/application/base/phui-theme.css @@ -0,0 +1,30 @@ +/** + * @provides phui-theme-css + */ + +/*--- Header Colors ----------------------------------------------------------*/ + +.phui-theme-blindigo .phabricator-main-menu-background { + background: #4a5f88; +} + +.phui-theme-dark .phabricator-main-menu-background { + background: #171c20; +} + +.phui-theme-indigo .phabricator-main-menu-background { + background: #2C1D4A; +} + +.phui-theme-red .phabricator-main-menu-background { + background: #650404; +} + +.phui-theme-blue .phabricator-main-menu-background { + background: #003965; +} + +.phui-theme-green .phabricator-main-menu-background { + background: #124A1B; +} + diff --git a/webroot/rsrc/css/application/base/standard-page-view.css b/webroot/rsrc/css/application/base/standard-page-view.css index 473a6ca566..ee74139e69 100644 --- a/webroot/rsrc/css/application/base/standard-page-view.css +++ b/webroot/rsrc/css/application/base/standard-page-view.css @@ -2,10 +2,6 @@ * @provides phabricator-standard-page-view */ -.phabricator-standard-page { - background: #ffffff; -} - .phabricator-anchor-view, .phabricator-anchor-navigation-marker { position: absolute; @@ -13,45 +9,85 @@ } .phabricator-chromeless-page .phabricator-standard-page { - background: transparent; - border-width: 0px; + background: transparent; + border-width: 0px; +} + +.phabricator-standard-page-body { + clear: both; +} + +body.white-background { + background: {$page.content}; +} + +.phabricator-standard-page-footer { + text-align: right; + margin: 44px 16px 16px; + padding: 12px 0; + border-top: 1px solid rgba({$alphagrey},.1); + color: {$greytext}; +} + +.with-durable-column .phabricator-standard-page-footer { + margin: 36px 16px 28px; +} + +.device .phabricator-standard-page-footer { + margin: 24px 8px 16px; +} + +!print .phabricator-standard-page-footer { + display: none; +} + +.device-desktop .has-local-nav + .phabricator-standard-page-footer { + margin-left: 221px; +} + +.device .phabricator-side-menu-home + .phabricator-standard-page-footer { + display: none; +} + +.keyboard-shortcut-help { + margin: 4px 12px; } .keyboard-shortcut-help td, .keyboard-shortcut-help th { - padding: 8px; + padding: 6px; vertical-align: middle; } .keyboard-shortcut-help th { white-space: nowrap; - color: #666666; + color: {$greytext}; } -.keyboard-shortcut-help kbd { - background: #222222; - padding: 6px; - color: #ffffff; - font-weight: bold; - border: 1px solid #555555; +.keyboard-shortcut-key { + display: inline-block; + min-width: 1em; + min-height: 1em; + padding: 4px 6px; + font-weight: normal; + text-align: center; + text-decoration: none; + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba({$alphablue}, 0.08); + user-select: none; + color: {$darkgreytext}; + background: {$lightgreybackground}; + border: 1px solid {$lightgreyborder}; } .keyboard-focus-focus-reticle { - background: #ffffd3; position: absolute; - border: 1px solid #999900; -} -.workflow-header { - background: #efefef; - padding: 6px 2em; - text-align: right; - margin-bottom: 6px; - border-bottom: 1px solid #dfdfdf; -} - -.workflow-header button { - float: right; + box-sizing: border-box; + border-width: 0 6px 0 0; + border-style: solid; + border-color: {$yellow}; + background: {$lightyellow}; } a.handle-status-closed { @@ -64,24 +100,20 @@ a.handle-status-closed:hover { color: #19558D; } -a.handle-disabled, -a.handle-status-away, -a.handle-status-sporadic { - padding-left: 11px; - background-repeat: no-repeat; - background-position: -4px center; +.handle-availability-none .perfect-circle { + color: {$red}; } -a.handle-status-away { - background-image: url(http://github.com/rsrc/image/icon/fatcow/bullet_red.png); +.handle-availability-partial .perfect-circle { + color: {$orange}; } -a.handle-status-sporadic { - background-image: url(http://github.com/rsrc/image/icon/fatcow/bullet_orange.png); +.handle-availability-no-email .perfect-circle { + color: {$violet}; } -a.handle-disabled { - background-image: url(http://github.com/rsrc/image/icon/fatcow/bullet_black.png); +.handle-availability-disabled .perfect-circle { + color: {$greytext}; } .aphront-developer-error-callout { @@ -90,12 +122,106 @@ a.handle-disabled { background: #aa0000; color: white; text-align: center; - font-size: 11px; - font-family: "Verdana"; + font-size: {$smallerfontsize}; } -.setup-warning-callout { +.phui-handle.phui-link-person { + /* Prevent linebreaks between user availability markers and usernames. */ + white-space: nowrap; +} + +.phui-handle .phui-icon-view { + display: inline-block; + margin: 2px 2px -2px 0; +} + +.jx-scrollbar-frame { position: relative; - padding: 8px 16px; - background: {$lightyellow}; + overflow: hidden; +} + +.jx-scrollbar-viewport { + position: absolute; + overflow-x: hidden; + overflow-y: scroll; + top: 0; + bottom: 0; + left: 0; + right: 0; +} + +.jx-scrollbar-test { + position: absolute; + left: -300px; +} + +.jx-scrollbar-bar { + position: absolute; + top: 0; + right: 0; + bottom: 7px; + width: 11px; +} + +.jx-scrollbar-bar .jx-scrollbar-handle { + position: absolute; + right: 2px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + border-radius: 7px; + min-height: 10px; + width: 7px; + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + -o-transition: opacity 0.2s linear; + -ms-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; + background: #6c6e71; + -webkit-background-clip: padding-box; + -moz-background-clip: padding; +} + +.jx-scrollbar-bar:hover .jx-scrollbar-handle { + opacity: 0.7; + -webkit-transition: opacity 0 linear; + -moz-transition: opacity 0 linear; + -o-transition: opacity 0 linear; + -ms-transition: opacity 0 linear; + transition: opacity 0 linear; +} + +.jx-scrollbar-bar .jx-scrollbar-visible { + opacity: 0.7; +} + +.jx-scrollbar-link { + position: absolute; + left: -50px; +} + +.phabricator-standard-page-tabs { + padding: 0 32px; + margin-bottom: 32px; + background: {$page.content}; + box-shadow: 0 0 3px 0 rgba(0,0,0,0.2); +} + +.device .phabricator-standard-page-tabs { + margin-bottom: 20px; + padding: 0 12px; +} + +.device-phone .phabricator-standard-page-tabs { + text-align: center; +} + +.device-phone + .phabricator-standard-page-tabs.phui-list-view.phui-list-tabbar > li { + display: inline-block; + float: none; +} + +.phabricator-standard-page-tabs.phui-list-tabbar .phui-list-item-href { + padding: 12px 24px; } diff --git a/webroot/rsrc/css/application/chatlog/chatlog.css b/webroot/rsrc/css/application/chatlog/chatlog.css index 1da7fce697..b0cb05a0e8 100644 --- a/webroot/rsrc/css/application/chatlog/chatlog.css +++ b/webroot/rsrc/css/application/chatlog/chatlog.css @@ -2,25 +2,26 @@ * @provides phabricator-chatlog-css */ -.phabricator-chat-log-wrap { - padding: 0 20px; -} - .device-phone .phabricator-chat-log-wrap { padding: 0; } +.phabricator-chat-log-pager-bottom { + padding: 8px 4px 16px; + font-weight: bold; + float: right; +} + +.phabricator-chat-log-pager-bottom a { + padding: 2px 3px; +} + .phabricator-chat-log-panel { - margin: 20px auto; - border-left: 1px solid #e7e7e7; - border-right: 1px solid #e7e7e7; - border-bottom: 1px solid #c0c5d1; + clear: both; } .phabricator-chat-log { width: 100%; - border: 1px solid #e7e7e7; - box-shadow: 0 1px 1px rgba(0,0,0,.2); } .phabricator-chat-log td { @@ -29,28 +30,24 @@ } .phabricator-chat-log tr { - background: #fafafa; + background: #fff; } .phabricator-chat-log tr td.author { - background: #e7e7ee; + background: {$greybackground}; } .phabricator-chat-log tr.alternate { - border-top: 1px solid #e7e7e7; - border-bottom: 1px solid #e7e7e7; + border-top: 1px solid {$thinblueborder}; + border-bottom: 1px solid {$thinblueborder}; } .phabricator-chat-log tr.alternate td.author { - background: #dfdfe6; + background: {$lightgreybackground}; } .phabricator-chat-log tr.highlight td { - background: #ffff88; -} - -.phabricator-chat-log tr.highlight td.author { - background: #eeee88; + background: {$lightyellow}; } .phabricator-chat-log td.timestamp { @@ -60,8 +57,8 @@ } .phabricator-chat-log td.message .timestamp { - color: #a1a5a9; - font-size: 11px; + color: {$bluetext}; + font-size: {$smallestfontsize}; float: right; margin-left: 5px; } @@ -71,7 +68,7 @@ text-align: right; font-weight: bold; width: 140px; - color: #555555; + color: {$darkbluetext}; } .device-phone .phabricator-chat-log td.author { diff --git a/webroot/rsrc/css/application/conduit/conduit-api.css b/webroot/rsrc/css/application/conduit/conduit-api.css new file mode 100644 index 0000000000..fbe577e908 --- /dev/null +++ b/webroot/rsrc/css/application/conduit/conduit-api.css @@ -0,0 +1,16 @@ +/** + * @provides conduit-api-css + */ +.conduit-api-example-code { + margin: 16px; + white-space: pre; + color: {$darkgreytext}; +} + +.conduit-api-example-code strong { + color: {$red}; +} + +.conduit-api-example-code strong.real { + color: {$blue}; +} diff --git a/webroot/rsrc/css/application/config/config-options.css b/webroot/rsrc/css/application/config/config-options.css index 89cd61a910..0c80e31b5e 100644 --- a/webroot/rsrc/css/application/config/config-options.css +++ b/webroot/rsrc/css/application/config/config-options.css @@ -5,44 +5,54 @@ .config-option-table { width: 100%; border-collapse: collapse; - border: 1px solid #cccccc; - background: #fff; + border: none; + background: {$page.content}; } .config-option-table th, .config-option-table td { - padding: 4px 12px; - border: 1px solid #cccccc; + padding: 8px 12px; + border-bottom: 1px solid {$thinblueborder}; } .config-option-table th { - background: #e9e9e9; - text-align: right; + background: {$lightgreybackground}; + color: {$bluetext}; + text-align: left; white-space: nowrap; } -.config-option-table th em { +.config-option-table th em, +.config-option-table td em { font-weight: normal; - color: #666666; + color: {$greytext}; } .config-option-table td { - color: #333333; + color: {$darkgreytext}; width: 100%; + white-space: pre-wrap; } .config-option-table .column-labels th { font-weight: bold; - color: #333333; - text-align: center; - background: #e0e0e0; + color: {$bluetext}; + background: {$lightgreybackground}; + border-right: 1px solid {$thinblueborder}; } .config-options-current-value { - padding: 0 8px 6px; - white-space: pre-wrap; + white-space: nowrap; + width: 200px; + text-overflow: ellipsis; + overflow: hidden; +} + +.config-options-current-value.violet { + color: {$violet}; } -.config-options-current-value span { - color: #777; +.config-options-effective-value, +.config-option-table .config-options-effective-value th { + background: {$gentle.highlight}; } diff --git a/webroot/rsrc/css/application/config/config-template.css b/webroot/rsrc/css/application/config/config-template.css index 4621487a41..13ce56488a 100644 --- a/webroot/rsrc/css/application/config/config-template.css +++ b/webroot/rsrc/css/application/config/config-template.css @@ -6,7 +6,32 @@ body { background: #f9f9f9; margin: 0; padding: 0; - font: 13px/1.231 'Helvetica Neue', Arial, sans-serif; + font: 13px/1.231 'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', + 'Helvetica Neue', Helvetica, Arial, sans-serif; text-align: left; -webkit-text-size-adjust: none; } + +body.in-flight { + background: #41506e; + color: #e0e0e0; +} + +.in-flight-error-detail { + max-width: 760px; + margin: 72px auto; + background: rgba(255, 255, 255, 0.25); + border-radius: 3px; + padding: 8px 16px; +} + +.in-flight-error-title { + padding: 12px 8px; + font-size: 24px; + font-weight: 500; + margin: 0; +} + +.in-flight-error-body { + padding: 4px 12px 12px; +} diff --git a/webroot/rsrc/css/application/config/setup-issue.css b/webroot/rsrc/css/application/config/setup-issue.css index 0ca42e7fb2..a80b02815c 100644 --- a/webroot/rsrc/css/application/config/setup-issue.css +++ b/webroot/rsrc/css/application/config/setup-issue.css @@ -1,56 +1,59 @@ /** * @provides setup-issue-css */ - - .setup-issue-background { - background-color: #edecef; - padding: 1em 0; + padding: 12px 0; +} + +.setup-issue-shell { + max-width: 880px; + margin: 16px auto; } .setup-issue { - border: 1px solid #35393d; - margin: 15px auto; - max-width: 760px; - background: #ffffff; - box-shadow: 1px 2px 2px rgba(0, 0, 0, 0.25); + background: #fff; + border: 1px solid #e4e5e6; + padding: 0; + border-radius: 5px; } .setup-issue p { - margin: 1em 0; + margin: 12px 0; } .setup-issue table { - width: 90%; - margin: auto; + width: 100%; border-collapse: collapse; - border: 1px solid #dfdfdf; + border: 1px solid #e2e2e2; } .setup-issue table th { text-align: right; width: 30%; - background: #efefef; - border: 1px solid #dfdfdf; + background: #F8F9FC; + border: 1px solid #e2e2e2; padding: 8px; } .setup-issue table td { - border: 1px solid #dfdfdf; + border: 1px solid #e2e2e2; padding: 8px; + word-break: break-word; } .setup-issue pre { - width: 95%; - margin: auto; - border: 1px solid #dfdfdf; - padding: 10px 2%; - background: #efefef; + width: auto; + border: 1px solid #e2e2e2; + padding: 12px; + background: #F8F9FC; overflow-x: auto; + border-radius: 3px; } .setup-issue tt { - color: #666666; + color: black; + background: #EBECEE; + padding: 2px 4px; } .setup-issue em { @@ -58,36 +61,69 @@ } .setup-issue-instructions { - font-size: 15px; - padding: 20px; - line-height: 1.4em; - background: #efefef; - border-bottom: 1px solid #bfbfbf; + font-size: 13px; + padding: 16px; + line-height: 20px; + background: rgba(71,87,120,0.08); + border-radius: 3px; } .setup-fatal .setup-issue-instructions { - background: #ffdfdf; + color: #af1404; + background: #f4dddb; } .setup-issue-name { - padding: 15px; - background: #35393d; - color: #ffffff; font-size: 15px; font-weight: bold; + color: #6B748C; + border-bottom: 1px solid #e2e2e2; + overflow: hidden; + padding: 16px; + line-height: 24px; +} + +.setup-issue-body { + padding: 16px; +} + +.setup-issue-status { + margin: 0 0 16px 0; + padding: 12px; + background: #FDF5D4; + color: #ab8206; + border-radius: 3px; +} + +.setup-issue-actions { + padding: 12px; + background-color: #f5f5f5; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + overflow: hidden; + text-align: right; +} + +.setup-issue-actions .button { + margin-left: 8px; } .setup-issue-next { - padding: 15px; - background: #35393d; + padding: 12px; + border: 1px solid #BFCFDA; + background: #daeaf3; text-align: center; - font-size: 16px; - color: #ffffff; + margin: 12px 0; + color: #2980b9; + border-radius: 3px; } .setup-issue-config { - margin: 15px 0; - padding: 0 20px; + padding: 12px 0; +} + +.setup-issue-config + .setup-issue-config { + padding-top: 0; } .setup-issue ul { @@ -95,3 +131,19 @@ margin: 1em auto; list-style: circle; } + +.setup-issue-debug { + margin-top: 8px; + padding: 4px; + text-align: right; + color: #74777D; +} + +.phui-two-column-view .setup-issue-background { + padding: 0; +} + +.phui-two-column-view .setup-issue-shell { + width: auto; + margin: 0; +} diff --git a/webroot/rsrc/css/application/config/unhandled-exception.css b/webroot/rsrc/css/application/config/unhandled-exception.css new file mode 100644 index 0000000000..cd8ad313dc --- /dev/null +++ b/webroot/rsrc/css/application/config/unhandled-exception.css @@ -0,0 +1,53 @@ +/** + * @provides unhandled-exception-css + */ + +.unhandled-exception-detail { + max-width: 760px; + margin: 24px auto; + background: #fff; + border: 1px solid #c0392b; + border-radius: 3px; + padding: 8px; +} + +.unhandled-exception-detail .unhandled-exception-title { + color: #c0392b; + padding: 4px 8px 12px; + border-bottom: 1px solid #f4dddb; + font-size: 16px; + font-weight: 500; + margin: 0; +} + +.unhandled-exception-detail .unhandled-exception-body { + padding: 16px 12px; +} + +.unhandled-exception-with-stack { + max-width: 95%; +} + +.unhandled-exception-stack { + background: #fcfcfc; + overflow-x: auto; + overflow-y: hidden; +} + +.unhandled-exception-stack table { + border-spacing: 0; + border-collapse: collapse; + width: 100%; + border: 1px solid #d7d7d7; +} + +.unhandled-exception-stack th { + background: #e7e7e7; + border-bottom: 1px solid #d7d7d7; + padding: 8px; +} + +.unhandled-exception-stack td { + padding: 4px 8px; + white-space: nowrap; +} diff --git a/webroot/rsrc/css/application/conpherence/color.css b/webroot/rsrc/css/application/conpherence/color.css new file mode 100644 index 0000000000..5350afebec --- /dev/null +++ b/webroot/rsrc/css/application/conpherence/color.css @@ -0,0 +1,48 @@ +/** + * @provides conpherence-color-css + */ + +.conpherence-theme-blue .conpherence-menu-pane { + background-color: {$lightblue}; +} + +.conpherence-theme-blue .phui-basic-nav .phabricator-side-menu + .phui-list-item-selected { + border-left-color: {$blue}; +} + +.conpherence-theme-indigo .conpherence-menu-pane { + background-color: {$lightindigo}; +} + +.conpherence-theme-indigo .phui-basic-nav .phabricator-side-menu + .phui-list-item-selected { + border-left-color: {$indigo}; +} + +.conpherence-theme-peach .conpherence-menu-pane { + background-color: {$lightred}; +} + +.conpherence-theme-peach .phui-basic-nav .phabricator-side-menu + .phui-list-item-selected { + border-left-color: rgba(0,0,0,.25); +} + +.conpherence-theme-green .conpherence-menu-pane { + background-color: {$lightgreen}; +} + +.conpherence-theme-green .phui-basic-nav .phabricator-side-menu + .phui-list-item-selected { + border-left-color: {$green}; +} + +.conpherence-theme-pink .conpherence-menu-pane { + background-color: {$lightpink}; +} + +.conpherence-theme-pink .phui-basic-nav .phabricator-side-menu + .phui-list-item-selected { + border-left-color: {$pink}; +} diff --git a/webroot/rsrc/css/application/conpherence/durable-column.css b/webroot/rsrc/css/application/conpherence/durable-column.css new file mode 100644 index 0000000000..41645717f3 --- /dev/null +++ b/webroot/rsrc/css/application/conpherence/durable-column.css @@ -0,0 +1,316 @@ +/** + * @provides conpherence-durable-column-view + */ + +.global-upload-mask { + pointer-events: none; +} + +.conpherence-durable-column { + position: fixed; + bottom: 0; + right: 16px; + width: 400px; + height: 360px; + background: {$page.content}; + border-top-right-radius: 3px; + border-top-left-radius: 3px; + box-shadow: 0px 1px 8px rgba(55,55,55, .3); +} + +.device .conpherence-durable-column, +.printable .conpherence-durable-column, +!print .conpherence-durable-column { + display: none; +} + +.conpherence-durable-column .conpherence-transaction-image { + float: left; + border-radius: 3px; + height: 24px; + width: 24px; + background-size: 24px; + position: absolute; + top: 5px; +} + +.device-desktop .conpherence-durable-column.loading .loading-mask { + display: block; +} + +.conpherence-durable-column-header .conpherence-settings-dropdown { + z-index: 1; +} + +.conpherence-durable-column-header .phabricator-application-menu + .phui-list-item-name { + display: none; +} + +.conpherence-durable-column-header .aphlict-connection-status { + width: 6px; + float: left; + height: 18px; + margin-left: 10px; + margin-top: 8px; +} + +.conpherence-durable-column-header .aphlict-connection-status + .connection-status-text { + display: none; +} + +.conpherence-durable-column-header .aphlict-connection-status + .phui-icon-view { + font-size: 10px; +} + +.device-desktop .conpherence-durable-column-header .phabricator-application-menu + .phui-list-item-view { + margin: 0; + width: 28px; + height: 34px; + min-width: 28px; +} + +.device-desktop .conpherence-durable-column-header .phabricator-application-menu + .phui-list-item-href { + background: transparent; + border: none; + padding: 0; +} + +.conpherence-durable-column-header { + border-top-right-radius: 3px; + border-top-left-radius: 3px; + background-color: #525867; +} + +.conpherence-durable-column-header:hover { + cursor: pointer; + background-color: #5f6572; +} + +.conpherence-durable-column-header .phabricator-application-menu { + margin-right: 8px; +} + +.conpherence-durable-column-header + .phabricator-main-menu-dropdown.phui-list-sidenav { + top: 30px; +} + +.conpherence-durable-column-header-text { + float: left; + padding: 8px 0 8px 10px; + color: #fff; + width: 260px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + text-shadow: 1px 1px 0 rgba(0,0,0,.6); +} + +.conpherence-durable-column-header .phabricator-application-menu + .phui-list-item-icon.phui-font-fa { + font-size: 15px; + margin: 0; + height: 15px; + width: 15px; + padding: 10px 8px 10px 8px; +} + +.conpherence-durable-column-icon-bar { + width: 36px; + background-color: {$lightgreybackground}; + border-right: 1px solid {$thinblueborder}; + position: absolute; + top: 0; + left: 0; + bottom: 0; +} + +.conpherence-durable-column-icon-bar .conpherence-durable-column-thread-icon { + height: 28px; + width: 28px; + padding: 4px; + display: block; +} + +.conpherence-durable-column-icon-bar +.conpherence-durable-column-thread-icon.selected { + background-color: rgba({$alphablue},.1); +} + +.conpherence-durable-column-icon-bar +.conpherence-durable-column-thread-icon span { + display: block; + width: 28px; + height: 28px; + border-radius: 3px; + background-size: 28px 28px; +} + +.conpherence-durable-column-body { + position: absolute; + top: 34px; + bottom: 0; + right: 0; + left: 0; +} + +.conpherence-durable-column-main { + position: absolute; + top: 0; + bottom: 36px; + left: 34px; + right: 0; + overflow-x: hidden; +} + +.conpherence-durable-column .column-no-rooms { + padding: 12px 8px; +} + +.conpherence-durable-column .column-no-rooms-text { + color: {$greytext}; + font-style: italic; + margin-bottom: 16px; +} + +.conpherence-durable-column-transactions { + padding: 8px 12px 0; +} + +.conpherence-durable-column-transactions .conpherence-transaction-view { + background: none; + margin: 0; + padding: 4px 0; + min-height: 0; +} + +.conpherence-durable-column-transactions .conpherence-transaction-view + .conpherence-message { + word-wrap: break-word; +} + +.conpherence-durable-column-transactions .conpherence-transaction-view + .conpherence-transaction-detail { + border: 0; + margin: 0 0 0 32px; +} + +.conpherence-durable-column-transactions .conpherence-transaction-view + .conpherence-transaction-detail .conpherence-transaction-header { + background: none; + padding: 0 0 2px 0; +} + +.conpherence-durable-column-transactions + .conpherence-transaction-view.date-marker { + margin: 12px 0 0; +} + +.conpherence-durable-column-transactions + .conpherence-transaction-view.date-marker .date { + left: 0; + font-size: {$normalfontsize}; + top: -10px; + padding: 0 6px 0 0; +} + +.conpherence-durable-column-transactions +.conpherence-transaction-detail +.conpherence-transaction-content +.phui-pinboard-item-view { + width: 273px; +} + +.conpherence-durable-column-transactions +.conpherence-transaction-detail +.conpherence-transaction-content +.phui-pinboard-item-view +.phui-pinboard-item-image-link +img { + width: 265px; + height: 199px; +} + +.conpherence-durable-column-transactions .conpherence-transaction-detail + .conpherence-transaction-content { + padding: 0 0 8px 0; +} + +.conpherence-durable-column-textarea { + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 36px; + margin: 0; + border-width: 1px 0 0 0; + border-style: solid; + border-top-color: {$thinblueborder}; + padding: 8px; + width: 100%; + resize: none; +} + +.conpherence-durable-column-textarea:focus { + outline: 0; + border-top-color: {$lightblueborder}; + box-shadow: none; +} + + +/* Minimized Column */ + +.minimize-column .conpherence-durable-column { + height: 32px; + width: 240px; + box-shadow: none; +} + +.minimize-column .conpherence-durable-column .conpherence-durable-column-body { + display: none; +} + +.minimize-column .conpherence-durable-column + .conpherence-durable-column-header { + background-color: rgba({$alphablue},.15); +} + +.minimize-column .conpherence-durable-column + .conpherence-durable-column-header:hover { + background-color: rgba({$alphablue},.2); +} + +.minimize-column .conpherence-durable-column + .conpherence-durable-column-header-text { + width: 100px; + color: {$darkbluetext}; + text-shadow: none; +} + +.minimize-column .conpherence-durable-column + .conpherence-durable-column-header .phabricator-application-menu + .phui-list-item-icon.phui-font-fa { + color: {$bluetext}; +} + +.minimize-column .conpherence-durable-column + .conpherence-durable-column-header .phabricator-application-menu + .phui-list-item-view:hover .phui-list-item-icon.phui-font-fa { + color: {$darkbluetext}; +} + +.minimize-column .conpherence-durable-column + .conpherence-durable-column-header .phabricator-application-menu + .phui-list-item-icon.phui-font-fa:before { + content: "\f151"; +} + +.minimize-column .conpherence-durable-column .phabricator-application-menu + .fa-gear { + display: none; +} diff --git a/webroot/rsrc/css/application/conpherence/header-pane.css b/webroot/rsrc/css/application/conpherence/header-pane.css new file mode 100644 index 0000000000..3f5965def5 --- /dev/null +++ b/webroot/rsrc/css/application/conpherence/header-pane.css @@ -0,0 +1,130 @@ +/** + * @provides conpherence-header-pane-css + */ + +.conpherence-header-pane .phui-header-shell { + padding: 8px 16px 10px; + min-height: 38px; +} + +.conpherence-header-pane .phui-header-header { + font-size: 16px; + color: {$blacktext}; + display: block; +} + +.conpherence-header-pane .phui-header-subheader { + padding: 0; + margin: 0; +} + +.conpherence-header-pane .conpherence-header-topic .phui-tag-core { + color: {$sh-indigotext}; + padding: 0 4px; + font-size: 12px; + margin: 0 8px 0 0; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + font-style: italic; +} + +.device-phone .conpherence-header-pane .conpherence-header-topic { + display: none; +} + +.conpherence-header-pane .phui-header-col1 { + width: 46px; + height: 35px; +} + +.conpherence-header-pane .phui-header-image { + height: 35px; + width: 35px; + background-size: 35px; + position: absolute; + top: 4px; + left: 0; +} + +.conpherence-header-pane .policy-header-callout { + background: transparent; + font-size: 12px; + margin: 0 8px 0 0; + padding: 3px 0; + font-style: normal; +} + +.conpherence-header-pane .phui-header-subheader .policy-link { + color: {$lightbluetext}; +} + +.conpherence-header-pane .phui-header-subheader .policy-header-callout + .phui-icon-view { + font-size: 12px; + color: {$lightbluetext}; +} + +.conpherence-header-pane .phui-header-subheader .policy-link:hover { + color: {$darkbluetext}; +} + +.conpherence-header-pane .phui-header-image-href { + position: inherit; +} + +.conpherence-header-pane .phui-header-col2 { + height: 40px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 60%; + max-width: 0; +} + +.conpherence-header-pane .phui-header-action-list .phui-header-action-item + .phui-icon-view { + height: 18px; + width: 24px; + font-size: 14px; + line-height: 23px; + display: block; +} + +.device .hide-on-device { + display: none; +} + +.device-phone .conpherence-header-pane .phui-header-col3 { + vertical-align: middle; +} + +.conpherence-participant-toggle.phui-icon-circle { + text-decoration: none; + border-color: {$sky}; + cursor: pointer; +} + +.conpherence-participant-toggle.phui-icon-circle .phui-icon-view { + color: {$sky}; +} + +.show-searchbar .conpherence-search-toggle.phui-icon-circle { + text-decoration: none; + border-color: {$green}; + cursor: pointer; +} + +.show-searchbar .conpherence-search-toggle.phui-icon-circle .phui-icon-view { + color: {$green}; +} + +.hide-widgets .conpherence-participant-toggle.phui-icon-circle { + text-decoration: none; + border-color: {$lightblueborder}; + cursor: pointer; +} + +.hide-widgets .conpherence-participant-toggle.phui-icon-circle .phui-icon-view { + color: {$lightblueborder}; +} diff --git a/webroot/rsrc/css/application/conpherence/menu.css b/webroot/rsrc/css/application/conpherence/menu.css index 74b46d668f..feb17156d7 100644 --- a/webroot/rsrc/css/application/conpherence/menu.css +++ b/webroot/rsrc/css/application/conpherence/menu.css @@ -8,27 +8,7 @@ left: 0; right: 0; top: 44px; -} - -.conpherence-layout .conpherence-no-threads { - text-align: center; - position: fixed; - left: 280px; - right: 241px; - top: 76px; - bottom: 0px; - min-width: 300px; - width: auto; -} - -.device .conpherence-layout .conpherence-no-threads { - left: 0; - right: 0; - width: 100%; -} - -.conpherence-layout .conpherence-no-threads .text { - margin: 0px 0px 16px 0px; + background: {$page.content}; } .conpherence-menu-pane { @@ -38,14 +18,60 @@ overflow-y: auto; top: 0; bottom: 0; + background-color: {$page.sidenav}; +} + +.conpherence-menu-pane .phui-basic-nav .phabricator-side-menu { + background-color: transparent; +} + +.conpherence-menu-pane.phabricator-side-menu .room-list-href { + padding: 10px 0 9px 8px; + display: inline-block; + text-transform: uppercase; + color: {$darkgreytext}; + font-weight: bold; + font-size: {$smallerfontsize}; + float: left; +} + +.conpherence-menu-pane.phabricator-side-menu .room-list-icons { + display: inline-block; + float: right; + padding: 8px 0 5px; +} + +.conpherence-menu-pane .conpherence-room-list-header { + clear: both; + overflow: hidden; +} + +.conpherence-menu-pane .conpherence-room-list-header +.phui-icon-view { + font-weight: bold; + float: right; + text-transform: none; + padding: 4px; +} + +.conpherence-menu-pane .conpherence-room-list-header +.phui-icon-view:hover { + color: {$sky}; } -.device-desktop .conpherence-layout .conpherence-menu-pane, -.device-desktop .conpherence-layout .phabricator-nav-column-background { - width: 280px; + +.conpherence-menu-pane .conpherence-message-list-header { + margin-top: 12px; +} + +.device-desktop .conpherence-layout .conpherence-menu-pane { + width: 232px; + padding-right: 8px; } + .device .conpherence-menu-pane { top: 41px; } + .device .conpherence-role-list .conpherence-menu-pane { top: 0px; } @@ -54,22 +80,12 @@ -webkit-overflow-scrolling: touch; } -.conpherence-layout .phabricator-nav-column-background { - display: block; - width: 100%; -} - -.device .phabricator-nav-column-background { - top: 44px; -} - -.device .conpherence-role-thread .conpherence-menu-pane, -.device .conpherence-role-thread .phabricator-nav-column-background { +.device .conpherence-role-thread .conpherence-menu-pane { display: none; } .device-desktop .conpherence-content-pane { - margin-left: 280px; + margin-left: 240px; } .conpherence-content-pane { @@ -85,20 +101,15 @@ .conpherence-menu .conpherence-menu-item-view { display: block; - height: 55px; - width: 100%; overflow: hidden; position: relative; text-decoration: none; - border-top: solid 1px #3B3D3E; - border-bottom: solid 1px #1C1F21; - border-right: 0; - border-left: 2px solid transparent; + border-left: 4px solid transparent; + padding: 4px; } -.conpherence-menu .conpherence-selected { - background: rgba(0, 0, 0, .6); - border-left: 2px solid #66CCFF; +.conpherence-menu .phui-list-item-type-link .phui-list-item-href { + padding: 8px 0 8px 8px; } .conpherence-menu .loading { @@ -106,76 +117,76 @@ } .device-desktop .conpherence-menu .conpherence-menu-item-view:hover { - background-image: url('http://github.com/rsrc/image/texture/dark-menu-hover.png'); + background-color: rgba({$alphablack},0.05); } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-image { - top: 6px; - left: 6px; - display: block; - position: absolute; - width: 35px; - height: 35px; - background-size: 35px; - border: 4px solid rgb(29, 32, 34); + width: 26px; + height: 26px; + background-size: 26px; border-radius: 3px; + float: left; + margin-left: 4px; } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-title { display: block; - margin-top: 12px; - margin-left: 58px; + padding: 4px 0 4px 8px; + float: left; text-align: left; font-weight: bold; - font-size: 13px; - color: #ffffff; - text-shadow: 0px 1px 1px #000000; + font-size: {$normalfontsize}; + color: {$darkbluetext}; overflow: hidden; - width: 140px; + width: 165px; text-overflow: ellipsis; } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-subtitle { - display: block; - color: #a1a5a9; - font-size: 11px; - margin-top: 2px; - margin-left: 58px; - font-style: italic; + display: none; } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-unread-count { position: absolute; - left: 35px; - top: 3px; - background: {$red}; - border-radius: 10px; - color: #FFF; + right: 4px; + top: 10px; + background: {$blue}; + border-radius: 2px; + color: #fff; font-weight: bold; - padding: 1px 5px 2px; - border: 1px solid #333; - font-size: 11px; + padding: 0 5px 1px; + font-size: {$smallestfontsize}; } -.conpherence-menu .hide-unread-count .conpherence-menu-item-unread-count, -.conpherence-menu .conpherence-selected .conpherence-menu-item-unread-count { +.conpherence-menu .hide-unread-count .phui-list-item-count { display: none; } +.phui-basic-nav .phabricator-side-menu .conpherence-menu + .phui-list-item-icon.phuihead-small { + display: block; + float: left; + height: 20px; + width: 20px; + margin: 0 7px 0 0; +} + .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-date { position: absolute; top: 15px; right: 16px; - color: #a1a5a9; - font-size: 11px; + color: {$bluetext}; + font-size: {$smallestfontsize}; +} + +.conpherence-menu-item-header { + font-weight: bold; + text-transform: uppercase; + color: {$bluetext}; } .no-conpherences-menu-item { - color: #a1a5a9; - border-top: solid 1px #3B3D3E; - padding: 20px 0; - margin: 0px auto; - width: 280px; - text-align: center; + color: {$bluetext}; + padding: 4px 12px; } diff --git a/webroot/rsrc/css/application/conpherence/message-pane.css b/webroot/rsrc/css/application/conpherence/message-pane.css index 757d315f7c..0dc33789f3 100644 --- a/webroot/rsrc/css/application/conpherence/message-pane.css +++ b/webroot/rsrc/css/application/conpherence/message-pane.css @@ -7,9 +7,9 @@ .loading .messages-loading-icon, .conpherence-layout .conpherence-no-threads { position: fixed; - left: 280px; - right: 241px; - top: 76px; + left: 240px; + right: 240px; + top: 106px; bottom: 0px; min-width: 300px; width: auto; @@ -20,205 +20,451 @@ .device .loading .messages-loading-icon, .device .conpherence-layout .conpherence-no-threads { left: 0; +} + +.conpherence-layout .conpherence-content-pane .conpherence-no-threads { + top: 44px; right: 0; - width: 100%; + background: {$page.content}; + z-index: 26; } -.conpherence-layout .conpherence-no-threads { - text-align: center; +.conpherence-layout .phui-big-info-view { + margin: 16px; } -.conpherence-layout .conpherence-no-threads .text { - margin: 16px 0px 16px 0px; +.conpherence-layout .conpherence-no-threads .phui-box-border { + border: none; + margin: 0; } -.conpherence-show-older-messages { +.conpherence-show-more-messages { display: block; background: #e0e3ec; margin: 10px; text-align: center; padding: 10px; - color: #18559D; + color: {$bluetext}; } -.conpherence-show-older-messages-loading { +.conpherence-show-more-messages-loading { font-style: italic; } .conpherence-message-pane .conpherence-messages { position: fixed; - left: 280px; - right: 241px; - top: 76px; - bottom: 190px; + left: 240px; + right: 240px; + top: 106px; + bottom: 142px; + overflow-x: hidden; overflow-y: auto; - box-shadow: inset 1px 4px 5px rgba(0,0,0,0.1); -webkit-overflow-scrolling: touch; } +.conpherence-messages.jx-scrollbar-frame { + overflow-y: hidden; +} + +.conpherence-messages .jx-scrollbar-content > .conpherence-edited:first-child, +.conpherence-messages > .conpherence-edited:first-child { + padding-top: 20px; +} + +.conpherence-messages .conpherence-edited:last-child { + padding-bottom: 20px; +} + +.conpherence-message-pane .conpherence-edited + .date-marker { + margin-top: 24px; +} + .device .conpherence-message-pane .conpherence-messages { + left: 0; + bottom: 44px; + box-shadow: none; +} + +.device-phone .conpherence-message-pane .conpherence-messages { left: 0; right: 0; - bottom: 3em; + bottom: 44px; width: 100%; box-shadow: none; } -.conpherence-message-pane .messages-loading-mask { - opacity: .6; - background: #fff; +.conpherence-message-pane .phui-form-view { + border-width: 0; + height: 130px; + padding: 0 20px 12px; + position: fixed; + bottom: 0; + left: 240px; + right: 241px; +} + +.conpherence-room-status { + font-size: {$smallerfontsize}; + color: {$lightgreytext}; + font-style: italic; + position: absolute; + bottom: 2px; + left: 24px; +} + +.device .conpherence-room-status { display: none; } -.loading .messages-loading-mask { - display: block; +.conpherence-no-pontificate .conpherence-message-pane .phui-form-view { + border-top: 1px solid {$thinblueborder}; + text-align: center; } -.conpherence-message-pane .phabricator-form-view { - border-width: 0; - background: none; - height: 190px; +.conpherence-no-pontificate .conpherence-message-pane + .aphront-form-control-submit button, +.conpherence-no-pontificate .conpherence-message-pane + .aphront-form-control-submit a.button { + margin: 4px 0 0 0; + float: none; +} + +.conpherence-no-pontificate .phui-form-view .aphront-form-instructions { + margin: 24px 0 16px; + width: 100%; padding: 0; - position: fixed; - bottom: 0; - left: 280px; - right: 241px; + color: {$bluetext}; + font-size: {$biggestfontsize}; +} + +.device .conpherence-message-pane .phui-form-view { + padding: 8px 8px; +} + +.conpherence-message-pane .aphront-form-control-submit button, +.conpherence-message-pane .aphront-form-control-submit a.button { + margin-top: 6px; +} + +.device .conpherence-message-pane .aphront-form-control-submit button, +.device .conpherence-message-pane .aphront-form-control-submit a.button { + margin-top: 13px; +} + +/** + * When entering "Fullscreen Mode" in the remarkup control, we need to drop + * all of the "position: fixed" on parent elements or Chrome doesn't put the + * textarea on top. + */ +.remarkup-fullscreen-mode .conpherence-message-pane, +.remarkup-fullscreen-mode .conpherence-message-pane .conpherence-messages, +.remarkup-fullscreen-mode .conpherence-message-pane .phui-form-view, +.remarkup-fullscreen-mode .conpherence-layout { + position: static; +} + +.conpherence-message-pane .remarkup-assist-bar { + border-bottom: none; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } .device .conpherence-message-pane .remarkup-assist-bar { - height: 0px; + position: absolute; + top: 9px; + left: 9px; + width: 24px; + background: {$bluebackground}; + border-radius: 3px; + border: none; +} + +.device .conpherence-message-pane .remarkup-assist-button, +.device .conpherence-message-pane .remarkup-assist-separator { + display: none; } -.device .conpherence-message-pane .phabricator-form-view { +.device .conpherence-message-pane + .remarkup-assist-button.remarkup-assist-upload { + display: block; +} + +.device .conpherence-message-pane .phui-form-view { + left: 0; + height: 34px; + width: auto; +} + +.device-phone .conpherence-message-pane .phui-form-view { left: 0; right: 0; - background-color: #d8dce2; - height: 3em; - width: 100%; + height: 34px; + width: auto; } -.conpherence-layout .conpherence-message-pane .phabricator-form-view +.conpherence-layout .conpherence-message-pane .phui-form-view div.aphront-form-input { margin: 0; width: 100%; } -.conpherence-message-pane .phabricator-transaction-view { - margin: 5px 15px; - background-size: 35px; +.conpherence-transaction-view { + padding: 2px 0px; + margin: 4px 20px; + background-size: 100%; min-height: auto; } -.device-phone .conpherence-message-pane .phabricator-transaction-view { - margin: 0 10px 0 0; +.device-phone .conpherence-transaction-view { + margin: 0 8px; +} + +.conpherence-transaction-image { + float: left; + border-radius: 3px; + height: 35px; + width: 35px; + background-size: 35px; + position: absolute; + top: 5px; +} + +.device-phone .conpherence-transaction-image { + height: 25px; + width: 25px; + background-size: 25px; +} + +.conpherence-transaction-view.conpherence-comment.anchor-target, +.conpherence-transaction-view.conpherence-edited.anchor-target { + background: {$lightyellow}; } -.conpherence-message-pane .phabricator-transaction-detail { +.cconpherence-transaction-view.conpherence-comment.anchor-target { + margin: 4px 8px 4px 8px; + padding: 2px 4px 2px 4px; +} + +.conpherence-transaction-view.conpherence-edited.anchor-target { + margin: 0px 8px 0px 8px; + padding: 0px 4px 0px 4px; +} + +.conpherence-transaction-view .conpherence-transaction-detail { border-width: 0; margin-left: 45px; } -.conpherence-message-pane .date-marker { - border-top: 1px solid #d7d7d7; - margin: 5px 15px; +.device-phone .conpherence-transaction-view .conpherence-transaction-detail { + margin-left: 32px; +} + +.conpherence-transaction-view.date-marker { + padding: 0; + margin: 20px 20px 4px; min-height: auto; } -.conpherence-message-pane .date-marker .date { - position: relative; - top: -8px; + +.device-phone .conpherence-transaction-view.date-marker { + margin: 12px 0 4px; +} + +.device-tablet .conpherence-transaction-view.date-marker { + padding-left: 37px; +} + +.conpherence-transaction-view.date-marker .date { left: 40px; - background-color: #FFF; - color: #bfbfbf; - font-size: 11px; - padding: 0px 5px; + font-size: {$normalfontsize}; + padding: 0px 4px; } -.device-phone .conpherence-message-pane .phabricator-transaction-detail { - min-height: auto; + +.device .conpherence-transaction-view.date-marker .date { + left: 4px; } -.conpherence-message-pane .conpherence-edited { - color: #888; - margin: 0; +.device-phone .conpherence-transaction-view.conpherence-edited { + min-height: none; + color: {$lightgreytext}; + margin: 0 8px; } -.device-phone .conpherence-message-pane .conpherence-edited { - color: #888; - margin: 0 10px; +.conpherence-transaction-view.conpherence-edited + .conpherence-transaction-content { + color: {$lightgreytext}; + font-size: {$biggerfontsize}; + font-style: italic; + margin: 0; + padding: 0; + float: left; + line-height: 20px; } -.conpherence-message-pane .conpherence-edited .phabricator-transaction-content { - padding: 0 0 5px 45px; - font-style: italic; +.conpherence-transaction-view.conpherence-edited { + padding: 0; + margin-top: 0; + margin-bottom: 0; + min-height: inherit; } -.device-phone .conpherence-message-pane .conpherence-edited .phabricator-transaction-content { - padding: 0 0 5px 35px; +.conpherence-transaction-view.conpherence-edited + .conpherence-comment { + margin-top: 16px; } -.conpherence-message-pane .phabricator-transaction-info, -.conpherence-message-pane .phabricator-content-source-view { - color: #b7b7b7; - line-height: 16px; +.conpherence-transaction-view.conpherence-edited + + .conpherence-transaction-view.date-marker { + margin-top: 24px; } -.conpherence-message-pane .phabricator-transaction-header, -.conpherence-message-pane .phabricator-transaction-info, -.conpherence-message-pane .phabricator-transaction-content { - background: none; - padding: 0; +.conpherence-transaction-view.conpherence-edited + .conpherence-transaction-header { + float: right; } -.conpherence-message-pane .phabricator-transaction-content { - padding: 2px 0 8px 0; +.conpherence-transaction-view.conpherence-edited + .conpherence-transaction-content a { + color: {$darkbluetext}; } -.conpherence-message-pane .aphront-form-control { - padding: 0; +.conpherence-transaction-view .conpherence-transaction-info { + margin: 0 8px; } -.conpherence-message-pane .aphront-form-control-submit { - margin-right: 8px; +.conpherence-transaction-view .conpherence-transaction-info, +.conpherence-transaction-view .transaction-date, +.conpherence-transaction-view .phabricator-content-source-view { + color: {$lightgreytext}; + line-height: 16px; + font-size: {$smallerfontsize}; } -.conpherence-message-pane .remarkup-assist-bar { - border-width: 1px 0 0; - border-color: #CCC; - border-bottom: transparent; + +.conpherence-transaction-view .conpherence-transaction-content { + padding: 2px 0 8px 0; +} + +body .conpherence-message-pane .aphront-form-control { + padding: 0; } .conpherence-message-pane .remarkup-assist-textarea { - height: 124px; - padding: 6px; - border-width: 0 0 1px 0; - border-color: #e7e7e7; + height: 88px; + padding: 8px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; - resize: none; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; } .device .conpherence-message-pane .remarkup-assist-textarea { - margin: 0.5em 0em 0em 2%; - padding: 6px 1%; - width: 98%; - height: 2em; + margin: 0; + padding: 7px 8px 6px 38px; + width: 100%; + height: 34px; resize: none; + border-color: {$greyborder}; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } -.conpherence-message-pane .remarkup-assist-textarea:focus { - outline: none; +.device .conpherence-message-pane .aphront-form-control-submit { + padding: 0; + position: absolute; + top: -2px; + right: 12px; } .device .conpherence-message-pane .aphront-form-control-textarea { float: left; - height: 2em; + height: 24px; + width: 100%; } -.device-tablet .conpherence-message-pane .aphront-form-control-textarea { - width: 76%; + +.conpherence-message .phabricator-remarkup .remarkup-code-block pre { + max-height: 200px; } -.device-phone .conpherence-message-pane .aphront-form-control-textarea { - width: 63%; + +.conpherence-transaction-collapsed .conpherence-transaction-image, +.conpherence-transaction-collapsed .conpherence-transaction-header { + display: none; } -.device .conpherence-message-pane .aphront-form-control-submit button { - margin: 0.6em 0 0 2%; +.conpherence-message-pane + .conpherence-transaction-collapsed.conpherence-transaction-view { + margin-top: 0; + margin-bottom: 0; +} + +/* this causes scrolling issues on iDevices */ +.device .conpherence-layout + .phabricator-standard-page-footer { + display: none; +} + +/***** Thread Loading *********************************************************/ + +.conpherence-layout .conpherence-loading-mask { + height: 0; + opacity: 0; + top: 0; + right: 0; + left: 240px; + bottom: 0; + transition: all 0.3s; + position: fixed; + background-color: {$page.content}; +} + +.conpherence-layout.loading .conpherence-loading-mask { + opacity: 1; + height: auto; +} + + +/***** Thread Search **********************************************************/ + +.conpherence-search-main { + opacity: 0; + transition: all 0.2s; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + height: 0; +} + +.show-searchbar .conpherence-search-main { + opacity: 1; + height: auto; +} + +.conpherence-search-form-view { + display: none; +} + +.show-searchbar .conpherence-search-form-view { + display: block; + height: 54px; + background: {$page.content}; + position: absolute; + top: 0; + left: 0; + right: 0; +} + +.conpherence-search-form-view input.conpherence-search-input { + padding-left: 8px; + width: calc(100% - 24px); + border-radius: 20px; + margin: 12px; +} + +.conpherence-search-results { + position: absolute; + background: {$page.content}; + top: 54px; + left: 0; + right: 0; + bottom: 0; + overflow-y: auto; } diff --git a/webroot/rsrc/css/application/conpherence/notification.css b/webroot/rsrc/css/application/conpherence/notification.css index 565504cbc2..21e73047a6 100644 --- a/webroot/rsrc/css/application/conpherence/notification.css +++ b/webroot/rsrc/css/application/conpherence/notification.css @@ -2,14 +2,13 @@ * @provides conpherence-notification-css */ -/* kill styles on phabricator-notification */ -.conpherence-notification { +.phabricator-notification.conpherence-notification { padding: 0; } .phabricator-notification .conpherence-menu-item-view { display: block; - height: 55px; + height: 48px; overflow: hidden; position: relative; text-decoration: none; @@ -20,61 +19,68 @@ .phabricator-notification .conpherence-menu-item-view .conpherence-menu-item-image { - top: 6px; - left: 6px; + top: 8px; + left: 8px; display: block; position: absolute; - width: 35px; - height: 35px; - background-size: 35px; - border: 4px solid #e7e7e7; + width: 32px; + height: 32px; + background-size: 100%; border-radius: 3px; } .phabricator-notification .conpherence-menu-item-view .conpherence-menu-item-title { display: block; - margin-top: 12px; - margin-left: 58px; + margin-top: 8px; + margin-left: 48px; text-align: left; font-weight: bold; - font-size: 13px; - color: #333; - overflow: hidden; - width: 220px; + font-size: {$normalfontsize}; + color: {$darkgreytext}; + width: 314px; text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } .phabricator-notification .conpherence-menu-item-view .conpherence-menu-item-subtitle { display: block; - color: #a1a5a9; - font-size: 11px; - margin-top: 2px; - margin-left: 58px; - font-style: italic; + color: {$lightgreytext}; + font-size: {$smallestfontsize}; + margin-left: 48px; + width: 290px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } .phabricator-notification .conpherence-menu-item-view .conpherence-menu-item-unread-count { position: absolute; - left: 35px; - top: 3px; - background: {$red}; - border-radius: 10px; - color: #FFF; + right: 8px; + top: 15px; + background: {$blue}; + border-radius: 2px; + color: #fff; font-weight: bold; - padding: 1px 5px 2px; - border: 1px solid #333; - font-size: 11px; + padding: 0 5px 1px; + font-size: {$smallestfontsize}; } -.phabricator-notification .conpherence-menu-item-view -.conpherence-menu-item-date { - position: absolute; - top: 15px; - right: 16px; - color: #a1a5a9; - font-size: 11px; +.phabricator-notification .no-room-notification { + color: {$lightgreytext}; + display: block; } +.phabricator-notification-header .persistent-option { + white-space: nowrap; + float: right; +} + +.phabricator-notification-header .persistent-option span { + margin-left: 4px; + font-weight: normal; + color: {$greytext}; +} diff --git a/webroot/rsrc/css/application/conpherence/participant-pane.css b/webroot/rsrc/css/application/conpherence/participant-pane.css new file mode 100644 index 0000000000..479bf95637 --- /dev/null +++ b/webroot/rsrc/css/application/conpherence/participant-pane.css @@ -0,0 +1,118 @@ +/** + * @provides conpherence-participant-pane-css + */ + +.conpherence-participant-pane { + position: fixed; + right: 0px; + top: 106px; + bottom: 0; + width: 240px; + border-width: 0 0 0 1px; + border-color: {$thinblueborder}; + border-style: solid; + overflow-y: auto; + -webkit-overflow-scrolling: touch; +} + +.device-phone .conpherence-participant-pane { + background-color: {$page.background}; +} + +.conpherence-participant-pane .aphront-form-input { + margin: 0; + width: 100%; +} + +.conpherence-participant-pane .aphront-form-inset { + border: 0; +} + +.conpherence-participant-pane .widgets-header.phui-header-shell { + padding: 8px 12px 6px; + border: none; +} + +.conpherence-participant-pane .widgets-header .phui-header-header { + font-size: {$biggerfontsize}; +} + +.conpherence-participant-pane .widgets-header .phui-icon-view.disabled { + color: {$lightgreytext}; +} + +.conpherence-participant-pane .widgets-body { + position: fixed; + overflow-y: auto; + bottom: 0; + top: 105px; + width: 240px; +} + +.conpherence-participant-pane .person-entry { + padding: 4px 8px 4px 12px; +} + +.conpherence-participant-pane .person-entry:hover { + background-color: {$lightgreybackground}; +} + +.conpherence-participant-pane .person-entry a { + float: left; + line-height: 22px; + color: {$bluetext}; + font-weight: bold; +} + +.conpherence-participant-pane .person-entry:hover a { + color: {$blacktext}; +} + +.conpherence-participant-pane .person-entry a img { + height: 24px; + width: 24px; + border-radius: 3px; +} + +.conpherence-participant-pane .person-entry .pic { + float: left; + width: 30px; +} + +.conpherence-participant-pane .person-entry .remove { + float: right; + width: 20px; + height: 20px; + font-size: 18px; +} + +.person-entry .remove:hover .phui-icon-view { + color: {$red}; +} + +.conpherence-participant-pane .person-entry .remove:hover { + text-decoration: none; +} + +.conpherence-participant-pane .person-entry .remove .close-icon { + color: #bfbfbf; +} + +.conpherence-participant-pane .person-entry .remove:hover .close-icon { + color: {$blacktext}; +} + +/****** Hide Widgets **********************************************************/ + +.hide-widgets .conpherence-participant-pane { + display: none; +} + +.hide-widgets .conpherence-message-pane, +.hide-widgets .loading .messages-loading-mask, +.hide-widgets .loading .messages-loading-icon, +.hide-widgets .conpherence-no-threads, +.hide-widgets .conpherence-message-pane .conpherence-messages, +.hide-widgets .conpherence-message-pane .phui-form-view { + right: 0; +} diff --git a/webroot/rsrc/css/application/conpherence/transaction.css b/webroot/rsrc/css/application/conpherence/transaction.css new file mode 100644 index 0000000000..42f39bac74 --- /dev/null +++ b/webroot/rsrc/css/application/conpherence/transaction.css @@ -0,0 +1,69 @@ +/** + * @provides conpherence-transaction-css + */ + +.conpherence-transaction-view { + position: relative; +} + +.conpherence-transaction-content { + overflow: auto; +} + +.conpherence-transaction-header .phui-link-person { + font-weight: bold; + font-size: {$biggerfontsize}; + color: {$blacktext}; +} + +.conpherence-transaction-view.date-marker { + border-top: 1px solid {$sh-violetborder}; +} + +.conpherence-transaction-view.date-marker .date { + position: relative; + top: -11px; + background-color: {$page.content}; + color: {$sh-violettext}; + font-weight: bold; +} + +/***** Thread Search **********************************************************/ + +.conpherence-fulltext-results { + padding: 8px 0; +} + +.conpherence-fulltext-results + .conpherence-fulltext-results { + border-top: 2px solid {$thinblueborder}; + margin-top: -8px; +} + +.conpherence-fulltext-result { + margin: 0 0 1px; + padding: 8px; +} + +.conpherence-fulltext-match { + background: {$lightyellow}; +} + +.conpherence-fulltext-results .epoch-link { + float: right; +} + +.conpherence-message-pane .conpherence-fulltext-results + .conpherence-transaction-view.conpherence-fulltext-result { + margin-left: 0; + margin-right: 0; +} + +.conpherence-message-pane .conpherence-search-room-results .phui-object-box { + border: none; + margin: 0; +} + +.conpherence-message-pane .conpherence-search-room-results + .phui-object-box .phui-header-shell { + display: none; +} diff --git a/webroot/rsrc/css/application/conpherence/update.css b/webroot/rsrc/css/application/conpherence/update.css deleted file mode 100644 index bcd26fb4b4..0000000000 --- a/webroot/rsrc/css/application/conpherence/update.css +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @provides conpherence-update-css - */ - -.phabricator-standard-page-body .aphront-dialog-view { - margin: 20px auto 0px auto; -} - -.aphront-dialog-view .conpherence-dialogue-drag-photo { - border: 1px dashed #bfbfbf; - padding: 10px 0px 10px 10px; -} - -.aphront-dialog-view .conpherence-dialogue-upload-photo { - background: #99ff99; - border-color: #669966; -} diff --git a/webroot/rsrc/css/application/conpherence/widget-pane.css b/webroot/rsrc/css/application/conpherence/widget-pane.css deleted file mode 100644 index 513e2eb85a..0000000000 --- a/webroot/rsrc/css/application/conpherence/widget-pane.css +++ /dev/null @@ -1,381 +0,0 @@ -/** - * @provides conpherence-widget-pane-css - */ - -.conpherence-widget-pane, -.loading .widgets-loading-mask { - position: fixed; - right: 0px; - top: 76px; - bottom: 0px; - width: 240px; - border-width: 0 0 0 1px; - border-color: #CCC; - border-style: solid; - overflow-y: auto; - -webkit-overflow-scrolling: touch; -} - -.device .conpherence-widget-pane, -.device .loading .widgets-loading-mask { - top: 44px; - width: 100%; -} - -.conpherence-widget-pane .widgets-loading-mask { - opacity: .6; - background: #fff; - display: none; -} - -.loading .widgets-loading-mask { - display: block; -} - -.conpherence-widget-pane .aphront-form-input { - margin: 0; - width: 100%; -} - -.conpherence-widget-pane .aphront-form-inset { - border: 0; -} - -.conpherence-widget-pane .widgets-header { - background: #F5F5F5; - border-bottom: 1px solid #ccc; -} - -.device .conpherence-widget-pane .widgets-header { - display: none; -} - -.conpherence-widget-pane .widgets-header .caret { - float: none; - height: 0px; - width: 0px; - margin-right: 0px; - border-top-color: #000; -} - -.device-desktop .conpherence-layout .device-widgets-selector { - display: none; -} - -.dropdown-menu-frame { - width: 200px !important; - margin-top: 4px; -} - -.conpherence-widget-pane .widgets-body { - position: fixed; - overflow-y: auto; - bottom: 0px; - width: 100%; - top: 76px; -} - -#widgets-settings { - padding: 3px 6px; -} - -.device-desktop .conpherence-widget-pane .widgets-body { - top: 108px; - width: 240px; -} - -/* files widget */ - -.conpherence-widget-pane #widgets-files .no-files { - width: 200px; - padding: 20px; - text-align: center; - color: #555; -} -.device .conpherence-widget-pane #widgets-files .no-files { - width: 60px; - margin: 0px auto 0px auto; -} -.conpherence-widget-pane #widgets-files .file-entry { - padding: 10px 0; - margin: 0 5px 0 10px; - border-bottom: 1px solid #e7e7e7; -} -.conpherence-widget-pane #widgets-files .file-icon { - width: 32px; - height: 32px; - float: left; -} -.conpherence-widget-pane #widgets-files .file-title { - display: block; - position: relative; - top: -4px; - left: 10px; - overflow-x: hidden; - width: 165px; - font-weight: bold; - text-overflow: ellipsis; -} -.conpherence-widget-pane #widgets-files .file-uploaded-by { - color: #a1a5a9; - position: relative; - top: 0px; - left: 10px; - width: 170px; - font-size: 11px; -} - -.device .conpherence-widget-pane #widgets-files .file-title, -.device .conpherence-widget-pane #widgets-files .file-uploaded-by { - width: 82%; -} -.device .conpherence-widget-pane #widgets-files .divider { - width: 80%; - margin: 8px 0px 0px 10%; -} - -/* calendar widget */ - -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view { - width: 240px; -} -.device-phone .conpherence-widget-pane #widgets-calendar -.aphront-multi-column-view { - display: none; -} -.device-tablet .conpherence-widget-pane #widgets-calendar -.aphront-multi-column-view { - width: 100%; -} -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view -.aphront-multi-column-column { - background: white; - border-right: 1px solid #bfbfbf; - text-align: center; -} -.device-phone .conpherence-widget-pane #widgets-calendar -.aphront-multi-column-view .aphront-multi-column-column { - border-right: 0; -} - -.device-phone .conpherence-widget-pane #widgets-calendar -.aphront-multi-column-fluid .aphront-multi-column-5-up -.aphront-multi-column-column-outer { - width: 20%; - margin-bottom: 0px; - float: left; - clear: none; -} - -.conpherence-widget-pane .no-events { - color: #999; -} - -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view -.aphront-multi-column-column-last { - border-right: 0; -} -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view -.aphront-multi-column-column .day-column, -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view -.aphront-multi-column-column .day-column-active { - color: #bfbfbf; - background-color: white; - font-weight: bold; - padding: 0px 0px 10px 0px; -} -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view -.aphront-multi-column-column .day-column-active { - color: black; -} -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view -.aphront-multi-column-column .present , -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view -.aphront-multi-column-column .sporadic , -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view -.aphront-multi-column-column .away { - height: 10px; - margin: 5px 0px 5px 0px; - width: 100%; -} -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view -.aphront-multi-column-column .present { - background-color: white; -} -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view -.aphront-multi-column-column .sporadic { - background-color: rgb(222, 226, 232); -} -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view -.aphront-multi-column-column .away { - background-color: rgb(102, 204, 255); -} -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view - .day-name { - padding: 5px 0px 0px 0px; - font-size: 12px; -} -.conpherence-widget-pane #widgets-calendar .aphront-multi-column-view - .day-number { - font-size: 16px; - padding: 0 0 5px 0; -} - -.conpherence-widget-pane #widgets-calendar .day-header { - overflow: hidden; - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - border-top: 1px solid #e7e7e7; - border-bottom: 1px solid #d7d7d7; - padding: 5px 10px 5px 10px; -} - -.conpherence-widget-pane #widgets-calendar .day-header.today { - background-image: linear-gradient(to bottom, #3b86c4, #2b628f); - background-image: -webkit-linear-gradient(top, #3b86c4, #2b628f); - border-top: none; - border-bottom: none; -} - -.conpherence-widget-pane #widgets-calendar .day-header.today .day-name, -.conpherence-widget-pane #widgets-calendar .day-header.today .day-date { - color: #fff; -} - -.conpherence-widget-pane #widgets-calendar .day-header .day-name { - float: left; - color: #555759; - font-weight: bold; - text-transform: uppercase; - font-size: 11px; -} - -.conpherence-widget-pane #widgets-calendar .day-header .day-date { - float: right; - color: #555759; - font-size: 11px; -} - -.conpherence-widget-pane #widgets-calendar .top-border { - border-top: 1px solid #E7E7E7; -} - -.conpherence-widget-pane #widgets-calendar .user-status { - padding: 10px 0px 10px 0px; - margin: 0px 0px 0px 10px; -} - -.conpherence-widget-pane #widgets-calendar .user-status .icon { - border-radius: 8px; - height: 14px; - width: 14px; - margin-top: 7px; - float: left; -} - -.conpherence-widget-pane #widgets-calendar .sporadic .icon { - background-color: rgb(222, 226, 232); -} - -.conpherence-widget-pane #widgets-calendar .away .icon { - background-color: rgb(102, 204, 255); -} - -.conpherence-widget-pane #widgets-calendar .user-status .description { - width: 195px; - text-overflow: ellipsis; - margin: 0 0 0px 20px; -} - -.conpherence-widget-pane #widgets-calendar .user-status .participant { - font-size: 11px; - color: #888; - padding-top: 2px; -} - -.device .conpherence-widget-pane #widgets-calendar .user-status .description, -.device .conpherence-widget-pane #widgets-calendar .user-status .participant { - /* we keep these short so no need to change the width */ -} - -.conpherence-widget-pane .widget-icon { - display: block; - height: 14px; - width: 14px; -} - -.conpherence-widget-pane .phabricator-remarkup-embed-layout-link { - padding-bottom: 1px; -} - -/* people widget */ -.conpherence-widget-pane .people-widget-header .add-people-widget { - padding: 10px 0 5px 0; - overflow: hidden; -} - -.conpherence-widget-pane .people-widget-header .add-people-widget -.aphront-form-control-tokenizer { - float: left; - width: 150px; - padding: 0px 0px 0px 10px -} - -.device .conpherence-widget-pane .people-widget-header .add-people-widget -.aphront-form-control-tokenizer { - width: 70%; -} - -.conpherence-widget-pane .people-widget-header .add-people-widget -.people-add-button { - float: right; - margin: 2px 8px 0px 0px; - padding: 3px 16px 4px 16px; -} - -.conpherence-widget-pane .person-entry { - padding: 8px 0 0 8px; -} - -.conpherence-widget-pane .person-entry a { - float: left; - font-weight: bold; - line-height: 20px; -} - -.conpherence-widget-pane .person-entry a img { - height: 35px; - width: 35px; -} - -.conpherence-widget-pane .person-entry .pic { - float: left; - margin: 0 8px 0 0; - width: 35px; - padding: 0; -} - -.conpherence-widget-pane .person-entry .remove { - float: right; - width: 20px; - font-size: 18px; - padding: 5px 0 8px 0; -} - -.conpherence-widget-pane .person-entry .remove:hover { - text-decoration: none; -} - -.conpherence-widget-pane .person-entry .remove .close-icon { - color: #bfbfbf; -} - -.conpherence-widget-pane .person-entry .remove:hover .close-icon { - color: #000; -} - -/* settings widget */ -.conpherence-widget-pane .title-update, -.conpherence-widget-pane .notifications-update { - margin: 3px 0px 0px 4px; -} diff --git a/webroot/rsrc/css/application/contentsource/content-source-view.css b/webroot/rsrc/css/application/contentsource/content-source-view.css index 09ee5aac3d..68315c41f7 100644 --- a/webroot/rsrc/css/application/contentsource/content-source-view.css +++ b/webroot/rsrc/css/application/contentsource/content-source-view.css @@ -3,5 +3,5 @@ */ .phabricator-content-source-view { - color: #888888; + color: {$lightgreytext}; } diff --git a/webroot/rsrc/css/application/countdown/timer.css b/webroot/rsrc/css/application/countdown/timer.css index 82e09ce5c7..832379aec7 100644 --- a/webroot/rsrc/css/application/countdown/timer.css +++ b/webroot/rsrc/css/application/countdown/timer.css @@ -3,35 +3,43 @@ */ .phabricator-timer { - width: 90%; - margin: 12px auto; - border: 1px solid #666666; - border-radius: 4px; - background: #ffffff; - box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.25); + margin: 16px 16px 0 16px; } -.phabricator-remarkup .phabricator-timer { - width: 300px; +.device .phabricator-timer { + margin-left: 12px; + margin-right: 12px; } -.phabricator-timer-header { - font-size: 14px; - font-weight: bold; - padding: 4px 8px; - background: #f0f0f0; - border-radius: 4px 4px 0 0; - border-bottom: 1px solid #d7d7d7; +.phabricator-remarkup .phabricator-timer-view { + max-width: 460px; + margin: 0 0 12px 0; +} + +body .phabricator-timer .countdown-description.phabricator-remarkup { + border-bottom: 1px solid {$thinblueborder}; + padding: 0 0 16px; + margin: 0; +} + +.phabricator-timer .countdown-description.phabricator-remarkup + .phabricator-remarkup { + padding: 0; +} + +.device-phone .phabricator-remarkup .phabricator-timer { + width: auto; } .phabricator-timer-table { width: 100%; - margin: 8px 0; + margin: 8px 0 0 0; } .phabricator-timer-table th { text-align: center; - color: #666666; + font-size: {$biggerfontsize}; + color: {$bluetext}; width: 10%; padding: 4px; } @@ -40,12 +48,24 @@ padding: 4px; text-align: center; font-size: 36px; + font-weight: bold; overflow: hidden; line-height: auto; height: auto; - line-height: 36px; + line-height: 44px; +} + +.phabricator-timer-table td.phabricator-timer-foot { + font-size: {$biggerfontsize}; + line-height: 16px; + border-top: 1px solid {$thinblueborder}; + color: {$bluetext}; + padding: 12px 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + text-align: center; } .phabricator-timer-table small { - color: #999999; + color: {$lightgreytext}; } diff --git a/webroot/rsrc/css/application/daemon/bulk-job.css b/webroot/rsrc/css/application/daemon/bulk-job.css new file mode 100644 index 0000000000..206a4dd831 --- /dev/null +++ b/webroot/rsrc/css/application/daemon/bulk-job.css @@ -0,0 +1,32 @@ +/** + * @provides bulk-job-css + */ + +.bulk-job-progress-bar { + position: relative; + width: 100%; + border: 1px solid {$lightgreyborder}; + height: 32px; +} + +.bulk-job-progress-slice { + position: absolute; + top: 0; + bottom: 0; +} + +.bulk-job-progress-slice-green { + background-color: {$green}; +} + +.bulk-job-progress-slice-blue { + background-color: {$blue}; +} + +.bulk-job-progress-slice-red { + background-color: {$red}; +} + +.bulk-job-progress-slice-empty { + background-color: {$lightbluebackground}; +} diff --git a/webroot/rsrc/css/application/dashboard/dashboard.css b/webroot/rsrc/css/application/dashboard/dashboard.css new file mode 100644 index 0000000000..daa2cfb5c7 --- /dev/null +++ b/webroot/rsrc/css/application/dashboard/dashboard.css @@ -0,0 +1,108 @@ +/** + * @provides phabricator-dashboard-css + */ + +.dashboard-view { + margin: 16px; +} + +.device-phone .dashboard-view { + margin: 8px; +} + +.dashboard-view .phui-object-box { + margin: 0 0 16px 0; +} + +.dashboard-box .phui-header-shell { + padding-top: 4px; + padding-bottom: 16px; +} + +.dashboard-box .phui-header-header { + color: {$blacktext}; +} + +.dashboard-view .phui-oi-empty .phui-info-view { + padding-top: 16px; + padding-bottom: 16px; + font-style: italic; + color: {$lightgreytext}; +} + +.dashboard-view .phui-object-box .phui-object-box { + margin: 0; +} + +.device-desktop .aphront-multi-column-fluid .aphront-multi-column-2-up + .aphront-multi-column-column-outer.half { + width: 50%; +} + +.device-desktop .aphront-multi-column-fluid .aphront-multi-column-2-up + .aphront-multi-column-column-outer.third { + width: 33.34%; +} + +.device-desktop .aphront-multi-column-fluid .aphront-multi-column-2-up + .aphront-multi-column-column-outer.thirds { + width: 66.66%; +} + +.grippable .aphront-multi-column-column .dashboard-box.phui-object-box { + cursor: move; +} + +.grippable .aphront-multi-column-column .dashboard-box.phui-object-box:hover { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.10); +} + +.grippable .aphront-multi-column-column .dashboard-box.phui-object-box:hover + .dashboard-box { + box-shadow: none; +} + +.aphront-multi-column-fluid .aphront-multi-column-column .drag-ghost { + list-style-type: none; +} + +.aphront-multi-column-fluid .aphront-multi-column-column + .dashboard-panel-placeholder { + display: none; +} + +.aphront-multi-column-fluid .aphront-multi-column-column.dashboard-column-empty + .dashboard-panel-placeholder { + display: block; + padding: 20px; + margin: 0 0 12px 0; + text-decoration: none; + border: 1px {$greyborder} dashed; + color: {$greytext}; +} + +.aphront-multi-column-fluid .aphront-multi-column-column.drag-target-list + .dashboard-panel-placeholder { + display: none; +} + +.aphront-multi-column-fluid .aphront-multi-column-column-outer + .aphront-multi-column-column .phui-info-view { + margin: 0; +} + +.dashboard-preview-box { + margin: -16px -16px 16px; +} + +.phui-info-view + .dashboard-preview-box { + margin-top: 0; +} + +.drag-frame .phui-object-box { + box-shadow: {$dropshadow}; +} + +.drag-frame .phui-object-box .phui-object-box { + box-shadow: none; +} diff --git a/webroot/rsrc/css/application/diff/diff-tree-view.css b/webroot/rsrc/css/application/diff/diff-tree-view.css new file mode 100644 index 0000000000..33174d88d7 --- /dev/null +++ b/webroot/rsrc/css/application/diff/diff-tree-view.css @@ -0,0 +1,103 @@ +/** + * @provides diff-tree-view-css + */ + +.diff-tree-view { + margin: 0 4px; +} + +.diff-tree-path { + height: 20px; + line-height: 20px; + color: {$greytext}; + border-left: 4px solid transparent; +} + +.diff-tree-path-indent { + position: relative; +} + +.diff-tree-path-icon { + position: absolute; + width: 20px; + height: 20px; + text-align: center; +} + +.diff-tree-path-icon .phui-icon-view { + color: {$greytext}; +} + +.diff-tree-path-name { + margin-left: 22px; + margin-right: 44px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.diff-tree-path-changeset { + cursor: pointer; + color: {$darkbluetext}; +} + +.diff-tree-path-focused { + background: {$darkgreybackground}; +} + +.device-desktop .diff-tree-path-changeset:hover { + background: {$lightblueborder}; + transition: 0.1s; +} + +.diff-tree-view .diff-tree-path-changeset.diff-tree-path-selected { + /* Rule is intentionally more specific than "hover". */ + background: {$yellow}; +} + +.diff-tree-path-low-importance .diff-tree-path-name { + opacity: 0.5; +} + +.diff-tree-path-hidden { + opacity: 0.25; +} + +.diff-tree-path-icon-hidden, +.diff-tree-path-hidden .diff-tree-path-icon-kind { + display: none; +} + +.diff-tree-path-hidden .diff-tree-path-icon-hidden { + display: block; +} + +.diff-tree-path-owned { + border-left-color: {$orange}; + box-shadow: inset 2px 0 {$lightorange}; +} + +.diff-tree-path-inlines { + display: none; + position: absolute; + right: 4px; + border-radius: 4px; + text-align: center; + top: 2px; + height: 16px; + line-height: 14px; + width: 36px; + font-size: {$smallerfontsize}; + color: {$greytext}; +} + +.diff-tree-path-inlines-visible { + display: block; + background: {$lightblueborder}; +} + +.diff-tree-path-inlines-completed { + background: {$darkgreybackground}; + color: {$lightgreytext}; + opacity: 0.75; +} diff --git a/webroot/rsrc/css/application/diff/inline-comment-summary.css b/webroot/rsrc/css/application/diff/inline-comment-summary.css index 52e6208f0a..554fcdd518 100644 --- a/webroot/rsrc/css/application/diff/inline-comment-summary.css +++ b/webroot/rsrc/css/application/diff/inline-comment-summary.css @@ -2,34 +2,44 @@ * @provides inline-comment-summary-css */ -.phabricator-inline-summary { - margin: .75em 0 .5em; - font-size: 11px; - border-bottom: 1px solid #dddddd; - color: #666666; +.transaction-comment + .phabricator-inline-summary-table { + margin-top: 8px; } .phabricator-inline-summary-table { + border-collapse: collapse; + border-style: hidden; width: 100%; + margin-top: -16px; } -.phabricator-inline-summary-table th { - padding: 6px 0px; - color: #444444; +.phabricator-inline-summary-table .inline-comment-summary-table-header { + font-weight: bold; + padding: 16px 1px 8px; + color: {$blacktext}; + border-bottom: 1px solid {$thinblueborder}; } -.phabricator-inline-summary-table td { - padding: 0px 4px 6px; +.phabricator-inline-summary-table .inline-table-dolumn { + padding: 4px 8px; white-space: nowrap; + color: {$darkbluetext}; + background: {$page.content}; } .phabricator-inline-summary-table td.inline-line-number { - padding-left: 0px; + padding: 0; width: 100px; + white-space: nowrap; + background: {$lightgreybackground}; + font-family: "Menlo", "Consolas", monospace; + font-size: {$smallestfontsize}; + color: {$bluetext}; + border-right: 1px solid {$thinblueborder}; } .phabricator-inline-summary-table td.inline-which-diff { - color: #666666; + color: {$greytext}; width: 120px; } @@ -43,13 +53,19 @@ target (by highlighting the entire cell). */ .phabricator-inline-summary-table td.inline-line-number a.num { - padding-left: 16px; + padding: 4px 8px; display: block; - font-weight: bold; + color: {$bluetext}; } -.phabricator-inline-summary-table td.inline-line-number a.num:hover { - background: #3b5998; - color: white; +.phabricator-inline-summary-table td.inline-line-number:hover a.num { + background: rgba(150,150,150,.1); text-decoration: none; + color: {$darkbluetext}; +} + +.phui-timeline-core-content .phabricator-inline-summary:first-child { + border: none; + margin-top: 0; + padding-top: 0; } diff --git a/webroot/rsrc/css/application/differential/add-comment.css b/webroot/rsrc/css/application/differential/add-comment.css index 4cab4079f3..e40c2c6576 100644 --- a/webroot/rsrc/css/application/differential/add-comment.css +++ b/webroot/rsrc/css/application/differential/add-comment.css @@ -3,6 +3,15 @@ */ #inline-comment-preview { - margin-left: 60px; - width: 550px; + margin-left: 62px; + width: 640px; +} + +#inline-comment-preview .differential-inline-comment { + margin: 12px 0; +} + +#inline-comment-preview + .differential-inline-comment + .differential-inline-comment { + margin: 0 0 12px 0; } diff --git a/webroot/rsrc/css/application/differential/changeset-view.css b/webroot/rsrc/css/application/differential/changeset-view.css index d28cd047b5..5788bd68bc 100644 --- a/webroot/rsrc/css/application/differential/changeset-view.css +++ b/webroot/rsrc/css/application/differential/changeset-view.css @@ -1,91 +1,105 @@ /** * @provides differential-changeset-view-css + * @requires phui-inline-comment-view-css */ -.differential-review-stage { - background: #FFFFFF; - padding: 0em 1.25em 0em 0em; -} - .differential-changeset { position: relative; - margin: 0; - padding: 10px 0% 20px 2%; + overflow-x: auto; + + /* Fixes what seems to be a layout bug in Firefox which causes scrollbars, + to appear unpredictably, see discussion in T7690. */ + overflow-y: hidden; } +.device-phone .differential-changeset { + overflow-x: scroll; + -webkit-overflow-scrolling: touch; +} .differential-diff { - background: transparent; - width: 100%; + background: {$diff.background}; + width: 100%; + border-top: 1px solid {$lightblueborder}; + border-bottom: 1px solid {$lightblueborder}; + table-layout: fixed; +} + +.differential-diff.diff-2up { + min-width: 780px; +} + +.differential-diff col.num { + width: 45px; +} + +.device .differential-diff.diff-1up col.num { + width: 32px; +} + +.differential-diff.diff-2up col.left, +.differential-diff.diff-2up col.right { + width: 49.25%; +} + +.differential-diff.diff-1up col.unified { + width: 99.5%; +} + +.differential-diff col.copy { + width: 0.5%; +} + +.differential-diff col.cov { + width: 1%; } .differential-diff td { - min-width: 320px; - /* - Disable ligatures in Firefox. Firefox 3 has fancypants ligature support, but - it gets applied to monospaced fonts, which sucks because it means that the - "fi" ligature only takes up one character, e.g. It's probably the font's - fault that it even specifies ligatures (seriously, what the hell?) but - that's hard to fix and this is "easy" to "fix": custom letter spacing - disables ligatures, as long as it's at least 0.008333-repeating pixels of - custom letter spacing. I have no idea where this number comes from, but note - that .83333.. = 5/6. -epriestley - */ - letter-spacing: 0.0083334px; - vertical-align: top; - white-space: pre-wrap; - padding: 0 8px 1px; - line-height: 16px; -} - -.differential-diff th { - text-align: right; - padding: 2px 6px 0px 0px; - width: 4%; - min-width: 45px; - max-width: 4%; - vertical-align: top; - background: #eeeeee; - color: #888888; - cursor: pointer; - border-style: solid; - border-width: 0px 1px; - border-color: #eeeeee #999999 #eeeeee #dddddd; - font-size: 11px; - overflow: hidden; - - -moz-user-select: -moz-none; - -khtml-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} -.differential-diff td.left { - width: 45%; -} - -.differential-diff td.right, -.differential-diff td.right1 { - width: 43.5%; -} - -.differential-diff td.right2 { - width: 44.5%; -} -.differential-diff td.right3 { - width: 45%; -} - -.differential-changeset-immutable .differential-diff th { + vertical-align: top; + white-space: pre-wrap; + word-wrap: break-word; + padding: 1px 8px; +} + +.differential-diff td.diff-flush { + padding-top: 0; + padding-bottom: 0; +} + +.device .differential-diff td { + padding: 1px 4px; +} + +.prose-diff { + padding: 12px 0; + white-space: pre-wrap; + color: {$greytext}; +} + +.prose-diff-frame { + padding: 12px; +} + +.prose-diff span.old, +.prose-diff span.new { + padding: 0 2px; +} + +.prose-diff span.old, +.prose-diff span.new { + color: {$darkgreytext}; +} + +.differential-changeset-immutable .differential-diff td { cursor: auto; } .differential-diff td.old { - background: #ffd0d0; + background: {$old-background}; } .differential-diff td.new { - background: #d0ffd0; + background: {$new-background}; } .differential-diff td.old-rebase { @@ -96,39 +110,94 @@ background: #eeffee; } +.differential-diff td.old span.bright, .differential-diff td.old-full, -.differential-diff td.old span.bright { - background: #ffaaaa; +.prose-diff span.old { + background: {$old-bright}; } + +.differential-diff td.new span.bright, .differential-diff td.new-full, -.differential-diff td.new span.bright { - background: #aaffaa; +.prose-diff span.new { + background: {$new-bright}; } +.differential-diff td span.depth-out, +.differential-diff td span.depth-in { + padding: 2px 0; + background-size: 12px 12px; + background-repeat: no-repeat; + background-position: left center; + position: relative; + left: -8px; + opacity: 0.5; +} + +.differential-diff td span.depth-out { + background-image: url(http://github.com/rsrc/image/chevron-out.png); + background-color: {$old-bright}; +} + +.differential-diff td span.depth-in { + background-position: 1px center; + background-image: url(http://github.com/rsrc/image/chevron-in.png); + background-color: {$new-bright}; +} + + .differential-diff td.copy { min-width: 0.5%; width: 0.5%; padding: 0; + background: {$lightbluebackground}; } .differential-diff td.new-copy, .differential-diff td.new-copy span.bright { - background: #ffffaa; + background: {$copy-background}; } .differential-diff td.new-move, .differential-diff td.new-move span.bright { - background: #eeee44; + background: {$move-background}; } .differential-diff td.comment { background: #dddddd; } +.differential-diff .inline > td { + padding: 0; +} + +/* Specify line number behaviors after other behaviors because line numbers +should always have a boring grey background. */ + +.differential-diff td.n { + text-align: right; + padding: 1px 6px 1px 0; + vertical-align: top; + background: {$lightbluebackground}; + color: {$bluetext}; + cursor: pointer; + border-right: 1px solid {$thinblueborder}; + overflow: hidden; +} + +.differential-diff td + td.n { + border-left: 1px solid {$thinblueborder}; +} + +.differential-diff td.n::before { + content: attr(data-n); +} + +.differential-diff td.show-context-line.n { + cursor: auto; +} + .differential-diff td.cov { - min-width: 1%; - width: 1%; padding: 0; } @@ -148,6 +217,10 @@ td.cov-X { background: #aa00aa; } +td.cov-I { + background: {$lightgreybackground}; +} + .differential-diff td.source-cov-C, .differential-diff td.source-cov-C span.bright { background: #cceeff; @@ -164,30 +237,42 @@ td.cov-X { } .differential-diff td.show-more, -.differential-diff th.show-context-line, +.differential-diff td.show-context-line, .differential-diff td.show-context, .differential-diff td.differential-shield { - background: #ffffee; - padding: 1em 0em; - border: 1px solid #ccccaa; + background: {$lightbluebackground}; + padding: 12px 0; + border-top: 1px solid {$thinblueborder}; + border-bottom: 1px solid {$thinblueborder}; +} + +.device .differential-diff td.show-more, +.device .differential-diff td.show-context-line, +.device .differential-diff td.show-context, +.device .differential-diff td.differential-shield { + padding: 6px 0; } .differential-diff td.show-more, .differential-diff td.differential-shield { - font-family: "Helvetica Neue", "Arial", sans-serif; - font-size: 12px; + font: {$basefont}; + font-size: {$smallerfontsize}; white-space: normal; } .differential-diff td.show-more { text-align: center; - color: #999966; + color: {$bluetext}; } -.differential-diff th.show-context-line { +.differential-diff td.show-context-line { padding-right: 6px; } +.differential-diff td.show-context-line.left-context { + border-right: none; +} + .differential-diff td.show-context { padding-left: 14px; } @@ -200,242 +285,226 @@ td.cov-X { font-weight: bold; } -.differential-diff .differential-image-diff { +.differential-diff td.diff-image-cell { + background-color: transparent; background-image: url(http://github.com/rsrc/image/checker_light.png); + padding: 8px; } -.differential-diff .differential-image-diff:hover { +.device-desktop .differential-diff .diff-image-cell:hover { background-image: url(http://github.com/rsrc/image/checker_dark.png); } -.differential-meta-notice { - border: 1px solid #ffdd99; - background: #ffeeaa; - font-family: "Helvetica Neue", "Arial", sans-serif; - font-size: 12px; - padding: 1em; - margin: 0 0 6px 0; +.differential-image-stage { + overflow: auto; } -.differential-changeset h1 { - font-size: 14px; - font-weight: bold; - padding: 2px 0 8px; -} - -.differential-reticle { - background: #ffeeaa; - border: 1px solid #ffcc00; - position: absolute; - opacity: 0.5; - top: 0px; - left: 0px; -} - -.differential-inline-comment, -.differential-inline-comment-edit { - background: #f9f9f1; - border: 1px solid #aaaa88; - font-family: "Helvetica Neue", "Arial", sans-serif; - font-size: 12px; - margin: 6px 0px; - padding: 8px 10px; - width: 100%; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - overflow: hidden; - white-space: normal; -} - -.differential-inline-comment-unsaved-draft { - background: #f1f1f1; - border: 1px dashed #666666; +.differential-meta-notice { + border-top: 1px solid {$gentle.highlight.border}; + border-bottom: 1px solid {$gentle.highlight.border}; + background-color: {$gentle.highlight}; + padding: 12px; } -.differential-inline-comment-head { - font-weight: bold; - color: #333333; - border-bottom: 1px solid #ccccaa; - padding-bottom: 6px; - margin-bottom: 4px; +.differential-meta-notice + .differential-diff { + border-top: none; } -.differential-inline-comment-unsaved-draft .differential-inline-comment-head { - border-bottom: 1px solid #aaaaaa; +.differential-changeset .differential-file-icon-header { + font-size: {$biggestfontsize}; + padding: 18px 0 20px 12px; + margin-top: 4px; + line-height: 20px; + color: {$blacktext}; + cursor: pointer; } -.differential-inline-comment-synthetic { - background: #efffff; - border: 1px solid #20dfdf; +.differential-changeset .differential-file-icon-header + .differential-changeset-path-name { + cursor: auto; } -.differential-inline-comment-synthetic .differential-inline-comment-head { - border-bottom: 1px solid #20dfdf; +.device-phone .differential-changeset .differential-file-icon-header { + word-break: break-word; + margin-right: 8px; } - -.differential-inline-comment-links, -.differential-inline-comment-line { - font-weight: normal; - font-style: italic; - color: #666666; - float: right; - white-space: nowrap; +.differential-loading { + border-top: 1px solid {$gentle.highlight.border}; + border-bottom: 1px solid {$gentle.highlight.border}; + background-color: {$gentle.highlight}; + padding: 12px; + text-align: center; } -.differential-inline-comment-links { - margin-left: 8px; - font-style: normal; +.differential-file-icon-header .phui-icon-view { + display: inline-block; + margin: 0 6px 2px 0; + vertical-align: middle; + font-size: 14px; } - -.differential-inline-comment-edit-textarea { - width: 100%; - height: 12em; +.device-phone .differential-file-icon-header .phui-icon-view { + display: none; } .differential-changeset-buttons { float: right; + margin-top: 16px; + margin-right: 12px; } -.differential-changeset-buttons a.button { +.device-phone .differential-changeset-buttons .button .phui-button-text { + visibility: hidden; + width: 0; margin-left: 8px; } .differential-property-table { - width: auto; - margin: .75em auto; - background: #e3e3e3; -} - -.differential-property-table th { - text-align: right; - width: 10em; - font-weight: bold; - color: #666666; - white-space: nowrap; - padding: 4px 8px; - border-right: 1px solid #666666; -} - -.differential-property-table td { - padding: 4px 8px; - width: 35em; + margin: 12px; + background: {$lightgreybackground}; + border: 1px solid {$lightblueborder}; + border-bottom: 1px solid {$blueborder}; } .differential-property-table td em { - color: #888888; -} - -.differential-property-table tr.property-table-header th, -.differential-property-table tr.property-table-header td { - text-align: center; - font-weight: bold; - border-bottom: 1px solid #666666; + color: {$lightgreytext}; } .differential-property-table td.oval { background: #ffd0d0; + width: 50%; } .differential-property-table td.nval { background: #d0ffd0; + width: 50%; } -.differential-property-table tr.property-table-header td.oval { - background: #ffaaaa; +tr.differential-inline-hidden { + display: none; } -.differential-property-table tr.property-table-header td.nval { - background: #aaffaa; +tr.differential-inline-loading { + opacity: 0.5; } -.differential-inline-undo { - padding: 4px; - text-align: center; - background: #ffeeaa; - margin: 3px 0 1px; - font: 12px; - color: 444444; +.differential-review-stage { + position: relative; } -.differential-inline-undo a { +.diff-banner { + position: fixed; + top: 0; + left: 0; + right: 0; + background: {$page.content}; + box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1); + border-bottom: 1px solid {$lightgreyborder}; + padding: 8px 18px; + vertical-align: middle; font-weight: bold; + font-size: {$biggerfontsize}; + line-height: 28px; } -.differential-inline-comment-edit { - padding: 10px; +.diff-banner-path { + color: {$greytext}; } -.differential-inline-comment-edit-buttons { - padding: 5px 0 0 0; +.diff-banner-buttons .button { + margin-left: 8px; +} +.diff-banner-has-unsaved, +.diff-banner-has-unsubmitted, +.diff-banner-has-draft-done { + background: {$gentle.highlight}; } -.differential-inline-comment-edit-buttons button { +.diff-banner-buttons { float: right; - margin-left: 6px; } -.differential-inline-comment-edit-title { - font-weight: bold; - color: #333333; - padding-bottom: 2px; - margin-bottom: 6px; +/* In Firefox, making the table unselectable and then making cells selectable +does not work: the cells remain unselectable. Narrowly mark the cells as +unselectable. */ + +.differential-diff.copy-l > tbody > tr > td, +.differential-diff.copy-r > tbody > tr > td { + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; } -/* When the inline editor is active, disable all the other inline comment links - on the page ("Edit", "Reply", "Delete", etc). The goal here is to prevent - issues where you open up multiple editors and run into problems with - assumptions about modalness. They are disabled explicitly by the JS, but - render them in a disabled state as well. -*/ -.inline-editor-active .differential-inline-comment-links a, -.inline-editor-active .differential-inline-comment-links a:hover, -.inline-editor-active .differential-inline-comment-links a:active { - color: #888888; - cursor: normal; - text-decoration: none; +.differential-diff.copy-l > tbody > tr > td:nth-child(2) { + -moz-user-select: auto; + -ms-user-select: auto; + -webkit-user-select: auto; + user-select: auto; } -/* Create a wide band of color behind the inline edit interface so it is easy - to find by skimming the page while scrolling. -*/ -tr.inline-comment-splint { - background: #f9f1d5; +.differential-diff.copy-l > tbody > tr > td.show-more:nth-child(2) { + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; } -tr.differential-inline-hidden { - display: none; +.differential-diff.copy-r > tbody > tr > td:nth-child(5) { + -moz-user-select: auto; + -ms-user-select: auto; + -webkit-user-select: auto; + user-select: auto; } -tr.differential-inline-loading { - opacity: 0.5; +.differential-diff.copy-l > tbody > tr.inline > td, +.differential-diff.copy-r > tbody > tr.inline > td { + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; +} + +.changeset-content-hidden .differential-file-icon-header { + background: {$lightgreybackground}; + color: {$greytext}; +} + +.changeset-selected .differential-file-icon-header { + background: {$lightyellow}; + color: {$blacktext}; +} + +.differential-diff tr td.inline-hover { + background: {$gentle.highlight}; } +.differential-diff tr td.inline-hover-bright { + background: {$highlight.bright}; +} -/* In the document, the anchor is positioned inside the inline comment, but - this makes the browser jump into the comment so the top isn't visible. - Instead, artificially position it a bit above the comment so we'll jump a - bit before the comment. This allows us to see the entire comment (and - generally the commented-on lines, at least in the case of one or two-line - comments) after the jump. -*/ -.differential-inline-comment-anchor { +.differential-diff tr td.n.inline-hover { + background: {$yellow}; +} + +.inline-hover-container { position: absolute; - display: block; - margin-top: -72px; + color: {$lightgreytext}; + background: {$lightyellow}; } -.differential-loading a { - color: #3b5998; +.inline-hover-text { + padding-top: 2px; + padding-bottom: 2px; } -.differential-loading { - color: #999966; - background: #ffffee; - border: 1px solid #ccccaa; - padding: 1em; - text-align: center; - font-size: 11px; +.inline-hover-text-bright { + color: {$blacktext}; + background: {$highlight.bright}; +} + +.differential-diff td.inline-hover span.bright { + background: transparent; } diff --git a/webroot/rsrc/css/application/differential/core.css b/webroot/rsrc/css/application/differential/core.css index 5de0190c03..893cfb34a8 100644 --- a/webroot/rsrc/css/application/differential/core.css +++ b/webroot/rsrc/css/application/differential/core.css @@ -3,20 +3,11 @@ */ .differential-primary-pane { - background: #edecef; - padding: 1em 0em 0em 0em; - margin: 0em 0em 4em 0em; + margin-top: -20px; } .differential-panel { - margin: -1px 0px 3.6em 0px; - padding: 15px 2%; - font-size: 13px; - background: #F6F6F6; - border-color: #c0c5d1; - border-style: solid; - border-width: 1px 0 1px 0; - box-shadow: 0 0 1px 1px rgba(192, 197, 209, 0.3); + padding: 16px; } .differential-panel h1 { @@ -25,11 +16,6 @@ margin-bottom: 8px; } -.differential-unselectable tr td:nth-of-type(1) { - -moz-user-select: -moz-none; - -khtml-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; +.differential-content-hidden { + margin: 0 0 24px 0; } - diff --git a/webroot/rsrc/css/application/differential/local-commits-view.css b/webroot/rsrc/css/application/differential/local-commits-view.css deleted file mode 100644 index 316614e930..0000000000 --- a/webroot/rsrc/css/application/differential/local-commits-view.css +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @provides differential-local-commits-view-css - */ - -.differential-local-commits-table { - width: 100%; - border-collapse: separate; - border-spacing: 1px 2px; -} - -.differential-local-commits-table th { - color: #666666; - padding: 4px 6px; -} - -.differential-local-commits-table tr.alt td { - background: #dcdcdc; -} - -.differential-local-commits-table td { - padding: 4px 6px; - white-space: nowrap; - vertical-align: top; -} - -.differential-local-commits-table td.summary { - white-space: normal; - width: 100%; -} diff --git a/webroot/rsrc/css/application/differential/phui-inline-comment.css b/webroot/rsrc/css/application/differential/phui-inline-comment.css new file mode 100644 index 0000000000..246c81013c --- /dev/null +++ b/webroot/rsrc/css/application/differential/phui-inline-comment.css @@ -0,0 +1,507 @@ +/** + * @provides phui-inline-comment-view-css + */ + +.differential-diff td.anchor-target { + background: {$lightyellow}; +} + +/* In the document, the anchor is positioned inside the inline comment, but + this makes the browser jump into the comment so the top isn't visible. + Instead, artificially position it a bit above the comment so we'll jump a + bit before the comment. This allows us to see the entire comment (and + generally the commented-on lines, at least in the case of one or two-line + comments) after the jump. +*/ +.differential-inline-comment-anchor { + position: absolute; + display: block; + margin-top: -72px; +} + +.differential-inline-comment-content { + overflow: auto; +} + +.differential-inline-comment, +.differential-inline-comment-edit { + font: {$basefont}; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + white-space: normal; + border-radius: 3px; + margin: 8px 12px; + background: {$page.content}; + border: 1px solid {$blueborder}; +} + +.device .differential-inline-comment { + margin: 4px; +} + +.inline-state-is-draft { + border: 1px dashed {$greyborder}; +} + +.differential-inline-comment-head { + font-weight: bold; + color: {$darkbluetext}; + padding: 4px 5px 4px 8px; + + background: {$lightbluebackground}; + border-bottom: 1px solid {$blueborder}; +} + +.differential-inline-comment-content { + padding: 12px; +} + +.inline-state-is-draft .differential-inline-comment-head { + border-bottom: 1px dashed {$lightgreyborder}; + background-color: {$lightgreybackground}; +} + +/* Tighten up spacing on replies */ +.differential-inline-comment.inline-comment-is-reply { + margin-top: 0; +} + +.differential-inline-comment .inline-head-right { + float: right; + padding-right: 4px; +} + +.differential-inline-comment .inline-head-right .button { + vertical-align: top; +} + +.differential-inline-comment .inline-head-left { + float: left; + padding: 4px; +} + +.device-phone .differential-inline-comment .inline-head-left { + float: none; +} + +.device-phone .differential-inline-comment .inline-head-right { + margin: 12px 0 4px 4px; +} + +.device-phone .differential-inline-comment .inline-head-right .mml { + margin: 0 4px 0 0; +} + + +/* - Sythetic Comment --------------------------------------------------------- + + Comments left by our robot overlords. + +*/ + +.differential-inline-comment.differential-inline-comment-synthetic { + border: 1px solid {$blue}; +} + +.differential-inline-comment.differential-inline-comment-synthetic + .differential-inline-comment-head { + border-bottom: 1px solid {$blueborder}; + background-color: {$lightblue}; +} + +.differential-inline-comment.differential-inline-comment-synthetic + .differential-inline-comment-head { + padding-bottom: 4px; +} + +/* - Ghost Comment ------------------------------------------------------------ + + Comments from older or newer versions of the changeset. + +*/ + +.differential-inline-comment.inline-comment-ghost { + border: 1px solid {$lightgreyborder}; + opacity: 0.75; +} + +.differential-inline-comment.inline-comment-ghost + .differential-inline-comment-head { + border-bottom: 1px solid {$lightgreyborder}; + background-color: {$lightgreybackground}; +} + +/* - New/Edit Inline Comment -------------------------------------------------- + + Styles for when you are creating or editing an inline comment. + +*/ + +.differential-inline-comment .done-label { + display: inline-block; + color: {$sh-yellowicon}; + padding: 4px; +} + +.differential-inline-comment.inline-state-is-draft .done-label, +.differential-inline-comment.inline-comment-ghost .done-label { + color: {$lightgreytext}; +} + +/* - New/Edit Inline Comment -------------------------------------------------- + + Styles for when you are creating or editing an inline comment. + +*/ + +.differential-inline-comment-edit-body .aphront-form-input { + margin: 0; + width: 100%; +} + +.differential-inline-comment-edit { + padding: 8px; +} + +.differential-inline-comment-edit-buttons { + padding: 8px 0 0 0; +} + +.differential-inline-comment-edit-buttons button { + float: right; + margin-left: 6px; +} + +.differential-inline-comment-edit-title { + font-weight: bold; + color: {$darkbluetext}; + padding: 4px 0 12px; + font-size: {$biggerfontsize}; +} + +.differential-inline-comment-edit { + background-color: {$lightgreybackground}; + border: 1px solid {$lightgreyborder}; +} + +.differential-inline-comment-edit .remarkup-assist-textarea { + border-left-color: {$lightgreyborder}; + border-right-color: {$lightgreyborder}; + border-bottom-color: {$greyborder}; +} + +.differential-inline-comment-edit .remarkup-assist-bar { + border-left-color: {$lightgreyborder}; + border-right-color: {$lightgreyborder}; + border-top-color: {$lightgreyborder}; +} + +.differential-inline-comment-edit .aphront-form-control-textarea { + padding: 0; +} + + +/* - Action Buttons ----------------------------------------------------------- + + Reply, Edit, Delete, View, Button Bars... + +*/ + +.differential-inline-comment .differential-inline-done-label { + border-color: {$gentle.highlight.border}; + color: {$bluetext}; +} + +.differential-inline-comment.inline-state-is-draft + .differential-inline-done-label, +.differential-inline-comment.inline-state-is-draft + .button.simple, +.differential-inline-comment.inline-comment-ghost + .button.simple { + color: {$lightgreytext}; +} + +/* - Done Button -------------------------------------------------------------- + + Default colors, hovers, checked styles for the Done Button. + +*/ + +.differential-inline-done-label { + border: 1px solid {$sh-yellowborder}; + border-radius: 3px; + display: inline-block; + padding: 3px 8px 4px; + cursor: pointer; +} + +.differential-inline-done-label .differential-inline-done { + margin: 0 6px 0 0; + display: inline; + cursor: pointer; +} + +.differential-inline-comment.inline-is-done + .differential-inline-done-label { + background-color: {$page.content}; + border-color: {$lightblueborder}; + color: {$sky}; + opacity: 1; +} + +.device-desktop .differential-inline-comment.inline-is-done + .differential-inline-done-label:hover { + background-color: {$page.content}; + color: {$sky}; +} + +.differential-inline-comment.inline-is-done .differential-inline-comment-head + .button-done { + color: {$sky}; +} + +.differential-inline-comment.inline-is-done { + border-color: {$thingreyborder}; +} + +.differential-inline-comment.inline-is-done + .differential-inline-comment-head { + background-color: {$lightgreybackground}; + border-bottom-color: {$thingreyborder}; +} + +.differential-inline-comment.inline-is-done .differential-inline-comment-head + .button.simple { + border-color: {$lightgreyborder}; + color: {$lightgreytext}; +} + +.differential-inline-comment.inline-is-done .differential-inline-comment-head + .differential-inline-done-label { + color: {$sky}; + background-color: {$page.content}; + border-color: {$sky}; +} + +/* - Inline State is Draft ---------------------------------------------------- + + The Unsubmitted state of the comment / done checkbox styles. + +*/ + +.differential-inline-comment .inline-draft-text { + display: none; +} + +.differential-inline-comment.inline-state-is-draft .inline-draft-text { + display: inline-block; +} + +.inline-state-is-draft .differential-inline-done-label { + border-style: dashed; +} + + +/* - Undo --------------------------------------------------------------------- + + A wild undo box appears! + +*/ + +.differential-inline-undo { + padding: 8px; + margin: 4px 12px; + text-align: center; + background: {$sh-yellowbackground}; + border: 1px solid {$sh-yellowborder}; + color: {$darkgreytext}; + font: {$basefont}; + font-size: {$normalfontsize}; + border-radius: 3px; +} + +.differential-inline-undo a { + font-weight: bold; +} + +/* - Spooky Ghost UI ----------------------------------------------------------- + + Hide your codez. + +*/ + +.inline-comment-ghost .differential-inline-comment-head { + padding-left: 40px; +} + +.ghost-icon { + background: rgba({$alphagrey},.07); + float: left; + padding: 2px 4px 2px 2px; + position: absolute; + top: 0; + left: 0; +} + +.ghost-icon .phui-icon-view { + padding: 8px 7px; + font-size: 16px; + color: {$lightbluetext}; +} + +.device-desktop .ghost-icon .phui-icon-view:hover { + color: {$fire}; +} + +.differential-inline-comment.inline-comment-ghost + .differential-inline-comment-head { + position: relative; +} + +.differential-inline-comment.inline-comment-ghost + .differential-inline-done-label, +.differential-inline-comment.inline-comment-ghost { + border-color: {$lightgreyborder}; + color: {$lightgreytext}; +} + + +/* - Hiding Inlines ------------------------------------------------------------ +*/ + +.reveal-inline { + color: {$lightbluetext}; + margin: 4px 0; + display: none; +} + +.inline-hidden .reveal-inline { + display: block; +} + +.inline-hidden .differential-inline-comment { + display: none; +} + +.differential-inline-summary { + background: {$lightgreybackground}; + padding: 2px 16px; + color: {$lightgreytext}; + display: none; + font: {$basefont}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.device .differential-inline-summary { + padding-left: 4px; + padding-right: 4px; +} + +.inline-hidden .differential-inline-summary { + display: block; +} + +.reveal-inline span.phui-icon-view { + color: {$lightbluetext}; +} + +.reveal-inline:hover span.phui-icon-view { + color: {$darkbluetext}; +} + +.inline-button-divider { + border-left: 1px solid rgba({$alphagrey},.25); + margin-left: 8px; +} + +.differential-inline-comment-synthetic .inline-button-divider { + border: none; +} + +.inline-comment-element .differential-inline-comment-head { + cursor: pointer; +} + +.inline-comment-selected .inline-comment-element { + border-color: {$yellow}; + background: {$gentle.highlight.background}; +} + +.inline-comment-selected .inline-comment-element + .differential-inline-comment-head { + background: {$lightyellow}; + border-color: {$yellow}; +} + +.inline-suggestion { + display: none; + margin: 0 -8px; +} + +.has-suggestion .inline-suggestion { + display: block; +} + +.differential-inline-comment-edit-buttons button.inline-button-left { + float: left; + margin: 0 6px 0 0; +} + +.inline-suggestion-table { + table-layout: fixed; + width: 100%; + margin-bottom: 8px; + white-space: pre-wrap; + background: {$greybackground}; + border-width: 1px 0; + border-style: solid; + border-color: {$lightgreyborder}; +} + +textarea.inline-suggestion-input { + width: 100%; + height: auto; + max-width: 100%; +} + +.inline-suggestion-line-cell { + text-align: right; + background: {$darkgreybackground}; + width: 36px; + color: {$greytext}; + border-right: 1px solid {$lightgreyborder}; +} + +.inline-suggestion-table td.inline-suggestion-input-cell { + padding: 8px 4px; +} + +.inline-suggestion-table td.inline-suggestion-text-cell { + /* This is attempting to align the text in the textarea with the text on + the surrounding context lines. */ + padding: 0 8px 0 11px; +} + +.inline-suggestion-view { + padding: 4px 0; + white-space: pre-wrap; + background: {$lightgreybackground}; + margin: 0 -12px 8px; + border-width: 1px 0; + border-style: solid; + border-color: {$lightgreyborder}; +} + +.diff-1up-simple-table { + width: 100%; + table-layout: fixed; +} + +.diff-1up-simple-table > tbody > tr > td { + padding-left: 12px; + padding-right: 12px; +} diff --git a/webroot/rsrc/css/application/differential/results-table.css b/webroot/rsrc/css/application/differential/results-table.css deleted file mode 100644 index 8c497660c1..0000000000 --- a/webroot/rsrc/css/application/differential/results-table.css +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @provides differential-results-table-css - */ - -table.differential-results-table { - border-collapse: separate; - border-spacing: 1px; - width: 100%; - font-size: 11px; - background: #fcfcec; -} - -.differential-results-table th { - font-weight: bold; - text-align: center; - white-space: nowrap; - vertical-align: middle; - padding: 2px 4px; - margin: 0; - width: 70px; -} - -.differential-results-table td { - padding: 2px 8px; - margin: 0; - vertical-align: middle; -} - -.differential-results-table tr.differential-results-row-star th, -.differential-results-table tr.differential-results-row-star td { - font-weight: bold; - background: #dfe3ec; -} - - -.differential-results-table tr.differential-results-row-section th { - font-weight: bold; - padding-top: 4px; - text-align: left; -} - -.differential-results-table tr.differential-results-row-excuse th { - background: #3399ff; -} - -.differential-results-table tr.differential-results-row-excuse td { - padding-top: 1em; - padding-right: 1em; - padding-bottom: 1em; -} - -.differential-results-table tr.differential-results-row-red th { - background: #ff4422; -} - -.differential-results-table tr.differential-results-row-yellow th { - background: #ffdd66; -} - -.differential-results-table tr.differential-results-row-green th { - background: #22dd44; -} - -.differential-results-table tr.differential-results-row-blue th { - background: #88bbff; -} - - -.differential-results-table tr.differential-results-row-details td { - color: #888888; -} - -.differential-results-table tr.differential-results-row-show th { - padding: 4px; - color: #888888; - font-weight: bold; - background: #dfe3ec; -} diff --git a/webroot/rsrc/css/application/differential/revision-comment-list.css b/webroot/rsrc/css/application/differential/revision-comment-list.css deleted file mode 100644 index 45afcf27ef..0000000000 --- a/webroot/rsrc/css/application/differential/revision-comment-list.css +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @provides differential-revision-comment-list-css - */ - -.differential-older-comments-are-hidden { - background: #f0f0f0; - border: 1px solid #d6d6d6; - text-align: center; - padding: 1em; - color: #666666; -} diff --git a/webroot/rsrc/css/application/differential/revision-comment.css b/webroot/rsrc/css/application/differential/revision-comment.css index 42196611e3..fbf99e3aed 100644 --- a/webroot/rsrc/css/application/differential/revision-comment.css +++ b/webroot/rsrc/css/application/differential/revision-comment.css @@ -2,14 +2,6 @@ * @provides differential-revision-comment-css */ -.differential-comment-list { - margin: 0 2em 3.6em 2em; -} - -.differential-comment-list .phabricator-transaction-content { - background: #ffffff; -} - /* Spooky haunted panel which floats on the bottom of the screen. Haunt modes are: @@ -26,18 +18,25 @@ left: 0; overflow: auto; max-height: 375px; + margin: 0; box-shadow: 0 0 4px #000; -webkit-box-shadow: 0 0 4px #000; -moz-box-shadow: 0 0 4px #000; } +.differential-haunt-mode-1 .differential-add-comment-panel .phui-box, +.differential-haunt-mode-2 .differential-add-comment-panel .phui-box { + margin: 0; + border-width: 0; +} + .differential-haunt-mode-2 .differential-add-comment-panel { max-height: 75%; } -.differential-haunt-mode-1 .differential-add-comment-panel h1, -.differential-haunt-mode-2 .differential-add-comment-panel h1 { +.differential-haunt-mode-1 .differential-add-comment-panel .phui-header-shell, +.differential-haunt-mode-2 .differential-add-comment-panel .phui-header-shell { display: none; } @@ -48,56 +47,3 @@ .differential-haunt-mode-1 { padding-bottom: 250px; } - -.differential-comment-list .anchor-target { - background-color: #ffffdd; - border-color: #ffff00; -} - -.differential-inline-comment-content { - overflow: auto; -} - -.phabricator-transaction-view .differential-comment-action-testplan { - border-color: #660099; -} - -.phabricator-transaction-view .differential-comment-action-abandon { - border-color: #222222; -} - -.phabricator-transaction-view .differential-comment-action-accept { - border-color: #009966; -} - -.phabricator-transaction-view .differential-comment-action-reject { - border-color: #aa0000; -} - -.phabricator-transaction-view .differential-comment-action-rethink { - border-color: #aa0000; -} - -.phabricator-transaction-view .differential-comment-action-commit { - border-color: #006699; -} - -.phabricator-transaction-view .differential-comment-action-reclaim { - border-color: #0099aa; -} - -.phabricator-transaction-view .differential-comment-action-update { - border-color: #6699cc; -} - -.phabricator-transaction-view .differential-comment-action-add_reviewers { - border-color: #aa99cc; -} - -.phabricator-transaction-view .differential-comment-action-request_review { - border-color: #cc9966; -} - -.phabricator-transaction-view .differential-comment-action-claim { - border-color: #ffdd33; -} diff --git a/webroot/rsrc/css/application/differential/revision-history.css b/webroot/rsrc/css/application/differential/revision-history.css index 471680f4bb..0a2cc3b381 100644 --- a/webroot/rsrc/css/application/differential/revision-history.css +++ b/webroot/rsrc/css/application/differential/revision-history.css @@ -2,84 +2,55 @@ * @provides differential-revision-history-css */ -.differential-revision-history-table { - width: 100%; - border-collapse: separate; - border-spacing: 1px; -} - -.differential-revision-history-table th { - color: #666; - padding: 4px 6px; -} - -.differential-revision-history-table td { - padding: 4px 6px; -} - -.differential-revision-history-table td { - white-space: nowrap; -} - -.differential-revision-history-table tr.alt { - background: #dcdcdc; +.differential-update-history-footer { + text-align: right; + vertical-align: middle; + padding: 4px 8px; + border-top: 1px solid {$lightblueborder}; + background: {$lightbluebackground}; } - -.differential-revision-history-table td.revhistory-desc { - width: 100%; - white-space: normal; +.differential-update-history-footer label { + margin-right: 12px; + color: {$greytext}; } -.differential-revision-history-table td.revhistory-name { - font-weight: bold; +.differential-update-history-footer select { + margin-left: 8px; } -.differential-revision-history-table td.revhistory-age { - text-align: right; +.device .differential-update-history-footer label { + display: block; + margin-right: 0; + margin-bottom: 4px; } -.differential-revision-history-table td.revhistory-old, -.differential-revision-history-table td.revhistory-new { - padding: 0em 1.5em; - text-align: center; +.differential-update-history-radio { + padding: 0 8px; } -.differential-revision-history-table td.revhistory-old { +.aphront-table-view td.differential-update-history-old { background: #f9d0d0; } -.differential-revision-history-table td.revhistory-old-now { - background: #ffaaaa; -} - -.differential-revision-history-table td.revhistory-new { +.aphront-table-view td.differential-update-history-new { background: #d0ffd0; } -.differential-revision-history-table td.revhistory-new-now { - background: #aaffaa; -} - -.differential-revision-history-table td.revhistory-star { - text-align: center; -} - - - - -.differential-revision-history-table td.diff-differ-submit { - text-align: right; - border-bottom: none; - padding: 8px 0px 4px 0px; -} - -.differential-revision-history-table td.diff-differ-submit button { - margin-left: 1em; +.aphront-table-view + .differential-update-history-old-now + td.differential-update-history-old, +.aphront-table-view + .alt-differential-update-history-old-now + td.differential-update-history-old { + background: #ffaaaa; } -.differential-revision-history-table td.diff-differ-submit label { - font-weight: bold; - padding-right: .25em; - color: #444444; +.aphront-table-view + .differential-update-history-new-now + td.differential-update-history-new, +.aphront-table-view + .alt-differential-update-history-new-now + td.differential-update-history-new { + background: #aaffaa; } diff --git a/webroot/rsrc/css/application/differential/table-of-contents.css b/webroot/rsrc/css/application/differential/table-of-contents.css index 25f804ebce..043725dab5 100644 --- a/webroot/rsrc/css/application/differential/table-of-contents.css +++ b/webroot/rsrc/css/application/differential/table-of-contents.css @@ -3,86 +3,129 @@ */ .differential-toc-meta { - color: #666666; - padding-left: 1em; + color: {$lightgreytext}; + padding-top: 2px; } -.differential-toc-char, -.differential-toc-prop { - width: 1.25em; - text-align: center; +table.aphront-table-view td.differential-toc-char { + padding-right: 0; font-weight: bold; + color: {$darkbluetext}; } -.differential-toc-ftype { - padding: 0 .5em; - text-align: center; - color: #666666; +table.aphront-table-view td.differential-toc-prop { + padding-left: 0; + padding-right: 0; + font-weight: bold; + color: {$darkbluetext}; +} + +table.aphront-table-view td.differential-toc-ftype { + padding-left: 0; + font-weight: bold; + color: {$darkbluetext}; } .differential-toc-file { - color: #444444; + color: {$lightgreytext}; +} + +.device-phone .differential-toc-file { + word-break: break-word; +} + +.differential-toc-cov { + color: {$darkbluetext}; + font-weight: bold; } .differential-toc-reveal-all, .differential-toc-edit-all { float: right; - margin-left: .25em; + margin-left: 4px; } .diff-star-none { - color: #666666; + color: {$greytext}; } .diff-star-okay { - color: #ff9700; + color: {$orange}; } /* TODO: 'warn' and 'fail' are both red, but we can't make 'warn' yellow since 'okay' is a "gold star". */ .diff-star-warn { - color: #aa0000; + color: {$red}; } .diff-star-fail { - color: #aa0000; + color: {$red}; } .diff-star-skip { - color: #ff00aa; + color: {$indigo}; } -.differential-toc table { - width: 100%; +.differential-toc table td em { + color: {$greytext}; } -.differential-toc table td.differential-toc-cov, -.differential-toc table td.differential-toc-mcov { - width: 120px; - text-align: right; - padding-right: 6px; +.differential-toc .button { + margin: 8px 0px 0px 8px; } -.differential-toc table th { - color: #666666; - font-size: 11px; - padding: 0 4px 4px; - white-space: nowrap; +.differential-mcoverage-loading { + color: {$lightgreytext}; } -.differential-toc table th.differential-toc-cov, -.differential-toc table th.differential-toc-mcov { - text-align: right; +.differential-toc-buttons { + border-top: 1px solid {$thinblueborder}; + padding: 8px; } -.differential-toc table td em { - color: #666666; +.differential-harbormaster-table-view { + margin: 4px 0; + border: 1px solid {$thinblueborder}; } -.differential-toc .button { - margin: 8px 0px 0px 8px; +.diff-toc-path .phui-icon-view { + margin-right: 2px; + text-align: center; + width: 20px; + display: inline-block; } -.differential-mcoverage-loading { - color: #888888; +table.aphront-table-view-compact td { + padding: 3px 8px; +} + +td.diff-toc-path td { + padding: 0; + color: {$greytext}; +} + +.diff-toc-path div.diff-path-component-new { + padding: 0 2px; + box-shadow: inset 0 -2px {$new-bright}; + margin: 0 2px; +} + +.diff-toc-path div.diff-path-component-old { + padding: 0 2px; + box-shadow: inset 0 -2px {$old-bright}; + margin: 0 2px; +} + +.diff-toc-path a { + color: {$darkbluetext}; +} + +td.diff-toc-path .diff-path-old td { + color: {$lightgreytext}; +} + +.diff-toc-low-importance-row, +.alt-diff-toc-low-importance-row { + opacity: 0.5; } diff --git a/webroot/rsrc/css/application/diffusion/commit-view.css b/webroot/rsrc/css/application/diffusion/commit-view.css deleted file mode 100644 index ffd319e0bc..0000000000 --- a/webroot/rsrc/css/application/diffusion/commit-view.css +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @provides diffusion-commit-view-css - */ - -.diffusion-commit-message { - padding: 8px; -} - -.diffusion-comment-list { - margin: 2em; -} - -.phabricator-transaction-view .audit-accept { - border-color: #009933; -} - -.phabricator-transaction-view .audit-concern { - border-color: #aa0000; -} diff --git a/webroot/rsrc/css/application/diffusion/diffusion-icons.css b/webroot/rsrc/css/application/diffusion/diffusion-icons.css index f97cf6e5cb..072db01660 100644 --- a/webroot/rsrc/css/application/diffusion/diffusion-icons.css +++ b/webroot/rsrc/css/application/diffusion/diffusion-icons.css @@ -2,27 +2,54 @@ * @provides diffusion-icons-css */ -.diffusion-path-icon { +input.diffusion-clone-uri { display: block; - padding-left: 28px; - background-repeat: no-repeat; - background-position: 1px 1px; - height: 18px; - padding-top: 1px; + width: 100%; } -.diffusion-path-icon-ext { - background-image: url(http://github.com/rsrc/image/icon/fatcow/folder_go.png); +.diffusion-clone-extras { + font-size: 11px; + text-align: right; + color: {$lightgreytext}; } -.diffusion-path-icon-dir { - background-image: url(http://github.com/rsrc/image/icon/fatcow/folder.png); +.diffusion-clone-label { + height: 30px; + line-height: 28px; } -.diffusion-path-icon-file { - background-image: url(http://github.com/rsrc/image/icon/fatcow/page_white_text.png); +.diffusion-browse-name { + margin-left: 8px; + letter-spacing: 0.02em; } -.diffusion-path-icon-link { - background-image: url(http://github.com/rsrc/image/icon/fatcow/page_white_link.png); +.diffusion-link-icon + .diffusion-link-icon { + margin-left: 6px; +} + +.diffusion-search-boxen { + padding: 16px; +} + +.diffusion-search-boxen .phui-form-view { + padding: 0; +} + +.diffusion-clone-uri-table { + width: 100%; +} + +.diffusion-clone-uri-table th { + width: 24px; + padding: 0 0 0 4px; +} + +.diffusion-clone-uri-table th a.button { + width: 12px; + height: 19px; +} + +.diffusion-clone-uri-table th a.button .phui-icon-view { + left: 15px; + top: 7px; } diff --git a/webroot/rsrc/css/application/diffusion/diffusion-readme.css b/webroot/rsrc/css/application/diffusion/diffusion-readme.css new file mode 100644 index 0000000000..0dd5cdd858 --- /dev/null +++ b/webroot/rsrc/css/application/diffusion/diffusion-readme.css @@ -0,0 +1,23 @@ +/** + * @provides diffusion-readme-css + */ + +.device .diffusion-readme-view .phui-document-fluid .phui-document-view, +.device-desktop .diffusion-readme-view .phui-document-fluid + .phui-document-view { + margin: 0; + padding: 0 8px; +} + +.diffusion-readme-view .phui-document-container { + border: none; + padding: 24px 32px; +} + +.device .diffusion-readme-view .phui-document-container { + padding: 8px 16px; +} + +.diffusion-readme-view .phabricator-remarkup-toc { + display: none; +} diff --git a/webroot/rsrc/css/application/diffusion/diffusion-repository.css b/webroot/rsrc/css/application/diffusion/diffusion-repository.css new file mode 100644 index 0000000000..99ddd72940 --- /dev/null +++ b/webroot/rsrc/css/application/diffusion/diffusion-repository.css @@ -0,0 +1,13 @@ +/** + * @provides diffusion-repository-css + */ + +.diffusion-page-header-view a.phui-header-action-link { + display: block; + float: none; +} + +.phui-box.phui-object-box.phui-box-blue-property + .diffusion-panel-header-view.phui-header-shell { + padding: 8px 4px 8px 16px; +} diff --git a/webroot/rsrc/css/application/diffusion/diffusion-source.css b/webroot/rsrc/css/application/diffusion/diffusion-source.css deleted file mode 100644 index 21d5d61b45..0000000000 --- a/webroot/rsrc/css/application/diffusion/diffusion-source.css +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @provides diffusion-source-css - */ - -.diffusion-source { - margin: 1em 0 2em; - width: 100%; - font-family: "Monaco", Consolas, monospace; - font-size: 10px; -} - -.diffusion-source tr.phabricator-source-highlight { - background: #ffff00; -} - -.diffusion-source th { - text-align: right; - vertical-align: top; - background: #eeeeee; - color: #888888; - border-style: solid; - border-width: 0px 1px; - border-color: #eeeeee #999999 #eeeeee #dddddd; - font-family: "Verdana"; - font-size: 11px; -} - -.diffusion-source td { - letter-spacing: 0.0083334px; - vertical-align: top; - white-space: pre-wrap; - padding-bottom: 1px; - padding-left: 8px; - line-height: 16px; - width: 100%; -} - -.diffusion-browse-type-form { - float: right; -} - -.diffusion-blame-link, -.diffusion-rev-link, -.diffusion-author-link { - white-space: nowrap; -} - -.diffusion-blame-link { - min-width: 25px; -} - -.diffusion-rev-link { - min-width: 90px; -} - -.diffusion-author-link { - min-width: 120px; -} - -.diffusion-blame-link a, -.diffusion-rev-link a, -.diffusion-author-link a, -.diffusion-line-link a { - font-weight: bold; -} - -.diffusion-rev-link a, -.diffusion-author-link span, -.diffusion-author-link a { - margin: 0 8px; -} - -.diffusion-blame-link a, -.diffusion-line-link a { - /* Give the user a larger click target. */ - display: block; - padding: 2px 8px; -} - -.diffusion-line-link { - -moz-user-select: -moz-none; - -khtml-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} diff --git a/webroot/rsrc/css/application/diffusion/diffusion.css b/webroot/rsrc/css/application/diffusion/diffusion.css new file mode 100644 index 0000000000..c80a0506ab --- /dev/null +++ b/webroot/rsrc/css/application/diffusion/diffusion.css @@ -0,0 +1,242 @@ +/** + * @provides diffusion-css + */ + +/* - Home Styles ------------------------------------------------------------*/ + +.diffusion-profile-header.phui-profile-header .phui-header-col3 { + vertical-align: middle; +} + +.diffusion-profile-header .phui-header-action-links a.button { + display: block; +} + +.device-phone .diffusion-profile-header .phui-header-col1 { + display: none; +} + +.diffusion-action-bar { + margin-bottom: 16px; +} + +.device-phone .diffusion-action-bar { + display: block; +} + +.device-phone .diffusion-action-bar .phui-lr-container { + display: block; +} + +.device-phone .diffusion-action-bar .phui-lr-container .phui-left-view { + display: block; +} + +.device-phone .diffusion-action-bar .phui-lr-container .phui-right-view { + padding-top: 12px; + display: block; +} + +.device-phone .diffusion-action-bar .button .phui-button-text { + visibility: hidden; + width: 0; + margin-left: 8px; +} + +.device-phone .full-mobile-buttons.diffusion-action-bar .phui-lr-container + .phui-left-view { + display: inline-block; +} + +.device-phone .full-mobile-buttons.diffusion-action-bar .phui-lr-container + .phui-right-view { + display: inline-block; +} + +.diffusion-profile-locate .phui-form-view { + margin: 0; + padding: 0; +} + +.diffusion-profile-locate .phui-form-view .aphront-form-control { + padding: 0; +} + +.diffusion-profile-locate .phui-form-view .aphront-form-input { + margin: 0; + width: 480px; +} + +.device .diffusion-profile-locate .phui-form-view .aphront-form-input { + margin: 0; + width: 100%; +} + +.diffusion-profile-description.phui-object-box { + padding: 0; +} + +.device-phone .diffusion-profile-description.phui-object-box { + padding: 0; +} + +.diffusion-view-browse-header { + display: block; + padding: 2px 0; + font-size: {$biggestfontsize}; +} + +/* - List Styles ------------------------------------------------------------*/ + +.diffusion-history-list .phui-oi-link { + color: {$blacktext}; + font-size: {$biggerfontsize}; +} + +.diffusion-history-list .phui-oi-attribute { + font-size: {$smallerfontsize}; + letter-spacing: 0.01em; +} + +.diffusion-history-author-name a { + color: {$darkbluetext}; +} + +/* - Branch Styles ----------------------------------------------------------*/ + +.diffusion-branch-list .phui-oi-attribute a { + color: {$darkbluetext}; +} + +.diffusion-branch-list .phui-oi-attribute-spacer { + visibility: hidden; +} + +.diffusion-branch-list .phui-oi-subhead { + color: {$bluetext}; +} + +.diffusion-branch-list .phui-oi-subhead .phui-tag-view { + margin-right: 4px; +} + +.diffusion-header-branch-tag.phui-tag-view.phui-tag-type-outline + .phui-tag-core { + padding: 3px 12px 2px; + font-size: {$normalfontsize}; +} + +/* - Browse Styles ----------------------------------------------------------*/ + +.diffusion-browse-table .commit-detail { + padding-left: 32px; +} + +.diffusion-browse-table .commit-detail a { + color: {$darkbluetext}; +} + +.diffusion-search-result-header.phui-header-shell { + border: none; + padding-bottom: 24px; +} + +/* - Search Input ------------------------------------------------------------*/ + +.diffusion-search-form-view { + width: 240px; +} + +.diffusion-search-form-view .diffusion-search-input { + width: 240px; + border-radius: 20px; + padding-left: 12px; +} + +.device-phone .diffusion-browse-header .diffusion-search-form-view, +.device-phone .diffusion-profile-header .diffusion-search-form-view { + display: none; +} + +.diffusion-mobile-search-form { + display: none; +} + +.device-phone .diffusion-mobile-search-form { + display: block; +} + +.device-phone .diffusion-search-form-view { + width: 100%; + margin-bottom: 20px; +} + +.device-phone .diffusion-search-form-view .diffusion-search-input { + width: 100%; +} + +/* - Create Repository -------------------------------------------------------*/ + +.diffusion-create-repo { + margin-top: 32px; + margin-bottom: 20px; +} + +.device .diffusion-create-repo { + margin-top: 0; + margin-bottom: 0; +} + + +/* - Phone Style ------------------------------------------------------------*/ + +.device-phone.diffusion-history-view .phui-two-column-view + .phui-two-column-footer .phui-object-box { + border-color: {$thinblueborder}; +} + +.device-phone.diffusion-history-view .phui-oi-attribute-spacer { + display: none; +} + +.device-phone.diffusion-history-view .phui-oi-attribute { + display: block; + margin: 0 0 4px 0; +} + +.device-phone.diffusion-history-view .phui-oi-image { + height: 36px; + width: 36px; + margin-top: 10px; +} + +.device-phone.diffusion-history-view .phui-oi-with-image .phui-oi-content-box { + margin-left: 44px; +} + +.device-phone.diffusion-history-view .phui-oi-col2.phui-oi-side-column { + padding-bottom: 10px; +} + +.device-phone .phui-two-column-view .phui-two-column-content + .phui-object-box.diffusion-mobile-view { + margin: 0 -12px 20px; + border-left: none; + border-right: none; + border-color: {$thinblueborder}; +} + +.diffusion-commit-graph-table td.diffusion-commit-graph-path-cell { + padding: 0 4px 0 0; +} + +.diffusion-commit-graph-table td.diffusion-commit-graph-path-cell > canvas { + display: block; +} + +.diffusion-commit-graph-table .phui-oi-list-header { + color: {$darkgreytext}; + font-weight: bold; + padding: 4px 4px; + font-size: {$normalfontsize}; +} diff --git a/webroot/rsrc/css/application/directory/phabricator-jump-nav.css b/webroot/rsrc/css/application/directory/phabricator-jump-nav.css deleted file mode 100644 index eac6c8e7c4..0000000000 --- a/webroot/rsrc/css/application/directory/phabricator-jump-nav.css +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @provides phabricator-jump-nav - */ - -.phabricator-jump-nav-form { - text-align: center; - padding: 0px; - margin: 0; -} - -input.phabricator-jump-nav[type='text'] { - font-size: 16px; - width: 100%; -} - -.phabricator-jump-nav-caption { - margin-top: 4px; - padding-bottom: 4px; - font-size: 11px; - color: #666666; - text-align: left; -} - -.phabricator-jump-nav-container form { - padding: 20px; -} diff --git a/webroot/rsrc/css/application/feed/feed.css b/webroot/rsrc/css/application/feed/feed.css index fbda2c777d..05ddc5fe0b 100644 --- a/webroot/rsrc/css/application/feed/feed.css +++ b/webroot/rsrc/css/application/feed/feed.css @@ -2,30 +2,6 @@ * @provides phabricator-feed-css */ -.phabricator-feed-frame { - margin: 20px 10px; -} - -.phabricator-public-feed-frame { - margin: 10px; - max-width: 600px; - overflow-x: auto; -} - -.phabricator-feed-frame .phabricator-action-header-title { - font-size: 16px; - margin-bottom: 5px; -} - -.device-desktop .phabricator-feed-frame { - max-width: 600px; - margin: 20px; -} - -.phabricator-feed-story-date-separator { - margin-top: 2em; -} - .phabricator-feed-newer-link { float: left; font-weight: bold; diff --git a/webroot/rsrc/css/application/files/global-drag-and-drop.css b/webroot/rsrc/css/application/files/global-drag-and-drop.css index 7539a046fb..f9981d0492 100644 --- a/webroot/rsrc/css/application/files/global-drag-and-drop.css +++ b/webroot/rsrc/css/application/files/global-drag-and-drop.css @@ -14,8 +14,8 @@ top: 30%; padding: 18px 0; - color: #ffffff; - background: rgba(0, 0, 0, 0.8); + color: {$page.content}; + background: rgba({$alphablack}, 0.8); border-radius: 18px; } diff --git a/webroot/rsrc/css/application/flag/flag.css b/webroot/rsrc/css/application/flag/flag.css index b5a1a8c17b..7d5f0af5d2 100644 --- a/webroot/rsrc/css/application/flag/flag.css +++ b/webroot/rsrc/css/application/flag/flag.css @@ -7,7 +7,7 @@ background: transparent 0 0 no-repeat; } -.phabricator-object-item .phabricator-flag-icon { +.phui-oi .phabricator-flag-icon { float: left; margin: 2px; margin-right: 8px; @@ -55,3 +55,29 @@ .phabricator-flag-ghost { background-image: url(http://github.com/rsrc/image/icon/fatcow/flag_ghost.png); } + +.phabricator-flag-select-control .phabricator-flag-select-label { + border: 1px solid #aaaaaa; + width: 48px; + height: 24px; + border-radius: 4px; + position: relative; + display: inline-block; + cursor: pointer; + margin: 0 4px 4px 0; +} + +.phabricator-flag-select-control .phabricator-flag-select-checkbox { + position: absolute; + top: 2px; + left: 4px; + width: auto; +} + +.phabricator-flag-select-control .phui-icon-view { + position: absolute; + width: 16px; + height: 16px; + top: 4px; + left: 24px; +} diff --git a/webroot/rsrc/css/application/harbormaster/harbormaster.css b/webroot/rsrc/css/application/harbormaster/harbormaster.css new file mode 100644 index 0000000000..9fdad43a42 --- /dev/null +++ b/webroot/rsrc/css/application/harbormaster/harbormaster.css @@ -0,0 +1,172 @@ +/** + * @provides harbormaster-css + */ + +.harbormaster-artifact-io { + margin: 4px 0 4px 8px; + padding: 8px; +} + +.harbormaster-artifact-summary-header { + font-weight: bold; + margin-bottom: 2px; + color: {$darkbluetext}; +} + +.harbormaster-empty-logs-are-hidden { + background: {$lightyellow}; + border: 1px solid {$yellow}; + text-align: center; + padding: 12px; + margin: 0 0 20px 0; + border-radius: 3px; + color: {$darkgreytext}; +} + +.harbormaster-unit-details { + margin: 8px 0 4px; + overflow: hidden; + color: {$lightgreytext}; +} + +.harbormaster-unit-details-text { + white-space: pre-wrap; + text-overflow: ellipsis; +} + +.harbormaster-log-view-loading { + padding: 8px; + text-align: center; + color: {$lightgreytext}; +} + +.harbormaster-log-table > tbody > tr > th { + background-color: {$paste.highlight}; + border-right: 1px solid {$paste.border}; + + -moz-user-select: -moz-none; + -khtml-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.harbormaster-log-table > tbody > tr > th a::before { + /* Render the line numbers into the document using a pseudo-element so that + the text is not copied. */ + content: attr(data-n); +} + +.harbormaster-log-table > tbody > tr > th a { + display: block; + color: {$darkbluetext}; + text-align: right; + padding: 2px 6px 1px 12px; +} + +.harbormaster-log-table > tbody > tr > th a:hover { + background: {$paste.border}; +} + +.harbormaster-log-table > tbody > tr > td { + white-space: pre-wrap; + padding: 2px 8px 1px; + width: 100%; +} + +.harbormaster-log-table > tbody > tr > td.harbormaster-log-expand-cell { + padding: 4px 0; +} + +.harbormaster-log-table tr.phabricator-source-highlight > th { + background: {$paste.border}; +} + +.harbormaster-log-table tr.phabricator-source-highlight > td { + background: {$paste.highlight}; +} + +.harbormaster-log-expand-table { + width: 100%; + background: {$paste.highlight}; + border-top: 1px solid {$paste.border}; + border-bottom: 1px solid {$paste.border}; +} + +.harbormaster-log-expand-table a { + display: block; + padding: 6px 16px; + color: {$darkbluetext}; +} + +.device-desktop .harbormaster-log-expand-table a:hover { + background: {$paste.border}; + text-decoration: none; +} + +.harbormaster-log-expand-table td { + vertical-align: middle; + font: 13px 'Segoe UI', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Lato', + 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +.harbormaster-log-expand-up { + text-align: right; + width: 50%; +} + +.harbormaster-log-expand-up .phui-icon-view { + margin: 0 0 0px 4px; +} + +.harbormaster-log-follow { + text-align: center; +} + +.harbormaster-log-follow .phui-icon-view { + margin: 0 4px; +} + +.harbormaster-log-expand-mid { + text-align: center; + white-space: nowrap; + border-left: 1px solid {$paste.border}; + border-right: 1px solid {$paste.border}; +} + +.harbormaster-log-expand-down { + text-align: left; + width: 50%; +} + +.harbormaster-log-expand-down .phui-icon-view { + margin: 0 4px 0 0; +} + + +.harbormaster-log-following .harbormaster-log-table + .harbormaster-log-follow-start { + display: none; +} + +.harbormaster-log-table .harbormaster-log-follow-stop { + display: none; +} + +.harbormaster-log-following .harbormaster-log-table + .harbormaster-log-follow-stop { + display: block; +} + +.harbormaster-log-appear > td { + animation: harbormaster-fade-in 1s linear; +} + +@keyframes harbormaster-fade-in { + 0% { + opacity: 0.5; + } + 100% { + opacity: 1.0; + } +} diff --git a/webroot/rsrc/css/application/herald/herald-test.css b/webroot/rsrc/css/application/herald/herald-test.css index 83292bf995..e673020464 100644 --- a/webroot/rsrc/css/application/herald/herald-test.css +++ b/webroot/rsrc/css/application/herald/herald-test.css @@ -2,91 +2,10 @@ * @provides herald-test-css */ -ul.herald-explain-list { - font-size: 11px; - font-family: "Verdana"; -} - -div.herald-condition-note { - clear: both; - margin: .5em 0em .53em 86px; - padding: .5em 1em; - background: #FFFF00; - font-weight: bold; -} - -ul.herald-explain-list .herald-outcome { - margin-right: 6px; - width: 50px; - text-align: center; - position: relative; - float: left; - font-weight: bold; - padding: 1px 2px; -} - -ul.herald-explain-list .condition-fail, -ul.herald-explain-list .rule-fail { - color: #aa0000; -} - -ul.herald-explain-list .condition-pass, -ul.herald-explain-list .rule-pass { - color: #00aa00; -} - - - -ul.herald-explain-list li.herald-rule-pass, -ul.herald-explain-list li.herald-rule-fail { - margin: 0 0 0.75em; -} - -ul.herald-explain-list li.herald-rule-fail { - border: 1px solid #aa0000; -} - -ul.herald-explain-list li.herald-rule-pass { - border: 1px solid #00aa00; -} - -ul.herald-explain-list div.rule-name { - border-bottom: 1px solid #cccccc; - font-size: 12px; - padding: .5em .75em; -} - -ul.herald-explain-list li.herald-rule-fail, -ul.herald-explain-list li.herald-rule-pass { - background: #ffffff; -} - -ul.herald-explain-list ul { - margin: .5em; -} - -ul.herald-explain-list ul li { - padding: 2px 0; -} - -.outcome-failure, -.outcome-success { - font-weight: bold; -} - -.outcome-failure { - color: #990000; -} - -.outcome-success { - color: #009900; -} - - -.action-header { - font-weight: bold; - padding-top: 1em; - border-bottom: 1px solid #dddddd; +.herald-condition-note { + color: {$red}; + padding: 4px 0; + margin: 4px 0 8px; } textarea.herald-field-value-transcript { @@ -94,7 +13,6 @@ textarea.herald-field-value-transcript { height: 10em; } - .condition-test-value { - color: #666666; + color: {$greytext}; } diff --git a/webroot/rsrc/css/application/herald/herald.css b/webroot/rsrc/css/application/herald/herald.css index 2546a08284..806fef2ac1 100644 --- a/webroot/rsrc/css/application/herald/herald.css +++ b/webroot/rsrc/css/application/herald/herald.css @@ -17,10 +17,15 @@ .herald-action-table td, .herald-condition-table td { - padding: 2px 4px; + padding: 2px 8px 2px 0; vertical-align: middle; } +.herald-action-table td.remove-column, +.herald-condition-table td.remove-column { + padding: 2px 0 2px 4px; +} + .herald-condition-table td.value { width: 100%; } @@ -32,6 +37,27 @@ padding: 2px 4px; } +.herald-action-table td textarea { + width: 95%; + height: 8em; + padding: 2px 4px; +} + .herald-action-table td.target { width: 100%; } + +.herald-list-description { + color: {$bluetext}; + font-weight: bold; + padding: 12px 0; +} + +.herald-list-icon { + margin-right: 8px; +} + +.herald-list-item { + padding-bottom: 4px; + color: {$darkbluetext}; +} diff --git a/webroot/rsrc/css/application/legalpad/legalpad-documentbody.css b/webroot/rsrc/css/application/legalpad/legalpad-documentbody.css deleted file mode 100644 index d729d5ae2c..0000000000 --- a/webroot/rsrc/css/application/legalpad/legalpad-documentbody.css +++ /dev/null @@ -1,9 +0,0 @@ -/** - * @provides legalpad-documentbody-css - */ - -.legalpad-documentbody { - position: relative; - padding: 1.25em 2% -} - diff --git a/webroot/rsrc/css/application/maniphest/batch-editor.css b/webroot/rsrc/css/application/maniphest/batch-editor.css deleted file mode 100644 index 10e9a61d62..0000000000 --- a/webroot/rsrc/css/application/maniphest/batch-editor.css +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @provides maniphest-batch-editor - */ - -.maniphest-batch-actions-table { - width: 100%; - margin: 1em 0; -} - -.maniphest-batch-actions-table td { - padding: 4px 8px; - vertical-align: middle; -} - -.batch-editor-input { - width: 100%; - text-align: left; -} - diff --git a/webroot/rsrc/css/application/maniphest/report.css b/webroot/rsrc/css/application/maniphest/report.css index 0da5632217..45edc33bdf 100644 --- a/webroot/rsrc/css/application/maniphest/report.css +++ b/webroot/rsrc/css/application/maniphest/report.css @@ -4,29 +4,22 @@ table.aphront-table-view tr.aggregate, table.aphront-table-view tr.alt-aggregate { - background: #bb5577; + font-size: {$normalfontsize}; + font-weight: bold; } table.aphront-table-view tr.month, table.aphront-table-view tr.alt-month { - background: #ee77aa; -} - -table.aphront-table-view tr.week, -table.aphront-table-view tr.alt-week { - background: #ffccdd; + background: {$backdrop}; + font-weight: bold; } span.red { - color: #aa0000; + color: {$red}; font-weight: bold; } span.green { - color: #00aa00; + color: {$green}; font-weight: bold; } - -.aphront-panel-view-caption p { - padding: 6px 0 0; -} diff --git a/webroot/rsrc/css/application/maniphest/task-edit.css b/webroot/rsrc/css/application/maniphest/task-edit.css index 4ec88a7362..a91a2c6311 100644 --- a/webroot/rsrc/css/application/maniphest/task-edit.css +++ b/webroot/rsrc/css/application/maniphest/task-edit.css @@ -4,9 +4,9 @@ .maniphest-auxiliary-header { font-weight: bold; - font-size: 14px; - color: #333333; - border-bottom: 1px solid #999999; + font-size: {$biggerfontsize}; + color: {$darkbluetext}; + border-bottom: 1px solid {$lightgreytext}; padding: 12px 0 4px; margin-bottom: 4px; } diff --git a/webroot/rsrc/css/application/maniphest/task-summary.css b/webroot/rsrc/css/application/maniphest/task-summary.css index 89246b1946..f7e2b26647 100644 --- a/webroot/rsrc/css/application/maniphest/task-summary.css +++ b/webroot/rsrc/css/application/maniphest/task-summary.css @@ -1,60 +1,21 @@ /** * @provides maniphest-task-summary-css */ - -.maniphest-task-group { - padding-bottom: 30px; -} - -.maniphest-batch-selected td { - background: #fff; -} - -.device-phone .maniphest-task-batch, +.device-phone .maniphest-batch-editor, .device-phone .maniphest-task-updated { display: none; } -.maniphest-task-group-header { - font-size: 16px; - font-weight: bold; - color: #555; - padding: 0 0 8px 0; -} - -.maniphest-total-result-count { - text-align: right; - padding: 5px 20px 0 0; - font-size: 11px; - color: #777; -} - -.device-phone .maniphest-total-result-count { - padding-right: 5px; -} - -.batch-editor-header { - font-size: 16px; - color: #555; - padding: 8px 0px; - font-weight: bold; -} - -/* TODO: Implement */ -.device-phone .maniphest-batch-editor { - display: none; +.maniphest-batch-editor { + border-top: 1px solid {$thinblueborder}; } .maniphest-batch-editor-layout { width: 100%; - border-left: 1px solid #e7e7e7; - border-right: 1px solid #e7e7e7; - border-bottom: 1px solid #c0c5d1; - background: #fff; } .maniphest-batch-editor-layout td { - padding: 10px 8px; + padding: 12px 4px 8px; white-space: nowrap; } @@ -69,16 +30,12 @@ #batch-select-status-cell { text-align: right; - color: #666666; - font-size: 11px; + color: {$greytext}; + font-size: {$smallestfontsize}; vertical-align: middle; width: 100%; } -.maniphest-list-container { - padding: 20px; -} - -.device-phone .maniphest-list-container { - padding: 20px 5px; +.maniphest-board-link { + color: {$bluetext}; } diff --git a/webroot/rsrc/css/application/maniphest/transaction-detail.css b/webroot/rsrc/css/application/maniphest/transaction-detail.css deleted file mode 100644 index 362366841c..0000000000 --- a/webroot/rsrc/css/application/maniphest/transaction-detail.css +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @provides maniphest-transaction-detail-css - */ - -.maniphest-transaction-list-view { - padding: 0 20px; -} - -.device-phone .maniphest-transaction-list-view { - padding: 0 10px; -} - -.maniphest-transaction-list-view .anchor-target { - background-color: #ffffdd; - border-color: #ffff00; -} - -.phabricator-transaction-view .upforgrab { - border-color: #cc9966; -} - -.phabricator-transaction-view .reassigned { - border-color: #0099aa; -} - -.phabricator-transaction-view .assigned { - border-color: #0099aa; -} - -.phabricator-transaction-view .claimed { - border-color: #0099aa; -} - -.phabricator-transaction-view .created { - border-color: #660099; -} - -.phabricator-transaction-view .closed { - border-color: #006699; -} - -.phabricator-transaction-view .spited { - border-color: #006699; -} - -.phabricator-transaction-view .reopened { - border-color: #660099; -} - -.phabricator-transaction-view .unbreaknow { - border-color: #aa0000; -} - -.phabricator-transaction-view .duplicate { - border-color: #333333; -} - -.maniphest-change-table { - width: 100%; - margin: .5em 0em; - border-collapse: separate; - border-spacing: 4px 0px; -} - -.maniphest-change-table td { - width: 50%; - padding: 0.25em 1em; - background: #f9f9f9; -} - -.maniphest-change-table th { - font-weight: bold; - padding: 0.25em; - border-bottom: 1px solid #cccccc; -} diff --git a/webroot/rsrc/css/application/objectselector/object-selector.css b/webroot/rsrc/css/application/objectselector/object-selector.css index fdb14aea75..fc53cc3282 100644 --- a/webroot/rsrc/css/application/objectselector/object-selector.css +++ b/webroot/rsrc/css/application/objectselector/object-selector.css @@ -3,17 +3,18 @@ * @requires aphront-dialog-view-css */ -.phabricator-object-selector-dialog { - width: 960px; +.device-desktop .phabricator-object-selector-dialog { + width: 860px; } .phabricator-object-selector-dialog .aphront-dialog-body { - padding: 0; + padding: 0 12px; } .phabricator-object-selector-search { width: 100%; - background: #ededed; + background: {$lightbluebackground}; + border-bottom: 1px solid {$thinblueborder}; } .phabricator-object-selector-search td { @@ -25,27 +26,45 @@ td.phabricator-object-selector-search-text { width: 100%; } +.phabricator-object-selector-row:hover { + background-color: {$hoverblue}; +} + +.phabricator-object-selector-row:hover a { + text-decoration: none; + color: {$blacktext}; +} + .phabricator-object-selector-search-text input { width: 100%; + border-radius: 14px; + padding: 4px 8px; + height: 26px; + margin: 2px 0; +} + +.phabricator-object-selector-popicon { + display: inline-block; + margin-top: 4px; } .phabricator-object-selector-results { position: relative; height: 24em; - border: solid #bbbbbb; - border-width: 1px 0px; overflow-y: scroll; overflow-x: hidden; } .phabricator-object-selector-handle { width: 100%; - background: #e9e9e9; - margin-bottom: 1px; +} + +.phabricator-object-selector-handle + .phabricator-object-selector-handle { + border-top: 1px solid {$thinblueborder}; } .phabricator-object-selector-handle td { - padding: 4px 1em; + padding: 4px 8px; } .phabricator-object-selector-handle th { @@ -57,43 +76,37 @@ td.phabricator-object-selector-search-text { .phabricator-object-selector-handle th a { display: block; - padding: 4px 1em; + padding: 4px 0; } .phabricator-object-selector-header { - padding: 2px; - border-bottom: 1px solid #d0d0d0; - margin-bottom: 16px; - color: #444444; + font-weight: bold; + text-transform: uppercase; + color: {$darkbluetext}; + background-color: {$lightgreybackground}; + border-bottom: 1px solid {$thinblueborder}; + padding: 6px 8px; } .phabricator-object-selector-attach-explicit { padding: 4px; - background: #f3f3f3; - border: solid #bbbbbb; + background: {$lightgreybackground}; + border: solid {$blueborder}; border-width: 1px 0px; } -.phabricator-object-selector-currently-attached { - background: #fff; - padding: 16px; - border: 1px solid #dddddd; -} - .phabricator-object-selector-current { - background: #ededed; - padding: 8px 8px; + border-top: 1px solid {$thinblueborder}; } - .object-selector-nothing { padding: 1em; - color: #888888; + color: {$lightgreytext}; text-align: center; } .phabricator-object-selector-instructions { - font-size: 11px; - color: #666666; + font-size: {$smallestfontsize}; + color: {$greytext}; margin-top: 1.25em; } diff --git a/webroot/rsrc/css/application/owners/owners-path-editor.css b/webroot/rsrc/css/application/owners/owners-path-editor.css index 3cf3d21991..b703656369 100644 --- a/webroot/rsrc/css/application/owners/owners-path-editor.css +++ b/webroot/rsrc/css/application/owners/owners-path-editor.css @@ -3,7 +3,8 @@ */ .owners-path-editor-table { - margin: 10px; + margin: 10px 0; + width: 100%; } .owners-path-editor-table td { @@ -11,27 +12,38 @@ vertical-align: middle; } -.owners-path-editor-table select.owners-repo { - width: 150px; +.owners-path-editor-table td.owners-path-mode-control { + width: 180px; } -.owners-path-editor-table input { - width: 400px; +.owners-path-editor-table td.owners-path-mode-control select { + width: 100%; } -.owners-path-editor-table div.error-display { - padding: 4px 12px 0; +.owners-path-editor-table td.owners-path-repo-control { + width: 280px; } -.owners-path-editor-table div.validating { - color: #666666; +.owners-path-editor-table td.owners-path-path-control { + width: auto; } -.owners-path-editor-table div.invalid { - color: #aa0000; +.owners-path-editor-table td.owners-path-path-control input { + width: 100%; } -.owners-path-editor-table div.valid { - color: #00aa00; - font-weight: bold; +.owners-path-editor-table td.owners-path-path-control .jx-typeahead-results a { + padding: 4px; +} + +.owners-path-editor-table td.owners-path-icon-control { + width: 18px; +} + +.owners-path-editor-table td.remove-column { + width: 100px; +} + +.owners-path-editor-table td.remove-column a { + display: block; } diff --git a/webroot/rsrc/css/application/paste/paste.css b/webroot/rsrc/css/application/paste/paste.css index 9f0caf08f4..22138df452 100644 --- a/webroot/rsrc/css/application/paste/paste.css +++ b/webroot/rsrc/css/application/paste/paste.css @@ -3,21 +3,31 @@ */ .paste-embed { - padding: 5px; - background: #f7f7f7; - border: 1px solid #dbdbdb; + background: {$paste.content}; + border: 1px solid {$paste.border}; + border-radius: 3px; +} + +.paste-embed .phabricator-source-code-container { + border: none; } .paste-embed-head { - border-bottom: 1px solid #dbdbdb; - margin:2px; + border-bottom: 1px solid {$paste.border}; + background: {$paste.highlight}; + padding: 8px 12px; } .paste-embed-head a { - color: #282828; + color: {$darkbluetext}; font-weight: bold; } .paste-embed-body { overflow-y: auto; } + +.paste-embed-body .phabricator-source-code-container { + border-top-right-radius: 0; + border-top-left-radius: 0; +} diff --git a/webroot/rsrc/css/application/people/people-picture-menu-item.css b/webroot/rsrc/css/application/people/people-picture-menu-item.css new file mode 100644 index 0000000000..745f9df3cd --- /dev/null +++ b/webroot/rsrc/css/application/people/people-picture-menu-item.css @@ -0,0 +1,17 @@ +/** + * @provides people-picture-menu-item-css + */ + +.people-menu-image { + width: 160px; + height: 160px; +} + +.people-menu-image-container { + background: {$page.content}; + padding: 5px; + border-radius: 5px; + border: 1px solid rgba({$alphablue},.2); + margin: 4px 0px 16px 20px; + display: inline-block; +} diff --git a/webroot/rsrc/css/application/people/people-profile.css b/webroot/rsrc/css/application/people/people-profile.css index 9a6ea0e22d..2fcb6daa20 100644 --- a/webroot/rsrc/css/application/people/people-profile.css +++ b/webroot/rsrc/css/application/people/people-profile.css @@ -11,3 +11,80 @@ button.profile-image-button { padding: 4px; margin: 0; } + +.compose-dialog button.profile-image-button-selected { + background-image: none; + background-color: {$lightblue}; + border-color: {$sky}; +} + +.compose-header { + color: {$bluetext}; + border-bottom: 1px solid {$lightblueborder}; + padding: 4px 0; + margin: 0 0 8px; +} + +form.compose-dialog { + width: 80%; +} + +.compose-dialog .phui-icon-view { + display: block; + position: relative; + width: 48px; + height: 48px; + background-color: {$darkgreytext}; +} + +.compose-dialog .compose-icon-bg.phui-icon-view { + color: #e7e7e7; + line-height: 48px; + width: 48px; + text-align: center; + font-size: 28px; +} + +.compose-dialog .compose-background-red { + background-color: {$red}; +} + +.compose-dialog .compose-background-orange { + background-color: {$orange}; +} + +.compose-dialog .compose-background-yellow { + background-color: {$yellow}; +} + +.compose-dialog .compose-background-green { + background-color: {$green}; +} + +.compose-dialog .compose-background-blue { + background-color: {$blue}; +} + +.compose-dialog .compose-background-sky { + background-color: {$sky}; +} + +.compose-dialog .compose-background-indigo { + background-color: {$indigo}; +} + +.compose-dialog .compose-background-violet { + background-color: {$violet}; +} + +.compose-dialog .compose-background-pink { + background-color: {$pink}; +} + +.compose-dialog .compose-background-charcoal { + background-color: {$charcoal}; +} + +.compose-dialog .compose-background-backdrop { + background-color: {$backdrop}; +} diff --git a/webroot/rsrc/css/application/phame/phame.css b/webroot/rsrc/css/application/phame/phame.css index b6ac7fdecb..be9939b51f 100644 --- a/webroot/rsrc/css/application/phame/phame.css +++ b/webroot/rsrc/css/application/phame/phame.css @@ -2,114 +2,321 @@ * @provides phame-css */ -.notice { - background: #F3F3FF; - border: 1px solid #008; - margin: 16px 16px 4px 26px; +.phame-blog-description { + max-width: 800px; + margin: 32px auto; + position: relative; + padding: 0 8px; } -.notice h3 { - background: #E3E3FF; - padding: 8px; + +.phame-blog-description-name { + font-weight: bold; + font-size: {$biggerfontsize}; + margin: 0 0 4px 50px; +} + +.phame-blog-description-content { + margin-left: 50px; +} + +.phame-blog-description-image { + display: inline-block; + background-repeat: no-repeat; + background-size: 100%; + width: 40px; + height: 40px; + border-radius: 3px; + position: absolute; +} + + +.phame-blog-description + .phui-document-view-pro-box { + border-top: 1px solid rgba({$alphablue}, 0.20); +} + +.phame-home-view .phui-document-view.phui-document-view-pro { + margin: 0; } -.notice h4 { - font-weight: normal; - padding: 8px; +.phame-home-view .phui-side-column { + background-color: {$page.content}; } -.phame-post-preview-header { - margin: 0px 0px 16px 0px; +.phame-home-view { + background-color: {$page.content}; + border-bottom: 1px solid rgba({$alphagrey},.1); } -.device-desktop .phame-post-list { - max-width: 600px; +.phame-home-view .phame-home-container { + max-width: 980px; + margin: 0 auto; } -.blog-post-list { - clear: left; +.phame-home-view .phui-document-container { + border: none; +} + +.phame-blog-list { + margin: 96px 16px 16px 16px; +} + +.phame-blog-list + .phame-blog-list { + margin-top: 24px; +} + +.device .phame-blog-list { + margin: 16px; +} + +.device-phone .phame-blog-list { + margin: 16px 8px; +} + +.phame-blog-list-header { + font-size: {$biggerfontsize}; + margin-bottom: 16px; +} + +.phame-blog-list-header a { + color: {$darkbluetext}; +} + +.phame-blog-list-item { + display: block; + color: {$darkgreytext}; + position: relative; + margin-bottom: 8px; + padding-right: 20px; +} + +.phame-blog-list-title:hover { + color: {$violet}; + text-decoration: none; +} + +.phame-blog-list-image { + display: inline-block; + background-repeat: no-repeat; + background-size: 100%; + width: 24px; + height: 24px; + border-radius: 3px; + position: absolute; +} + +.phame-blog-list-title { + margin-left: 30px; + margin-top: 2px; + display: inline-block; + font-weight: bold; + color: {$bluetext}; + width: 190px; + overflow: hidden; +} + +.phame-blog-list-new-post { + display: block; + position: absolute; + top: 6px; + right: 0; +} + +.phame-blog-list-new-post:hover { + color: {$violet}; + text-decoration: none; +} + +.phame-blog-list-new-post:hover .phame-blog-list-icon { + color: {$violet}; +} + +.phame-blog-list-icon { + display: block; + height: 14px; + width: 14px; + color: {$lightbluetext}; +} + +.phame-next-post-view { + margin: 0 auto; + padding: 12px 0; +} + +.phame-next { + width: 360px; + float: right; + text-align: right; + color: {$blacktext}; + position: relative; +} + +.phame-next-arrow, +.phame-previous-arrow { + border: 1px solid {$lightblueborder}; + border-radius: 36px; + height: 36px; + width: 36px; + text-align: center; +} + +.phame-next-arrow .phui-icon-view, +.phame-previous-arrow .phui-icon-view { + height: 36px; + width: 34px; + font-size: 24px; + line-height: 35px; + color: {$lightblueborder}; +} + +.phame-previous-arrow { float: left; - width: 70%; - margin: 16px 0px 16px 16px; - padding: 0px 8px 12px 8px; } -.device .blog-post-list { - float: none; - width: 90%; - margin: 16px auto; +.phame-next-arrow { + float: right; } -.blog-post-list-full { - clear: left; +.phame-previous { + width: 360px; float: left; - margin: 16px 0px 0px 0px; - padding: 0px 16px 0px 16px; + text-align: left; + color: {$blacktext}; + position: relative; } -.device .blog-post-list-full { - float: none; - margin: 16px auto; +.device .phame-previous, +.device .phame-next { + width: 100px; } -.blog-detail { - float: right; - clear: right; - width: 20%; - margin: 16px 16px 16px 0px; +.device .phame-previous .phame-previous-title, +.device .phame-next .phame-next-title { + display: none; } -.device .blog-detail { - float: none; - margin: 16px auto; - width: 90%; +.phame-next:hover, +.phame-previous:hover { + text-decoration: none; } -.blog-detail .description { - margin: 16px 0px 16px 0px; +.phame-next:hover .phame-next-arrow, +.phame-previous:hover .phame-previous-arrow { + border-color: {$indigo}; } -.blog-detail .bloggers { - font-size: 11px; +.phame-next:hover .phui-icon-view, +.phame-previous:hover .phui-icon-view { + color: {$indigo}; } -.blog-post, -.blog-detail { - border: 1px solid #DBDBDB; - background: #F9F9F9; - padding: 20px; +.phame-next-header, +.phame-previous-header { + font-weight: bold; + font-size: {$biggerfontsize}; } -.blog-post { - margin: 0px 0px 20px 0px; +.phame-next-header { + top: 2px; + right: 50px; + position: absolute; } -.blog-post .header { - padding: 0px 0px 16px 0px; +.phame-next-title { + top: 22px; + right: 50px; + position: absolute; } -.blog-post .header h1 { - clear: none; +.phame-previous-header { + top: 2px; + left: 50px; + position: absolute; } -.blog-post .header .last-updated { - color: #666; - clear: none; - font-size: 11px; +.phame-previous-title { + top: 22px; + left: 50px; + position: absolute; } -.blog-post .header .buttons { - float: right; +.phame-404 { + margin: 48px auto; + padding: 12px 24px; + border-radius: 6px; + min-width: 240px; + width: 50%; + color: {$darkgreytext}; + background: {$greybackground}; +} + +/* Blog Chrome */ +.phame-live-view .phui-crumbs-view { + border: none; + width: 960px; + margin: 0 auto; + padding: 4px 0; +} + +/* Hero Image */ +.phame-header-hero { + background-color: {$page.content}; + margin-top: 16px; +} + +.phame-header-image { + max-height: 320px; + max-width: 100%; + margin: 0 auto; +} + +.phui-document-view.phui-document-view-pro .phui-header-shell.phame-header-bar { + border-top: 1px solid {$thinblueborder}; + border-bottom: none; + padding: 4px 0; +} + +.phame-header-bar .phui-header-subheader { + margin: 0; +} + +.phame-mega-header { + margin: 0 auto; + text-align: center; + background: {$page.content}; + padding: 16px 0 24px; + border-top: 1px solid {$document.border}; } -.blog-post .header .buttons a { - margin: 0px 0px 0px 12px; + +.device-phone .phame-mega-header { + padding: 24px 0; +} + +.phame-mega-header .phame-header-title { + color: {$blacktext}; + font-size: 28px; + font-weight: bold; + padding-top: 24px; +} + +.device-phone .phame-mega-header .phame-header-title { + padding-top: 0; +} + +.phame-mega-header .phame-header-subtitle { + color: {$greytext}; + font-size: 20px; + padding-top: 8px; +} + +.phame-comment-view .phui-comment-form-view .phui-comment-action-bar { + display: none; } -.more-and-comments { - padding: 12px 0px 12px 0px; +.phame-comment-view .phui-comment-form-view .phui-comment-has-actions + .phui-comment-textarea-control { + padding-top: 16px; } -.fb-comments, -.fb-comments span, -.fb-comments iframe[style] { - width: 100% !important; +.phame-comment-view .phui-document-view-pro-box .phui-object-box { + margin-bottom: 16px; } diff --git a/webroot/rsrc/css/application/pholio/pholio-edit.css b/webroot/rsrc/css/application/pholio/pholio-edit.css index 9765098f80..78fd16ca46 100644 --- a/webroot/rsrc/css/application/pholio/pholio-edit.css +++ b/webroot/rsrc/css/application/pholio/pholio-edit.css @@ -17,13 +17,17 @@ .pholio-thumb-box { margin: 2px 0; float: left; - background: #f7f7f7; - border: 1px solid #D5D9DF; + background: {$lightgreybackground}; + border: 1px solid {$lightgreyborder}; border-radius: 3px; width: 296px; overflow: hidden; } +.device .pholio-thumb-box { + width: 100%; +} + .device-desktop .pholio-thumb-box { /* Provide room for the draggable grip. */ margin-left: 12px; @@ -34,20 +38,28 @@ margin: 0 auto; } -.pholio-thumb-frame { - background-color: #ffffff; - background-position: center center; - background-repeat: no-repeat; - background-size: 280px 210px; - width: 280px; - height: 210px; +.pholio-thumb-img { + max-width: 280px; + max-height: 210px; padding: 8px; } +.pholio-uploaded-image .pholio-thumb-img { + cursor: pointer; +} + +.pholio-thumb-frame { + background: url('http://github.com/rsrc/image/checker_lighter.png'); +} + +.device .pholio-thumb-frame { + width: 100%; +} + .pholio-thumb-title { padding: 4px 8px; font-weight: bold; - color: #444444; + color: {$darkgreytext}; overflow: hidden; border-bottom: 1px solid #d7d7d7; } @@ -86,6 +98,7 @@ text-align: left; padding: 0; margin: 0; + clear: both; } .pholio-uploaded-image .pholio-image-details .aphront-form-label { @@ -93,12 +106,13 @@ } .pholio-edit-drop { + display: block; border-width: 1px; border-style: dashed; - border-color: #999999; + border-color: {$lightgreytext}; text-align: center; padding: 16px; - color: #666666; + color: {$greytext}; } .pholio-uploaded-image.pholio-drop-active, @@ -119,7 +133,7 @@ text-align: center; border: 1px solid #bbbbbb; background: #fcfcfc; - color: #666666; + color: {$greytext}; margin-bottom: 12px; } diff --git a/webroot/rsrc/css/application/pholio/pholio-inline-comments.css b/webroot/rsrc/css/application/pholio/pholio-inline-comments.css index caec948f62..3c434a3a48 100644 --- a/webroot/rsrc/css/application/pholio/pholio-inline-comments.css +++ b/webroot/rsrc/css/application/pholio/pholio-inline-comments.css @@ -2,91 +2,15 @@ * @provides pholio-inline-comments-css */ -.pholio-inline-comment { - border: 1px solid #555555; - background: #353535; - margin: 0 10px 5px 10px; - padding: 8px 10px; - - font-family: Verdana; - font-size: 11px; -} - -.pholio-mock-inline-comments { - color: #cccccc; - border-top: 1px solid #333; - background: #282828; - overflow-x: auto; - text-align: left; +.pholio-inline-comment-head { + padding: 12px 0 4px; + color: {$greytext}; } -.device-desktop .pholio-mock-inline-comments { - border-left: 1px solid #101010; - position: absolute; - width: 320px; - top: 0; - bottom: 0; - right: 0; -} - -.pholio-inline-comment-dialog-title { +.pholio-inline-comment-head a { font-weight: bold; - color: #fff; - padding-bottom: 2px; - margin-bottom: 6px; - text-align: left; -} - -.pholio-inline-comment-dialog-buttons button { - float: right; - margin-left: 6px; -} - -.pholio-inline-comment-dialog { - padding: 10px; -} - -.pholio-inline-comment-dialog-textarea { - width: 254px; - height: 6em; - margin-bottom: 5px; -} - -.pholio-new-inline-comment { - position: absolute; - border: 1px solid #000; - background: rgb(60, 60, 60); - padding: 8px 10px 8px 12px; - width: 260px; - box-shadow: 0 2px 10px 1px #999; -} - -.pholio-inline-comment-dialog-buttons a { - display: none; -} - -.pholio-inline-comment-draft { - border-style: dashed; - border-color: #777777; - background: #464646; -} - -.pholio-inline-head-links { - float: right; - font-weight: normal; - color: #777777; -} - -.pholio-mock-inline-comments a { - font-weight: normal; - color: #2178db; -} - -.device-desktop .pholio-mock-inline-comment-highlight.pholio-mock-select-fill { - opacity: 0.5; } -.device-desktop .pholio-mock-inline-comment-highlight.pholio-inline-comment { - background: #555555; - border-color: #aaaaaa; +.pholio-transaction-inline-comment .phui-image-mask { + margin-bottom: 8px; } diff --git a/webroot/rsrc/css/application/pholio/pholio.css b/webroot/rsrc/css/application/pholio/pholio.css index 6fe6f9fc8f..598a5e0abc 100644 --- a/webroot/rsrc/css/application/pholio/pholio.css +++ b/webroot/rsrc/css/application/pholio/pholio.css @@ -2,62 +2,48 @@ * @provides pholio-css */ .pholio-mock-image-container { - background-color: #282828; text-align: center; vertical-align: middle; position: relative; - background: url('http://github.com/rsrc/image/texture/pholio-background.gif'); + background: url('http://github.com/rsrc/image/checker_lighter.png'); } -.pholio-mock-carousel { - background-color: #282828; - text-align: center; - border-top: 1px solid #101010; +.pholio-mock-thumb-grid-container { + padding: 12px; + overflow-x: auto; + overflow-y: hidden; } -.device-desktop .pholio-mock-carousel { - margin-right: 320px; +.pholio-mock-thumb-grid { + margin: 0 auto; } -.pholio-mock-carousel-thumb-item { +.pholio-mock-thumb-grid-item { display: inline-block; cursor: pointer; - width: 140px; - height: 140px; - padding: 5px; - margin: 3px; - background: #181818; + width: 100px; + height: 100px; + padding: 4px; + margin: 4px; vertical-align: middle; - border: 1px solid #383838; + border: 1px solid {$lightgreyborder}; position: relative; + background: url('http://github.com/rsrc/image/checker_lighter.png'); } -.device-desktop .pholio-mock-carousel-thumb-item:hover, -.pholio-mock-carousel-thumb-current { - background: #383838; - border-color: #686868; -} - -.device .pholio-mock-carousel-thumb-item { - width: 5px; - height: 5px; - padding: 0px; - border-radius: 5px; - margin: 5px 2px; - background: #383838; - border-color: #686868; +.device-desktop .pholio-mock-thumb-grid-item:hover { + border-color: {$pink}; } -.device .pholio-mock-carousel-thumb-current { - background: #dfdfdf; - border-color: #ffffff; +.pholio-mock-thumb-grid-current { + border-color: {$sky}; } -.device .pholio-mock-carousel-thumb-item img { - display: none; +.pholio-mock-thumb-grid-item-obsolete { + opacity: 0.5; } -.pholio-mock-carousel-thumbnail { +.pholio-mock-thumb-grid-image { margin: auto; position: relative; } @@ -67,68 +53,25 @@ cursor: crosshair; } -.pholio-mock-select-fill { - position: absolute; - background: #ffffff; - opacity: 0.25; - box-sizing: border-box; - border: 1px solid #000000; -} - -.pholio-mock-select-border { - position: absolute; - border: 1px dashed #ffffff; - box-sizing: border-box; -} - -.pholio-mock-image-panel { - padding: 20px; - border-top: 1px solid #333; -} - -.device-desktop .pholio-mock-image-panel { - border-right: 1px solid #333; - margin-right: 319px; -} - .pholio-mock-image-viewport { position: relative; margin: auto; display: inline-block; } -.pholio-inline-comment-header { - color: #fff; - border-bottom: 1px solid #555; - font-weight: bold; - padding-bottom: 6px; - margin-bottom: 4px; -} - .pholio-image-loading img { opacity: 0.50; } -.pholio-image-info { - border-bottom: 1px solid #101010; - margin-bottom: 5px; -} .pholio-image-info-item { - padding: 0 10px; + padding: 0 8px; margin: 8px 0; } .pholio-visible-size { - color: #ffffff; -} - -.pholio-image-description { - color: #777777; -} - -.pholio-image-title { - color: #ffffff; + color: {$sky}; + font-weight: bold; } .pholio-device-lightbox { @@ -145,53 +88,176 @@ background: url(http://github.com/rsrc/image/darkload.gif) no-repeat center; } -.pholio-mock-embed { - display: inline-block; - background-color: #282828; - padding: 5px; - color: #fff; - margin: 2px; +.device-desktop .pholio-transaction-inline-image-anchor:hover .phui-image-mask { + border-color: {$pink}; } -.pholio-mock-embed-head { - border-bottom: 1px solid #3d3d3d; - padding: 2px; - margin:2px; +.pholio-transaction-inline-comment { + display: table-row; } -.pholio-mock-embed-footer { - margin: 2px 0; +.pholio-transaction-inline-comment img { + display: table-cell; + padding-bottom: 2px; } -.pholio-mock-embed-icons { - float: left; - margin-left: 10px; +.pholio-transaction-inline-comment .transaction-comment { + display: table-cell; + vertical-align: top; + padding-left: 8px; + padding-top: 4px; } -.pholio-mock-embed-icon { - height: 14px; - width: 14px; - float: left; - padding-left: 2px; - margin-right: 2px; +.pholio-mock-reticle { + position: absolute; + display: none; + box-sizing: border-box; + border: 4px solid transparent; } -.pholio-mock-embed-head a { - color: #fff; +.pholio-mock-reticle-selection { + border: 1px solid rgba({$alphablack},.5); + box-shadow: 0 0 0 4px rgba({$alphawhite},.5); +} + +.pholio-mock-comment-icon { + opacity: 1; + -webkit-transition: all .3s ease; + -moz-transition: all .3s ease; + -ms-transition: all .3s ease; + -o-transition: all .3s ease; + transition: all .3s ease; +} + +.pholio-mock-reticle-draft .pholio-mock-comment-icon { + font-size: 2.2em; + color: {$yellow}; + text-shadow: 0 3px 8px rgba({$alphablack}, 0.35); + -webkit-text-stroke: 1px white; +} + +.pholio-mock-reticle-final .pholio-mock-comment-icon { + font-size: 2.2em; + color: {$pink}; + text-shadow: 0 3px 8px rgba({$alphablack}, 0.35); + -webkit-text-stroke: 1px white; +} + +.pholio-mock-reticle-draft:hover, +.pholio-mock-reticle-final:hover { + border: 1px solid rgba({$alphablack},.5); + box-shadow: 0 0 0 4px rgba({$alphawhite},.5); + cursor: pointer; +} + +.device-desktop .pholio-mock-reticle-draft:hover .pholio-mock-comment-icon, +.device-desktop .pholio-mock-reticle-final:hover .pholio-mock-comment-icon { + opacity: 0; + -webkit-transition: all .3s ease; + -moz-transition: all .3s ease; + -ms-transition: all .3s ease; + -o-transition: all .3s ease; + transition: all .3s ease; +} + +.device-desktop .mock-has-cursor .pholio-mock-reticle { + display: block; +} + +.pholio-mock-image-header { + position: absolute; + top: 0; + right: 0; + font-size: 14px; + padding: 4px 8px; + background: rgba({$alphawhite},.6); + color: {$greytext}; +} + +.pholio-image-title { font-weight: bold; + color: {$bluetext}; + font-size: 15px; } -.pholio-transaction-inline-comment { - display: table-row; +.mock-image-description { + background: {$page.content}; + border-top: 1px solid {$thinblueborder}; + text-align: left; } -.pholio-transaction-inline-comment img { - display: table-cell; - padding-bottom: 2px; +.pholio-mock-thumb-grid-comment-count { + position: absolute; + top: -4px; + right: -4px; + width: 20px; + height: 17px; + font-weight: bold; + text-align: center; + line-height: 16px; + border-radius: 2px; + color: #fff; + text-decoration: none; + background: {$pink}; } -.pholio-transaction-inline-comment div { - display: table-cell; +.pholio-image-button { + float: right; + margin-left: 2px; +} + +.pholio-image-button-link { + width: 56px; + height: 56px; + overflow: hidden; + display: block; + position: relative; + background: {$lightgreybackground}; + text-align: center; + line-height: 56px; + font-size: 24px; +} + +button.pholio-image-button-link, +button.pholio-image-button-link:active { + /* Remove button styles. */ + box-shadow: none; + text-shadow: none; + border: none; + border-radius: 0; +} + +.pholio-image-button-active .pholio-image-button-link .phui-icon-view { + color: {$lightgreytext}; +} + +.pholio-image-button-disabled .pholio-image-button-link .phui-icon-view { + color: {$darkgreybackground}; +} + +.device-desktop .pholio-image-button-active .pholio-image-button-link:hover { + background: {$darkgreybackground}; +} + +.device-desktop .pholio-image-button-active + .pholio-image-button-link:hover .phui-icon-view { + color: {$sky}; +} + +.pholio-image-description { + padding: 12px 8px; + border-top: 1px solid {$thinblueborder}; +} + +.pholio-image-revision { + color: {$bluetext}; +} + +.pholio-history-header { vertical-align: middle; - padding-bottom: 2px; + color: {$lightbluetext}; + font-weight: bold; + padding-right: 8px; + -webkit-font-smoothing: antialiased; + white-space: nowrap; } diff --git a/webroot/rsrc/css/application/phortune/phortune-credit-card-form.css b/webroot/rsrc/css/application/phortune/phortune-credit-card-form.css index b7904195ae..62a1d7a80b 100644 --- a/webroot/rsrc/css/application/phortune/phortune-credit-card-form.css +++ b/webroot/rsrc/css/application/phortune/phortune-credit-card-form.css @@ -2,7 +2,6 @@ * @provides phortune-credit-card-form-css */ -.credit-card-logos { - background: url(http://github.com/rsrc/image/credit_cards.png) no-repeat 0px 2px; - height: 32px; +.phortune-security-assurance { + color: {$lightgreytext}; } diff --git a/webroot/rsrc/css/application/phortune/phortune-invoice.css b/webroot/rsrc/css/application/phortune/phortune-invoice.css new file mode 100644 index 0000000000..59199f0c94 --- /dev/null +++ b/webroot/rsrc/css/application/phortune/phortune-invoice.css @@ -0,0 +1,75 @@ +/** + * @provides phortune-invoice-css + */ + +.phortune-invoice-view { + max-width: 800px; + margin: 16px auto; + background: #fff; +} + +.phortune-invoice-view .phabricator-main-menu { + display: none; +} + +.phortune-invoice-view .phabricator-standard-page-footer { + display: none; +} + +.device-desktop .phortune-invoice-view .phui-property-list-key { + width: 16%; +} + +.device-desktop .phortune-invoice-view .phui-property-list-value { + width: 80%; +} + +.phortune-invoice-logo { + margin-bottom: 24px; +} + +.phortune-invoice-logo img { + margin: 0 auto; +} + +.phortune-invoice-contact { + margin-bottom: 32px; +} + +.phortune-invoice-contact td { + padding: 4px 16px; +} + +.phortune-invoice-to { + border-right: 1px solid {$lightblueborder}; +} + +.phortune-mini-header { + color: {$lightbluetext}; + font-weight: bold; + text-transform: uppercase; + margin-bottom: 4px; + letter-spacing: 0.25em; +} + +.phortune-invoice-status { + margin-bottom: 24px; +} + +.phortune-invoice-status .phui-info-view { + margin: 0; +} + +.phortune-invoice-view .phui-box.phui-object-box { + margin-bottom: 24px; +} + +.phortune-invoice-footer { + color: {$lightgreytext}; + margin: 48px 0 64px; + text-align: center; +} + +.phortune-invoice-footer strong { + color: #000; +} diff --git a/webroot/rsrc/css/application/phortune/phortune.css b/webroot/rsrc/css/application/phortune/phortune.css new file mode 100644 index 0000000000..0d739eeb80 --- /dev/null +++ b/webroot/rsrc/css/application/phortune/phortune.css @@ -0,0 +1,27 @@ +/** + * @provides phortune-css + */ + +.phortune-payment-icon { + width: 34px; + height: 34px; +} + +.phortune-payment-onetime-list { + width: 280px; +} + +.phortune-payment-onetime-list button { + margin: 0 0 8px 0; + width: 100%; +} + +.printable.phortune-cart-page .phui-two-column-view .phui-two-column-content + .phui-main-column { + width: auto; +} + +.printable.phortune-cart-page .phui-two-column-view .phui-two-column-content + .phui-side-column { + display: none; +} diff --git a/webroot/rsrc/css/application/phrequent/phrequent.css b/webroot/rsrc/css/application/phrequent/phrequent.css index 0e5c280605..3a2e2bfc89 100644 --- a/webroot/rsrc/css/application/phrequent/phrequent.css +++ b/webroot/rsrc/css/application/phrequent/phrequent.css @@ -15,6 +15,6 @@ } .phrequent-on-stack { - color: #777777; + color: {$greytext}; background-image: url(http://github.com/rsrc/image/phrequent_inactive.png); } diff --git a/webroot/rsrc/css/application/phriction/phriction-document-css.css b/webroot/rsrc/css/application/phriction/phriction-document-css.css index f04a1e147a..228515b3b3 100644 --- a/webroot/rsrc/css/application/phriction/phriction-document-css.css +++ b/webroot/rsrc/css/application/phriction/phriction-document-css.css @@ -2,48 +2,10 @@ * @provides phriction-document-css */ -.phriction-header { - background: #eeeeee; - border-bottom: 1px solid #dddddd; - padding: 1em; -} - -.phriction-header a.button { - float: right; - margin: 0em 0em 0em 1%; -} - -.phriction-header h1 { - margin: .25em 0; -} - -.phriction-breadcrumbs { - font-size: 12px; - color: #666666; -} - .phriction-document-crumbs a { font-weight: bold; } -.phriction-children ul { - margin-left: 30px; - padding-bottom: 10px; - list-style: circle; - color: #999999; -} - -.phriction-children-header { - background: #f7f7f7; - padding: 10px 0 10px 20px; - font-weight: bold; - margin-bottom: 15px; -} - -.phriction-document-history-diff { - padding: 0 2em 2em; -} - .phriction-revert-table { width: 100%; } @@ -51,7 +13,9 @@ .phriction-revert-table td { text-align: center; width: 50%; - padding: .5em 0; + padding: 8px 0; + margin: 0 16px; + border-top: 1px solid {$lightblueborder}; } .phriction-history-nav-table { @@ -60,13 +24,11 @@ .phriction-history-nav-table td { width: 50%; - color: #444444; + color: {$darkgreytext}; + padding: 12px; + background-color: {$lightgreybackground}; } .phriction-history-nav-table td.nav-next { text-align: right; } - -.phui-document-content .phriction-link { - font-weight: bold; -} diff --git a/webroot/rsrc/css/application/policy/policy-edit.css b/webroot/rsrc/css/application/policy/policy-edit.css new file mode 100644 index 0000000000..ba02691b51 --- /dev/null +++ b/webroot/rsrc/css/application/policy/policy-edit.css @@ -0,0 +1,36 @@ +/** + * @provides policy-edit-css + */ + +.policy-rules-table { + width: 100%; +} + +.policy-rules-table td { + padding: 4px 8px 4px 0; + width: 32px; + vertical-align: middle; +} + +.policy-rules-table td.remove-column { + padding-right: 0; +} + +.policy-rules-table td.action-cell { + width: 120px; +} + +.policy-rules-table td.rule-cell { + width: 180px; +} + +.policy-rules-table td.value-cell { + width: auto; + padding-right: 12px; +} + +.policy-rules-table td.action-cell select, +.policy-rules-table td.rule-cell select, +.policy-rules-table td input { + width: 100%; +} diff --git a/webroot/rsrc/css/application/policy/policy-transaction-detail.css b/webroot/rsrc/css/application/policy/policy-transaction-detail.css new file mode 100644 index 0000000000..1715ebe5e4 --- /dev/null +++ b/webroot/rsrc/css/application/policy/policy-transaction-detail.css @@ -0,0 +1,19 @@ +/** + * @provides policy-transaction-detail-css + */ + +.policy-transaction-detail-intro { + margin-bottom: 12px; +} + +.policy-transaction-detail-row { + margin: 4px 0px 4px 8px; +} + +.policy-transaction-detail-row .phui-icon-view { + padding-right: 4px; +} + +.policy-transaction-detail-end { + margin-top: 12px; +} diff --git a/webroot/rsrc/css/application/policy/policy.css b/webroot/rsrc/css/application/policy/policy.css new file mode 100644 index 0000000000..348853990d --- /dev/null +++ b/webroot/rsrc/css/application/policy/policy.css @@ -0,0 +1,18 @@ +/** + * @provides policy-css + */ + +.policy-capability-explanation .phui-icon-view { + display: inline-block; + vertical-align: text-top; +} + +.policy-capability-explanation { + margin: 8px 0 0; +} + +.policy-capability-explanation a { + line-height: 14px; + margin-left: 4px; + color: {$bluetext}; +} diff --git a/webroot/rsrc/css/application/ponder/comments.css b/webroot/rsrc/css/application/ponder/comments.css deleted file mode 100644 index 67e4cd2d82..0000000000 --- a/webroot/rsrc/css/application/ponder/comments.css +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @provides ponder-comment-table-css - */ - -.ponder-show-comments { - text-align: center; - padding: 8px 0; - font-weight: bold; - background: #f9f9f9; - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - border-bottom: 1px solid #b7b7b7; -} - -.ponder-comments { - width: 480px; - margin: 5px 0 0 60px; -} - -.device .ponder-comments { - width: 100%; - margin: 5px 0 0 0; -} - -.ponder-comments th { - width: 0px; - height: 0px; -} - -.ponder-comments td { - vertical-align: top; - padding: 6px; - border-bottom: 1px solid #e7e7e7; - background: #fff; -} - -.ponder-datestamp { - font-size: 11px; - color: #777; -} - -.ponder-label { - display: block; - width: 100%; - font-weight: bold; - color: #333; - text-align: left; - margin: 0px 0px 6px; - padding: 6px 4px; - background: #ccc; - border-bottom: 1px solid #aaa; - cursor: pointer; -} - -td .aphront-form-control { - padding: 0; -} - -td .aphront-form-control-submit { - display: block; -} - -td .aphront-form-input { - margin: 0; - width: 100%; -} - -td .aphront-form-control textarea { - height: 50px; -} - -.ponder-comment-markup p { - margin: 0 0 5px 0; -} - -.ponder-comment-markup h2, -.ponder-comment-markup h3, -.ponder-comment-markup h4, -.ponder-comment-markup h5 { - margin: 0; - font-size: inherit; - font-weight: normal; -} diff --git a/webroot/rsrc/css/application/ponder/feed.css b/webroot/rsrc/css/application/ponder/feed.css deleted file mode 100644 index e2c0eefb21..0000000000 --- a/webroot/rsrc/css/application/ponder/feed.css +++ /dev/null @@ -1,74 +0,0 @@ -/** - * @provides ponder-feed-view-css - */ - -.ponder-question-summary { - width: 100%; - background: #DFDFE3; - float: left; - clear: both; - margin-top: 1px; - padding: 1px; -} - -.ponder-answer-summary { - width : 100%; - background : #DFDFE3; - float : left; - clear : both; - margin-top : 1px; - padding : 1px; -} - -.ponder-summary-votes { - width : 50px; - height : 36pt; - font-size : 18pt; - text-align : center; - background : #EEE; - border : 1px solid #BBB; - float : left; - margin : 2px; - padding-top : 2px; -} - -.ponder-summary-answers { - width : 50px; - height : 36pt; - font-size : 18pt; - text-align : center; - background : #EEE; - border : 1px solid #BBB; - float : left; - margin : 2px; - padding-top : 2px; -} - -.ponder-question-label { - font-size : 6pt; -} - -h2.ponder-question-title { - font-size : 12pt; - margin : 2px; - padding : 0; -} - -h2.ponder-answer-title { - font-size : 12pt; - margin : 2px; - padding : 0; -} - -.ponder-metadata { - padding-left : 5px; - width : 650px; - float : left; -} - -.ponder-small-metadata { - font-size : 7.5pt; - color : #555; - margin : 0; - text-align : right; -} diff --git a/webroot/rsrc/css/application/ponder/ponder-view.css b/webroot/rsrc/css/application/ponder/ponder-view.css new file mode 100644 index 0000000000..966fb6a1fb --- /dev/null +++ b/webroot/rsrc/css/application/ponder/ponder-view.css @@ -0,0 +1,145 @@ +/** + * @provides ponder-view-css + */ + +.ponder-question-container { + border-top: 1px solid {$thinblueborder}; +} + +.device .ponder-view-properties { + border-left: none; + border-right: none; + border-radius: 0; +} + +.device .ponder-question-view .phui-timeline-view, +.device .ponder-question-view .phui-timeline-event-view { + margin: 0; + padding: 0; +} + +.ponder-view-properties .phui-property-list-container { + margin: 0; + padding: 0; +} + +.ponder-question-view .phui-document-container { + border: none; +} + +.phui-two-column-view .phui-main-column .ponder-question-content + .phui-box.ponder-answer-wiki { + margin: 24px 0; +} + +.ponder-answer-wiki .phabricator-remarkup { + padding: 16px; +} + +.ponder-question-content .phui-timeline-view { + padding-right: 0; +} + +.ponder-answer-view { + margin-top: 16px; +} + +.device-desktop .ponder-answer-view .phui-timeline-view { + margin-left: 32px; +} + +.ponder-answer-view .phui-header-subheader { + display: inline; + margin-left: 12px; +} + +.ponder-question-view .ponder-answer .phui-header-shell { + padding: 4px 8px 3px 8px; +} + +.ponder-answer-view .phui-header-image-href { + display: flex; +} + +.ponder-answer-view .phui-header-view .phui-header-header { + font-size: 15px; +} + +.ponder-answer-view .phui-header-col1 { + width: 40px; +} + +.ponder-answer-view .ponder-answer-content { + background-color: #fff; + padding: 16px 16px 0 16px; +} + +.device-phone .ponder-answer-view .ponder-answer-content { + padding: 12px 12px 0 12px; +} + +.ponder-answer-view .phui-header-image { + height: 30px; + width: 30px; + border-radius: 3px; +} + +.ponder-answer-wiki-header { + font-weight: bold; + border-bottom: 1px solid {$lightblueborder}; + color: {$bluetext}; + padding-bottom: 8px; + margin-bottom: 16px; +} + +.ponder-footer-view { + text-align: left; + margin-top: 16px; + border-bottom: 1px solid {$thinblueborder}; +} + +.ponder-answer-view .ponder-footer-view { + margin-top: 16px; + border-top: 1px solid rgba({$alphagrey}, .15); + border-bottom: none; +} + +body .phui-main-column .ponder-question-content .ponder-answer-view + .phui-object-box.ponder-answer { + margin: 0; + padding: 0; +} + +.ponder-footer-view .ponder-footer-action { + padding: 8px 0; + margin-right: 8px; + display: inline-block; +} + +.ponder-answer-section { + margin-top: 48px; +} + +.ponder-add-answer-header { + margin-top: 64px; + margin-bottom: 20px; +} + +.ponder-add-answer-view { + margin-top: 16px; +} + +.ponder-question-content div.ponder-question-add-comment-view + div.phui-box.phui-object-box { + margin-right: 0; + margin-left: 62px; +} + +.device .ponder-question-content div.ponder-question-add-comment-view + div.phui-box.phui-object-box { + margin: 0; +} + +.ponder-question-add-comment-view .remarkup-assist-textarea { + height: 8em; +} diff --git a/webroot/rsrc/css/application/ponder/post.css b/webroot/rsrc/css/application/ponder/post.css deleted file mode 100644 index 4be6f5f5e1..0000000000 --- a/webroot/rsrc/css/application/ponder/post.css +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @provides ponder-post-css - */ - -.ponder-post-list { - max-width: 1162px; -} - -.ponder-add-answer-panel { - max-width: 1162px; -} - -.ponder-post-list .anchor-target { - background-color: #ffffdd; - border-color: #ffff00; -} - -.ponder-post-core .phabricator-remarkup .remarkup-code-block { - width: 88ex; - width: 81ch; -} - -.ponder-question { - background : white; -} - -.phabricator-transaction-view .ponder-question { - background : white; -} - -.phabricator-transaction-detail .ponder-question { - border : none; -} - - -.phabricator-transaction-view .ponder-answer { - background : white; - margin-bottom : 0; -} - -.phabricator-transaction-content { - background : white; -} diff --git a/webroot/rsrc/css/application/ponder/vote.css b/webroot/rsrc/css/application/ponder/vote.css deleted file mode 100644 index 04357a2c70..0000000000 --- a/webroot/rsrc/css/application/ponder/vote.css +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @provides ponder-vote-css - */ - -.ponder-votable { - float: right; - margin: 4px 0 4px 24px; -} - -.ponder-votebox { - border-radius: 4px; - background: #f3f3f3; - border: 1px solid #d7d7d7; - box-shadow: 1px 1px rgba(0, 0, 0, 0.05); - text-align: center; - width: 24px; -} - -.ponder-votebox a { - font-size: 20px; - line-height: 24px; - display: block; - - text-decoration: none; - color: #aaaaaa; - font-weight: normal; -} - -.ponder-votebox a.ponder-vote-active { - color: {$blue}; -} - -.ponder-votebox a:hover { - color: #ffffff; - background: {$blue}; -} - -.ponder-vote-count { - color: #333333; - font-size: 14px; - line-height: 20px; - font-weight: bold; -} diff --git a/webroot/rsrc/css/application/profile/profile-view.css b/webroot/rsrc/css/application/profile/profile-view.css deleted file mode 100644 index e42d421c4b..0000000000 --- a/webroot/rsrc/css/application/profile/profile-view.css +++ /dev/null @@ -1,128 +0,0 @@ -/** - * @provides phabricator-profile-css - */ - -table.phabricator-profile-master-layout { - width: 100%; -} - -td.phabricator-profile-navigation { - width: 300px; - background: #efefef; - border-right: 1px solid #cccccc; - padding-top: 8px; - padding-bottom: 8em; -} - -td.phabricator-profile-navigation a, -td.phabricator-profile-navigation span { - display: block; - margin: 0 0 2px; - min-width: 150px; - font-weight: bold; - white-space: nowrap; - text-decoration: none; -} - -td.phabricator-profile-navigation a { - padding: 4px 8px 4px 10px; -} - -td.phabricator-profile-navigation a:hover { - text-decoration: none; - background: #cccccc; -} - -td.phabricator-profile-navigation a.phabricator-profile-item-selected, -td.phabricator-profile-navigation a.phabricator-profile-item-selected :hover { - background: #cccccc; -} - -td.phabricator-profile-navigation hr { - border: none; - background: #cccccc; - padding: 0; - margin: 10px 0; - height: 1px; -} - -td.phabricator-profile-navigation h1, -td.phabricator-profile-navigation h2 { - padding: 2px 0px 0px 10px; -} - -td.phabricator-profile-content { - padding: 2em 2%; -} - -.phabricator-profile-info-table th { - font-weight: bold; - text-align: right; - color: #666666; - width: 10%; - padding: 4px; -} - -.phabricator-profile-info-table td { - width: 100%; - padding: 4px; -} - -.phabricator-profile-info-group { - box-shadow: 0 1px 1px rgba(0,0,0,.4); -} - -.phabricator-profile-info-header { - padding: 8px; - background: #e7e7e7; - border-bottom: 1px solid #d9d9d9; -} - -.phabricator-profile-info-pane { - padding: 8px .5em; - background: #fff; -} - -.phabricator-profile-info-table { - width: 100%; -} - -h2.phabricator-profile-realname { - color: #666666; -} - -img.phabricator-profile-image { - width: 280px; - margin: 10px; -} - -.phabricator-profile-info-pane-more-link { - text-align: right; - padding: .25em; - font-weight: bold; - margin: .5em 1em 0; -} - -.profile-wrap-responsive { - margin: 20px; -} - -.device .profile-wrap-responsive { - margin-left: 10px; - margin-right: 10px; -} - -.device-desktop .profile-feed { - max-width: 640px; -} - -.profile-feed .phabricator-action-header-title { - font-size: 16px; - margin-bottom: 5px; -} - -.device-desktop .phabricator-project-layout - .aphront-multi-column-column-outer:first-child - .phabricator-profile-info-group { - margin-right: 0; -} diff --git a/webroot/rsrc/css/application/project/project-card-view.css b/webroot/rsrc/css/application/project/project-card-view.css new file mode 100644 index 0000000000..f8ab045254 --- /dev/null +++ b/webroot/rsrc/css/application/project/project-card-view.css @@ -0,0 +1,201 @@ +/** + * @provides project-card-view-css + */ + +.project-card-view { + margin: 0 12px 16px 0; + text-align: left; + background: {$page.content}; + border: 1px solid {$lightblueborder}; + border-radius: 3px; + box-shadow: {$dropshadow}; + width: 420px; + position: relative; +} + +.project-card-view .phui-header-shell { + margin: 0; + padding: 12px 12px 4px 12px; + border: none; + border-radius: 3px; +} + +.project-card-view .phui-header-shell .phui-header-image { + border: 3px solid {$page.content}; + border-radius: 3px; + background-color: {$page.content}; +} + +.project-card-view .phui-header-shell .phui-header-header { + font-size: 18px; + width: 290px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + display: block; +} + +.project-card-view .project-card-image { + position: absolute; + height: 140px; + width: 140px; + top: 6px; + left: 6px; + border-radius: 3px; +} + +.project-card-view .project-card-image-href { + display: block; +} + +.project-card-view .project-card-item div { + display: inline; +} + +.project-card-inner { + position: relative; +} + +.people-card-view .project-card-inner { + padding: 6px; + min-height: 140px; +} + +.project-card-view .project-card-item { + margin-bottom: 2px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.project-card-view .project-card-item-text { + color: {$greytext}; +} + +.project-card-view .project-card-item-exiled { + background-color: {$lightredbackground}; + border-radius: 4px; + padding: 2px 8px; + margin: 2px 0; +} + +.project-card-view .project-card-item-exiled .project-card-item-text { + color: {$red}; +} + +.project-card-view .project-card-item-icon { + width: 20px; +} + +.project-card-view .project-card-header { + margin-top: 6px; + margin-left: 152px; + overflow: hidden; +} + +.project-card-header .project-card-name { + font-size: 20px; + font-weight: bold; + color: {$blacktext}; + margin-bottom: 2px; + text-overflow: ellipsis; + white-space: nowrap; + width: 250px; + overflow: hidden; +} + +.project-card-header .project-card-username { + font-size: 14px; + color: {$bluetext}; + margin-bottom: 12px; +} + +.project-card-view .phui-header-shell .phui-header-col1 { + vertical-align: top; + width: 64px; +} + +.project-card-view .phui-header-subheader { + font-size: {$normalfontsize}; + margin-top: 12px; + padding-bottom: 12px; +} + +.project-card-view .phui-header-header .phui-tag-view { + display: block; + font-weight: normal; + color: {$bluetext}; + font-size: {$normalfontsize}; + font-family: {$fontfamily}; + margin-top: 8px; +} + +.people-card-view .phui-header-subheader .phui-tag-core { + text-overflow: ellipsis; + white-space: nowrap; + max-width: 232px; + overflow: hidden; + display: inline-block; +} + +.project-card-view .phui-header-header .phui-tag-view .phui-tag-core { + padding: 0; +} + +.project-card-view .phui-header-header .phui-tag-view .phui-icon-view { + margin-left: 0; + color: {$bluetext}; +} + +.project-card-view .project-card-body { + padding: 0 12px 12px 12px; + color: {$darkbluetext}; +} + +/* Colors */ + +.project-card-view.project-card-red .phui-header-shell { + background: linear-gradient(to bottom, + {$sh-redbackground} 42px, {$page.content} 42px); +} + +.project-card-view.project-card-orange .phui-header-shell { + background: linear-gradient(to bottom, + {$sh-orangebackground} 42px, {$page.content} 42px); +} + +.project-card-view.project-card-yellow .phui-header-shell { + background: linear-gradient(to bottom, + {$sh-yellowbackground} 42px, {$page.content} 42px); +} + +.project-card-view.project-card-green .phui-header-shell { + background: linear-gradient(to bottom, + {$sh-greenbackground} 42px, {$page.content} 42px); +} + +.project-card-view.project-card-blue .phui-header-shell { + background: linear-gradient(to bottom, + {$sh-bluebackground} 42px, {$page.content} 42px); +} + +.project-card-view.project-card-indigo .phui-header-shell { + background: linear-gradient(to bottom, + {$sh-indigobackground} 42px, {$page.content} 42px); +} + +.project-card-view.project-card-violet .phui-header-shell { + background: linear-gradient(to bottom, + {$sh-violetbackground} 42px, {$page.content} 42px); +} + +.project-card-view.project-card-pink .phui-header-shell { + background: linear-gradient(to bottom, + {$sh-pinkbackground} 42px, {$page.content} 42px); +} + +.project-card-view.project-card-grey .phui-header-shell, +.project-card-view.project-card-checkered .phui-header-shell { + background: linear-gradient(to bottom, + {$sh-greybackground} 42px, {$page.content} 42px); +} diff --git a/webroot/rsrc/css/application/project/project-triggers.css b/webroot/rsrc/css/application/project/project-triggers.css new file mode 100644 index 0000000000..67705df146 --- /dev/null +++ b/webroot/rsrc/css/application/project/project-triggers.css @@ -0,0 +1,39 @@ +/** + * @provides project-triggers-css + */ + +.trigger-rules-table { + margin: 16px 0; + border-collapse: separate; + border-spacing: 0 4px; +} + +.trigger-rules-table tr { + background: {$bluebackground}; +} + +.trigger-rules-table td { + padding: 6px 4px; + vertical-align: middle; +} + +.trigger-rules-table td.type-cell { + padding-left: 6px; +} + +.trigger-rules-table td.remove-column { + padding-right: 6px; +} + +.trigger-rules-table td.invalid-cell { + padding-left: 12px; + width: 100%; +} + +.trigger-rules-table td.invalid-cell .phui-icon-view { + margin-right: 4px; +} + +.trigger-rules-table td.value-cell { + width: 100%; +} diff --git a/webroot/rsrc/css/application/project/project-view.css b/webroot/rsrc/css/application/project/project-view.css new file mode 100644 index 0000000000..82c5a2e13b --- /dev/null +++ b/webroot/rsrc/css/application/project/project-view.css @@ -0,0 +1,84 @@ +/** + * @provides project-view-css + */ + +.project-view-people-home.phui-two-column-view .phui-two-column-header { + background: transparent; + border: none; + margin-bottom: 8px; +} + +.project-view-header-tag { + margin-left: 8px; + font-size: {$normalfontsize}; + color: {$bluetext}; + font-family: {$fontfamily}; + font-weight: normal; +} + +.device-phone .project-view-header-tag { + display: block; + margin-left: -4px; +} + +.project-view-header-tag .phui-icon-view { + color: {$bluetext}; +} + +.device .project-view-home .phui-two-column-row { + display: flex; + flex-direction: column-reverse; +} + +.project-view-home .phui-box.project-view-properties { + margin: 0 0 16px 0; + padding: 0; +} + +.device-desktop .phui-two-column-view .project-view-properties + .phui-property-list-container { + padding: 12px 0; + } + +.project-view-properties .phui-property-list-container + + .phui-property-list-text-content { + border-color: {$thinblueborder}; +} + +.project-view-properties .phui-property-list-key { + width: auto; + margin-left: 4px; +} + +.project-view-properties .phui-property-list-section-header { + border: none; + padding: 12px 4px 0; +} + +.project-view-home .phui-side-column .phui-object-box .phui-header-shell { + padding: 6px 6px 6px 12px; +} + +.project-view-home .phui-side-column .phui-object-box + div.phui-info-severity-nodata { + color: {$lightgreytext}; + font-style: italic; + border: none; + text-align: center; +} + +.project-view-home .phui-box-grey .phui-oi-attribute .phui-icon-view { + color: {$lightgreytext}; +} + +.profile-no-badges { + padding: 24px 0; +} + +.people-profile-header.phui-profile-header .phui-header-col1 { + display: none; +} + +.device .people-profile-header.phui-profile-header .phui-header-col1 { + display: table-cell; +} diff --git a/webroot/rsrc/css/application/projects/phabricator-object-list-view.css b/webroot/rsrc/css/application/projects/phabricator-object-list-view.css deleted file mode 100644 index 3336794807..0000000000 --- a/webroot/rsrc/css/application/projects/phabricator-object-list-view.css +++ /dev/null @@ -1,27 +0,0 @@ -/** - * @provides phabricator-object-list-view-css - */ - -.phabricator-object-list-view { - max-height: 400px; - overflow-y: auto; -} - -.phabricator-object-list-view-item { - line-height: 60px; - background-repeat: no-repeat; - background-position: 5px 5px; - padding-left: 70px; - position: relative; -} - -.phabricator-object-list-view-item + .phabricator-object-list-view-item { - border-top: 1px solid rgba(0, 0, 0, 0.05); -} - -.phabricator-object-list-view-buttons { - position: absolute; - text-align: right; - top: 0; - right: 0; -} diff --git a/webroot/rsrc/css/application/projects/project-tag.css b/webroot/rsrc/css/application/projects/project-tag.css deleted file mode 100644 index 416a34d79b..0000000000 --- a/webroot/rsrc/css/application/projects/project-tag.css +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @provides phabricator-project-tag-css - */ - -.phabricator-project-tag, -.phabricator-project-tag:link, -.phabricator-project-tag:visited { - font-weight: normal; - border: 1px solid #bfcfef; - padding: 1px 4px 2px; - background: #f9f9ff; - color: #667799; - text-decoration: none; - font-size: 11px; - display: inline; - cursor: pointer; - margin-right: 2px; - - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - - white-space: nowrap; -} - -.phabricator-project-tag.phabricator-project-tag-grey { - border: 1px solid #ccc; - background: #f7f7f7; - color: #888; -} - -.phabricator-project-tag.phabricator-project-tag-grey:hover { - background: #e7e7e7; -} - -.phabricator-project-tag:last-child { - margin-right: 0px; -} - -.phabricator-project-tag:hover { - background: #dfdfef; -} diff --git a/webroot/rsrc/css/application/releeph/releeph-branch.css b/webroot/rsrc/css/application/releeph/releeph-branch.css deleted file mode 100644 index 2bc7c83a74..0000000000 --- a/webroot/rsrc/css/application/releeph/releeph-branch.css +++ /dev/null @@ -1,79 +0,0 @@ -/** - * @provides releeph-branch - */ - -.releeph-branch-box { - margin-bottom: .5em; - padding: .5em .5em .5em; - - border: 2px solid #d5d5d5; - /*border-top-color: #D5D5D5; - border-right-color: #BBB; - border-bottom-color: #A4A4A4; - border-left-color: #BBB;*/ - - background: #bbb; -} - -/* Types of branch */ - -.releeph-branch-box-named { - background: #ddd; -} - -.releeph-branch-box-latest { - background: #ffd; -} - -/* Branch symbolic name and full name */ - -.releeph-branch-box .names { - width: 25em; - float: left; - margin-bottom: 1em; -} - -.releeph-branch-box .names h1 { - font-size: 125%; - padding: 0px; -} - -.releeph-branch-box .names h2 { - font-weight: normal; - font-size: 85%; -} - -/* Date info */ - -.releeph-branch-box .date-info { - width: 10%; - float: left; - color: #555; - margin-bottom: .3em; -} - -/* Statistics table */ - -.releeph-branch-box .request-statistics { - float: right; - padding-right: 2em; - font-size: 85%; -} - -.releeph-branch-box .request-statistics th { - width: 1em; - text-align: right; - padding-right: .4em; - padding-left: .4em; -} - -.releeph-branch-box .request-statistics td { - white-space: nowrap; - font-style: italic; -} - -/* Buttons */ - -.releeph-branch-box .buttons { - float: right; -} diff --git a/webroot/rsrc/css/application/releeph/releeph-colors.css b/webroot/rsrc/css/application/releeph/releeph-colors.css deleted file mode 100644 index 481ff7031b..0000000000 --- a/webroot/rsrc/css/application/releeph/releeph-colors.css +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @provides releeph-colors - */ - -.releeph-border-color-failed { - border-color: #d2d; -} - -.releeph-border-color-requested { - border-color: #ddd; -} - -.releeph-border-color-comment { - border-color: #ddd; -} - -.releeph-border-color-needs-pick { - border-color: #096; -} - -.releeph-border-color-rejected { - border-color: #d00; -} - -.releeph-border-color-needs-revert { - border-color: #d00; -} - -.releeph-border-color-abandoned { - border-color: #222; -} - -.releeph-border-color-picked { - border-color: #069; -} diff --git a/webroot/rsrc/css/application/releeph/releeph-core.css b/webroot/rsrc/css/application/releeph/releeph-core.css deleted file mode 100644 index fdeb2810c9..0000000000 --- a/webroot/rsrc/css/application/releeph/releeph-core.css +++ /dev/null @@ -1,199 +0,0 @@ -/** - * @provides releeph-core - */ - -.releeph-request-header { - margin: .5em 2em 3em; - - /** - * Copied from the old .differential-panel, present in commit - * f04d8ab1a747dc9719d378d9286088b677ce224c - * - * (As is the

    code below) - */ - max-width: 1120px; - border: 1px solid #666622; - background: #efefdf; - padding: 15px 20px; - font-size: 13px; -} - -.releeph-request-header h1 { - width: 100%; - border-bottom: 1px solid #aaaa99; - padding-bottom: 8px; - margin-bottom: 8px; - position: relative; -} - -.releeph-request-header .focus-char { - left: -10px; - display: none; - float: left; - position: absolute; - top: 0px; - left: -1em; - - font-weight: bold; - - color: #880; - font-family: "Hiragino Kaku Gothic Pro", "Osaka", "Zapf Dingbats"; -} - -.releeph-request-header.focus .focus-char { - display: block; -} - -.releeph-request-header-border { - border-width: 1px 10px 1px; - border-color: #ddd; -} - - -/* Laying out properties / fields */ - -.releeph-request-header table.panes { - width: 100%; -} - -.releeph-request-header table.panes td.side { - width: 50%; - max-width: 1em; -} - -.releeph-request-header table.panes td.side.left { - padding-right: 20px; - border-right: 3px solid #bbb; -} - -.releeph-request-header table.panes td.side.right { - padding-left: 20px; -} - -.releeph-request-header table.panes td.side table.fields { - width: 100%; -} - -.releeph-request-header table.panes td.side table.fields tr { - vertical-align: middle; -} - -.releeph-request-header table.panes td.side table.fields th { - font-weight: bold; - text-align: right; - padding-right: 1em; - white-space: nowrap; -} - -.releeph-request-header table.panes td.side table.fields td { - width: 100%; /* wide! */ - max-width: 1em; -} - - -/* Buttons */ - -.releeph-request-header .button-divider { - clear: both; - margin-top: 1.5em; - border-top: 1px solid #bbb; -} - -.releeph-request-header .buttons { - width: 100%; -} - -.releeph-request-header .buttons tr { - padding: 1em; - margin: 3em; -} - -.releeph-request-header .buttons td { - padding: 1em .5em 0.2em; -} - -.releeph-request-header .buttons td.wide { - width: 100%; -} - -/* Colors: match differential colors */ - -.releeph-request-comment { - border-color: #ddd; -} - -.releeph-request-comment-pusher { - background: #8DEE8D; - border-color: #096; -} - -.releeph-request-comment-pusher div { - background: #8DEE8D; -} - -/* The diff size bar */ - -.releeph-request-header .diff-bar { - border: 0px; -} - -.releeph-request-header .diff-bar div { - width: 100px; - border: 1px solid; - border-top-color: #A4A4A4; - border-right-color: #BBB; - border-bottom-color: #D5D5D5; - border-left-color: #BBB; - background: white; - float: left; - margin-right: 1em; -} - -.releeph-request-header .diff-bar div div { - height: 10px; -} - -.releeph-request-header .diff-bar span { - color: #555; -} - -/* Rendering pick / commit errors, etc. */ - -.releeph-request-pick-failed-event h1:before { - content: '\2014 '; -} - -.releeph-request-pick-failed-event h1:after { - content: ' \2014'; -} - -.releeph-request-pick-failed-event h1 { - padding: 3px 10px 3px; - margin-bottom: 0.5em; - background: #ffb; - font-size: small; -} - -.releeph-request-pick-failed-event div { - font-family: monospace; - margin-bottom: 1.5em; - padding-left: 1em; - width: 70em; -} - -/* History view of request */ - -.releeph-request-event-list { - margin: .5em 2em .5em; -} - - -/* Shorten long header-text */ - -.releeph-header-text-truncated { - width: 100%; - float: left; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} diff --git a/webroot/rsrc/css/application/releeph/releeph-intents.css b/webroot/rsrc/css/application/releeph/releeph-intents.css deleted file mode 100644 index 9e7691149b..0000000000 --- a/webroot/rsrc/css/application/releeph/releeph-intents.css +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @provides releeph-intents - */ - -.releeph-intents .intents { - clear: left; - width: 100%; - margin-top: 3px; -} - -.releeph-intents .arrow { - float: left; - clear: left; - margin-right: 0.4em; - padding: 8px; - background: transparent 0 0 no-repeat; -} - -.releeph-intents .arrow.want { - background-image: url('http://github.com/rsrc/custom/image/icon/tango/go-next.png'); -} - -.releeph-intents .arrow.pass { - background-image: url('http://github.com/rsrc/custom/image/icon/tango/go-previous-gray.png'); -} - -.releeph-intents a { - margin-right: 0.4em; -} - -.releeph-intents .pusher { - font-weight: bold; -} - -.releeph-intents .requestor { - font-weight: normal; -} diff --git a/webroot/rsrc/css/application/releeph/releeph-preview-branch.css b/webroot/rsrc/css/application/releeph/releeph-preview-branch.css deleted file mode 100644 index 2bce6632d4..0000000000 --- a/webroot/rsrc/css/application/releeph/releeph-preview-branch.css +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @provides releeph-preview-branch - */ - -.releeph-preview-branch { - min-height: 4em; - position: relative; -} - -.releeph-preview-branch .error { - padding-left: 22px; - background-repeat: no-repeat; - background-size: 16px auto; - background-image: url(http://github.com/rsrc/custom/image/releeph/releeph_warning.png); - float: left; - position: absolute; - top: 2.5em; -} - -.releeph-preview-branch .name { - clear: both; - float: left; - position: absolute; - font-family: monospace; - font-size: 9pt !important; - background: white; - top: 0.7em; - padding: 2px; -} diff --git a/webroot/rsrc/css/application/releeph/releeph-project.css b/webroot/rsrc/css/application/releeph/releeph-project.css deleted file mode 100644 index 3a14751bdd..0000000000 --- a/webroot/rsrc/css/application/releeph/releeph-project.css +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @provides releeph-project - */ - -/** - * ...from aphront-transaction.css - */ - -.releeph-pusher { - background: 2px 2px no-repeat; - margin-top: 1em; - margin-bottom: 1.25em; - margin-right: 1em; - min-height: 50px; - padding: 2px 0px; - - background-color: white; - border: 2px solid gray; - float: left; -} - -.releeph-pusher-body { - margin-left: 54px; - padding: 1em; -} diff --git a/webroot/rsrc/css/application/releeph/releeph-request-differential-create-dialog.css b/webroot/rsrc/css/application/releeph/releeph-request-differential-create-dialog.css deleted file mode 100644 index 7101f78789..0000000000 --- a/webroot/rsrc/css/application/releeph/releeph-request-differential-create-dialog.css +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @provides releeph-request-differential-create-dialog - */ - -.releeph-request-differential-create-dialog h1 { - color: gray; - font-style: italic; - font-size: 16px; - margin-top: 0.8em; -} - -.releeph-request-differential-create-dialog a { - font-weight: bold; - margin-left: 2em; - display: block; - margin-top: 1em; -} diff --git a/webroot/rsrc/css/application/releeph/releeph-request-typeahead.css b/webroot/rsrc/css/application/releeph/releeph-request-typeahead.css deleted file mode 100644 index 91a81acea6..0000000000 --- a/webroot/rsrc/css/application/releeph/releeph-request-typeahead.css +++ /dev/null @@ -1,27 +0,0 @@ -/** - * @provides releeph-request-typeahead-css - */ - -.releeph-request-typeahead .commit-id { - color: #aaf; /* blue... */ - font-family: monospace; - font-size: 100%; - display: block; - float: left; -} - -.releeph-request-typeahead .author-info { - color: #080; /* ...and green, for search results! */ - text-align: right; - display: block; - float: right; - padding-left: 1em; -} - -.releeph-request-typeahead .focused .author-info { - color: #8b8; -} - -.releeph-request-typeahead .summary { - clear: both; -} diff --git a/webroot/rsrc/css/application/releeph/releeph-status.css b/webroot/rsrc/css/application/releeph/releeph-status.css deleted file mode 100644 index f41330e977..0000000000 --- a/webroot/rsrc/css/application/releeph/releeph-status.css +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @provides releeph-status - */ - -.releeph-status .description { - background: #d3d3d3; - padding: 2px 6px 3px; - margin-right: 4px; - margin-bottom: 5px; - display: block; - float: left; - border-radius: 8px; - -moz-border-radius: 8px; - -webkit-border-radius: 8px; - text-decoration: none; -} - -.releeph-status .warning { - margin-top: 2px; - margin-left: 0.8em; - float: left; - padding-left: 22px; - background-repeat: no-repeat; - background-size: 16px auto; - background-image: url(http://github.com/rsrc/custom/image/releeph/releeph_warning.png); -} diff --git a/webroot/rsrc/css/application/search/application-search-view.css b/webroot/rsrc/css/application/search/application-search-view.css new file mode 100644 index 0000000000..afc59a7ba8 --- /dev/null +++ b/webroot/rsrc/css/application/search/application-search-view.css @@ -0,0 +1,73 @@ +/** + * @provides application-search-view-css + */ + +.application-search-view { + background-color: {$page.content}; +} + +.application-search-view .phui-crumbs-view { + background-color: {$page.content}; +} + +.application-search-view .application-search-results.phui-object-box { + margin: 0; + padding: 0 16px 24px; +} + +.device-phone .application-search-view + .application-search-results.phui-object-box { + padding: 0 12px 24px; +} + +.application-search-view .application-search-results .phui-profile-header { + padding: 22px 8px; + border-bottom: 1px solid {$thinblueborder}; +} + +.application-search-view .phui-object-box.phui-object-box-collapsed + .phui-header-shell { + padding: 20px 8px; +} + +.application-search-results + .phui-profile-header.phui-header-shell .phui-header-header { + font-size: 20px; +} + +.device-phone.application-search-view .application-search-results + .phui-profile-header { + padding: 12px 0; +} + +.device-phone.application-search-view .application-search-results + .phui-profile-header.phui-header-shell { + padding: 12px 0 12px 4px; +} + +.device-phone .application-search-results + .phui-profile-header.phui-header-shell .phui-header-header { + font-size: 16px; +} + +.device-phone.application-search-view + .application-search-results.phui-object-box { + padding: 0 12px; + } + +.application-search-view .phui-box-border { + border: none; +} + +.application-search-pager { + margin: 0 16px 16px 16px; + padding: 8px; +} + +.device-phone .application-search-pager { + margin: 12px; +} + +.application-search-view .phui-oi-list-view.phui-oi-list-big { + margin-top: 12px; +} diff --git a/webroot/rsrc/css/application/search/search-results.css b/webroot/rsrc/css/application/search/search-results.css index bd2082d230..86a0cc075a 100644 --- a/webroot/rsrc/css/application/search/search-results.css +++ b/webroot/rsrc/css/application/search/search-results.css @@ -2,36 +2,31 @@ * @provides phabricator-search-results-css */ -.phabricator-search-result { - margin: 4px 0 16px; +.phui-oi-link strong { + color: {$fire}; + text-decoration: underline; } -.device-phone .phabricator-search-result-box .phui-box { - margin: 20px 0; +.phui-source-fragment { + color: {$darkgreytext}; } -.phabricator-search-result .result-image { - position: relative; - float: left; - width: 50px; - height: 50px; - margin-right: 10px; +.phui-source-fragment strong { + background-color: {$gentle.highlight}; + font-weight: 600; + color: {$blacktext}; + letter-spacing: 0.02em; } -.phabricator-search-result .result-type { - margin-top: 4px; - word-break: break-word; +.phui-fulltext-tokens { + margin: 16px 8px; + font-weight: bold; } -.phabricator-search-result .result-name { - font-size: 16px; +.phui-fulltext-tokens .phui-tag-view { + margin: 0 2px; } -.search-results-pager .aphront-pager-view { - text-align: center; -} - -.phabricator-search-no-results { - color: #888888; - font-size: 18px; +.phui-fulltext-tokens .phui-tag-view.phui-tag-grey { + opacity: 0.5; } diff --git a/webroot/rsrc/css/application/settings/settings.css b/webroot/rsrc/css/application/settings/settings.css deleted file mode 100644 index 6f71309826..0000000000 --- a/webroot/rsrc/css/application/settings/settings.css +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @provides phabricator-settings-css - */ - -.phabricator-settings-homepagetable { - width: 60% !important; - margin: auto; -} - -.phabricator-settings-homepagetable td.fixed { - width: 24px; - text-align: center; - -} - -.phabricator-settings-panelview h1 { - text-align: center; -} - - diff --git a/webroot/rsrc/css/application/slowvote/slowvote.css b/webroot/rsrc/css/application/slowvote/slowvote.css index d82b770440..907ff0c242 100644 --- a/webroot/rsrc/css/application/slowvote/slowvote.css +++ b/webroot/rsrc/css/application/slowvote/slowvote.css @@ -2,49 +2,31 @@ * @provides phabricator-slowvote-css */ -.slowvote-embed { - margin: 24px 12px; - background: #ffffff; - border-color: #888888; - border-style: solid; - border-width: 1px; - border-radius: 4px; - box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.20), - inset 0 0 2px rgba(0, 0, 0, 0.10); -} - -.slowvote-header { - font-weight: bold; - line-height: 16px; - border-bottom: 1px solid #bbbbbb; -} - .slowvote-description { - color: #666666; - padding: 8px; - border-bottom: 1px solid #bbbbbb; + padding: 12px 16px 4px; } .slowvote-header-content { padding: 8px; } -.slowvote-body { -} - .slowvote-body-content { - padding: 4px 16px; + padding: 8px 16px; } .slowvote-option-label { - border: 1px solid #666666; + border: 1px solid {$sh-lightgreyborder}; display: block; position: relative; padding: 8px 4px; cursor: pointer; font-weight: bold; overflow: hidden; - background-color: {$lightblue}; + background-color: {$lightgreybackground}; +} + +.device-desktop .slowvote-option-label:hover { + border-color: {$sh-blueborder}; } .slowvote-bar { @@ -53,7 +35,11 @@ left: 0; bottom: 0; overflow: hidden; - background-color: {$blue}; + background-color: {$sh-bluebackground}; +} + +.device-phone .slowvote-bar { + display: none; } .slowvote-control-offset { @@ -62,17 +48,18 @@ left: 32px; top: 8px; width: 100%; - color: #000000; - text-shadow: 0 1px 0 #ffffff; + color: {$darkbluetext}; + text-shadow: {$whitetextshadow}; } -.slowvote-bar .slowvote-control-offset { - color: #ffffff; - text-shadow: 0 1px 0 #000000; +.device-phone .slowvote-control-offset { + white-space: normal; + position: static; + padding: 0 4px 8px; } .slowvote-option-label-group { - margin: 8px 0 16px; + margin: 0 0 12px; } .slowvote-option-label input[type="radio"], @@ -86,38 +73,47 @@ } .slowvote-status { - text-align: right; - color: #333333; + color: {$darkbluetext}; font-weight: normal; padding: 2px 0; line-height: 15px; text-align: right; - font-size: 11px; + font-size: {$smallerfontsize}; + top: 0; + right: 8px; + position: absolute; + text-shadow: {$whitetextshadow}; +} + +.slowvote-voters { + padding-top: 8px; } .slowvote-voter { display: inline-block; width: 25px; height: 25px; - background: #f3f3f3; background-size: 25px 25px; + border-radius: 3px; + margin: 0 4px; + box-shadow: {$borderinset}; } .slowvote-footer { border-top-width: 1px; border-top-style: solid; - border-top-color: #bbbbbb; + border-top-color: {$thinblueborder}; position: relative; } .slowvote-footer-content { - padding: 8px; + padding: 8px 16px; overflow: hidden; } .slowvote-footer-content .slowvote-hint { line-height: 24px; - color: #888888; + color: {$lightgreytext}; } .slowvote-footer-content button { diff --git a/webroot/rsrc/css/application/tokens/tokens.css b/webroot/rsrc/css/application/tokens/tokens.css index b2fd6ec356..298436f712 100644 --- a/webroot/rsrc/css/application/tokens/tokens.css +++ b/webroot/rsrc/css/application/tokens/tokens.css @@ -4,12 +4,12 @@ button.token-button { background: #f7f7f7; - border: 1px solid #a1a5a9; + border: 1px solid {$lightblueborder}; position: relative; width: 16px; height: 16px; padding: 12px; - margin: 6px; + margin: 4px; text-shadow: none; box-shadow: none; box-sizing: content-box; @@ -19,6 +19,6 @@ button.token-button { text-align: center; } -.phui-icon-view.sprite-tokens { - display: inline-block; +.token-icon + .token-icon { + margin-left: 4px; } diff --git a/webroot/rsrc/css/application/uiexample/example.css b/webroot/rsrc/css/application/uiexample/example.css index 66d6d833e9..3f0287f301 100644 --- a/webroot/rsrc/css/application/uiexample/example.css +++ b/webroot/rsrc/css/application/uiexample/example.css @@ -13,14 +13,6 @@ font-weight: bold; } -.phabricator-ui-example-header { - margin: 1em 2em 2em; -} - -.phabricator-ui-example-description { - margin: 1em 0; -} - .jxui-example-container { padding: 2em; margin: 4em auto; @@ -39,9 +31,21 @@ } .jxui-blue-background { - background: blue; + background: {$blue}; } .jxui-red-border { - border-color: red; + border-color: {$red}; +} + +.phui-example-icon-name { + display: inline-block; + width: 180px; + padding-bottom: 8px; + white-space: nowrap; +} + +.phui-icon-view.phui-example-icon-transform { + display: block; + padding-bottom: 8px; } diff --git a/webroot/rsrc/css/core/core.css b/webroot/rsrc/css/core/core.css index d72781cb80..ccb3d1697f 100644 --- a/webroot/rsrc/css/core/core.css +++ b/webroot/rsrc/css/core/core.css @@ -2,24 +2,6 @@ * @provides phabricator-core-css */ -body { - /* Always show the vertical scrollbar so that going from a page without a - scrollbar to a page with a scrollbar doesn't make content jump a few - pixels left when the viewport narrows. */ - overflow-y: scroll; - /* reset behavior in ie7, as it will add an extra scrollbar regardless - selector * targets ie6 and ie7 only */ - *overflow-y: auto; -} - -.device-phone { - /* By default, the iPhone zooms all text on the page by some percentage when - you rotate from portrait mode to landscape mode. Disable this, since it - breaks lots of things and prevents you from using landscape to see more - columns in source code views. */ - -webkit-text-size-adjust: none; -} - body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, @@ -29,14 +11,6 @@ p, blockquote, th, td, button { border: 0; } -body.make-me-sneeze { - background: #e9eaed url('http://github.com/rsrc/image/texture/dust_background.jpeg'); -} - -.make-me-sneeze .phabricator-standard-page { - background: transparent; -} - table { border-collapse: collapse; border-spacing: 0; @@ -69,14 +43,27 @@ h1, h2, h3, h4, h5, h6 { } body { - font: 13px/1.231 'Helvetica Neue', Arial, sans-serif; + font: {$basefont}; direction: ltr; text-align: left; unicode-bidi: embed; + background: {$page.background}; + color: {$blacktext}; + + /* By default, the iPhone zooms all text on the page by some percentage when + you rotate from portrait mode to landscape mode. Disable this, since it + breaks lots of things and prevents you from using landscape to see more + columns in source code views. */ + -webkit-text-size-adjust: none; + + /* Prevent content from resizing abruptly when shifting between scrollable + and unscrollable pages. */ + overflow-y: scroll; } -body.phabricator-chromeless-page { - background: #ffffff; +body.printable, +!print body { + background: none; } textarea { @@ -99,11 +86,11 @@ h2 { a { -moz-outline-style: none; text-decoration: none; - color: #18559D; + color: {$anchor}; cursor: pointer; } -a:hover { +.device-desktop a:hover { text-decoration: underline; } @@ -113,13 +100,18 @@ img { .busy { position: fixed; - bottom: 16px; - right: 16px; - width: 44px; - height: 44px; - border-radius: 5px; - opacity: 0.4; - background: #000 url(http://github.com/res/cb6fc6eb/rsrc/image/loading/compass_24.gif) center no-repeat; + bottom: 8px; + right: 8px; + width: 32px; + height: 32px; +} + +.with-durable-column .busy { + right: 308px; +} + +.busy .phui-icon-view { + font-size: 32px; } .grouped:after { @@ -133,3 +125,97 @@ hr { background: #bbbbbb; border: none; } + +.aural-only { + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); + + /* NOTE: Without this, Safari sometimes lays these elements out at normal + size. An example is the label on the comment action menu on timelines. */ + + width: 0; + height: 0; + overflow: hidden; +} + +.visual-only { + /* These elements are hidden by the 'aria-hidden' attribute. */ +} + +.audible .aural-only { + clip: auto; + width: auto; + height: auto; + overflow: auto; + background: #006699; + color: #ffffff; +} + +.audible .aural-only a { + color: #ffffff; + font-weight: bold; +} + +.audible .visual-only { + position: absolute !important; + background: #990066; + opacity: 0.25; +} + +.print-only { + display: none; +} + +/* NOTE: These rules currently only work when applied to elements which + actually want "display: inline". There is no "display: auto". If there + is a future need to mix inline and block print elements, using + "display: initial" may be a reasonable approach. */ + +.printable .print-only { + display: inline; +} + +.printable .screen-only { + display: none; +} + +@media print { + .screen-only { + display: none; + } + + .print-only { + display: inline; + } +} + +.routing-bar { + position: fixed; + top: 0; + width: 100%; + height: 2px; + background: {$darkbluetext}; + z-index: 80; + box-shadow: 0 2px 1px rgba(0, 128, 255, 0.25); +} + +.routing-progress { + position: fixed; + top: 0; + left: 0; + height: 2px; + background: {$sky}; +} + +.clipboard-copy { + visibility: hidden; +} + +.supports-clipboard .clipboard-copy { + visibility: visible; +} + +.clipboard-buffer { + position: absolute; + left: -9999px; +} diff --git a/webroot/rsrc/css/core/remarkup.css b/webroot/rsrc/css/core/remarkup.css index 9ff484a5c0..38e03290d7 100644 --- a/webroot/rsrc/css/core/remarkup.css +++ b/webroot/rsrc/css/core/remarkup.css @@ -3,151 +3,265 @@ */ .phabricator-remarkup { - line-height: 1.45em; + line-height: 1.7em; + word-break: break-word; } .phabricator-remarkup p { - margin: 0 0 1em; + margin: 0 0 12px; } -.phabricator-remarkup p:last-child { - margin-bottom: 0; +.PhabricatorMonospaced, +.phabricator-remarkup .remarkup-code-block .remarkup-code { + font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; +} + +.platform-windows .PhabricatorMonospaced, +.platform-windows .phabricator-remarkup .remarkup-code-block .remarkup-code { + font: 12px/15px "Menlo", "Consolas", "Monaco", monospace; } .phabricator-remarkup .remarkup-code-block { - margin: 1em 2em; + margin: 12px 0; white-space: pre; - font-family: "Monaco", monospace; - font-size: 10px; } .phabricator-remarkup .remarkup-code-header { - padding: .25em 1em; - background: #edead7; - color: #444444; + padding: 6px 12px; + font-size: 13px; + font-weight: bold; + background: rgba({$alphablue},0.08); + display: table-cell; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + overflow: hidden; +} + +.phabricator-remarkup .code-block-counterexample .remarkup-code-header { + background-color: {$sh-redbackground}; +} + +.phabricator-remarkup .remarkup-code-block .remarkup-code-header + pre { + border-top-left-radius: 0; } .phabricator-remarkup .remarkup-code-block pre { - background: #fdfae7; - border: 1px solid #f5e178; + background: rgba({$alphablue},0.08); display: block; - color: #000000; + color: {$blacktext}; overflow: auto; - padding: .5em 1em; - font-family: "Monaco", monospace; + padding: 12px; + border-radius: 3px; + white-space: pre-wrap; +} + +.phabricator-remarkup kbd { + display: inline-block; + min-width: 1em; + padding: 4px 5px 5px; + font-weight: normal; + font-size: 0.8rem; + text-align: center; + text-decoration: none; + line-height: 0.6rem; + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba({$alphablue},0.08); + user-select: none; + background: {$lightgreybackground}; + border: 1px solid {$lightgreyborder}; +} + +.phabricator-remarkup .kbd-join { + padding: 0 4px; + color: {$lightgreytext}; } .phabricator-remarkup pre.remarkup-counterexample { - border: 1px solid #aa0000; - background-color: #ffaaaa; + background-color: {$sh-redbackground}; } -.phabricator-remarkup tt { - color: #333333; - background: #ebebeb; - padding: 0 .25em; +.phabricator-remarkup tt.remarkup-monospaced { + color: {$blacktext}; + background: rgba({$alphablue},0.1); + padding: 1px 4px; + border-radius: 3px; white-space: pre-wrap; } /* NOTE: You can currently produce this with [[link | `name`]]. Restore the link color. */ -.phabricator-remarkup a tt { - color: #18559d; +.phabricator-remarkup a tt.remarkup-monospaced { + color: {$anchor}; +} + +.phabricator-remarkup .remarkup-header tt.remarkup-monospaced { + font-weight: normal; } -.phabricator-remarkup ul { +.phabricator-remarkup ul.remarkup-list { list-style: disc; - margin: 1em 0 1em 3em; + margin: 12px 0 12px 30px; } -.phabricator-remarkup ol { +.phabricator-remarkup ol.remarkup-list { list-style: decimal; - margin: 1em 0 1em 3em; + margin: 12px 0 12px 30px; } -.phabricator-remarkup ul ol, -.phabricator-remarkup ul ul, -.phabricator-remarkup ol ol, -.phabricator-remarkup ol ul { - margin: .25em 0 .25em 2em; +.phabricator-remarkup ol ol.remarkup-list { + list-style: upper-alpha; } -.phabricator-remarkup li.phantom-item, -.phabricator-remarkup li.phantom-item { - list-style-type: none; +.phabricator-remarkup ol ol ol.remarkup-list { + list-style: lower-alpha; } -.phabricator-remarkup h1:first-child, -.phabricator-remarkup h2:first-child, -.phabricator-remarkup h3:first-child, -.phabricator-remarkup h4:first-child, -.phabricator-remarkup h5:first-child, -.phabricator-remarkup h6:first-child { - margin-top: 0; +.phabricator-remarkup ol ol ol ol.remarkup-list { + list-style: lower-roman; } -.phabricator-remarkup h1:last-child, -.phabricator-remarkup h2:last-child, -.phabricator-remarkup h3:last-child, -.phabricator-remarkup h4:last-child, -.phabricator-remarkup h5:last-child, -.phabricator-remarkup h6:last-child { - margin-bottom: 0; +.phabricator-remarkup .remarkup-list-with-checkmarks .remarkup-checked-item, +.phabricator-remarkup .remarkup-list-with-checkmarks .remarkup-unchecked-item { + list-style: none; + margin-left: -20px; + position: relative; + padding-left: 22px; } -.phabricator-remarkup h1 { - font-size: 1.625em; - line-height: 1.625em; - margin: .8em 0; +.phabricator-remarkup .remarkup-list-with-checkmarks input { + visibility: hidden; + width: 0; } -.phabricator-remarkup h2 { - font-size: 1.5em; - line-height: 1.5em; - margin: .75em 0; +.phabricator-remarkup .remarkup-list-with-checkmarks + .remarkup-list-item::before { + height: 16px; + width: 16px; + background-size: 16px; + display: inline-block; + content: ''; + position: absolute; + top: 3px; + left: 0; } -.phabricator-remarkup h3 { - font-size: 1.375em; - line-height: 1.375em; - margin: .69em 0; +.remarkup-list-with-checkmarks .remarkup-checked-item::before { + background-image: url(http://github.com/rsrc/image/controls/checkbox-checked.png); } -.phabricator-remarkup h4 { - font-size: 1.25em; - line-height: 1.25em; - margin: .63em 0; +.remarkup-list-with-checkmarks .remarkup-unchecked-item::before { + background-image: url(http://github.com/rsrc/image/controls/checkbox-unchecked.png); +} + +.phabricator-remarkup .remarkup-list-with-checkmarks .remarkup-checked-item { + color: {$lightgreytext}; +} + +.phabricator-remarkup ul.remarkup-list ol.remarkup-list, +.phabricator-remarkup ul.remarkup-list ul.remarkup-list, +.phabricator-remarkup ol.remarkup-list ol.remarkup-list, +.phabricator-remarkup ol.remarkup-list ul.remarkup-list { + margin: 4px 0 4px 24px; } -.phabricator-remarkup h5 { - font-size: 1.125em; - line-height: 1.125em; - margin: .56em 0; +.phabricator-remarkup .remarkup-list-item { + line-height: 1.7em; } -.phabricator-remarkup h6 { - font-size: 1em; - line-height: 1em; - margin: .5em 0; +.phabricator-remarkup li.phantom-item, +.phabricator-remarkup li.phantom-item { + list-style-type: none; +} + +.phabricator-remarkup h2.remarkup-header { + font-size: 28px; + margin: 1em 0 0.75em; +} + +.phabricator-remarkup h3.remarkup-header { + font-size: 24px; + margin: 1em 0 0.75em; +} + +.phabricator-remarkup h4.remarkup-header { + font-size: 22px; + margin: 1em 0 0.75em; +} + +.phabricator-remarkup h5.remarkup-header { + font-size: 18px; + margin: 1em 0 0.75em; +} + +.phabricator-remarkup h6.remarkup-header { + font-size: 16px; + margin: 1em 0 0.75em; } .phabricator-remarkup blockquote { - border-left: 1px solid #AAAAAA; - color: #333333; + border-left: 3px solid {$sh-blueborder}; + color: {$darkbluetext}; font-style: italic; - margin: .5em 0em; - padding: .25em 1em; + margin: 4px 0 12px 0; + padding: 8px 12px; + background-color: {$lightbluebackground}; +} + +.phabricator-remarkup blockquote *:last-child { + margin-bottom: 0; +} + +.phabricator-remarkup blockquote blockquote { + background-color: rgba(175,175,175, .1); } .phabricator-remarkup blockquote em { + /* In blockquote bodies, default text is italic so emphasized text should + be normal. */ font-style: normal; } +.phabricator-remarkup blockquote div.remarkup-reply-head { + font-style: normal; + padding-bottom: 4px; +} + +.phabricator-remarkup blockquote div.remarkup-reply-head em { + /* In blockquote headers, default text is normal so emphasized text should + be italic. See T10686. */ + font-style: italic; +} + +.phabricator-remarkup blockquote div.remarkup-reply-head + .phui-tag-core { + background-color: transparent; + border: none; + padding: 0; + color: {$darkbluetext}; +} + .phabricator-remarkup img.remarkup-proxy-image { max-width: 640px; max-height: 640px; } +.phabricator-remarkup audio { + display: block; + margin: 16px auto; + min-width: 240px; + width: 50%; +} + +video.phabricator-media { + background: {$greybackground}; +} + +.phabricator-remarkup video { + display: block; + margin: 0 auto; + max-width: 95%; +} + .phabricator-remarkup-mention-exists { font-weight: bold; background: #e6f3ff; @@ -164,26 +278,65 @@ background: #ffaaaa; } +.phabricator-remarkup .phriction-link { + font-weight: bold; +} + +.phabricator-remarkup .phriction-link-missing { + color: {$red}; + text-decoration: underline; +} + +.phabricator-remarkup .phriction-link-lock { + color: {$greytext}; +} + .phabricator-remarkup .remarkup-note { - margin: 1em 1.5em; - padding: 0.5em 1em; - border: 1px solid #ddddff; - background: #f3f3ff; + margin: 16px 0; + padding: 12px; + border-left: 3px solid {$blue}; + background: {$lightblue}; +} + +.phabricator-remarkup .remarkup-warning { + margin: 16px 0; + padding: 12px; + border-left: 3px solid {$yellow}; + background: {$lightyellow}; +} + +.phabricator-remarkup .remarkup-important { + margin: 16px 0; + padding: 12px; + border-left: 3px solid {$red}; + background: {$lightred}; +} + +.phabricator-remarkup .remarkup-note .remarkup-monospaced, +.phabricator-remarkup .remarkup-important .remarkup-monospaced, +.phabricator-remarkup .remarkup-warning .remarkup-monospaced { + background-color: rgba(150,150,150,.2); +} + +.phabricator-remarkup .remarkup-note-word { + font-weight: bold; + color: {$darkbluetext}; } .phabricator-remarkup-toc { float: right; - border: 1px solid #d7d7d7; - background: #f7f7f7; - padding: 4px 12px; - width: 180px; - margin: 0 0 5px 10px; + border-left: 1px solid {$lightblueborder}; + background: {$page.content}; + width: 160px; + padding-left: 8px; + margin: 0 0 4px 8px; } .phabricator-remarkup-toc-header { - font-size: 11px; - color: #777; - border-bottom: 1px solid #d7d7d7; + font-size: 13px; + line-height: 13px; + color: {$darkbluetext}; + font-weight: bold; margin-bottom: 4px; } @@ -195,13 +348,16 @@ } .phabricator-remarkup-toc ul ul { - margin: 0 0 0 10px; + margin: 0 0 0 8px; } .phabricator-remarkup-toc ul li { padding: 0; margin: 0; - font-size: 11px; + font-size: 12px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .phabricator-remarkup-embed-layout-right { @@ -222,8 +378,81 @@ } .phabricator-remarkup-embed-layout-link { - padding-left: 20px; - background: url(http://github.com/rsrc/image/icon/fatcow/page_white_put.png) 0 0 no-repeat; + padding: 6px 6px 6px 42px; + border-radius: 3px; + margin: 0 0 4px; + display: inline-block; + font-weight: bold; + -webkit-font-smoothing: antialiased; + border: 1px solid {$lightblueborder}; + border-radius: 3px; + color: {$blacktext}; + min-width: 256px; + position: relative; + line-height: 20px; + overflow: hidden; + min-height: 38px; +} + +.phabricator-remarkup-embed-layout-icon { + font-size: 28px; + position: absolute; + top: 10px; + left: 10px; +} + +.phabricator-remarkup-embed-layout-info { + color: {$lightgreytext}; + font-size: {$smallerfontsize}; + font-weight: normal; + margin-left: 8px; +} + +.phabricator-remarkup-embed-layout-link:hover { + border-color: {$violet}; + cursor: pointer; +} + +.device-desktop .phabricator-remarkup-embed-layout-link:hover { + text-decoration: none; +} + +.phabricator-remarkup-embed-layout-link:hover + .phabricator-remarkup-embed-layout-icon { + color: {$violet}; +} + +.phabricator-remarkup-embed-layout-info-block { + display: block; +} + +.embed-download-form { + display: inline-block; + padding: 0; + margin: 0; +} + +.phabricator-remarkup-embed-layout-link + .phabricator-remarkup-embed-layout-download { + color: {$lightgreytext}; + border: none; + background: rgba(0, 0, 0, 0); + box-shadow: none; + outline: 0; + padding: 0; + margin: 0; + text-align: left; + text-shadow: none; + border-radius: 0; + font: inherit; + display: inline; + min-width: 0; + font-weight: normal !important; +} + +.phabricator-remarkup-embed-layout-download:hover { + color: {$anchor}; + text-decoration: underline; } .phabricator-remarkup-embed-float-left { @@ -231,81 +460,149 @@ margin: .5em 1em 0; } +.phabricator-remarkup-image-error { + border: 1px solid {$redborder}; + background: {$sh-redbackground}; + padding: 8px 12px; + color: {$darkgreytext}; +} + .phabricator-remarkup-embed-image { display: inline-block; border: 3px solid white; - box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.20); + box-shadow: 1px 1px 2px rgba({$alphablack}, 0.20); +} + +.phabricator-remarkup-embed-image-full, +.phabricator-remarkup-embed-image-wide { + display: inline-block; + max-width: 100%; +} + +.phabricator-remarkup-embed-image-full img, +.phabricator-remarkup-embed-image-wide img { + height: auto; + max-width: 100%; +} + +.phabricator-remarkup .remarkup-table-wrap { + overflow-x: auto; +} + +!print .phabricator-remarkup .remarkup-table-wrap { + overflow-x: hidden; } .phabricator-remarkup table.remarkup-table { - border-collapse: separate; - border-spacing: 1px; - background: #d3d3d3; - margin: 1em; + border-collapse: separate; + border-spacing: 1px; + background: {$lightblueborder}; + margin: 12px 0; + word-break: normal; } .phabricator-remarkup table.remarkup-table th { font-weight: bold; - padding: 3px 6px; - background: #e3e3e3; + padding: 4px 6px; + background: {$lightbluebackground}; } .phabricator-remarkup table.remarkup-table td { - background: #ffffff; + background: {$page.content}; padding: 3px 6px; } +!print .phabricator-remarkup table.remarkup-table td { + /* See T13564. This is a narrow control for PDF printing behavior in + Chrome. */ + + line-break: anywhere; + overflow-wrap: anywhere; +} + +body div.phabricator-remarkup.remarkup-has-toc + .phabricator-remarkup-toc + .remarkup-header { + margin-top: 0; + padding-top: 0; +} + +body .phabricator-standard-page div.phabricator-remarkup *:first-child, +body .phabricator-standard-page div.phabricator-remarkup .remarkup-header + * { + margin-top: 0; +} + +body div.phabricator-remarkup > *:last-child { + margin-bottom: 0; +} .remarkup-assist-textarea { - border-left-color: #96A6C5; - border-right-color: #96A6C5; - border-bottom-color: #96A6C5; - border-top-color: #c9d4e9; + border-left-color: {$greyborder}; + border-right-color: {$greyborder}; + border-bottom-color: {$greyborder}; + border-top-color: {$thinblueborder}; border-radius: 0; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + + box-shadow: none; + -webkit-box-shadow: none; + + /* Set line height explicitly so the metrics and the real textarea + are forced to the same value. */ + line-height: 1.25em; /* Prevent Safari and Chrome users from dragging the textarea any wider, because the top bar won't resize along with it. */ resize: vertical; } +var.remarkup-assist-textarea { + /* This is an invisible element used to measure the size of text in the + textarea so we can float typeaheads over the cursor position. */ + display: block; + border-color: orange; + box-sizing: border-box; + padding: 4px 6px; + white-space: pre-wrap; + visibility: hidden; +} + .remarkup-assist-textarea:focus { border: 1px solid rgba(82, 168, 236, 0.8); } .remarkup-assist-bar { - height: 27px; - padding: 0 2px; - + height: 32px; border-width: 1px 1px 0; border-style: solid; - border-top-color: #96A6C5; - border-left-color: #96A6C5; - border-right-color: #96A6C5; - - background: #f5f5f5; + border-top-color: {$greyborder}; + border-left-color: {$greyborder}; + border-right-color: {$greyborder}; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + padding: 0 4px; + + background: {$lightbluebackground}; overflow: hidden; } .remarkup-assist-button { display: block; - padding: 3px; - margin: 2px 1px; + margin-top: 4px; + height: 20px; + padding: 2px 5px 3px; + line-height: 18px; + width: 16px; float: left; - - border: 1px solid transparent; - border-radius: 2px; + border-radius: 3px; } -.remarkup-assist-button:hover { - background: #f7f7f7; - border-color: #c6c6c6; - box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.10); +.remarkup-assist-button:hover .phui-icon-view.phui-font-fa { + color: {$sky}; } .remarkup-assist-button:active { outline: none; - background: #f3f3f3; - box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.10); } .remarkup-assist-button:focus { @@ -316,18 +613,33 @@ display: block; float: left; - margin: 7px 4px; - height: 14px; + height: 18px; + margin: 7px 6px; width: 0px; - border-right: 1px solid #cccccc; + border-right: 1px solid {$lightgreyborder}; +} + +.remarkup-interpreter-error { + padding: 8px; + border: 1px solid {$sh-redborder}; + background-color: {$sh-redbackground}; +} + +.remarkup-cowsay { + white-space: pre-wrap; +} + +.remarkup-figlet { + white-space: pre-wrap; } .remarkup-assist { - display: block; width: 14px; height: 14px; overflow: hidden; + text-align: center; + vertical-align: middle; } .remarkup-assist-right { @@ -335,127 +647,261 @@ } .jx-order-mask { - background: #ffffff; + background: white; opacity: 1.0; } -.remarkup-control-order-mode { - position: fixed; - top: -1px; - bottom: -1px; - left: -1px; - right: -1px; +.phabricator-image-macro-hero { + margin: auto; + max-width: 95%; +} + +.phabricator-remarkup-macro { + height: auto; + max-width: 100%; +} + +.remarkup-nav-sequence-arrow { + color: {$lightgreytext}; } -.remarkup-control-order-mode textarea.remarkup-assist-textarea { +.phabricator-remarkup hr { + background: {$thinblueborder}; + margin: 24px 0; + clear: both; +} + +.phabricator-remarkup .remarkup-highlight { + background-color: {$lightviolet}; + padding: 0 4px; +} + +.device .remarkup-assist-nodevice { + display: none; +} + +/* - Autocomplete ----------------------------------------------------------- */ + +.phuix-autocomplete { position: absolute; - top: 26px; + width: 300px; + box-shadow: {$dropshadow}; + background: {$page.content}; + border: 1px solid {$lightgreyborder}; + border-radius: 3px; +} + +.phuix-autocomplete-head { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + padding: 6px 8px; + background: {$lightgreybackground}; + color: {$darkgreytext}; + border-radius: 3px; +} + +.phuix-autocomplete-head .phui-icon-view { + margin-right: 4px; + color: {$lightgreytext}; +} + +.phuix-autocomplete-echo { + margin-left: 4px; + color: {$lightgreytext}; +} + +.phuix-autocomplete-list a.jx-result { + display: block; + padding: 5px 8px; + font-size: {$normalfontsize}; + border-top: 1px solid {$thinblueborder}; + font-weight: bold; + color: {$darkgreytext}; +} + +.phuix-autocomplete-list a.jx-result .tokenizer-result-closed { + color: {$lightgreytext}; + text-decoration: line-through; +} + +.phuix-autocomplete-list a.jx-result .phui-icon-view { + margin-right: 4px; + color: {$lightbluetext}; +} + +.phuix-autocomplete-list a.jx-result:hover { + text-decoration: none; + background: {$sh-bluebackground}; + color: {$blacktext}; +} + +.phuix-autocomplete-list a.jx-result.focused, +.phuix-autocomplete-list a.jx-result.focused:hover { + background: {$sh-bluebackground}; + color: {$blacktext}; +} + + +/* - Pinned ----------------------------------------------------------------- */ + +.phui-box.phui-object-box.phui-comment-form-view.remarkup-assist-pinned { + position: fixed; + background-color: {$page.content}; + border-top: 1px solid {$lightblueborder}; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + + width: 100%; + bottom: 0; left: 0; right: 0; - bottom: 0; - /* NOTE: This doesn't work in Firefox, there's a JS behavior to correct it. */ - height: auto; - border-width: 1px 0 0 0; - outline: none; + margin: 0; + + overflow: auto; + max-height: 60vh; } -.remarkup-control-chaos-mode textarea.remarkup-assist-textarea { +.remarkup-assist-pinned-spacer { position: relative; } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-0 - textarea.remarkup-assist-textarea { - background-image: url(http://github.com/rsrc/image/checker_light.png); + +/* - Preview ---------------------------------------------------------------- */ + +.remarkup-inline-preview { + display: block; + position: relative; + background: {$page.content}; + overflow-y: auto; + box-sizing: border-box; + width: 100%; + resize: vertical; + padding: 8px; + border: 1px solid {$lightblueborder}; + border-top: none; + -webkit-font-smoothing: antialiased; } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-1 - textarea.remarkup-assist-textarea { - font-family: "Comic Sans", "Comic Sans MS"; +.remarkup-control-fullscreen-mode .remarkup-inline-preview { + resize: none; } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-2 - textarea.remarkup-assist-textarea { - left: -6px; +.remarkup-inline-preview * { + resize: none; } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-3 - textarea.remarkup-assist-textarea { - top: -4px; +.remarkup-assist-button.preview-active { + background: {$sky}; } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-4 - textarea.remarkup-assist-textarea { - direction: rtl; +.remarkup-assist-button.preview-active .phui-icon-view { + color: {$page.content}; } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-5 - textarea.remarkup-assist-textarea { - border: 8px ridge #666666; +.remarkup-assist-button.preview-active:hover { + text-decoration: none; } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-6 - textarea.remarkup-assist-textarea { - opacity: 0.5; +.remarkup-assist-button.preview-active:hover .phui-icon-view { + color: {$page.content}; } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-7 - textarea.remarkup-assist-textarea { - border-radius: 24px; +.remarkup-preview-active .remarkup-assist, +.remarkup-preview-active .remarkup-assist-separator { + opacity: .2; + transition: all 100ms cubic-bezier(0.250, 0.250, 0.750, 0.750); + transition-timing-function: cubic-bezier(0.250, 0.250, 0.750, 0.750); } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-8 - textarea.remarkup-assist-textarea { - font-weight: bold; +.remarkup-preview-active .remarkup-assist-button { + pointer-events: none; + cursor: default; } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-9 - textarea.remarkup-assist-textarea { - font-variant: small-caps; +.remarkup-preview-active .remarkup-assist-button.preview-active { + pointer-events: inherit; + cursor: pointer; } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-10 - textarea.remarkup-assist-textarea { - text-transform: uppercase; +.remarkup-preview-active .remarkup-assist.fa-eye { + opacity: 1; + transition: all 100ms cubic-bezier(0.250, 0.250, 0.750, 0.750); + transition-timing-function: cubic-bezier(0.250, 0.250, 0.750, 0.750); } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-11 - textarea.remarkup-assist-textarea { - letter-spacing: 6px; + +/* - Fullscreen ------------------------------------------------------------- */ + +.remarkup-fullscreen-mode { + overflow: hidden; } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-12 - textarea.remarkup-assist-textarea { - font-size: 16px; +.remarkup-control-fullscreen-mode { + position: fixed; + border: none; + top: 32px; + bottom: 32px; + left: 64px; + right: 64px; + border-radius: 3px; + box-shadow: 0px 4px 32px #555; } -.remarkup-control-chaos-mode.remarkup-control-chaos-mode-13 - textarea.remarkup-assist-textarea { - transform: rotate(3deg); - -webkit-transform: rotate(3deg); +.remarkup-control-fullscreen-mode .remarkup-assist-button { + padding: 1px 6px 4px; + font-size: 15px; } -.phabricator-image-macro-hero { - margin: auto; - max-width: 95%; +.remarkup-control-fullscreen-mode .remarkup-assist-button .remarkup-assist { + height: 16px; + width: 16px; } -/* phabricator-remarkup-dark assumes a dark backround with light text, - so here are custom rules to override remarkup defaults. */ +.aphront-form-input .remarkup-control-fullscreen-mode .remarkup-assist-bar { + border: none; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + height: 32px; + padding: 4px 8px; + background: {$bluebackground}; +} + +.aphront-form-control .remarkup-control-fullscreen-mode + textarea.remarkup-assist-textarea { + position: absolute; + top: 39px; + left: 0; + right: 0; + height: calc(100% - 36px) !important; + padding: 16px; + font-size: {$biggerfontsize}; + line-height: 1.51em; + border-width: 1px 0 0 0; + outline: none; + resize: none; + background: {$page.content} !important; +} -div.phabricator-remarkup-dark blockquote { - color: #999; +.remarkup-control-fullscreen-mode textarea.remarkup-assist-textarea:focus { + border-color: {$thinblueborder}; + box-shadow: none; } -div.phabricator-remarkup-dark tt { - color: #EEE; - background: #444; +.remarkup-control-fullscreen-mode .remarkup-inline-preview { + font-size: {$biggerfontsize}; + border: none; + padding: 16px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; } -div.phabricator-remarkup-dark .remarkup-note, -div.phabricator-remarkup-dark table { - color: #000; +.remarkup-control-fullscreen-mode .remarkup-assist-button .fa-arrows-alt { + color: {$sky}; } -div.phabricator-remarkup-dark hr { - border-color: #555; +.device-phone .remarkup-control-fullscreen-mode { + top: 0; + bottom: 0; + left: 0; + right: 0; } diff --git a/webroot/rsrc/css/core/syntax.css b/webroot/rsrc/css/core/syntax.css index dfb6d4d279..78aa83dbdc 100644 --- a/webroot/rsrc/css/core/syntax.css +++ b/webroot/rsrc/css/core/syntax.css @@ -1,127 +1,20 @@ /** * @provides syntax-highlighting-css + * @requires syntax-default-css */ .remarkup-code .uu { /* Forbidden Unicode */ color: #aa0066; } -.remarkup-code .over-the-line { - color: #aa0066; - margin-right: 1px; +.remarkup-code .language-tag { + color: {$lightgreytext}; } -.remarkup-code td span { - padding: 1px 0 3px; +.remarkup-code td > span { + display: inline; + line-break: anywhere; } -.remarkup-code span { - border-bottom: 1px solid transparent; -} - -.remarkup-code .hll { - background-color: #ffffcc; -} - -.remarkup-code .c, /* Comment */ -.remarkup-code .cm, /* Comment.Multiline */ -.remarkup-code .c1, /* Comment.Single */ -.remarkup-code .cs { /* Comment.Special */ - color: #666666; -} - -.remarkup-code .sd, /* Literal.String.Doc */ -.remarkup-code .sh { /* Literal.String.Heredoc */ - color: #000000; -} - -.remarkup-code .s, /* Literal.String */ -.remarkup-code .sb, /* Literal.String.Backtick */ -.remarkup-code .sc, /* Literal.String.Char */ -.remarkup-code .s2, /* Literal.String.Double */ -.remarkup-code .s1, /* Literal.String.Single */ -.remarkup-code .sx { /* Literal.String.Other */ - color: #766510; -} - -.remarkup-code .sr { /* Literal.String.Regex */ - color: #BB6688; -} - -.remarkup-code .nv, /* Name.Variable */ -.remarkup-code .vi, /* Name.Variable.Instance */ -.remarkup-code .vg { /* Name.Variable.Global */ - color: #001294; -} - -.remarkup-code .na { /* Name.Attribute */ - color: #354BB3; -} - -.remarkup-code .kc, /* Keyword.Constant */ -.remarkup-code .no { /* Name.Constant */ - color: #000A65; -} - -.remarkup-code .k, /* Keyword */ -.remarkup-code .kd, /* Keyword.Declaration */ -.remarkup-code .kn, /* Keyword.Namespace */ -.remarkup-code .kt { /* Keyword.Type */ - color: #AA4000; -} - -.remarkup-code .cp, /* Comment.Preproc */ -.remarkup-code .kp, /* Keyword.Pseudo */ -.remarkup-code .kr, /* Keyword.Reserved */ -.remarkup-code .nb, /* Name.Builtin */ -.remarkup-code .bp { /* Name.Builtin.Pseudo */ - color: #304A96; -} - -.remarkup-code .nc, /* Name.Class */ -.remarkup-code .nt, /* Name.Tag */ -.remarkup-code .vc { /* Name.Variable.Class */ - color: #00702A; -} - -.remarkup-code .nf, /* Name.Function */ -.remarkup-code .nx { /* Name.Other */ - color: #004012; -} - -.remarkup-code .o, /* Operator */ -.remarkup-code .ss { /* Literal.String.Symbol */ - color: #AA2211; -} - -.remarkup-code .m, /* Literal.Number */ -.remarkup-code .mf, /* Literal.Number.Float */ -.remarkup-code .mh, /* Literal.Number.Hex */ -.remarkup-code .mi, /* Literal.Number.Integer */ -.remarkup-code .mo, /* Literal.Number.Oct */ -.remarkup-code .il { /* Literal.Number.Integer.Long */ - color: #601200; -} - -.remarkup-code .gd { color: #A00000 } /* Generic.Deleted */ -.remarkup-code .ge { } /* Generic.Emph */ -.remarkup-code .gr { color: #FF0000 } /* Generic.Error */ -.remarkup-code .gh { color: #000080; } /* Generic.Heading */ -.remarkup-code .gi { color: #00A000 } /* Generic.Inserted */ -.remarkup-code .go { color: #808080 } /* Generic.Output */ -.remarkup-code .gp { color: #000080 } /* Generic.Prompt */ -.remarkup-code .gs { } /* Generic.Strong */ -.remarkup-code .gu { color: #800080 } /* Generic.Subheading */ -.remarkup-code .gt { color: #0040D0 } /* Generic.Traceback */ -.remarkup-code .nd { color: #AA22FF } /* Name.Decorator */ -.remarkup-code .ni { color: #999999 } /* Name.Entity */ -.remarkup-code .ne { color: #D2413A } /* Name.Exception */ -.remarkup-code .nl { color: #A0A000 } /* Name.Label */ -.remarkup-code .nn { color: #0000FF } /* Name.Namespace */ -.remarkup-code .ow { color: #AA22FF } /* Operator.Word */ -.remarkup-code .w { color: #bbbbbb } /* Text.Whitespace */ -.remarkup-code .se { color: #BB6622 } /* Literal.String.Escape */ -.remarkup-code .si { color: #BB6688 } /* Literal.String.Interpol */ - .remarkup-code .rbw_r { color: red; } .remarkup-code .rbw_o { color: orange; } .remarkup-code .rbw_y { color: yellow; } @@ -130,14 +23,19 @@ .remarkup-code .rbw_i { color: indigo; } .remarkup-code .rbw_v { color: violet; } -.repository-crossreference .remarkup-code .nc, -.repository-crossreference .remarkup-code .na, -.repository-crossreference .remarkup-code .nf { +span.crossreference-item { + background: {$lightyellow}; + border-bottom: 1px solid {$yellow}; cursor: help; - border-bottom: 1px dotted #bbddbb; } .remarkup-code .invisible { color: #222222; background: #dddddd; } + +.suspicious-character { + background: #ff7700; + color: #ffffff; + cursor: default; +} diff --git a/webroot/rsrc/css/core/z-index.css b/webroot/rsrc/css/core/z-index.css index 56a650bec5..d5ac177db4 100644 --- a/webroot/rsrc/css/core/z-index.css +++ b/webroot/rsrc/css/core/z-index.css @@ -2,15 +2,17 @@ * @provides phabricator-zindex-css */ -.keyboard-focus-focus-reticle { +.device .phabricator-action-list-view.phabricator-action-list-toggle, +.device-desktop .phui-document-content + .phabricator-action-list-view.phabricator-action-list-toggle { z-index: 1; } -.device-desktop .phabricator-timeline-minor-event .phabricator-timeline-image { +.keyboard-focus-focus-reticle { z-index: 2; } -.differential-reticle { +.device-desktop .phui-timeline-minor-event .phui-timeline-image { z-index: 2; } @@ -26,15 +28,19 @@ z-index: 2; } +div.phui-calendar-day-event { + z-index: 2; +} + .slowvote-above-the-bar { z-index: 3; } -.phabricator-timeline-icon-fill { +.phui-timeline-icon-fill { z-index: 3; } -.phabricator-nav-column-background { +.phui-crumbs-view { z-index: 3; } @@ -42,57 +48,52 @@ z-index: 4; } -.conpherence-layout .conpherence-no-threads { +.project-board-header { z-index: 4; } -.conpherence-menu-pane { +.conpherence-layout .conpherence-no-threads { z-index: 4; } -.phabricator-nav-drag { +.conpherence-menu-pane { z-index: 4; } -.loading .messages-loading-mask, -.loading .widgets-loading-mask { - z-index: 5; +.conpherence-message-pane .conpherence-search-main { + z-index: 4; } .dark-console { z-index: 5; } -.drag-dragging { +.phui-calendar-date-number { z-index: 5; } -.phabricator-crumbs-view { - z-index: 3; -} - .phabricator-main-menu { z-index: 6; } -.setup-warning-callout, .aphront-developer-error-callout { z-index: 6; } -.jx-notification-container { - z-index: 7; +.loading .messages-loading-mask, +.loading .widgets-loading-mask { + z-index: 6; } -.fancy-datepicker { - z-index: 7; +.diff-banner { + z-index: 6; } -.calendar-button { - z-index: 8; +.conpherence-durable-column { + z-index: 7; } -div.jx-typeahead-results { +.jx-scrollbar-bar { z-index: 8; } @@ -101,6 +102,10 @@ div.jx-typeahead-results { z-index: 8; } +.remarkup-assist-pinned { + z-index: 8; +} + .device-desktop .phabricator-notification-menu { z-index: 9; } @@ -109,6 +114,10 @@ div.jx-typeahead-results { z-index: 10; } +.jx-notification-container { + z-index: 11; +} + .phabricator-global-upload-instructions { z-index: 11; } @@ -117,23 +126,43 @@ div.jx-typeahead-results { z-index: 12; } +div.jx-typeahead-results { + z-index: 13; +} + .jx-client-dialog { z-index: 14; } -.jx-hovercard-container { +.fancy-datepicker { + z-index: 15; +} + +.drag-frame { z-index: 16; } -.jx-tooltip-container { - z-index: 18; +.jx-hovercard-container { + z-index: 17; } .pholio-device-lightbox { z-index: 20; } -.dropdown-menu-frame { +.phuix-autocomplete { + z-index: 21; +} + +.conpherence-participant-pane { + z-index: 25; +} + +.conpherence-layout .conpherence-loading-mask { + z-index: 30; +} + +.phuix-dropdown-menu { z-index: 32; } @@ -141,6 +170,14 @@ div.jx-typeahead-results { z-index: 40; } -.remarkup-control-order-mode { +.remarkup-control-fullscreen-mode { z-index: 50; } + +.jx-tooltip-container { + z-index: 51; +} + +.audible .aural-only { + z-index: 100; +} diff --git a/webroot/rsrc/css/diviner/diviner-shared.css b/webroot/rsrc/css/diviner/diviner-shared.css new file mode 100644 index 0000000000..a2eb6c9c72 --- /dev/null +++ b/webroot/rsrc/css/diviner/diviner-shared.css @@ -0,0 +1,198 @@ +/** + * @provides diviner-shared-css + */ + +.diviner-monospace { + font-family: monospace; + font-size: 13px; +} + +.diviner-table-view { + margin: 0 0 24px; +} + +.device-phone .diviner-table-view { + margin: 0 8px 16px; +} + +.diviner-table-header { + padding: 4px 16px; + background-color: {$greybackground}; + border-left: 1px solid {$lightblueborder}; + border-right: 1px solid {$lightblueborder}; + border-top: 1px solid {$lightblueborder}; + display: inline-block; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + font-weight: bold; + color: {$bluetext}; +} + +.diviner-return-table-view, +.diviner-parameter-table-view { + width: 100%; + background: {$lightgreybackground}; + border: 1px solid {$lightblueborder}; +} + +.diviner-return-table-type, +.diviner-parameter-table-type { + padding: 6px 8px 6px 12px; + white-space: nowrap; + text-align: right; + color: {$bluetext}; + width: 20%; +} + +.diviner-parameter-table-name { + padding: 6px 8px; + white-space: nowrap; + font-weight: bold; +} + +.diviner-return-table-docs, +.diviner-parameter-table-docs { + padding: 6px 12px 6px 8px; + width: 80%; + background-color: #fff; +} + +.diviner-document-section { + padding: 0 0 16px 0; +} + +.device-phone .diviner-document-section { + padding: 0 8px 16px 0; +} + +.phui-header-shell.diviner-section-header .phui-header-header { + color: {$blacktext}; + font-size: 20px; +} + +body .diviner-view .diviner-document-section + .phui-header-shell.diviner-section-header { + padding: 0 24px 8px 0; + border-bottom: 1px solid {$thinblueborder}; + margin: 32px 0 16px; +} + +body .diviner-document-section .phui-header-shell.phui-bleed-header { + padding: 16px 0 0 0; + border-bottom: none; +} + +body .diviner-view .diviner-section-content .phui-header-shell { + margin: 24px 0 8px; + padding: 0; + border: none; +} + +.diviner-message-not-documented { + color: {$lightgreytext}; + font-style: italic; + margin: 12px 0 32px; + font-size: {$biggerfontsize}; +} + +.diviner-document-section .diviner-message-not-documented { + margin-left: 0; + margin-right: 0; +} + +.phui-document-content .phabricator-remarkup.diviner-remarkup-section { + padding: 16px 0 32px 0; +} + +.diviner-atom-signature-name { + font-weight: bold; + color: {$violet}; +} + +.diviner-atom-signature { + font-weight: normal; + color: #000; +} + +.phui-header-view .phui-header-header a.diviner-atom-signature-name { + color: {$violet}; +} + +.phui-header-view .phui-header-header a.diviner-atom-signature-name:hover { + text-decoration: underline !important; +} + +.diviner-list .diviner-atom-signature { + margin-left: -16px; +} + +.diviner-list a { + font-weight: bold; +} + +.diviner-method-implementation-header { + color: {$greytext}; + margin-bottom: -8px; +} + +.diviner-method-implementation-inherited { + color: {$darkgreytext}; +} + +.diviner-method-implementation-inherited .diviner-method-implementation-header { + color: {$lightgreytext}; +} + +/** + * Fix excessive padding between method headers and method documentation for + * methods with no inherited context. + */ +.diviner-document-section .phui-header-shell + .phabricator-remarkup { + padding-top: 0; +} + +.diviner-list { + padding-left: 17px; +} + +.diviner-list li { + line-height: 20px; + padding-bottom: 12px; +} + +/* - Book Index ---------------------------------------------------------------- + + How big lists of book indexes get displayed + +*/ + +.diviner-book-item { + display: block; + padding: 6px 16px; + margin: 4px -16px; +} + +a.diviner-book-item:hover { + text-decoration: none; +} + +.device-desktop .diviner-book-item:hover .diviner-book-item-title { + color: {$violet}; +} + +.diviner-book-item-title { + font-weight: bold; + font-size: 15px; + color: {$darkbluetext}; +} + +.diviner-book-item-type { + color: {$lightgreytext}; + padding-left: 8px +} + +.diviner-book-item-subtitle { + display: block; + line-height: 20px; + color: {$lightgreytext}; +} diff --git a/webroot/rsrc/css/font/font-awesome.css b/webroot/rsrc/css/font/font-awesome.css new file mode 100644 index 0000000000..1579f70f22 --- /dev/null +++ b/webroot/rsrc/css/font/font-awesome.css @@ -0,0 +1,2200 @@ +/** + * @provides font-fontawesome + */ + +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('http://github.com/rsrc/externals/font/fontawesome/fontawesome-webfont.eot?v=4.7.0'); + src: url('http://github.com/rsrc/externals/font/fontawesome/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('http://github.com/rsrc/externals/font/fontawesome/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('http://github.com/rsrc/externals/font/fontawesome/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('http://github.com/rsrc/externals/font/fontawesome/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('http://github.com/rsrc/externals/font/fontawesome/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.phui-font-fa:before { + font-family: FontAwesome; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-handshake-o:before { + content: "\f2b5"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-envelope-open-o:before { + content: "\f2b7"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-address-book:before { + content: "\f2b9"; +} +.fa-address-book-o:before { + content: "\f2ba"; +} +.fa-vcard:before, +.fa-address-card:before { + content: "\f2bb"; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: "\f2bc"; +} +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-circle-o:before { + content: "\f2be"; +} +.fa-user-o:before { + content: "\f2c0"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: "\f2c3"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-telegram:before { + content: "\f2c6"; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: "\f2cd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f2d3"; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: "\f2d4"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-eercast:before { + content: "\f2da"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-snowflake-o:before { + content: "\f2dc"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/webroot/rsrc/css/font/font-lato.css b/webroot/rsrc/css/font/font-lato.css new file mode 100644 index 0000000000..60b9acd53e --- /dev/null +++ b/webroot/rsrc/css/font/font-lato.css @@ -0,0 +1,76 @@ +/** + * @provides font-lato + * @requires phui-fontkit-css + */ + +@font-face { + font-family: 'Lato'; + src: url(http://github.com/rsrc/externals/font/lato/lato-regular.eot); + src: url(http://github.com/rsrc/externals/font/lato/lato-regular.eot?#iefix) + format('embedded-opentype'), + url(http://github.com/rsrc/externals/font/lato/lato-regular.woff2) + format('woff2'), + url(http://github.com/rsrc/externals/font/lato/lato-regular.woff) + format('woff'), + url(http://github.com/rsrc/externals/font/lato/lato-regular.ttf) + format('truetype'), + url(http://github.com/rsrc/externals/font/lato/lato-regular.svg#latoregular) + format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'Lato'; + src: url(http://github.com/rsrc/externals/font/lato/lato-italic.eot); + src: url(http://github.com/rsrc/externals/font/lato/lato-italic.eot?#iefix) + format('embedded-opentype'), + url(http://github.com/rsrc/externals/font/lato/lato-italic.woff2) + format('woff2'), + url(http://github.com/rsrc/externals/font/lato/lato-italic.woff) + format('woff'), + url(http://github.com/rsrc/externals/font/lato/lato-italic.ttf) + format('truetype'), + url(http://github.com/rsrc/externals/font/lato/lato-italic.svg#latoitalic) + format('svg'); + font-weight: normal; + font-style: italic; + +} + +@font-face { + font-family: 'Lato'; + src: url(http://github.com/rsrc/externals/font/lato/lato-bold.eot); + src: url(http://github.com/rsrc/externals/font/lato/lato-bold.eot?#iefix) + format('embedded-opentype'), + url(http://github.com/rsrc/externals/font/lato/lato-bold.woff2) + format('woff2'), + url(http://github.com/rsrc/externals/font/lato/lato-bold.woff) + format('woff'), + url(http://github.com/rsrc/externals/font/lato/lato-bold.ttf) + format('truetype'), + url(http://github.com/rsrc/externals/font/lato/lato-bold.svg#latobold) + format('svg'); + font-weight: bold; + font-style: normal; + +} + +@font-face { + font-family: 'Lato'; + src: url(http://github.com/rsrc/externals/font/lato/lato-bolditalic.eot); + src: url(http://github.com/rsrc/externals/font/lato/lato-bolditalic.eot?#iefix) + format('embedded-opentype'), + url(http://github.com/rsrc/externals/font/lato/lato-bolditalic.woff2) + format('woff2'), + url(http://github.com/rsrc/externals/font/lato/lato-bolditalic.woff) + format('woff'), + url(http://github.com/rsrc/externals/font/lato/lato-bolditalic.ttf) + format('truetype'), + url(http://github.com/rsrc/externals/font/lato/lato-bolditalic.svg#latobold_italic) + format('svg'); + font-weight: bold; + font-style: italic; + +} diff --git a/webroot/rsrc/css/font/phui-font-icon-base.css b/webroot/rsrc/css/font/phui-font-icon-base.css new file mode 100644 index 0000000000..986e4b5e5e --- /dev/null +++ b/webroot/rsrc/css/font/phui-font-icon-base.css @@ -0,0 +1,215 @@ +/** + * @provides phui-font-icon-base-css + */ + +.phui-font-fa { + display: inline-block; + color: {$darkgreytext}; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.ph-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} + +.ph-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} + +.ph-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} + +.ph-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} + +.ph-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} + +.ph-spin { + -webkit-animation: spin 2s infinite linear; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} + +.phui-icon-view.dark { + color: {$darkgreytext}; +} +.phui-icon-view.bluegrey { + color: {$bluetext}; +} +.phui-icon-view.white { + color: #fff; +} +.phui-icon-view.red { + color: {$red}; +} + +.phui-icon-view.delete-color { + color: {$delete-color}; +} + +.phui-icon-view.orange { + color: {$orange}; +} +.phui-icon-view.yellow { + color: {$yellow}; +} +.phui-icon-view.green { + color: {$green} +} + +.phui-icon-view.create-color { + color: {$create-color}; +} + +.phui-icon-view.blue { + color: {$blue}; +} +.phui-icon-view.sky { + color: {$sky}; +} +.phui-icon-view.indigo { + color: {$indigo}; +} +.phui-icon-view.pink { + color: {$pink}; +} +.phui-icon-view.fire { + color: {$fire}; +} +.phui-icon-view.violet { + color: {$violet}; +} +.phui-icon-view.lightbluetext { + color: {$lightbluetext}; +} +.phui-icon-view.lightgreytext, +.phui-icon-view.grey { + color: rgba({$alphagrey},0.3); +} + +/* Backgrounds */ + +.phui-icon-view.bg-dark { + background-color: {$darkgreytext}; +} +.phui-icon-view.bg-bluegrey { + background-color: {$bluetext}; +} +.phui-icon-view.bg-grey { + background-color: {$lightgreytext}; +} +.phui-icon-view.bg-red { + background-color: {$red}; +} +.phui-icon-view.bg-orange { + background-color: {$orange}; +} +.phui-icon-view.bg-yellow { + background-color: {$yellow}; +} +.phui-icon-view.bg-green { + background-color: {$green} +} +.phui-icon-view.bg-blue { + background-color: {$blue}; +} +.phui-icon-view.bg-sky { + background-color: {$sky}; +} +.phui-icon-view.bg-indigo { + background-color: {$indigo}; +} +.phui-icon-view.bg-pink { + background-color: {$pink}; +} +.phui-icon-view.bg-fire { + background-color: {$fire}; +} +.phui-icon-view.bg-violet { + background-color: {$violet}; +} + +/* Hovers */ + +.device-desktop a.phui-icon-view.lightgreytext:hover, +.device-desktop a.phui-icon-view.grey:hover { + color: {$darkgreytext}; +} + +.device-desktop a.phui-icon-view.bluegrey:hover { + color: {$darkbluetext}; +} diff --git a/webroot/rsrc/css/fuel/fuel-grid.css b/webroot/rsrc/css/fuel/fuel-grid.css new file mode 100644 index 0000000000..16acb3eed7 --- /dev/null +++ b/webroot/rsrc/css/fuel/fuel-grid.css @@ -0,0 +1,31 @@ +/** + * @provides fuel-grid-css + */ + +.device-desktop .fuel-grid, +.device-tablet .fuel-grid-tablet > .fuel-grid { + display: table; + table-layout: fixed; +} + +.device-desktop .fuel-grid-body, +.device-tablet .fuel-grid-tablet > .fuel-grid > .fuel-grid-body { + display: table-row-group; +} + +.device-desktop .fuel-grid-row, +.device-tablet .fuel-grid-tablet > .fuel-grid > .fuel-grid-body > + .fuel-grid-row { + display: table-row; +} + +.device-desktop .fuel-grid-cell, +.device-tablet .fuel-grid-tablet > .fuel-grid > .fuel-grid-body > + .fuel-grid-row > .fuel-grid-cell { + display: table-cell; + vertical-align: top; +} + +.fuel-grid-property-list > .fuel-grid { + width: 100%; +} diff --git a/webroot/rsrc/css/fuel/fuel-handle-list.css b/webroot/rsrc/css/fuel/fuel-handle-list.css new file mode 100644 index 0000000000..1a0b19f14e --- /dev/null +++ b/webroot/rsrc/css/fuel/fuel-handle-list.css @@ -0,0 +1,33 @@ +/** + * @provides fuel-handle-list-css + */ + +.fuel-handle-list { + display: table; + max-width: 100%; +} + +.fuel-handle-list-body { + display: table-row-group; +} + +.fuel-handle-list-item { + display: table-row; +} + +.fuel-handle-list-item-cell { + display: table-cell; + vertical-align: top; +} + +.fuel-handle-list-item-icon { + padding-right: 4px; +} + +.fuel-handle-list-item-icon > .phui-icon-view { + width: 18px; + height: 18px; + text-align: center; + display: inline-block; + background-size: 100%; +} diff --git a/webroot/rsrc/css/fuel/fuel-map.css b/webroot/rsrc/css/fuel/fuel-map.css new file mode 100644 index 0000000000..b878689cc0 --- /dev/null +++ b/webroot/rsrc/css/fuel/fuel-map.css @@ -0,0 +1,71 @@ +/** + * @provides fuel-map-css + */ + +.device-desktop .fuel-map { + display: table; + table-layout: fixed; +} + +.device-desktop .fuel-map-items { + display: table-row-group; +} + +.device-desktop .fuel-map-pair { + display: table-row; +} + +.device-desktop .fuel-map-name, +.device-desktop .fuel-map-value { + display: table-cell; + vertical-align: top; +} + +.fuel-map-property-list { + margin: 4px; +} + +.fuel-map-property-list > .fuel-map { + overflow: hidden; + width: 100%; + max-width: 100%; +} + +.fuel-map-property-list > .fuel-map > .fuel-map-items > .fuel-map-pair > + .fuel-map-name, +.fuel-map-property-list > .fuel-map > .fuel-map-items > .fuel-map-pair > + .fuel-map-value { + padding: 2px 4px; + white-space: nowrap; +} + +.fuel-map-property-list > .fuel-map > .fuel-map-items > .fuel-map-pair > + .fuel-map-name { + color: {$bluetext}; +} + +.fuel-map-property-list > .fuel-map > .fuel-map-items > .fuel-map-pair > + .fuel-map-value { + color: {$lightgreytext}; +} + +.device-desktop + .fuel-map-property-list > .fuel-map > .fuel-map-items > .fuel-map-pair > + .fuel-map-name { + text-align: right; + min-width: 80px; + width: 80px; +} + +.device-desktop + .fuel-map-property-list > .fuel-map > .fuel-map-items > .fuel-map-pair > + .fuel-map-value { + text-overflow: ellipsis; + overflow: hidden; +} + +.device + .fuel-map-property-list > .fuel-map > .fuel-map-items > .fuel-map-pair > + .fuel-map-value { + padding-left: 12px; +} diff --git a/webroot/rsrc/css/fuel/fuel-menu.css b/webroot/rsrc/css/fuel/fuel-menu.css new file mode 100644 index 0000000000..513804361a --- /dev/null +++ b/webroot/rsrc/css/fuel/fuel-menu.css @@ -0,0 +1,52 @@ +/** + * @provides fuel-menu-css + */ + +.fuel-menu-item-icon { + width: 14px; + height: 14px; + position: absolute; + left: 8px; + top: 4px; + text-align: center; +} + +.fuel-menu-item-link { + padding: 4px 4px 4px 28px; + position: relative; + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + color: {$greytext}; + cursor: default; + border-radius: 3px; +} + +.fuel-menu-item.has-link > .fuel-menu-item-link { + color: {$darkbluetext}; + cursor: pointer; +} + +.fuel-menu-item.disabled > .fuel-menu-item-link { + color: {$lightgreytext}; +} + +.device-desktop .fuel-menu-item > .fuel-menu-item-link:hover { + text-decoration: none; +} + +.device-desktop .fuel-menu-item.has-link > .fuel-menu-item-link:hover { + color: {$sky}; + background: rgba({$alphablue}, .08); +} + +.fuel-menu-item-background-color-orange > .fuel-menu-item-link { + background: {$sh-orangebackground}; +} + +.device-desktop .fuel-menu-item.has-link.fuel-menu-item-background-color-orange + > .fuel-menu-item-link:hover { + background: {$lightorange}; + color: {$orange}; +} diff --git a/webroot/rsrc/css/layout/phabricator-action-header-view.css b/webroot/rsrc/css/layout/phabricator-action-header-view.css deleted file mode 100644 index 23a7f2c0cf..0000000000 --- a/webroot/rsrc/css/layout/phabricator-action-header-view.css +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @provides phabricator-action-header-view-css - */ - -.phabricator-action-header { - padding: 0 5px 0 8px; - overflow: hidden; -} - -.phabricator-action-header-title { - color: #333; - float: left; - font-size: 14px; - font-weight: bold; - line-height: 15px; - padding: 8px 0; - text-shadow: 0 1px 1px #fff; - white-space: nowrap; -} - -.phabricator-action-header-icon-list { - float: right; - padding-top: 4px; -} - -.phabricator-action-header-icon-item { - float: right; - padding-left: 2px; -} - -.phabricator-action-header-icon-item .phui-icon-view { - display: inline-block; -} - -.phabricator-action-header-icon-item .phabricator-tag-view { - margin: 4px 2px 0; -} - -.phabricator-action-header-link { - color: #333; -} - - -.gradient-green-header .phabricator-action-header-title, -.gradient-red-header .phabricator-action-header-title, -.gradient-blue-header .phabricator-action-header-title, -.gradient-yellow-header .phabricator-action-header-title, -.gradient-green-header .phabricator-action-header-link, -.gradient-red-header .phabricator-action-header-link, -.gradient-blue-header .phabricator-action-header-link, -.gradient-yellow-header .phabricator-action-header-link { - color: #fff; - text-shadow: 0 -1px 1px rgba(0,0,0,.7); -} - -.phabricator-action-header-title span { - float: left; - height: 16px; - width: 16px; - margin-right: 4px; -} - - diff --git a/webroot/rsrc/css/layout/phabricator-action-list-view.css b/webroot/rsrc/css/layout/phabricator-action-list-view.css deleted file mode 100644 index f1f93ecbc1..0000000000 --- a/webroot/rsrc/css/layout/phabricator-action-list-view.css +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @provides phabricator-action-list-view-css - */ - -.phabricator-action-list-view { - background: #ffffff; -} - -.device-desktop .phabricator-action-list-view { - border: 1px solid #c0c5d1; - padding: .5em 0; - - float: right; - margin-top: 0px; - margin-right: 1%; - width: 20%; - border-radius: 3px; - font-size: 12px; - - box-shadow: 0 0 1px 1px rgba(192, 197, 209, 0.5); -} - -.device-desktop .phabricator-header-shell + .phabricator-action-list-view { - margin-top: -33px; -} - -.device-desktop .phabricator-header-shell.phabricator-header-has-image + - .phabricator-action-list-view { - margin-top: -53px; -} - -.device .phabricator-header-shell + .phabricator-action-list-view { - margin-top: -1px; -} - -.device .phabricator-action-list-view { - border-top: 1px solid #dcdcdc; - padding: .5em 0; -} - -.device .phabricator-action-list-view { - display: none; -} - -.device .phabricator-action-list-view.phabricator-action-list-toggle { - display: block; -} - -.device .phabricator-action-view button.phabricator-action-view-item, -.device .phabricator-action-view-item { - font-size: 14px; - line-height: 22px; -} - -.phabricator-action-view { - padding: 1px 0; - position: relative; -} - -.phabricator-action-view button.phabricator-action-view-item { - border: none; - background: transparent; - box-shadow: none; - outline: 0; - padding: 0; - margin: 0; - font-weight: normal; - color: #3b5998; - width: 100%; - text-align: left; - text-shadow: none; - - border-radius: 0; - color: #18559D; - font: inherit; - display: inline; - min-width: 0; -} - -.phabricator-action-view button.phabricator-action-view-item, -.phabricator-action-view-item { - padding: 1px 0 1px 34px; - line-height: 20px; - display: block; - font-size: 12px; - text-decoration: none; -} - -.phabricator-action-view-icon { - width: 14px; - height: 14px; - position: absolute; - top: 5px; - left: 13px; -} - -.device-desktop .phabricator-action-view:hover .phabricator-action-view-item { - text-decoration: none; - background-color: #3875d7; - color: #ffffff; -} - -.phabricator-action-view-disabled .phabricator-action-view-item, -.phabricator-action-view-disabled button.phabricator-action-view-item { - color: #888888; -} - -.phabricator-action-view button[disabled] { - opacity: 1.0; -} - -.device-desktop .phabricator-action-view-disabled:hover - .phabricator-action-view-item, -.device-desktop .phabricator-action-view-disabled:hover - button.phabricator-action-view-item { - background-color: #dfdfdf; - color: #888888; -} diff --git a/webroot/rsrc/css/layout/phabricator-crumbs-view.css b/webroot/rsrc/css/layout/phabricator-crumbs-view.css deleted file mode 100644 index 2fd1fb8cba..0000000000 --- a/webroot/rsrc/css/layout/phabricator-crumbs-view.css +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @provides phabricator-crumbs-view-css - */ - -.phabricator-crumbs-view { - background-color: #d8dce2; - height: 31px; - overflow: hidden; - vertical-align: top; - border-bottom: 1px solid #aaa; - - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); - - /* TODO: Position this over the slider for Differential's file tree view. - Remove this once that gets sorted out. */ - position: relative; -} - -.phabricator-crumbs-view, -.phabricator-crumbs-view a.phabricator-crumb-view, -.phabricator-crumbs-view a.phabricator-crumbs-action { - color: #3d3d3d; - font-weight: bold; - text-decoration: none; - text-shadow: 0 1px 2px rgba(255, 255, 255, 0.9); -} - -.phabricator-crumbs-action.phabricator-crumbs-action-menu { - display: none; -} - -.device .phabricator-crumbs-action.phabricator-crumbs-action-menu { - display: inline-block; -} - -.device .phabricator-crumbs-action-menu-open { - background: rgba(0,0,0,.1); -} - -.phabricator-crumbs-view + .phabricator-header-shell { - border-top: none; -} - -.phabricator-crumbs-view a:hover { - text-decoration: underline; -} - -.phabricator-crumb-view { - display: inline-block; - height: 31px; - line-height: 31px; -} - -.device-phone .phabricator-crumb-view { - display: none; -} - -.device-phone .phabricator-crumb-view.phabricator-last-crumb, -.device-phone .phabricator-crumb-view.phabricator-crumb-has-icon { - display: inline-block; -} - -.phabricator-crumb-icon { - display: inline-block; - width: 28px; - height: 28px; - margin: 2px 2px 0 13px; - vertical-align: top; -} - -.device-phone .phabricator-crumb-icon { - margin-left: 7px; -} - -.phabricator-crumbs-actions { - float: right; -} - -.phabricator-crumbs-action { - display: inline-block; - height: 17px; - padding: 8px 14px 8px 24px; - position: relative; -} - -.device-phone a.phabricator-crumbs-action { - padding: 13px 20px 4px 10px; - border-left: 1px solid #ccc; -} - -.device-phone .phabricator-crumbs-action-name { - display: none; -} - -.device-phone a.phabricator-crumbs-action .sprite-icons { - margin-left: 5px; -} - -.phabricator-crumbs-action .sprite-icons { - width: 14px; - height: 14px; - left: 4px; - top: 9px; - position: absolute; -} - -.phabricator-crumb-divider { - display: inline-block; - width: 9px; - height: 31px; - vertical-align: top; - margin: 0 9px; -} diff --git a/webroot/rsrc/css/layout/phabricator-filetree-view.css b/webroot/rsrc/css/layout/phabricator-filetree-view.css deleted file mode 100644 index 5cb5026f63..0000000000 --- a/webroot/rsrc/css/layout/phabricator-filetree-view.css +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @provides phabricator-filetree-view-css - */ - -.phabricator-filetree { - padding: 4px 0; -} - -/* NOTE: Until the whole side nav situation gets cleaned up, we need to be - highly specific in specifying selectors here, to override side nav styles. -*/ - -.phabricator-filetree .phabricator-filetree-item { - margin: 0; - padding: 0; - display: block; -} - -.phabricator-filetree span.phabricator-filetree-icon { - background-repeat: no-repeat; - background-position: 0 2px; - width: 16px; - height: 20px; - padding: 0; - float: left; -} - -.phabricator-filetree span.phabricator-filetree-name { - padding: 0; - margin-left: 4px; - font-size: 11px; - font-weight: normal; - line-height: 20px; - white-space: nowrap; -} - -.phabricator-filetree span.phabricator-filetree-item - .phabricator-filetree-name { - color: #a0a0a0; -} - -.phabricator-filetree a.phabricator-filetree-item - .phabricator-filetree-name { - color: #fff; -} - -.phabricator-filetree a.phabricator-filetree-item:hover { - text-decoration: none; -} - -.phabricator-filetree-icon-file { - background-image: url(http://github.com/rsrc/image/icon/fatcow/page_white_text.png); -} - -.phabricator-filetree-icon-dir { - background-image: url(http://github.com/rsrc/image/icon/fatcow/folder.png); -} diff --git a/webroot/rsrc/css/layout/phabricator-form-view.css b/webroot/rsrc/css/layout/phabricator-form-view.css deleted file mode 100644 index 4a87d5a85c..0000000000 --- a/webroot/rsrc/css/layout/phabricator-form-view.css +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @provides phabricator-form-view-css - */ - -.phabricator-form-view { - padding: 20px; - background: #f4f5f8; - border-width: 1px 0; - border-style: solid; - border-color: rgb(199, 201, 214); -} - -.device-phone .phabricator-form-view { - padding: 10px 5px 10px 10px; -} - -.device .phabricator-form-view .aphront-form-control .aphront-form-label { - display: block; - float: none; - text-align: left; - margin: 0; - padding: 0; -} - -.device .phabricator-form-view .aphront-form-control .aphront-form-caption { - display: block; - float: none; - text-align: left; - margin: 0; - padding: 0; -} - -.device .phabricator-form-view .aphront-form-control .aphront-form-input { - float: none; - display: block; - text-align: left; - margin: .25em 0 0 0; - width: 99%; - padding: 0; -} - -.device .phabricator-form-view .aphront-form-control .aphront-form-error { - float: none; - text-align: left; - display: block; - margin: 0; - padding: 0; -} diff --git a/webroot/rsrc/css/layout/phabricator-header-view.css b/webroot/rsrc/css/layout/phabricator-header-view.css deleted file mode 100644 index d6a0f5e09a..0000000000 --- a/webroot/rsrc/css/layout/phabricator-header-view.css +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @provides phabricator-header-view-css - */ - -.phabricator-header-shell { - background: #e0e3ec; - border-width: 1px 0; - border-style: solid; - border-color: #c0c5d1; - overflow: hidden; -} - -.phabricator-header-shell + .phabricator-form-view { - border-top-width: 0; -} - -.phabricator-header-view { - padding: 1.25em 2%; - font-size: 15px; - color: #111111; -} - -.device-desktop .phabricator-header-view { - width: 66%; -} - -.phabricator-header-tags { - margin-left: 12px; - font-size: 13px; -} - -.phabricator-header-tags .phabricator-tag-view { - margin-left: 4px; -} - -.phabricator-header-image { - display: inline-block; - background-repeat: no-repeat; - border: 1px solid white; - width: 50px; - height: 50px; - margin: 12px; - float: left; -} - -.phabricator-header-subheader { - color: #444444; - font-weight: normal; - font-size: 13px; - margin-top: 4px; -} diff --git a/webroot/rsrc/css/layout/phabricator-hovercard-view.css b/webroot/rsrc/css/layout/phabricator-hovercard-view.css deleted file mode 100644 index e5fe547727..0000000000 --- a/webroot/rsrc/css/layout/phabricator-hovercard-view.css +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @provides phabricator-hovercard-view-css - */ - -.jx-hovercard-container { - position: absolute; -} - -.phabricator-hovercard-wrapper { - border-radius: 5px; - width: 400px; - padding: 6px; - background-color: rgba(0,0,0,.2); -} - -.device-phone .phabricator-hovercard-wrapper { - width: 300px; -} - -.phabricator-hovercard-container { - border: 1px solid #666666; -} - -.phabricator-hovercard-tags { - float: right; - white-space: normal; -} - -.phabricator-hovercard-body { - padding: 8px; - background-color: white; - color: #333; -} - -.phabricator-hovercard-body-header { - font-size: 14px; - padding-bottom: 2px; - color: #000; -} - -.phabricator-hovercard-body .profile-header-picture-frame { - float: left; - margin: 0; - margin-right: 10px; - margin-bottom: 5px; - width: 50px; - height: 50px; - background-position: center; - background-repeat: no-repeat; -} - -.phabricator-hovercard-tail { - padding: 3px 2px; - background-color: #eeeeee; - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; -} - -.phabricator-hovercard-tail button, -.phabricator-hovercard-tail a.button { - margin: 3px; -} diff --git a/webroot/rsrc/css/layout/phabricator-object-item-list-view.css b/webroot/rsrc/css/layout/phabricator-object-item-list-view.css deleted file mode 100644 index 346fca9b6e..0000000000 --- a/webroot/rsrc/css/layout/phabricator-object-item-list-view.css +++ /dev/null @@ -1,534 +0,0 @@ -/** - * @provides phabricator-object-item-list-view-css - */ - -.phabricator-object-item-list-view { - padding: 8px 6px; -} - -.device-desktop .phabricator-object-item-list-view { - padding: 20px; -} - -.phabricator-object-item-list-view + .phabricator-object-item-list-view { - padding-top: 0; -} - -.phabricator-object-item-list-view.phabricator-object-list-flush { - padding: 0; -} - -.phabricator-object-item-list-view .aphront-error-view { - margin: 0; -} - -.phabricator-object-item { - background: #ffffff; - border-style: solid; - border-color: #c0c5d1; - border-width: 0 0 0 4px; - margin: 5px 0; - - overflow: hidden; - box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.10); -} - -.phabricator-object-item .phui-icon-view { - display: inline-block; -} - -.phabricator-object-item-frame { - border-style: solid; - border-color: #c0c5d1; - border-width: 1px 1px 1px 0; - overflow: hidden; - position: relative; - min-height: 29px; -} - -.phabricator-object-list-cards .phabricator-object-item-frame { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; -} - -.device-desktop .phabricator-object-item { - margin: 0 0 5px 0; -} - -.phabricator-object-item-name { - display: inline-block; - font-weight: bold; - padding: 6px 8px 0; - white-space: nowrap; -} - -.phabricator-object-item-link { - display: inline-block; -} - -.phabricator-object-item-objname { - color: #222222; - cursor: text; -} - -.phabricator-object-item-content { - margin-top: 4px; - overflow: hidden; -} - -.phabricator-object-item-grippable { - cursor: move; -} - -.phabricator-object-item-grip { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 17px; - background: url(http://github.com/rsrc/image/texture/grip.png) center center no-repeat; -} - -.phabricator-object-item-grippable .phabricator-object-item-frame { - padding-left: 11px; -} - -.phabricator-object-item-list-header { - padding: 0 0 8px 0; - color: #555555; -} - -/* - Item Actions -------------------------------------------------------------- - - Action buttons, like "Edit" and "Delete". - -*/ - -.phabricator-object-item-actions { - position: absolute; - right: 0; - top: 0; - bottom: 0; - vertical-align: middle; - text-align: right; - border-left: 1px solid #c0c5d1; - box-shadow: inset 1px 0 1px 0px rgba(0, 0, 0, 0.07); -} - -.phabricator-object-item-actions .phui-list-item-view { - float: right; - height: 100%; - width: 24px; - display: inline-block; - position: relative; -} - -.phabricator-object-item-actions .phui-list-item-view + -.phui-list-item-view { - border-right: 1px solid #d6d6e9; -} - -.phabricator-object-item-actions .phui-list-item-href { - display: inline-block; - position: relative; - width: 24px; - height: 100%; -} - -.phabricator-object-item-actions .phui-list-item-href:hover { - background: #e9e9f9; -} - -.phabricator-object-item-actions .phui-list-item-icon { - width: 14px; - height: 14px; - position: absolute; - display: block; - top: 50%; - margin-top: -7px; - left: 5px; -} - -.phabricator-object-item-actions .phui-list-item-name { - display: none; -} - -.phabricator-object-item-with-1-actions .phabricator-object-item-content-box { - margin-right: 24px; -} - -.phabricator-object-item-with-2-actions .phabricator-object-item-content-box { - margin-right: 48px; -} - -.phabricator-object-item-with-3-actions .phabricator-object-item-content-box { - margin-right: 72px; -} - - -/* - Stackable List ------------------------------------------------------------ - - Tighter, stacking list. - -*/ - -.phabricator-object-item-list-view.phabricator-object-list-stackable - .phabricator-object-item { - margin: -1px 0 0 0; -} - -.phabricator-object-list-stackable .phabricator-object-item { - border-left-width: 1px; -} - -.device-desktop .phabricator-object-list-stackable - .phabricator-object-item:hover { - background: #e9ecf5; -} - -/* - Subhead ------------------------------------------------------------------- - - Descriptive Text or Links under the main header, before attributes. - -*/ - -.phabricator-object-item-subhead { - color: #777; - padding: 0 8px 6px; -} - - -/* - Attribute List ------------------------------------------------------------ - - Object attributes, commonly used to render created date, etc. - -*/ - -.phabricator-object-item-attributes { - padding: 0 8px 6px; -} - -.phabricator-object-item-attribute { - display: inline; - color: #777; -} - -.phabricator-object-item-attribute-spacer { - padding: 0 4px; -} - - -/* - Icons --------------------------------------------------------------------- - - Icons, which show object state. On mobile, they are rendered without labels - to save space. - -*/ - -.phabricator-object-icon-pane { - float: right; - margin-top: 6px; -} - -.device .phabricator-object-item-no-icon-images .phabricator-object-icon-pane { - display: none; -} - -.phabricator-object-item-with-handle-icons .phabricator-object-item-icons { - padding-bottom: 30px; -} - -.phabricator-object-item-icons { - float: right; - padding: 0 10px; -} - -/* NOTE: The main content is an "overflow: hidden" div which we give a right - margin so it doesn't overlap the icons. The margin is slightly larger than - the width + padding of the icon div, so the icons have some space even if - the content is wider than available space. */ - -.device-desktop .phabricator-object-icon-pane { - width: 120px; -} - -.device-desktop .phabricator-object-item-with-icons - .phabricator-object-item-content, -.device-desktop .phabricator-object-item-with-handle-icons - .phabricator-object-item-content { - margin-right: 132px; -} - -.device .phabricator-object-item-icons { - width: 18px; -} - -.device .phabricator-object-item-with-icons .phabricator-object-item-content, -.device .phabricator-object-item-with-handle-icons - .phabricator-object-item-content { - margin-right: 30px; -} - -.device .phabricator-object-item-icon-label { - display: none; -} - -.phabricator-object-item-icon { - vertical-align: middle; - position: relative; - font-size: 11px; - color: #666666; - text-align: right; - white-space: nowrap; - overflow: hidden; - - min-height: 18px; - line-height: 18px; -} - -/* - * Items with icon 'none' still have on mobile, thus creating a weird vertical - * margin for elements which follow - */ -.device-phone .phabricator-object-item-icon-none { - display: none; -} - -.device-desktop .phabricator-object-item-icon { - padding-right: 22px; -} - -.device-desktop .phabricator-object-item-icon-none { - padding-right: 0; -} - -.phabricator-object-item-icon-image { - position: absolute; - right: 2px; - top: 2px; - width: 14px; - height: 14px; -} - - -/* - Bar Colors ---------------------------------------------------------------- - - Colors for the left-hand border bars, used to indicate object status or other - attributes. - -*/ - -.phabricator-object-item-bar-color-red { - border-left-color: {$red}; -} - -.phabricator-object-item-bar-color-orange { - border-left-color: {$orange}; -} - -.phabricator-object-item-bar-color-yellow { - border-left-color: {$yellow}; -} - -.phabricator-object-item-bar-color-green { - border-left-color: {$green}; -} - -.phabricator-object-item-bar-color-sky { - border-left-color: {$sky}; -} - -.phabricator-object-item-bar-color-blue { - border-left-color: {$blue}; -} - -.phabricator-object-item-bar-color-indigo { - border-left-color: {$indigo}; -} - -.phabricator-object-item-bar-color-violet { - border-left-color: {$violet}; -} - -.phabricator-object-item-bar-color-grey { - border-left-color: #bdc3c7; -} - -.phabricator-object-item-bar-color-black { - border-left-color: #333333; -} - -/* - Disabled ------------------------------------------------------------------ - - Disabled/inactive objects. - -*/ - -.phabricator-object-item-disabled { - border-left-color: #d7d7d7; -} - -.phabricator-object-item-disabled .phabricator-object-item-frame { - border-color: #d7d7d7; -} - -.phabricator-object-item-disabled .phabricator-object-item-objname { - color: #777777; -} - - -/* - Effects ------------------------------------------------------------------- - - Effects like highlighted items. - -*/ - -.phabricator-object-item-highlighted { - background: {$lightyellow}; -} - -.phabricator-object-list-cards - .phabricator-object-item.phabricator-object-item-highlighted { - background-image: linear-gradient(to bottom, rgb(253, 255, 221), rgb(243, 245, 206)); - background-image: -webkit-linear-gradient(top, rgb(253, 255, 221), rgb(243, 245, 206)); -} - -.phabricator-object-item-selected { - background: {$lightblue}; -} - -.phabricator-object-list-flush .aphront-error-view { - margin: 0; - background: #fff; -} - - -/* - Foot Icons ---------------------------------------------------------------- - - Object counts shown in the footer. - -*/ - -.phabricator-object-item-foot-icons { - margin-left: 10px; - bottom: 0; - position: absolute; -} - -.phabricator-object-item-with-foot-icons .phabricator-object-item-content { - padding-bottom: 22px; -} - -.phabricator-object-item-foot-icon { - display: inline-block; - background: #909090; - color: #ffffff; - font-weight: bold; - margin-right: 3px; - padding: 1px 4px 0 22px; - height: 19px; - vertical-align: middle; - position: relative; -} - -.phabricator-object-item-foot-icon .sprite-icons { - width: 14px; - height: 14px; - position: absolute; - left: 4px; - top: 3px; -} - - -/* - Handle Icons -------------------------------------------------------------- - - Shows owners, reviewers, etc., using profile picture icons. - -*/ - -.phabricator-object-item-handle-icons { - height: 28px; - margin-right: 10px; - bottom: 0; - right: 0; - text-align: right; - position: absolute; -} - -.phabricator-object-item-handle-icon { - margin: 1px; - width: 28px; - height: 28px; - display: inline-block; - background-size: 28px 28px; - background-repeat: no-repeat; -} - - -/* - Bylines ------------------------------------------------------------------- - - Shows owners, authors, reviewers, etc., in text. - -*/ - -.phabricator-object-item-bylines { - float: right; - clear: right; - padding: 0 10px; - margin: 5px 0; - font-size: 11px; - color: #666; - white-space: nowrap; - overflow: hidden; - text-align: right; -} - -/* - Card List ----------------------------------------------------------------- - - Rounded card list. - -*/ - -/* Hard to sprite since we can't have other sprites appearing in tall cells */ -.phabricator-object-list-cards .phabricator-object-item { - border-radius: 3px; - border-left-width: 6px; - background: #f0f0f0 url('http://github.com/rsrc/image/texture/card-gradient.png') repeat-x; - margin-bottom: 4px; -} - -.phabricator-object-list-cards .phabricator-object-item-frame { - min-height: 50px; -} - -.phabricator-object-list-cards .phabricator-object-item-selected { - background: #bfdcff; -} - -.phabricator-object-list-cards .phabricator-object-item-selected - .phabricator-object-item-frame { - border-color: #99ccff; -} - - -/* - Draggable List ------------------------------------------------------------ - - These classes are applied by and/or provided for use with JX.DraggableList. - -*/ - -.drag-ghost { - position: relative; - border: 1px dashed #aaaaaa; - background: #f9f9f9; - margin: 4px; -} - -.drag-dragging { - position: relative; - opacity: 0.9; -} - -.drag-sending { - opacity: 0.75; -} diff --git a/webroot/rsrc/css/layout/phabricator-property-list-view.css b/webroot/rsrc/css/layout/phabricator-property-list-view.css deleted file mode 100644 index f6b3448cac..0000000000 --- a/webroot/rsrc/css/layout/phabricator-property-list-view.css +++ /dev/null @@ -1,121 +0,0 @@ -/** - * @provides phabricator-property-list-view-css - */ - -.phabricator-property-list-view { - border-color: #c0c5d1; - border-style: solid; - border-width: 1px 0 0 0; - - box-shadow: 0 0 1px 1px rgba(192, 197, 209, 0.3); - margin-top: -1px; -} - -.phabricator-property-list-view .keyboard-shortcuts-available { - float: right; - height: 16px; - margin: 12px 10px -28px 0px; - padding: 0px 20px 0px 0px; - vertical-align: middle; - color: #666666; - text-align: right; - font-size: 11px; - background: - url('http://github.com/rsrc/image/icon/fatcow/key_question.png') right center no-repeat; -} - -.phabricator-property-list-container { - border-color: #c0c5d1; - border-style: solid; - border-width: 0 0 1px; - background-color: #f6f6f6; -} - -.device-desktop .phabricator-property-list-container { - padding: 1em 0 0.5em; -} - -.device .phabricator-property-list-container { - padding: .5em 0; -} - -.phabricator-property-list-key { - color: #333333; - font-weight: bold; - overflow: hidden; - white-space: nowrap; -} - -.device-desktop .phabricator-property-list-key { - width: 15%; - margin-left: 1%; - text-align: right; - float: left; - clear: left; - margin-bottom: .5em; -} - -.device .phabricator-property-list-key { - padding-left: .5em; -} - -.phabricator-property-list-value { - color: #333333; - overflow: hidden; -} - -.device-desktop .phabricator-property-list-value { - width: 50%; - margin-left: 1%; - float: left; - margin-bottom: .5em; -} - -.device .phabricator-property-list-value { - padding-left: 1.5em; - margin-bottom: .5em; -} - -.phabriator-property-list-view-end { - clear: both; -} - -.phabricator-property-list-section-header { - background: #f0f0f0; - color: #666666; - padding: 4px 18px; - border-bottom: 1px solid #dbdbdb; -} - -.phabricator-property-list-text-content { - padding: 12px 18px; - background: #fdfdfd; - border-bottom: 1px solid #dbdbdb; - overflow: hidden; -} - -.phabricator-property-list-image-content { - background: #282828; - border-color: #101010; - color: #fff; -} - - -/* In the common case where we immediately follow a header, move back up 30px - so we snuggle next to the header. */ -.device-desktop .phabricator-header-view - + .phabricator-action-list-view { - margin-top: -30px; -} - -.device-desktop .phabricator-header-view - + .phabricator-action-list-view - + .phabricator-property-list-view { - margin-top: 0px; -} - - -.phabricator-property-list-image { - margin: auto; - max-width: 95%; -} diff --git a/webroot/rsrc/css/layout/phabricator-side-menu-view.css b/webroot/rsrc/css/layout/phabricator-side-menu-view.css deleted file mode 100644 index 920861c0f2..0000000000 --- a/webroot/rsrc/css/layout/phabricator-side-menu-view.css +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @provides phabricator-side-menu-view-css - */ - -.phabricator-side-menu .phui-list-item-view { - display: block; - white-space: nowrap; - text-decoration: none; - font-size: 13px; -} - -.phabricator-side-menu .phui-list-item-href { - display: block; - padding: 6px 8px 6px 24px; - color: #e1e2e5; - text-shadow: rgba(0, 0, 0, 1) 0px 1px 1px; -} - -.phabricator-side-menu .phui-list-item-selected, -.device-desktop .phui-side-menu - .phui-list-item-selected.phui-list-item-href:hover { - background-color: #305c85; - color: #fff; -} - -.phabricator-side-menu .phui-list-item-type-label { - padding: 6px 8px 4px 12px; - color: #f7f7f7; - text-transform: uppercase; - font-size: 12px; - font-weight: bold; - border-style: solid; - background-color: #000; -} - -.phabricator-dark-menu .phui-list-item-type-button, -.phabricator-side-menu .phui-list-item-type-button { - width: 50%; - padding: 5px 8px; - display: block; - border-radius: 4px; - border: 2px solid #000; - margin: 10px auto; - color: #fff; - font-size: 14px; - text-shadow: 0px 1px 1px #000000; - font-weight: bold; - text-align: center; -} - -.phabricator-side-menu .phui-list-item-type-button:hover { - background-color: #1e2225; -} - -.device-desktop .phabricator-side-menu a.phui-list-item-href:hover { - text-decoration: none; - background-color: #1e2225; -} diff --git a/webroot/rsrc/css/layout/phabricator-source-code-view.css b/webroot/rsrc/css/layout/phabricator-source-code-view.css index a3110b66fd..9b61425d63 100644 --- a/webroot/rsrc/css/layout/phabricator-source-code-view.css +++ b/webroot/rsrc/css/layout/phabricator-source-code-view.css @@ -5,34 +5,56 @@ .phabricator-source-code-container { overflow-x: auto; overflow-y: hidden; + border: 1px solid {$paste.border}; +} + +.phui-oi .phabricator-source-code-container { + margin-left: 8px; } .phabricator-source-code { white-space: pre-wrap; padding: 2px 8px 1px; width: 100%; + background: #ffffff; } .phabricator-source-line { + background-color: {$paste.highlight}; text-align: right; + border-right: 1px solid {$paste.border}; + color: {$sh-yellowtext}; + white-space: nowrap; +} + +.phabricator-source-line > a::before { + /* Render the line numbers as a pseudo-element so they don't get copied. */ + content: attr(data-n); +} + +th.phabricator-source-line a, +th.phabricator-source-line span { + display: block; padding: 2px 6px 1px 12px; +} - border-right: 1px solid #dbdbdb; - font-weight: bold; - color: #555555; +th.phabricator-source-line a { + color: {$darkbluetext}; +} - /* When the user selects rows of source, don't visibly select the line - numbers beside them. We use JS to strip the line numbers out when the user - copies the text. */ - -moz-user-select: -moz-none; - -khtml-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; +th.phabricator-source-line a:hover { + background: {$paste.border}; + text-decoration: none; +} + +.phabricator-source-coverage-highlight .phabricator-source-code, +.phabricator-source-highlight .phabricator-source-code { + background: {$paste.highlight}; } -.phabricator-source-highlight { - background: #ff0; +.phabricator-source-coverage-highlight .phabricator-source-line, +.phabricator-source-highlight .phabricator-source-line { + background: {$paste.border}; } .phabricator-source-code-summary { @@ -48,3 +70,65 @@ .phabricator-source-code-summary .phabricator-source-code { white-space: nowrap; } + + +.phabricator-source-blame-skip, +.phabricator-source-blame-info { + -moz-user-select: -moz-none; + -khtml-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.phabricator-source-blame-skip { + min-width: 28px; + border-right: 1px solid {$thinblueborder}; +} + +.phabricator-source-blame-info { + white-space: nowrap; + min-width: 130px; + border-right: 1px solid {$paste.border}; + padding-right: 8px; + + vertical-align: middle; + color: #ffffff; +} + +.phabricator-source-blame-info a { + color: {$darkbluetext}; + text-shadow: 1px 1px rgba(0, 0, 0, 0.05); +} + +.phabricator-source-blame-skip a { + /* Give the user a larger click target. */ + display: block; + padding: 2px 8px; +} + +.phabricator-source-blame-skip a .phui-icon-view { + color: {$darkbluetext}; +} + +.device-desktop .phabricator-source-blame-skip a:hover { + background: {$bluebackground}; +} + +.phabricator-source-blame-author { + display: inline-block; + vertical-align: middle; + padding: 0; + margin: 0 6px 0 8px; + width: 16px; + height: 16px; + background-size: 100% 100%; + background-repeat: no-repeat; +} + +th.phabricator-source-coverage { + padding: 0 8px; + border-left: 1px solid {$thinblueborder}; + background: {$lightgreybackground}; + cursor: w-resize; +} diff --git a/webroot/rsrc/css/layout/phabricator-tag-view.css b/webroot/rsrc/css/layout/phabricator-tag-view.css deleted file mode 100644 index c5aed8ab6d..0000000000 --- a/webroot/rsrc/css/layout/phabricator-tag-view.css +++ /dev/null @@ -1,135 +0,0 @@ -/** - * @provides phabricator-tag-view-css - */ - -.phabricator-tag-view { - font-weight: bold; - text-decoration: none; - display: inline-block; -} - -a.phabricator-tag-view:hover { - text-decoration: none; -} - -.phabricator-tag-state-closed .phabricator-tag-core { - text-decoration: line-through; -} - -.phabricator-tag-core { - color: inherit; - border: 1px solid transparent; - border-radius: 3px; - padding: 0 4px; -} - -.phabricator-tag-view-has-bar .phabricator-tag-core { - border-radius: 0 3px 3px 0; - border-width: 1px 1px 1px 0; -} - -.phabricator-tag-dot { - position: relative; - display: inline-block; - width: 6px; - height: 6px; - margin-right: 3px; - top: -1px; - border-radius: 6px; - border: 1px solid transparent; - box-shadow: 0 0 2px rgba(255, 255, 255, 0.8); -} - -.phabricator-tag-type-state { - color: #ffffff; - text-shadow: rgba(100, 100, 100, 0.40) 0px -1px 1px; -} - -.phabricator-tag-type-object, -a.phabricator-tag-type-object, -a.phabricator-tag-type-object:link { - color: #000000; -} - -.phabricator-tag-type-person { - white-space: nowrap; - color: #19558d; -} - -.phabricator-tag-color-red { - background-color: {$red}; - border-color: {$red}; -} - -.phabricator-tag-color-orange { - background-color: {$orange}; - border-color: {$orange}; -} - -.phabricator-tag-color-yellow { - background-color: {$yellow}; - border-color: {$yellow}; -} - -.phabricator-tag-color-blue { - background-color: {$blue}; - border-color: {$blue}; -} - -.phabricator-tag-color-indigo { - background-color: {$indigo}; - border-color: {$indigo}; -} - -.phabricator-tag-color-green { - background-color: {$green}; - border-color: {$green}; -} - -.phabricator-tag-color-violet { - background-color: {$violet}; - border-color: {$violet}; -} - -.phabricator-tag-color-black { - background-color: #333333; - border-color: #333333; -} - -.phabricator-tag-color-grey { - background-color: #888888; - border-color: #888888; -} - -.phabricator-tag-color-white { - background-color: #f7f7f7; - border-color: #f7f7f7; -} - -.phabricator-tag-color-object { - background-color: #e7e7e7; - border-color: #e7e7e7; -} - -.phabricator-tag-color-person { - background-color: #f1f7ff; - border-color: #f1f7ff; -} - -a.phabricator-tag-view:hover - .phabricator-tag-core.phabricator-tag-color-person { - border-color: #d9ebfd; -} - -a.phabricator-tag-view:hover - .phabricator-tag-core.phabricator-tag-color-object { - border-color: #d7d7d7; -} - -.phabricator-tag-bar { - padding-left: 4px; - border-width: 1px; - border-style: solid; - border-right-color: rgba(0, 0, 0, 0.33); - border-radius: 2px 0 0 2px; -} diff --git a/webroot/rsrc/css/layout/phabricator-timeline-view.css b/webroot/rsrc/css/layout/phabricator-timeline-view.css deleted file mode 100644 index faf96e565b..0000000000 --- a/webroot/rsrc/css/layout/phabricator-timeline-view.css +++ /dev/null @@ -1,259 +0,0 @@ -/** - * @provides phabricator-timeline-view-css - */ - -.phabricator-timeline-view { - background: #eeedf0; -} - -.phabricator-timeline-event-view { - border-width: 0 0 0 3px; - border-style: solid; - border-color: #c0c5d1; - -} - -.device-desktop .phabricator-timeline-event-view { - margin-left: 80px; - margin-right: 12px; - position: relative; -} - -.device-desktop .phabricator-timeline-spacer { - min-height: 20px; - border-right-width: 0; -} - -.device-desktop .phabricator-timeline-major-event, -.device-desktop .phabricator-timeline-minor-event { - border-right-width: 3px; -} - -.device-desktop .phabricator-timeline-wedge { - border-bottom: 3px solid #c0c5d1; - position: absolute; - width: 20px; -} - -.phabricator-timeline-content { - background: #ffffff; - border-style: solid; - border-color: #c0c5d1; - border-width: 1px 0; -} - -.phabricator-timeline-title { - line-height: 28px; - min-height: 28px; - position: relative; -} - -.phabricator-timeline-title a { - font-weight: bold; -} - -.device-desktop .phabricator-timeline-wedge { - left: -20px; -} -.device-desktop .phabricator-timeline-major-event .phabricator-timeline-wedge { - top: 24px; -} - -.device-desktop .phabricator-timeline-minor-event .phabricator-timeline-wedge { - top: 12px; -} - -.phabricator-timeline-image { - background: #c0c5d1; - background-repeat: no-repeat; - position: absolute; -} - -.device-desktop .phabricator-timeline-major-event .phabricator-timeline-image { - width: 50px; - height: 50px; - top: 0px; - left: -70px; -} - -.device-desktop .phabricator-timeline-minor-event .phabricator-timeline-image { - width: 30px; - height: 30px; - background-size: 30px auto; - left: -45px; -} - -.phabricator-timeline-major-event .phabricator-timeline-title { - background: #f7f7f7; - min-height: 29px; -} - -.phabricator-timeline-title { - padding: 0 5px; - overflow-x: auto; -} - -.phabricator-timeline-title-with-icon { - padding-left: 33px; -} - -.phabricator-timeline-major-event .phabricator-timeline-content - .phabricator-timeline-core-content { - padding: 10px 15px; -} - -.phabricator-timeline-core-content { - overflow-x: auto; -} - - -.device .phabricator-timeline-event-view { - min-height: 23px; - position: relative; - margin-left: 3px; - margin-right: 3px; - - border-right-width: 3px; - border-right-style: solid; -} - -.device .phabricator-timeline-image { - display: none; -} - -.device .phabricator-timeline-spacer { - min-height: 8px; - border-width: 0; -} - -.phabricator-timeline-icon-fill { - position: absolute; - width: 30px; - height: 30px; - background-color: #c0c5d1; - top: 0; - left: -3px; -} - -.phabricator-timeline-icon { - position: absolute; - left: 8px; - top: 8px; - height: 14px; - width: 14px; -} - -.phabricator-timeline-extra, .phabricator-timeline-extra a { - font-size: 11px; - font-weight: normal; - color: #888888; -} - -.device-desktop .phabricator-timeline-extra { - float: right; -} - -.device .phabricator-timeline-extra { - display: block; - text-align: right; - line-height: 16px; -} - -.phabricator-timeline-red .phabricator-timeline-border { - border-color: {$red}; -} - -.phabricator-timeline-orange .phabricator-timeline-border { - border-color: {$orange}; -} - -.phabricator-timeline-yellow .phabricator-timeline-border { - border-color: {$yellow}; -} - -.phabricator-timeline-green .phabricator-timeline-border { - border-color: {$green}; -} - -.phabricator-timeline-sky .phabricator-timeline-border { - border-color: {$sky}; -} - -.phabricator-timeline-blue .phabricator-timeline-border { - border-color: {$blue}; -} - -.phabricator-timeline-indigo .phabricator-timeline-border { - border-color: {$indigo}; -} - -.phabricator-timeline-violet .phabricator-timeline-border { - border-color: {$violet}; -} - -.phabricator-timeline-grey .phabricator-timeline-border { - border-color: #888; -} - -.phabricator-timeline-black .phabricator-timeline-border { - border-color: #333; -} - -.phabricator-timeline-red .phabricator-timeline-icon-fill { - background-color: {$red}; -} - -.phabricator-timeline-orange .phabricator-timeline-icon-fill { - background-color: {$orange}; -} - -.phabricator-timeline-yellow .phabricator-timeline-icon-fill { - background-color: {$yellow}; -} - -.phabricator-timeline-green .phabricator-timeline-icon-fill { - background-color: {$green}; -} - -.phabricator-timeline-sky .phabricator-timeline-icon-fill { - background-color: {$sky}; -} - -.phabricator-timeline-blue .phabricator-timeline-icon-fill { - background-color: {$blue}; -} - -.phabricator-timeline-indigo .phabricator-timeline-icon-fill { - background-color: {$indigo}; -} - -.phabricator-timeline-violet .phabricator-timeline-icon-fill { - background-color: {$violet}; -} - -.phabricator-timeline-grey .phabricator-timeline-icon-fill { - background-color: #888; -} - -.phabricator-timeline-black .phabricator-timeline-icon-fill { - background-color: #333; -} - -.phabricator-timeline-shell.anchor-target { - background: rgba(255, 255, 0, 0.50); - box-shadow: 0 0 3px 6px rgba(255, 255, 0, 0.50); -} - -.phabricator-timeline-preview-header { - background: #e0e3ec; - color: #444444; - padding: 4px 1.25%; - border: solid #c0c5d1 1px 0; -} - -.phabricator-timeline-change-details { - padding: 10px 0; - border-style: solid; - border-color: #efefef; - border-width: 1px 0; -} diff --git a/webroot/rsrc/css/layout/phabricator-workboard-view.css b/webroot/rsrc/css/layout/phabricator-workboard-view.css deleted file mode 100644 index 47b8e4bf6a..0000000000 --- a/webroot/rsrc/css/layout/phabricator-workboard-view.css +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @provides phabricator-workboard-view-css - */ - -.phabricator-workboard-view { - width: 100%; -} - -.phabricator-workboard-view-shadow { - padding: 8px; - min-height: 120px; - overflow-x: scroll; - border-radius: 5px; - background: rgba(150,150,150,.1); - box-shadow: inset 0 0 5px rgba(0,0,0,.5); -} - -.phabricator-workboard-action-list { - width: 60px; - float: left; - min-height: 60px; - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; - margin-top: 40px; - background: rgba(150,150,150,.2); -} - -.device-phone .phabricator-workboard-view-shadow { - background: none; - box-shadow: none; - padding: 0; - margin: 0 auto; - width: 100%; -} - -.device-phone .phabricator-workboard-action-list { - width: 100%; - float: none; - display: block; - border-radius: 3px; - margin: 0 0 5px; - overflow: hidden; -} - -.device-phone .phabricator-workboard-action-list li { - display: inline; - float: left; - margin: 0px; -} - -.phabricator-workboard-action-list .phui-icon-view { - display: inline-block; - vertical-align: top; - width: 50px; - height: 50px; - margin: 5px 4px 5px 5px; -} - -.device-phone .phabricator-workboard-action-list .phui-icon-view { - margin-right: 0; -} - diff --git a/webroot/rsrc/css/layout/phabricator-workpanel-view.css b/webroot/rsrc/css/layout/phabricator-workpanel-view.css deleted file mode 100644 index 0bdc19bb5f..0000000000 --- a/webroot/rsrc/css/layout/phabricator-workpanel-view.css +++ /dev/null @@ -1,44 +0,0 @@ -/** - * @provides phabricator-workpanel-view-css - */ - -.phabricator-workpanel-view .phabricator-action-header { - border: 1px solid #b3b5b6; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} - -.phabricator-workpanel-view .phabricator-workpanel-header-action { - float: right; - width: 24px; - border-left: 1px solid #b3b5b6; -} - -.phabricator-workpanel-view .phabricator-workpanel-body { - background: #c4cde0; - padding: 5px 5px 1px 5px; - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; - box-shadow: inset 0 0px 5px rgba(0,0,0,.4); -} - -.phabricator-workpanel-view .phabricator-workpanel-footer-action a { - color: #333; - font-weight: bold; -} - -.device-desktop .phabricator-workpanel-view .phabricator-workpanel-footer-action:hover { - background-color: rgba(100,100,100,.1); - border-radius: 3px; -} - -.phabricator-workpanel-view .phui-list-item-icon { - height: 12px; - width: 12px; - display: inline-block; -} - -.phabricator-workpanel-view .phui-list-item-name { - padding-left: 5px; - display: inline-block; -} diff --git a/webroot/rsrc/css/phui/button/phui-button-bar.css b/webroot/rsrc/css/phui/button/phui-button-bar.css new file mode 100644 index 0000000000..87369e4ab6 --- /dev/null +++ b/webroot/rsrc/css/phui/button/phui-button-bar.css @@ -0,0 +1,61 @@ +/** + * @provides phui-button-bar-css + * @requires phui-button-css + * @requires phui-button-simple-css + */ + +.phui-button-bar-borderless .button { + border: 0; + background-color: transparent; + background-image: none; + padding-left: 10px; + padding-right: 10px; +} + +.phui-button-bar-borderless .button .phui-icon-view { + font-size: 15px; + color: {$bluetext}; +} + +.phui-button-bar-borderless .button:hover { + background-color: transparent; + background-image: none; + border-radius: 3px; +} + +.phui-button-bar-borderless .button:hover .phui-icon-view { + color: {$sky}; +} + +.phui-button-bar-borderless .button { + border: 0; +} + +.phui-button-bar .phui-button-bar-first { + border-top-right-radius: 0px; + border-bottom-right-radius: 0px; +} + +.phui-button-bar .phui-button-bar-middle { + border-radius: 0; + border-left: none; +} + +.phui-button-bar .phui-button-bar-last { + border-left: none; + border-top-left-radius: 0px; + border-bottom-left-radius: 0px; +} + +.phui-button-bar .button.simple:hover { + border-color: {$lightblueborder}; + background-color: #fff; + background-image: none; + color: {$sky}; +} + +.phui-button-bar .button.simple:hover .phui-icon-view { + border-color: {$lightblueborder}; + color: {$sky}; + background-image: none; +} diff --git a/webroot/rsrc/css/phui/button/phui-button-simple.css b/webroot/rsrc/css/phui/button/phui-button-simple.css new file mode 100644 index 0000000000..1ebfea47d5 --- /dev/null +++ b/webroot/rsrc/css/phui/button/phui-button-simple.css @@ -0,0 +1,131 @@ +/** + * @provides phui-button-simple-css + * @requires phui-button-css + */ + + +/* - Basic -------------------------------------------------------------------*/ + +button.phui-button-simple, +input[type="submit"].phui-button-simple, +a.phui-button-simple, +a.phui-button-simple:visited { + background: {$page.content}; + color: {$bluetext}; + border: 1px solid {$lightblueborder}; +} + +button.phui-button-simple .phui-icon-view, +input[type="submit"].phui-button-simple .phui-icon-view, +a.phui-button-simple .phui-icon-view, +a.phui-button-simple:visited .phui-icon-view { + color: {$lightbluetext}; +} + +a.button.phui-button-simple:hover, +button.phui-button-simple:hover { + border-color: {$blueborder}; + background-image: none; + background-color: {$page.content}; + transition: 0s; +} + +a.phui-button-simple.current { + background: {$lightblue}; +} + + +/* - Red --------------------------------------------------------------------*/ + +button.phui-button-simple.button-red, +input[type="submit"].phui-button-simple.button-red, +a.phui-button-simple.button-red, +a.phui-button-simple.button-red:visited { + background: {$sh-redbackground}; + color: {$redtext}; + border: 1px solid {$sh-redborder}; +} + +button.phui-button-simple.button-red .phui-icon-view, +input[type="submit"].phui-button-simple.button-red .phui-icon-view, +a.phui-button-simple.button-red .phui-icon-view, +a.phui-button-simple.button-red:visited .phui-icon-view { + color: {$redtext}; +} + +a.button.phui-button-simple.button-red:hover, +button.phui-button-simple.button-red:hover { + border-color: {$sh-redtext}; + background-image: none; + background-color: {$sh-redbackground}; + transition: 0s; +} + +/* - Green ------------------------------------------------------------------*/ + +button.phui-button-simple.button-green, +input[type="submit"].phui-button-simple.button-green, +a.phui-button-simple.button-green, +a.phui-button-simple.button-green:visited { + background: {$sh-greenbackground}; + color: {$greentext}; + border: 1px solid {$sh-greenborder}; +} + +button.phui-button-simple.button-green .phui-icon-view, +input[type="submit"].phui-button-simple.button-green .phui-icon-view, +a.phui-button-simple.button-green .phui-icon-view, +a.phui-button-simple.button-green:visited .phui-icon-view { + color: {$greentext}; +} + +a.button.phui-button-simple.button-green:hover, +button.phui-button-simple.button-green:hover { + border-color: {$sh-greentext}; + background-image: none; + background-color: {$sh-greenbackground}; + transition: 0s; +} + +/* - Yellow -----------------------------------------------------------------*/ + +button.phui-button-simple.button-yellow, +input[type="submit"].phui-button-simple.button-yellow, +a.phui-button-simple.button-yellow, +a.phui-button-simple.button-yellow:visited { + background-color: {$sh-yellowbackground}; + color: {$sh-yellowtext}; + border: 1px solid {$sh-yellowborder}; +} + +button.phui-button-simple.button-yellow .phui-icon-view, +input[type="submit"].phui-button-simple.button-yellow .phui-icon-view, +a.phui-button-simple.button-yellow .phui-icon-view, +a.phui-button-simple.button-yellow:visited .phui-icon-view { + color: {$sh-yellowicon}; +} + +a.button.phui-button-simple.button-yellow:hover, +button.phui-button-simple.button-yellow:hover { + border-color: {$sh-yellowtext}; + background-image: none; + background-color: {$sh-yellowbackground}; + transition: 0s; +} + + +/* - Misc -------------------------------------------------------------------*/ + +a.button.phui-button-simple .phui-icon-view { + border: none; +} + +a.button.phui-button-simple.phuix-dropdown-open { + background-color: #fff; + color: {$blue}; + box-shadow: none; +} + +a.button.phui-button-simple.phuix-dropdown-open:hover .phui-icon-view { + color: {$blue}; +} diff --git a/webroot/rsrc/css/phui/button/phui-button.css b/webroot/rsrc/css/phui/button/phui-button.css new file mode 100644 index 0000000000..22ad96779d --- /dev/null +++ b/webroot/rsrc/css/phui/button/phui-button.css @@ -0,0 +1,343 @@ +/** + * @provides phui-button-css + */ + + +button, +a.button, +input[type="submit"] { + font: {$basefont}; + -webkit-font-smoothing: antialiased; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +button.phabricator-action-view-item { + -webkit-font-smoothing: auto; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +button:focus, +a.button:focus { + outline: 0; + box-shadow: 0 0 2pt 2pt rgba(82, 168, 236, 0.7); +} + +button, +a.button, +a.button:visited, +input[type="submit"] { + background-color: {$blue.button.color}; + border: 1px solid {$blue.button.color}; + background-image: {$blue.button.gradient}; + color: white; + cursor: pointer; + font-weight: bold; + font-size: {$normalfontsize}; + display: inline-block; + padding: 4px 14px 5px; + text-align: center; + white-space: nowrap; + border-radius: 3px; +} + +button .phui-icon-view, +a.button .phui-icon-view, +button.button-green .phui-icon-view, +a.button.button-green .phui-icon-view, +button.button-red .phui-icon-view, +a.button.button-red .phui-icon-view { + color: white; +} + +button.button-grey .phui-icon-view, +a.button.button-grey .phui-icon-view { + color: {$darkbluetext}; +} + +/* Buttons with images (full size only) */ +button.icon, +a.icon, +a.icon:visited { + padding-left: 0; + position: relative; + text-indent: 29px; +} + +button.button-green, +a.button-green.button, +a.button-green.button:visited, +input[type="submit"].button-green { + background-color: {$green.button.color}; + border-color: {$green.button.color}; + background-image: {$green.button.gradient}; +} + +button.button-red, +a.button-red.button, +a.button-red.button:visited, +input[type="submit"].button-red { + background-color: {$red.button.color}; + border-color: {$red.button.color}; + background-image: {$red.button.gradient}; +} + +button.button-grey, +a.button-grey, +a.button-grey:visited, +input[type="submit"].button-grey { + background-color: {$grey.button.color}; + background-image: {$grey.button.gradient}; + border: 1px solid rgba({$alphablue}, 0.3); + color: {$darkgreytext}; +} + +a.disabled, +button.disabled, +button[disabled] { + filter:alpha(opacity=50); + -moz-opacity: 0.5; + -khtml-opacity: 0.5; + opacity: 0.5; +} + +button.button-grey.selected, +a.button.button-grey.selected, +button.button-grey.selected:hover, +a.button.button-grey.selected:hover { + border-color: {$sh-orangetext}; + color: {$sh-orangetext}; +} + +button.button-grey.selected .phui-icon-view, +a.button-grey.selected .phui-icon-view { + color: {$sh-orangetext}; +} + +a.phuix-dropdown-open { + color: {$greytext}; +} + +a.button:hover, +button:hover { + text-decoration: none; + background-color: #2980b9; + background-image: {$blue.button.hover}; + border-color: #115988; + transition: 0.1s; +} + +a.button.button-grey:hover, +button.button-grey:hover { + background-image: {$grey.button.hover}; + border-color: rgba({$alphablue}, 0.4); + transition: 0.1s; +} + +a.button.button-green:hover, +button.button-green:hover { + border-color: #127336; + background-color: #0DAD48; + background-image: {$green.button.hover}; + transition: 0.1s; +} + +a.button.button-red:hover, +button.button-red:hover { + border-color: #79150b; + background-color: #0DAD48; + background-image: {$red.button.hover}; + transition: 0.1s; +} + +body a.button.disabled:hover, +body button.disabled:hover, +body a.button.disabled:active, +body button.disabled:active { + box-shadow: none; +} + +button.small, +a.small, +a.small:visited { + padding: 2px 8px; + height: auto; + font-size: {$smallestfontsize}; + line-height: 16px; +} + +button.link { + display: inline; + border: none; + background: transparent; + background-image: none; + font-weight: normal; + padding: 0; + margin: 0; + font-size: inherit; + border-bottom: none; + text-decoration: none; + color: #19558D; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +button.link:hover { + text-decoration: underline; +} + +.phuix-dropdown-menu { + position: absolute; + width: 200px; + background: {$page.content}; + margin-top: -1px; + padding: 12px; + box-shadow: {$dropshadow}; + border: 1px solid {$lightgreyborder}; + border-radius: 3px; + margin-bottom: 16px; +} + +.phuix-dropdown-menu a:focus { + /* We automatically focus links in dropdown menus for assistive devices, but + this is distracting for visual user agents. */ + outline: none; +} + +a.policy-control { + width: 240px; + text-align: left; +} + +a.policy-control .caret { + float: right; +} + +a.policy-control .phui-button-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: block; +} + +.device-phone a.button.policy-control { + display: block; + float: none; + width: auto; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 5px solid {$page.content}; + border-right: 5px solid transparent; + border-left: 5px solid transparent; + content: ""; +} + +.caret-right { + display: inline-block; + width: 0; + height: 0; + vertical-align: middle; + border-left: 7px solid {$greytext}; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + content: ""; + margin-bottom: 4px; +} + +.caret-left { + display: inline-block; + width: 0; + height: 0; + vertical-align: middle; + border-right: 7px solid {$greytext}; + border-bottom: 5px solid transparent; + border-top: 5px solid transparent; + content: ""; + margin-bottom: 4px; +} + +.dropdown .caret { + margin-top: 7px; + margin-right: -4px; +} + +.small.dropdown .caret { + margin-top: 6px; +} + +.button-grey.dropdown .caret { + border-top-color: {$blacktext}; +} + +/* Icons */ +.button.has-icon { + position: relative; +} + +.button.has-icon.dropdown .phui-icon-view { + margin-right: 8px; + margin-left: -2px; +} + +.button.has-text .phui-icon-view { + display: inline-block; + position: absolute; + top: 7px; + left: 12px; + margin: 0; +} + +.button.icon-last .phui-icon-view { + left: auto; + right: 10px; +} + +.phui-button-text { + display: inline-block; +} + +.dropdown .phui-button-text { + margin-right: 8px; +} + +.button.has-icon .phui-button-text { + margin-left: 16px; +} + +.button.has-icon.icon-last .phui-button-text { + margin: 0 16px 0 0; +} + +/* Login Buttons */ + +.button.big.has-icon { + padding: 4px 20px 4px 14px; + border-radius: 4px; + text-align: left; +} + +.button.big.has-icon .phui-button-text { + margin-left: 30px; + display: block; +} + +.button.big.has-icon .phui-button-subtext { + color: {$greytext}; + font-size: {$smallerfontsize}; + line-height: 15px; + font-weight: normal; +} + diff --git a/webroot/rsrc/css/phui/calendar/phui-calendar-day.css b/webroot/rsrc/css/phui/calendar/phui-calendar-day.css new file mode 100644 index 0000000000..1c97c42265 --- /dev/null +++ b/webroot/rsrc/css/phui/calendar/phui-calendar-day.css @@ -0,0 +1,111 @@ +/** + * @provides phui-calendar-day-css + */ + +.device .phui-day-view-column { + display: none; +} + +.device .phui-calendar-list-container { + width: 100%; +} + +.aphront-multi-column-column-outer.phui-day-view-upcoming, +.aphront-multi-column-column-outer.phui-day-view-column{ + padding: 0; +} + +.aphront-multi-column-column-outer.phui-day-view-upcoming .phui-header-shell { + margin: 0; +} + +.phui-calendar-day-view { + overflow: scroll; + width: 100%; +} + +.phui-calendar-day-hour { + width: 60px; + color: {$lightgreytext}; + text-align: right; + padding: 4px 4px; + border-right: 1px solid {$lightgreyborder}; +} + +.phui-calendar-day-view tr { + height: 60px; +} + +.phui-calendar-day-view td { + position: relative; + cursor: pointer; +} + +.phui-calendar-day-view td:hover { + background: {$lightbluebackground}; +} + +.phui-calendar-day-view tr + tr td.phui-calendar-day-events { + border-top: 1px solid {$lightgreyborder}; +} + +.phui-drag { + opacity: .25; +} + +div.phui-calendar-day-event { + width: 100%; + position: absolute; + top: 0; + bottom: 0; + min-height: 30px; +} + +.can-drag a { + cursor: move; +} + +div.phui-calendar-day-event.all-day { + position: relative; +} + +.phui-calendar-day-event-link { + margin: 0 0 -1px -1px; + box-sizing: border-box; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} + +.phui-calendar-day-event-link.viewer-invited-day-event { + border-color: {$green}; + background-color: {$lightgreen}; + color: {$green}; +} + +.day-view-all-day, +.phui-calendar-day-event-link { + padding: 8px; + border: 1px solid {$lightblueborder}; + background-color: {$bluebackground}; + color: {$greytext}; + text-decoration: none; +} + +.day-view-all-day { + margin: 3px 0 3px 4px; + display: block; +} + +.phui-calendar-day-event + .phui-calendar-day-event .day-view-all-day { + border-top-style: none; + border-top-width: 0; +} + +.phui-calendar-all-day-label { + color: {$greytext}; + float: right; + margin: 8px 8px 0 0; +} diff --git a/webroot/rsrc/css/phui/calendar/phui-calendar-list.css b/webroot/rsrc/css/phui/calendar/phui-calendar-list.css new file mode 100644 index 0000000000..5fea904911 --- /dev/null +++ b/webroot/rsrc/css/phui/calendar/phui-calendar-list.css @@ -0,0 +1,87 @@ +/** + * @provides phui-calendar-list-css + */ + +.device-phone .phui-calendar-list-container { + width: auto; +} + +.calendar-profile-box .calendar-day-view-sidebar .phui-object-box { + border-bottom: none; + margin: 0; + padding: 0 12px 12px; +} + +.project-view-home .phui-object-box .phui-calendar-list-container + .phui-header-shell { + padding: 8px 0; + background: {$page.content}; +} + +.phui-calendar-list { + padding: 16px 4px; +} + +.phui-calendar-list-item { + position: relative; + line-height: 18px; + height: 18px; +} + +.phui-calendar-list-item a { + display: block; + width: auto; + min-height: 18px; +} + +.phui-calendar-list-item-icon { + position: absolute; + left: 0; + top: 3px; +} + +.phui-calendar-list-title { + width: 200px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + position: absolute; + left: 20px; + top: 0; +} + +.phui-calendar-viewer-invited .phui-calendar-list-title { + font-weight: bold; +} + +.phui-calendar-list-item .phui-calendar-list-time { + position: absolute; + top: 0; + width: 60px; + right: 0; + color: {$lightgreytext}; + text-align: right; + line-height: 20px; +} + +.phui-calendar-list-item-empty { + color: {$lightgreytext}; + padding: 0; + font-style: italic; +} + +.phui-calendar-list-item.all-day { + background: {$bluebackground}; +} + +.calendar-day-view-sidebar .phui-calendar-list { + padding: 12px 0; +} + +.calendar-day-view-sidebar .phui-calendar-list-item { + padding: 0 12px; +} + +.calendar-day-view-sidebar .phui-calendar-list-item a { + position: relative; +} diff --git a/webroot/rsrc/css/phui/calendar/phui-calendar-month.css b/webroot/rsrc/css/phui/calendar/phui-calendar-month.css new file mode 100644 index 0000000000..49b792023d --- /dev/null +++ b/webroot/rsrc/css/phui/calendar/phui-calendar-month.css @@ -0,0 +1,228 @@ +/** + * @provides phui-calendar-month-css + */ + +.phui-calendar-view { + width: 100%; + border-collapse: collapse; + background: {$page.content}; +} + +tr.phui-calendar-day-of-week-header th { + text-align: center; + font-size: 13px; + padding: 3px; + color: {$lightbluetext}; + background: {$lightgreybackground}; +} + +tr.phui-calendar-day-of-week-header th.weekend-day-header { + background: {$greybackground}; +} + +.device tr.phui-calendar-day-of-week-header th .long-weekday-name { + display: none; +} + +tr.phui-calendar-day-of-week-header th .short-weekday-name { + display: none; +} + +.device tr.phui-calendar-day-of-week-header th .short-weekday-name { + display: inline; +} + +table.phui-calendar-view td { + border: solid {$lightblueborder}; + border-width: 1px 0 0; + width: 14.2857%; /* This is one seventh, approximately. */ +} + +table.phui-calendar-view td + td { + border-left-width: 1px; +} + +table.phui-calendar-view td.phui-calendar-month-number { + border-top-width: 0; +} + +.phui-calendar-month-cell-div { + position: relative; +} + +.phui-calendar-month-event-list .phui-calendar-month-cell-div { + min-height: 125px; +} + +.device .phui-calendar-month-event-list .phui-calendar-month-cell-div { + min-height: 32px; +} + +.device table.phui-calendar-view .phui-calendar-event-list { + display: none; +} + +.phui-calendar-month-event-count { + display: none; +} + +.device .phui-calendar-month-event-count { + display: block; + text-align: center; + padding-top: 8px; +} + +.phui-calendar-month-event-count .phui-calendar-month-count-badge { + border: 1px solid {$lightgreyborder}; + color: {$lightgreytext}; + width: 20px; + height: 20px; + border-radius: 50%; + text-align: center; + vertical-align: middle; + padding: 4px 2px 0px 2px; + margin: 0 auto; +} + +.phui-calendar-month-count-badge.viewer-invited-day-badge { + border-color: {$green}; + color: {$green}; +} + +table.phui-calendar-view a.phui-calendar-week-number { + color: {$lightgreyborder}; + padding: 4px; + display: inline-block; + width: 16px; + text-align: center; + float: left; +} + +table.phui-calendar-view a.phui-calendar-date-number { + color: {$lightgreytext}; + padding: 4px; + display: inline-block; + width: 16px; + text-align: center; +} + +.device table.phui-calendar-view a.phui-calendar-week-number, +.device table.phui-calendar-view a.phui-calendar-date-number { + width: 12px; +} + +table.phui-calendar-view td.phui-calendar-month-number { + font-weight: normal; + color: {$lightgreytext}; + text-align: right; +} + +.phui-calendar-today-slot { + display: block; + height: 4px; + position: absolute; + left: 0; + right: -1px; + bottom: 0; +} + +.phui-calendar-today-slot.last-weekday { + right: 0px; +} + +.phui-calendar-this-week .phui-calendar-today-slot { + background-color: {$blue}; +} + +.phui-calendar-today .phui-calendar-today-slot, +.phui-calendar-today .phui-calendar-date-number { + background-color: {$sky}; +} + +table.phui-calendar-view .phui-calendar-today a.phui-calendar-date-number { + color: #ffffff; +} + +.phui-calendar-event-empty { + border-color: transparent; + background: transparent; +} + +.phui-calendar-view .phui-calendar-list, +.phui-calendar-view .phui-calendar-month-list { + padding: 1px; + width: auto; +} + +.phui-calendar-list-item.all-day span { + padding: 0; + margin: 0; +} + +.phui-calendar-view .phui-calendar-list li.phui-calendar-list-item.all-day { + height: 20px; + background-color: {$bluebackground}; + display: block; + float: none; +} + +.phui-calendar-view +.phui-calendar-list +li.phui-calendar-viewer-invited.all-day { + background-color: {$lightgreen}; +} + +.phui-calendar-view .phui-calendar-list li { + padding: 0px 4px; +} + +.phui-calendar-view .phui-calendar-list li a { + display: block; + overflow: hidden; + position: relative; + height: 18px; +} + +.phui-calendar-view li.phui-calendar-list-item { + white-space: nowrap; + width: auto; +} + +.phui-calendar-list-item-icon { + display: block; + left: 0px; +} + +.phui-calendar-view li.phui-calendar-list-item .phui-calendar-list-title { + width: auto; + position: absolute; + left: 16px; + right: 60px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.phui-calendar-view li.phui-calendar-list-item .phui-calendar-list-time { + position: absolute; + top: 0; + right: 0px; + padding: 0; + width: 60px; + color: {$lightgreytext}; + text-align: right; +} + +td.phui-calendar-month-day, +td.phui-calendar-month-number { + cursor: pointer; +} + +.device-desktop td.phui-calendar-month-day.calendar-hover, +.device-desktop td.phui-calendar-month-number.calendar-hover { + background: {$hoverblue}; +} + +.phui-calendar-month-adjacent { + background: {$greybackground}; +} diff --git a/webroot/rsrc/css/phui/calendar/phui-calendar.css b/webroot/rsrc/css/phui/calendar/phui-calendar.css new file mode 100644 index 0000000000..0d8dcfc56e --- /dev/null +++ b/webroot/rsrc/css/phui/calendar/phui-calendar.css @@ -0,0 +1,159 @@ +/** + * @provides phui-calendar-css + */ + +.phui-calendar-list { + /* When hovering over a day, this allows the hover color to peek through + the event name, but for event names to mostly remain readable. */ + +} + +.application-search-view div.phui-calendar-box { + border-left: 1px solid {$thinblueborder}; + border-right: 1px solid {$thinblueborder}; + border-bottom: 1px solid {$lightblueborder}; + border-radius: 0; +} + +.phui-calendar-list a { + color: {$greytext}; +} + +.phui-calendar-list .event-cancelled .phui-calendar-list-title { + text-decoration: line-through; +} + +.phui-calendar-viewer-invited a { + color: {$green}; +} + +.phui-calendar-red a { + color: {$red}; +} + +.phui-calendar-orange a { + color: {$orange}; +} + +.phui-calendar-yellow a { + color: {$yellow}; +} + +.phui-calendar-green a { + color: {$green} +} + +.phui-calendar-blue a { + color: {$blue}; +} + +.phui-calendar-sky a { + color: {$sky}; +} + +.phui-calendar-indigo a { + color: {$indigo}; +} + +.phui-calendar-violet a { + color: {$violet}; +} + +.phui-calendar-grey a { + color: {$lightgreytext}; +} + +.phui-calendar-bg-viewer-invited { + background-color: {$lightgreen}; +} + +.phui-calendar-bg-red { + background-color: {$lightred}; +} + +.phui-calendar-bg-orange { + background-color: {$lightorange}; +} + +.phui-calendar-bg-yellow { + background-color: {$lightyellow}; +} + +.phui-calendar-bg-green { + background-color: {$lightgreen}; +} + +.phui-calendar-bg-blue { + background-color: {$lightblue}; +} + +.phui-calendar-bg-sky { + background-color: {$lightsky}; +} + +.phui-calendar-bg-indigo { + background-color: {$lightindigo}; +} + +.phui-calendar-bg-violet { + background-color: {$lightviolet}; +} + +.phui-calendar-bg-grey { + background-color: {$darkgreybackground}; +} + +.phui-calendar-list-dot { + background-color: {$lightgreytext}; + border-color: {$lightgreytext}; +} + +.phui-calendar-viewer-invited .phui-calendar-list-dot { + background-color: {$green}; + border-color: {$green}; +} + +.phui-calendar-red .phui-calendar-list-dot { + background-color: {$red}; + border-color: {$red}; +} + +.phui-calendar-orange .phui-calendar-list-dot { + background-color: {$orange}; + border-color: {$orange}; +} + +.phui-calendar-yellow .phui-calendar-list-dot { + background-color: {$orange}; + border-color: {$orange}; +} + +.phui-calendar-green .phui-calendar-list-dot { + background-color: {$green}; + border-color: {$green}; +} + +.phui-calendar-blue .phui-calendar-list-dot { + background-color: {$blue}; + border-color: {$blue}; +} + +.phui-calendar-sky .phui-calendar-list-dot { + background-color: {$sky}; + border-color: {$sky}; +} + +.phui-calendar-indigo .phui-calendar-list-dot { + background-color: {$indigo}; + border-color: {$indigo}; +} + +.phui-calendar-violet .phui-calendar-list-dot { + background-color: {$violet}; + border-color: {$violet}; +} + +.phui-calendar-grey .phui-calendar-list-dot { + background-color: {$lightgreytext}; + border-color: {$lightgreytext}; +} diff --git a/webroot/rsrc/css/phui/object-item/phui-oi-big-ui.css b/webroot/rsrc/css/phui/object-item/phui-oi-big-ui.css new file mode 100644 index 0000000000..3ad8f3a198 --- /dev/null +++ b/webroot/rsrc/css/phui/object-item/phui-oi-big-ui.css @@ -0,0 +1,107 @@ +/** + * @provides phui-oi-big-ui-css + * @requires phui-oi-list-view-css + */ + +.phui-oi-list-big ul.phui-oi-list-view { + margin: 0; + padding: 20px; +} + +.phui-oi-list-big .phui-oi-no-bar .phui-oi-frame { + border: 0; +} + +.phui-oi-list-big .phui-oi-image-icon { + margin: 12px 2px 12px; + text-align: center; +} + +.phui-oi-list-big .phui-oi-image-icon .phui-icon-view { + position: relative; +} + +.phui-oi-list-big a.phui-oi-link { + color: {$blacktext}; + font-size: {$biggestfontsize}; +} + +.phui-oi-list-big .phui-oi-name { + padding-top: 6px; +} + +.phui-oi-list-big .phui-oi-launch-button a.button { + font-size: {$normalfontsize}; + padding: 3px 12px 4px; +} + +.device-desktop .phui-oi-list-big .phui-oi { + margin-bottom: 8px; +} + +.phui-oi-list-big .phui-oi-col0 { + vertical-align: top; + padding: 0; +} + +.phui-oi-list-big .phui-oi-status-icon { + padding: 5px; +} + +.phui-oi-list-big .phui-oi-visited a.phui-oi-link { + color: {$violet}; +} + +.phui-box-white-config .phui-oi-list-big.phui-oi-list-view { + padding: 8px 8px 4px; +} + +.phui-box-white-config .phui-oi-frame { + padding: 4px 8px 0; +} + +.device-desktop .phui-box-white-config .phui-oi:hover .phui-oi-frame { + background-color: {$hoverblue}; + border-radius: 3px; +} + +.phui-oi-list-big .phui-oi-frame { + padding: 2px 8px; +} + +.phui-oi-list-big .phui-oi-linked-container { + border-width: 1px; + border-style: solid; + border-radius: 4px; +} + +.phui-oi-list-big .phui-oi-enabled.phui-oi-linked-container { + border-color: {$lightblueborder}; + box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.05); +} + +.phui-oi-list-big .phui-oi-disabled.phui-oi-linked-container { + border-color: {$greybackground}; +} + +.phui-oi-list-big .phui-oi-disabled .phui-oi-image-icon .phui-icon-view { + color: {$darkgreybackground}; +} + +.device-desktop .phui-oi-linked-container { + cursor: pointer; +} + +.device-desktop .phui-oi-enabled.phui-oi-linked-container:hover { + background-color: {$hoverblue}; + border-color: {$blueborder}; +} + +.device-desktop .phui-oi-linked-container a:hover { + text-decoration: none; +} + +/* Spacing for InfoView inside an object item list, like MFA setup. */ +.phui-oi .phui-info-view { + margin: 0 4px 4px; +} diff --git a/webroot/rsrc/css/phui/object-item/phui-oi-color.css b/webroot/rsrc/css/phui/object-item/phui-oi-color.css new file mode 100644 index 0000000000..e9ec630727 --- /dev/null +++ b/webroot/rsrc/css/phui/object-item/phui-oi-color.css @@ -0,0 +1,68 @@ +/** + * @provides phui-oi-color-css + * @requires phui-oi-list-view-css + */ + + +/* - Bar Colors ---------------------------------------------------------------- + Colors for the left-hand border bars, used to indicate object status or other + attributes. +*/ + +.phui-oi-bar-color-red { + border-left-color: {$red}; +} + +.phui-oi-bar-color-orange { + border-left-color: {$orange}; +} + +.phui-oi-bar-color-yellow { + border-left-color: {$yellow}; +} + +.phui-oi-bar-color-green { + border-left-color: {$green}; +} + +.phui-oi-bar-color-sky { + border-left-color: {$sky}; +} + +.phui-oi-bar-color-blue { + border-left-color: {$blue}; +} + +.phui-oi-bar-color-indigo { + border-left-color: {$indigo}; +} + +.phui-oi-bar-color-violet { + border-left-color: {$violet}; +} + +.phui-oi-bar-color-pink { + border-left-color: {$pink}; +} + +.phui-oi-bar-color-fire { + border-left-color: {$fire}; +} + +.phui-oi-bar-color-bluegrey { + border-left-color: {$bluetext}; +} + +.phui-oi-bar-color-lightbluetext { + border-left-color: {$lightbluetext}; +} + +.phui-oi-bar-color-grey, +.phui-oi-bar-color-lightgreytext { + border-left-color: {$lightgreytext}; +} + +.phui-oi-bar-color-black, +.phui-oi-bar-color-dark { + border-left-color: {$darkgreytext}; +} diff --git a/webroot/rsrc/css/phui/object-item/phui-oi-drag-ui.css b/webroot/rsrc/css/phui/object-item/phui-oi-drag-ui.css new file mode 100644 index 0000000000..5f24e2b983 --- /dev/null +++ b/webroot/rsrc/css/phui/object-item/phui-oi-drag-ui.css @@ -0,0 +1,67 @@ +/** + * @provides phui-oi-drag-ui-css + * @requires phui-oi-list-view-css + */ + +.phui-object-box .phui-oi-list-view.phui-oi-list-drag { + margin-top: 8px; + margin-bottom: 4px; +} + +.phui-oi.phui-oi-drag { + background: {$bluebackground}; + border-radius: 3px; + border: none; +} + +.phui-oi.phui-oi-drag, +.phui-oi.phui-oi-drag .phui-oi-frame { + border: none; +} + +.phui-object-box .phui-oi-list-view .phui-oi.phui-oi-drag { + margin-top: 4px; +} + +.phui-oi-drag .phui-oi-name { + padding-left: 0; +} + +.phui-oi-drag.phui-oi-with-image-icon .phui-oi-frame, +.phui-oi-drag.phui-oi-with-image .phui-oi-frame, +.phui-oi-drag .phui-oi-frame { + min-height: 36px; +} + +.phui-oi-drag .phui-oi-list-icon { + height: auto; + width: auto; +} + +.phui-oi-drag .phui-oi-image-icon .phui-icon-view { + height: 16px; + width: 16px; + font-size: 16px; + line-height: 20px; +} + +.phui-oi-drag.phui-oi-grippable .phui-oi-frame { + padding-left: 28px; +} + +.phui-oi-drag .phui-oi-grip { + left: 4px; +} + +.phui-oi-drag.phui-oi-with-image-icon .phui-oi-content-box, +.phui-oi-drag.phui-oi-with-image .phui-oi-content-box { + margin-left: 24px; +} + +.phui-oi-list-drag .drag-ghost { + margin-top: 4px; +} + +.phui-oi-list-drag .phui-object-icon-pane { + padding-right: 8px; +} diff --git a/webroot/rsrc/css/phui/object-item/phui-oi-flush-ui.css b/webroot/rsrc/css/phui/object-item/phui-oi-flush-ui.css new file mode 100644 index 0000000000..2902cb22ce --- /dev/null +++ b/webroot/rsrc/css/phui/object-item/phui-oi-flush-ui.css @@ -0,0 +1,13 @@ +/** + * @provides phui-oi-flush-ui-css + * @requires phui-oi-list-view-css + */ + +.phui-oi-list-view.phui-oi-list-flush { + padding: 0; + margin: 0; +} + +.phui-object-box .phui-oi-list-flush .phui-oi { + margin: 0; +} diff --git a/webroot/rsrc/css/phui/object-item/phui-oi-list-view.css b/webroot/rsrc/css/phui/object-item/phui-oi-list-view.css new file mode 100644 index 0000000000..e64989f8cd --- /dev/null +++ b/webroot/rsrc/css/phui/object-item/phui-oi-list-view.css @@ -0,0 +1,744 @@ +/** + * @provides phui-oi-list-view-css + */ + +.phui-oi { + border-left-width: 0; +} + +ul.phui-oi-list-view { + padding: 8px; + list-style: none; +} + +.device-desktop .phui-oi-list-view { + padding: 16px; +} + +.phui-oi-list-view + .phui-oi-list-view { + padding-top: 0; +} + +.phui-object-box .phui-oi-list-view .phui-oi { + margin: 0; +} + +.phui-oi-list-view .phui-info-view { + margin: 0; +} + +.phui-object-box .phui-oi-list-view .phui-info-view { + color: {$greytext}; + border: none; +} + +.phui-oi { + border-style: solid; + border-color: {$lightgreyborder}; + margin: 5px 0; + overflow: hidden; + background: {$page.content}; + margin-bottom: 4px; +} + +.phui-oi .phui-icon-view { + display: inline-block; +} + +.phui-oi-frame { + border-color: {$lightblueborder}; + border-width: 1px 1px 1px 0; + border-style: solid; + position: relative; + min-height: 33px; + overflow: hidden; +} + +.phui-oi-cover-image { + display: none; +} + +.phui-oi-no-bar .phui-oi-frame { + border-width: 1px; +} + +.device-desktop .phui-oi { + margin: 0 0 4px 0; +} + +.phui-object-box .phui-oi-list-view { + margin: 0; +} + +.phui-oi-status-icon { + font-weight: bold; + padding: 3px; + font-size: 16px; +} + +.phui-oi-list-view .phui-oi-col0 .phui-icon-view { + width: 17px; + text-align: center; + overflow: visible; + position: relative; + left: -1px; +} + +.phui-oi-name { + padding: 8px 8px 0; + white-space: nowrap; + word-wrap: break-word; + overflow: hidden; + text-overflow: ellipsis; + font-weight: bold; + -webkit-font-smoothing: antialiased; +} + +.device-phone .phui-oi-name { + overflow: normal; + white-space: normal; + font-weight: bold; +} + +.phui-oi-link { + display: inline; +} + +.phui-oi-objname { + color: {$blacktext}; + cursor: text; + font-weight: bold; +} + +.phui-oi-content { + margin: 4px 8px 2px 0; + overflow: hidden; +} + +.phui-oi-grippable { + cursor: move; +} + +.device .phui-oi-grippable { + cursor: normal; +} + +.phui-oi-grip { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 20px; + background: url('http://github.com/rsrc/image/texture/grip.png') center center no-repeat; +} + +.phui-oi-ungrippable .phui-oi-grip { + opacity: 0.25; +} + +.device .phui-oi-grip { + display: none; +} + +.phui-oi-has-grip .phui-oi-frame { + padding-left: 16px; +} + +.device .phui-oi-grippable .phui-oi-frame { + padding-left: 0; +} + +.phui-oi-list-header { + padding: 0 0 8px 0; + color: {$darkgreytext}; +} + +.phui-oi-table { + display: table; + table-layout: fixed; + width: 100%; +} + +.phui-oi-table-row { + display: table-row; +} + +.phui-oi-col0 { + width: 20px; + display: table-cell; + vertical-align: middle; + padding-left: 4px; +} + +.device-phone .phui-oi-col0 { + vertical-align: top; + padding-top: 8px; +} + +.phui-oi-col1 { + display: table-cell; + vertical-align: top; +} + +.phui-oi-col2 { + width: 160px; + display: table-cell; + vertical-align: top; +} + +.phui-oi-col2.phui-oi-side-column { + width: 200px; +} + +.device-phone .phui-oi-col1, +.device-phone .phui-oi-col2 { + display: block; + width: auto; +} + +/* - Item Actions -------------------------------------------------------------- + + Action buttons, like "Edit" and "Delete". + +*/ + +.phui-oi-actions { + position: absolute; + right: 4px; + top: 4px; + bottom: 4px; + vertical-align: middle; + text-align: right; +} + +.phui-oi-actions .phui-list-item-view { + float: right; + height: 100%; + width: 24px; + display: inline-block; + position: relative; +} + +.phui-oi-actions .phui-list-item-href { + display: inline-block; + position: relative; + width: 24px; + height: 100%; +} + +.device-desktop .phui-oi-actions .phui-list-item-href:hover { + background: {$hoverblue}; + border-radius: 3px; +} + +.phui-oi-actions .phui-list-item-icon { + width: 14px; + height: 14px; + position: absolute; + display: block; + top: 50%; + margin-top: -7px; + left: 3px; +} + +.phui-oi-actions .phui-list-item-name { + display: none; +} + +.phui-oi-with-1-actions .phui-oi-content-box { + margin-right: 28px; + overflow: hidden; +} + +.phui-oi-with-2-actions .phui-oi-content-box { + margin-right: 54px; + overflow: hidden; +} + +.phui-oi-with-3-actions .phui-oi-content-box { + margin-right: 76px; + overflow: hidden; +} + + +/* - Object Box List ----------------------------------------------------------- + + Tighter, stacking list when inside an Object Box + +*/ + +.phui-object-box .phui-oi-list-view { + padding: 0; + border: none; +} + +.phui-object-box .phui-oi-frame { + border-right: none; +} + +.phui-object-box .phui-oi:last-child + .phui-oi-frame { + border-bottom: none; +} + + +/* - Subhead ------------------------------------------------------------------- + + Descriptive Text or Links under the main header, before attributes. + +*/ + +.phui-oi-subhead { + color: {$greytext}; + padding: 0 8px 6px; +} + +.phui-oi-description { + display: none; +} + +.phui-oi-description.phui-oi-description-reveal { + display: block; +} + +.phui-oi-description-tag { + margin-left: 4px; +} + +.phui-oi-description-tag:hover .phui-tag-core { + cursor: pointer; + background: {$darkgreybackground}; +} + +.phui-oi-description-tag .phui-tag-core { + border: none; +} + +.phui-oi-description-tag.phui-tag-view .phui-icon-view { + margin: 2px; +} + + +/* - Attribute List ------------------------------------------------------------ + + Object attributes, commonly used to render created date, etc. + +*/ + +.phui-oi-attributes { + padding: 0 8px 6px; + line-height: 18px; + min-height: 21px; +} + +.phui-oi-attribute { + display: inline-block; + color: {$greytext}; + vertical-align: top; + margin-right: 4px; +} + +.phui-oi-attribute-spacer { + padding: 0 4px; +} + + +/* - Icons --------------------------------------------------------------------- + + Icons, which show object state. On mobile, they are rendered without labels + to save space. + +*/ + +.phui-object-icon-pane { + margin: 8px 0 4px; +} + +.device-phone .phui-object-icon-pane { + margin: 0 0 4px; +} + +.phui-oi-icons { + padding: 0 4px 0 0; +} + +.device-phone .phui-oi-icons { + padding: 0 0 0 8px; +} + +ul.phui-oi-icons { + margin: 0; +} + +.phui-oi-icon { + vertical-align: middle; + font-size: {$smallerfontsize}; + color: {$greytext}; + text-align: right; + white-space: nowrap; + overflow: hidden; + min-height: 18px; + line-height: 18px; +} + +.device-phone .phui-oi-icon { + text-align: left; + font-size: 13px; +} + +/* + * Items with icon 'none' still have on mobile, thus creating a weird vertical + * margin for elements which follow + */ +.device-phone .phui-oi-icon .none { + display: none; +} + +.phui-oi-icon-image { + width: 14px; + height: 14px; + font-size: 13px; + margin-right: 4px; +} + + +/* - Disabled ------------------------------------------------------------------ + + Disabled/inactive objects. + +*/ + + +.phui-oi.phui-oi-disabled .phui-oi-link, +.phui-oi.phui-oi-disabled .phui-oi-link a { + color: {$lightgreytext}; +} + +.phui-oi.phui-oi-disabled .phui-oi-frame { + border-color: #d7d7d7; +} + +.phui-oi.phui-oi-disabled .phui-oi-objname { + color: {$greytext}; + text-decoration: line-through; +} + +.phui-oi.phui-oi-disabled .phui-oi-image { + opacity: .8; + -webkit-filter: grayscale(100%); + filter: grayscale(100%); +} + +.phui-oi.phui-oi-disabled .phui-oi-attribute, +.phui-oi.phui-oi-disabled .phui-oi-attribute > .phui-icon-view { + color: {$lightgreytext}; +} + + +/* - Effects ------------------------------------------------------------------- + + Effects like highlighted items. + +*/ + +.phui-oi.phui-oi-highlighted { + background: {$sh-yellowbackground}; +} + +ul.phui-oi-list-view .phui-oi-highlighted + .phui-oi-frame { + border-color: {$sh-yellowborder}; +} + +.phui-oi-selected { + background: {$sh-bluebackground}; +} + +ul.phui-oi-list-view .phui-oi-selected + .phui-oi-frame { + border-color: {$sh-blueborder}; +} + +.phui-oi-forbidden { + background: {$sh-redbackground}; +} + + +/* - Handle Icons -------------------------------------------------------------- + + Shows owners, reviewers, etc., using profile picture icons. + +*/ + +.phui-oi-handle-icons { + bottom: 0; + right: 4px; + position: absolute; +} + +.phui-oi-handle-icon { + width: 24px; + height: 24px; + display: inline-block; + background-size: 100%; + border-radius: 3px; + background-repeat: no-repeat; +} + + +/* - Bylines ------------------------------------------------------------------- + + Shows owners, authors, reviewers, etc., in text. + +*/ + +.phui-oi-bylines { + padding: 0 4px 0 8px; + margin: 4px 0 8px; + font-size: {$smallerfontsize}; + color: {$greytext}; + text-align: right; +} + +.phui-oi-byline { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} + +.device-phone .phui-oi-bylines { + float: none; + text-align: left; + padding: 0 8px; + font-size: {$normalfontsize}; +} + + +/* - Draggable List ------------------------------------------------------------ + + These classes are applied by and/or provided for use with JX.DraggableList. + +*/ + +.drag-ghost { + position: relative; + background: {$sh-indigobackground}; + border-radius: 3px; + margin-bottom: 4px; + border: 1px dashed {$sh-indigoborder}; +} + +.drag-dragging { + opacity: 0.25; +} + +.drag-sending { + opacity: 0.5; +} + +.drag-clone, +.drag-frame { + /* This allows mousewheel events to pass through the clone and frame while + they are being dragged. Without this, the mousewheel does not work during + a drag operation. */ + pointer-events: none; +} + +.drag-frame { + position: fixed; + overflow: hidden; + left: 0; + right: 0; + top: 0; + bottom: 0; +} + +.drag-clone { + position: absolute; + list-style: none; +} + +/* - Badges ---------------------------------------------------------------- */ + +.phui-oi-col0.phui-oi-badge { + width: 28px; +} + +.phui-oi-col0.phui-oi-badge .phui-icon-view { + left: 0; +} + +/* - Countdowns ------------------------------------------------------------ */ + +.phui-oi-col0.phui-oi-countdown { + width: 52px; + padding: 0; +} + +.phui-oi-countdown .phui-oi-countdown-number { + border-right: 1px solid {$thinblueborder}; + text-align: center; + color: {$bluetext}; +} + + +/* - Dashboards ------------------------------------------------------------ */ + +.phui-object-box .phui-oi-list-view .phui-oi-frame { + border: none; + border-bottom: 1px solid {$thinblueborder}; +} + +.drag-clone.phui-oi-standard .phui-oi-frame { + border: none; + opacity: 0.8; + background: {$sh-bluebackground}; +} + +.phui-object-box .phui-oi-list-header { + font-size: {$normalfontsize}; + color: {$darkbluetext}; + border-top: 1px solid {$thinblueborder}; + border-bottom: 1px solid {$thinblueborder}; + padding: 8px 12px; + background-color: {$lightgreybackground}; +} + +.phui-object-box .phui-header-shell + .phui-oi-list-view .phui-oi-list-header, +.phui-object-box .phui-object-box-hidden-content + .phui-oi-list-view + .phui-oi-list-header, +.phui-object-box .phui-object-box-hidden-content + .phui-oi-list-header { + border-top: none; + } + +.device-desktop .aphront-multi-column-fluid .aphront-multi-column-2-up + .aphront-multi-column-column-outer.third .phui-oi-col2 { + display: none; + } + + +/* - Launcher List ---------------------------------------------------------- */ + +.phui-oi-image-icon { + background: none; + width: 40px; + height: 40px; + margin: 8px 6px; + position: absolute; +} + +.phui-oi-image-icon .phui-icon-view { + position: absolute; + width: 40px; + height: 40px; + font-size: 26px; + text-align: center; + line-height: 36px; +} + +.phui-oi-image { + width: 40px; + height: 40px; + border-radius: 3px; + background-size: 100%; + margin: 8px 6px; + position: absolute; +} + +.phui-oi-with-image-icon .phui-oi-frame, +.phui-oi-with-image .phui-oi-frame { + min-height: 52px; +} + +.phui-oi-with-image-icon .phui-oi-content-box, +.phui-oi-with-image .phui-oi-content-box { + margin-left: 46px; +} + +/* - Launcher Button -------------------------------------------------------- */ + +.phui-oi-col2.phui-oi-side-column { + text-align: right; + vertical-align: middle; + padding-right: 4px; +} + +.device-phone .phui-oi-col2.phui-oi-side-column { + padding: 0 8px 8px; + text-align: left; +} + +.phui-oi-col0.phui-oi-checkbox { + width: 28px; + text-align: center; +} + +.phui-oi-selectable { + cursor: pointer; + user-select: none; + -webkit-user-select: none; +} + +/* When the list selection state can be toggled on the client (as in the bulk + editor), keep the border color consistent to make the interaction feel more + robust. */ +ul.phui-oi-list-view .phui-oi-selectable + .phui-oi-frame { + border-color: {$blueborder}; +} + +.differential-revision-size { + padding: 0 4px; + border-radius: 4px; + background: {$lightgreybackground}; + cursor: pointer; +} + +.differential-revision-size .phui-icon-view { + margin: 0 1px 0 1px; + font-size: 7px; + position: relative; + top: -2px; + color: {$lightbluetext}; +} + +.differential-revision-large { + background: {$sh-orangebackground}; +} + +/* NOTE: These are intentionally using nonstandard colors, see T13127. */ + +.differential-revision-large .phui-icon-view { + color: #e5ae7e; +} + +.differential-revision-small { + background: #f2f7ff; +} + +.differential-revision-small .phui-icon-view { + color: #6699ba; +} + +.phui-oi-tail { + text-align: center; + padding: 8px 0; + background: linear-gradient({$lightbluebackground}, #fff 66%, #fff); +} + +.phui-oi-menu { + background: {$lightbluebackground}; + border-style: solid; + border-color: {$thinblueborder}; + padding: 4px; +} + +.device-desktop .phui-oi-menu, +.device-tablet .phui-oi-menu { + width: 200px; + border-width: 0 0 0 1px; +} + +.device-phone .phui-oi-menu { + border-width: 1px 0 0; +} diff --git a/webroot/rsrc/css/phui/object-item/phui-oi-simple-ui.css b/webroot/rsrc/css/phui/object-item/phui-oi-simple-ui.css new file mode 100644 index 0000000000..e838f1ce3e --- /dev/null +++ b/webroot/rsrc/css/phui/object-item/phui-oi-simple-ui.css @@ -0,0 +1,43 @@ +/** + * @provides phui-oi-simple-ui-css + * @requires phui-oi-list-view-css + */ + +.phui-oi-list-simple .phui-oi-with-image .phui-oi-frame { + min-height: 26px; +} + +.phui-oi-list-simple .phui-oi-image { + height: 26px; + width: 26px; + margin: 0; +} + +.phui-oi-list-simple .phui-oi-with-image + .phui-oi-content-box { + margin-left: 32px; +} + +.phui-oi-list-simple .phui-oi-name { + padding: 2px 0; +} + +.phui-oi-list-simple .phui-oi-name a { + color: {$darkbluetext}; +} + +.phui-oi-list-view.phui-oi-list-simple .phui-oi-frame { + border: none; + margin-bottom: 4px; +} + +.phui-oi-list-view.phui-oi-list-simple li:last-child + .phui-oi-frame { + margin: 0; +} + +.phui-oi-list-simple .phui-oi-actions { + top: 2px; + bottom: 2px; + right: 2px; +} diff --git a/webroot/rsrc/css/phui/phui-action-list.css b/webroot/rsrc/css/phui/phui-action-list.css new file mode 100644 index 0000000000..31af8050ea --- /dev/null +++ b/webroot/rsrc/css/phui/phui-action-list.css @@ -0,0 +1,266 @@ +/** + * @provides phabricator-action-list-view-css + */ + +.device .phabricator-action-list-view { + padding: 4px 0; + display: none; +} + +!print .phabricator-action-list-view { + padding: 4px 0; + display: none; +} + +.device .phuix-dropdown-menu .phabricator-action-list-view { + /* When an action list view appears inside a dropdown menu, don't hide it + by default. */ + display: block; + padding: 0; +} + +.device .phabricator-action-list-view.phabricator-action-list-toggle, +.device-desktop .phui-document-content + .phabricator-action-list-view.phabricator-action-list-toggle { + display: block; + width: 200px; + border: 1px solid {$lightgreyborder}; + border-radius: 3px; + position: absolute; + right: 16px; + top: 42px; + background: #fff; + box-shadow: {$dropshadow}; + padding: 4px 0; +} + +.device-phone .phabricator-action-list-view.phabricator-action-list-toggle { + right: 8px; + top: 38px; +} + +.phabricator-action-view { + position: relative; +} + +.phabricator-action-view button.phabricator-action-view-item { + border: none; + background: transparent; + box-shadow: none; + outline: 0; + padding: 0; + margin: 0; + font-weight: normal; + width: 100%; + text-align: left; + text-shadow: none; + + border-radius: 0; + color: {$anchor}; + font: inherit; + display: inline; + min-width: 0; +} + +.phabricator-action-view button.phabricator-action-view-item .phui-icon-view { + color: {$darkbluetext}; +} + +.phabricator-action-view button.phabricator-action-view-item, +.phabricator-action-view-item { + padding: 4px 8px 6px 8px; + display: block; + text-decoration: none; + color: {$darkbluetext}; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.action-has-icon button.phabricator-action-view-item, +.action-has-icon .phabricator-action-view-item { + padding: 4px 4px 4px 28px; +} + +.device-desktop .phabricator-action-view-href:hover + .phabricator-action-view-item { + text-decoration: none; + background: rgba({$alphablue}, .08); + color: {$sky}; + border-radius: 3px; +} + +.device-desktop .phabricator-action-view-href:hover + .phabricator-action-view-icon { + color: {$sky}; +} + +.phabricator-action-view.action-item-red { + background-color: {$sh-redbackground}; +} + +.phabricator-action-view.action-item-green { + background-color: {$sh-greenbackground}; +} + +.phabricator-action-view.action-item-red .phabricator-action-view-item, +.phabricator-action-view.action-item-red .phabricator-action-view-icon { + color: {$sh-redtext}; +} + +.phabricator-action-view.action-item-green .phabricator-action-view-item, +.phabricator-action-view.action-item-green .phabricator-action-view-icon { + color: {$sh-greentext}; +} + +.device-desktop .phabricator-action-view.action-item-red:hover + .phabricator-action-view-item, +.device-desktop .phabricator-action-view.action-item-red:hover + .phabricator-action-view-icon { + color: {$red}; +} + +.device-desktop .phabricator-action-view.action-item-green:hover + .phabricator-action-view-item, +.device-desktop .phabricator-action-view.action-item-green:hover + .phabricator-action-view-icon { + color: {$green}; +} + + +.phabricator-action-view-label .phabricator-action-view-item, +.phabricator-action-view-type-label .phabricator-action-view-item { + font-size: {$smallerfontsize}; + font-weight: bold; + color: {$bluetext}; + padding: 4px 8px 6px 8px; + display: block; + text-transform: uppercase; + -webkit-font-smoothing: antialiased; +} + +.phabricator-action-view + .phabricator-action-view-label { + padding-top: 8px; +} + +.phabricator-action-view-icon { + width: 14px; + height: 14px; + position: absolute; + top: 7px; + left: 8px; + text-align: center; +} + +.phabricator-action-view-disabled .phabricator-action-view-item, +.phabricator-action-view-disabled button.phabricator-action-view-item { + color: {$lightgreytext}; +} + +.phabricator-action-view-selected { + background: {$sh-violetbackground}; + border-radius: 3px; +} + +.phabricator-action-view-selected:hover a { + text-decoration: none; +} + +.phabricator-action-view button[disabled] { + opacity: 1.0; +} + +.device-desktop .phabricator-action-view-disabled:hover + .phabricator-action-view-item, +.device-desktop .phabricator-action-view-disabled:hover + button.phabricator-action-view-item, +.device-desktop .phabricator-action-view-disabled:hover + .phabricator-action-view-icon, +.device-desktop .phabricator-action-view-disabled:hover + button.phabricator-action-view-icon { + color: {$lightgreytext}; +} + +.phabricator-action-view-type-divider { + margin-top: 8px; + border-top: 1px solid {$thinblueborder}; +} + +/******* Sub Menu *************************************************************/ + +.phabricator-action-view-submenu .caret-right { + position: absolute; + top: 8px; + right: 8px; + border-left-color: {$alphablue}; +} + +.phabricator-action-view-submenu .caret { + position: absolute; + top: 10px; + right: 8px; + border-top: 7px solid {$lightgreytext}; +} + +.phabricator-action-list-view .phabricator-action-view-submenu.phui-submenu-open + .phabricator-action-view-item { + background-color: rgba({$alphablue}, 0.07); + color: {$sky}; + border-radius: 3px; +} + +.phabricator-action-list-view .phabricator-action-view-submenu.phui-submenu-open + .phabricator-action-view-item .phui-icon-view { + color: {$sky}; +} + +.phui-list-navbar .phui-list-item-href { + display: inline-block; +} + +.phui-list-navbar .phui-list-item-disabled .phui-list-item-href { + color: {$lightgreytext}; +} + +.phui-list-navbar .phui-list-item-action-href { + display: inline-block; + padding: 8px 16px; + line-height: 16px; +} + +.phui-list-navbar .phui-list-item-action-href .phui-icon-view { + color: {$darkgreytext}; +} + +.device-desktop + .phui-list-navbar .phui-list-item-action-href:hover { + background-color: rgba({$alphablue}, 0.07); + color: {$sky}; +} + +.phui-list-navbar .dropdown-with-caret .phui-list-item-href + .phui-icon-view { + margin-left: 12px; +} + +.phabricator-action-view .keyboard-shortcut-key { + display: none; +} + +.phabricator-action-view.has-key-command .keyboard-shortcut-key { + display: block; + position: absolute; + width: 12px; + height: 12px; + right: 0; + top: 2px; + line-height: 12px; + padding: 4px; + color: {$greytext}; + background: {$bluebackground}; + border: none; +} + +.phabricator-action-view.has-key-command .phabricator-action-view-item { + padding-right: 24px; +} diff --git a/webroot/rsrc/css/phui/phui-action-panel.css b/webroot/rsrc/css/phui/phui-action-panel.css new file mode 100644 index 0000000000..63bd351807 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-action-panel.css @@ -0,0 +1,232 @@ +/** + * @provides phui-action-panel-css + */ + +.phui-action-panel { + position: relative; + background-color: {$page.content}; + border: 1px solid {$lightblueborder}; + border-radius: 3px; + margin: 0 8px; + min-height: 108px; + overflow: hidden; +} + +.device .phui-action-panel { + margin: 0; +} + +.phui-action-panel-hitarea { + display: block; +} + +.device-desktop .phui-action-panel-hitarea:hover { + text-decoration: none; + background-color: rgba({$alphawhite},.25); +} + +.device-desktop .phui-action-panel-hitarea:hover .phui-icon-view { + margin-top: -4px; + transition-duration: .2s; +} + +.phui-action-panel-table { + display: table; + height: 80px; + width: 100%; +} + +.phui-action-panel-row { + display: table-row; +} + +.phui-action-panel-icon { + width: 64px; + text-align: center; + vertical-align: middle; + display: table-cell; +} + +.phui-action-panel-image { + width: 48px; + height: 48px; + margin: 0 auto; +} + +.phui-action-panel-icon a { + display: block; +} + +.phui-action-panel-icon a:hover .phui-icon-view, +.phui-action-panel-icon a:hover .phui-action-panel-bigtext { + color: {$blue}; +} + +.phui-action-panel-icon a:hover { + text-decoration: none; +} + +.phui-action-panel-icon .phui-icon-view { + font-size: 36px; + color: {$lightbluetext}; +} + +.phui-action-panel-header { + padding: 8px; + border-bottom: 1px solid {$thinblueborder}; + font-weight: bold; + white-space: nowrap; + overflow: hidden; + color: {$darkbluetext}; + display: block; +} + +.phui-action-panel-bigtext .phui-action-panel-subheader { + font-size: 28px; + color: {$darkbluetext}; + text-align: center; + padding: 0 8px; +} + +.phui-action-panel-subheader { + display: table-cell; + vertical-align: middle; + color: {$darkbluetext}; + padding: 8px 8px 8px 0; +} + +.phui-action-panel-subheader a { + text-decoraction: none; +} + +.phui-action-panel-status { + padding: 8px 12px; + position: absolute; + bottom: 0; + left: 0; + right: 0; +} + +.phui-action-panel-status:hover { + text-decoration: none; +} + +/* - Red -------------------------------------------------------------------- */ + +.phui-action-panel-red { + background-color: {$sh-redbackground}; + border-color: {$sh-redborder}; +} + +.phui-action-panel-red .phui-action-panel-icon .phui-icon-view { + color: {$sh-redicon}; +} + +.phui-action-panel-red .phui-action-panel-header { + border-color: {$sh-lightredborder}; +} + +/* - Orange ----------------------------------------------------------------- */ + +.phui-action-panel-orange { + background-color: {$sh-orangebackground}; + border-color: {$sh-orangeborder}; +} + +.phui-action-panel-orange .phui-action-panel-icon .phui-icon-view { + color: {$sh-orangeicon}; +} + +.phui-action-panel-orange .phui-action-panel-header { + border-color: {$sh-lightorangeborder}; +} + +/* - Yellow ----------------------------------------------------------------- */ + +.phui-action-panel-yellow { + background-color: {$sh-yellowbackground}; + border-color: {$sh-yellowborder}; +} + +.phui-action-panel-yellow .phui-action-panel-icon .phui-icon-view { + color: {$sh-yellowicon}; +} + +.phui-action-panel-yellow .phui-action-panel-header { + border-color: {$sh-lightyellowborder}; +} + +/* - Green ------------------------------------------------------------------ */ + +.phui-action-panel-green { + background-color: {$sh-greenbackground}; + border-color: {$sh-greenborder}; +} + +.phui-action-panel-green .phui-action-panel-icon .phui-icon-view { + color: {$sh-greenicon}; +} + +.phui-action-panel-green .phui-action-panel-header { + border-color: {$sh-lightgreenborder}; +} + +/* - Blue ------------------------------------------------------------------- */ + +.phui-action-panel-blue { + background-color: {$sh-bluebackground}; + border-color: {$sh-blueborder}; +} + +.phui-action-panel-blue .phui-action-panel-icon .phui-icon-view { + color: {$sh-blueicon}; +} + +.phui-action-panel-blue .phui-action-panel-header { + border-color: {$sh-lightblueborder}; +} + +/* - Indigo ----------------------------------------------------------------- */ + +.phui-action-panel-indigo { + background-color: {$sh-indigobackground}; + border-color: {$sh-indigoborder}; +} + +.phui-action-panel-indigo .phui-action-panel-icon .phui-icon-view { + color: {$sh-indigoicon}; +} + +.phui-action-panel-indigo .phui-action-panel-header { + border-color: {$sh-lightindigoborder}; +} + +/* - Violet ----------------------------------------------------------------- */ + +.phui-action-panel-violet { + background-color: {$sh-violetbackground}; + border-color: {$sh-violetborder}; +} + +.phui-action-panel-violet .phui-action-panel-icon .phui-icon-view { + color: {$sh-violeticon}; +} + +.phui-action-panel-violet .phui-action-panel-header { + border-color: {$sh-lightvioletborder}; +} + +/* - Pink ------------------------------------------------------------------- */ + +.phui-action-panel-pink { + background-color: {$sh-pinkbackground}; + border-color: {$sh-violetborder}; +} + +.phui-action-panel-pink .phui-action-panel-icon .phui-icon-view { + color: {$sh-pinkicon}; +} + +.phui-action-panel-pink .phui-action-panel-header { + border-color: {$sh-lightpinkborder}; +} diff --git a/webroot/rsrc/css/phui/phui-badge.css b/webroot/rsrc/css/phui/phui-badge.css new file mode 100644 index 0000000000..1538e5de4d --- /dev/null +++ b/webroot/rsrc/css/phui/phui-badge.css @@ -0,0 +1,219 @@ +/** + * @provides phui-badge-view-css + */ + +.phui-badge-flex-view { + padding: 0; + overflow: hidden; +} + +.phui-badge-flex-item { + display: inline-block; + padding: 4px 12px 4px 0; +} + +.phui-badge-flex-view.flex-view-collapsed { + padding: 0; +} + +.flex-view-collapsed .phui-badge-flex-item { + padding: 1px; +} + +.phui-badge-view { + display: inline-block; + position: relative; + perspective: 512px; +} + +.phui-badge-card-container { + transform-style: preserve-3d; + -webkit-transform-style: preserve-3d; + + transition: transform 0.5s; + -webkit-transition: -webkit-transform 0.5s; + + transform-origin: right center; + -webkit-transform-origin: right center; + + width: 100%; + height: 100%; +} + +.phui-badge-card { + cursor: pointer; + padding: 12px; + height: 180px; + width: 128px; + border: 1px solid {$lightgreyborder}; + background-color: {$lightbluebackground}; +} + +.phui-badge-card a { + color: {$darkbluetext}; +} + +.card-flipped .phui-badge-card-container { + transform: translateX( -100% ) rotateY( -180deg ); + -webkit-transform: translateX( -100% ) rotateY( -180deg ); +} + +.phui-badge-card-front, +.phui-badge-card-back { + display: block; + position: absolute; + width: 128px; + height: 180px; + overflow: hidden; + + backface-visibility: hidden; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; +} + + +/* Firefox Fix */ +.phui-badge-card-front { + transform: rotateY(0deg); + -webkit-trasform: rotateY(0deg); +} + +.phui-badge-front-view, +.phui-badge-back-view { + display: table; + width: 100%; +} + +.phui-badge-inner-front, +.phui-badge-inner-back { + display: table-row; +} + +.phui-badge-illustration { + background-color: #fff; + box-shadow: inset 0 -1px 1px 0 rgba({$alphablack},.1); + text-align: center; + height: 100px; + width: 100%; + vertical-align: middle; + display: table-cell; +} + +.phui-badge-illustration .phui-icon-view { + font-size: 48px; + height: 48px; + width: 48px; + color: {$bluetext}; +} + +.phui-badge-view-information { + display: table-cell; + text-align: center; + color: {$greytext}; +} + +.phui-badge-view-header { + color: {$darkgreytext}; + font-weight: bold; + padding-top: 12px; + display: block; + word-break: break-word; +} + +.phui-badge-quality { + padding: 4px 0; + color: {$darkbluetext}; + font-weight: bold; +} + +.phui-badge-view-subhead { + color: {$lightgreytext}; + font-size: {$smallerfontsize}; + word-break: break-word; +} + +.phui-badge-card-back { + transform: rotateY( 180deg ); + -webkit-transform: rotateY( 180deg ); +} + +/** Quality Levels ***********************************************************/ + +.phui-badge-view-grey .phui-badge-card { + background-color: {$lightgreybackground}; +} + +.phui-badge-view-white .phui-badge-card { + background-color: {$lightbluebackground}; +} + +.phui-badge-view-green .phui-badge-card { + background-color: {$sh-greenbackground}; + border-color: {$sh-lightgreenborder}; +} + +.phui-badge-view-blue .phui-badge-card { + background-color: {$sh-bluebackground}; + border-color: {$sh-lightblueborder}; +} + +.phui-badge-view-indigo .phui-badge-card { + background-color: {$sh-indigobackground}; + border-color: {$sh-lightindigoborder}; +} + +.phui-badge-view-orange .phui-badge-card { + background-color: {$sh-orangebackground}; + border-color: {$sh-lightorangeborder}; +} + +.phui-badge-view-yellow .phui-badge-card { + background-color: {$sh-yellowbackground}; + border-color: {$sh-lightyellowborder}; +} + +/** Mini View ****************************************************************/ + +.phui-badge-mini { + background-color: {$greyborder}; + border-radius: 18px; + height: 25px; + width: 25px; + line-height: 24px; + text-align: center; + display: inline-block; +} + +.phui-badge-mini .phui-icon-view { + color: #fff; + font-size: 12px; + margin: 0; +} + +.phui-badge-mini-grey { + background-color: {$greyborder}; +} + +.phui-badge-mini-white { + background-color: {$lightblueborder}; +} + +.phui-badge-mini-green { + background-color: {$sh-greenicon}; +} + +.phui-badge-mini-blue { + background-color: {$blue}; +} + +.phui-badge-mini-indigo { + background-color: {$sh-indigoicon}; +} + +.phui-badge-mini-orange { + background-color: {$sh-orangeicon}; +} + +.phui-badge-mini-yellow { + background-color: {$sh-yellowicon}; +} diff --git a/webroot/rsrc/css/phui/phui-basic-nav-view.css b/webroot/rsrc/css/phui/phui-basic-nav-view.css new file mode 100644 index 0000000000..a545ad35ce --- /dev/null +++ b/webroot/rsrc/css/phui/phui-basic-nav-view.css @@ -0,0 +1,132 @@ +/** + * @provides phui-basic-nav-view-css + */ + +.device-desktop .phui-navigation-shell, +.phabricator-home.device .phui-navigation-shell { + display: table; + width: 100%; + height: calc(100vh - {$menu.main.height}); +} + +.device-desktop .phui-navigation-shell .phabricator-nav, +.phabricator-home.device .phui-navigation-shell .phabricator-nav { + display: table-row; +} + +.device-desktop .phui-navigation-shell .phabricator-nav-local, +.phabricator-home.device .phui-navigation-shell .phabricator-nav-local { + display: table-cell; + position: relative; + vertical-align: top; + margin-top: 0; + overflow: hidden; +} + +.phabricator-home.device-phone .phabricator-nav-content { + display: none; +} + +.device-phone.phabricator-home .phui-basic-nav .phabricator-side-menu + .phui-list-item-selected { + background-color: transparent; + border-left-color: transparent; + font-weight: normal; +} + +.phui-basic-nav.phui-navigation-shell .phabricator-nav-local { + width: 205px; + max-width: 205px; + padding-top: 12px; + padding-right: 8px; +} + +.phui-two-column-view .phui-basic-nav.phui-navigation-shell + .phabricator-nav-local { + padding-right: 0; + padding-top: 0; +} + +.phui-two-column-view .phui-basic-nav .phabricator-side-menu { + background-color: {$page.content}; +} + +.phui-basic-nav .phabricator-side-menu { + background-color: {$page.sidenav}; +} + +.phui-basic-nav .phabricator-side-menu .phui-list-item-view { + display: block; + white-space: nowrap; + text-decoration: none; + -webkit-font-smoothing: antialiased; +} + +.phui-basic-nav .phabricator-side-menu .phui-list-item-href { + display: block; + padding: 6px 8px 6px 12px; + color: {$darkbluetext}; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + overflow: hidden; + text-overflow: ellipsis +} + +.phui-basic-nav .phabricator-side-menu .phui-list-item-icon { + margin-left: -8px; + text-align: center; + width: 30px; +} + +.phui-basic-nav .phabricator-side-menu .phui-divider { + border-bottom: 1px solid rgba({$alphablack},.08); + margin: 0 0 8px 8px; + padding: 8px 0 0 0; +} + +.phui-basic-nav .phabricator-side-menu .phui-list-item-icon.phuihead-small { + display: inline-block; + height: 16px; + width: 16px; + border-radius: 3px; + background-size: 100%; + margin: -2px 7px -2px 3px; +} + +.phui-basic-nav .phabricator-side-menu .phui-list-item-selected { + background-color: rgba({$alphablack},.05); + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + font-weight: bold; +} + +.device-desktop .phui-basic-nav .phabricator-side-menu + .phui-list-item-selected + a.phui-list-item-href:hover { + background-color: rgba({$alphablack},.05); +} + +.phui-basic-nav .phabricator-side-menu .phui-list-item-type-label { + padding: 6px 8px 4px 12px; + color: {$darkbluetext}; + text-transform: uppercase; + font-size: 12px; + font-weight: bold; + border-style: solid; + letter-spacing: 0.02em; +} + +.device-desktop .phui-basic-nav .phabricator-side-menu + a.phui-list-item-href:hover { + text-decoration: none; + background-color: rgba({$alphablack},.07); +} + +.phui-basic-nav .phabricator-side-menu .phui-list-item-type-link + + .phui-list-item-type-label { + margin-top: 12px; +} + +.phui-basic-nav .phui-profile-segment-bar { + padding: 4px 4px 8px 12px; +} diff --git a/webroot/rsrc/css/phui/phui-big-info-view.css b/webroot/rsrc/css/phui/phui-big-info-view.css new file mode 100644 index 0000000000..b8fbab55ce --- /dev/null +++ b/webroot/rsrc/css/phui/phui-big-info-view.css @@ -0,0 +1,44 @@ +/** + * @provides phui-big-info-view-css + */ + +.phui-big-info-view { + padding: 64px 32px; + margin: 16px 4px; + background-color: {$page.sidenav}; + text-align: center; +} + +.phui-big-info-icon { + font-size: 48px; +} + +.phui-big-info-title { + font-size: 18px; + padding: 4px; + font-weight: bold; +} + +.phui-big-info-description { + font-size: {$biggerfontsize}; + padding: 4px; +} + +.phui-big-info-actions { + padding: 24px 0 0; +} + +.phui-big-info-button { + display: inline-block; +} + +.phui-big-info-button + .phui-big-info-button { + margin-left: 12px; +} + +.phui-big-info-view .phui-big-info-image { + height: 64px; + width: 64px; + margin: 0 auto; + padding-bottom: 12px; +} diff --git a/webroot/rsrc/css/phui/phui-box.css b/webroot/rsrc/css/phui/phui-box.css index 31c917cf5c..c5fd1d8d3b 100644 --- a/webroot/rsrc/css/phui/phui-box.css +++ b/webroot/rsrc/css/phui/phui-box.css @@ -2,13 +2,146 @@ * @provides phui-box-css */ -.phui-box-shadow { - border-left: 1px solid #e7e7e7; - border-right: 1px solid #e7e7e7; - border-bottom: 1px solid #c0c5d1; +.phui-box-border { + border: 1px solid {$lightblueborder}; + background-color: {$page.content}; + border-radius: 3px; } -.phui-box-shadow .phui-box-inner { - background-color: #fff; - box-shadow: 0 1px 2px rgba(0,0,0,0.2); +.phui-box.focus { + box-shadow: 0 0 5px 5px rgba(255, 255, 0, 0.90); +} + +.phui-box-grey { + background-color: {$lightgreybackground}; + border-radius: 3px; + border-color: rgba({$alphagrey},.2); +} + +.phui-box-blue { + background-color: {$bluebackground}; + border-radius: 3px; + border-color: {$thinblueborder}; +} + +.phui-box-blue .phui-oi, +.phui-box-grey .phui-oi { + background: transparent; +} + +.phui-box-blue .phui-oi-link, +.phui-box-grey .phui-oi-link { + color: {$darkbluetext}; +} + +.phui-box-blue .phui-oi-list-view, +.phui-box-grey .phui-oi-list-view { + background-color: {$page.content}; +} + +.phui-box-blue .phui-header-shell { + border-color: {$thinblueborder}; +} + +.phui-box-grey .phui-header-shell { + border-color: rgba({$alphagrey},.1); +} + +.phui-object-box.phui-box-blue div.phui-info-severity-nodata, +.phui-object-box.phui-box-grey div.phui-info-severity-nodata { + background: {$page.content}; + padding: 32px 0; + text-align: center; + border: none; + margin: 0; + color: {$greytext}; +} + + +/* Property Boxes */ + +.phui-box.phui-box-blue-property { + border-radius: 3px; + border-color: {$lightblueborder}; + margin: 0; + padding: 0; +} + +.phui-box.phui-box-blue-property .phui-header-header .phui-header-icon { + margin-right: 6px; +} + +.phui-box.phui-box-blue-property .phui-header-action-link { + margin-top: 0; + margin-bottom: 0; +} + +.device .phui-box.phui-box-blue-property { + padding: 0; +} + +.phui-box.phui-object-box.phui-box-blue-property .phui-header-shell { + background-color: {$bluepropertybackground}; + border-top-right-radius: 3px; + border-top-left-radius: 3px; + padding: 6px 16px; +} + +body.device .phui-box.phui-box-blue-property .phui-header-shell, +body.device .phui-box-blue-property.phui-object-box.phui-object-box-collapsed + .phui-header-shell { + padding: 6px 12px; + margin-top: 0; +} + +.phui-box.phui-box-blue-property .phui-header-header { + font-size: {$biggerfontsize}; + color: {$bluetext}; +} + +.phui-box-blue-property .phui-oi-list-view { + padding: 2px 8px; +} + +.phui-box-blue-property .phui-oi-list-view.phui-oi-list-flush { + padding: 0; +} + +body .phui-box-blue-property.phui-object-box.phui-object-box-collapsed { + padding: 0; +} + +body .phui-box-blue-property .phui-header-shell + .phui-object-box { + margin-bottom: 0; +} + +.phui-box-blue-property .phui-header-shell + .phui-object-box + .phui-header-shell { + background: {$page.content}; +} + +/* Config Boxes */ + +.phui-box-white-config.phui-box-border { + border-color: #e2e2e2; + border-radius: 5px; +} + +.phui-box-white-config.phui-object-box { + padding: 16px 0 0 0; +} + +.phui-box-white-config .phui-header-shell { + border-bottom: 1px solid #e2e2e2; + overflow: hidden; + padding: 0 16px 16px; +} + +.phui-box-white-config .phui-header-header { + color: {$bluetext}; +} + +.phui-box-white-config .phui-header-action-links .button { + margin-top: 0; + margin-bottom: 0; } diff --git a/webroot/rsrc/css/phui/phui-bulk-editor.css b/webroot/rsrc/css/phui/phui-bulk-editor.css new file mode 100644 index 0000000000..41ab2567e6 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-bulk-editor.css @@ -0,0 +1,27 @@ +/** + * @provides phui-bulk-editor-css + */ + +.bulk-edit-table { + width: 100%; + margin: 12px 0; +} + +.bulk-edit-table td { + padding: 4px 8px; + vertical-align: middle; +} + +.bulk-edit-input { + width: 100%; + text-align: left; +} + +.bulk-edit-input input { + width: 100%; +} + +.bulk-edit-input textarea { + width: 100%; + height: 8em; +} diff --git a/webroot/rsrc/css/phui/phui-button.css b/webroot/rsrc/css/phui/phui-button.css deleted file mode 100644 index 1ccf1583b3..0000000000 --- a/webroot/rsrc/css/phui/phui-button.css +++ /dev/null @@ -1,263 +0,0 @@ -/** - * @provides phui-button-css - */ - - -button, -a.button, -a.button:visited, -input[type="submit"] { - background-color: #3477ad; - color: white; - text-shadow: 0 -1px rgba(0,0,0,0.75); - border: 1px solid #19558D; - cursor: pointer; - font-weight: bold; - font-size: 13px; - display: inline-block; - padding: 3px 10px 4px; - text-align: center; - white-space: nowrap; - border-radius: 3px; - background-image: linear-gradient(to bottom, #3b86c4, #2b628f); - background-image: -webkit-linear-gradient(top, #3b86c4, #2b628f); -} - -/* Buttons with images (full size only) */ -button.icon, -a.icon, -a.icon:visited { - padding-left: 0; - position: relative; - text-indent: 29px; -} - -button.black, -a.black, -a.black:visited { - background-color: #383838; - background-image: linear-gradient(to bottom, #505d65, #2d373c); - background-image: -webkit-linear-gradient(top, #505d65, #2d373c); - border: 1px solid #333; - border-bottom-color: #000; -} - -button.green, -a.green, -a.green:visited { - background-color: #348e20; - background-image: linear-gradient(to bottom, #4e9b33, #158009); - background-image: -webkit-linear-gradient(top, #4e9b33, #158009); - border: 1px solid #3b6e22; - border-bottom-color: #2c5a15; -} - -button.grey, -input[type="submit"].grey, -a.grey, -a.grey:visited { - background-color: #f7f7f7; - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - border-color: #aaa; - color: #333; - border-bottom-color: #999; - text-shadow: none; -} - -a.disabled, -button.disabled, -button[disabled] { - filter:alpha(opacity=50); - -moz-opacity: 0.5; - -khtml-opacity: 0.5; - opacity: 0.5; -} - -body button:active, -body a.button:active { - box-shadow: inset 0 0 8px rgba(0,0,0,.6); -} - -button.grey:active, -a.grey:active, -button.grey_active, -a.button.dropdown-open { - background-color: #7d7d7d; - box-shadow: inset 0 0 4px rgba(0,0,0,.2); -} - -a.dropdown-open { - color: #777; -} - -a.button:hover, -button:hover { - text-decoration: none; - box-shadow: inset 0 0 5px rgba(0,0,0,.4); -} - -a.button.grey:hover, -button.grey:hover { - text-decoration: none; - box-shadow: inset 0 0 4px rgba(0,0,0,.2); -} - -body a.button.disabled:hover, -body button.disabled:hover, -body a.button.disabled:active, -body button.disabled:active { - box-shadow: none; -} - -button.small, -a.small, -a.small:visited { - padding: 2px 7px; - height: auto; - font-size: 11px; - line-height: 16px; -} - -button.link { - display: inline; - border: none; - background: transparent; - font-weight: normal; - padding: 0; - margin: 0; - font-size: inherit; - border-bottom: none; - text-decoration: none; - text-shadow: none; - color: #3b5998; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -button.link:hover { - text-decoration: underline; -} - -.dropdown-menu-frame { - position: absolute; - width: 240px; - background: #fff; - border: 1px solid #999; - margin-top: -1px; - padding: 5px 0; - - box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.3); - border: 1px solid #d7d7d7; - border-radius: 3px; -} - -.dropdown-menu-frame a, -.dropdown-menu-frame span { - display: block; - padding: 2px 10px; - clear: both; - line-height: 20px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu-frame span { - color: #999; -} - -.dropdown-menu-frame a:hover { - background: #005588; - background-image: linear-gradient(to bottom, #3b86c4, #2b628f); - background-image: -webkit-linear-gradient(top, #3b86c4, #2b628f); - color: white; - cursor: pointer; - text-decoration: none; -} - -a.toggle { - display: inline-block; - padding: 4px 8px; - font-size: 12px; - font-weight: bold; - color: #555; - text-decoration: none; - white-space: nowrap; - vertical-align: baseline; - background-color: #f7f7f7; - margin: 0 6px 0 0; - border-radius: 3px; - box-shadow: inset 0 0 3px rgba(0,0,0,.4); -} - -a.toggle:hover { - background-color: #14568e; - color: #fff -} - -a.toggle-selected { - background-color: #14568e; - color: #fff -} - -a.toggle-fixed { - cursor: default; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 5px solid #fff; - border-right: 5px solid transparent; - border-left: 5px solid transparent; - content: ""; -} - -.dropdown .caret { - margin-top: 7px; - margin-left: 4px; -} - -.grey.dropdown .caret { - border-top-color: #000; -} - -/* Icons */ -.button.has-icon { - position: relative; -} - -.button .phui-icon-view { - display: inline-block; - position: absolute; - top: 5px; - left: 8px; -} - -.button.has_icon .phui-button-text { - margin-left: 16px; -} - -/* Login Buttons */ - -.button.big.has-icon { - padding: 6px 20px 6px 12px; - border-radius: 4px; - text-align: left; -} - -.button.big.has-icon .phui-button-text { - margin-left: 36px; - font-size: 14px; - display: block; -} - -.button.big.has-icon .phui-button-subtext { - color: #888; - font-size: 12px; - line-height: 15px; - font-weight: normal; -} diff --git a/webroot/rsrc/css/phui/phui-chart.css b/webroot/rsrc/css/phui/phui-chart.css new file mode 100644 index 0000000000..646ed52581 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-chart.css @@ -0,0 +1,96 @@ +/** + * @provides phui-chart-css + */ + +.chart .axis line, +.chart .axis path { + fill: none; + stroke: {$blueborder}; + shape-rendering: crispEdges; +} + +.chart .axis text { + font: {$basefont}; + fill: {$darkgreytext}; +} + +.chart .outer, +.chart .inner { + shape-rendering: crispEdges; +} + +.chart .outer { + fill: none; + stroke: none; +} + +.chart .inner { + fill: {$lightbluebackground}; + stroke: {$lightblueborder}; +} + +.chart .line { + fill: none; + stroke: {$blue}; + stroke-width: 2px; +} + +.chart .point { + fill: #ffffff; + stroke: {$blue}; + stroke-width: 2px; + position: relative; + cursor: pointer; +} + +.chart-tooltip { + position: absolute; + text-align: center; + width: 120px; + overflow: hidden; + padding: 2px; + background: {$lightbluebackground}; + border: 1px solid {$blueborder}; + border-radius: 8px; + pointer-events: none; +} + +.chart-hardpoint { + min-height: 480px; + overflow: hidden; + position: relative; +} + +.device-desktop .chart-container { + position: absolute; + bottom: 0; + top: 0; + left: 0; + right: 300px; +} + +.device .chart-container { + min-height: 480px; +} + +.device-desktop .chart-curtain { + width: 300px; + position: absolute; + bottom: 0; + top: 0; + right: 0; +} + +.chart-function-label-list { + background: {$lightbluebackground}; + border: 1px solid {$lightblueborder}; + padding: 8px 12px; +} + +.device-desktop .chart-function-label-list { + margin-top: 23px; +} + +.chart-function-label-list-item .phui-icon-view { + margin-right: 8px; +} diff --git a/webroot/rsrc/css/phui/phui-cms.css b/webroot/rsrc/css/phui/phui-cms.css new file mode 100644 index 0000000000..5284c69834 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-cms.css @@ -0,0 +1,48 @@ +/** + * @provides phui-cms-css + */ + + +.phui-cms-body { + background-color: #f0f0f2; +} + +.phui-cms-view .phui-crumbs-view { + border-bottom: 1px solid {$thinblueborder}; +} + +.phui-cms-page { + max-width: 1140px; + margin: 0 auto; + background-color: #fff; + border-left: 1px solid {$lightblueborder}; + border-right: 1px solid {$lightblueborder}; + border-bottom: 1px solid {$lightblueborder}; + margin-bottom: 20px; +} + +.phui-cms-view .phui-basic-nav.phui-navigation-shell .phabricator-nav-local { + background-color: {$page.background}; + width: 240px; + border-right: 1px solid {$thinblueborder}; +} + +.phui-cms-view .phabricator-nav-content { + padding: 0; +} + +.phui-cms-view .phui-document-container { + border: none; +} + +.phui-cms-view .phui-cms-page-content .phui-profile-header { + padding: 32px 20px; + border-bottom: 1px solid {$thinblueborder}; +} + +.phui-cms-view .phui-document-view.phui-document-view-pro { + width: auto; + max-width: inherit; + padding: 0 20px; + margin: 0; +} diff --git a/webroot/rsrc/css/phui/phui-comment-form.css b/webroot/rsrc/css/phui/phui-comment-form.css new file mode 100644 index 0000000000..dcf45edb76 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-comment-form.css @@ -0,0 +1,173 @@ +/** + * @provides phui-comment-form-css + */ + +body .phui-box.phui-object-box.phui-comment-form-view { + background-color: {$page.content}; + margin-left: 62px; + position: relative; +} + +body.device .phui-box.phui-object-box.phui-comment-form-view { + margin-left: 0; +} + +.phui-comment-form-view.phui-object-box { + padding: 0; +} + +.phui-comment-form-view .phui-form-view { + padding: 0; +} + +.phui-comment-form-view .phui-comment-image { + background-repeat: no-repeat; + position: absolute; + border-radius: 3px; + background-size: 100%; + display: block; +} + +.device-desktop .phui-comment-form-view .phui-comment-image { + width: 50px; + height: 50px; + top: 0px; + left: -62px; +} + +.phui-comment-form-view .phui-timeline-wedge { + top: 26px; +} + +.phui-comment-fullwidth-control .aphront-form-input { + margin: 0; + width: auto; +} + +.phui-comment-form-view .remarkup-assist-bar { + height: 32px; + border-color: {$lightblueborder}; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + padding: 0 4px; +} + +.device-phone .phui-comment-form-view .remarkup-assist-bar, +.device-phone .phui-comment-form-view .aphront-form-input + .remarkup-assist-textarea { + border-radius: 0; +} + +.phui-comment-form-view .aphront-form-input .remarkup-assist-textarea { + border-color: {$lightblueborder}; + border-top: 1px solid {$thinblueborder}; + padding: 8px; + height: 12em; + background-color: rgba({$alphablue},.02); +} + +.phui-comment-form-view .aphront-form-input .remarkup-assist-textarea:focus { + background-color: {$page.content}; +} + +.device-phone .phui-comment-form-view .aphront-form-input + .remarkup-assist-textarea { + height: 8em; +} + +.phui-comment-form-view .phui-comment-textarea-control { + padding: 16px 16px 8px 16px; +} + +.phui-comment-form-view .phui-comment-has-actions + .phui-comment-textarea-control { + padding-top: 0; +} + +.device-phone .phui-comment-form-view .phui-comment-textarea-control { + padding: 0; + margin: -1px; +} + +.phui-comment-action { + background-color: rgba({$alphablue}, .1); + border-radius: 3px; + margin: 0px 16px 8px; + padding: 6px; +} + +.phui-comment-action + .phui-comment-action { + margin-top: -4px; +} + +.device-phone .phui-comment-action { + margin: 8px; +} + +.phui-comment-form-view .phui-comment-action-bar { + border-bottom: 1px solid {$thinblueborder}; + background-color: {$bluepropertybackground}; + padding: 4px 12px 4px 12px; + margin-bottom: 16px; +} + +.device-phone .phui-comment-form-view .phui-comment-action-bar { + margin: 0; + padding: 8px; +} + +.phui-comment-form-view .phui-comment-submit-control { + padding: 0 16px 12px; +} + +.device-phone .phui-comment-form-view .phui-comment-submit-control { + margin: 0px; + padding: 6px 8px 8px; +} + +.phui-comment-form-view .phui-comment-action-control { + float: left; +} + +.device-phone .phui-comment-form-view .phui-comment-action-control { + float: none; + width: 100%; + margin: 0; + padding: 0; +} + +.phui-comment-form-view .phui-comment-action-icon { + float: left; + font-size: 20px; + color: {$lightbluetext}; + height: 40px; + line-height: 40px; + margin: 0 4px; +} + +.device-phone .phui-comment-form-view .phui-comment-action-icon { + display: none; +} + +.device-phone .aphront-form-control-submit button { + width: 100%; +} + +.phui-comment-form-view .phui-form-view label.aphront-form-label, +.phui-comment-form-view .phui-form-view .aphront-form-error { + height: 28x; + line-height: 28px; + padding: 0; +} + +.phui-comment-form-view .aphront-form-error .phui-icon-view { + padding: 4px; +} + +.phui-comment-form-view .phui-form-view .phui-info-view { + margin: 16px; +} + +.device-phone .phui-comment-form-view .phui-form-view .phui-info-view { + margin: 8px; +} diff --git a/webroot/rsrc/css/phui/phui-comment-panel.css b/webroot/rsrc/css/phui/phui-comment-panel.css new file mode 100644 index 0000000000..3a847bb09c --- /dev/null +++ b/webroot/rsrc/css/phui/phui-comment-panel.css @@ -0,0 +1,106 @@ +/** + * @provides phui-comment-panel-css + * @requires phui-timeline-view-css + */ + +.phui-comment-panel .phui-timeline-view { + background: none; +} + +.phui-comment-panel .phui-comment-panel-empty { + margin: 16px; + padding: 12px; + border: 1px solid {$thinblueborder}; + background: {$lightbluebackground}; + text-align: center; + color: {$lightbluetext}; +} + +.phui-comment-panel-header { + font-weight: bold; + padding: 12px 16px 0; + word-break: break-word; +} + +.phui-comment-panel .phui-timeline-view .phui-timeline-event-view { + margin-left: 40px; +} + +.device-phone .phui-comment-panel .phui-timeline-view + .phui-timeline-event-view { + margin-left: 16px; +} + +.device-desktop .phui-comment-panel .phui-timeline-view .phui-timeline-image { + width: 30px; + height: 30px; + top: 4px; + left: -40px; +} + +.phui-comment-panel .phui-timeline-view .phui-timeline-wedge { + display: none; +} + +.phui-comment-panel .phui-timeline-major-event .phui-timeline-group { + border: none; +} + +.phui-comment-panel .phui-timeline-major-event .phui-timeline-title { + background: none; + border: none; + padding: 0; + visibility: hidden; +} + +.phui-comment-panel .phui-timeline-major-event .phui-timeline-title a { + visibility: visible; +} + +.phui-comment-panel .phui-timeline-icon-fill, +.phui-comment-panel .phui-timeline-menu { + display: none; +} + +.phui-comment-panel .phui-timeline-major-event .phui-timeline-content { + border: none; +} + +.phui-comment-panel .phui-timeline-major-event .phui-timeline-content + .phui-timeline-core-content { + border: none; + padding: 4px 0; + background: transparent; +} + +.phui-comment-panel .phui-timeline-older-transactions-are-hidden { + background-color: {$lightgreybackground}; + border: none; +} + +.phui-comment-panel .phui-timeline-badges { + display: none; +} + +.lightbox-comment-form .phui-form-view { + padding-top: 0; +} + +.lightbox-comment-form .aphront-form-control { + padding: 0; +} + +.lightbox-comment-form .aphront-form-input { + margin: 0; + width: auto; +} + +.lightbox-comment-form .remarkup-assist-bar { + display: none; +} + +.lightbox-comment-form .aphront-form-input .remarkup-assist-textarea { + border-radius: 3px; + border: 1px solid {$lightgreyborder}; + height: 6em; +} diff --git a/webroot/rsrc/css/phui/phui-crumbs-view.css b/webroot/rsrc/css/phui/phui-crumbs-view.css new file mode 100644 index 0000000000..0811b36134 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-crumbs-view.css @@ -0,0 +1,138 @@ +/** + * @provides phui-crumbs-view-css + */ + +.phui-crumbs-view { + overflow: hidden; + vertical-align: top; + padding: 0 12px 0 20px; + /* TODO: Position this over the slider for Differential's file tree view. + Remove this once that gets sorted out. */ + position: relative; + -webkit-font-smoothing: antialiased; + background-color: {$page.background}; +} + +.printable .phui-crumbs-view { + display: none; +} + +.phui-crumbs-view, +.phui-crumbs-view a.phui-crumb-view, +.phui-crumbs-view a.phui-crumbs-action { + color: {$darkbluetext}; + font-weight: bold; + text-decoration: none; +} + +.device-tablet .phui-crumbs-view, +.device-phone .phui-crumbs-view, +.project-board-nav .phui-crumbs-view { + padding-left: 8px; + padding-right: 8px; +} + +.phui-crumbs-view a.phui-crumbs-action-disabled, +.phui-crumbs-view a.phui-crumbs-action-disabled .phui-icon-view { + color: {$lightgreytext}; +} + +.phui-crumbs-view + .phui-header-shell { + border-top: none; +} + +.device-desktop .phui-crumbs-view a:hover { + text-decoration: underline; +} + +.phui-crumb-view { + float: left; + padding: 8px 0; + max-width: 240px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.device-phone .phui-crumb-view.phabricator-last-crumb .phui-crumb-name, +.device-phone .phui-crumb-view.phui-crumb-always-visible .phui-crumb-name, +.device-phone .phui-crumb-view.phui-crumb-always-visible + .phui-crumb-divider, +.device-phone .phui-crumb-view.phui-crumb-has-icon, +.device-phone .phui-crumb-has-icon + .phui-crumb-divider { + display: inline-block; +} + +.device-phone .phui-crumb-name, +.device-phone .phui-crumb-divider { + display: none; +} + +.phui-crumb-has-icon .phui-icon-view { + margin: 0 4px; +} + +.device-phone .phui-crumb-icon { + margin-left: 7px; +} + +.phui-crumbs-actions { + float: right; + white-space: nowrap; +} + +.phui-crumbs-action { + display: inline-block; + height: 17px; + padding: 8px 12px; + position: relative; +} + +.device-phone a.phui-crumbs-action { + padding: 8px 6px; +} + +.device-desktop .phui-crumbs-view a:hover, +.device-desktop .phui-crumbs-view a:hover .phui-icon-view { + color: {$blue}; + text-decoration: none; +} + +.device-phone .phui-crumbs-action-name { + display: none; +} + +a.phui-crumbs-action .phui-icon-view { + color: {$darkbluetext}; +} + +a.phui-crumbs-action .phui-crumbs-action-name { + margin-left: 6px; +} + +.device-phone a.phui-crumbs-action .phui-icon-view { + margin-left: 4px; +} + +.phui-crumb-divider { + margin: 2px 8px; +} + +.phui-crumbs-view.phui-crumbs-border { + border-bottom: 1px solid rgba({$alphagrey},.1); +} + +body .phui-crumbs-view + .phui-object-box { + margin-top: 0; +} + +body .phui-crumbs-view + .phui-oi-list-view { + padding-top: 0; +} + +.phui-crumb-action-divider { + border-left: 1px solid {$lightgreyborder}; +} + +.phui-crumbs-action-icon + .phui-crumbs-action-icon { + padding-left: 4px; +} diff --git a/webroot/rsrc/css/phui/phui-curtain-object-ref-view.css b/webroot/rsrc/css/phui/phui-curtain-object-ref-view.css new file mode 100644 index 0000000000..4be03ace8f --- /dev/null +++ b/webroot/rsrc/css/phui/phui-curtain-object-ref-view.css @@ -0,0 +1,98 @@ +/** + * @provides phui-curtain-object-ref-view-css + */ + +.phui-curtain-object-ref-list-view-empty { + font-style: italic; + color: {$greytext}; +} + +.phui-curtain-object-ref-view { + padding: 4px 6px; + border-radius: 3px; +} + +.phui-curtain-object-ref-view + .phui-curtain-object-ref-view { + margin-top: 1px; +} + +.phui-curtain-object-ref-view-image-cell { + min-width: 32px; + padding-bottom: 24px; +} + +.phui-curtain-object-ref-view-image-cell > a { + height: 24px; + width: 24px; + background-size: 100%; + border-radius: 3px; + display: block; + position: absolute; +} + +.phui-curtain-object-ref-view-image-cell .phui-icon-view { + font-size: 16px; + line-height: 16px; + vertical-align: middle; + text-align: center; + width: 24px; + height: 24px; + top: 3px; + display: block; + position: absolute; + color: #ffffff; +} + +.phui-curtain-object-ref-view-icon-image { + background-color: {$backdrop}; +} + +.phui-curtain-object-ref-view-title-cell { + font-weight: bold; + text-overflow: ellipsis; + overflow: hidden; + + /* This is forcing "text-overflow: ellipsis" to actually work. */ + max-width: 210px; +} + +.phui-curtain-object-ref-view-without-content > + .phui-curtain-object-ref-view-title-cell { + vertical-align: middle; +} + +.phui-curtain-object-ref-view-with-content > + .phui-curtain-object-ref-view-image-cell > a { + margin-top: 4px; +} + +.phui-curtain-object-ref-view-title-cell > a { + color: {$darkgreytext}; +} + +.phui-curtain-object-ref-view-epoch-cell { + color: {$greytext}; +} + +.phui-curtain-object-ref-list-view-tail { + text-align: center; + margin-top: 8px; + padding: 4px; + background: {$lightgreybackground}; + border-top: 1px dashed {$thinblueborder}; + box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.04); +} + +.phui-curtain-object-ref-view-highlighted { + background: {$bluebackground}; +} + +.phui-curtain-object-ref-view-exiled { + background: {$lightred}; + opacity: 0.75; +} + +.phui-curtain-object-ref-view-exiled-cell, +.phui-curtain-object-ref-view-exiled-cell a { + color: {$red}; +} diff --git a/webroot/rsrc/css/phui/phui-curtain-view.css b/webroot/rsrc/css/phui/phui-curtain-view.css new file mode 100644 index 0000000000..3facf0fe37 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-curtain-view.css @@ -0,0 +1,80 @@ +/** + * @provides phui-curtain-view-css + */ + +.phui-curtain-panel { + padding: 16px 0; + margin: 0 4px; +} + +.phui-two-column-properties > .phui-curtain-panel:first-child { + padding-top: 6px; +} + +.device .phui-curtain-panel { + padding: 8px 0; + margin: 0; +} + +.device-desktop .phui-curtain-panel + .phui-curtain-panel, +.device-desktop .phabricator-action-list-view + .phui-curtain-panel { + border-top: 1px solid {$greybackground}; +} + +!print .phui-curtain-panel + .phui-curtain-panel { + padding: 8px 0; + border-top: none; +} + +!print .device-desktop .phabricator-action-list-view + .phui-curtain-panel { + padding: 8px 0; + border-top: none; +} + +!print .device-desktop .phui-curtain-panel + .phui-curtain-panel { + padding: 8px 0; + border-top: none; +} + +!print .phabricator-action-list-view + .phui-curtain-panel { + padding: 8px 0; + border-top: none; +} + +.phui-curtain-panel-header { + padding: 0 0 4px; + color: {$bluetext}; + font-weight: bold; +} + +.phui-curtain-panel-body { + padding: 4px 0 0; + overflow: hidden; + text-overflow: ellipsis; +} + +.device .phui-curtain-panel-body { + padding: 0; +} + +!print .phui-curtain-panel-body { + padding: 0; +} + +/* Project tags */ + +.phui-curtain-panel-body .phabricator-handle-tag-list-item { + line-height: 21px; +} + +.phui-side-column .phui-curtain-panel-body .phui-tag-view { + white-space: pre-wrap; +} + +.device .curtain-no-panels { + display: none; +} + +!print .curtain-no-panels { + display: none; +} diff --git a/webroot/rsrc/css/phui/phui-document-pro.css b/webroot/rsrc/css/phui/phui-document-pro.css new file mode 100644 index 0000000000..cdd790f574 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-document-pro.css @@ -0,0 +1,305 @@ +/** + * @provides phui-document-view-pro-css + */ + +.phui-document-view.phui-document-view-pro { + max-width: 800px; + padding: 16px 16px 32px 16px; + margin: 0 auto; +} + +.phui-document-view.phui-document-view-pro.has-curtain { + max-width: 1132px; +} + +.printable .phui-document-view.phui-document-view-pro.has-curtain { + max-width: none; +} + +.device-desktop .phui-document-inner { + overflow: hidden; +} + +.device-desktop .has-curtain .phui-document-content-view { + display: table-cell; +} + +.printable .phui-document-content-view { + padding-right: 0; +} + +.device-desktop .phui-document-content-outer { + display: table; + width: 100%; + layout: fixed; +} + +/* Force very wide content, like tables with many columns, to scroll inside + the frame. See T13202. */ +.phui-document-content-view { + max-width: 800px; +} + +.device-desktop .phui-document-content-inner { + display: table-row; +} + +.device-desktop .phui-document-curtain { + display: table-cell; + width: 300px; +} + +.printable .phui-document-curtain { + display: none; +} + +.phui-document-container { + background-color: {$page.content}; + position: relative; + border-bottom: 1px solid {$document.border}; +} + +.phui-document-view-pro-box, +.phui-document-properties { + max-width: 800px; + margin: 0 auto; +} + +body.printable { + background-color: #fff; +} + +.printable .phui-document-view-pro-box { + display: none; +} + +.printable .phui-document-container { + border: none; +} + +.printable .phui-document-container .phui-header-view .phui-header-subheader { + display: none; +} + +.printable .phui-document-container .phui-header-view .phui-header-col3 { + display: none; +} + +.device .phui-document-view-pro-box { + margin: 0 8px; +} + +.phui-document-view-pro-box .phui-property-list-section { + margin: 16px auto; +} + +.device .phui-document-view-pro-box .phui-property-list-section { + margin: 0 8px 16px; +} + +.device .phui-document-view-pro-box .phui-property-list-container { + padding: 24px 0 0 0; +} + +.device-phone .phui-document-view.phui-document-view-pro { + padding: 0 12px; + margin: 0 auto; +} + +.phui-document-view-pro .phui-document-toc { + position: absolute; + top: 34px; + left: -44px; +} + +.printable .phui-document-view-pro a.phui-document-toc { + display: none; +} + +.phui-document-view-pro .phui-document-toc-list { + margin: 8px; + border: 1px solid {$lightgreyborder}; + border-radius: 3px; + box-shadow: {$dropshadow}; + width: 260px; + position: absolute; + z-index: 30; + background-color: {$page.content}; + top: 52px; + left: -40px; +} + +.device .phui-document-view-pro .phui-document-toc { + display: none; +} + +.phui-document-toc-list { + display: none; +} + +.phui-document-toc-open .phui-document-toc-list { + display: block; +} + +.phui-document-toc-open .phui-document-toc { + border-color: {$blueborder}; +} + +.phui-document-view-pro .phui-document-toc-content { + margin: 8px 16px; +} + +.phui-document-view-pro .phui-document-toc-header { + font-weight: bold; + color: {$bluetext}; + margin-bottom: 8px; + text-transform: uppercase; + font-size: {$smallerfontsize}; +} + +.phui-document-view-pro .phui-document-toc-content li { + margin: 4px 8px 4px 0; +} + +.phui-document-view-pro .phui-document-toc-content a { + padding: 2px 0; + display: block; + text-decoration: none; + color: {$darkbluetext}; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.phui-document-view-pro .phui-document-toc-content a:hover { + color: {$anchor}; + text-decoration: underline; +} + +.phui-document-view-pro .phui-document-toc-content li + ul { + margin: 4px 0 4px 8px; +} + +.phui-document-view-pro .phui-document-content .phabricator-remarkup { + padding: 16px 0; + line-height: 1.7em; +} + +.device-desktop .phui-document-view.phui-document-view-pro { + border: 0; +} + +.phui-document-view.phui-document-view-pro .phui-header-shell { + background: transparent; + border-bottom: 1px solid {$thinblueborder}; +} + +.phui-document-view.phui-document-view-pro .phui-header-shell { + margin: 0; + padding: 16px 0 32px; +} + +.device-phone .phui-document-view.phui-document-view-pro .phui-header-shell { + margin: 0; + padding: 16px 0 20px; +} + +.phui-document-view.phui-document-view-pro .phui-header-tall + .phui-header-header { + font-size: 24px; + line-height: 30px; + color: {$blacktext}; +} + +.device-phone .phui-document-view.phui-document-view-pro .phui-header-tall + .phui-header-header { + font-size: 18px; + } + +.device-phone .phui-document-view-pro .phui-header-subheader { + display: block; + padding: 8px 0 0 0; +} + +.phui-document-view-pro .phui-info-view { + margin: 16px 0; +} + +.phui-document-view-pro .phabricator-remarkup-embed-image-wide { + margin-left: -200px; + margin-right: -200px; + width: auto; +} + +.phui-document-view-pro .phabricator-remarkup-embed-image-wide img { + max-width: 1200px; +} + +@media (max-width: 1200px) { + .phui-document-view-pro .phabricator-remarkup-embed-image-wide { + margin-left: 0; + margin-right: 0; + width: auto; + } + + .phui-document-view-pro .phabricator-remarkup-embed-image-wide img { + max-width: inherit; + } +} + +.phui-document-view-pro-box { + margin-bottom: 24px; +} + +.phui-document-view-pro-box .phui-timeline-view { + padding: 16px 0 0 0; + background: none; +} + +.phui-document-view-pro-box .phui-timeline-wedge { + display: none; +} + +.phui-document-view-pro-box .phui-timeline-major-event .phui-timeline-group { + border: none; +} + +.phui-document-view-pro-box .phui-timeline-major-event .phui-timeline-content { + border: none; +} + +.device-desktop .phui-document-view-pro-box + .phui-timeline-event-view.phui-timeline-minor-event { + margin-left: 62px; +} + +.phui-document-view-pro-box .phui-timeline-title { + border-top-right-radius: 3px; + border-top-left-radius: 3px; + background-color: {$page.content}; + border-bottom: 1px solid #F1F1F4; +} + +.phui-document-view-pro-box .phui-timeline-title-with-icon { + padding-left: 12px; +} + +.phui-document-view-pro-box .phui-timeline-icon-fill { + display: none; +} + +.phui-document-view-pro-box .phui-object-box { + margin: 0; +} + +.phui-document-view-pro-box .phui-object-box .remarkup-assist-textarea { + height: 9em; +} + +.document-has-foot .phui-document-view-pro { + padding-bottom: 0; +} + +.phui-document-foot-content { + margin: 64px 0 32px; +} diff --git a/webroot/rsrc/css/phui/phui-document-summary.css b/webroot/rsrc/css/phui/phui-document-summary.css new file mode 100644 index 0000000000..322096f481 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-document-summary.css @@ -0,0 +1,54 @@ +/** + * @provides phui-document-summary-view-css + */ + +.phui-document-summary-view { + margin-top: 8px; + border-bottom: 1px solid rgba({$alphagrey},.1); +} + +.phui-document-summary-view.is-draft { + opacity: 0.5; +} + +body .phui-document-view .phui-document-summary-view h2.remarkup-header { + margin: 0; + padding: 0; +} + +.phui-document-summary-view h2.remarkup-header a { + color: {$blacktext}; +} + +.phui-document-summary-view h2.remarkup-header a:hover { + color: {$violet}; + text-decoration: none; +} + +.phui-document-view .phui-document-summary-body div.phabricator-remarkup { + padding-bottom: 4px; +} + +a.phui-document-read-more { + color: {$lightgreytext}; + font-size: {$smallerfontsize}; + display: block; + padding-bottom: 12px; +} + +a.phui-document-read-more:hover { + color: {$violet}; +} + +.phui-document-summary-subtitle { + color: {$lightgreytext}; + font-size: {$normalfontsize}; +} + +.phui-document-summary-subtitle a { + color: {$darkbluetext}; +} + +.phui-document-summary-subtitle a:hover { + color: {$violet}; +} diff --git a/webroot/rsrc/css/phui/phui-document.css b/webroot/rsrc/css/phui/phui-document.css index 038922bf60..1c5511b0d3 100644 --- a/webroot/rsrc/css/phui/phui-document.css +++ b/webroot/rsrc/css/phui/phui-document.css @@ -4,133 +4,105 @@ .phui-document-view { margin-bottom: 16px; + border-radius: 3px; position: relative; } .device-desktop .phui-document-view { - border-left: 1px solid #e7e7e7; - border-right: 1px solid #e7e7e7; - border-bottom: 1px solid #c0c5d1; + border: 1px solid {$lightblueborder}; max-width: 960px; margin: 16px auto; } -.device-desktop .phui-document-view.phui-offset-view { - max-width: 800px; +.device-desktop .phui-document-box { + max-width: 996px; + margin: 24px auto; } -.phui-document-sidenav { - position:absolute; - width: 200px; - text-overflow: ellipsis; - top: 0; - right: 0; +.device-desktop .phui-document-fluid .phui-document-view { + max-width: none; + margin: 16px; } -.device-phone .phui-document-sidenav { - position: static; - width: auto; - border-top: 1px solid #d7d7d7; - border-bottom: 1px solid #d7d7d7; +/* Fix so that Phriction Document preview is the same width as the document */ +.device-desktop .phui-remarkup-preview .phui-document-view { + width: 800px; } -.device-phone .phui-sidenav-view .phui-document-inner { - margin: 0; +.phui-document-content .phui-header-shell { + border-top: none; + border-bottom: 1px solid {$lightblueborder}; } -.phui-sidenav-view .phui-document-inner { - margin-right: 200px; - border-right: 1px solid #e7e7e7; - background: #fff; +.phui-document-content + .phui-header-shell.phui-header-no-background { + border-bottom: 1px solid {$thinblueborder}; + margin: 0 0 16px 0; } -.phui-document-bookname { - padding: 8px 16px; - color: #9ca5b5; +.phui-document-content + .phui-header-shell.phui-header-no-background + .phui-header-view { + padding: 8px 0 4px; } -.phui-document-bookname .bookname { - font-size: 14px; - font-weight: bold; - float: left; -} - -.phui-document-bookname .bookdescription { - font-size: 14px; - float: right; +.legalpad .phui-document-content .phui-property-list-view { + border: none; + box-shadow: none; + border-radius: 3px; + margin: 16px 0 0 0; + background-color: {$bluebackground}; } -.phui-document-content .phabricator-header-shell { - background-color: #f6f7f8; - border-top: 1px solid #e7e7e7; - border-bottom: 1px solid #e7e7e7; +.phui-document-content { + background: {$page.content}; } -.phui-document-content .phabricator-header-view { +.phui-document-content .phabricator-remarkup { padding: 16px; + font-size: 14px; } -.phui-document-content .phabricator-property-list-view { - border: none; - box-shadow: none; - margin: 0; - background-color: #f6f7f8; -} - -.phui-document-content { - box-shadow: 0 1px 2px rgba(0,0,0,0.2); - min-height: 240px; - background: #fff; - - /* NOTE: This fixes margins, not floats, and can not be replaced with - the ".group" class. See T3150. - */ - overflow: hidden; +.phui-document-view.has-no-curtain + .phui-header-action-links .phui-mobile-menu { + display: block; } -.device-desktop .phui-document-content .phabricator-action-list-view { - margin: 10px 10px 0 0; - background: #f7f7f7; +.device-phone .phui-document-content .phabricator-remarkup { + padding: 8px; } -.device-phone .phui-document-content .phabricator-action-list-view { - margin: 0; - border-bottom: 1px solid #c0c5d1; - background: #f7f7f7; +.phui-document-content .phabricator-remarkup .remarkup-code-block { + clear: both; + margin: 16px 0; } -.phui-document-content .phabricator-remarkup { - padding: 16px; +.phui-document-view .phui-info-severity-nodata { + background-color: {$lightgreybackground}; } -.device-phone .phui-document-content .phabricator-remarkup { - padding: 8px; +.phui-document-view .phui-property-list-section-header { + padding: 20px 24px 0px; + border-top: none; } -.device-desktop .phui-document-content .phabricator-action-list-view { - position: absolute; - top: 50px; - right: -172px; - float: none; - background: #fff; - border-radius: 0; - box-shadow: none; - border: none; - border-top: 1px solid #e7e7e7; - border-bottom: 1px solid #e7e7e7; - border-right: 1px solid #e7e7e7; - width: 160px; +.phui-document-view .phui-property-list-text-content { + padding: 0 24px 4px; } -.device-phone .phui-document-content .phabricator-remarkup-toc { - width: 120px; +.phui-document-view .PhabricatorMonospaced, +.phui-document-view .phabricator-remarkup .remarkup-code-block .remarkup-code { + font: 12px/18px "Menlo", "Consolas", "Monaco", monospace; } -.phui-document-content .phabricator-remarkup .remarkup-code-block { - clear: both; - margin: 16px 0; +.platform-windows .phui-document-view .PhabricatorMonospaced, +.platform-windows .phui-document-view .phabricator-remarkup .remarkup-code-block + .remarkup-code { + font: 13px/18px "Menlo", "Consolas", "Monaco", monospace; } -.device-desktop .phui-document-offset { - padding-right: 160px; +.phui-document-version-navigation { + text-align: center; + padding: 8px; + background-color: {$lightgreybackground}; } diff --git a/webroot/rsrc/css/phui/phui-feed-story.css b/webroot/rsrc/css/phui/phui-feed-story.css index e0f7ff9abb..3fdfeb5a57 100644 --- a/webroot/rsrc/css/phui/phui-feed-story.css +++ b/webroot/rsrc/css/phui/phui-feed-story.css @@ -2,66 +2,79 @@ * @provides phui-feed-story-css */ -.phui-feed-story { - background: 5px 2px no-repeat; - min-height: 44px; - background-color: #fff; +.phui-object-box .phui-box.phui-feed-story { + border-bottom: 1px solid {$thinblueborder}; } -.phui-feed-story-head .phui-feed-story-actor-image { +.phui-object-box .phui-box.phui-feed-story:last-child { + border: none; +} + +.phui-feed-story-head .phui-feed-story-actor { width: 35px; height: 35px; - background-size: 35px; float: left; margin-right: 8px; + border-radius: 3px; +} + +.phui-feed-story-head .phui-feed-story-actor-image { + background-size: 35px; +} + +.phui-feed-story-head .phui-feed-story-actor-icon { + text-align: center; + vertical-align: middle; + font-size: 24px; + line-height: 32px; + color: #fff; + background-color: #c4cde0; } .phui-feed-story-head { - padding: 8px; - overflow: hidden; - color: #555; + padding: 12px 4px; + overflow: hidden; + color: {$greytext}; + word-break: break-word; } .phui-feed-story-head .phui-link-person { - color: #333; - font-weight: bold; + color: {$darkgreytext}; + font-weight: bold; } .phui-feed-story-body { - padding: 0 8px 8px; - color: #444444; + margin: 4px 4px 8px; + padding-bottom: 8px; + color: {$darkgreytext}; word-break: break-word; + max-height: 300px; + overflow: hidden; } .phui-feed-story-foot { - font-size: 11px; - background: #f7f7f7; - padding: 8px; - line-height: 14px; + font-size: {$smallerfontsize}; + padding: 0 4px 12px; } .phui-feed-story-foot, .phui-feed-story-foot a { - color: #777; + color: {$greytext}; } -.phui-feed-story-foot .phui-icon-view, -.phui-feed-story-oneline-foot .phui-icon-view { - float: left; - display: inline-block; +.phui-feed-story-foot .phui-icon-view { margin-right: 5px; } .phui-feed-story-bigtext-post { line-height: 18px; - color: #444; + color: {$darkgreytext}; } .phui-feed-story-bigtext-post h3 { - font-size: 18px; - font-weight: 200; + font-size: {$biggestfontsize}; line-height: 18px; - color: #39444f; + color: {$darkgreytext}; margin: 0 0 5px 0; } @@ -84,26 +97,11 @@ .phui-feed-story-action-item { float: right; padding-left: 2px; + height: 18px; + width: 18px; + font-size: 18px; } .phui-feed-story-action-list .phui-icon-view { display: block; } - -.phui-feed-story-oneline .phui-feed-story-head { - padding: 8px; -} - -.phui-feed-story-oneline .phui-feed-story-body { - padding: 0; -} - -.phui-feed-story-oneline-foot, -.phui-feed-story-oneline-foot a { - font-size: 11px; - color: #777; - margin-top: 2px; - line-height: 14px; - font-weight: normal; -} - diff --git a/webroot/rsrc/css/phui/phui-fontkit.css b/webroot/rsrc/css/phui/phui-fontkit.css new file mode 100644 index 0000000000..1bc56826d7 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-fontkit.css @@ -0,0 +1,11 @@ +/** + * @provides phui-fontkit-css + */ + +.diviner-document-section .phui-header-header { + color: {$blacktext}; +} + +.phui-document-view .phabricator-remarkup .remarkup-header strong { + color: #586BE9; +} diff --git a/webroot/rsrc/css/phui/phui-form-view.css b/webroot/rsrc/css/phui/phui-form-view.css new file mode 100644 index 0000000000..accce86819 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-form-view.css @@ -0,0 +1,594 @@ +/** + * @provides phui-form-view-css + */ + +.phui-form-view { + padding: 16px; +} + +.device-phone .phui-object-box .phui-form-view { + padding: 0; +} + +.phui-form-view.phui-form-full-width { + padding: 0; +} + +.phui-form-view label.aphront-form-label { + width: 19%; + height: 28px; + line-height: 28px; + float: left; + text-align: right; + font-weight: bold; + font-size: {$normalfontsize}; + color: {$bluetext}; + -webkit-font-smoothing: antialiased; +} + +.device-phone .phui-form-view label.aphront-form-label, +.phui-form-full-width.phui-form-view label.aphront-form-label { + display: block; + float: none; + text-align: left; + width: 100%; + margin-bottom: 3px; +} + +.aphront-form-input { + margin-left: 20%; + margin-right: 20%; + width: 60%; +} + +.device-phone .aphront-form-input, +.device .aphront-form-input select, +.device .aphront-form-input pre, +.phui-form-full-width .aphront-form-input { + margin-left: 0%; + margin-right: 0%; + width: 100%; +} + +.aphront-form-input *::-webkit-input-placeholder { + color:{$greytext} !important; +} + +.aphront-form-input *::-moz-placeholder { + color:{$greytext} !important; + opacity: 1; /* Firefox nudges the opacity to 0.4 */ +} + +.aphront-form-input *:-ms-input-placeholder { + color:{$greytext} !important; +} + + +.aphront-form-error { + width: 18%; + float: right; + color: {$red}; + font-weight: bold; + padding-top: 5px; +} + +.aphront-form-label .aphront-form-error { + display: none; +} + +.aphront-dialog-body .phui-form-view { + padding: 0; +} + +.device-phone .aphront-form-error, +.phui-form-full-width .aphront-form-error { + display: none; +} + +.device-phone .aphront-form-label .aphront-form-error, +.phui-form-full-width .aphront-form-label .aphront-form-error { + display: block; + float: right; + padding: 0; + width: auto; +} + +.device-phone .aphront-form-drag-and-drop-upload { + display: none; +} + +.aphront-form-required { + font-weight: normal; + color: {$lightgreytext}; + font-size: {$smallestfontsize}; + -webkit-font-smoothing: antialiased; +} + +.aphront-form-input input[type="text"], +.aphront-form-input input[type="password"] { + width: 100%; +} + +.aphront-form-cvc-input input { + width: 64px; +} + +.aphront-form-input textarea { + display: block; + width: 100%; + box-sizing: border-box; + height: 12em; +} + +.aphront-form-control { + padding: 4px; +} + +.device-phone .aphront-form-control { + padding: 4px 8px 8px; +} + +.phui-form-full-width .aphront-form-control { + padding: 4px 0; +} + +.aphront-form-control-submit button, +.aphront-form-control-submit a.button, +.aphront-form-control-submit input[type="submit"] { + float: right; + margin: 4px 0 0 8px; +} + +.aphront-form-control-textarea textarea.aphront-textarea-very-short { + height: 44px; +} + +.aphront-form-control-textarea textarea.aphront-textarea-very-tall { + height: 24em; +} + +.phui-form-view .aphront-form-caption { + font-size: {$smallerfontsize}; + color: {$bluetext}; + padding: 8px 0; + margin-right: 20%; + margin-left: 20%; + -webkit-font-smoothing: antialiased; + line-height: 16px; +} + +.device-phone .phui-form-view .aphront-form-caption, +.phui-form-full-width .phui-form-view .aphront-form-caption { + margin: 0; +} + +.aphront-form-instructions { + width: 60%; + margin-left: 20%; + padding: 12px 4px; + color: {$darkbluetext}; +} + +.device .aphront-form-instructions, +.phui-form-full-width .aphront-form-instructions { + width: auto; + margin: 0; + padding: 12px 8px 8px; +} + +.aphront-form-important { + margin: .5em 0; + background: #ffffdd; + padding: .5em 1em; +} +.aphront-form-important code { + display: block; + padding: .25em; + margin: .5em 2em; +} + +.aphront-form-control-markup .aphront-form-input { + font-size: {$normalfontsize}; + padding: 3px 0; +} + +.aphront-form-control-static .aphront-form-input { + line-height: 28px; +} + +.aphront-form-control-togglebuttons .aphront-form-input { + padding: 2px 0 0 0; +} + +table.aphront-form-control-radio-layout, +table.aphront-form-control-checkbox-layout { + margin-top: 4px !important; + font-size: {$normalfontsize}; +} + +table.aphront-form-control-radio-layout th { + padding-left: 8px; + padding-bottom: 8px; + font-weight: bold; + color: {$darkgreytext}; +} + + +table.aphront-form-control-checkbox-layout th { + padding-top: 2px; + padding-left: 8px; + padding-bottom: 4px; + color: {$darkgreytext}; +} + +.aphront-form-control-radio-layout td input, +.aphront-form-control-checkbox-layout td input { + margin-top: 4px; + width: auto; +} + +.aphront-form-control-radio-layout label.disabled, +.aphront-form-control-checkbox-layout label.disabled { + color: {$greytext}; +} + +.aphront-form-radio-caption { + margin-top: 4px; + font-size: {$smallerfontsize}; + font-weight: normal; + color: {$bluetext}; +} + +.aphront-form-control-image span { + margin: 0 4px 0 2px; +} + +.aphront-form-control-image .default-image { + display: inline; + width: 12px; +} + +.aphront-form-input hr { + border: none; + background: #bbbbbb; + height: 1px; + position: relative; +} + +.phui-form-inset { + margin: 12px 0; + padding: 8px; + background: #f7f9fd; + border: 1px solid {$lightblueborder}; + border-radius: 3px; +} + +.phui-form-inset h1 { + color: {$bluetext}; + padding-bottom: 8px; + margin-bottom: 8px; + font-size: {$biggerfontsize}; + border-bottom: 1px solid {$thinblueborder}; +} + +.aphront-form-drag-and-drop-file-list { + width: 400px; +} + +.drag-and-drop-instructions { + color: {$darkgreytext}; + font-size: {$smallestfontsize}; + padding: 6px 8px; +} + +.drag-and-drop-file-target { + border: 1px dashed #bfbfbf; + padding-top: 12px; + padding-bottom: 12px; +} + +body .phui-form-view .remarkup-assist-textarea.aphront-textarea-drag-and-drop { + background: {$sh-greenbackground}; + border: 1px solid {$sh-greenborder}; +} + +.aphront-form-crop .crop-box { + cursor: move; + overflow: hidden; +} + +.aphront-form-crop .crop-box .crop-image { + position: relative; + top: 0px; + left: 0px; +} + +.calendar-button { + display: inline; + padding: 8px 4px; + margin: 2px 8px 2px 2px; + position: relative; +} + +.aphront-form-date-container { + position: relative; + display: inline; +} + +.aphront-form-date-container select { + margin: 2px; + display: inline; +} +.aphront-form-date-container input.aphront-form-date-enabled-input { + width: auto; + display: inline; + margin-right: 8px; + font-size: 16px; +} + +.aphront-form-date-container .aphront-form-time-input-container, +.aphront-form-date-container .aphront-form-date-input-container { + position: relative; + display: inline-block; + width: 7em; +} + +.aphront-form-date-container input.aphront-form-time-input, +.aphront-form-date-container input.aphront-form-date-input { + width: 7em; +} + +.aphront-form-time-input-container div.jx-typeahead-results a.jx-result { + border: none; +} + +.phui-time-typeahead-value { + padding: 4px; +} + +.fancy-datepicker { + position: absolute; + width: 240px; +} + +.device .fancy-datepicker { + width: 100%; +} + +.fancy-datepicker-core { + width: 240px; + margin: 0 auto; + padding: 1px; + font-size: {$smallerfontsize}; + text-align: center; +} + +.fancy-datepicker-core .month-table, +.fancy-datepicker-core .day-table { + margin: 0 auto; + border-collapse: separate; + border-spacing: 1px; + width: 100%; +} + +.fancy-datepicker-core .month-table { + margin-bottom: 6px; + font-size: {$normalfontsize}; + background-color: {$hoverblue}; + border-radius: 2px; +} + +.fancy-datepicker-core .month-table td.lrbutton { + width: 18%; + color: {$lightbluetext}; +} + +.fancy-datepicker-core .month-table td { + padding: 4px; + font-weight: bold; + color: {$bluetext}; +} + +.fancy-datepicker-core .month-table td.lrbutton:hover { + border-radius: 2px; + background: {$hoverselectedblue}; + color: {$darkbluetext}; +} + +.fancy-datepicker-core .day-table td { + overflow: hidden; + vertical-align: center; + text-align: center; + border: 1px solid {$thinblueborder}; + padding: 4px 0; +} + +.fancy-datepicker .fancy-datepicker-core .day-table td.day:hover { + background-color: {$hoverblue}; + border-color: {$lightblueborder}; +} + +.fancy-datepicker-core .day-table td.day-placeholder { + border-color: transparent; + background: transparent; +} + +.fancy-datepicker-core .day-table td.weekend { + color: {$lightgreytext}; + border-color: {$lightgreyborder}; + background: {$lightgreybackground}; +} + +.fancy-datepicker-core .day-table td.day-name { + background: transparent; + border: 1px transparent; + vertical-align: bottom; + color: {$lightgreytext}; +} + +.fancy-datepicker-core .day-table td.today { + background: {$greybackground}; + border-color: {$greyborder}; + color: {$darkgreytext}; + font-weight: bold; +} + +.fancy-datepicker-core .day-table td.datepicker-selected { + background: {$lightgreen}; + border-color: {$green}; + color: {$green}; +} + +.fancy-datepicker-core td { + cursor: pointer; +} + +.fancy-datepicker-core td.novalue { + cursor: inherit; +} + +.picker-open .calendar-button .phui-icon-view { + color: {$sky}; +} + +.fancy-datepicker-core { + background-color: white; + border: 1px solid {$lightgreyborder}; + box-shadow: {$dropshadow}; + border-radius: 3px; +} + +/* When the activation checkbox for the control is toggled off, visually +disable the individual controls. We don't actually use the "disabled" property +because we still want the values to submit. This is just a visual hint that +the controls won't be used. The controls themselves are still live, work +properly, and submit values. */ +.datepicker-disabled select, +.datepicker-disabled .calendar-button, +.datepicker-disabled input[type="text"] { + opacity: 0.5; +} + +.aphront-form-date-container.no-time .aphront-form-time-input{ + display: none; +} + +.login-to-comment { + margin: 12px; +} + +.phui-form-divider hr { + height: 1px; + border: 0; + background: {$thinblueborder}; + width: 85%; + margin: 15px auto; +} + +.recaptcha_only_if_privacy { + display: none; +} + +.phabricator-standard-custom-field-header { + font-size: 16px; + color: {$bluetext}; + border-bottom: 1px solid {$lightbluetext}; + padding: 16px 0 4px; + margin-bottom: 4px; +} + +.device-desktop .text-with-submit-control-outer-bounds { + position: relative; +} + +.device-desktop .text-with-submit-control-text-bounds { + position: absolute; + left: 0; + right: 184px; +} + +.device-desktop .text-with-submit-control-submit-bounds { + text-align: right; +} + +.device-desktop .text-with-submit-control-submit { + width: 180px; +} + +.phui-form-iconset-table td { + vertical-align: middle; + padding: 4px 0; +} + +.phui-form-iconset-table .phui-form-iconset-button-cell { + padding: 4px 8px; +} + +.aphront-form-preview-hidden { + opacity: 0.5; +} + +.aphront-form-error .phui-icon-view { + float: right; + color: {$lightgreyborder}; + font-size: 20px; +} + +.device-desktop .aphront-form-error .phui-icon-view:hover { + color: {$red}; +} + +.phui-form-static-action { + height: 28px; + line-height: 28px; + color: {$bluetext}; +} + +.phuix-form-checkbox-action { + padding: 4px; + color: {$bluetext}; +} + +.phuix-form-checkbox-action input[type=checkbox] { + margin: 4px 0; +} + +.phuix-form-checkbox-label { + margin-left: 4px; +} + +.phui-form-timer-icon { + width: 28px; + height: 28px; + padding: 4px; + font-size: 18px; + background: {$greybackground}; + border-radius: 4px; + text-align: center; + vertical-align: middle; + text-shadow: 1px 1px rgba(0, 0, 0, 0.05); +} + +.phui-form-timer-content { + padding: 4px 8px; + color: {$darkgreytext}; + vertical-align: middle; +} + +.mfa-form-enroll-button { + text-align: center; +} + +.phui-form-timer-updated { + animation: phui-form-timer-fade-in 2s linear; +} + + +@keyframes phui-form-timer-fade-in { + 0% { + background-color: {$lightyellow}; + } + 100% { + background-color: transparent; + } +} diff --git a/webroot/rsrc/css/phui/phui-form.css b/webroot/rsrc/css/phui/phui-form.css index 92bdacc40e..bb92df78ba 100644 --- a/webroot/rsrc/css/phui/phui-form.css +++ b/webroot/rsrc/css/phui/phui-form.css @@ -20,11 +20,12 @@ input[type="tel"], input[type="color"], div.jx-tokenizer-container { display: inline-block; - height: 28px; + height: 30px; line-height: 18px; - color: #333; + color: inherit; vertical-align: middle; - font: 13px 'Helvetica Neue', Arial, sans-serif; + font: {$basefont}; + -webkit-font-smoothing: antialiased; } textarea, @@ -44,12 +45,9 @@ input[type="tel"], input[type="color"], div.jx-tokenizer-container { padding: 4px 6px; - background-color: #ffffff; - border: 1px solid #96A6C5; - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + background-color: {$page.content}; + border: 1px solid {$greyborder}; + border-radius: 3px; -webkit-transition: border linear .05s, box-shadow linear .05s; -moz-transition: border linear .05s, box-shadow linear .05s; @@ -62,7 +60,6 @@ div.jx-tokenizer-container { /* iOS Safari */ -webkit-appearance: none; - border-radius: 0; } textarea:focus, @@ -85,9 +82,15 @@ div.jx-tokenizer-container-focused { outline: 0; /* IE6-9 */ - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + -webkit-box-shadow: + inset 0 1px 1px rgba({$alphablack},.075), + 0 0 8px rgba(82,168,236,.6); + -moz-box-shadow: + inset 0 1px 1px rgba({$alphablack},.075), + 0 0 8px rgba(82,168,236,.6); + box-shadow: + inset 0 1px 1px rgba({$alphablack},.075), + 0 0 8px rgba(82,168,236,.6); } input[type="radio"], input[type="checkbox"] { @@ -98,15 +101,25 @@ input[type="checkbox"] { } select { - height: 24px; - line-height: 24px; - border: 1px solid #a1a5a9; - background-color: #ffffff; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + + background: {$page.content} url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAUCAMAAACzvE1FAAAADFBMVEUzMzMzMzMzMzMzMzMKAG/3AAAAA3RSTlMAf4C/aSLHAAAAPElEQVR42q3NMQ4AIAgEQTn//2cLdRKppSGzBYwzVXvznNWs8C58CiussPJj8h6NwgorrKRdTvuV9v16Afn0AYFOB7aYAAAAAElFTkSuQmCC") no-repeat right 8px center; + background-size: 8px 10px; + border-radius: 3px; + border: 1px solid {$greyborder}; + height: 30px; + padding: 0 24px 0 8px; + margin: 0; + min-width: 180px; } + select[multiple], select[size] { height: auto; } + select:focus, input[type="file"]:focus, input[type="radio"]:focus, @@ -115,21 +128,43 @@ input[type="checkbox"]:focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } + input:-moz-placeholder, textarea:-moz-placeholder { - color: #999999; + color: {$lightgreytext}; } + input:-ms-input-placeholder, textarea:-ms-input-placeholder { - color: #999999; + color: {$lightgreytext}; } + input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { - color: #999999; + color: {$lightgreytext}; } - -select[disabled="disabled"], -input[disabled="disabled"] { +select[disabled], +input[disabled], +textarea[disabled], +.disabled-control { opacity: 0.5; } + +.aphront-space-select-control-knob { + margin: 0 8px 4px 0; + float: left; +} + +.aphront-form-control-policy .policy-control { + float: left; + margin-right: 8px; +} + +.device .aphront-space-select-control-knob { + float: none; +} + +.device .aphront-form-control-policy .policy-control { + margin: 0; +} diff --git a/webroot/rsrc/css/phui/phui-formation-view.css b/webroot/rsrc/css/phui/phui-formation-view.css new file mode 100644 index 0000000000..cc6748c35a --- /dev/null +++ b/webroot/rsrc/css/phui/phui-formation-view.css @@ -0,0 +1,216 @@ +/** + * @provides phui-formation-view-css + */ + +.phui-formation-view { + table-layout: fixed; + width: 100%; +} + +.phui-formation-view-expander { + position: fixed; + width: 24px; + height: 36px; + top: 64px; + border-style: solid; + box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1); + border-color: {$lightgreyborder}; + background: {$lightgreybackground}; + z-index: 4; + + display: none; +} + +.device-desktop .phui-formation-view-expander { + display: block; +} + +.phui-formation-desktop-only { + display: none; +} + +.device-desktop .phui-formation-desktop-only { + display: table-cell; +} + +.phui-formation-view-expander-left { + border-radius: 0 12px 12px 0; + border-width: 1px 1px 1px 0; + cursor: e-resize; +} + +.phui-formation-view-expander-right { + border-radius: 12px 0 0 12px; + border-width: 1px 0 1px 1px; + cursor: w-resize; +} + +.phui-formation-view-expander-icon { + position: absolute; + width: 18px; + height: 18px; + top: 9px; + left: 3px; + text-align: center; +} + +.device-desktop .phui-formation-view-expander:hover { + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1); + background: {$darkgreybackground}; + transition: 0.1s; +} + +.device-desktop .phui-formation-view-expander:hover + .phui-icon-view { + color: {$bluetext}; + transition: 0.1s; +} + +.phui-flank-header { + padding: 8px; + background: {$bluebackground}; + border-bottom: 1px solid {$lightgreyborder}; +} + +.phui-flank-header-text { + color: {$darkgreytext}; + font-weight: bold; +} + +.phui-flank-header-hide { + font-size: {$normalfontsize}; + position: absolute; + display: inline-block; + top: 6px; + right: 6px; + width: 20px; + height: 20px; + text-align: center; + border: 1px solid {$lightgreyborder}; + border-radius: 4px; + line-height: 20px; +} + +.phui-flank-header-hide-left { + cursor: w-resize; +} + + +.device-desktop .phui-flank-header-hide:hover { + box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.05); + background: {$darkgreybackground}; + transition: 0.1s; +} + +.device-desktop .phui-flank-header-hide:hover + .phui-icon-view { + color: {$bluetext}; + transition: 0.1s; +} + +.phui-formation-resizer { + position: fixed; + top: 0; + bottom: 0; + + cursor: col-resize; + background: #f5f5f5; + border-style: solid; + border-width: 0 1px 0 1px; + border-color: #fff #999c9e #fff #999c9e; + box-sizing: border-box; + + box-shadow: inset -1px 0px 1px rgba({$alphablack}, 0.15); + + background-image: url(http://github.com/rsrc/image/divot.png); + background-position: center; + background-repeat: no-repeat; + + display: none; + z-index: 4; +} + +.device-desktop .phui-formation-resizer { + display: block; +} + +.phui-flank-view-fixed { + position: fixed; + top: {$menu.main.height}; + bottom: 0; + overflow: hidden; + background: {$lightgreybackground}; + z-index: 4; +} + +.phui-flank-view-fixed .phui-flank-view-body { + overflow: hidden auto; +} + +.device-desktop .phui-flank-view-fixed + .phui-flank-view-body::-webkit-scrollbar { + height: 6px; + width: 6px; + background: rgba(0, 0, 0, 0.1); + border-radius: 4px; +} + +.device-desktop .phui-flank-view-fixed + .phui-flank-view-body::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.25); + border-radius: 4px; +} + +.phui-flank-view-fixed .phui-flank-view-tail { + position: absolute; + bottom: 0; + width: 100%; +} + +.phui-flank-view .phui-list-view { + margin: 4px; +} + +.phui-flank-view .phui-list-item-view { + height: 20px; + padding: 4px 0; +} + +.phui-flank-view .phui-list-item-view .phui-icon-view { + width: 20px; + height: 20px; + text-align: center; + margin-right: 4px; +} + +.phui-flank-view .phui-list-item-view .phui-list-item-href { + display: block; + color: {$darkbluetext}; + text-decoration: none; +} + +.device-desktop .phui-flank-view .phui-list-item-view:hover { + background: {$lightblueborder}; + transition: 0.1s; +} + +.phui-flank-view .keyboard-shortcut-key { + position: absolute; + right: 4px; + top: 4px; + height: 18px; + width: 18px; + line-height: 18px; + padding: 0; + color: {$lightgreytext}; +} + +.phui-flank-view-head .phui-list-view { + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + padding-bottom: 4px; +} + +.phui-flank-view-tail .phui-list-view { + box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.1); + padding-top: 4px; +} diff --git a/webroot/rsrc/css/phui/phui-head-thing.css b/webroot/rsrc/css/phui/phui-head-thing.css new file mode 100644 index 0000000000..bf491c4f1f --- /dev/null +++ b/webroot/rsrc/css/phui/phui-head-thing.css @@ -0,0 +1,36 @@ +/** + * @provides phui-head-thing-view-css + */ + +.phui-head-thing-view { + height: 24px; + line-height: 22px; + color: {$greytext}; +} + +.phui-head-thing-view.phui-head-has-image { + position: relative; + padding-left: 32px; +} + +.device-phone .phui-two-column-subheader .phui-head-thing-view { + min-height: 24px; + height: auto; + line-height: inherit; +} + +.phui-head-thing-view a { + color: {$darkgreytext}; +} + +.phui-head-thing-image { + height: 24px; + width: 24px; + background-size: 100%; + margin-right: 8px; + border-radius: 3px; + display: inline-block; + position: absolute; + top: 0; + left: 0; +} diff --git a/webroot/rsrc/css/phui/phui-header-view.css b/webroot/rsrc/css/phui/phui-header-view.css new file mode 100644 index 0000000000..7131db5640 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-header-view.css @@ -0,0 +1,330 @@ +/** + * @provides phui-header-view-css + */ + +.phui-header-shell { + border-bottom: 1px solid {$thinblueborder}; + overflow: hidden; + padding: 0 4px 12px; +} + +.phui-header-view { + display: table; + width: 100% +} + +.phui-header-row { + display: table-row; +} + +.phui-header-col1 { + display: table-cell; + vertical-align: middle; + width: 62px; +} + +.phui-header-col2 { + display: table-cell; + vertical-align: middle; + word-break: break-word; +} + +.phui-header-col3 { + display: table-cell; + vertical-align: middle; +} + +body .phui-header-shell.phui-header-no-background { + background-color: transparent; + border: none; +} + +body .phui-header-shell.phui-bleed-header { + background-color: #fff; + border-bottom: 1px solid {$thinblueborder}; + width: auto; + margin: 16px; +} + +body .phui-header-shell.phui-bleed-header + .phui-header-view { + padding: 8px 24px 8px 0; + color: {$darkbluetext}; +} + +.phui-header-shell + .phabricator-form-view { + border-top-width: 0; +} + +.phui-property-list-view + .diviner-document-section { + margin-top: -1px; +} + +.phui-header-view { + position: relative; + font-size: {$normalfontsize}; +} + +.phui-header-header { + font-size: 16px; + line-height: 24px; + color: {$darkbluetext}; +} + +.phui-header-header .phui-header-icon { + margin-right: 8px; + color: {$lightbluetext}; + + /* This allows the header text to be triple-clicked to select it in Firefox, + see T10905 for discussion. */ + display: inline; +} + +.phui-object-box .phui-header-tall .phui-header-header, +.phui-document-view .phui-header-tall .phui-header-header { + font-size: 18px; +} + +.phui-header-view .phui-header-header a { + color: {$darkbluetext}; +} + +.phui-box-blue-property .phui-header-view .phui-header-header a { + color: {$bluetext}; +} + +.device-desktop .phui-header-view .phui-header-header a:hover { + text-decoration: none; + color: {$blue}; +} + +.phui-header-view .phui-header-action-links { + float: right; +} + +.phui-object-box .phui-header-view .phui-header-action-links { + margin-right: 4px; + font-size: {$normalfontsize}; +} + +.phui-header-action-link { + margin-bottom: 4px; + margin-top: 4px; + float: right; +} + +.device-phone .phui-header-action-link .phui-button-text { + visibility: hidden; + width: 0; + margin-left: 8px; +} + +.device-phone .phui-header-action-link.button .phui-icon-view { + width: 12px; + text-align: center; +} + +.phui-header-divider { + margin: 0 4px; + font-weight: normal; + color: {$lightbluetext}; +} + +.phui-header-tags { + margin-left: 12px; + font-size: {$normalfontsize}; +} + +.phui-header-tags .phui-tag-view { + margin-left: 4px; +} + +.phui-header-image { + display: inline-block; + background-repeat: no-repeat; + background-size: 100%; + width: 50px; + height: 50px; + border-radius: 3px; +} + +.phui-header-image-href { + position: relative; + display: block; +} + +.phui-header-image-edit { + display: none; +} + +.device-desktop .phui-header-image-href:hover .phui-header-image-edit { + display: block; + position: absolute; + left: 0; + background: rgba({$alphablack},0.4); + color: #fff; + font-weight: normal; + bottom: 4px; + padding: 4px 8px; + font-size: 12px; +} + +.device-desktop .phui-header-image-edit:hover { + text-decoration: underline; +} + +.phui-header-subheader { + font-weight: normal; + font-size: {$biggerfontsize}; + margin-top: 8px; +} + +.phui-header-subheader .phui-icon-view { + margin-right: 4px; +} + +.phui-header-subheader .phui-tag-view span.phui-icon-view, +.phui-header-subheader .policy-header-callout span.phui-icon-view { + display: inline-block; + margin: -2px 4px -2px 0; + font-size: 15px; +} + +.phui-header-subheader, +.phui-header-subheader .policy-link { + color: {$darkbluetext}; +} + +.policy-header-callout, +.phui-header-subheader .phui-tag-core { + padding: 3px 9px; + border-radius: 3px; + background: rgba({$alphablue}, 0.1); + margin-right: 8px; + -webkit-font-smoothing: auto; + border-color: transparent; + line-height: 28px; +} + + +.phui-header-subheader .phui-tag-view, +.phui-header-subheader .phui-tag-type-shade .phui-tag-core { + border: none; + font-weight: normal; + -webkit-font-smoothing: auto; +} + +.policy-header-callout.policy-adjusted-special { + background: {$sh-indigobackground}; +} + +.policy-header-callout.policy-adjusted-special .policy-link, +.policy-header-callout.policy-adjusted-special .phui-icon-view { + color: {$sh-indigotext}; +} + +.policy-header-callout.policy-adjusted-locked { + background: {$sh-pinkbackground}; +} + +.policy-header-callout.policy-adjusted-locked .policy-link, +.policy-header-callout.policy-adjusted-locked .phui-icon-view { + color: {$sh-pinktext}; +} + + +.policy-header-callout .policy-space-container { + font-weight: bold; + color: {$sh-redtext}; +} + +.policy-header-callout .policy-tier-separator { + padding: 0 0 0 4px; + color: {$lightgreytext}; +} + +.phui-header-action-links .phui-mobile-menu { + display: none; +} + +.device .phui-header-action-links .phui-mobile-menu { + display: inline-block; +} + +.phui-header-action-list { + float: right; +} + +.phui-header-action-list li { + margin: 0 0 0 8px; + float: right; +} + +.phui-header-action-list .phui-header-action-item .phui-icon-view { + height: 18px; + width: 16px; + font-size: 16px; + line-height: 20px; + display: block; +} + +.spaces-name { + color: {$lightbluetext}; +} + +.phui-object-box .phui-header-tall .spaces-name { + font-size: 18px; +} + +.spaces-name .phui-handle, +.spaces-name a.phui-handle, +.phui-profile-header.phui-header-shell .spaces-name .phui-handle { + color: {$sh-redtext}; +} + +.device-desktop .spaces-name a.phui-handle:hover { + color: {$sh-redtext}; + text-decoration: underline; +} + + +/*** Profile Header ***********************************************************/ + +.phui-profile-header { + padding: 24px 20px 20px 24px; +} + +.device-phone .phui-profile-header { + padding: 12px; +} + +.phui-profile-header.phui-header-shell { + margin: 0; + border: none; +} + +.phui-profile-header .phui-header-image { + height: 80px; + width: 80px; +} + +.phui-profile-header .phui-header-col1 { + width: 96px; +} + +.phui-profile-header .phui-header-subheader { + margin-top: 12px; +} + +.phui-profile-header.phui-header-shell .phui-header-header { + font-size: 24px; + color: {$blacktext}; +} + +.phui-profile-header.phui-header-shell .phui-header-header a { + color: {$blacktext}; +} + +.phui-header-view .phui-tag-indigo a { + color: {$sh-indigotext}; +} diff --git a/webroot/rsrc/css/phui/phui-hovercard.css b/webroot/rsrc/css/phui/phui-hovercard.css new file mode 100644 index 0000000000..876b0b6e53 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-hovercard.css @@ -0,0 +1,117 @@ +/** + * @provides phui-hovercard-view-css + */ + +.jx-hovercard-container { + position: absolute; +} + +.phui-hovercard-wrapper { + width: 400px; +} + +.device-phone .phui-hovercard-wrapper { + width: 300px; +} + +.phui-hovercard-container { + width: 100%; + box-shadow: {$dropshadow}; + border: 1px solid {$lightblueborder}; + border-radius: 3px; + background-color: {$page.content}; +} + +.phui-hovercard-head .phui-header-shell { + padding: 6px 8px 6px 12px; + background-color: {$bluebackground}; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +.phui-hovercard-head .phui-header-header { + font-size: {$biggerfontsize}; +} + +.phui-hovercard-head .phui-tag-type-state { + color: {$darkbluetext}; + text-shadow: none; + font-weight: normal; +} + +.phui-hovercard-tags { + float: right; + white-space: normal; +} + +.phui-hovercard-body { + padding: 12px; + color: {$darkgreytext}; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + position: relative; +} + +.phui-hovercard-body-item { + margin: 4px 0 0 0; + overflow: hidden; + text-overflow: ellipsis; +} + +.phui-hovercard-body-header { + font-size: 14px; + padding-bottom: 4px; + color: {$darkgreytext}; + line-height: 18px; +} + +.phui-hovercard-body .phui-hovercard-body-image { + width: 58px; +} + +.phui-hovercard-body .phui-hovercard-body-details { + margin-left: 58px; +} + +.phui-hovercard-body .profile-header-picture-frame { + float: left; + width: 50px; + height: 50px; + background-position: center; + background-repeat: no-repeat; + background-size: 100%; +} + +.hovercard-badges { + margin: 6px 0 0 0; + padding: 4px; + background: {$page.background}; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +.hovercard-badges .phui-badge-flex-item { + float: left; +} + +.phui-hovercard-tail { + width: 396px; + float: left; + padding: 2px; + border-top: 1px solid {$thinblueborder}; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +.phui-hovercard-tail button, +.phui-hovercard-tail a.button { + margin: 3px; +} + +.phui-hovercard-wrapper .hovercard-task-view { + box-shadow: 0px 4px 16px rgba(0,0,0,.2); +} + +.hovercard-task-view .phui-oi-disabled.phui-workcard { + background-color: #fff; +} diff --git a/webroot/rsrc/css/phui/phui-icon-set-selector.css b/webroot/rsrc/css/phui/phui-icon-set-selector.css new file mode 100644 index 0000000000..c66c2a6e55 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-icon-set-selector.css @@ -0,0 +1,42 @@ +/** + * @provides phui-icon-set-selector-css + */ + +button.icon-button { + background-color: #F7F7F9; + background-image: linear-gradient(to bottom, #ffffff, #f1f0f1); + border: 1px solid rgba({$alphablue},.2); + color: {$darkgreytext}; + position: relative; + width: 16px; + height: 16px; + padding: 12px; + margin: 4px; + text-shadow: none; + box-shadow: none; + box-sizing: content-box; +} + +button.icon-button:hover { + border: 1px solid rgba({$alphablue},.5); +} + +button.icon-button .phui-icon-view { + color: {$darkbluetext}; +} + +.icon-grid { + text-align: center; +} + +.icon-icon + .icon-icon { + margin-left: 4px; +} + +button.icon-button.selected { + border: 1px solid {$sky}; +} + +button.icon-button.selected .phui-icon-view { + color: {$sky}; +} diff --git a/webroot/rsrc/css/phui/phui-icon.css b/webroot/rsrc/css/phui/phui-icon.css index 1e7ef4fd75..5436bb04b1 100644 --- a/webroot/rsrc/css/phui/phui-icon.css +++ b/webroot/rsrc/css/phui/phui-icon.css @@ -7,46 +7,200 @@ vertical-align: top; } -.phui-icon-view.sprite-minicons { - height: 16px; - width: 16px; +.phui-icon-view.sprite-tokens { + height: 18px; + width: 18px; + display: inline-block; + vertical-align: top; +} + +.phui-icon-view.sprite-login { + height: 28px; + width: 28px; +} + +.phui-icon-view.phuihead-medium { + height: 50px; + width: 50px; +} + +.phui-icon-view.phuihead-small { + height: 35px; + width: 35px; + background-size: 35px; +} + +.phui-icon-has-text:before { + margin-right: 6px; +} + +a.phui-icon-view:hover { + text-decoration: none; + color: {$sky}; +} + +img.phui-image-disabled { + opacity: .8; + -webkit-filter: grayscale(100%); + filter: grayscale(100%); +} + +.phui-icon-view.bluetext { + color: {$bluetext}; } -.phui-icon-view.sprite-actions { +.phui-icon-view.invisible { + visibility: hidden; +} + +/* - Icon in a Circle ------------------------------------------------------- */ + +.phui-icon-circle { + border: 1px solid {$lightblueborder}; + border-radius: 24px; height: 24px; width: 24px; + text-align: center; + display: inline-block; + cursor: pointer; + background: transparent; + padding: 0; + position: relative; } -.phui-icon-view.sprite-apps, -.phui-icon-view.sprite-icons { - height: 14px; +.phui-icon-circle.circle-medium { + height: 36px; + width: 36px; + border-radius: 36px; +} + +.phui-icon-circle.phui-icon-circle-state { + border-color: transparent; + background-color: {$bluebackground}; +} + +.phui-icon-circle.phui-icon-circle-state .phui-icon-circle-icon { + color: {$bluetext}; + font-size: 16px; +} + +a.phui-icon-circle.phui-icon-circle-state:hover { + border-color: transparent !important; +} + +.phui-icon-circle .phui-icon-circle-icon { + height: 24px; + width: 24px; + font-size: 11px; + line-height: 24px; + color: {$lightblueborder}; + cursor: pointer; +} + +.phui-icon-circle.circle-medium .phui-icon-circle-icon { + font-size: 18px; + line-height: 36px; +} + +a.phui-icon-circle.hover-sky:hover { + text-decoration: none; + border-color: {$sky}; + cursor: pointer; +} + +a.phui-icon-circle.hover-sky:hover .phui-icon-view { + color: {$sky}; +} + +a.phui-icon-circle.hover-violet:hover { + text-decoration: none; + border-color: {$violet}; + cursor: pointer; +} + +a.phui-icon-circle.hover-violet:hover .phui-icon-view { + color: {$violet}; +} + +a.phui-icon-circle.hover-pink:hover { + text-decoration: none; + border-color: {$pink}; + cursor: pointer; +} + +a.phui-icon-circle.hover-pink:hover .phui-icon-view { + color: {$pink}; +} + +a.phui-icon-circle.hover-green:hover { + text-decoration: none; + border-color: {$green}; + cursor: pointer; +} + +a.phui-icon-circle.hover-green:hover .phui-icon-view { + color: {$green}; +} + +a.phui-icon-circle.hover-red:hover { + text-decoration: none; + border-color: {$red}; + cursor: pointer; +} + +a.phui-icon-circle.hover-red:hover .phui-icon-view { + color: {$red}; +} + +.phui-icon-circle .phui-icon-view.phui-icon-circle-state-icon { + position: absolute; width: 14px; + height: 14px; + display: inline-block; + font-size: 12px; + right: -3px; + top: -4px; + text-shadow: + -1px -1px 0 #fff, + 1px -1px 0 #fff, + -1px 1px 0 #fff, + 1px 1px 0 #fff; } -.phui-icon-view.sprite-tokens { - height: 16px; - width: 16px; +/* - Icon in a Square ------------------------------------------------------- */ + +.phui-icon-view.phui-icon-square { + height: 40px; + width: 40px; + color: #fff; + font-size: 26px; + text-align: center; + line-height: 38px; + border-radius: 3px; } -.phui-icon-view.sprite-payments { - height: 32px; - width: 60px; +a.phui-icon-view.phui-icon-square:hover { + text-decoration: none; + color: #fff; } -.phui-icon-view.sprite-login { - height: 34px; - width: 34px; + +.phui-icon-emblem { + border-radius: 4px; } -.phui-icon-view.phuihead-medium { - height: 50px; - width: 50px; +.phui-timeline-extra .phui-icon-emblem { + padding: 4px 6px; } -.phui-icon-view.phuihead-small { - height: 35px; - width: 35px; - background-size: 35px; +.phui-icon-emblem-violet { + background-color: {$violet}; } +.phui-icon-emblem-red { + background-color: {$red}; +} +.phui-icon-emblem-pink { + background-color: {$pink}; +} diff --git a/webroot/rsrc/css/phui/phui-image-mask.css b/webroot/rsrc/css/phui/phui-image-mask.css new file mode 100644 index 0000000000..70350aa488 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-image-mask.css @@ -0,0 +1,23 @@ +/** + * @provides phui-image-mask-css + */ + + +.phui-image-mask { + background: url('http://github.com/rsrc/image/checker_lighter.png'); + display: inline-block; + border: 1px solid {$lightblueborder}; + padding: 4px; +} + +.phui-image-mask-image { + background-repeat: no-repeat; + position: relative; + overflow: hidden; +} + +.phui-image-mask-mask { + border: 300px solid rgba({$alphablack}, 0.5); + background-clip: content-box; + position: absolute; +} diff --git a/webroot/rsrc/css/phui/phui-info-view.css b/webroot/rsrc/css/phui/phui-info-view.css new file mode 100644 index 0000000000..0d15d08e4b --- /dev/null +++ b/webroot/rsrc/css/phui/phui-info-view.css @@ -0,0 +1,154 @@ +/** + * @provides phui-info-view-css + */ + +.phui-info-view { + border-style: solid; + border-width: 1px; + background: {$page.content}; + margin: 16px; + padding: 12px; + border-radius: 3px; +} + +div.phui-info-view.phui-info-severity-plain { + background: {$lightgreybackground}; + color: {$bluetext}; + border: none; + padding: 8px 12px; + margin-bottom: 4px !important; +} + +.phui-info-view.phui-info-view-flush { + margin: 0 0 20px 0; +} + +.device .phui-info-view { + margin: 8px; +} + +.phui-info-view .phui-form-view { + padding: 0; +} + +.phui-info-view-icon { + width: 24px; + float: left; +} + +.phui-info-view-body { + line-height: 1.6em; + color: {$blacktext}; +} + +.phui-info-view.phui-info-has-icon .phui-info-view-body { + margin-left: 24px; +} + +.phui-info-view-body tt { + color: {$blacktext}; + background: rgba({$alphablue},0.1); + padding: 1px 4px; + border-radius: 3px; + white-space: pre-wrap; +} + +.phui-info-view-actions { + margin-top: -3px; + margin-bottom: -4px; + float: right; +} + +.phui-info-view-actions .button { + margin-left: 4px; +} + +.phui-info-view-head + .phui-info-view-body { + padding-top: 4px; +} + +h1.phui-info-view-head { + font-weight: bold; + font-size: {$biggerfontsize}; + line-height: 1.3em; +} + +.phui-info-view-list { + margin-left: 30px; + list-style: disc; + line-height: 1.6em; +} + +.phui-info-view .phui-info-icon { + padding-top: 1px; + font-size: 16px; +} + +.phui-info-severity-error { + border-color: {$red}; + border-left-width: 6px; +} + +.phui-info-severity-error .phui-info-icon { + color: {$red}; +} + +.phui-info-severity-mfa { + border-color: {$blue}; + border-left-width: 6px; +} + +.phui-info-severity-mfa .phui-info-icon { + color: {$blue}; +} + +.phui-info-severity-warning { + border-color: {$yellow}; + border-left-width: 6px; +} + +.phui-info-severity-warning .phui-info-icon { + color: {$yellow}; +} + +.phui-info-severity-notice { + border-color: {$blue}; + border-left-width: 6px; +} + +.phui-info-severity-notice .phui-info-icon { + color: {$blue}; +} + +.phui-info-severity-nodata { + border-color: {$lightgreyborder}; +} + +.phui-info-severity-success { + border-color: {$green}; + border-left-width: 6px; +} + +.phui-info-severity-success .phui-info-icon { + color: {$green}; +} + +.aphront-dialog-body .phui-info-view { + margin: 0 0 8px 0; +} + +.phui-crumbs-view + .phui-info-view { + margin-top: 0; +} + +.phui-crumbs-view.phui-crumbs-border + .phui-info-view { + margin-top: 16px; +} + +div.phui-object-box .phui-header-shell + .phui-info-view { + margin: 16px 0 8px; +} + +div.phui-object-box.phui-box-white-config .phui-header-shell + .phui-info-view { + margin: 20px 16px 8px; +} diff --git a/webroot/rsrc/css/phui/phui-invisible-character-view.css b/webroot/rsrc/css/phui/phui-invisible-character-view.css new file mode 100644 index 0000000000..a6a90da536 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-invisible-character-view.css @@ -0,0 +1,12 @@ +/** + * @provides phui-invisible-character-view-css + */ + +.invisible-special { + font-family: monospace; + color: {$blacktext}; + background: rgba({$alphablue},0.1); + padding: 1px 4px; + border-radius: 3px; + white-space: pre-wrap; +} diff --git a/webroot/rsrc/css/phui/phui-left-right.css b/webroot/rsrc/css/phui/phui-left-right.css new file mode 100644 index 0000000000..ac092cd226 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-left-right.css @@ -0,0 +1,40 @@ +/** + * @provides phui-left-right-css + */ + +.phui-left-right-view { + display: table; + width: 100%; +} + +.phui-lr-container { + display: table-row; +} + +.phui-left-view { + display: table-cell; + text-align: left; +} + +.phui-right-view { + display: table-cell; + text-align: right; +} + +.phui-left-view .button { + margin-right: 8px; +} + +.phui-right-view .button { + margin-left: 8px; +} + +.phui-lr-view-top .phui-left-view, +.phui-lr-view-top .phui-right-view { + vertical-align: top; +} + +.phui-lr-view-bottom .phui-left-view, +.phui-lr-view-bottom .phui-right-view { + vertical-align: bottom; +} diff --git a/webroot/rsrc/css/phui/phui-lightbox.css b/webroot/rsrc/css/phui/phui-lightbox.css new file mode 100644 index 0000000000..611b9c97a4 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-lightbox.css @@ -0,0 +1,191 @@ +/** + * @provides phui-lightbox-css + */ + + +.lightbox-attached { + overflow: hidden; +} + +.lightbox-attachment { + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + overflow-y: auto; +} + +.lightbox-attachment .lightbox-image-frame { + position: absolute; + top: 44px; + right: 0; + bottom: 0; + left: 0; + text-align: center; +} + +.lightbox-attachment.comment-panel-open .lightbox-image-frame { + right: 360px; +} + +.lightbox-attachment .lightbox-image-frame img { + max-width: calc(100% - 40px); + max-height: calc(100% - 24px); + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; +} + +.lightbox-comment-frame { + position: absolute; + top: -19999px; + right: 0; + opacity: 0; + transition: all 0.3s; +} + +.lightbox-attachment .lightbox-icon-frame { + top: 44%; + left: calc(50% - 160px); + position: fixed; + display: block; + height: 120px; + width: 320px; + color: {$darkbluetext}; +} + +.lightbox-attachment .lightbox-icon-frame:hover, +.lightbox-attachment .lightbox-icon-frame:hover .phui-icon-view { + color: {$anchor}; + text-decoration: none; +} + +.lightbox-attachment.comment-panel-open .lightbox-icon-frame { + left: calc(50% - 340px); +} + +.lightbox-attachment .phui-lightbox-file-icon { + font-size: 64px; + color: {$darkbluetext}; +} + +.comment-panel-open .lightbox-comment-frame { + position: fixed; + top: 44px; + bottom: 0; + right: 0; + width: 360px; + overflow-y: auto; + background: {$page.content}; + opacity: 1; +} + +.device-phone .comment-panel-open .lightbox-comment-frame { + width: auto; + left: 0; +} + +.jx-mask + .lightbox-attachment { + background: {$lightgreybackground}; +} + +.lightbox-attachment .attachment-name { + line-height: 32px; + font-size: {$biggerfontsize}; + text-align: center; +} + +.lightbox-attachment .lightbox-status { + background: {$page.content}; + position: fixed; + top: 0; + left: 0; + right: 0; + height: 44px; + padding: 0 20px; + line-height: 44px; + border-bottom: 1px solid {$thinblueborder}; + color: {$greytext}; +} + +.device-phone .lightbox-attachment .lightbox-status { + padding: 0 12px; +} + +.lightbox-attachment .lightbox-status .lightbox-download { + float: right; +} + +.lightbox-attachment .lightbox-status-txt a { + color: {$blacktext}; + margin-right: 12px; + font-size: {$biggerfontsize}; +} + +.lightbox-attachment .lightbox-status .phui-icon-view { + height: 18px; + width: 24px; + font-size: 14px; + line-height: 23px; + display: block; +} + +.lightbox-attachment .lightbox-status .lightbox-download + .lightbox-download-form { + display: inline; +} + +.lightbox-attachment a.lightbox-download, +.lightbox-attachment a.lightbox-comment, +.lightbox-attachment a.lightbox-close { + float: right; + margin: 9px 0 0 8px; +} + +.lightbox-attachment.comment-panel-open .lightbox-comment.phui-icon-circle, +.lightbox-attachment.comment-panel-open .lightbox-comment .phui-icon-view { + color: {$sky}; + border-color: {$sky}; +} + +.lightbox-attachment .lightbox-left { + top: 46%; + left: 12px; + position: fixed; + display: block; + height: 40px; + width: 40px; +} + +.lightbox-attachment .lightbox-left .phui-icon-view { + font-size: 40px; +} + +.lightbox-attachment .lightbox-left:hover .phui-icon-view { + color: {$sky}; +} + +.lightbox-attachment .lightbox-right .phui-icon-view { + top: 46%; + right: 12px; + position: fixed; + display: block; + height: 38px; + width: 21px; +} + +.lightbox-attachment.comment-panel-open .lightbox-right .phui-icon-view { + right: 362px; +} + +.lightbox-attachment .lightbox-right .phui-icon-view { + font-size: 40px; +} + +.lightbox-attachment .lightbox-right:hover .phui-icon-view { + color: {$sky}; +} diff --git a/webroot/rsrc/css/phui/phui-list.css b/webroot/rsrc/css/phui/phui-list.css index 0f8317d71a..dee105f25b 100644 --- a/webroot/rsrc/css/phui/phui-list.css +++ b/webroot/rsrc/css/phui/phui-list.css @@ -2,13 +2,15 @@ * @provides phui-list-view-css */ +.phui-list-item-view { + position: relative; +} + .phui-list-item-header, .phui-list-item-header a { - color: #9ca5b5; - text-transform: uppercase; + color: {$bluetext}; font-weight: bold; - font-size: 12px; - text-shadow: 0 1px 0 rgba(255,255,255,0.90); + -webkit-font-smoothing: antialiased; } /* - Sidenav and Actions ------------------------------------------------------- @@ -22,17 +24,16 @@ } .phui-list-sidenav .phui-list-item-type-label .phui-list-item-name { - font-size: 12px; font-weight: bold; - color: #9ca5b5; - text-transform: uppercase; - padding: 4px 8px 4px 8px; + color: {$bluetext}; + padding: 4px 8px 6px 8px; display: block; + -webkit-font-smoothing: antialiased; } .phui-list-sidenav .phui-list-item-type-divider { margin: 8px 8px 12px 8px; - border-bottom: 1px solid #e7e7e7; + border-bottom: 1px solid {$thinblueborder}; } .phui-list-sidenav .phui-list-item-icon { @@ -40,7 +41,8 @@ width: 14px; display: inline-block; position: absolute; - top: 4px; + top: 6px; + text-align: center; } .phui-list-sidenav .phui-list-item-icon + .phui-list-item-name { @@ -60,23 +62,34 @@ display: block; padding: 4px 16px; clear: both; - color: #333333; + color: {$darkgreytext}; line-height: 18px; } +.phabricator-side-menu .phui-list-item-disabled .phui-list-item-href, +.phui-list-sidenav .phui-list-item-disabled .phui-list-item-href { + color: {$lightgreytext}; +} + .phui-list-sidenav .phui-list-item-has-icon .phui-list-item-href { - padding: 2px 10px; + padding: 4px 10px; +} + +.phabricator-side-menu .phui-list-item-has-icon .phui-list-item-indented { + padding-left: 24px; } .device-desktop .phui-list-sidenav .phui-list-item-href:hover { - background: #005588; - background-image: linear-gradient(to bottom, #3b86c4, #2b628f); - background-image: -webkit-linear-gradient(top, #3b86c4, #2b628f); + background: {$sky}; color: white; cursor: pointer; text-decoration: none; } +.device-desktop .phui-list-sidenav .phui-list-item-href:hover .phui-icon-view { + color: {$page.content}; +} + /* - Top, Full Width Navigations ----------------------------------------------- Sets a page or box with a top navbar @@ -86,44 +99,252 @@ .phui-list-view.phui-list-navbar { list-style: none; overflow: hidden; - border-bottom: 1px solid #e7e7e7; +} + +.phui-list-view.phui-list-navbar-horizontal { + border-bottom: 1px solid {$thinblueborder}; } .phui-list-view.phui-list-navbar > li { list-style: none; - float: left; display: block; - border-right: 1px solid #e7e7e7; } -.phui-list-view.phui-list-navbar > li > * { - display: block; +.phui-list-view.phui-list-navbar-horizontal > li { + float: left; + border-right: 1px solid {$thinblueborder}; } .phui-list-navbar .phui-list-item-href { - color: #9ca5b5; - padding: 8px 16px; - font-size: 12px; + color: {$bluetext}; + line-height: 16px; +} + +.phui-list-navbar-horizontal .phui-list-item-href { + padding: 8px 16px; +} + +.phui-list-navbar-vertical .phui-list-item-href { + padding: 8px 12px; +} + +.phui-list-navbar-vertical { + box-shadow: 0 1px 0 rgba({$alphablue}, 0.05); +} + +.phui-list-navbar-vertical .phui-list-item-href { + display: block; + background: #ffffff; } .phui-list-navbar .phui-list-item-selected .phui-list-item-href { - background: #f6f7f8; - color: #555; + background: {$lightbluebackground}; + color: {$darkbluetext}; + font-weight: bold; +} + +.phui-tab-group-view-tab-column { + width: 220px; + border-right: 1px solid {$thinblueborder}; + background: {$lightgreybackground}; } .phui-list-navbar .phui-list-item-href:hover { - background: #e8e9ec; - color: #555; + background: rgba(100,100,100,.1); + color: {$darkgreytext}; text-decoration: none; } .phui-list-navbar .phui-list-item-icon { height: 14px; width: 14px; + font-size: 14px; + text-align: center; +} + +.phui-list-navbar-vertical .phui-list-item-icon { + margin-right: 8px; +} + +.phui-list-navbar-horizontal .phui-list-item-icon { display: block; } +.device-phone .phui-list-view.phui-list-navbar-horizontal > li { + float: none; + border: none; +} + +/* - Two Column View, Responsive Navigations ----------------------------------- + + Sets a two column page with a responsive, top navbar + +*/ + +.phui-list-view.phui-list-tabbar { + list-style: none; + overflow: hidden; +} + +.phui-list-view.phui-list-tabbar > li { + list-style: none; + float: left; + display: block; +} + +.phui-list-view.phui-list-tabbar > li > * { + display: block; +} + +.phui-list-tabbar .phui-list-item-href { + color: {$bluetext}; + padding: 8px 24px; + line-height: 24px; + font-weight: bold; + font-size: {$biggerfontsize}; + border-top: 4px solid transparent; +} + +.phui-list-tabbar .phui-list-item-selected .phui-list-item-href { + color: {$sky}; + border-bottom: 4px solid {$sky}; +} + +.phui-list-tabbar .phui-list-item-selected .phui-list-item-href + .phui-icon-view { + color: {$sky}; +} + +.device-desktop .phui-list-tabbar .phui-list-item-href:hover { + color: {$sky}; + text-decoration: none; +} + +.phui-list-tabbar .phui-list-item-icon { + height: 20px; + width: 20px; + display: none; + font-size: 20px; + text-align: center; +} + +.device-phone .phui-list-tabbar .phui-list-item-icon { + display: inline-block; +} + +.device-phone .phui-list-tabbar .phui-list-item-name { + display: none; +} + +.device-phone .phui-list-tabbar .phui-list-item-href { + padding: 8px 16px; +} + .device-phone .phui-list-view.phui-list-navbar > li { float: none; border: none; } + +/* - Status Colors ------------------------------------------------------------- + + Colors for navbars + +*/ + +.phui-list-item-warn .phui-list-item-href { + color: #bc7837; +} + +.phui-list-item-fail .phui-list-item-href { + color: {$red}; +} + +.phui-list-item-warn.phui-list-item-selected .phui-list-item-href, +.phui-list-item-warn .phui-list-item-href:hover { + background: {$lightyellow}; + color: #bc7837; +} + +.phui-list-item-fail.phui-list-item-selected .phui-list-item-href, +.phui-list-item-fail .phui-list-item-href:hover { + background: {$lightred}; + color: {$red}; +} + +.phui-list-item-warn.phui-list-item-selected .phui-list-item-href:hover { + background: #fcf0bd; +} + +.phui-list-item-fail.phui-list-item-selected .phui-list-item-href:hover { + background: #f5d3d0; +} + +/* - Dashboards ------------------------------------------------------------ */ + +.dashboard-panel .phui-list-view.phui-list-navbar { + border-left: 1px solid {$lightblueborder}; + border-right: 1px solid {$lightblueborder}; + border-bottom: 1px solid {$thinblueborder}; +} + +/* - Info Stack ------------------------------------------------------------ */ + +.phui-info-view + .phui-list-view { + margin-top: 16px; + border-top: 1px solid {$thinblueborder}; +} + +/* - Action Icon ----------------------------------------------------------- */ + +.phabricator-nav-local .phui-list-item-has-action-icon + .phui-list-item-action-href { + position: absolute; + width: 28px; + top: 0; + right: 0; + bottom: 0; + text-align: center; + line-height: 28px; + background-color: transparent; + display: none; +} + +.phabricator-nav-local .phui-list-item-has-action-icon.phui-list-item-selected + .phui-list-item-href { + padding-right: 32px; +} + +.phabricator-nav-local .phui-list-item-has-action-icon.phui-list-item-selected + .phui-list-item-action-href { + display: block; +} + +.phabricator-nav-local .phui-list-item-has-action-icon + .phui-list-item-action-href:hover { + background-color: rgba({$alphablack},.05); +} + +.phabricator-nav-local .phui-list-item-has-action-icon + .phui-list-item-action-icon { + opacity: 0.5; +} + +.phabricator-nav-local .phui-list-item-has-action-icon + .phui-list-item-action-href:hover + .phui-list-item-action-icon { + opacity: 1; +} + +/* - Item Counts ----------------------------------------------------------- */ + +.phui-list-item-count { + position: absolute; + right: 7px; + top: 7px; + background: {$blue}; + border-radius: 2px; + color: #fff; + font-weight: bold; + padding: 0 5px 1px; + font-size: {$smallestfontsize}; +} diff --git a/webroot/rsrc/css/phui/phui-object-box.css b/webroot/rsrc/css/phui/phui-object-box.css new file mode 100644 index 0000000000..4ab6732e29 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-object-box.css @@ -0,0 +1,171 @@ +/** + * @provides phui-object-box-css + */ + +.phui-object-box { + position: relative; + padding: 12px 12px 4px 12px; +} + +.phui-object-box.phui-object-box-collapsed { + padding: 12px 0 0 0; +} + +.device-phone .phui-object-box.phui-object-box-collapsed { + padding: 8px 0 0 0; +} + +.phui-object-box.phui-object-box-collapsed .phui-header-shell { + padding: 0 8px 12px 16px; +} + +.device-phone .phui-object-box.phui-object-box-collapsed .phui-header-shell { + padding: 0 8px 8px; +} + +div.phui-object-box.phui-object-box-flush { + margin-top: 0; +} + +.phui-object-box .phui-header-shell + .phui-info-view { + margin: 12px 0 0 0; +} + +.phui-object-box.phui-object-box-collapsed + .phui-header-shell + .phui-info-view { + margin: 0; + border-radius: 0; + border: 0; + border-bottom: 1px solid {$thinblueborder}; +} + +.device-phone .phui-object-box { + margin: 8px; + padding: 8px 8px 4px 8px; +} + +.device-phone .phui-object-box .phui-header-shell { + padding: 4px 0 12px 4px; +} + +.device-tablet .phui-object-box { + margin: 8px 8px 0 8px; +} + +.phui-object-box .phui-header-header .phui-tag-view { + margin-left: 8px; +} + +.phui-object-box .phui-header-header .phui-tag-core { + border-color: transparent; + padding: 1px 6px; + font-size: {$normalfontsize}; +} + +.phui-object-box-tail-buttons { + padding: 8px; + background: {$lightgreybackground}; + border-top: 1px solid {$lightgreyborder}; +} + +/* - Object Box Colors ------------------------------------------------------ */ + +.phui-box-border.phui-object-box-green { + border: 1px solid {$green}; +} + +.phui-box-border.phui-object-box-green .phui-header-view { + color: {$green}; +} + +.phui-box-border.phui-object-box-green .phui-header-shell { + border-bottom-color: {$lightgreen}; +} + +.phui-box-border.phui-object-box-blue { + border: 1px solid {$blue}; +} + +.phui-box-border.phui-object-box-blue .phui-header-view { + color: {$blue}; +} + +.phui-box-border.phui-object-box-blue .phui-header-shell { + border-bottom-color: {$lightblue}; +} + +.phui-box-border.phui-object-box-red { + border: 1px solid {$red}; +} + +.phui-box-border.phui-object-box-red .phui-header-view { + color: {$red}; +} + +.phui-box-border.phui-object-box-red .phui-header-shell { + border-bottom-color: {$lightred}; +} + +.phui-object-box-hidden-content { + background: {$lightgreybackground}; + border-bottom: 1px solid {$thinblueborder}; +} + +.phui-object-box.phui-object-box-collapsed .phui-object-box-hidden-content { + margin: 0; +} + +/* - Double Object Box Override --------------------------------------------- */ + +.phui-object-box .phui-object-box { + padding: 0; +} + +/* eh oh el */ +.phui-object-box .phui-object-box + .phui-object-box { + border-top: 1px solid {$thinblueborder}; +} + +.phui-object-box .phui-object-box .phui-header-shell .phui-header-header { + font-family: {$fontfamily}; +} + +.phui-object-box .phui-box-border { + border-width: 0; + padding: 0; + margin: 0; +} + +.phui-object-box .phui-box-border.phui-box-blue-property { + border-width: 1px; +} + +.phui-object-box .phui-object-box .phui-header-shell .phui-header-header { + font-size: {$normalfontsize}; + margin: 0; + color: {$darkbluetext}; + font-weight: bold; +} + +.phui-object-box .phui-object-box .phui-header-shell { + margin: 0; + padding: 4px 8px; + background-color: {$lightgreybackground}; +} + +/* - Pager at the bottom ---------------------------------------------------- */ + +.phui-object-box-pager { + background-color: {$bluebackground}; + border-top: 1px solid {$lightblueborder}; +} + +.phui-object-box-pager a.button { + margin-top: 8px; + margin-bottom: 8px; +} + +.phui-object-box-instructions { + padding: 16px; + border-bottom: 1px solid {$thinblueborder}; +} diff --git a/webroot/rsrc/css/phui/phui-pager.css b/webroot/rsrc/css/phui/phui-pager.css new file mode 100644 index 0000000000..462ef2ad22 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-pager.css @@ -0,0 +1,14 @@ +/** + * @provides phui-pager-css + */ + +.phui-pager-view { + clear: both; + text-align: center; +} + +.phui-pager-view a.button.current, +.phui-pager-view a.button.current:hover { + border-color: {$sh-orangetext}; + color: {$sh-orangetext}; +} diff --git a/webroot/rsrc/css/phui/phui-pinboard-view.css b/webroot/rsrc/css/phui/phui-pinboard-view.css index f9fa857756..1fb4e95792 100644 --- a/webroot/rsrc/css/phui/phui-pinboard-view.css +++ b/webroot/rsrc/css/phui/phui-pinboard-view.css @@ -3,30 +3,34 @@ */ .phui-pinboard-view { - padding: 8px 0 20px 20px; + padding: 16px 8px; overflow: hidden; - margin: 12px 0; + text-align: center; } -.device-phone .phui-pinboard-view { - padding: 0; +.phui-pinboard-list-item { + display: inline; } .phui-pinboard-item-view { - margin: 0 8px 16px 0; - border: 1px solid #d5d9df; - background: #ffffff; + margin: 0 12px 16px 0; + text-align: left; + width: 280px; + background: {$page.content}; + border: 1px solid {$lightblueborder}; border-radius: 3px; +} - float: left; - width: 288px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); - text-align: left; +.phui-pinboard-view .phui-pinboard-item-view { + display: inline-block; } .device-desktop .phui-pinboard-item-view:hover { - cursor: pointer; - box-shadow: 0 1px 6px rgba(0, 0, 0, 0.30); + border-color: {$blue}; +} + +.device-desktop .phui-pinboard-item-view:hover .phui-pinboard-item-header a { + color: {$blue}; } /* On phones, show a single column of items. */ @@ -36,49 +40,63 @@ } .phui-pinboard-item-header { - padding: 5px 10px; + padding: 6px 8px; display: block; - background: #edf0f4; font-weight: bold; - border-top-left-radius: 3px; - border-top-right-radius: 3px; - border-bottom: 1px solid #d5d9df; white-space: nowrap; overflow: hidden; + border-top: 1px solid {$thinblueborder}; } .phui-pinboard-item-header a { - color: #333; + color: {$darkbluetext}; } .phui-pinboard-item-image-link { - padding: 8px 4px; display: block; } +.phui-pinboard-item-image-link img { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + .phui-pinboard-item-content { - padding: 0 10px 5px; + padding: 0 8px 8px; overflow: hidden; - color: #777; - font-size: 11px; + color: {$bluetext}; + font-size: {$smallerfontsize}; } .phui-pinboard-item-count { float: left; - margin-left: 10px; + margin-left: 8px; } .phui-pinboard-icons { - padding: 0 10px 10px 0; - color: #aaa; - border-bottom: 1px solid #e7e7e7; - margin-bottom: 5px; + padding: 4px 8px 4px 0; + color: {$darkbluetext}; overflow: hidden; } .phui-pinboard-icon { - height: 14px; - width: 14px; - float: left; - padding-left: 2px; + margin-right: 4px; +} + +.phui-pinboard-item-disabled .phui-pinboard-item-image-link img { + opacity: 0.25; +} + +.phui-pinboard-item-disabled .phui-pinboard-item-header a { + color: {$greytext}; + text-decoration: line-through; +} + +.dashboard-panel .phui-pinboard-view { + margin: 0; + padding: 16px 12px 0 12px; + background: {$page.content}; + border-left: 1px solid {$lightblueborder}; + border-right: 1px solid {$lightblueborder}; + border-bottom: 1px solid {$blueborder}; } diff --git a/webroot/rsrc/css/phui/phui-policy-section-view.css b/webroot/rsrc/css/phui/phui-policy-section-view.css new file mode 100644 index 0000000000..4325b34867 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-policy-section-view.css @@ -0,0 +1,62 @@ +/** + * @provides phui-policy-section-view-css + */ + +.phui-policy-section-view { + margin-bottom: 24px; +} + +.phui-policy-section-view-header { + background: {$bluebackground}; + border-bottom: 1px solid {$lightblueborder}; + padding: 4px 8px; + color: {$darkbluetext}; + margin-bottom: 8px; +} + +.phui-policy-section-view-header-text { + font-weight: bold; +} + +.phui-policy-section-view-header .phui-icon-view { + margin-right: 8px; +} + +.phui-policy-section-view-link { + float: right; +} + +.phui-policy-section-view-link .phui-icon-view { + color: {$bluetext}; +} + +.phui-policy-section-view-hint { + color: {$greytext}; + background: {$lightbluebackground}; + padding: 8px; +} + +.phui-policy-section-view-body { + padding: 0 12px; +} + +.phui-policy-section-view-inactive-rule { + color: {$greytext}; +} + +.phui-policy-section-view-rules { + margin: 8px 0; + padding: 8px; + background: {$lightbluebackground}; + border: 1px solid {$lightblueborder}; +} + +.phui-policy-section-view .phui-policy-section-view-body ul { + margin: 8px 0; + padding: 0 16px 0 24px; + list-style: disc; +} + +.phui-policy-section-view .phui-policy-section-view-body p + p { + margin-top: 8px; +} diff --git a/webroot/rsrc/css/phui/phui-property-list-view.css b/webroot/rsrc/css/phui/phui-property-list-view.css new file mode 100644 index 0000000000..4d2cbc9b50 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-property-list-view.css @@ -0,0 +1,380 @@ +/** + * @provides phui-property-list-view-css + */ + +.phui-property-list-view .keyboard-shortcuts-available { + float: right; + height: 16px; + margin: 12px 10px -28px 0px; + padding: 0px 20px 0px 0px; + vertical-align: middle; + color: {$greytext}; + text-align: right; + font-size: {$smallestfontsize}; + background: + url('http://github.com/rsrc/image/icon/fatcow/key_question.png') right center no-repeat; +} + +.device .keyboard-shortcuts-available { + display: none; +} + +.phui-property-group-noninitial, +.phui-property-list-section-noninitial { + border-color: {$thinblueborder}; + border-style: solid; + border-width: 1px 0 0; +} + +.device-desktop .phui-property-list-container { + padding: 12px 0 12px 0; + width: 100%; +} + +.device .phui-property-list-container { + padding: 12px 0 4px 0; +} + +.phui-property-list-key { + color: {$bluetext}; + font-weight: bold; + overflow: hidden; + white-space: nowrap; +} + +.device-desktop .phui-property-list-key { + width: 12%; + margin-left: 1%; + text-align: right; + float: left; + clear: left; + margin-bottom: 4px; +} + +.device-desktop .phui-property-list-has-actions .phui-property-list-key { + width: 18%; +} + +.phui-property-list-properties-wrap.phui-property-list-stacked { + width: auto; + float: none; +} + +.device .phui-property-list-key, +div.phui-property-list-stacked .phui-property-list-properties + .phui-property-list-key { + padding-left: 4px; + text-align: left; + margin-left: 0; + width: auto; + float: none; +} + +.phui-property-list-value { + color: {$darkgreytext}; +} + +.device-desktop .phui-property-list-value { + width: 84%; + margin-left: 1%; + float: left; + margin-bottom: 4px; + word-wrap: break-word; +} + +.device-desktop .phui-property-list-has-actions .phui-property-list-value { + width: 78%; +} + +.device .phui-property-list-value, +.phui-property-list-stacked .phui-property-list-properties + .phui-property-list-value { + padding: 0 8px; + margin-bottom: 8px; + width: auto; + word-break: break-word; + float: none; +} + +.phui-property-list-section-header { + color: {$bluetext}; + padding: 16px 4px 0px; + text-transform: uppercase; + font-weight: 700; + border-color: {$thinblueborder}; + border-style: solid; + border-width: 1px 0 0; +} + +.phui-property-list-container + .phui-property-list-text-content { + border-color: {$thinblueborder}; + border-style: solid; + border-width: 1px 0 0; +} + +.phui-property-list-section-noninitial .phui-property-list-section-header { + border-top: none; +} + +.device .phui-property-list-section-header { + padding-left: 4px; +} + +.phui-property-list-section-header-icon .phui-icon-view { + display: inline-block; + margin: -2px 4px -2px 0; +} + +.phui-property-list-text-content { + padding: 16px 4px; + overflow: hidden; +} + +.phui-property-list-raw-content { + padding: 0px; + overflow: hidden; +} + +/* In the common case where we immediately follow a header, move back up 30px + so we snuggle next to the header. */ +.device-desktop .phui-header-view + + .phabricator-action-list-view { + margin-top: -30px; +} + +.device-desktop .phui-header-view + + .phabricator-action-list-view + + .phui-property-list-view { + margin-top: 0px; +} + + +/* When tags appear in property lists, give them a little more vertical + spacing. */ +.phui-property-list-value .phui-tag-view { + margin: 2px 0; + white-space: pre-wrap; +} + +.phui-property-list-has-actions .phui-property-list-properties-wrap { + float: left; + width: 78%; +} + +.device .phui-property-list-properties-wrap { + width: auto; + border: none; + float: none; + overflow: auto; +} + +.phui-property-list-actions { + width: 20%; + float: right; + margin-right: 12px; + border-left: 1px solid {$thinblueborder}; +} + +!print .phui-property-list-actions { + display: none; +} + +.device .phui-property-list-actions { + float: none; + width: auto; + margin: -12px 0 12px 0; + border: none; +} + +.phui-property-list-image-content img { + margin: 20px auto; + background: url('http://github.com/rsrc/image/checker_light.png'); +} + +.device-desktop .phui-property-list-image-content img:hover { + background: url('http://github.com/rsrc/image/checker_dark.png'); +} + +/* - Dashboards ------------------------------------------------------------ */ + +.dashboard-panel .phui-property-list-section { + border-left: 1px solid {$lightblueborder}; + border-right: 1px solid {$lightblueborder}; + border-bottom: 1px solid {$blueborder}; +} + + +.document-engine-image img { + margin: 20px auto; + background: url('http://github.com/rsrc/image/checker_light.png'); + max-width: 100%; +} + +.device-desktop .document-engine-image img:hover { + background: url('http://github.com/rsrc/image/checker_dark.png'); +} + +.document-engine-video video { + margin: 20px auto; + display: block; + max-width: 95%; +} + +.document-engine-audio audio { + display: block; + margin: 16px auto; + width: 50%; + min-width: 240px; +} + +.document-engine-message { + margin: 20px auto; + text-align: center; + color: {$greytext}; +} + +.document-engine-error { + margin: 20px; + padding: 12px; + text-align: center; + color: {$redtext}; + background: {$sh-redbackground}; +} + +.document-engine-hexdump { + margin: 20px; + white-space: pre; +} + +.document-engine-remarkup { + margin: 20px; +} + +.document-engine-pdf { + margin: 20px; + text-align: center; +} + +.document-engine-pdf .phabricator-remarkup-embed-layout-link { + text-align: left; +} + +.document-engine-text .phabricator-source-code-container { + border: none; +} + +.document-engine-jupyter { + overflow: hidden; + margin: 20px; +} + +.document-engine-jupyter.document-engine-diff { + margin: 0; +} + +.document-engine-in-flight { + opacity: 0.25; +} + +.document-engine-loading { + margin: 20px; + text-align: center; + color: {$lightgreytext}; +} + +.document-engine-loading .phui-icon-view { + display: block; + font-size: 48px; + color: {$lightgreyborder}; + padding: 8px; +} + +.jupyter-cell-raw { + white-space: pre-wrap; + background: {$lightgreybackground}; + color: {$greytext}; + padding: 8px; +} + +.jupyter-cell-code { + white-space: pre-wrap; + word-break: break-word; + background: {$lightgreybackground}; + border-radius: 2px; + border-color: {$lightgreyborder}; + border-style: solid; +} + +.jupyter-cell-code-block { + padding: 8px; + border-width: 1px; +} + +.jupyter-cell-code-line { + padding: 2px 8px; + border-width: 0 1px; +} + +td.new .jupyter-cell-code-line { + background: rgba(255, 255, 255, 0.5); + border-color: {$new-bright}; +} + +td.old .jupyter-cell-code-line { + background: rgba(255, 255, 255, 0.5); + border-color: {$old-bright}; +} + +.jupyter-cell-code-head { + border-top-width: 1px; + margin-top: 4px; + padding-top: 8px; +} + +.jupyter-cell-code-last { + border-bottom-width: 1px; + margin-bottom: 4px; + padding-bottom: 8px; +} + +.jupyter-notebook > tbody > tr > td { + padding: 8px; +} + +.jupyter-notebook > tbody > tr > td.jupyter-cell-flush { + padding-top: 0; + padding-bottom: 0; +} + +.jupyter-notebook, +.jupyter-notebook > tbody > tr > td { + width: 100%; +} + +.jupyter-notebook > tbody > tr > td.jupyter-label { + white-space: nowrap; + text-align: right; + min-width: 56px; + font-weight: bold; + width: auto; + padding: 8px 8px 0; +} + +.jupyter-output { + margin: 4px 0; + padding: 8px; + white-space: pre-wrap; + line-break: anywhere; +} + +.jupyter-output-stderr { + background: {$sh-redbackground}; +} + +.jupyter-output-html { + background: {$sh-indigobackground}; +} + +.jupyter-cell-markdown { + white-space: pre-wrap; +} diff --git a/webroot/rsrc/css/phui/phui-remarkup-preview.css b/webroot/rsrc/css/phui/phui-remarkup-preview.css index 89cdcb6582..19464a98f7 100644 --- a/webroot/rsrc/css/phui/phui-remarkup-preview.css +++ b/webroot/rsrc/css/phui/phui-remarkup-preview.css @@ -2,34 +2,38 @@ * @provides phui-remarkup-preview-css */ -.phui-preview-header { - color: #666666; - margin-bottom: 12px; - font-size: 11px; +.phui-remarkup-preview .phui-object-box { + padding: 0; } -.phui-remarkup-preview { - background: #fbfbfb; - border-bottom: 1px solid #aaaaaa; - padding: 12px; +.phui-preview-header { + font-size: {$smallerfontsize}; + font-weight: bold; + color: {$bluetext}; + text-transform: uppercase; + padding: 8px; + background-color: {$lightgreybackground}; + border-bottom: 1px solid {$thinblueborder}; + display: block; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } -.phui-remarkup-preview-skin-document { - background: transparent; - border: none; +.phui-preview-body { + padding: 16px; } -.phui-remarkup-preview-skin-document .phui-preview-header { - padding: 8px; - background: #f3f3f3; +.phui-document-inner .phui-preview-header { + padding: 16px 0 0 16px; } -.device-phone .aphront-panel-preview { +.device-phone .phui-panel-preview, +.device-phone .phui-remarkup-preview { display: none; } .phui-preview-loading-text { - color: #666666; + color: {$lightgreytext}; } /** @@ -38,7 +42,7 @@ *
    or not. It should probably move to the Engine in all cases, but * until we do that get rid of the extra spacing generated by the inner div. */ -.phui-remarkup-preview .phabricator-remarkup .phabricator-remarkup { +body .phui-remarkup-preview .phabricator-remarkup .phabricator-remarkup { padding: 0; margin: 0; } diff --git a/webroot/rsrc/css/phui/phui-segment-bar-view.css b/webroot/rsrc/css/phui/phui-segment-bar-view.css new file mode 100644 index 0000000000..b3ce7677e3 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-segment-bar-view.css @@ -0,0 +1,76 @@ +/** + * @provides phui-segment-bar-view-css + */ + +.phui-segment-bar-label { + font-size: {$smallerfontsize}; + margin-bottom: 4px; +} + +.phui-basic-nav .phui-segment-bar-label { + width: 180px; + overflow: hidden; + text-overflow: ellipsis; +} + +.phui-segment-bar-segments { + background: rgba({$alphablue}, .1); + border-radius: 4px; + position: relative; + overflow: hidden; + height: 8px; +} + +.phui-segment-bar-segment-view { + position: absolute; + top: 0; + bottom: 0; + margin-left: -5px; + border-right: 5px solid; + border-radius: 0 4px 4px 0; +} + +.phui-segment-bar-segment-view.red { + background: {$red}; + border-color: {$red}; +} + +.phui-segment-bar-segment-view.orange { + background: {$orange}; + border-color: {$orange}; +} + +.phui-segment-bar-segment-view.yellow { + background: {$yellow}; + border-color: {$yellow} +} + +.phui-segment-bar-segment-view.green { + background: {$green}; + border-color: {$green}; +} + +.phui-segment-bar-segment-view.blue { + background: {$blue}; + border-color: {$blue}; +} + +.phui-segment-bar-segment-view.indigo { + background: {$indigo}; + border-color: {$indigo}; +} + +.phui-segment-bar-segment-view.violet { + background: {$violet}; + border-color: {$violet}; +} + +.phui-segment-bar-segment-view.pink { + background: {$pink}; + border-color: {$pink}; +} + +.phui-segment-bar-segment-view.sky { + background: {$sky}; + border-color: {$sky}; +} diff --git a/webroot/rsrc/css/phui/phui-status.css b/webroot/rsrc/css/phui/phui-status.css index 76e99ddc50..7775614739 100644 --- a/webroot/rsrc/css/phui/phui-status.css +++ b/webroot/rsrc/css/phui/phui-status.css @@ -7,25 +7,38 @@ } .phui-status-list-view .phui-icon-view { - display: block; width: 14px; height: 14px; - margin: 3px 4px; + margin: 2px 4px 2px 0; } .phui-status-item-target { - padding: 0 12px 0 4px; - line-height: 20px; + padding: 1px 8px; white-space: nowrap; } .phui-status-item-note { width: 100%; - color: #666666; + color: {$greytext}; line-height: 14px; - padding: 3px 0; + padding: 3px 4px; } -.phui-status-item-highlighted { - background-color: {$lightyellow}; +.phui-status-item-highlighted td { + background-color: {$sh-yellowbackground}; + border-radius: 3px; +} + +.phui-status-item-exiled td { + background-color: {$lightredbackground}; + border-radius: 3px; +} + +.phui-status-list-view td a { + color: {$darkbluetext}; +} + +.phui-status-item-highlighted td.phui-status-item-note, +.phui-status-item-exiled td.phui-status-item-note { + background-color: transparent; } diff --git a/webroot/rsrc/css/phui/phui-tag-view.css b/webroot/rsrc/css/phui/phui-tag-view.css new file mode 100644 index 0000000000..cf4a4fd5a4 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-tag-view.css @@ -0,0 +1,545 @@ +/** + * @provides phui-tag-view-css + */ + +.phui-tag-view { + font-weight: bold; + text-decoration: none; + position: relative; + -webkit-font-smoothing: antialiased; + white-space: nowrap; +} + +a.phui-tag-view:hover { + text-decoration: none; +} + +.phui-tag-core-closed { + text-decoration: line-through; + color: rgba({$alphablack},0.5); +} + +.phui-tag-core-closed:hover { + text-decoration: none; +} + +.phui-tag-core { + color: inherit; + border: 1px solid transparent; + border-radius: 3px; + padding: 0 4px; +} + +.phui-tag-type-state .phui-tag-core { + padding: 1px 6px; +} + +.phui-tag-view.phui-tag-type-state .phui-icon-view { + margin: 0 6px 0 0; +} + +.phui-tag-view .phui-icon-view { + display: inline-block; + margin: 0 4px 0 2px; +} + +.phui-tag-dot { + position: relative; + display: inline-block; + width: 5px; + height: 5px; + margin-right: 4px; + top: -1px; + border-radius: 5px; + border: 1px solid transparent; +} + +.tokenizer-result .phui-tag-dot { + margin-right: 6px; +} + +.jx-tokenizer-token .phui-tag-dot { + margin-left: 2px; +} + +.phui-tag-type-state { + color: #ffffff; + text-shadow: rgba(100, 100, 100, 0.40) 0px -1px 1px; +} + +.phui-tag-type-object, +a.phui-tag-type-object, +a.phui-tag-type-object:link, +.phui-tag-core-closed .phui-tag-color-object { + color: {$blacktext}; +} + +.phui-tag-type-person { + white-space: nowrap; + color: {$anchor}; +} + +.phui-tag-color-red { + background-color: {$red}; + border-color: {$red}; +} + +.phui-tag-color-orange { + background-color: {$orange}; + border-color: {$orange}; +} + +.phui-tag-color-yellow { + background-color: {$yellow}; + border-color: {$yellow}; +} + +.phui-tag-color-blue { + background-color: {$blue}; + border-color: {$blue}; +} + +.phui-tag-color-indigo { + background-color: {$indigo}; + border-color: {$indigo}; +} + +.phui-tag-color-green { + background-color: {$green}; + border-color: {$green}; +} + +.phui-tag-color-violet { + background-color: {$violet}; + border-color: {$violet}; +} + +.phui-tag-color-black { + background-color: {$darkgreybackground}; + border-color: {$darkgreybackground}; +} + +.phui-tag-color-grey { + background-color: {$lightgreytext}; + border-color: {$lightgreytext}; +} + +.phui-tag-color-white { + background-color: {$lightgreybackground}; + border-color: {$lightgreybackground}; +} + +.phui-tag-color-object { + background-color: {$greybackground}; + border-color: {$lightgreyborder}; +} + +.phui-tag-color-person { + background-color: {$bluebackground}; + border-color: {$thinblueborder}; +} + +a.phui-tag-view:hover + .phui-tag-core.phui-tag-color-person { + border-color: {$lightblueborder}; +} + +a.phui-tag-view:hover + .phui-tag-core.phui-tag-color-object { + border-color: {$greyborder}; +} + +.phabricator-handle-tag-list-item + .phabricator-handle-tag-list-item { + margin-top: 4px; +} + +.phui-oi .phabricator-handle-tag-list { + display: inline; +} + +.phui-oi .phabricator-handle-tag-list-item { + display: inline-block; + margin: 0 4px 2px 0; +} + +.phui-tag-view.phui-tag-border-none .phui-tag-core { + border-color: transparent; +} + +a.phui-tag-view:hover.phui-tag-border-none .phui-tag-core { + border-color: transparent !important; + text-decoration: underline; +} + + +/* - Shaded Tags --------------------------------------------------------------- + + For object representation inside text areas and lists. + +*/ + +.phui-tag-view.phui-tag-type-shade { + font-weight: normal; +} + +.phui-tag-view.phui-tag-type-shade .phui-icon-view { + font-size: 12px; +} + + +/* - Slim Tags ----------------------------------------------------------------- + + A thinner tag for object list, workboards. + +*/ + +.phui-tag-slim .phui-icon-view { + font-size: 11px; +} + +.phui-tag-slim .phui-tag-core { + font-size: {$smallerfontsize}; +} + + +/* - Red -------------------------------------------------------------------- */ + +.phui-tag-red .phui-tag-core, +.jx-tokenizer-token.red { + background: {$sh-redbackground}; + border-color: {$sh-lightredborder}; + color: {$sh-redtext}; +} + +.phui-tag-red .phui-icon-view, +.jx-tokenizer-token.red .phui-icon-view, +.jx-tokenizer-token.red .jx-tokenizer-x { + color: {$sh-redicon}; +} + +a.phui-tag-view:hover.phui-tag-red .phui-tag-core, +.jx-tokenizer-token.red:hover { + border-color: {$sh-redborder}; +} + +/* - Orange ----------------------------------------------------------------- */ + +.phui-tag-orange .phui-tag-core, +.jx-tokenizer-token.orange { + background: {$sh-orangebackground}; + border-color: {$sh-lightorangeborder}; + color: {$sh-orangetext}; +} + +.phui-tag-orange .phui-icon-view, +.jx-tokenizer-token.orange .phui-icon-view, +.jx-tokenizer-token.orange .jx-tokenizer-x { + color: {$sh-orangeicon}; +} + +a.phui-tag-view:hover.phui-tag-orange .phui-tag-core, +.jx-tokenizer-token.orange:hover { + border-color: {$sh-orangeborder}; +} + +/* - Yellow ----------------------------------------------------------------- */ + +.phui-tag-yellow .phui-tag-core, +.jx-tokenizer-token.yellow { + background: {$sh-yellowbackground}; + border-color: {$sh-lightyellowborder}; + color: {$sh-yellowtext}; +} + +.phui-tag-yellow .phui-icon-view, +.jx-tokenizer-token.yellow .phui-icon-view, +.jx-tokenizer-token.yellow .jx-tokenizer-x { + color: {$sh-yellowicon}; +} + +a.phui-tag-view:hover.phui-tag-yellow .phui-tag-core, +.jx-tokenizer-token.yellow:hover { + border-color: {$sh-yellowborder}; +} + +/* - Blue ------------------------------------------------------------------- */ + +.phui-tag-blue .phui-tag-core, +.jx-tokenizer-token.blue { + background: {$sh-bluebackground}; + border-color: {$sh-lightblueborder}; + color: {$sh-bluetext}; +} + +.phui-tag-blue .phui-icon-view, +.jx-tokenizer-token.blue .phui-icon-view, +.jx-tokenizer-token.blue .jx-tokenizer-x { + color: {$sh-blueicon}; +} + +a.phui-tag-view:hover.phui-tag-blue .phui-tag-core, +.jx-tokenizer-token.blue:hover { + border-color: {$sh-blueborder}; +} + +/* - Sky ------------------------------------------------------------------- */ + +.phui-tag-sky .phui-tag-core, +.jx-tokenizer-token.sky { + background: #E0F0FA; + border-color: {$sh-lightblueborder}; + color: {$sh-bluetext}; +} + +.phui-tag-sky .phui-icon-view, +.jx-tokenizer-token.sky .phui-icon-view, +.jx-tokenizer-token.sky .jx-tokenizer-x { + color: {$sh-blueicon}; +} + +a.phui-tag-view:hover.phui-tag-sky .phui-tag-core, +.jx-tokenizer-token.sky:hover { + border-color: {$sh-blueborder}; +} + +/* - Indigo ----------------------------------------------------------------- */ + +.phui-tag-indigo .phui-tag-core, +.jx-tokenizer-token.indigo { + background: {$sh-indigobackground}; + border-color: {$sh-lightindigoborder}; + color: {$sh-indigotext}; +} + +.phui-tag-indigo .phui-icon-view, +.jx-tokenizer-token.indigo .phui-icon-view, +.jx-tokenizer-token.indigo .jx-tokenizer-x { + color: {$sh-indigoicon}; +} + +a.phui-tag-view:hover.phui-tag-indigo .phui-tag-core, +.jx-tokenizer-token.indigo:hover { + border-color: {$sh-indigoborder}; +} + +/* - Green ------------------------------------------------------------------ */ + +.phui-tag-green .phui-tag-core, +.jx-tokenizer-token.green { + background: {$sh-greenbackground}; + border-color: {$sh-lightgreenborder}; + color: {$sh-greentext}; +} + +.phui-tag-green .phui-icon-view, +.jx-tokenizer-token.green .phui-icon-view, +.jx-tokenizer-token.green .jx-tokenizer-x { + color: {$sh-greenicon}; +} + +a.phui-tag-view:hover.phui-tag-green .phui-tag-core, +.jx-tokenizer-token.green:hover { + border-color: {$sh-greenborder}; +} + +/* - Violet ----------------------------------------------------------------- */ + +.phui-tag-violet .phui-tag-core, +.jx-tokenizer-token.violet { + background: {$sh-violetbackground}; + border-color: {$sh-lightvioletborder}; + color: {$sh-violettext}; +} + +.phui-tag-violet .phui-icon-view, +.jx-tokenizer-token.violet .phui-icon-view, +.jx-tokenizer-token.violet .jx-tokenizer-x { + color: {$sh-violeticon}; +} + +a.phui-tag-view:hover.phui-tag-violet .phui-tag-core, +.jx-tokenizer-token.violet:hover { + border-color: {$sh-violetborder}; +} + +/* - Pink ------------------------------------------------------------------- */ + +.phui-tag-pink .phui-tag-core, +.jx-tokenizer-token.pink { + background: {$sh-pinkbackground}; + border-color: {$sh-lightpinkborder}; + color: {$sh-pinktext}; +} + +.phui-tag-pink .phui-icon-view, +.jx-tokenizer-token.pink .phui-icon-view, +.jx-tokenizer-token.pink .jx-tokenizer-x { + color: {$sh-pinkicon}; +} + +a.phui-tag-view:hover.phui-tag-pink .phui-tag-core, +.jx-tokenizer-token.pink:hover { + border-color: {$sh-pinkborder}; +} + +/* - Grey ------------------------------------------------------------------- */ + +.phui-tag-grey .phui-tag-core, +.jx-tokenizer-token.grey { + background: {$sh-greybackground}; + border-color: {$sh-lightgreyborder}; + color: {$sh-greytext}; +} + +.phui-tag-grey .phui-icon-view, +.jx-tokenizer-token.grey .phui-icon-view, +.jx-tokenizer-token.grey .jx-tokenizer-x { + color: {$sh-greyicon}; +} + +a.phui-tag-view:hover.phui-tag-grey .phui-tag-core, +.jx-tokenizer-token.grey:hover { + border-color: {$sh-greyborder}; +} + +/* - Checkered -------------------------------------------------------------- */ + +.phui-tag-checkered .phui-tag-core, +.jx-tokenizer-token.checkered { + background: url(http://github.com/rsrc/image/checker_lighter.png); + border-style: dashed; + border-color: {$sh-greyborder}; + color: {$sh-greytext}; + text-shadow: 1px 1px #fff; +} + +.phui-tag-checkered .phui-icon-view, +.jx-tokenizer-token.checkered .phui-icon-view, +.jx-tokenizer-token.checkered .jx-tokenizer-x { + color: {$sh-greyicon}; +} + +a.phui-tag-view:hover.phui-tag-checkered .phui-tag-core, +.jx-tokenizer-token.checkered:hover { + border-style: solid; + border-color: {$sh-greyborder}; +} + +/* - Disabled --------------------------------------------------------------- */ + +.phui-tag-disabled .phui-tag-core { + background-color: {$sh-disabledbackground}; + border-color: {$sh-lightdisabledborder}; + color: {$sh-disabledtext}; +} + +.phui-tag-disabled .phui-icon-view { + color: {$sh-disabledicon}; +} + +a.phui-tag-view:hover.phui-tag-disabled .phui-tag-core { + border-color: {$sh-disabledborder}; +} + +.phui-tag-placeholder .phui-tag-core { + border-color: transparent; + background-color: {$sh-disabledbackground}; + opacity: 0.5; +} + +/* - Outline Tags -------------------------------------------------------------- + + Basic Tag with a bold border and white background + +*/ + +.phui-tag-type-outline { + text-transform: uppercase; + font-weight: normal; +} + +.phui-tag-view.phui-tag-type-outline .phui-tag-core { + background: #fff; + padding: 0 6px 1px 6px; +} + +.phui-tag-slim.phui-tag-type-outline .phui-tag-core { + font-size: {$smallestfontsize}; +} + +.phui-tag-type-outline.phui-tag-red .phui-tag-core { + color: {$red}; + border-color: {$red}; +} + +.phui-tag-type-outline.phui-tag-orange .phui-tag-core { + color: {$orange}; + border-color: {$orange}; +} + +.phui-tag-type-outline.phui-tag-yellow .phui-tag-core { + color: {$yellow}; + border-color: {$yellow}; +} + +.phui-tag-type-outline.phui-tag-green .phui-tag-core { + color: {$green}; + border-color: {$green}; +} + +.phui-tag-type-outline.phui-tag-blue .phui-tag-core { + color: {$blue}; + border-color: {$blue}; +} + +.phui-tag-type-outline.phui-tag-indigo .phui-tag-core { + color: {$indigo}; + border-color: {$indigo}; +} + +.phui-tag-type-outline.phui-tag-violet .phui-tag-core { + color: {$violet}; + border-color: {$violet}; +} + +.phui-tag-type-outline.phui-tag-grey .phui-tag-core { + color: {$bluetext}; + border-color: {$bluetext}; +} + +.phui-tag-type-outline.phui-tag-disabled .phui-tag-core { + color: {$lightgreytext}; + border-color: {$lightgreytext}; +} + +.phui-tag-type-outline.phui-tag-pink .phui-tag-core { + color: {$pink}; + border-color: {$pink}; +} + +.phui-tag-type-outline.phui-tag-sky .phui-tag-core { + color: {$sky}; + border-color: {$sky}; +} + +.phui-tag-type-outline.phui-tag-fire .phui-tag-core { + color: {$fire}; + border-color: {$fire}; +} + +.phui-tag-type-outline.phui-tag-black .phui-tag-core { + color: {$blacktext}; + border-color: {$blacktext}; +} + +.phui-tag-exiled .phui-tag-core { + border-color: {$lightredborder}; + color: {$red}; + background: {$lightredbackground}; +} + + +a.phui-tag-view.phui-tag-exiled:hover + .phui-tag-core.phui-tag-color-person { + border-color: {$red}; +} diff --git a/webroot/rsrc/css/phui/phui-text.css b/webroot/rsrc/css/phui/phui-text.css deleted file mode 100644 index 79b87d8e2a..0000000000 --- a/webroot/rsrc/css/phui/phui-text.css +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @provides phui-text-css - */ - - -/* Styles */ -.phui-text-bold { - font-weight: bold; -} - -.phui-text-uppercase { - text-transform: uppercase; -} - -.phui-text-strike { - text-decoration: line-through; -} - - -/* Colors */ -.phui-text-red { - color: {$red}; -} - -.phui-text-orange { - color: {$orange}; -} - -.phui-text-yellow { - color: {$yellow}; -} - -.phui-text-green { - color: {$green} -} - -.phui-text-blue { - color: {$blue}; -} - -.phui-text-indigo { - color: {$indigo}; -} - -.phui-text-violet { - color: {$violet}; -} - -.phui-text-white { - color: #fff; -} - -.phui-text-black { - color: #333; -} diff --git a/webroot/rsrc/css/phui/phui-timeline-view.css b/webroot/rsrc/css/phui/phui-timeline-view.css new file mode 100644 index 0000000000..e08373d589 --- /dev/null +++ b/webroot/rsrc/css/phui/phui-timeline-view.css @@ -0,0 +1,440 @@ +/** + * @provides phui-timeline-view-css + */ + +.phui-timeline-view { + padding: 0 16px; + background-image: url('http://github.com/rsrc/image/d5d8e1.png'); + background-repeat: repeat-y; + background-position: 96px; +} + +.device .phui-timeline-view { + padding: 0 8px; +} + +.device-tablet .phui-timeline-view { + background-position: 24px; +} + +.device-phone .phui-timeline-view { + padding: 0; + background-position: 24px; +} + +.phui-timeline-major-event .phui-timeline-group { + border-left: 1px solid {$timeline}; + border-right: 1px solid {$timeline}; + border-radius: 3px; +} + +.device-desktop .phui-timeline-event-view { + margin-left: 62px; + position: relative; +} + +.device-desktop .phui-timeline-event-view.phui-timeline-minor-event { + margin-left: 67px; +} + +.device-desktop .phui-timeline-spacer { + min-height: 16px; +} + +.device-desktop .phui-timeline-event-view.the-worlds-end { + background: {$lightblueborder}; + width: 9px; + height: 9px; + border-radius: 2px; + margin-left: 76px; + margin-bottom: 20px; +} + +.device-desktop .phui-timeline-wedge { + border-bottom: 1px solid {$timeline}; + position: absolute; + width: 12px; +} + +.device-phone .phui-timeline-minor-event, +.device-tablet .phui-timeline-minor-event { + padding-left: 3px; +} + +.phui-timeline-major-event .phui-timeline-content { + border-top: 1px solid {$timeline}; + border-bottom: 1px solid {$timeline}; + border-radius: 3px; +} + +.phui-timeline-title { + line-height: 24px; + min-height: 19px; + position: relative; + color: {$greytext}; +} + +.phui-timeline-minor-event .phui-timeline-title { + padding: 1px 8px 4px 33px; +} + +.phui-timeline-title a { + font-weight: bold; + color: {$darkgreytext}; +} + +.device-desktop .phui-timeline-wedge { + left: -12px; +} + +.device-desktop .phui-timeline-major-event .phui-timeline-wedge { + top: 26px; +} + +.device-desktop .phui-timeline-minor-event .phui-timeline-wedge { + top: 12px; + left: -18px; + width: 20px; +} + +.phui-timeline-image { + background-repeat: no-repeat; + position: absolute; + border-radius: 3px; + background-size: 100%; + display: block; +} + +.device-desktop .phui-timeline-major-event .phui-timeline-image { + width: 50px; + height: 50px; + top: 0px; + left: -62px; +} + +.device-desktop .phui-timeline-minor-event .phui-timeline-image { + width: 26px; + height: 26px; + background-size: 26px auto; + left: -41px; +} + +.phui-timeline-major-event .phui-timeline-title { + background: {$lightgreybackground}; + min-height: 22px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} + +.phui-timeline-major-event .phui-timeline-title + .phui-timeline-title { + border-radius: 0; + padding-top: 0; +} + +.phui-timeline-major-event .phui-timeline-title + .phui-timeline-title + .phui-timeline-icon-fill { + margin-top: 0; + } + +.phui-timeline-title { + padding: 5px 8px; + overflow-x: auto; + overflow-y: hidden; +} + +.phui-timeline-title-with-icon { + padding-left: 36px; +} + +.phui-timeline-title-with-menu { + padding-right: 36px; +} + +.phui-timeline-view .phui-icon-view.phui-timeline-token { + vertical-align: middle; + margin-right: 4px; +} + +.phui-timeline-token.strikethrough { + position: relative; +} + +.phui-timeline-token.strikethrough:before { + position: absolute; + content: ""; + left: 0; + top: 50%; + right: 0; + border-top: 3px solid; + border-color: {$darkbluetext}; + + -webkit-transform:rotate(-40deg); + -moz-transform:rotate(-40deg); + -ms-transform:rotate(-40deg); + -o-transform:rotate(-40deg); + transform:rotate(-40deg); +} + +.phui-timeline-major-event .phui-timeline-content + .phui-timeline-core-content { + padding: 16px; + line-height: 18px; + background: {$page.content}; + border-top: 1px solid rgba({$alphablue},.1); + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +.phui-timeline-core-content { + overflow-x: auto; +} + +.phui-timeline-core-content .comment-deleted { + font-style: italic; +} + +.device .phui-timeline-event-view { + min-height: 23px; + position: relative; +} + +.device-phone .phui-timeline-event-view { + margin: 0 8px; +} + +.device .phui-timeline-image { + display: none; +} + +.device .phui-timeline-spacer { + min-height: 8px; + border-width: 0; +} + +.phui-timeline-icon-fill { + position: absolute; + width: 34px; + height: 34px; + top: 0; + left: 0; + text-align: center; +} + +.phui-timeline-icon { + color: {$bluetext}; +} + +.phui-icon-view.phui-timeline-icon { + font-size: 14px; +} + +.phui-timeline-icon-fill { + height: 26px; + width: 26px; + border-radius: 3px; + background-color: {$timeline.icon.background}; +} + +.phui-timeline-major-event .phui-timeline-icon-fill { + margin: 4px; +} + +.phui-timeline-icon-fill .phui-timeline-icon { + margin-top: 6px; +} + +.phui-timeline-extra, +.phui-timeline-extra .phabricator-content-source-view { + font-size: {$smallerfontsize}; + font-weight: normal; + color: {$lightgreytext}; + margin-left: 8px; +} + +.phui-timeline-title .phui-timeline-extra a { + font-weight: normal; + color: {$lightgreytext}; +} + +.phui-timeline-title .phui-timeline-value, +.conpherence-transaction-content .phui-timeline-value, +.phui-feed-story-head .phui-timeline-value { + font-style: italic; + color: {$blacktext}; +} + +.device-desktop .phui-timeline-extra { + float: right; +} + +.device .phui-timeline-extra { + display: inline-block; + line-height: 16px; + margin-left: 8px; + white-space: nowrap; +} + +.device-phone .phui-timeline-extra { + display: block; + margin: 0; +} + +.phui-timeline-icon-fill.fill-has-color .phui-icon-view { + color: {$page.content}; +} + +.phui-timeline-icon-fill-red { + background-color: {$red}; +} + +.phui-timeline-icon-fill-orange { + background-color: {$orange}; +} + +.phui-timeline-icon-fill-yellow { + background-color: {$yellow}; +} + +.phui-timeline-icon-fill-green { + background-color: {$green}; +} + +.phui-timeline-icon-fill-sky { + background-color: {$sky}; +} + +.phui-timeline-icon-fill-blue { + background-color: {$blue}; +} + +.phui-timeline-icon-fill-indigo { + background-color: {$indigo}; +} + +.phui-timeline-icon-fill-violet { + background-color: {$violet}; +} + +.phui-timeline-icon-fill-pink { + background-color: {$pink}; +} + +.phui-timeline-icon-fill-grey { + background-color: #888; +} + +.phui-timeline-icon-fill-black { + background-color: #000; +} + +.phui-timeline-shell.anchor-target { + background: {$lightyellow}; + border-width: 0 1px 0 0; + border-style: solid; + border-color: {$yellow}; + padding: 4px; + margin: -4px; +} + +.phui-timeline-preview-header { + background: #e0e3ec; + color: {$darkgreytext}; + padding: 4px 1.25%; + border: solid {$blueborder} 1px 0; +} + +.phui-timeline-change-details { + padding: 10px 0; + border-style: solid; + border-color: #efefef; + border-width: 1px 0; +} + +.phui-timeline-older-transactions-are-hidden { + background: {$gentle.highlight}; + border: 1px solid {$gentle.highlight.border}; + text-align: center; + padding: 12px; + color: {$darkgreytext}; + cursor: pointer; + border-radius: 3px; +} + +.device-phone .phui-timeline-older-transactions-are-hidden { + margin: 0 8px; +} + +.phui-timeline-title .phui-timeline-extra-information a { + font-weight: normal; + color: {$greytext}; +} + +.phui-timeline-comment-actions .phui-icon-view { + width: 16px; + height: 16px; + font-size: 16px; + text-align: center; + overflow: hidden; +} + +.phui-timeline-menu { + position: absolute; + right: 3px; + top: 6px; + width: 28px; + height: 24px; + text-align: center; + line-height: 22px; + font-size: 16px; + border-left: 1px solid {$thinblueborder}; +} + +.phui-timeline-menu:focus { + outline: none; +} + +a.phui-timeline-menu .phui-icon-view { + color: {$bluetext}; +} + +.device-desktop a.phui-timeline-menu:hover .phui-icon-view { + color: {$sky}; +} + +.phui-timeline-menu.phuix-dropdown-open { + background: rgba({$alphablue},0.1); + border: none; + border-radius: 3px; +} + +.phui-timeline-view + .phui-object-box { + margin-top: 0; +} + +.phui-timeline-badges { + position: absolute; + left: -64px; + top: 52px; + width: 54px; + text-align: center; +} + +.phui-timeline-badges .phui-badge-mini { + height: 18px; + width: 18px; + line-height: 16px; +} + +.phui-timeline-badges .phui-badge-mini .phui-icon-view { + font-size: 10px; +} + +.phui-comment-preview-view { + margin-bottom: 20px; +} + +.phui-timeline-view .phui-pinboard-view { + margin: 8px 0 0 0; + padding: 0; + text-align: left; +} diff --git a/webroot/rsrc/css/phui/phui-two-column-view.css b/webroot/rsrc/css/phui/phui-two-column-view.css new file mode 100644 index 0000000000..c2aa0c5fbd --- /dev/null +++ b/webroot/rsrc/css/phui/phui-two-column-view.css @@ -0,0 +1,342 @@ +/** + * @provides phui-two-column-view-css + */ + +.phui-launcher-view { + max-width: 1140px; + margin: 0 auto; +} + +.phui-two-column-fixed { + max-width: 1140px; + margin: 0 auto; +} + +.phui-two-column-view .phui-two-column-header { + background-color: {$page.content}; + border-bottom: 1px solid rgba({$alphagrey}, .12); + margin-bottom: 24px; +} + +.phui-two-column-view.without-header { + margin-top: 24px; +} + +.device .phui-two-column-view .phui-two-column-header { + margin-bottom: 12px; +} + +.phui-two-column-view.with-tabs .phui-two-column-header, +.phui-two-column-view.with-subheader .phui-two-column-header { + margin-bottom: 0; +} + +.phui-two-column-header .phui-header-header { + font-size: 20px; + color: {$blacktext}; +} + +.device-phone .phui-two-column-header .phui-header-header { + font-size: 16px; +} + +.phui-two-column-view .phui-two-column-header .phui-header-shell { + padding: 24px 32px 28px; + border: none; +} + +.phui-two-column-view .phui-two-column-header + .phui-profile-header.phui-header-shell { + padding-bottom: 20px; +} + +.device .phui-two-column-view .phui-two-column-header .phui-header-shell { + padding: 12px 12px 16px; +} + +.phui-two-column-header .phui-header-subheader { + margin-top: 8px; +} + +.phui-two-column-subheader { + padding: 12px 32px; +} + +.device .phui-two-column-subheader { + padding: 12px 16px; +} + +.device-desktop .phui-two-column-content { + padding: 0 32px; +} + +.device .phui-two-column-content { + padding: 0 12px; +} + +.device-desktop .phui-two-column-view .phui-main-column { + float: left; + width: calc(100% - 320px); +} + +.device-desktop .phui-two-column-view .phui-side-column { + float: right; + width: 300px; +} + +!print .phui-two-column-view .phui-main-column { + float: unset; + width: unset; + margin-bottom: 20px; +} + +!print .phui-two-column-view .phui-side-column { + float: unset; + width: unset; + margin-bottom: 20px; +} + +!print .device-desktop .phui-two-column-view .phui-main-column { + float: unset; + width: unset; + margin-bottom: 20px; +} + +!print .device-desktop .phui-two-column-view .phui-side-column { + float: unset; + width: unset; + margin-bottom: 20px; +} + +.device-desktop .phui-two-column-view.phui-side-column-left .phui-main-column { + float: right; + width: calc(100% - 280px); +} + +.device-desktop .phui-two-column-view.phui-side-column-left .phui-side-column { + float: left; + width: 260px; +} + +.device .phui-side-column { + margin-bottom: 20px; +} + +.phui-two-column-view .phui-two-column-content + .phui-object-box { + margin: 0 0 20px 0; +} + +/* Timeline */ + +.phui-two-column-view .phui-timeline-view { + padding: 0; + background-position: 80px; +} + +.phui-two-column-view .phui-main-column .phui-object-box + .phui-timeline-view { + margin-top: -20px; +} + +.device .phui-two-column-view .phui-timeline-view { + background-position: 16px; + padding: 0; +} + +.device-phone .phui-two-column-view .phui-timeline-event-view { + margin: 0; +} + +.phui-main-column > .phui-timeline-view:first-child { + border-top: 1px solid {$thinblueborder}; +} + +.device-phone .phui-main-column .phui-timeline-older-transactions-are-hidden { + margin: 0; +} + +/* Main Column Properties */ + +.device-desktop .phui-main-column .phui-property-list-key { + margin-left: 0; + width: 180px; +} + +.device-desktop .phui-main-column .phui-property-list-value { + margin-left: 8px; + width: calc(100% - 200px); +} + + +/* Property / Action List */ + +.phui-two-column-properties .phabricator-action-list-view { + padding-top: 4px; + padding-bottom: 12px; +} + +.device-desktop .phui-two-column-view .phui-property-list-container { + padding: 16px 0; +} + +.device-desktop .phui-two-column-view + .phui-property-list-properties-wrap.phui-property-list-stacked { + padding: 0 16px; +} + +.device .phui-two-column-view .phui-property-list-container { + padding: 12px 8px; +} + +.phui-two-column-view .phui-property-list-container + .keyboard-shortcuts-available { + display: none; +} + +.device .phui-two-column-content .phui-two-column-properties.phui-object-box { + padding: 0 12px; +} + +.phui-two-column-view .phui-property-list-section-header, +.phui-two-column-view .phui-property-list-text-content { + margin: 0 16px; +} + +.device .phui-two-column-view .phui-property-list-section-header, +.device .phui-two-column-view .phui-property-list-text-content { + margin: 0 8px; +} + +.phui-two-column-tabs { + padding: 0 32px; + margin-bottom: 32px; + background: {$page.content}; + box-shadow: 0 1px 3px 0 rgba(0,0,0,0.2); +} + +.device-phone .phui-two-column-tabs { + padding: 0 12px; +} + +.device-phone .phui-two-column-tabs .phui-list-view.phui-list-tabbar { + text-align: center; +} + +.device-phone .phui-two-column-tabs .phui-list-view.phui-list-tabbar > li { + float: none; + display: inline-block; +} + +/* Info View */ + +.phui-two-column-view .phui-info-view { + margin: 0 0 20px 0; + padding: 16px; +} + +.device .phui-two-column-view .phui-info-view { + margin: 0 0 20px 0; + padding: 12px; +} + +.phui-two-column-view .phui-oi-empty .phui-info-view { + margin: 0; +} + +.phui-two-column-view .phui-side-column .phui-oi-empty + .phui-info-view { + margin-bottom: 0; +} + + +.phui-two-column-view .phui-box-blue-property + .phui-header-shell + .phui-info-view { + margin: 16px; +} + +.device .phui-two-column-view .phui-box-blue-property + .phui-header-shell + .phui-info-view { + margin: 8px; +} + +/* Navigation */ + +.phui-two-column-view .side-has-nav .phabricator-nav-local { + width: auto; + position: static; + margin: 0; +} + +.device .phui-two-column-view .side-has-nav { + display: none; +} + +/* Document View */ + +.phui-two-column-view .phui-two-column-content .phui-document-fluid + .phui-document-view { + margin: 0 0 20px 0; +} + +/*- Fixed Styles with Navigation -------------------------------------------- */ + +.phui-two-column-fixed.phui-two-column-view .phui-two-column-header { + background: transparent; + border: none; + margin-bottom: 0; +} + +.phui-two-column-fixed.phui-two-column-view .phui-side-column + .phui-box-border { + background: transparent; + border: none; + padding: 0; + width: 180px; +} + +.device-desktop + .phui-two-column-fixed.phui-two-column-view.phui-side-column-left + .phui-side-column { + width: 200px; +} + +.device-desktop + .phui-two-column-fixed.phui-two-column-view.phui-side-column-left + .phui-main-column { + width: calc(100% - 200px) +} + +.phui-two-column-fixed.phui-two-column-view .phui-basic-nav + .phabricator-side-menu { + background: transparent; +} + +.phui-two-column-fixed.phui-two-column-view + .phui-basic-nav .phabricator-side-menu .phui-list-item-selected { + border-radius: 3px; + background-color: {$sky}; +} + +.phui-two-column-fixed.phui-two-column-view .phui-basic-nav + .phabricator-side-menu .phui-list-item-href { + border-radius: 3px; +} + +.phui-two-column-fixed.phui-two-column-view .phui-basic-nav + .phabricator-side-menu .phui-list-item-selected a { + color: #fff; +} + +.phui-two-column-fixed.phui-two-column-view .phui-basic-nav + .phabricator-side-menu .phui-list-item-selected a .phui-icon-view { + color: #fff; +} + +.phui-two-column-fixed.phui-two-column-view .phui-header-action-links + .phui-mobile-menu { + display: block; +} + +!print .phabricator-side-menu { + display: none !important; +} diff --git a/webroot/rsrc/css/phui/workboards/phui-workboard-color.css b/webroot/rsrc/css/phui/workboards/phui-workboard-color.css new file mode 100644 index 0000000000..9973d64979 --- /dev/null +++ b/webroot/rsrc/css/phui/workboards/phui-workboard-color.css @@ -0,0 +1,172 @@ +/** + * @provides phui-workboard-color-css + */ + +.phui-workboard-color .phabricator-nav-content .phui-workboard-view-shadow { + background-color: transparent; +} + +.phui-workboard-no-color { + background-color: {$page.content}; +} + +.phui-workboard-color .phui-crumbs-view { + background-color: rgba({$alphagrey},.15); + border: none; + color: rgba({$alphawhite},.8); +} + +.phui-workboard-color .phui-crumbs-view a, +.phui-workboard-color .phui-crumbs-view .phui-icon-view { + color: rgba({$alphawhite},.85); +} + +.phui-workboard-color .phui-crumbs-view a:hover, +.phui-workboard-color .phui-crumbs-view a:hover .phui-icon-view { + color: #fff; +} + +.phui-workboard-color .phuix-dropdown-menu { + background-color: rgba({$alphawhite},.9); +} + +.phui-workboard-color .phui-workpanel-view .phui-box-grey { + background-color: rgba({$alphawhite},.6); +} + +body.phui-workboard-color .phui-profile-menu .phabricator-side-menu { + background-color: rgba({$alphagrey},.3); +} + +body.phui-workboard-color .phabricator-side-menu .phui-profile-menu-footer-1 { + background-color: transparent; +} + +.phui-workboard-color .phui-profile-menu .phabricator-side-menu { + box-shadow: none; +} + +.phui-workboard-color-preview { + width: 50px; + height: 50px; + font-size: 34px; +} + +.phui-workboard-color .phui-profile-menu .phabricator-side-menu + .phui-list-item-href { + color: rgba({$alphawhite},.8); +} + +.phui-workboard-color .phui-profile-menu .phabricator-side-menu + .phui-list-item-icon, +.phui-workboard-color .phui-profile-menu .phabricator-side-menu + .phui-list-item-href .phui-list-item-icon { + color: rgba({$alphawhite},.8); +} + +.phui-workboard-color .phui-segment-bar-label { + color: rgba({$alphawhite},.8); +} + +/* Gradients */ + +.phui-workboard-gradient-red { + background-color: #e53935; + background-image: linear-gradient(to left, #e53935, #e35d5b); +} + +.phui-workboard-gradient-orange { + background-color: #f46b45; + background-image: linear-gradient(to left, #f46b45, #eea849); +} + +.phui-workboard-gradient-yellow { + background-color: #FF8008; + background-image: linear-gradient(to left, #FF8008, #FFC837); +} + +.phui-workboard-gradient-green { + background-color: #2fa0ac; + background-image: linear-gradient(90deg, #2fa0ac 0, #58cca6); +} + +.phui-workboard-gradient-blue { + background-color: #73a5c3; + background-image: linear-gradient(90deg, #73a5c3 0, #6875be); +} + +.phui-workboard-gradient-bluegrey { + background-color: #517fa4; + background-image: linear-gradient(to left, #517fa4, #243949); +} + +.phui-workboard-gradient-indigo { + background-color: #4776E6; + background-image: linear-gradient(to left, #4776E6, #8E54E9); +} + +.phui-workboard-gradient-violet { + background-color: #9f73c3; + background-image: linear-gradient(90deg, #9f73c3 0, #6875be); +} + +.phui-workboard-gradient-sky { + background-color: #7474BF; + background-image: linear-gradient(to left, #7474BF, #348AC7); +} + +.phui-workboard-gradient-pink { + background-color: #EA2A90; + background-image: linear-gradient(to left, #EA2A90, #79164B); +} + +.phui-workboard-gradient-grey { + background-color: #283048; + background-image: linear-gradient(to left, #283048, #859398); +} + +/* Colors */ + +.phui-workboard-red { + background-color: {$red}; +} + +.phui-workboard-orange { + background-color: {$orange}; +} + +.phui-workboard-yellow { + background-color: {$yellow}; +} + +.phui-workboard-green { + background-color: {$green}; +} + +.phui-workboard-blue { + background-color: {$blue}; +} + +.phui-workboard-indigo { + background-color: {$indigo}; +} + +.phui-workboard-violet { + background-color: {$violet}; +} + +.phui-workboard-sky { + background-color: {$sky}; +} + +.phui-workboard-pink { + background-color: {$pink}; +} + +.phui-workboard-fire { + background-color: {$fire}; +} + +.phui-workboard-grey { + background-color: {$greytext}; +} diff --git a/webroot/rsrc/css/phui/workboards/phui-workboard.css b/webroot/rsrc/css/phui/workboards/phui-workboard.css new file mode 100644 index 0000000000..10450ad836 --- /dev/null +++ b/webroot/rsrc/css/phui/workboards/phui-workboard.css @@ -0,0 +1,89 @@ +/** + * @provides phui-workboard-view-css + */ + +.phui-workboard-view { + width: 100%; +} + +.device-phone .phui-workboard-view { + width: auto; +} + +.device-desktop .phui-workboard-view-shadow { + overflow-x: auto; + overflow-y: hidden; + position: absolute; + top: 79px; + bottom: 0; + left: 0; + right: 0; + padding: 16px; +} + +.phui-workboard-view-shadow::-webkit-scrollbar { + height: 8px; + width: 8px; + background: rgba(200,200,200,.6); +} + +.phui-workboard-view-shadow::-webkit-scrollbar-thumb { + background: {$lightbluetext}; +} + +.device-desktop .project-board-wrapper .phui-workboard-view-shadow { + left: 212px; +} + +!print .project-board-wrapper .phui-workboard-view-shadow { + position: static; +} + +!print .project-board-wrapper .aphront-multi-column-column-outer { + display: block; + margin: 0 0 18px; + page-break-inside: avoid; +} + +.device-desktop .phui-workboard-view .aphront-multi-column-fixed + .aphront-multi-column-inner { + margin-left: 0; +} + +.device .project-board-wrapper { + margin: 16px; +} + +.device-desktop .phui-workboard-view .aphront-multi-column-view { + pointer-events: none; +} + +.device-desktop .phui-workpanel-view { + pointer-events: auto; + cursor: auto; +} + +/* Fullscreen */ + +.device-desktop .phui-workboard-fullscreen .phabricator-main-menu { + display: none; +} + +.device-desktop .phui-workboard-fullscreen .phui-profile-menu + .phui-workboard-view-shadow { + top: 35px; + left: 0; +} + +.device-desktop .phui-workboard-fullscreen .phui-workpanel-body-content { + max-height: calc(100vh - 120px); +} + +.device-desktop .phui-workboard-fullscreen .phui-profile-menu + .phabricator-nav-local { + display: none; +} + +.device .phui-workboard-expand-icon { + display: none; +} diff --git a/webroot/rsrc/css/phui/workboards/phui-workcard.css b/webroot/rsrc/css/phui/workboards/phui-workcard.css new file mode 100644 index 0000000000..d9acef12ef --- /dev/null +++ b/webroot/rsrc/css/phui/workboards/phui-workcard.css @@ -0,0 +1,199 @@ +/** + * @provides phui-workcard-view-css + */ + +.phui-workcard.phui-oi { + background-color: {$page.content}; + border-radius: 3px; + margin-bottom: 8px; + border-left-width: 4px; + box-sizing: border-box; +} + +.phui-workcard .phui-oi-name { + padding-bottom: 4px; +} + +.phui-workcard .phui-oi-content { + margin-top: 0; +} + +.phui-workcard .phui-oi-frame { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + border-color: {$thinblueborder}; + border-bottom-color: {$lightblueborder}; +} + +.phui-workcard.phui-oi .phui-oi-objname { + -webkit-touch-callout: text; + -webkit-user-select: text; + -khtml-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.phui-workcard .phui-oi-link { + white-space: normal; + + /* See T13413. This works around a Chrome 77 rendering engine freeze. */ + word-wrap: normal; + + font-weight: normal; + color: {$blacktext}; + margin-left: 2px; +} + +.phui-oi-disabled.phui-workcard { + background-color: rgba({$alphawhite},.67); +} + +.phui-oi-disabled.phui-workcard .phui-oi-link { + color: {$greytext}; +} + +.device-desktop .phui-workcard .phui-oi-with-1-actions + .phui-oi-content-box { + margin-right: 0; + overflow: hidden; +} + +.phui-workcard .phui-oi-objname { + vertical-align: top; +} + +.device-desktop .phui-workcard .phui-list-item-icon { + display: none; +} + +.phui-workcard.phui-oi .phui-list-item-href { + height: 24px; + width: 24px; +} + +.device-desktop .phui-workcard.phui-oi:hover + .phui-list-item-href { + background: #fff; + opacity: .7; +} + +.device-desktop .phui-workcard.phui-oi + .phui-list-item-href:hover { + background: {$sh-bluebackground}; + opacity: 1; +} + +.device-desktop .phui-workcard.draggable-card { + cursor: grab; +} + +.jx-dragging .phui-workcard.draggable-card { + cursor: grabbing; +} + +.device-desktop .phui-workcard.undraggable-card { + cursor: not-allowed; +} + +.device-desktop .phui-workcard.phui-oi.not-editable:hover { + background: {$sh-redbackground}; +} + +.device-desktop .phui-workcard.phui-oi.not-editable:hover + .phui-list-item-href { + border-radius: 3px; + background: {$red}; +} + +.device-desktop .phui-workcard.phui-oi.not-editable:hover + .phui-list-item-href .phui-icon-view { + color: #fff; +} + +.phui-workcard.phui-oi:hover .phui-list-item-icon { + display: block; +} + +.phui-workcard .phui-oi-attributes { + margin-right: 12px; +} + +.phui-workpanel-view .drag-ghost { + margin-bottom: 8px; +} + +.phui-workcard .phui-oi-cover-image { + display: block; + padding: 8px 8px 0 8px; + width: 263px; +} + +.phui-workcard.phui-oi.phui-workcard-upload-target { + background-color: {$sh-greenbackground}; +} + +.phui-oi-list-view .phui-workcard:last-child { + margin-bottom: 0; +} + +.phui-workcard .phui-oi-attribute-spacer { + display: none; +} + +.phui-workcard .phui-workcard-points { + margin: 0 4px 2px 0; + display: inline-block; +} + +.phui-workcard .phui-oi-attribute { + display: inline; +} + + +/* - Draggable Colors --------------------------------------------------------*/ + +.phui-workcard.phui-oi.drag-clone { + box-shadow: {$dropshadow}; + background-color: {$sh-greybackground}; +} + +.phui-workcard.phui-oi.drag-clone .phui-list-item-href { + display: none; +} + +.phui-workcard.drag-clone.phui-oi-bar-color-red { + background-color: {$sh-redbackground}; +} + +.phui-workcard.drag-clone.phui-oi-bar-color-orange { + background-color: {$sh-orangebackground}; +} + +.phui-workcard.drag-clone.phui-oi-bar-color-yellow { + background-color: {$sh-yellowbackground}; +} + +.phui-workcard.drag-clone.phui-oi-bar-color-green { + background-color: {$sh-greenbackground}; +} + +.phui-workcard.drag-clone.phui-oi-bar-color-blue { + background-color: {$sh-bluebackground}; +} + +.phui-workcard.drag-clone.phui-oi-bar-color-indigo { + background-color: {$sh-indigobackground}; +} + +.phui-workcard.drag-clone.phui-oi-bar-color-violet { + background-color: {$sh-violetbackground}; +} + +.phui-workcard.drag-clone.phui-oi-bar-color-pink { + background-color: {$sh-pinkbackground}; +} + +.phui-workcard.drag-clone.phui-oi-bar-color-sky { + background-color: {$sh-bluebackground}; +} diff --git a/webroot/rsrc/css/phui/workboards/phui-workpanel.css b/webroot/rsrc/css/phui/workboards/phui-workpanel.css new file mode 100644 index 0000000000..5ee54f2deb --- /dev/null +++ b/webroot/rsrc/css/phui/workboards/phui-workpanel.css @@ -0,0 +1,254 @@ +/** + * @provides phui-workpanel-view-css + * @requires phui-workcard-view-css + */ + +.phui-workpanel-view .phui-header-shell { + padding: 8px; + width: 284px; +} + +.phui-workpanel-view .phui-header-shell .phui-header-header { + font-size: {$biggerfontsize}; + line-height: 18px; + color: {$darkbluetext}; +} + +.phui-workpanel-view .phui-header-shell .phui-header-subheader { + padding: 0 4px; + margin: 0; + display: inline-block; + color: {$lightgreytext}; + font-size: {$normalfontsize}; +} + +.device .phui-workpanel-view .phui-header-shell { + width: auto; +} + +.phui-workboard-view { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.phui-workpanel-view .phui-box-grey { + background-color: rgba({$alphablue},0.1); +} + +.phui-workpanel-view.phui-workboard-column-milestone .phui-box-grey { + background-color: rgba(234, 230, 247, 0.85); +} + +.phui-workpanel-view .phui-header-col2 .phui-icon-view { + margin-right: 4px; +} + +.phui-workpanel-view .phui-workpanel-header-action { + float: right; + width: 24px; +} + +.phui-workpanel-view .phui-workpanel-body { + padding: 8px 4px 8px 0; +} + +.phui-workpanel-view .phui-workpanel-body-content { + padding: 0 4px 0 8px; +} + +.device .phui-workpanel-view .phui-workpanel-body { + padding: 8px 0; +} + +.phui-workpanel-view .phui-workpanel-footer-action a { + color: {$darkbluetext}; + font-weight: bold; +} + +.device-desktop .phui-workpanel-view .phui-workpanel-footer-action:hover { + background-color: rgba(100,100,100,.1); + border-radius: 3px; +} + +.device-desktop .aphront-multi-column-fixed .phui-workpanel-view { + width: 300px; +} + +.device-phone .aphront-multi-column-fixed .phui-workpanel-view, +.device-phone .phui-workpanel-view .phui-header-shell { + width: auto; +} + +.phui-workpanel-body .phui-oi-list-view { + min-height: 54px; + background-color: transparent; +} + +.device .aphront-multi-column-outer + div.aphront-multi-column-column-outer .phui-workpanel-body { + width: auto; +} + +.project-panel-hidden { + opacity: 0.75; +} + +.device-desktop .phui-workpanel-body-content { + max-height: calc(100vh - 162px); + overflow-y: auto; + overflow-x: hidden; +} + +.device-desktop .phui-workpanel-body-content::-webkit-scrollbar { + height: 8px; + width: 8px; + background: rgba({$alphablue},0.2); + border-radius: 4px; +} + +.device-desktop .phui-workpanel-body-content::-webkit-scrollbar-thumb { + background: rgba({$alphablue},0.4); + border-radius: 4px; +} + +.project-panel-empty .phui-oi-list-view { + background: rgba(234, 230, 247, 0.85); + border-radius: 3px; + margin-bottom: 4px; + border: 1px dashed {$sh-indigoborder}; +} + +.project-panel-empty .phui-oi-list-view .drag-ghost { + display: none; +} + +.project-panel-empty .phui-oi-list-view.drag-target-list { + background: rgba({$alphawhite},.7); +} + +.phui-workpanel-view.project-panel-over-limit .phui-header-header { + color: {$red}; +} + +.phui-workpanel-view.project-panel-over-limit .phui-header-shell { + border-color: {$red}; +} + +.phui-workpanel-view .phui-box-grey { + border: 1px solid transparent; +} + +.phui-workpanel-view.workboard-column-drop-target .phui-box-grey { + border-color: {$lightblueborder}; +} + +.workboard-group-header { + background: rgba({$alphablue}, 0.10); + padding: 6px 8px; + margin: 0 0 8px -8px; + border-bottom: 1px solid {$lightgreyborder}; + font-weight: bold; + color: {$darkgreytext}; + position: relative; +} + +.workboard-group-header .phui-icon-view { + position: absolute; + display: inline-block; + width: 24px; + padding: 5px 0 0 0; + height: 19px; + background-size: 100%; + border-radius: 3px; + background-repeat: no-repeat; + text-align: center; + background-color: {$lightgreybackground}; + border: 1px solid {$lightgreybackground}; +} + +.workboard-group-header .workboard-group-header-name { + display: block; + position: relative; + height: 24px; + line-height: 24px; + margin-left: 36px; + overflow: hidden; +} + +.workboard-drop-preview { + pointer-events: none; + position: absolute; + bottom: 12px; + right: 12px; + width: 300px; + border-radius: 3px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); + border: 1px solid {$lightblueborder}; + padding: 4px 0; + background: #fff; +} + +.workboard-drop-preview li { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin: 4px 8px; + color: {$greytext}; + border-radius: 3px; +} + +.workboard-drop-preview li .phui-icon-view { + position: relative; + display: inline-block; + text-align: center; + width: 24px; + height: 18px; + padding-top: 6px; + border-radius: 3px; + background: {$bluebackground}; + margin-right: 6px; +} + +.workboard-drop-preview .workboard-drop-preview-header { + background: {$sky}; + color: #fff; +} + +.workboard-drop-preview .workboard-drop-preview-header .phui-icon-view { + background: {$blue}; + color: #fff; +} + +.workboard-drop-preview-fade { + animation: 0.1s workboard-drop-preview-fade-out; + opacity: 0.25; +} + +@keyframes workboard-drop-preview-fade-out { + 0% { + opacity: 1; + } + + 100% { + opacity: 0.25; + } +} + +.phui-workpanel-view .phui-header-action-item a.phui-icon-view { + width: 24px; + height: 24px; + line-height: 24px; + text-align: center; + border-radius: 3px; + box-shadow: inset -1px -1px 2px rgba(0, 0, 0, 0.05); + border: 1px solid {$lightgreyborder}; + background: {$lightgreybackground}; +} + +.phui-workpanel-view .phui-header-action-item .phui-tag-view { + line-height: 24px; +} diff --git a/webroot/rsrc/css/sprite-actions.css b/webroot/rsrc/css/sprite-actions.css deleted file mode 100644 index 63cdba2760..0000000000 --- a/webroot/rsrc/css/sprite-actions.css +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @provides sprite-actions-css - * @generated - */ - -.sprite-actions { - background-image: url(http://github.com/rsrc/image/sprite-actions.png); - background-repeat: no-repeat; -} - -@media -only screen and (min-device-pixel-ratio: 1.5), -only screen and (-webkit-min-device-pixel-ratio: 1.5) { - .sprite-actions { - background-image: url(http://github.com/rsrc/image/sprite-actions-X2.png); - background-size: 150px 175px; - } -} - - -.actions-close-dark, .device-desktop .actions-close-grey.phui-icon-view:hover { - background-position: 0px 0px; -} - -.actions-down-dark, .device-desktop .actions-down-grey.phui-icon-view:hover { - background-position: -25px 0px; -} - -.actions-flag-dark, .device-desktop .actions-flag-grey.phui-icon-view:hover { - background-position: -50px 0px; -} - -.actions-heart-dark, .device-desktop .actions-heart-grey.phui-icon-view:hover { - background-position: -75px 0px; -} - -.actions-move-dark, .device-desktop .actions-move-grey.phui-icon-view:hover { - background-position: -100px 0px; -} - -.actions-new-dark, .device-desktop .actions-new-grey.phui-icon-view:hover { - background-position: -125px 0px; -} - -.actions-search-dark, .device-desktop .actions-search-grey.phui-icon-view:hover { - background-position: 0px -25px; -} - -.actions-settings-dark, .device-desktop .actions-settings-grey.phui-icon-view:hover { - background-position: -25px -25px; -} - -.actions-star-dark, .device-desktop .actions-star-grey.phui-icon-view:hover { - background-position: -50px -25px; -} - -.actions-tag-dark, .device-desktop .actions-tag-grey.phui-icon-view:hover { - background-position: -75px -25px; -} - -.actions-token-dark, .device-desktop .actions-token-grey.phui-icon-view:hover { - background-position: -100px -25px; -} - -.actions-up-dark, .device-desktop .actions-up-grey.phui-icon-view:hover { - background-position: -125px -25px; -} - -.actions-wrench-dark, .device-desktop .actions-wrench-grey.phui-icon-view:hover { - background-position: 0px -50px; -} - -.actions-close-grey { - background-position: -25px -50px; -} - -.actions-down-grey { - background-position: -50px -50px; -} - -.actions-flag-grey { - background-position: -75px -50px; -} - -.actions-heart-grey { - background-position: -100px -50px; -} - -.actions-move-grey { - background-position: -125px -50px; -} - -.actions-new-grey { - background-position: 0px -75px; -} - -.actions-search-grey { - background-position: -25px -75px; -} - -.actions-settings-grey { - background-position: -50px -75px; -} - -.actions-star-grey { - background-position: -75px -75px; -} - -.actions-tag-grey { - background-position: -100px -75px; -} - -.actions-token-grey { - background-position: -125px -75px; -} - -.actions-up-grey { - background-position: 0px -100px; -} - -.actions-wrench-grey { - background-position: -25px -100px; -} - -.actions-close-white { - background-position: -50px -100px; -} - -.actions-down-white { - background-position: -75px -100px; -} - -.actions-flag-white { - background-position: -100px -100px; -} - -.actions-heart-white { - background-position: -125px -100px; -} - -.actions-move-white { - background-position: 0px -125px; -} - -.actions-new-white { - background-position: -25px -125px; -} - -.actions-search-white { - background-position: -50px -125px; -} - -.actions-settings-white { - background-position: -75px -125px; -} - -.actions-star-white { - background-position: -100px -125px; -} - -.actions-tag-white { - background-position: -125px -125px; -} - -.actions-token-white { - background-position: 0px -150px; -} - -.actions-up-white { - background-position: -25px -150px; -} - -.actions-wrench-white { - background-position: -50px -150px; -} diff --git a/webroot/rsrc/css/sprite-apps-large.css b/webroot/rsrc/css/sprite-apps-large.css deleted file mode 100644 index cc9767b4a3..0000000000 --- a/webroot/rsrc/css/sprite-apps-large.css +++ /dev/null @@ -1,883 +0,0 @@ -/** - * @provides sprite-apps-large-css - * @generated - */ - -.sprite-apps-large { - background-image: url(http://github.com/rsrc/image/sprite-apps-large.png); - background-repeat: no-repeat; -} - -@media -only screen and (min-device-pixel-ratio: 1.5), -only screen and (-webkit-min-device-pixel-ratio: 1.5) { - .sprite-apps-large { - background-image: url(http://github.com/rsrc/image/sprite-apps-large-X2.png); - background-size: 435px 435px; - } -} - - -.apps-adventure-light-large { - background-position: 0px 0px; -} - -.apps-adventure-dark-large { - background-position: -29px 0px; -} - -.apps-adventure-blue-large, .phabricator-crumb-view:hover .apps-adventure-dark-large { - background-position: -58px 0px; -} - -.apps-adventure-white-large { - background-position: -87px 0px; -} - -.apps-application-light-large { - background-position: -116px 0px; -} - -.apps-application-dark-large { - background-position: -145px 0px; -} - -.apps-application-blue-large, .phabricator-crumb-view:hover .apps-application-dark-large { - background-position: -174px 0px; -} - -.apps-application-white-large { - background-position: -203px 0px; -} - -.apps-audit-light-large { - background-position: -232px 0px; -} - -.apps-audit-dark-large { - background-position: -261px 0px; -} - -.apps-audit-blue-large, .phabricator-crumb-view:hover .apps-audit-dark-large { - background-position: -290px 0px; -} - -.apps-audit-white-large { - background-position: -319px 0px; -} - -.apps-authentication-light-large { - background-position: -348px 0px; -} - -.apps-authentication-dark-large { - background-position: -377px 0px; -} - -.apps-authentication-blue-large, .phabricator-crumb-view:hover .apps-authentication-dark-large { - background-position: -406px 0px; -} - -.apps-authentication-white-large { - background-position: 0px -29px; -} - -.apps-calendar-light-large { - background-position: -29px -29px; -} - -.apps-calendar-dark-large { - background-position: -58px -29px; -} - -.apps-calendar-blue-large, .phabricator-crumb-view:hover .apps-calendar-dark-large { - background-position: -87px -29px; -} - -.apps-calendar-white-large { - background-position: -116px -29px; -} - -.apps-chatlog-light-large { - background-position: -145px -29px; -} - -.apps-chatlog-dark-large { - background-position: -174px -29px; -} - -.apps-chatlog-blue-large, .phabricator-crumb-view:hover .apps-chatlog-dark-large { - background-position: -203px -29px; -} - -.apps-chatlog-white-large { - background-position: -232px -29px; -} - -.apps-conduit-light-large { - background-position: -261px -29px; -} - -.apps-conduit-dark-large { - background-position: -290px -29px; -} - -.apps-conduit-blue-large, .phabricator-crumb-view:hover .apps-conduit-dark-large { - background-position: -319px -29px; -} - -.apps-conduit-white-large { - background-position: -348px -29px; -} - -.apps-conpherence-light-large { - background-position: -377px -29px; -} - -.apps-conpherence-dark-large { - background-position: -406px -29px; -} - -.apps-conpherence-blue-large, .phabricator-crumb-view:hover .apps-conpherence-dark-large { - background-position: 0px -58px; -} - -.apps-conpherence-white-large { - background-position: -29px -58px; -} - -.apps-countdown-light-large { - background-position: -58px -58px; -} - -.apps-countdown-dark-large { - background-position: -87px -58px; -} - -.apps-countdown-blue-large, .phabricator-crumb-view:hover .apps-countdown-dark-large { - background-position: -116px -58px; -} - -.apps-countdown-white-large { - background-position: -145px -58px; -} - -.apps-daemon-light-large { - background-position: -174px -58px; -} - -.apps-daemon-dark-large { - background-position: -203px -58px; -} - -.apps-daemon-blue-large, .phabricator-crumb-view:hover .apps-daemon-dark-large { - background-position: -232px -58px; -} - -.apps-daemon-white-large { - background-position: -261px -58px; -} - -.apps-differential-light-large { - background-position: -290px -58px; -} - -.apps-differential-dark-large { - background-position: -319px -58px; -} - -.apps-differential-blue-large, .phabricator-crumb-view:hover .apps-differential-dark-large { - background-position: -348px -58px; -} - -.apps-differential-white-large { - background-position: -377px -58px; -} - -.apps-diffusion-light-large { - background-position: -406px -58px; -} - -.apps-diffusion-dark-large { - background-position: 0px -87px; -} - -.apps-diffusion-blue-large, .phabricator-crumb-view:hover .apps-diffusion-dark-large { - background-position: -29px -87px; -} - -.apps-diffusion-white-large { - background-position: -58px -87px; -} - -.apps-diviner-light-large { - background-position: -87px -87px; -} - -.apps-diviner-dark-large { - background-position: -116px -87px; -} - -.apps-diviner-blue-large, .phabricator-crumb-view:hover .apps-diviner-dark-large { - background-position: -145px -87px; -} - -.apps-diviner-white-large { - background-position: -174px -87px; -} - -.apps-drydock-light-large { - background-position: -203px -87px; -} - -.apps-drydock-dark-large { - background-position: -232px -87px; -} - -.apps-drydock-blue-large, .phabricator-crumb-view:hover .apps-drydock-dark-large { - background-position: -261px -87px; -} - -.apps-drydock-white-large { - background-position: -290px -87px; -} - -.apps-fact-light-large { - background-position: -319px -87px; -} - -.apps-fact-dark-large { - background-position: -348px -87px; -} - -.apps-fact-blue-large, .phabricator-crumb-view:hover .apps-fact-dark-large { - background-position: -377px -87px; -} - -.apps-fact-white-large { - background-position: -406px -87px; -} - -.apps-feed-light-large { - background-position: 0px -116px; -} - -.apps-feed-dark-large { - background-position: -29px -116px; -} - -.apps-feed-blue-large, .phabricator-crumb-view:hover .apps-feed-dark-large { - background-position: -58px -116px; -} - -.apps-feed-white-large { - background-position: -87px -116px; -} - -.apps-files-light-large { - background-position: -116px -116px; -} - -.apps-files-dark-large { - background-position: -145px -116px; -} - -.apps-files-blue-large, .phabricator-crumb-view:hover .apps-files-dark-large { - background-position: -174px -116px; -} - -.apps-files-white-large { - background-position: -203px -116px; -} - -.apps-flags-light-large { - background-position: -232px -116px; -} - -.apps-flags-dark-large { - background-position: -261px -116px; -} - -.apps-flags-blue-large, .phabricator-crumb-view:hover .apps-flags-dark-large { - background-position: -290px -116px; -} - -.apps-flags-white-large { - background-position: -319px -116px; -} - -.apps-harbormaster-light-large { - background-position: -348px -116px; -} - -.apps-harbormaster-dark-large { - background-position: -377px -116px; -} - -.apps-harbormaster-blue-large, .phabricator-crumb-view:hover .apps-harbormaster-dark-large { - background-position: -406px -116px; -} - -.apps-harbormaster-white-large { - background-position: 0px -145px; -} - -.apps-help-light-large { - background-position: -29px -145px; -} - -.apps-help-dark-large { - background-position: -58px -145px; -} - -.apps-help-blue-large, .phabricator-crumb-view:hover .apps-help-dark-large { - background-position: -87px -145px; -} - -.apps-help-white-large { - background-position: -116px -145px; -} - -.apps-herald-light-large { - background-position: -145px -145px; -} - -.apps-herald-dark-large { - background-position: -174px -145px; -} - -.apps-herald-blue-large, .phabricator-crumb-view:hover .apps-herald-dark-large { - background-position: -203px -145px; -} - -.apps-herald-white-large { - background-position: -232px -145px; -} - -.apps-home-light-large { - background-position: -261px -145px; -} - -.apps-home-dark-large { - background-position: -290px -145px; -} - -.apps-home-blue-large, .phabricator-crumb-view:hover .apps-home-dark-large { - background-position: -319px -145px; -} - -.apps-home-white-large { - background-position: -348px -145px; -} - -.apps-legalpad-light-large { - background-position: -377px -145px; -} - -.apps-legalpad-dark-large { - background-position: -406px -145px; -} - -.apps-legalpad-blue-large, .phabricator-crumb-view:hover .apps-legalpad-dark-large { - background-position: 0px -174px; -} - -.apps-legalpad-white-large { - background-position: -29px -174px; -} - -.apps-logo-light-large { - background-position: -58px -174px; -} - -.apps-logo-dark-large { - background-position: -87px -174px; -} - -.apps-logo-blue-large, .phabricator-crumb-view:hover .apps-logo-dark-large { - background-position: -116px -174px; -} - -.apps-logo-white-large { - background-position: -145px -174px; -} - -.apps-macro-light-large { - background-position: -174px -174px; -} - -.apps-macro-dark-large { - background-position: -203px -174px; -} - -.apps-macro-blue-large, .phabricator-crumb-view:hover .apps-macro-dark-large { - background-position: -232px -174px; -} - -.apps-macro-white-large { - background-position: -261px -174px; -} - -.apps-mail-light-large { - background-position: -290px -174px; -} - -.apps-mail-dark-large { - background-position: -319px -174px; -} - -.apps-mail-blue-large, .phabricator-crumb-view:hover .apps-mail-dark-large { - background-position: -348px -174px; -} - -.apps-mail-white-large { - background-position: -377px -174px; -} - -.apps-maniphest-light-large { - background-position: 0px -203px; -} - -.apps-maniphest-dark-large { - background-position: -29px -203px; -} - -.apps-maniphest-blue-large, .phabricator-crumb-view:hover .apps-maniphest-dark-large { - background-position: -58px -203px; -} - -.apps-maniphest-white-large { - background-position: -87px -203px; -} - -.apps-metamta-light-large { - background-position: -116px -203px; -} - -.apps-metamta-dark-large { - background-position: -145px -203px; -} - -.apps-metamta-blue-large, .phabricator-crumb-view:hover .apps-metamta-dark-large { - background-position: -174px -203px; -} - -.apps-metamta-white-large { - background-position: -203px -203px; -} - -.apps-new-light-large { - background-position: -232px -203px; -} - -.apps-new-dark-large { - background-position: -261px -203px; -} - -.apps-new-blue-large, .phabricator-crumb-view:hover .apps-new-dark-large { - background-position: -290px -203px; -} - -.apps-new-white-large { - background-position: -319px -203px; -} - -.apps-owners-light-large { - background-position: -348px -203px; -} - -.apps-owners-dark-large { - background-position: -377px -203px; -} - -.apps-owners-blue-large, .phabricator-crumb-view:hover .apps-owners-dark-large { - background-position: 0px -232px; -} - -.apps-owners-white-large { - background-position: -29px -232px; -} - -.apps-paste-light-large { - background-position: -58px -232px; -} - -.apps-paste-dark-large { - background-position: -87px -232px; -} - -.apps-paste-blue-large, .phabricator-crumb-view:hover .apps-paste-dark-large { - background-position: -116px -232px; -} - -.apps-paste-white-large { - background-position: -145px -232px; -} - -.apps-people-light-large { - background-position: -174px -232px; -} - -.apps-people-dark-large { - background-position: -203px -232px; -} - -.apps-people-blue-large, .phabricator-crumb-view:hover .apps-people-dark-large { - background-position: -232px -232px; -} - -.apps-people-white-large { - background-position: -261px -232px; -} - -.apps-phage-light-large { - background-position: -290px -232px; -} - -.apps-phage-dark-large { - background-position: -319px -232px; -} - -.apps-phage-blue-large, .phabricator-crumb-view:hover .apps-phage-dark-large { - background-position: -348px -232px; -} - -.apps-phage-white-large { - background-position: -377px -232px; -} - -.apps-phame-light-large { - background-position: 0px -261px; -} - -.apps-phame-dark-large { - background-position: -29px -261px; -} - -.apps-phame-blue-large, .phabricator-crumb-view:hover .apps-phame-dark-large { - background-position: -58px -261px; -} - -.apps-phame-white-large { - background-position: -87px -261px; -} - -.apps-phid-light-large { - background-position: -116px -261px; -} - -.apps-phid-dark-large { - background-position: -145px -261px; -} - -.apps-phid-blue-large, .phabricator-crumb-view:hover .apps-phid-dark-large { - background-position: -174px -261px; -} - -.apps-phid-white-large { - background-position: -203px -261px; -} - -.apps-phlux-light-large { - background-position: -232px -261px; -} - -.apps-phlux-dark-large { - background-position: -261px -261px; -} - -.apps-phlux-blue-large, .phabricator-crumb-view:hover .apps-phlux-dark-large { - background-position: -290px -261px; -} - -.apps-phlux-white-large { - background-position: -319px -261px; -} - -.apps-pholio-light-large { - background-position: -348px -261px; -} - -.apps-pholio-dark-large { - background-position: -377px -261px; -} - -.apps-pholio-blue-large, .phabricator-crumb-view:hover .apps-pholio-dark-large { - background-position: 0px -290px; -} - -.apps-pholio-white-large { - background-position: -29px -290px; -} - -.apps-phortune-light-large { - background-position: -58px -290px; -} - -.apps-phortune-dark-large { - background-position: -87px -290px; -} - -.apps-phortune-blue-large, .phabricator-crumb-view:hover .apps-phortune-dark-large { - background-position: -116px -290px; -} - -.apps-phortune-white-large { - background-position: -145px -290px; -} - -.apps-phpast-light-large { - background-position: -174px -290px; -} - -.apps-phpast-dark-large { - background-position: -203px -290px; -} - -.apps-phpast-blue-large, .phabricator-crumb-view:hover .apps-phpast-dark-large { - background-position: -232px -290px; -} - -.apps-phpast-white-large { - background-position: -261px -290px; -} - -.apps-phrequent-light-large { - background-position: -290px -290px; -} - -.apps-phrequent-dark-large { - background-position: -319px -290px; -} - -.apps-phrequent-blue-large, .phabricator-crumb-view:hover .apps-phrequent-dark-large { - background-position: -348px -290px; -} - -.apps-phrequent-white-large { - background-position: -377px -290px; -} - -.apps-phriction-light-large { - background-position: 0px -319px; -} - -.apps-phriction-dark-large { - background-position: -29px -319px; -} - -.apps-phriction-blue-large, .phabricator-crumb-view:hover .apps-phriction-dark-large { - background-position: -58px -319px; -} - -.apps-phriction-white-large { - background-position: -87px -319px; -} - -.apps-policy-light-large { - background-position: -116px -319px; -} - -.apps-policy-dark-large { - background-position: -145px -319px; -} - -.apps-policy-blue-large, .phabricator-crumb-view:hover .apps-policy-dark-large { - background-position: -174px -319px; -} - -.apps-policy-white-large { - background-position: -203px -319px; -} - -.apps-ponder-light-large { - background-position: -232px -319px; -} - -.apps-ponder-dark-large { - background-position: -261px -319px; -} - -.apps-ponder-blue-large, .phabricator-crumb-view:hover .apps-ponder-dark-large { - background-position: -290px -319px; -} - -.apps-ponder-white-large { - background-position: -319px -319px; -} - -.apps-power-light-large { - background-position: -348px -319px; -} - -.apps-power-dark-large { - background-position: -377px -319px; -} - -.apps-power-blue-large, .phabricator-crumb-view:hover .apps-power-dark-large { - background-position: 0px -348px; -} - -.apps-power-white-large { - background-position: -29px -348px; -} - -.apps-projects-light-large { - background-position: -58px -348px; -} - -.apps-projects-dark-large { - background-position: -87px -348px; -} - -.apps-projects-blue-large, .phabricator-crumb-view:hover .apps-projects-dark-large { - background-position: -116px -348px; -} - -.apps-projects-white-large { - background-position: -145px -348px; -} - -.apps-releeph-light-large { - background-position: -174px -348px; -} - -.apps-releeph-dark-large { - background-position: -203px -348px; -} - -.apps-releeph-blue-large, .phabricator-crumb-view:hover .apps-releeph-dark-large { - background-position: -232px -348px; -} - -.apps-releeph-white-large { - background-position: -261px -348px; -} - -.apps-repositories-light-large { - background-position: -290px -348px; -} - -.apps-repositories-dark-large { - background-position: -319px -348px; -} - -.apps-repositories-blue-large, .phabricator-crumb-view:hover .apps-repositories-dark-large { - background-position: -348px -348px; -} - -.apps-repositories-white-large { - background-position: -377px -348px; -} - -.apps-settings-light-large { - background-position: 0px -377px; -} - -.apps-settings-dark-large { - background-position: -29px -377px; -} - -.apps-settings-blue-large, .phabricator-crumb-view:hover .apps-settings-dark-large { - background-position: -58px -377px; -} - -.apps-settings-white-large { - background-position: -87px -377px; -} - -.apps-setup-light-large { - background-position: -116px -377px; -} - -.apps-setup-dark-large { - background-position: -145px -377px; -} - -.apps-setup-blue-large, .phabricator-crumb-view:hover .apps-setup-dark-large { - background-position: -174px -377px; -} - -.apps-setup-white-large { - background-position: -203px -377px; -} - -.apps-slowvote-light-large { - background-position: -232px -377px; -} - -.apps-slowvote-dark-large { - background-position: -261px -377px; -} - -.apps-slowvote-blue-large, .phabricator-crumb-view:hover .apps-slowvote-dark-large { - background-position: -290px -377px; -} - -.apps-slowvote-white-large { - background-position: -319px -377px; -} - -.apps-token-light-large { - background-position: -348px -377px; -} - -.apps-token-dark-large { - background-position: -377px -377px; -} - -.apps-token-blue-large, .phabricator-crumb-view:hover .apps-token-dark-large { - background-position: 0px -406px; -} - -.apps-token-white-large { - background-position: -29px -406px; -} - -.apps-uiexamples-light-large { - background-position: -58px -406px; -} - -.apps-uiexamples-dark-large { - background-position: -87px -406px; -} - -.apps-uiexamples-blue-large, .phabricator-crumb-view:hover .apps-uiexamples-dark-large { - background-position: -116px -406px; -} - -.apps-uiexamples-white-large { - background-position: -145px -406px; -} - -.apps-workphlow-light-large { - background-position: -174px -406px; -} - -.apps-workphlow-dark-large { - background-position: -203px -406px; -} - -.apps-workphlow-blue-large, .phabricator-crumb-view:hover .apps-workphlow-dark-large { - background-position: -232px -406px; -} - -.apps-workphlow-white-large { - background-position: -261px -406px; -} - -.apps-xhprof-light-large { - background-position: -290px -406px; -} - -.apps-xhprof-dark-large { - background-position: -319px -406px; -} - -.apps-xhprof-blue-large, .phabricator-crumb-view:hover .apps-xhprof-dark-large { - background-position: -348px -406px; -} - -.apps-xhprof-white-large { - background-position: -377px -406px; -} diff --git a/webroot/rsrc/css/sprite-apps-xlarge.css b/webroot/rsrc/css/sprite-apps-xlarge.css deleted file mode 100644 index eeedad2518..0000000000 --- a/webroot/rsrc/css/sprite-apps-xlarge.css +++ /dev/null @@ -1,164 +0,0 @@ -/** - * @provides sprite-apps-xlarge-css - * @generated - */ - -.sprite-apps-xlarge { - background-image: url(http://github.com/rsrc/image/sprite-apps-xlarge.png); - background-repeat: no-repeat; -} - - - - -.app-application-dark-xlarge { - background-position: 0px 0px; -} - -.app-audit-dark-xlarge { - background-position: -57px 0px; -} - -.app-calendar-dark-xlarge { - background-position: -114px 0px; -} - -.app-conduit-dark-xlarge { - background-position: -171px 0px; -} - -.app-countdown-dark-xlarge { - background-position: -228px 0px; -} - -.app-daemon-dark-xlarge { - background-position: -285px 0px; -} - -.app-differential-dark-xlarge { - background-position: 0px -57px; -} - -.app-diffusion-dark-xlarge { - background-position: -57px -57px; -} - -.app-diviner-dark-xlarge { - background-position: -114px -57px; -} - -.app-drydock-dark-xlarge { - background-position: -171px -57px; -} - -.app-fact-dark-xlarge { - background-position: -228px -57px; -} - -.app-feed-dark-xlarge { - background-position: -285px -57px; -} - -.app-files-dark-xlarge { - background-position: 0px -114px; -} - -.app-flags-dark-xlarge { - background-position: -57px -114px; -} - -.app-help-dark-xlarge { - background-position: -114px -114px; -} - -.app-herald-dark-xlarge { - background-position: -171px -114px; -} - -.app-home-dark-xlarge { - background-position: -228px -114px; -} - -.app-logo-dark-xlarge { - background-position: -285px -114px; -} - -.app-macro-dark-xlarge { - background-position: 0px -171px; -} - -.app-mail-dark-xlarge { - background-position: -57px -171px; -} - -.app-maniphest-dark-xlarge { - background-position: -114px -171px; -} - -.app-metamta-dark-xlarge { - background-position: -171px -171px; -} - -.app-owners-dark-xlarge { - background-position: -228px -171px; -} - -.app-paste-dark-xlarge { - background-position: -285px -171px; -} - -.app-people-dark-xlarge { - background-position: 0px -228px; -} - -.app-phame-dark-xlarge { - background-position: -57px -228px; -} - -.app-phid-dark-xlarge { - background-position: -114px -228px; -} - -.app-pholio-dark-xlarge { - background-position: -171px -228px; -} - -.app-phpast-dark-xlarge { - background-position: -228px -228px; -} - -.app-phriction-dark-xlarge { - background-position: -285px -228px; -} - -.app-ponder-dark-xlarge { - background-position: 0px -285px; -} - -.app-power-dark-xlarge { - background-position: -57px -285px; -} - -.app-projects-dark-xlarge { - background-position: -114px -285px; -} - -.app-repositories-dark-xlarge { - background-position: -171px -285px; -} - -.app-settings-dark-xlarge { - background-position: -228px -285px; -} - -.app-setup-dark-xlarge { - background-position: -285px -285px; -} - -.app-slowvote-dark-xlarge { - background-position: 0px -342px; -} - -.app-uiexamples-dark-xlarge { - background-position: -57px -342px; -} diff --git a/webroot/rsrc/css/sprite-apps.css b/webroot/rsrc/css/sprite-apps.css deleted file mode 100644 index 612f7dd017..0000000000 --- a/webroot/rsrc/css/sprite-apps.css +++ /dev/null @@ -1,451 +0,0 @@ -/** - * @provides sprite-apps-css - * @generated - */ - -.sprite-apps { - background-image: url(http://github.com/rsrc/image/sprite-apps.png); - background-repeat: no-repeat; -} - -@media -only screen and (min-device-pixel-ratio: 1.5), -only screen and (-webkit-min-device-pixel-ratio: 1.5) { - .sprite-apps { - background-image: url(http://github.com/rsrc/image/sprite-apps-X2.png); - background-size: 150px 165px; - } -} - - -.apps-adventure-dark { - background-position: 0px 0px; -} - -.apps-adventure-white { - background-position: -15px 0px; -} - -.apps-application-dark { - background-position: -30px 0px; -} - -.apps-application-white { - background-position: -45px 0px; -} - -.apps-audit-dark { - background-position: -60px 0px; -} - -.apps-audit-white { - background-position: -75px 0px; -} - -.apps-authentication-dark { - background-position: -90px 0px; -} - -.apps-authentication-white { - background-position: -105px 0px; -} - -.apps-calendar-dark { - background-position: -120px 0px; -} - -.apps-calendar-white { - background-position: -135px 0px; -} - -.apps-chatlog-dark { - background-position: 0px -15px; -} - -.apps-chatlog-white { - background-position: -15px -15px; -} - -.apps-conduit-dark { - background-position: -30px -15px; -} - -.apps-conduit-white { - background-position: -45px -15px; -} - -.apps-conpherence-dark { - background-position: -60px -15px; -} - -.apps-conpherence-white { - background-position: -75px -15px; -} - -.apps-countdown-dark { - background-position: -90px -15px; -} - -.apps-countdown-white { - background-position: -105px -15px; -} - -.apps-daemon-dark { - background-position: -120px -15px; -} - -.apps-daemon-white { - background-position: -135px -15px; -} - -.apps-differential-dark { - background-position: 0px -30px; -} - -.apps-differential-white { - background-position: -15px -30px; -} - -.apps-diffusion-dark { - background-position: -30px -30px; -} - -.apps-diffusion-white { - background-position: -45px -30px; -} - -.apps-diviner-dark { - background-position: -60px -30px; -} - -.apps-diviner-white { - background-position: -75px -30px; -} - -.apps-drydock-dark { - background-position: -90px -30px; -} - -.apps-drydock-white { - background-position: -105px -30px; -} - -.apps-fact-dark { - background-position: -120px -30px; -} - -.apps-fact-white { - background-position: -135px -30px; -} - -.apps-feed-dark { - background-position: 0px -45px; -} - -.apps-feed-white { - background-position: -15px -45px; -} - -.apps-files-dark { - background-position: -30px -45px; -} - -.apps-files-white { - background-position: -45px -45px; -} - -.apps-flags-dark { - background-position: -60px -45px; -} - -.apps-flags-white { - background-position: -75px -45px; -} - -.apps-harbormaster-dark { - background-position: -90px -45px; -} - -.apps-harbormaster-white { - background-position: -105px -45px; -} - -.apps-help-dark { - background-position: -120px -45px; -} - -.apps-help-white { - background-position: -135px -45px; -} - -.apps-herald-dark { - background-position: 0px -60px; -} - -.apps-herald-white { - background-position: -15px -60px; -} - -.apps-home-dark { - background-position: -30px -60px; -} - -.apps-home-white { - background-position: -45px -60px; -} - -.apps-legalpad-dark { - background-position: -60px -60px; -} - -.apps-legalpad-white { - background-position: -75px -60px; -} - -.apps-logo-dark { - background-position: -90px -60px; -} - -.apps-logo-white { - background-position: -105px -60px; -} - -.apps-macro-dark { - background-position: -120px -60px; -} - -.apps-macro-white { - background-position: -135px -60px; -} - -.apps-mail-dark { - background-position: 0px -75px; -} - -.apps-mail-white { - background-position: -15px -75px; -} - -.apps-maniphest-dark { - background-position: -30px -75px; -} - -.apps-maniphest-white { - background-position: -45px -75px; -} - -.apps-metamta-dark { - background-position: -60px -75px; -} - -.apps-metamta-white { - background-position: -75px -75px; -} - -.apps-new-dark { - background-position: -90px -75px; -} - -.apps-new-white { - background-position: -105px -75px; -} - -.apps-owners-dark { - background-position: -120px -75px; -} - -.apps-owners-white { - background-position: -135px -75px; -} - -.apps-paste-dark { - background-position: 0px -90px; -} - -.apps-paste-white { - background-position: -15px -90px; -} - -.apps-people-dark { - background-position: -30px -90px; -} - -.apps-people-white { - background-position: -45px -90px; -} - -.apps-phage-dark { - background-position: -60px -90px; -} - -.apps-phage-white { - background-position: -75px -90px; -} - -.apps-phame-dark { - background-position: -90px -90px; -} - -.apps-phame-white { - background-position: -105px -90px; -} - -.apps-phid-dark { - background-position: -120px -90px; -} - -.apps-phid-white { - background-position: -135px -90px; -} - -.apps-phlux-dark { - background-position: 0px -105px; -} - -.apps-phlux-white { - background-position: -15px -105px; -} - -.apps-pholio-dark { - background-position: -30px -105px; -} - -.apps-pholio-white { - background-position: -45px -105px; -} - -.apps-phortune-dark { - background-position: -60px -105px; -} - -.apps-phortune-white { - background-position: -75px -105px; -} - -.apps-phpast-dark { - background-position: -90px -105px; -} - -.apps-phpast-white { - background-position: -105px -105px; -} - -.apps-phrequent-dark { - background-position: -120px -105px; -} - -.apps-phrequent-white { - background-position: -135px -105px; -} - -.apps-phriction-dark { - background-position: 0px -120px; -} - -.apps-phriction-white { - background-position: -15px -120px; -} - -.apps-policy-dark { - background-position: -30px -120px; -} - -.apps-policy-white { - background-position: -45px -120px; -} - -.apps-ponder-dark { - background-position: -60px -120px; -} - -.apps-ponder-white { - background-position: -75px -120px; -} - -.apps-power-dark { - background-position: -90px -120px; -} - -.apps-power-white { - background-position: -105px -120px; -} - -.apps-projects-dark { - background-position: -120px -120px; -} - -.apps-projects-white { - background-position: -135px -120px; -} - -.apps-releeph-dark { - background-position: 0px -135px; -} - -.apps-releeph-white { - background-position: -15px -135px; -} - -.apps-repositories-dark { - background-position: -30px -135px; -} - -.apps-repositories-white { - background-position: -45px -135px; -} - -.apps-settings-dark { - background-position: -60px -135px; -} - -.apps-settings-white { - background-position: -75px -135px; -} - -.apps-setup-dark { - background-position: -90px -135px; -} - -.apps-setup-white { - background-position: -105px -135px; -} - -.apps-slowvote-dark { - background-position: -120px -135px; -} - -.apps-slowvote-white { - background-position: -135px -135px; -} - -.apps-token-dark { - background-position: 0px -150px; -} - -.apps-token-white { - background-position: -15px -150px; -} - -.apps-uiexamples-dark { - background-position: -30px -150px; -} - -.apps-uiexamples-white { - background-position: -45px -150px; -} - -.apps-workphlow-dark { - background-position: -60px -150px; -} - -.apps-workphlow-white { - background-position: -75px -150px; -} - -.apps-xhprof-dark { - background-position: -90px -150px; -} - -.apps-xhprof-white { - background-position: -105px -150px; -} diff --git a/webroot/rsrc/css/sprite-conpherence.css b/webroot/rsrc/css/sprite-conpherence.css deleted file mode 100644 index 1926c2d6d4..0000000000 --- a/webroot/rsrc/css/sprite-conpherence.css +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @provides sprite-conpherence-css - * @generated - */ - -.sprite-conpherence { - background-image: url(http://github.com/rsrc/image/sprite-conpherence.png); - background-repeat: no-repeat; -} - -@media -only screen and (min-device-pixel-ratio: 1.5), -only screen and (-webkit-min-device-pixel-ratio: 1.5) { - .sprite-conpherence { - background-image: url(http://github.com/rsrc/image/sprite-conpherence-X2.png); - background-size: 132px 132px; - } -} - - -.conpherence_calendar_off { - background-position: 0px 0px; -} - -.conpherence_calendar_on, .device-desktop .conpherence_calendar_off:hover { - background-position: -33px 0px; -} - -.conpherence_conversation_off { - background-position: -66px 0px; -} - -.conpherence_conversation_on, .device-desktop .conpherence_conversation_off:hover { - background-position: -99px 0px; -} - -.conpherence_files_off { - background-position: 0px -33px; -} - -.conpherence_files_on, .device-desktop .conpherence_files_off:hover { - background-position: -33px -33px; -} - -.conpherence_list_off { - background-position: -66px -33px; -} - -.conpherence_list_on, .device-desktop .conpherence_list_off:hover { - background-position: -99px -33px; -} - -.conpherence_more_off { - background-position: 0px -66px; -} - -.conpherence_more_on, .device-desktop .conpherence_more_off:hover { - background-position: -33px -66px; -} - -.conpherence_people_off { - background-position: -66px -66px; -} - -.conpherence_people_on, .device-desktop .conpherence_people_off:hover { - background-position: 0px -99px; -} - -.conpherence_settings_off { - background-position: -33px -99px; -} - -.conpherence_settings_on, .device-desktop .conpherence_settings_off:hover { - background-position: -66px -99px; -} diff --git a/webroot/rsrc/css/sprite-docs.css b/webroot/rsrc/css/sprite-docs.css deleted file mode 100644 index d6890ee9e9..0000000000 --- a/webroot/rsrc/css/sprite-docs.css +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @provides sprite-docs-css - * @generated - */ - -.sprite-docs { - background-image: url(http://github.com/rsrc/image/sprite-docs.png); - background-repeat: no-repeat; -} - -@media -only screen and (min-device-pixel-ratio: 1.5), -only screen and (-webkit-min-device-pixel-ratio: 1.5) { - .sprite-docs { - background-image: url(http://github.com/rsrc/image/sprite-docs-X2.png); - background-size: 99px 99px; - } -} - - -.docs_audio { - background-position: 0px 0px; -} - -.docs_doc { - background-position: -33px 0px; -} - -.docs_file { - background-position: -66px 0px; -} - -.docs_image { - background-position: 0px -33px; -} - -.docs_movie { - background-position: -33px -33px; -} - -.docs_pdf { - background-position: -66px -33px; -} - -.docs_place { - background-position: 0px -66px; -} - -.docs_zip { - background-position: -33px -66px; -} diff --git a/webroot/rsrc/css/sprite-gradient.css b/webroot/rsrc/css/sprite-gradient.css deleted file mode 100644 index 341d262cac..0000000000 --- a/webroot/rsrc/css/sprite-gradient.css +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @provides sprite-gradient-css - * @generated - */ - -.sprite-gradient, .phabricator-dark-menu .phui-list-item-type-label, .phabricator-side-menu .phui-list-item-type-label { - background-image: url(http://github.com/rsrc/image/sprite-gradient.png); - background-repeat: repeat-x; -} - - - - -.gradient-blue-header { - background-position: 0px -83px; -} - -.gradient-breadcrumbs { - background-position: 0px -51px; -} - -.gradient-dark-grey-header { - background-position: 0px -154px; -} - -.gradient-dark-menu-label, .phabricator-dark-menu .phui-list-item-type-label { - background-position: 0px -25px; -} - -.gradient-green-header { - background-position: 0px -225px; -} - -.gradient-grey-header { - background-position: 0px -296px; -} - -.gradient-menu-label, .phabricator-side-menu .phui-list-item-type-label { - background-position: 0px 0px; -} - -.gradient-red-header { - background-position: 0px -367px; -} - -.gradient-yellow-header { - background-position: 0px -438px; -} diff --git a/webroot/rsrc/css/sprite-icons.css b/webroot/rsrc/css/sprite-icons.css deleted file mode 100644 index 9d8d498794..0000000000 --- a/webroot/rsrc/css/sprite-icons.css +++ /dev/null @@ -1,827 +0,0 @@ -/** - * @provides sprite-icons-css - * @generated - */ - -.sprite-icons { - background-image: url(http://github.com/rsrc/image/sprite-icons.png); - background-repeat: no-repeat; -} - -@media -only screen and (min-device-pixel-ratio: 1.5), -only screen and (-webkit-min-device-pixel-ratio: 1.5) { - .sprite-icons { - background-image: url(http://github.com/rsrc/image/sprite-icons-X2.png); - background-size: 210px 225px; - } -} - - -.icons-action-menu { - background-position: 0px 0px; -} - -.icons-arrow_left { - background-position: -15px 0px; -} - -.icons-arrow_right { - background-position: -30px 0px; -} - -.icons-attach { - background-position: -45px 0px; -} - -.icons-blame { - background-position: -60px 0px; -} - -.icons-check { - background-position: -75px 0px; -} - -.icons-comment { - background-position: -90px 0px; -} - -.icons-computer { - background-position: -105px 0px; -} - -.icons-create { - background-position: -120px 0px; -} - -.icons-delete { - background-position: -135px 0px; -} - -.icons-disable { - background-position: -150px 0px; -} - -.icons-dislike { - background-position: -165px 0px; -} - -.icons-download-alt { - background-position: -180px 0px; -} - -.icons-download { - background-position: -195px 0px; -} - -.icons-edit { - background-position: 0px -15px; -} - -.icons-enable { - background-position: -15px -15px; -} - -.icons-file { - background-position: -30px -15px; -} - -.icons-flag-0 { - background-position: -45px -15px; -} - -.icons-flag-1 { - background-position: -60px -15px; -} - -.icons-flag-2 { - background-position: -75px -15px; -} - -.icons-flag-3 { - background-position: -90px -15px; -} - -.icons-flag-4 { - background-position: -105px -15px; -} - -.icons-flag-5 { - background-position: -120px -15px; -} - -.icons-flag-6 { - background-position: -135px -15px; -} - -.icons-flag-7 { - background-position: -150px -15px; -} - -.icons-flag-ghost { - background-position: -165px -15px; -} - -.icons-flag { - background-position: -180px -15px; -} - -.icons-folder-open { - background-position: -195px -15px; -} - -.icons-fork { - background-position: 0px -30px; -} - -.icons-herald { - background-position: -15px -30px; -} - -.icons-highlight { - background-position: -30px -30px; -} - -.icons-history { - background-position: -45px -30px; -} - -.icons-home { - background-position: -60px -30px; -} - -.icons-image { - background-position: -75px -30px; -} - -.icons-like { - background-position: -90px -30px; -} - -.icons-link { - background-position: -105px -30px; -} - -.icons-lint-info { - background-position: -120px -30px; -} - -.icons-lint-ok { - background-position: -135px -30px; -} - -.icons-lint-warning { - background-position: -150px -30px; -} - -.icons-lock { - background-position: -165px -30px; -} - -.icons-love { - background-position: -180px -30px; -} - -.icons-merge { - background-position: -195px -30px; -} - -.icons-message { - background-position: 0px -45px; -} - -.icons-meta-mta { - background-position: -15px -45px; -} - -.icons-move { - background-position: -30px -45px; -} - -.icons-new { - background-position: -45px -45px; -} - -.icons-none { - background-position: -60px -45px; -} - -.icons-perflab { - background-position: -75px -45px; -} - -.icons-preview { - background-position: -90px -45px; -} - -.icons-refresh { - background-position: -105px -45px; -} - -.icons-remove { - background-position: -120px -45px; -} - -.icons-search { - background-position: -135px -45px; -} - -.icons-start-sandcastle { - background-position: -150px -45px; -} - -.icons-tag { - background-position: -165px -45px; -} - -.icons-transcript { - background-position: -180px -45px; -} - -.icons-undo { - background-position: -195px -45px; -} - -.icons-unlock { - background-position: 0px -60px; -} - -.icons-unmerge { - background-position: -15px -60px; -} - -.icons-unpublish { - background-position: -30px -60px; -} - -.icons-upload { - background-position: -45px -60px; -} - -.icons-warning { - background-position: -60px -60px; -} - -.icons-world { - background-position: -75px -60px; -} - -.icons-action-menu-grey { - background-position: -90px -60px; -} - -.icons-arrow_left-grey { - background-position: -105px -60px; -} - -.icons-arrow_right-grey { - background-position: -120px -60px; -} - -.icons-attach-grey { - background-position: -135px -60px; -} - -.icons-blame-grey { - background-position: -150px -60px; -} - -.icons-check-grey { - background-position: -165px -60px; -} - -.icons-comment-grey { - background-position: -180px -60px; -} - -.icons-computer-grey { - background-position: -195px -60px; -} - -.icons-create-grey { - background-position: 0px -75px; -} - -.icons-delete-grey { - background-position: -15px -75px; -} - -.icons-disable-grey { - background-position: -30px -75px; -} - -.icons-dislike-grey { - background-position: -45px -75px; -} - -.icons-download-alt-grey { - background-position: -60px -75px; -} - -.icons-download-grey { - background-position: -75px -75px; -} - -.icons-edit-grey { - background-position: -90px -75px; -} - -.icons-enable-grey { - background-position: -105px -75px; -} - -.icons-file-grey { - background-position: -120px -75px; -} - -.icons-flag-0-grey { - background-position: -135px -75px; -} - -.icons-flag-1-grey { - background-position: -150px -75px; -} - -.icons-flag-2-grey { - background-position: -165px -75px; -} - -.icons-flag-3-grey { - background-position: -180px -75px; -} - -.icons-flag-4-grey { - background-position: -195px -75px; -} - -.icons-flag-5-grey { - background-position: 0px -90px; -} - -.icons-flag-6-grey { - background-position: -15px -90px; -} - -.icons-flag-7-grey { - background-position: -30px -90px; -} - -.icons-flag-ghost-grey { - background-position: -45px -90px; -} - -.icons-flag-grey { - background-position: -60px -90px; -} - -.icons-folder-open-grey { - background-position: -75px -90px; -} - -.icons-fork-grey { - background-position: -90px -90px; -} - -.icons-herald-grey { - background-position: -105px -90px; -} - -.icons-highlight-grey { - background-position: -120px -90px; -} - -.icons-history-grey { - background-position: -135px -90px; -} - -.icons-home-grey { - background-position: -150px -90px; -} - -.icons-image-grey { - background-position: -165px -90px; -} - -.icons-like-grey { - background-position: -180px -90px; -} - -.icons-link-grey { - background-position: -195px -90px; -} - -.icons-lint-info-grey { - background-position: 0px -105px; -} - -.icons-lint-ok-grey { - background-position: -15px -105px; -} - -.icons-lint-warning-grey { - background-position: -30px -105px; -} - -.icons-lock-grey { - background-position: -45px -105px; -} - -.icons-love-grey { - background-position: -60px -105px; -} - -.icons-merge-grey { - background-position: -75px -105px; -} - -.icons-message-grey { - background-position: -90px -105px; -} - -.icons-meta-mta-grey { - background-position: -105px -105px; -} - -.icons-move-grey { - background-position: -120px -105px; -} - -.icons-new-grey { - background-position: -135px -105px; -} - -.icons-none-grey { - background-position: -150px -105px; -} - -.icons-perflab-grey { - background-position: -165px -105px; -} - -.icons-preview-grey { - background-position: -180px -105px; -} - -.icons-refresh-grey { - background-position: -195px -105px; -} - -.icons-remove-grey { - background-position: 0px -120px; -} - -.icons-search-grey { - background-position: -15px -120px; -} - -.icons-start-sandcastle-grey { - background-position: -30px -120px; -} - -.icons-tag-grey { - background-position: -45px -120px; -} - -.icons-transcript-grey { - background-position: -60px -120px; -} - -.icons-undo-grey { - background-position: -75px -120px; -} - -.icons-unlock-grey { - background-position: -90px -120px; -} - -.icons-unmerge-grey { - background-position: -105px -120px; -} - -.icons-unpublish-grey { - background-position: -120px -120px; -} - -.icons-upload-grey { - background-position: -135px -120px; -} - -.icons-warning-grey { - background-position: -150px -120px; -} - -.icons-world-grey { - background-position: -165px -120px; -} - -.icons-action-menu-white, .device-desktop .phabricator-action-view:hover .icons-action-menu, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-action-menu { - background-position: -180px -120px; -} - -.icons-arrow_left-white, .device-desktop .phabricator-action-view:hover .icons-arrow_left, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-arrow_left { - background-position: -195px -120px; -} - -.icons-arrow_right-white, .device-desktop .phabricator-action-view:hover .icons-arrow_right, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-arrow_right { - background-position: 0px -135px; -} - -.icons-attach-white, .device-desktop .phabricator-action-view:hover .icons-attach, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-attach { - background-position: -15px -135px; -} - -.icons-blame-white, .device-desktop .phabricator-action-view:hover .icons-blame, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-blame { - background-position: -30px -135px; -} - -.icons-check-white, .device-desktop .phabricator-action-view:hover .icons-check, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-check { - background-position: -45px -135px; -} - -.icons-comment-white, .device-desktop .phabricator-action-view:hover .icons-comment, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-comment { - background-position: -60px -135px; -} - -.icons-computer-white, .device-desktop .phabricator-action-view:hover .icons-computer, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-computer { - background-position: -75px -135px; -} - -.icons-create-white, .device-desktop .phabricator-action-view:hover .icons-create, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-create { - background-position: -90px -135px; -} - -.icons-delete-white, .device-desktop .phabricator-action-view:hover .icons-delete, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-delete { - background-position: -105px -135px; -} - -.icons-disable-white, .device-desktop .phabricator-action-view:hover .icons-disable, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-disable { - background-position: -120px -135px; -} - -.icons-dislike-white, .device-desktop .phabricator-action-view:hover .icons-dislike, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-dislike { - background-position: -135px -135px; -} - -.icons-download-alt-white, .device-desktop .phabricator-action-view:hover .icons-download-alt, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-download-alt { - background-position: -150px -135px; -} - -.icons-download-white, .device-desktop .phabricator-action-view:hover .icons-download, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-download { - background-position: -165px -135px; -} - -.icons-edit-white, .device-desktop .phabricator-action-view:hover .icons-edit, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-edit { - background-position: -180px -135px; -} - -.icons-enable-white, .device-desktop .phabricator-action-view:hover .icons-enable, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-enable { - background-position: -195px -135px; -} - -.icons-file-white, .device-desktop .phabricator-action-view:hover .icons-file, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-file { - background-position: 0px -150px; -} - -.icons-flag-0-white, .device-desktop .phabricator-action-view:hover .icons-flag-0, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-0 { - background-position: -15px -150px; -} - -.icons-flag-1-white, .device-desktop .phabricator-action-view:hover .icons-flag-1, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-1 { - background-position: -30px -150px; -} - -.icons-flag-2-white, .device-desktop .phabricator-action-view:hover .icons-flag-2, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-2 { - background-position: -45px -150px; -} - -.icons-flag-3-white, .device-desktop .phabricator-action-view:hover .icons-flag-3, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-3 { - background-position: -60px -150px; -} - -.icons-flag-4-white, .device-desktop .phabricator-action-view:hover .icons-flag-4, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-4 { - background-position: -75px -150px; -} - -.icons-flag-5-white, .device-desktop .phabricator-action-view:hover .icons-flag-5, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-5 { - background-position: -90px -150px; -} - -.icons-flag-6-white, .device-desktop .phabricator-action-view:hover .icons-flag-6, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-6 { - background-position: -105px -150px; -} - -.icons-flag-7-white, .device-desktop .phabricator-action-view:hover .icons-flag-7, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-7 { - background-position: -120px -150px; -} - -.icons-flag-ghost-white, .device-desktop .phabricator-action-view:hover .icons-flag-ghost, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag-ghost { - background-position: -135px -150px; -} - -.icons-flag-white, .device-desktop .phabricator-action-view:hover .icons-flag, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-flag { - background-position: -150px -150px; -} - -.icons-folder-open-white, .device-desktop .phabricator-action-view:hover .icons-folder-open, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-folder-open { - background-position: -165px -150px; -} - -.icons-fork-white, .device-desktop .phabricator-action-view:hover .icons-fork, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-fork { - background-position: -180px -150px; -} - -.icons-herald-white, .device-desktop .phabricator-action-view:hover .icons-herald, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-herald { - background-position: -195px -150px; -} - -.icons-highlight-white, .device-desktop .phabricator-action-view:hover .icons-highlight, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-highlight { - background-position: 0px -165px; -} - -.icons-history-white, .device-desktop .phabricator-action-view:hover .icons-history, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-history { - background-position: -15px -165px; -} - -.icons-home-white, .device-desktop .phabricator-action-view:hover .icons-home, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-home { - background-position: -30px -165px; -} - -.icons-image-white, .device-desktop .phabricator-action-view:hover .icons-image, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-image { - background-position: -45px -165px; -} - -.icons-like-white, .device-desktop .phabricator-action-view:hover .icons-like, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-like { - background-position: -60px -165px; -} - -.icons-link-white, .device-desktop .phabricator-action-view:hover .icons-link, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-link { - background-position: -75px -165px; -} - -.icons-lint-info-white, .device-desktop .phabricator-action-view:hover .icons-lint-info, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-lint-info { - background-position: -90px -165px; -} - -.icons-lint-ok-white, .device-desktop .phabricator-action-view:hover .icons-lint-ok, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-lint-ok { - background-position: -105px -165px; -} - -.icons-lint-warning-white, .device-desktop .phabricator-action-view:hover .icons-lint-warning, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-lint-warning { - background-position: -120px -165px; -} - -.icons-lock-white, .device-desktop .phabricator-action-view:hover .icons-lock, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-lock { - background-position: -135px -165px; -} - -.icons-love-white, .device-desktop .phabricator-action-view:hover .icons-love, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-love { - background-position: -150px -165px; -} - -.icons-merge-white, .device-desktop .phabricator-action-view:hover .icons-merge, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-merge { - background-position: -165px -165px; -} - -.icons-message-white, .device-desktop .phabricator-action-view:hover .icons-message, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-message { - background-position: -180px -165px; -} - -.icons-meta-mta-white, .device-desktop .phabricator-action-view:hover .icons-meta-mta, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-meta-mta { - background-position: -195px -165px; -} - -.icons-move-white, .device-desktop .phabricator-action-view:hover .icons-move, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-move { - background-position: 0px -180px; -} - -.icons-new-white, .device-desktop .phabricator-action-view:hover .icons-new, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-new { - background-position: -15px -180px; -} - -.icons-none-white, .device-desktop .phabricator-action-view:hover .icons-none, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-none { - background-position: -30px -180px; -} - -.icons-perflab-white, .device-desktop .phabricator-action-view:hover .icons-perflab, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-perflab { - background-position: -45px -180px; -} - -.icons-preview-white, .device-desktop .phabricator-action-view:hover .icons-preview, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-preview { - background-position: -60px -180px; -} - -.icons-refresh-white, .device-desktop .phabricator-action-view:hover .icons-refresh, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-refresh { - background-position: -75px -180px; -} - -.icons-remove-white, .device-desktop .phabricator-action-view:hover .icons-remove, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-remove { - background-position: -90px -180px; -} - -.icons-search-white, .device-desktop .phabricator-action-view:hover .icons-search, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-search { - background-position: -105px -180px; -} - -.icons-start-sandcastle-white, .device-desktop .phabricator-action-view:hover .icons-start-sandcastle, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-start-sandcastle { - background-position: -120px -180px; -} - -.icons-tag-white, .device-desktop .phabricator-action-view:hover .icons-tag, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-tag { - background-position: -135px -180px; -} - -.icons-transcript-white, .device-desktop .phabricator-action-view:hover .icons-transcript, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-transcript { - background-position: -150px -180px; -} - -.icons-undo-white, .device-desktop .phabricator-action-view:hover .icons-undo, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-undo { - background-position: -165px -180px; -} - -.icons-unlock-white, .device-desktop .phabricator-action-view:hover .icons-unlock, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-unlock { - background-position: -180px -180px; -} - -.icons-unmerge-white, .device-desktop .phabricator-action-view:hover .icons-unmerge, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-unmerge { - background-position: -195px -180px; -} - -.icons-unpublish-white, .device-desktop .phabricator-action-view:hover .icons-unpublish, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-unpublish { - background-position: 0px -195px; -} - -.icons-upload-white, .device-desktop .phabricator-action-view:hover .icons-upload, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-upload { - background-position: -15px -195px; -} - -.icons-warning-white, .device-desktop .phabricator-action-view:hover .icons-warning, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-warning { - background-position: -30px -195px; -} - -.icons-world-white, .device-desktop .phabricator-action-view:hover .icons-world, .device-desktop .phui-list-sidenav .phui-list-item-href:hover .icons-world { - background-position: -45px -195px; -} - -.remarkup-assist-b { - background-position: -60px -195px; -} - -.remarkup-assist-chaos { - background-position: -75px -195px; -} - -.remarkup-control-chaos-mode .remarkup-assist-chaos { - background-position: -90px -195px; -} - -.remarkup-assist-code { - background-position: -105px -195px; -} - -.remarkup-assist-help { - background-position: -120px -195px; -} - -.remarkup-assist-i { - background-position: -135px -195px; -} - -.remarkup-assist-image { - background-position: -150px -195px; -} - -.remarkup-assist-larger { - background-position: -165px -195px; -} - -.remarkup-assist-meme { - background-position: -180px -195px; -} - -.remarkup-assist-ol { - background-position: -195px -195px; -} - -.remarkup-assist-order { - background-position: 0px -210px; -} - -.remarkup-control-order-mode .remarkup-assist-order { - background-position: -15px -210px; -} - -.remarkup-assist-table { - background-position: -30px -210px; -} - -.remarkup-assist-tag { - background-position: -45px -210px; -} - -.remarkup-assist-tt { - background-position: -60px -210px; -} - -.remarkup-assist-ul { - background-position: -75px -210px; -} diff --git a/webroot/rsrc/css/sprite-login.css b/webroot/rsrc/css/sprite-login.css index 29aaa2d261..ec4e082031 100644 --- a/webroot/rsrc/css/sprite-login.css +++ b/webroot/rsrc/css/sprite-login.css @@ -10,10 +10,11 @@ @media only screen and (min-device-pixel-ratio: 1.5), -only screen and (-webkit-min-device-pixel-ratio: 1.5) { +only screen and (-webkit-min-device-pixel-ratio: 1.5), +only screen and (min-resolution: 1.5dppx) { .sprite-login { background-image: url(http://github.com/rsrc/image/sprite-login-X2.png); - background-size: 140px 175px; + background-size: 145px 145px; } } @@ -23,65 +24,81 @@ only screen and (-webkit-min-device-pixel-ratio: 1.5) { } .login-Asana { - background-position: -35px 0px; + background-position: -29px 0px; } -.login-Disqus { - background-position: -70px 0px; +.login-Bitbucket { + background-position: -58px 0px; } -.login-Dropbox { - background-position: -105px 0px; +.login-Disqus { + background-position: -87px 0px; } .login-Facebook { - background-position: 0px -35px; + background-position: -116px 0px; } .login-Generic { - background-position: -35px -35px; + background-position: 0px -29px; } .login-Github { - background-position: -70px -35px; + background-position: -29px -29px; } .login-Google { - background-position: -105px -35px; + background-position: -58px -29px; } .login-HTTP { - background-position: 0px -70px; + background-position: -87px -29px; } .login-Jira { - background-position: -35px -70px; + background-position: 0px -58px; } .login-LDAP { - background-position: -70px -70px; + background-position: -29px -58px; } -.login-Linkedin { - background-position: -105px -70px; +.login-MediaWiki { + background-position: -58px -58px; } -.login-Openid { - background-position: 0px -105px; +.login-PayPal { + background-position: -87px -58px; } .login-Phabricator { - background-position: -35px -105px; + background-position: 0px -87px; +} + +.login-Slack { + background-position: -29px -87px; +} + +.login-Stripe { + background-position: -58px -87px; +} + +.login-TestPayment { + background-position: -87px -87px; } .login-TwitchTV { - background-position: -70px -105px; + background-position: 0px -116px; } .login-Twitter { - background-position: -105px -105px; + background-position: -29px -116px; +} + +.login-WePay { + background-position: -58px -116px; } -.login-Yahoo { - background-position: 0px -140px; +.login-WordPressCOM { + background-position: -87px -116px; } diff --git a/webroot/rsrc/css/sprite-menu.css b/webroot/rsrc/css/sprite-menu.css deleted file mode 100644 index eb12a04237..0000000000 --- a/webroot/rsrc/css/sprite-menu.css +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @provides sprite-menu-css - * @generated - */ - -.sprite-menu { - background-image: url(http://github.com/rsrc/image/sprite-menu.png); - background-repeat: no-repeat; -} - -@media -only screen and (min-device-pixel-ratio: 1.5), -only screen and (-webkit-min-device-pixel-ratio: 1.5) { - .sprite-menu { - background-image: url(http://github.com/rsrc/image/sprite-menu-X2.png); - background-size: 150px 147px; - } -} - - -.alert-notifications .phabricator-main-menu-alert-icon { - background-position: 0px 0px; -} - -.alert-notifications:hover .phabricator-main-menu-alert-icon { - background-position: -19px 0px; -} - -.alert-notifications.alert-unread .phabricator-main-menu-alert-icon { - background-position: -38px 0px; -} - -.phabricator-crumb-divider { - background-position: 0px -115px; -} - -.menu-icon-search { - background-position: 0px -38px; -} - -.menu-icon-search-blue { - background-position: -25px -38px; -} - -.menu-icon-new { - background-position: -50px -38px; -} - -.menu-icon-new-blue { - background-position: 0px -63px; -} - -.menu-icon-app { - background-position: -10px -115px; -} - -.menu-icon-app-blue { - background-position: -35px -115px; -} - -.phabricator-main-menu-logo-image { - background-position: 0px -88px; -} - -.alert-notifications .phabricator-main-menu-message-icon { - background-position: 0px -19px; -} - -.alert-notifications:hover .phabricator-main-menu-message-icon { - background-position: -19px -19px; -} - -.alert-notifications.message-unread .phabricator-main-menu-message-icon { - background-position: -38px -19px; -} diff --git a/webroot/rsrc/css/sprite-minicons.css b/webroot/rsrc/css/sprite-minicons.css deleted file mode 100644 index 258490f768..0000000000 --- a/webroot/rsrc/css/sprite-minicons.css +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @provides sprite-minicons-css - * @generated - */ - -.sprite-minicons { - background-image: url(http://github.com/rsrc/image/sprite-minicons.png); - background-repeat: no-repeat; -} - -@media -only screen and (min-device-pixel-ratio: 1.5), -only screen and (-webkit-min-device-pixel-ratio: 1.5) { - .sprite-minicons { - background-image: url(http://github.com/rsrc/image/sprite-minicons-X2.png); - background-size: 51px 51px; - } -} - - -.minicons-company-white { - background-position: 0px 0px; -} - -.minicons-move-white { - background-position: -17px 0px; -} - -.minicons-public-white { - background-position: -34px 0px; -} - -.minicons-restricted-white { - background-position: 0px -17px; -} - -.minicons-company-dark { - background-position: -17px -17px; -} - -.minicons-move-dark { - background-position: -34px -17px; -} - -.minicons-public-dark { - background-position: 0px -34px; -} - -.minicons-restricted-dark { - background-position: -17px -34px; -} diff --git a/webroot/rsrc/css/sprite-payments.css b/webroot/rsrc/css/sprite-payments.css deleted file mode 100644 index b6ff1c9c23..0000000000 --- a/webroot/rsrc/css/sprite-payments.css +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @provides sprite-payments-css - * @generated - */ - -.sprite-payments { - background-image: url(http://github.com/rsrc/image/sprite-payments.png); - background-repeat: no-repeat; -} - -@media -only screen and (min-device-pixel-ratio: 1.5), -only screen and (-webkit-min-device-pixel-ratio: 1.5) { - .sprite-payments { - background-image: url(http://github.com/rsrc/image/sprite-payments-X2.png); - background-size: 122px 132px; - } -} - - -.payments-americanexpress { - background-position: 0px 0px; -} - -.payments-discover { - background-position: -61px 0px; -} - -.payments-googlecheckout { - background-position: 0px -33px; -} - -.payments-mastercard { - background-position: -61px -33px; -} - -.payments-paypal { - background-position: 0px -66px; -} - -.payments-visa { - background-position: -61px -66px; -} - -.payments-worldpay { - background-position: 0px -99px; -} diff --git a/webroot/rsrc/css/sprite-status.css b/webroot/rsrc/css/sprite-status.css deleted file mode 100644 index 26bc9f479e..0000000000 --- a/webroot/rsrc/css/sprite-status.css +++ /dev/null @@ -1,259 +0,0 @@ -/** - * @provides sprite-status-css - * @generated - */ - -.sprite-status { - background-image: url(http://github.com/rsrc/image/sprite-status.png); - background-repeat: no-repeat; -} - -@media -only screen and (min-device-pixel-ratio: 1.5), -only screen and (-webkit-min-device-pixel-ratio: 1.5) { - .sprite-status { - background-image: url(http://github.com/rsrc/image/sprite-status-X2.png); - background-size: 120px 120px; - } -} - - -.status-accept-blue { - background-position: 0px 0px; -} - -.status-accept-dark { - background-position: -15px 0px; -} - -.status-accept-green { - background-position: -30px 0px; -} - -.status-accept-red { - background-position: -45px 0px; -} - -.status-accept-white { - background-position: -60px 0px; -} - -.status-add-blue { - background-position: -75px 0px; -} - -.status-add-dark { - background-position: -90px 0px; -} - -.status-add-green { - background-position: -105px 0px; -} - -.status-add-red { - background-position: 0px -15px; -} - -.status-add-white { - background-position: -15px -15px; -} - -.status-down-blue { - background-position: -30px -15px; -} - -.status-down-dark { - background-position: -45px -15px; -} - -.status-down-green { - background-position: -60px -15px; -} - -.status-down-red { - background-position: -75px -15px; -} - -.status-down-white { - background-position: -90px -15px; -} - -.status-info-blue { - background-position: -105px -15px; -} - -.status-info-dark { - background-position: 0px -30px; -} - -.status-info-green { - background-position: -15px -30px; -} - -.status-info-red { - background-position: -30px -30px; -} - -.status-info-white { - background-position: -45px -30px; -} - -.status-left-blue { - background-position: -60px -30px; -} - -.status-left-dark { - background-position: -75px -30px; -} - -.status-left-green { - background-position: -90px -30px; -} - -.status-left-red { - background-position: -105px -30px; -} - -.status-left-white { - background-position: 0px -45px; -} - -.status-minus-blue { - background-position: -15px -45px; -} - -.status-minus-dark { - background-position: -30px -45px; -} - -.status-minus-green { - background-position: -45px -45px; -} - -.status-minus-red { - background-position: -60px -45px; -} - -.status-minus-white { - background-position: -75px -45px; -} - -.status-open-blue { - background-position: -90px -45px; -} - -.status-open-dark { - background-position: -105px -45px; -} - -.status-open-green { - background-position: 0px -60px; -} - -.status-open-red { - background-position: -15px -60px; -} - -.status-open-white { - background-position: -30px -60px; -} - -.status-question-blue { - background-position: -45px -60px; -} - -.status-question-dark { - background-position: -60px -60px; -} - -.status-question-green { - background-position: -75px -60px; -} - -.status-question-red { - background-position: -90px -60px; -} - -.status-question-white { - background-position: 0px -75px; -} - -.status-reject-blue { - background-position: -15px -75px; -} - -.status-reject-dark { - background-position: -30px -75px; -} - -.status-reject-green { - background-position: -45px -75px; -} - -.status-reject-red { - background-position: -60px -75px; -} - -.status-reject-white { - background-position: -75px -75px; -} - -.status-right-blue { - background-position: -90px -75px; -} - -.status-right-dark { - background-position: 0px -90px; -} - -.status-right-green { - background-position: -15px -90px; -} - -.status-right-red { - background-position: -30px -90px; -} - -.status-right-white { - background-position: -45px -90px; -} - -.status-up-blue { - background-position: -60px -90px; -} - -.status-up-dark { - background-position: -75px -90px; -} - -.status-up-green { - background-position: -90px -90px; -} - -.status-up-red { - background-position: 0px -105px; -} - -.status-up-white { - background-position: -15px -105px; -} - -.status-warning-blue { - background-position: -30px -105px; -} - -.status-warning-dark { - background-position: -45px -105px; -} - -.status-warning-green { - background-position: -60px -105px; -} - -.status-warning-red { - background-position: -75px -105px; -} - -.status-warning-white { - background-position: -90px -105px; -} diff --git a/webroot/rsrc/css/sprite-tokens.css b/webroot/rsrc/css/sprite-tokens.css index f8d50757b1..5e61d6c9be 100644 --- a/webroot/rsrc/css/sprite-tokens.css +++ b/webroot/rsrc/css/sprite-tokens.css @@ -8,7 +8,15 @@ background-repeat: no-repeat; } - +@media +only screen and (min-device-pixel-ratio: 1.5), +only screen and (-webkit-min-device-pixel-ratio: 1.5), +only screen and (min-resolution: 1.5dppx) { + .sprite-tokens { + background-image: url(http://github.com/rsrc/image/sprite-tokens-X2.png); + background-size: 95px 95px; + } +} .tokens-coin-1 { @@ -16,61 +24,93 @@ } .tokens-coin-2 { - background-position: -17px 0px; + background-position: -19px 0px; } .tokens-coin-3 { - background-position: -34px 0px; + background-position: -38px 0px; } .tokens-coin-4 { - background-position: -51px 0px; + background-position: -57px 0px; +} + +.tokens-emoji-1 { + background-position: -76px 0px; +} + +.tokens-emoji-2 { + background-position: 0px -19px; +} + +.tokens-emoji-3 { + background-position: -19px -19px; +} + +.tokens-emoji-4 { + background-position: -38px -19px; +} + +.tokens-emoji-5 { + background-position: -57px -19px; +} + +.tokens-emoji-6 { + background-position: -76px -19px; +} + +.tokens-emoji-7 { + background-position: 0px -38px; +} + +.tokens-emoji-8 { + background-position: -19px -38px; } .tokens-heart-1 { - background-position: 0px -17px; + background-position: -38px -38px; } .tokens-heart-2 { - background-position: -17px -17px; + background-position: -57px -38px; } .tokens-like-1 { - background-position: -34px -17px; + background-position: -76px -38px; } .tokens-like-2 { - background-position: -51px -17px; + background-position: 0px -57px; } .tokens-medal-1 { - background-position: 0px -34px; + background-position: -19px -57px; } .tokens-medal-2 { - background-position: -17px -34px; + background-position: -38px -57px; } .tokens-medal-3 { - background-position: -34px -34px; + background-position: -57px -57px; } .tokens-medal-4 { - background-position: -51px -34px; + background-position: -76px -57px; } .tokens-misc-1 { - background-position: 0px -51px; + background-position: 0px -76px; } .tokens-misc-2 { - background-position: -17px -51px; + background-position: -19px -76px; } .tokens-misc-3 { - background-position: -34px -51px; + background-position: -38px -76px; } .tokens-misc-4 { - background-position: -51px -51px; + background-position: -57px -76px; } diff --git a/webroot/rsrc/css/syntax/syntax-default.css b/webroot/rsrc/css/syntax/syntax-default.css new file mode 100644 index 0000000000..687698b1e6 --- /dev/null +++ b/webroot/rsrc/css/syntax/syntax-default.css @@ -0,0 +1,150 @@ +/** + * @provides syntax-default-css + * @generated + */ + +.remarkup-code .bp, +.remarkup-code .cp, +.remarkup-code .kp, +.remarkup-code .kr, +.remarkup-code .nb { + color: #304a96 +} + +.remarkup-code .c, +.remarkup-code .c1, +.remarkup-code .cm, +.remarkup-code .cs { + color: #74777d +} + +.remarkup-code .gd { + color: #a00000 +} + +.remarkup-code .gh, +.remarkup-code .gp { + color: #000080 +} + +.remarkup-code .gi { + color: #00a000 +} + +.remarkup-code .go { + color: #808080 +} + +.remarkup-code .gr { + color: #ff0000 +} + +.remarkup-code .gt { + color: #0040d0 +} + +.remarkup-code .gu { + color: #800080 +} + +.remarkup-code .hll { + color: #ffffcc +} + +.remarkup-code .il, +.remarkup-code .m, +.remarkup-code .mf, +.remarkup-code .mh, +.remarkup-code .mi, +.remarkup-code .mo { + color: #601200 +} + +.remarkup-code .k, +.remarkup-code .kd, +.remarkup-code .kn, +.remarkup-code .kt { + color: #aa4000 +} + +.remarkup-code .kc, +.remarkup-code .no { + color: #000a65 +} + +.remarkup-code .na { + color: #354bb3 +} + +.remarkup-code .nc, +.remarkup-code .nt, +.remarkup-code .vc { + color: #00702a +} + +.remarkup-code .nd, +.remarkup-code .ow { + color: #aa22ff +} + +.remarkup-code .ne { + color: #d2413a +} + +.remarkup-code .nf, +.remarkup-code .nx { + color: #004012 +} + +.remarkup-code .ni { + color: #92969d +} + +.remarkup-code .nl { + color: #a0a000 +} + +.remarkup-code .nn { + color: #0000ff +} + +.remarkup-code .nv, +.remarkup-code .vg, +.remarkup-code .vi { + color: #001294 +} + +.remarkup-code .o, +.remarkup-code .ss { + color: #aa2211 +} + +.remarkup-code .s, +.remarkup-code .s1, +.remarkup-code .s2, +.remarkup-code .sb, +.remarkup-code .sc, +.remarkup-code .sx { + color: #766510 +} + +.remarkup-code .sd, +.remarkup-code .sh { + color: #000000 +} + +.remarkup-code .se { + color: #bb6622 +} + +.remarkup-code .si { + color: #bb66bb +} + +.remarkup-code .sr { + color: #bb6688 +} + +.remarkup-code .w { + color: #bbbbbb +} diff --git a/webroot/rsrc/externals/d3/LICENSE b/webroot/rsrc/externals/d3/LICENSE new file mode 100644 index 0000000000..1d9d875edb --- /dev/null +++ b/webroot/rsrc/externals/d3/LICENSE @@ -0,0 +1,27 @@ +Copyright 2010-2017 Mike Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/webroot/rsrc/externals/d3/README.md b/webroot/rsrc/externals/d3/README.md new file mode 100644 index 0000000000..696df69ce1 --- /dev/null +++ b/webroot/rsrc/externals/d3/README.md @@ -0,0 +1,57 @@ +# D3: Data-Driven Documents + + + +**D3** (or **D3.js**) is a JavaScript library for visualizing data using web standards. D3 helps you bring data to life using SVG, Canvas and HTML. D3 combines powerful visualization and interaction techniques with a data-driven approach to DOM manipulation, giving you the full capabilities of modern browsers and the freedom to design the right visual interface for your data. + +## Resources + +* [API Reference](https://github.com/d3/d3/blob/master/API.md) +* [Release Notes](https://github.com/d3/d3/releases) +* [Gallery](https://github.com/d3/d3/wiki/Gallery) +* [Examples](https://bl.ocks.org/mbostock) +* [Wiki](https://github.com/d3/d3/wiki) + +## Installing + +If you use npm, `npm install d3`. Otherwise, download the [latest release](https://github.com/d3/d3/releases/latest). The released bundle supports anonymous AMD, CommonJS, and vanilla environments. You can load directly from [d3js.org](https://d3js.org), [CDNJS](https://cdnjs.com/libraries/d3), or [unpkg](https://unpkg.com/d3/). For example: + +```html + +``` + +For the minified version: + +```html + +``` + +You can also use the standalone D3 microlibraries. For example, [d3-selection](https://github.com/d3/d3-selection): + +```html + +``` + +D3 is written using [ES2015 modules](http://www.2ality.com/2014/09/es6-modules-final.html). Create a [custom bundle using Rollup](https://bl.ocks.org/mbostock/bb09af4c39c79cffcde4), Webpack, or your preferred bundler. To import D3 into an ES2015 application, either import specific symbols from specific D3 modules: + +```js +import {scaleLinear} from "d3-scale"; +``` + +Or import everything into a namespace (here, `d3`): + +```js +import * as d3 from "d3"; +``` + +In Node: + +```js +var d3 = require("d3"); +``` + +You can also require individual modules and combine them into a `d3` object using [Object.assign](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign): + +```js +var d3 = Object.assign({}, require("d3-format"), require("d3-geo"), require("d3-geo-projection")); +``` diff --git a/webroot/rsrc/externals/d3/d3.min.js b/webroot/rsrc/externals/d3/d3.min.js new file mode 100644 index 0000000000..dfbfa98c1a --- /dev/null +++ b/webroot/rsrc/externals/d3/d3.min.js @@ -0,0 +1,6 @@ +/** + * @provides d3 + * @do-not-minify + */ +// https://d3js.org v5.9.2 Copyright 2019 Mike Bostock +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(t.d3=t.d3||{})}(this,function(t){"use strict";function n(t,n){return tn?1:t>=n?0:NaN}function e(t){var e;return 1===t.length&&(e=t,t=function(t,r){return n(e(t),r)}),{left:function(n,e,r,i){for(null==r&&(r=0),null==i&&(i=n.length);r>>1;t(n[o],e)<0?r=o+1:i=o}return r},right:function(n,e,r,i){for(null==r&&(r=0),null==i&&(i=n.length);r>>1;t(n[o],e)>0?i=o:r=o+1}return r}}}var r=e(n),i=r.right,o=r.left;function a(t,n){return[t,n]}function u(t){return null===t?NaN:+t}function c(t,n){var e,r,i=t.length,o=0,a=-1,c=0,f=0;if(null==n)for(;++a1)return f/(o-1)}function f(t,n){var e=c(t,n);return e?Math.sqrt(e):e}function s(t,n){var e,r,i,o=t.length,a=-1;if(null==n){for(;++a=e)for(r=i=e;++ae&&(r=e),i=e)for(r=i=e;++ae&&(r=e),i0)return[t];if((r=n0)for(t=Math.ceil(t/a),n=Math.floor(n/a),o=new Array(i=Math.ceil(n-t+1));++u=0?(o>=y?10:o>=_?5:o>=b?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(o>=y?10:o>=_?5:o>=b?2:1)}function w(t,n,e){var r=Math.abs(n-t)/Math.max(0,e),i=Math.pow(10,Math.floor(Math.log(r)/Math.LN10)),o=r/i;return o>=y?i*=10:o>=_?i*=5:o>=b&&(i*=2),n=1)return+e(t[r-1],r-1,t);var r,i=(r-1)*n,o=Math.floor(i),a=+e(t[o],o,t);return a+(+e(t[o+1],o+1,t)-a)*(i-o)}}function A(t,n){var e,r,i=t.length,o=-1;if(null==n){for(;++o=e)for(r=e;++or&&(r=e)}else for(;++o=e)for(r=e;++or&&(r=e);return r}function T(t){for(var n,e,r,i=t.length,o=-1,a=0;++o=0;)for(n=(r=t[i]).length;--n>=0;)e[--a]=r[n];return e}function S(t,n){var e,r,i=t.length,o=-1;if(null==n){for(;++o=e)for(r=e;++oe&&(r=e)}else for(;++o=e)for(r=e;++oe&&(r=e);return r}function k(t){if(!(i=t.length))return[];for(var n=-1,e=S(t,E),r=new Array(e);++n=0&&(n=t.slice(e+1),t=t.slice(0,e)),t&&!r.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:n}})),a=-1,u=o.length;if(!(arguments.length<2)){if(null!=n&&"function"!=typeof n)throw new Error("invalid callback: "+n);for(;++a0)for(var e,r,i=new Array(e),o=0;o=0&&"xmlns"!==(n=t.slice(0,e))&&(t=t.slice(e+1)),V.hasOwnProperty(n)?{space:V[n],local:t}:t}function W(t){var n=$(t);return(n.local?function(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}:function(t){return function(){var n=this.ownerDocument,e=this.namespaceURI;return e===G&&n.documentElement.namespaceURI===G?n.createElement(t):n.createElementNS(e,t)}})(n)}function Z(){}function Q(t){return null==t?Z:function(){return this.querySelector(t)}}function J(){return[]}function K(t){return null==t?J:function(){return this.querySelectorAll(t)}}function tt(t){return function(){return this.matches(t)}}function nt(t){return new Array(t.length)}function et(t,n){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=n}et.prototype={constructor:et,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,n){return this._parent.insertBefore(t,n)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var rt="$";function it(t,n,e,r,i,o){for(var a,u=0,c=n.length,f=o.length;un?1:t>=n?0:NaN}function ut(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function ct(t,n){return t.style.getPropertyValue(n)||ut(t).getComputedStyle(t,null).getPropertyValue(n)}function ft(t){return t.trim().split(/^|\s+/)}function st(t){return t.classList||new lt(t)}function lt(t){this._node=t,this._names=ft(t.getAttribute("class")||"")}function ht(t,n){for(var e=st(t),r=-1,i=n.length;++r=0&&(this._names.splice(n,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var wt={};(t.event=null,"undefined"!=typeof document)&&("onmouseenter"in document.documentElement||(wt={mouseenter:"mouseover",mouseleave:"mouseout"}));function Mt(t,n,e){return t=Nt(t,n,e),function(n){var e=n.relatedTarget;e&&(e===this||8&e.compareDocumentPosition(this))||t.call(this,n)}}function Nt(n,e,r){return function(i){var o=t.event;t.event=i;try{n.call(this,this.__data__,e,r)}finally{t.event=o}}}function At(t){return function(){var n=this.__on;if(n){for(var e,r=0,i=-1,o=n.length;r=x&&(x=m+1);!(b=y[x])&&++x=0;)(r=i[o])&&(a&&4^r.compareDocumentPosition(a)&&a.parentNode.insertBefore(r,a),a=r);return this},sort:function(t){function n(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}t||(t=at);for(var e=this._groups,r=e.length,i=new Array(r),o=0;o1?this.each((null==n?function(t){return function(){this.style.removeProperty(t)}}:"function"==typeof n?function(t,n,e){return function(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}}:function(t,n,e){return function(){this.style.setProperty(t,n,e)}})(t,n,null==e?"":e)):ct(this.node(),t)},property:function(t,n){return arguments.length>1?this.each((null==n?function(t){return function(){delete this[t]}}:"function"==typeof n?function(t,n){return function(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}}:function(t,n){return function(){this[t]=n}})(t,n)):this.node()[t]},classed:function(t,n){var e=ft(t+"");if(arguments.length<2){for(var r=st(this.node()),i=-1,o=e.length;++i=0&&(n=t.slice(e+1),t=t.slice(0,e)),{type:t,name:n}})}(t+""),a=o.length;if(!(arguments.length<2)){for(u=n?Tt:At,null==e&&(e=!1),r=0;r>8&15|n>>4&240,n>>4&15|240&n,(15&n)<<4|15&n,1):(n=rn.exec(t))?dn(parseInt(n[1],16)):(n=on.exec(t))?new yn(n[1],n[2],n[3],1):(n=an.exec(t))?new yn(255*n[1]/100,255*n[2]/100,255*n[3]/100,1):(n=un.exec(t))?pn(n[1],n[2],n[3],n[4]):(n=cn.exec(t))?pn(255*n[1]/100,255*n[2]/100,255*n[3]/100,n[4]):(n=fn.exec(t))?bn(n[1],n[2]/100,n[3]/100,1):(n=sn.exec(t))?bn(n[1],n[2]/100,n[3]/100,n[4]):ln.hasOwnProperty(t)?dn(ln[t]):"transparent"===t?new yn(NaN,NaN,NaN,0):null}function dn(t){return new yn(t>>16&255,t>>8&255,255&t,1)}function pn(t,n,e,r){return r<=0&&(t=n=e=NaN),new yn(t,n,e,r)}function vn(t){return t instanceof Jt||(t=hn(t)),t?new yn((t=t.rgb()).r,t.g,t.b,t.opacity):new yn}function gn(t,n,e,r){return 1===arguments.length?vn(t):new yn(t,n,e,null==r?1:r)}function yn(t,n,e,r){this.r=+t,this.g=+n,this.b=+e,this.opacity=+r}function _n(t){return((t=Math.max(0,Math.min(255,Math.round(t)||0)))<16?"0":"")+t.toString(16)}function bn(t,n,e,r){return r<=0?t=n=e=NaN:e<=0||e>=1?t=n=NaN:n<=0&&(t=NaN),new xn(t,n,e,r)}function mn(t,n,e,r){return 1===arguments.length?function(t){if(t instanceof xn)return new xn(t.h,t.s,t.l,t.opacity);if(t instanceof Jt||(t=hn(t)),!t)return new xn;if(t instanceof xn)return t;var n=(t=t.rgb()).r/255,e=t.g/255,r=t.b/255,i=Math.min(n,e,r),o=Math.max(n,e,r),a=NaN,u=o-i,c=(o+i)/2;return u?(a=n===o?(e-r)/u+6*(e0&&c<1?0:a,new xn(a,u,c,t.opacity)}(t):new xn(t,n,e,null==r?1:r)}function xn(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function wn(t,n,e){return 255*(t<60?n+(e-n)*t/60:t<180?e:t<240?n+(e-n)*(240-t)/60:n)}Zt(Jt,hn,{displayable:function(){return this.rgb().displayable()},hex:function(){return this.rgb().hex()},toString:function(){return this.rgb()+""}}),Zt(yn,gn,Qt(Jt,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new yn(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new yn(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return 0<=this.r&&this.r<=255&&0<=this.g&&this.g<=255&&0<=this.b&&this.b<=255&&0<=this.opacity&&this.opacity<=1},hex:function(){return"#"+_n(this.r)+_n(this.g)+_n(this.b)},toString:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}})),Zt(xn,mn,Qt(Jt,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new xn(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new xn(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),n=isNaN(t)||isNaN(this.s)?0:this.s,e=this.l,r=e+(e<.5?e:1-e)*n,i=2*e-r;return new yn(wn(t>=240?t-240:t+120,i,r),wn(t,i,r),wn(t<120?t+240:t-120,i,r),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}));var Mn=Math.PI/180,Nn=180/Math.PI,An=.96422,Tn=1,Sn=.82521,kn=4/29,En=6/29,Cn=3*En*En,Pn=En*En*En;function zn(t){if(t instanceof Dn)return new Dn(t.l,t.a,t.b,t.opacity);if(t instanceof Fn){if(isNaN(t.h))return new Dn(t.l,0,0,t.opacity);var n=t.h*Mn;return new Dn(t.l,Math.cos(n)*t.c,Math.sin(n)*t.c,t.opacity)}t instanceof yn||(t=vn(t));var e,r,i=On(t.r),o=On(t.g),a=On(t.b),u=qn((.2225045*i+.7168786*o+.0606169*a)/Tn);return i===o&&o===a?e=r=u:(e=qn((.4360747*i+.3850649*o+.1430804*a)/An),r=qn((.0139322*i+.0971045*o+.7141733*a)/Sn)),new Dn(116*u-16,500*(e-u),200*(u-r),t.opacity)}function Rn(t,n,e,r){return 1===arguments.length?zn(t):new Dn(t,n,e,null==r?1:r)}function Dn(t,n,e,r){this.l=+t,this.a=+n,this.b=+e,this.opacity=+r}function qn(t){return t>Pn?Math.pow(t,1/3):t/Cn+kn}function Ln(t){return t>En?t*t*t:Cn*(t-kn)}function Un(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function On(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Bn(t){if(t instanceof Fn)return new Fn(t.h,t.c,t.l,t.opacity);if(t instanceof Dn||(t=zn(t)),0===t.a&&0===t.b)return new Fn(NaN,0,t.l,t.opacity);var n=Math.atan2(t.b,t.a)*Nn;return new Fn(n<0?n+360:n,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}function Yn(t,n,e,r){return 1===arguments.length?Bn(t):new Fn(t,n,e,null==r?1:r)}function Fn(t,n,e,r){this.h=+t,this.c=+n,this.l=+e,this.opacity=+r}Zt(Dn,Rn,Qt(Jt,{brighter:function(t){return new Dn(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker:function(t){return new Dn(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb:function(){var t=(this.l+16)/116,n=isNaN(this.a)?t:t+this.a/500,e=isNaN(this.b)?t:t-this.b/200;return new yn(Un(3.1338561*(n=An*Ln(n))-1.6168667*(t=Tn*Ln(t))-.4906146*(e=Sn*Ln(e))),Un(-.9787684*n+1.9161415*t+.033454*e),Un(.0719453*n-.2289914*t+1.4052427*e),this.opacity)}})),Zt(Fn,Yn,Qt(Jt,{brighter:function(t){return new Fn(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker:function(t){return new Fn(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb:function(){return zn(this).rgb()}}));var In=-.14861,jn=1.78277,Hn=-.29227,Xn=-.90649,Gn=1.97294,Vn=Gn*Xn,$n=Gn*jn,Wn=jn*Hn-Xn*In;function Zn(t,n,e,r){return 1===arguments.length?function(t){if(t instanceof Qn)return new Qn(t.h,t.s,t.l,t.opacity);t instanceof yn||(t=vn(t));var n=t.r/255,e=t.g/255,r=t.b/255,i=(Wn*r+Vn*n-$n*e)/(Wn+Vn-$n),o=r-i,a=(Gn*(e-i)-Hn*o)/Xn,u=Math.sqrt(a*a+o*o)/(Gn*i*(1-i)),c=u?Math.atan2(a,o)*Nn-120:NaN;return new Qn(c<0?c+360:c,u,i,t.opacity)}(t):new Qn(t,n,e,null==r?1:r)}function Qn(t,n,e,r){this.h=+t,this.s=+n,this.l=+e,this.opacity=+r}function Jn(t,n,e,r,i){var o=t*t,a=o*t;return((1-3*t+3*o-a)*n+(4-6*o+3*a)*e+(1+3*t+3*o-3*a)*r+a*i)/6}function Kn(t){var n=t.length-1;return function(e){var r=e<=0?e=0:e>=1?(e=1,n-1):Math.floor(e*n),i=t[r],o=t[r+1],a=r>0?t[r-1]:2*i-o,u=r180||e<-180?e-360*Math.round(e/360):e):ne(isNaN(t)?n:t)}function ie(t){return 1==(t=+t)?oe:function(n,e){return e-n?function(t,n,e){return t=Math.pow(t,e),n=Math.pow(n,e)-t,e=1/e,function(r){return Math.pow(t+r*n,e)}}(n,e,t):ne(isNaN(n)?e:n)}}function oe(t,n){var e=n-t;return e?ee(t,e):ne(isNaN(t)?n:t)}Zt(Qn,Zn,Qt(Jt,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new Qn(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new Qn(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*Mn,n=+this.l,e=isNaN(this.s)?0:this.s*n*(1-n),r=Math.cos(t),i=Math.sin(t);return new yn(255*(n+e*(In*r+jn*i)),255*(n+e*(Hn*r+Xn*i)),255*(n+e*(Gn*r)),this.opacity)}}));var ae=function t(n){var e=ie(n);function r(t,n){var r=e((t=gn(t)).r,(n=gn(n)).r),i=e(t.g,n.g),o=e(t.b,n.b),a=oe(t.opacity,n.opacity);return function(n){return t.r=r(n),t.g=i(n),t.b=o(n),t.opacity=a(n),t+""}}return r.gamma=t,r}(1);function ue(t){return function(n){var e,r,i=n.length,o=new Array(i),a=new Array(i),u=new Array(i);for(e=0;eo&&(i=n.slice(o,i),u[a]?u[a]+=i:u[++a]=i),(e=e[0])===(r=r[0])?u[a]?u[a]+=r:u[++a]=r:(u[++a]=null,c.push({i:a,x:he(e,r)})),o=ve.lastIndex;return o180?n+=360:n-t>180&&(t+=360),o.push({i:e.push(i(e)+"rotate(",null,r)-2,x:he(t,n)})):n&&e.push(i(e)+"rotate("+n+r)}(o.rotate,a.rotate,u,c),function(t,n,e,o){t!==n?o.push({i:e.push(i(e)+"skewX(",null,r)-2,x:he(t,n)}):n&&e.push(i(e)+"skewX("+n+r)}(o.skewX,a.skewX,u,c),function(t,n,e,r,o,a){if(t!==e||n!==r){var u=o.push(i(o)+"scale(",null,",",null,")");a.push({i:u-4,x:he(t,e)},{i:u-2,x:he(n,r)})}else 1===e&&1===r||o.push(i(o)+"scale("+e+","+r+")")}(o.scaleX,o.scaleY,a.scaleX,a.scaleY,u,c),o=a=null,function(t){for(var n,e=-1,r=c.length;++e=0&&n._call.call(null,t),n=n._next;--Ge}function ar(){Qe=(Ze=Ke.now())+Je,Ge=Ve=0;try{or()}finally{Ge=0,function(){var t,n,e=He,r=1/0;for(;e;)e._call?(r>e._time&&(r=e._time),t=e,e=e._next):(n=e._next,e._next=null,e=t?t._next=n:He=n);Xe=t,cr(r)}(),Qe=0}}function ur(){var t=Ke.now(),n=t-Ze;n>We&&(Je-=n,Ze=t)}function cr(t){Ge||(Ve&&(Ve=clearTimeout(Ve)),t-Qe>24?(t<1/0&&(Ve=setTimeout(ar,t-Ke.now()-Je)),$e&&($e=clearInterval($e))):($e||(Ze=Ke.now(),$e=setInterval(ur,We)),Ge=1,tr(ar)))}function fr(t,n,e){var r=new rr;return n=null==n?0:+n,r.restart(function(e){r.stop(),t(e+n)},n,e),r}rr.prototype=ir.prototype={constructor:rr,restart:function(t,n,e){if("function"!=typeof t)throw new TypeError("callback is not a function");e=(null==e?nr():+e)+(null==n?0:+n),this._next||Xe===this||(Xe?Xe._next=this:He=this,Xe=this),this._call=t,this._time=e,cr()},stop:function(){this._call&&(this._call=null,this._time=1/0,cr())}};var sr=I("start","end","cancel","interrupt"),lr=[],hr=0,dr=1,pr=2,vr=3,gr=4,yr=5,_r=6;function br(t,n,e,r,i,o){var a=t.__transition;if(a){if(e in a)return}else t.__transition={};!function(t,n,e){var r,i=t.__transition;function o(c){var f,s,l,h;if(e.state!==dr)return u();for(f in i)if((h=i[f]).name===e.name){if(h.state===vr)return fr(o);h.state===gr?(h.state=_r,h.timer.stop(),h.on.call("interrupt",t,t.__data__,h.index,h.group),delete i[f]):+fhr)throw new Error("too late; already scheduled");return e}function xr(t,n){var e=wr(t,n);if(e.state>vr)throw new Error("too late; already running");return e}function wr(t,n){var e=t.__transition;if(!e||!(e=e[n]))throw new Error("transition not found");return e}function Mr(t,n){var e,r,i,o=t.__transition,a=!0;if(o){for(i in n=null==n?null:n+"",o)(e=o[i]).name===n?(r=e.state>pr&&e.state=0&&(t=t.slice(0,n)),!t||"start"===t})}(n)?mr:xr;return function(){var a=o(this,t),u=a.on;u!==r&&(i=(r=u).copy()).on(n,e),a.on=i}}(e,t,n))},attr:function(t,n){var e=$(t),r="transform"===e?ke:Ar;return this.attrTween(t,"function"==typeof n?(e.local?function(t,n,e){var r,i,o;return function(){var a,u,c=e(this);if(null!=c)return(a=this.getAttributeNS(t.space,t.local))===(u=c+"")?null:a===r&&u===i?o:(i=u,o=n(r=a,c));this.removeAttributeNS(t.space,t.local)}}:function(t,n,e){var r,i,o;return function(){var a,u,c=e(this);if(null!=c)return(a=this.getAttribute(t))===(u=c+"")?null:a===r&&u===i?o:(i=u,o=n(r=a,c));this.removeAttribute(t)}})(e,r,Nr(this,"attr."+t,n)):null==n?(e.local?function(t){return function(){this.removeAttributeNS(t.space,t.local)}}:function(t){return function(){this.removeAttribute(t)}})(e):(e.local?function(t,n,e){var r,i,o=e+"";return function(){var a=this.getAttributeNS(t.space,t.local);return a===o?null:a===r?i:i=n(r=a,e)}}:function(t,n,e){var r,i,o=e+"";return function(){var a=this.getAttribute(t);return a===o?null:a===r?i:i=n(r=a,e)}})(e,r,n))},attrTween:function(t,n){var e="attr."+t;if(arguments.length<2)return(e=this.tween(e))&&e._value;if(null==n)return this.tween(e,null);if("function"!=typeof n)throw new Error;var r=$(t);return this.tween(e,(r.local?function(t,n){var e,r;function i(){var i=n.apply(this,arguments);return i!==r&&(e=(r=i)&&function(t,n){return function(e){this.setAttributeNS(t.space,t.local,n(e))}}(t,i)),e}return i._value=n,i}:function(t,n){var e,r;function i(){var i=n.apply(this,arguments);return i!==r&&(e=(r=i)&&function(t,n){return function(e){this.setAttribute(t,n(e))}}(t,i)),e}return i._value=n,i})(r,n))},style:function(t,n,e){var r="transform"==(t+="")?Se:Ar;return null==n?this.styleTween(t,function(t,n){var e,r,i;return function(){var o=ct(this,t),a=(this.style.removeProperty(t),ct(this,t));return o===a?null:o===e&&a===r?i:i=n(e=o,r=a)}}(t,r)).on("end.style."+t,Sr(t)):"function"==typeof n?this.styleTween(t,function(t,n,e){var r,i,o;return function(){var a=ct(this,t),u=e(this),c=u+"";return null==u&&(this.style.removeProperty(t),c=u=ct(this,t)),a===c?null:a===r&&c===i?o:(i=c,o=n(r=a,u))}}(t,r,Nr(this,"style."+t,n))).each(function(t,n){var e,r,i,o,a="style."+n,u="end."+a;return function(){var c=xr(this,t),f=c.on,s=null==c.value[a]?o||(o=Sr(n)):void 0;f===e&&i===s||(r=(e=f).copy()).on(u,i=s),c.on=r}}(this._id,t)):this.styleTween(t,function(t,n,e){var r,i,o=e+"";return function(){var a=ct(this,t);return a===o?null:a===r?i:i=n(r=a,e)}}(t,r,n),e).on("end.style."+t,null)},styleTween:function(t,n,e){var r="style."+(t+="");if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==n)return this.tween(r,null);if("function"!=typeof n)throw new Error;return this.tween(r,function(t,n,e){var r,i;function o(){var o=n.apply(this,arguments);return o!==i&&(r=(i=o)&&function(t,n,e){return function(r){this.style.setProperty(t,n(r),e)}}(t,o,e)),r}return o._value=n,o}(t,n,null==e?"":e))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var n=t(this);this.textContent=null==n?"":n}}(Nr(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},remove:function(){return this.on("end.remove",(t=this._id,function(){var n=this.parentNode;for(var e in this.__transition)if(+e!==t)return;n&&n.removeChild(this)}));var t},tween:function(t,n){var e=this._id;if(t+="",arguments.length<2){for(var r,i=wr(this.node(),e).tween,o=0,a=i.length;o0&&(r=o-p),M<0?h=d-v:M>0&&(a=u-v),x=vi,L.attr("cursor",xi.selection),B());break;default:return}di()},!0).on("keyup.brush",function(){switch(t.event.keyCode){case 16:P&&(y=_=P=!1,B());break;case 18:x===yi&&(w<0?s=l:w>0&&(r=o),M<0?h=d:M>0&&(a=u),x=gi,B());break;case 32:x===vi&&(t.event.altKey?(w&&(s=l-p*w,r=o+p*w),M&&(h=d-v*M,a=u+v*M),x=yi):(w<0?s=l:w>0&&(r=o),M<0?h=d:M>0&&(a=u),x=gi),L.attr("cursor",xi[m]),B());break;default:return}di()},!0).on("mousemove.brush",O,!0).on("mouseup.brush",Y,!0);It(t.event.view)}hi(),Mr(b),c.call(b),D.start()}function O(){var t=Ot(b);!P||y||_||(Math.abs(t[0]-R[0])>Math.abs(t[1]-R[1])?_=!0:y=!0),R=t,g=!0,di(),B()}function B(){var t;switch(p=R[0]-z[0],v=R[1]-z[1],x){case vi:case pi:w&&(p=Math.max(S-r,Math.min(E-s,p)),o=r+p,l=s+p),M&&(v=Math.max(k-a,Math.min(C-h,v)),u=a+v,d=h+v);break;case gi:w<0?(p=Math.max(S-r,Math.min(E-r,p)),o=r+p,l=s):w>0&&(p=Math.max(S-s,Math.min(E-s,p)),o=r,l=s+p),M<0?(v=Math.max(k-a,Math.min(C-a,v)),u=a+v,d=h):M>0&&(v=Math.max(k-h,Math.min(C-h,v)),u=a,d=h+v);break;case yi:w&&(o=Math.max(S,Math.min(E,r-p*w)),l=Math.max(S,Math.min(E,s+p*w))),M&&(u=Math.max(k,Math.min(C,a-v*M)),d=Math.max(k,Math.min(C,h+v*M)))}l1e-6)if(Math.abs(s*u-c*f)>1e-6&&i){var h=e-o,d=r-a,p=u*u+c*c,v=h*h+d*d,g=Math.sqrt(p),y=Math.sqrt(l),_=i*Math.tan((Yi-Math.acos((p+l-v)/(2*g*y)))/2),b=_/y,m=_/g;Math.abs(b-1)>1e-6&&(this._+="L"+(t+b*f)+","+(n+b*s)),this._+="A"+i+","+i+",0,0,"+ +(s*h>f*d)+","+(this._x1=t+m*u)+","+(this._y1=n+m*c)}else this._+="L"+(this._x1=t)+","+(this._y1=n);else;},arc:function(t,n,e,r,i,o){t=+t,n=+n;var a=(e=+e)*Math.cos(r),u=e*Math.sin(r),c=t+a,f=n+u,s=1^o,l=o?r-i:i-r;if(e<0)throw new Error("negative radius: "+e);null===this._x1?this._+="M"+c+","+f:(Math.abs(this._x1-c)>1e-6||Math.abs(this._y1-f)>1e-6)&&(this._+="L"+c+","+f),e&&(l<0&&(l=l%Fi+Fi),l>Ii?this._+="A"+e+","+e+",0,1,"+s+","+(t-a)+","+(n-u)+"A"+e+","+e+",0,1,"+s+","+(this._x1=c)+","+(this._y1=f):l>1e-6&&(this._+="A"+e+","+e+",0,"+ +(l>=Yi)+","+s+","+(this._x1=t+e*Math.cos(i))+","+(this._y1=n+e*Math.sin(i))))},rect:function(t,n,e,r){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +e+"v"+ +r+"h"+-e+"Z"},toString:function(){return this._}};function Zi(){}function Qi(t,n){var e=new Zi;if(t instanceof Zi)t.each(function(t,n){e.set(n,t)});else if(Array.isArray(t)){var r,i=-1,o=t.length;if(null==n)for(;++ir!=d>r&&e<(h-f)*(r-s)/(d-s)+f&&(i=-i)}return i}function so(t,n,e){var r,i,o,a;return function(t,n,e){return(n[0]-t[0])*(e[1]-t[1])==(e[0]-t[0])*(n[1]-t[1])}(t,n,e)&&(i=t[r=+(t[0]===n[0])],o=e[r],a=n[r],i<=o&&o<=a||a<=o&&o<=i)}function lo(){}var ho=[[],[[[1,1.5],[.5,1]]],[[[1.5,1],[1,1.5]]],[[[1.5,1],[.5,1]]],[[[1,.5],[1.5,1]]],[[[1,1.5],[.5,1]],[[1,.5],[1.5,1]]],[[[1,.5],[1,1.5]]],[[[1,.5],[.5,1]]],[[[.5,1],[1,.5]]],[[[1,1.5],[1,.5]]],[[[.5,1],[1,.5]],[[1.5,1],[1,1.5]]],[[[1.5,1],[1,.5]]],[[[.5,1],[1.5,1]]],[[[1,1.5],[1.5,1]]],[[[.5,1],[1,1.5]]],[]];function po(){var t=1,n=1,e=M,r=u;function i(t){var n=e(t);if(Array.isArray(n))n=n.slice().sort(ao);else{var r=s(t),i=r[0],a=r[1];n=w(i,a,n),n=g(Math.floor(i/n)*n,Math.floor(a/n)*n,n)}return n.map(function(n){return o(t,n)})}function o(e,i){var o=[],u=[];return function(e,r,i){var o,u,c,f,s,l,h=new Array,d=new Array;o=u=-1,f=e[0]>=r,ho[f<<1].forEach(p);for(;++o=r,ho[c|f<<1].forEach(p);ho[f<<0].forEach(p);for(;++u=r,s=e[u*t]>=r,ho[f<<1|s<<2].forEach(p);++o=r,l=s,s=e[u*t+o+1]>=r,ho[c|f<<1|s<<2|l<<3].forEach(p);ho[f|s<<3].forEach(p)}o=-1,s=e[u*t]>=r,ho[s<<2].forEach(p);for(;++o=r,ho[s<<2|l<<3].forEach(p);function p(t){var n,e,r=[t[0][0]+o,t[0][1]+u],c=[t[1][0]+o,t[1][1]+u],f=a(r),s=a(c);(n=d[f])?(e=h[s])?(delete d[n.end],delete h[e.start],n===e?(n.ring.push(c),i(n.ring)):h[n.start]=d[e.end]={start:n.start,end:e.end,ring:n.ring.concat(e.ring)}):(delete d[n.end],n.ring.push(c),d[n.end=s]=n):(n=h[s])?(e=d[f])?(delete h[n.start],delete d[e.end],n===e?(n.ring.push(c),i(n.ring)):h[e.start]=d[n.end]={start:e.start,end:n.end,ring:e.ring.concat(n.ring)}):(delete h[n.start],n.ring.unshift(r),h[n.start=f]=n):h[f]=d[s]={start:f,end:s,ring:[r,c]}}ho[s<<3].forEach(p)}(e,i,function(t){r(t,e,i),function(t){for(var n=0,e=t.length,r=t[e-1][1]*t[0][0]-t[e-1][0]*t[0][1];++n0?o.push([t]):u.push(t)}),u.forEach(function(t){for(var n,e=0,r=o.length;e0&&a0&&u0&&o>0))throw new Error("invalid size");return t=r,n=o,i},i.thresholds=function(t){return arguments.length?(e="function"==typeof t?t:Array.isArray(t)?uo(oo.call(t)):uo(t),i):e},i.smooth=function(t){return arguments.length?(r=t?u:lo,i):r===u},i}function vo(t,n,e){for(var r=t.width,i=t.height,o=1+(e<<1),a=0;a=e&&(u>=o&&(c-=t.data[u-o+a*r]),n.data[u-e+a*r]=c/Math.min(u+1,r-1+o-u,o))}function go(t,n,e){for(var r=t.width,i=t.height,o=1+(e<<1),a=0;a=e&&(u>=o&&(c-=t.data[a+(u-o)*r]),n.data[a+(u-e)*r]=c/Math.min(u+1,i-1+o-u,o))}function yo(t){return t[0]}function _o(t){return t[1]}function bo(){return 1}var mo={},xo={},wo=34,Mo=10,No=13;function Ao(t){return new Function("d","return {"+t.map(function(t,n){return JSON.stringify(t)+": d["+n+"]"}).join(",")+"}")}function To(t){var n=Object.create(null),e=[];return t.forEach(function(t){for(var r in t)r in n||e.push(n[r]=r)}),e}function So(t,n){var e=t+"",r=e.length;return r9999?"+"+So(n,6):So(n,4))+"-"+So(t.getUTCMonth()+1,2)+"-"+So(t.getUTCDate(),2)+(o?"T"+So(e,2)+":"+So(r,2)+":"+So(i,2)+"."+So(o,3)+"Z":i?"T"+So(e,2)+":"+So(r,2)+":"+So(i,2)+"Z":r||e?"T"+So(e,2)+":"+So(r,2)+"Z":"")}function Eo(t){var n=new RegExp('["'+t+"\n\r]"),e=t.charCodeAt(0);function r(t,n){var r,i=[],o=t.length,a=0,u=0,c=o<=0,f=!1;function s(){if(c)return xo;if(f)return f=!1,mo;var n,r,i=a;if(t.charCodeAt(i)===wo){for(;a++=o?c=!0:(r=t.charCodeAt(a++))===Mo?f=!0:r===No&&(f=!0,t.charCodeAt(a)===Mo&&++a),t.slice(i+1,n-1).replace(/""/g,'"')}for(;a=(o=(v+y)/2))?v=o:y=o,(s=e>=(a=(g+_)/2))?g=a:_=a,i=d,!(d=d[l=s<<1|f]))return i[l]=p,t;if(u=+t._x.call(null,d.data),c=+t._y.call(null,d.data),n===u&&e===c)return p.next=d,i?i[l]=p:t._root=p,t;do{i=i?i[l]=new Array(4):t._root=new Array(4),(f=n>=(o=(v+y)/2))?v=o:y=o,(s=e>=(a=(g+_)/2))?g=a:_=a}while((l=s<<1|f)==(h=(c>=a)<<1|u>=o));return i[h]=d,i[l]=p,t}function ra(t,n,e,r,i){this.node=t,this.x0=n,this.y0=e,this.x1=r,this.y1=i}function ia(t){return t[0]}function oa(t){return t[1]}function aa(t,n,e){var r=new ua(null==n?ia:n,null==e?oa:e,NaN,NaN,NaN,NaN);return null==t?r:r.addAll(t)}function ua(t,n,e,r,i,o){this._x=t,this._y=n,this._x0=e,this._y0=r,this._x1=i,this._y1=o,this._root=void 0}function ca(t){for(var n={data:t.data},e=n;t=t.next;)e=e.next={data:t.data};return n}var fa=aa.prototype=ua.prototype;function sa(t){return t.x+t.vx}function la(t){return t.y+t.vy}function ha(t){return t.index}function da(t,n){var e=t.get(n);if(!e)throw new Error("missing: "+n);return e}function pa(t){return t.x}function va(t){return t.y}fa.copy=function(){var t,n,e=new ua(this._x,this._y,this._x0,this._y0,this._x1,this._y1),r=this._root;if(!r)return e;if(!r.length)return e._root=ca(r),e;for(t=[{source:r,target:e._root=new Array(4)}];r=t.pop();)for(var i=0;i<4;++i)(n=r.source[i])&&(n.length?t.push({source:n,target:r.target[i]=new Array(4)}):r.target[i]=ca(n));return e},fa.add=function(t){var n=+this._x.call(null,t),e=+this._y.call(null,t);return ea(this.cover(n,e),n,e,t)},fa.addAll=function(t){var n,e,r,i,o=t.length,a=new Array(o),u=new Array(o),c=1/0,f=1/0,s=-1/0,l=-1/0;for(e=0;es&&(s=r),il&&(l=i));if(c>s||f>l)return this;for(this.cover(c,f).cover(s,l),e=0;et||t>=i||r>n||n>=o;)switch(u=(nh||(o=c.y0)>d||(a=c.x1)=y)<<1|t>=g)&&(c=p[p.length-1],p[p.length-1]=p[p.length-1-f],p[p.length-1-f]=c)}else{var _=t-+this._x.call(null,v.data),b=n-+this._y.call(null,v.data),m=_*_+b*b;if(m=(u=(p+g)/2))?p=u:g=u,(s=a>=(c=(v+y)/2))?v=c:y=c,n=d,!(d=d[l=s<<1|f]))return this;if(!d.length)break;(n[l+1&3]||n[l+2&3]||n[l+3&3])&&(e=n,h=l)}for(;d.data!==t;)if(r=d,!(d=d.next))return this;return(i=d.next)&&delete d.next,r?(i?r.next=i:delete r.next,this):n?(i?n[l]=i:delete n[l],(d=n[0]||n[1]||n[2]||n[3])&&d===(n[3]||n[2]||n[1]||n[0])&&!d.length&&(e?e[h]=d:this._root=d),this):(this._root=i,this)},fa.removeAll=function(t){for(var n=0,e=t.length;n1?r[0]+r.slice(2):r,+t.slice(e+1)]}function ba(t){return(t=_a(Math.abs(t)))?t[1]:NaN}var ma,xa=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function wa(t){return new Ma(t)}function Ma(t){if(!(n=xa.exec(t)))throw new Error("invalid format: "+t);var n;this.fill=n[1]||" ",this.align=n[2]||">",this.sign=n[3]||"-",this.symbol=n[4]||"",this.zero=!!n[5],this.width=n[6]&&+n[6],this.comma=!!n[7],this.precision=n[8]&&+n[8].slice(1),this.trim=!!n[9],this.type=n[10]||""}function Na(t,n){var e=_a(t,n);if(!e)return t+"";var r=e[0],i=e[1];return i<0?"0."+new Array(-i).join("0")+r:r.length>i+1?r.slice(0,i+1)+"."+r.slice(i+1):r+new Array(i-r.length+2).join("0")}wa.prototype=Ma.prototype,Ma.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(null==this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(null==this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var Aa={"%":function(t,n){return(100*t).toFixed(n)},b:function(t){return Math.round(t).toString(2)},c:function(t){return t+""},d:function(t){return Math.round(t).toString(10)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},g:function(t,n){return t.toPrecision(n)},o:function(t){return Math.round(t).toString(8)},p:function(t,n){return Na(100*t,n)},r:Na,s:function(t,n){var e=_a(t,n);if(!e)return t+"";var r=e[0],i=e[1],o=i-(ma=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,a=r.length;return o===a?r:o>a?r+new Array(o-a+1).join("0"):o>0?r.slice(0,o)+"."+r.slice(o):"0."+new Array(1-o).join("0")+_a(t,Math.max(0,n+o-1))[0]},X:function(t){return Math.round(t).toString(16).toUpperCase()},x:function(t){return Math.round(t).toString(16)}};function Ta(t){return t}var Sa,ka=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Ea(t){var n,e,r=t.grouping&&t.thousands?(n=t.grouping,e=t.thousands,function(t,r){for(var i=t.length,o=[],a=0,u=n[0],c=0;i>0&&u>0&&(c+u+1>r&&(u=Math.max(1,r-c)),o.push(t.substring(i-=u,i+u)),!((c+=u+1)>r));)u=n[a=(a+1)%n.length];return o.reverse().join(e)}):Ta,i=t.currency,o=t.decimal,a=t.numerals?function(t){return function(n){return n.replace(/[0-9]/g,function(n){return t[+n]})}}(t.numerals):Ta,u=t.percent||"%";function c(t){var n=(t=wa(t)).fill,e=t.align,c=t.sign,f=t.symbol,s=t.zero,l=t.width,h=t.comma,d=t.precision,p=t.trim,v=t.type;"n"===v?(h=!0,v="g"):Aa[v]||(null==d&&(d=12),p=!0,v="g"),(s||"0"===n&&"="===e)&&(s=!0,n="0",e="=");var g="$"===f?i[0]:"#"===f&&/[boxX]/.test(v)?"0"+v.toLowerCase():"",y="$"===f?i[1]:/[%p]/.test(v)?u:"",_=Aa[v],b=/[defgprs%]/.test(v);function m(t){var i,u,f,m=g,x=y;if("c"===v)x=_(t)+x,t="";else{var w=(t=+t)<0;if(t=_(Math.abs(t),d),p&&(t=function(t){t:for(var n,e=t.length,r=1,i=-1;r0){if(!+t[r])break t;i=0}}return i>0?t.slice(0,i)+t.slice(n+1):t}(t)),w&&0==+t&&(w=!1),m=(w?"("===c?c:"-":"-"===c||"("===c?"":c)+m,x=("s"===v?ka[8+ma/3]:"")+x+(w&&"("===c?")":""),b)for(i=-1,u=t.length;++i(f=t.charCodeAt(i))||f>57){x=(46===f?o+t.slice(i+1):t.slice(i))+x,t=t.slice(0,i);break}}h&&!s&&(t=r(t,1/0));var M=m.length+t.length+x.length,N=M>1)+m+t+x+N.slice(M);break;default:t=N+m+t+x}return a(t)}return d=null==d?6:/[gprs]/.test(v)?Math.max(1,Math.min(21,d)):Math.max(0,Math.min(20,d)),m.toString=function(){return t+""},m}return{format:c,formatPrefix:function(t,n){var e=c(((t=wa(t)).type="f",t)),r=3*Math.max(-8,Math.min(8,Math.floor(ba(n)/3))),i=Math.pow(10,-r),o=ka[8+r/3];return function(t){return e(i*t)+o}}}}function Ca(n){return Sa=Ea(n),t.format=Sa.format,t.formatPrefix=Sa.formatPrefix,Sa}function Pa(t){return Math.max(0,-ba(Math.abs(t)))}function za(t,n){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(ba(n)/3)))-ba(Math.abs(t)))}function Ra(t,n){return t=Math.abs(t),n=Math.abs(n)-t,Math.max(0,ba(n)-ba(t))+1}function Da(){return new qa}function qa(){this.reset()}Ca({decimal:".",thousands:",",grouping:[3],currency:["$",""]}),qa.prototype={constructor:qa,reset:function(){this.s=this.t=0},add:function(t){Ua(La,t,this.t),Ua(this,La.s,this.s),this.s?this.t+=La.t:this.s=La.t},valueOf:function(){return this.s}};var La=new qa;function Ua(t,n,e){var r=t.s=n+e,i=r-n,o=r-i;t.t=n-o+(e-i)}var Oa=1e-6,Ba=1e-12,Ya=Math.PI,Fa=Ya/2,Ia=Ya/4,ja=2*Ya,Ha=180/Ya,Xa=Ya/180,Ga=Math.abs,Va=Math.atan,$a=Math.atan2,Wa=Math.cos,Za=Math.ceil,Qa=Math.exp,Ja=Math.log,Ka=Math.pow,tu=Math.sin,nu=Math.sign||function(t){return t>0?1:t<0?-1:0},eu=Math.sqrt,ru=Math.tan;function iu(t){return t>1?0:t<-1?Ya:Math.acos(t)}function ou(t){return t>1?Fa:t<-1?-Fa:Math.asin(t)}function au(t){return(t=tu(t/2))*t}function uu(){}function cu(t,n){t&&su.hasOwnProperty(t.type)&&su[t.type](t,n)}var fu={Feature:function(t,n){cu(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++r=0?1:-1,i=r*e,o=Wa(n=(n*=Xa)/2+Ia),a=tu(n),u=_u*a,c=yu*o+u*Wa(i),f=u*r*tu(i);bu.add($a(f,c)),gu=t,yu=o,_u=a}function Tu(t){return[$a(t[1],t[0]),ou(t[2])]}function Su(t){var n=t[0],e=t[1],r=Wa(e);return[r*Wa(n),r*tu(n),tu(e)]}function ku(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function Eu(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function Cu(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function Pu(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function zu(t){var n=eu(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}var Ru,Du,qu,Lu,Uu,Ou,Bu,Yu,Fu,Iu,ju,Hu,Xu,Gu,Vu,$u,Wu,Zu,Qu,Ju,Ku,tc,nc,ec,rc,ic,oc=Da(),ac={point:uc,lineStart:fc,lineEnd:sc,polygonStart:function(){ac.point=lc,ac.lineStart=hc,ac.lineEnd=dc,oc.reset(),xu.polygonStart()},polygonEnd:function(){xu.polygonEnd(),ac.point=uc,ac.lineStart=fc,ac.lineEnd=sc,bu<0?(Ru=-(qu=180),Du=-(Lu=90)):oc>Oa?Lu=90:oc<-Oa&&(Du=-90),Iu[0]=Ru,Iu[1]=qu}};function uc(t,n){Fu.push(Iu=[Ru=t,qu=t]),nLu&&(Lu=n)}function cc(t,n){var e=Su([t*Xa,n*Xa]);if(Yu){var r=Eu(Yu,e),i=Eu([r[1],-r[0],0],r);zu(i),i=Tu(i);var o,a=t-Uu,u=a>0?1:-1,c=i[0]*Ha*u,f=Ga(a)>180;f^(u*UuLu&&(Lu=o):f^(u*Uu<(c=(c+360)%360-180)&&cLu&&(Lu=n)),f?tpc(Ru,qu)&&(qu=t):pc(t,qu)>pc(Ru,qu)&&(Ru=t):qu>=Ru?(tqu&&(qu=t)):t>Uu?pc(Ru,t)>pc(Ru,qu)&&(qu=t):pc(t,qu)>pc(Ru,qu)&&(Ru=t)}else Fu.push(Iu=[Ru=t,qu=t]);nLu&&(Lu=n),Yu=e,Uu=t}function fc(){ac.point=cc}function sc(){Iu[0]=Ru,Iu[1]=qu,ac.point=uc,Yu=null}function lc(t,n){if(Yu){var e=t-Uu;oc.add(Ga(e)>180?e+(e>0?360:-360):e)}else Ou=t,Bu=n;xu.point(t,n),cc(t,n)}function hc(){xu.lineStart()}function dc(){lc(Ou,Bu),xu.lineEnd(),Ga(oc)>Oa&&(Ru=-(qu=180)),Iu[0]=Ru,Iu[1]=qu,Yu=null}function pc(t,n){return(n-=t)<0?n+360:n}function vc(t,n){return t[0]-n[0]}function gc(t,n){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nYa?t+Math.round(-t/ja)*ja:t,n]}function Pc(t,n,e){return(t%=ja)?n||e?Ec(Rc(t),Dc(n,e)):Rc(t):n||e?Dc(n,e):Cc}function zc(t){return function(n,e){return[(n+=t)>Ya?n-ja:n<-Ya?n+ja:n,e]}}function Rc(t){var n=zc(t);return n.invert=zc(-t),n}function Dc(t,n){var e=Wa(t),r=tu(t),i=Wa(n),o=tu(n);function a(t,n){var a=Wa(n),u=Wa(t)*a,c=tu(t)*a,f=tu(n),s=f*e+u*r;return[$a(c*i-s*o,u*e-f*r),ou(s*i+c*o)]}return a.invert=function(t,n){var a=Wa(n),u=Wa(t)*a,c=tu(t)*a,f=tu(n),s=f*i-c*o;return[$a(c*i+f*o,u*e+s*r),ou(s*e-u*r)]},a}function qc(t){function n(n){return(n=t(n[0]*Xa,n[1]*Xa))[0]*=Ha,n[1]*=Ha,n}return t=Pc(t[0]*Xa,t[1]*Xa,t.length>2?t[2]*Xa:0),n.invert=function(n){return(n=t.invert(n[0]*Xa,n[1]*Xa))[0]*=Ha,n[1]*=Ha,n},n}function Lc(t,n,e,r,i,o){if(e){var a=Wa(n),u=tu(n),c=r*e;null==i?(i=n+r*ja,o=n-c/2):(i=Uc(a,i),o=Uc(a,o),(r>0?io)&&(i+=r*ja));for(var f,s=i;r>0?s>o:s1&&n.push(n.pop().concat(n.shift()))},result:function(){var e=n;return n=[],t=null,e}}}function Bc(t,n){return Ga(t[0]-n[0])=0;--o)i.point((s=f[o])[0],s[1]);else r(h.x,h.p.x,-1,i);h=h.p}f=(h=h.o).z,d=!d}while(!h.v);i.lineEnd()}}}function Ic(t){if(n=t.length){for(var n,e,r=0,i=t[0];++r=0?1:-1,A=N*M,T=A>Ya,S=v*x;if(jc.add($a(S*N*tu(A),g*w+S*Wa(A))),a+=T?M+N*ja:M,T^d>=e^b>=e){var k=Eu(Su(h),Su(_));zu(k);var E=Eu(o,k);zu(E);var C=(T^M>=0?-1:1)*ou(E[2]);(r>C||r===C&&(k[0]||k[1]))&&(u+=T^M>=0?1:-1)}}return(a<-Oa||a0){for(l||(i.polygonStart(),l=!0),i.lineStart(),t=0;t1&&2&c&&h.push(h.pop().concat(h.shift())),a.push(h.filter(Gc))}return h}}function Gc(t){return t.length>1}function Vc(t,n){return((t=t.x)[0]<0?t[1]-Fa-Oa:Fa-t[1])-((n=n.x)[0]<0?n[1]-Fa-Oa:Fa-n[1])}var $c=Xc(function(){return!0},function(t){var n,e=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),n=1},point:function(o,a){var u=o>0?Ya:-Ya,c=Ga(o-e);Ga(c-Ya)0?Fa:-Fa),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),t.point(o,r),n=0):i!==u&&c>=Ya&&(Ga(e-i)Oa?Va((tu(n)*(o=Wa(r))*tu(e)-tu(r)*(i=Wa(n))*tu(t))/(i*o*a)):(n+r)/2}(e,r,o,a),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(u,r),n=0),t.point(e=o,r=a),i=u},lineEnd:function(){t.lineEnd(),e=r=NaN},clean:function(){return 2-n}}},function(t,n,e,r){var i;if(null==t)i=e*Fa,r.point(-Ya,i),r.point(0,i),r.point(Ya,i),r.point(Ya,0),r.point(Ya,-i),r.point(0,-i),r.point(-Ya,-i),r.point(-Ya,0),r.point(-Ya,i);else if(Ga(t[0]-n[0])>Oa){var o=t[0]0,i=Ga(n)>Oa;function o(t,e){return Wa(t)*Wa(e)>n}function a(t,e,r){var i=[1,0,0],o=Eu(Su(t),Su(e)),a=ku(o,o),u=o[0],c=a-u*u;if(!c)return!r&&t;var f=n*a/c,s=-n*u/c,l=Eu(i,o),h=Pu(i,f);Cu(h,Pu(o,s));var d=l,p=ku(h,d),v=ku(d,d),g=p*p-v*(ku(h,h)-1);if(!(g<0)){var y=eu(g),_=Pu(d,(-p-y)/v);if(Cu(_,h),_=Tu(_),!r)return _;var b,m=t[0],x=e[0],w=t[1],M=e[1];x0^_[1]<(Ga(_[0]-m)Ya^(m<=_[0]&&_[0]<=x)){var T=Pu(d,(-p+y)/v);return Cu(T,h),[_,Tu(T)]}}}function u(n,e){var i=r?t:Ya-t,o=0;return n<-i?o|=1:n>i&&(o|=2),e<-i?o|=4:e>i&&(o|=8),o}return Xc(o,function(t){var n,e,c,f,s;return{lineStart:function(){f=c=!1,s=1},point:function(l,h){var d,p=[l,h],v=o(l,h),g=r?v?0:u(l,h):v?u(l+(l<0?Ya:-Ya),h):0;if(!n&&(f=c=v)&&t.lineStart(),v!==c&&(!(d=a(n,p))||Bc(n,d)||Bc(p,d))&&(p[0]+=Oa,p[1]+=Oa,v=o(p[0],p[1])),v!==c)s=0,v?(t.lineStart(),d=a(p,n),t.point(d[0],d[1])):(d=a(n,p),t.point(d[0],d[1]),t.lineEnd()),n=d;else if(i&&n&&r^v){var y;g&e||!(y=a(p,n,!0))||(s=0,r?(t.lineStart(),t.point(y[0][0],y[0][1]),t.point(y[1][0],y[1][1]),t.lineEnd()):(t.point(y[1][0],y[1][1]),t.lineEnd(),t.lineStart(),t.point(y[0][0],y[0][1])))}!v||n&&Bc(n,p)||t.point(p[0],p[1]),n=p,c=v,e=g},lineEnd:function(){c&&t.lineEnd(),n=null},clean:function(){return s|(f&&c)<<1}}},function(n,r,i,o){Lc(o,t,e,i,n,r)},r?[0,-t]:[-Ya,t-Ya])}var Zc=1e9,Qc=-Zc;function Jc(t,n,e,r){function i(i,o){return t<=i&&i<=e&&n<=o&&o<=r}function o(i,o,u,f){var s=0,l=0;if(null==i||(s=a(i,u))!==(l=a(o,u))||c(i,o)<0^u>0)do{f.point(0===s||3===s?t:e,s>1?r:n)}while((s=(s+u+4)%4)!==l);else f.point(o[0],o[1])}function a(r,i){return Ga(r[0]-t)0?0:3:Ga(r[0]-e)0?2:1:Ga(r[1]-n)0?1:0:i>0?3:2}function u(t,n){return c(t.x,n.x)}function c(t,n){var e=a(t,1),r=a(n,1);return e!==r?e-r:0===e?n[1]-t[1]:1===e?t[0]-n[0]:2===e?t[1]-n[1]:n[0]-t[0]}return function(a){var c,f,s,l,h,d,p,v,g,y,_,b=a,m=Oc(),x={point:w,lineStart:function(){x.point=M,f&&f.push(s=[]);y=!0,g=!1,p=v=NaN},lineEnd:function(){c&&(M(l,h),d&&g&&m.rejoin(),c.push(m.result()));x.point=w,g&&b.lineEnd()},polygonStart:function(){b=m,c=[],f=[],_=!0},polygonEnd:function(){var n=function(){for(var n=0,e=0,i=f.length;er&&(h-o)*(r-a)>(d-a)*(t-o)&&++n:d<=r&&(h-o)*(r-a)<(d-a)*(t-o)&&--n;return n}(),e=_&&n,i=(c=T(c)).length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),o(null,null,1,a),a.lineEnd()),i&&Fc(c,u,n,o,a),a.polygonEnd());b=a,c=f=s=null}};function w(t,n){i(t,n)&&b.point(t,n)}function M(o,a){var u=i(o,a);if(f&&s.push([o,a]),y)l=o,h=a,d=u,y=!1,u&&(b.lineStart(),b.point(o,a));else if(u&&g)b.point(o,a);else{var c=[p=Math.max(Qc,Math.min(Zc,p)),v=Math.max(Qc,Math.min(Zc,v))],m=[o=Math.max(Qc,Math.min(Zc,o)),a=Math.max(Qc,Math.min(Zc,a))];!function(t,n,e,r,i,o){var a,u=t[0],c=t[1],f=0,s=1,l=n[0]-u,h=n[1]-c;if(a=e-u,l||!(a>0)){if(a/=l,l<0){if(a0){if(a>s)return;a>f&&(f=a)}if(a=i-u,l||!(a<0)){if(a/=l,l<0){if(a>s)return;a>f&&(f=a)}else if(l>0){if(a0)){if(a/=h,h<0){if(a0){if(a>s)return;a>f&&(f=a)}if(a=o-c,h||!(a<0)){if(a/=h,h<0){if(a>s)return;a>f&&(f=a)}else if(h>0){if(a0&&(t[0]=u+f*l,t[1]=c+f*h),s<1&&(n[0]=u+s*l,n[1]=c+s*h),!0}}}}}(c,m,t,n,e,r)?u&&(b.lineStart(),b.point(o,a),_=!1):(g||(b.lineStart(),b.point(c[0],c[1])),b.point(m[0],m[1]),u||b.lineEnd(),_=!1)}p=o,v=a,g=u}return x}}var Kc,tf,nf,ef=Da(),rf={sphere:uu,point:uu,lineStart:function(){rf.point=af,rf.lineEnd=of},lineEnd:uu,polygonStart:uu,polygonEnd:uu};function of(){rf.point=rf.lineEnd=uu}function af(t,n){Kc=t*=Xa,tf=tu(n*=Xa),nf=Wa(n),rf.point=uf}function uf(t,n){t*=Xa;var e=tu(n*=Xa),r=Wa(n),i=Ga(t-Kc),o=Wa(i),a=r*tu(i),u=nf*e-tf*r*o,c=tf*e+nf*r*o;ef.add($a(eu(a*a+u*u),c)),Kc=t,tf=e,nf=r}function cf(t){return ef.reset(),du(t,rf),+ef}var ff=[null,null],sf={type:"LineString",coordinates:ff};function lf(t,n){return ff[0]=t,ff[1]=n,cf(sf)}var hf={Feature:function(t,n){return pf(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,i=e.length;++rOa}).map(c)).concat(g(Za(o/d)*d,i,d).filter(function(t){return Ga(t%v)>Oa}).map(f))}return _.lines=function(){return b().map(function(t){return{type:"LineString",coordinates:t}})},_.outline=function(){return{type:"Polygon",coordinates:[s(r).concat(l(a).slice(1),s(e).reverse().slice(1),l(u).reverse().slice(1))]}},_.extent=function(t){return arguments.length?_.extentMajor(t).extentMinor(t):_.extentMinor()},_.extentMajor=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],u=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),u>a&&(t=u,u=a,a=t),_.precision(y)):[[r,u],[e,a]]},_.extentMinor=function(e){return arguments.length?(n=+e[0][0],t=+e[1][0],o=+e[0][1],i=+e[1][1],n>t&&(e=n,n=t,t=e),o>i&&(e=o,o=i,i=e),_.precision(y)):[[n,o],[t,i]]},_.step=function(t){return arguments.length?_.stepMajor(t).stepMinor(t):_.stepMinor()},_.stepMajor=function(t){return arguments.length?(p=+t[0],v=+t[1],_):[p,v]},_.stepMinor=function(t){return arguments.length?(h=+t[0],d=+t[1],_):[h,d]},_.precision=function(h){return arguments.length?(y=+h,c=mf(o,i,90),f=xf(n,t,y),s=mf(u,a,90),l=xf(r,e,y),_):y},_.extentMajor([[-180,-90+Oa],[180,90-Oa]]).extentMinor([[-180,-80-Oa],[180,80+Oa]])}function Mf(t){return t}var Nf,Af,Tf,Sf,kf=Da(),Ef=Da(),Cf={point:uu,lineStart:uu,lineEnd:uu,polygonStart:function(){Cf.lineStart=Pf,Cf.lineEnd=Df},polygonEnd:function(){Cf.lineStart=Cf.lineEnd=Cf.point=uu,kf.add(Ga(Ef)),Ef.reset()},result:function(){var t=kf/2;return kf.reset(),t}};function Pf(){Cf.point=zf}function zf(t,n){Cf.point=Rf,Nf=Tf=t,Af=Sf=n}function Rf(t,n){Ef.add(Sf*t-Tf*n),Tf=t,Sf=n}function Df(){Rf(Nf,Af)}var qf=1/0,Lf=qf,Uf=-qf,Of=Uf,Bf={point:function(t,n){tUf&&(Uf=t);nOf&&(Of=n)},lineStart:uu,lineEnd:uu,polygonStart:uu,polygonEnd:uu,result:function(){var t=[[qf,Lf],[Uf,Of]];return Uf=Of=-(Lf=qf=1/0),t}};var Yf,Ff,If,jf,Hf=0,Xf=0,Gf=0,Vf=0,$f=0,Wf=0,Zf=0,Qf=0,Jf=0,Kf={point:ts,lineStart:ns,lineEnd:is,polygonStart:function(){Kf.lineStart=os,Kf.lineEnd=as},polygonEnd:function(){Kf.point=ts,Kf.lineStart=ns,Kf.lineEnd=is},result:function(){var t=Jf?[Zf/Jf,Qf/Jf]:Wf?[Vf/Wf,$f/Wf]:Gf?[Hf/Gf,Xf/Gf]:[NaN,NaN];return Hf=Xf=Gf=Vf=$f=Wf=Zf=Qf=Jf=0,t}};function ts(t,n){Hf+=t,Xf+=n,++Gf}function ns(){Kf.point=es}function es(t,n){Kf.point=rs,ts(If=t,jf=n)}function rs(t,n){var e=t-If,r=n-jf,i=eu(e*e+r*r);Vf+=i*(If+t)/2,$f+=i*(jf+n)/2,Wf+=i,ts(If=t,jf=n)}function is(){Kf.point=ts}function os(){Kf.point=us}function as(){cs(Yf,Ff)}function us(t,n){Kf.point=cs,ts(Yf=If=t,Ff=jf=n)}function cs(t,n){var e=t-If,r=n-jf,i=eu(e*e+r*r);Vf+=i*(If+t)/2,$f+=i*(jf+n)/2,Wf+=i,Zf+=(i=jf*t-If*n)*(If+t),Qf+=i*(jf+n),Jf+=3*i,ts(If=t,jf=n)}function fs(t){this._context=t}fs.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._context.moveTo(t,n),this._point=1;break;case 1:this._context.lineTo(t,n);break;default:this._context.moveTo(t+this._radius,n),this._context.arc(t,n,this._radius,0,ja)}},result:uu};var ss,ls,hs,ds,ps,vs=Da(),gs={point:uu,lineStart:function(){gs.point=ys},lineEnd:function(){ss&&_s(ls,hs),gs.point=uu},polygonStart:function(){ss=!0},polygonEnd:function(){ss=null},result:function(){var t=+vs;return vs.reset(),t}};function ys(t,n){gs.point=_s,ls=ds=t,hs=ps=n}function _s(t,n){ds-=t,ps-=n,vs.add(eu(ds*ds+ps*ps)),ds=t,ps=n}function bs(){this._string=[]}function ms(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function xs(t){return function(n){var e=new ws;for(var r in t)e[r]=t[r];return e.stream=n,e}}function ws(){}function Ms(t,n,e){var r=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=r&&t.clipExtent(null),du(e,t.stream(Bf)),n(Bf.result()),null!=r&&t.clipExtent(r),t}function Ns(t,n,e){return Ms(t,function(e){var r=n[1][0]-n[0][0],i=n[1][1]-n[0][1],o=Math.min(r/(e[1][0]-e[0][0]),i/(e[1][1]-e[0][1])),a=+n[0][0]+(r-o*(e[1][0]+e[0][0]))/2,u=+n[0][1]+(i-o*(e[1][1]+e[0][1]))/2;t.scale(150*o).translate([a,u])},e)}function As(t,n,e){return Ns(t,[[0,0],n],e)}function Ts(t,n,e){return Ms(t,function(e){var r=+n,i=r/(e[1][0]-e[0][0]),o=(r-i*(e[1][0]+e[0][0]))/2,a=-i*e[0][1];t.scale(150*i).translate([o,a])},e)}function Ss(t,n,e){return Ms(t,function(e){var r=+n,i=r/(e[1][1]-e[0][1]),o=-i*e[0][0],a=(r-i*(e[1][1]+e[0][1]))/2;t.scale(150*i).translate([o,a])},e)}bs.prototype={_radius:4.5,_circle:ms(4.5),pointRadius:function(t){return(t=+t)!==this._radius&&(this._radius=t,this._circle=null),this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._string.push("Z"),this._point=NaN},point:function(t,n){switch(this._point){case 0:this._string.push("M",t,",",n),this._point=1;break;case 1:this._string.push("L",t,",",n);break;default:null==this._circle&&(this._circle=ms(this._radius)),this._string.push("M",t,",",n,this._circle)}},result:function(){if(this._string.length){var t=this._string.join("");return this._string=[],t}return null}},ws.prototype={constructor:ws,point:function(t,n){this.stream.point(t,n)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var ks=16,Es=Wa(30*Xa);function Cs(t,n){return+n?function(t,n){function e(r,i,o,a,u,c,f,s,l,h,d,p,v,g){var y=f-r,_=s-i,b=y*y+_*_;if(b>4*n&&v--){var m=a+h,x=u+d,w=c+p,M=eu(m*m+x*x+w*w),N=ou(w/=M),A=Ga(Ga(w)-1)n||Ga((y*E+_*C)/b-.5)>.3||a*h+u*d+c*p2?t[2]%360*Xa:0,S()):[g*Ha,y*Ha,_*Ha]},A.angle=function(t){return arguments.length?(b=t%360*Xa,S()):b*Ha},A.precision=function(t){return arguments.length?(a=Cs(u,N=t*t),k()):eu(N)},A.fitExtent=function(t,n){return Ns(A,t,n)},A.fitSize=function(t,n){return As(A,t,n)},A.fitWidth=function(t,n){return Ts(A,t,n)},A.fitHeight=function(t,n){return Ss(A,t,n)},function(){return n=t.apply(this,arguments),A.invert=n.invert&&T,S()}}function qs(t){var n=0,e=Ya/3,r=Ds(t),i=r(n,e);return i.parallels=function(t){return arguments.length?r(n=t[0]*Xa,e=t[1]*Xa):[n*Ha,e*Ha]},i}function Ls(t,n){var e=tu(t),r=(e+tu(n))/2;if(Ga(r)0?n<-Fa+Oa&&(n=-Fa+Oa):n>Fa-Oa&&(n=Fa-Oa);var e=i/Ka(Xs(n),r);return[e*tu(r*t),i-e*Wa(r*t)]}return o.invert=function(t,n){var e=i-n,o=nu(r)*eu(t*t+e*e);return[$a(t,Ga(e))/r*nu(e),2*Va(Ka(i/o,1/r))-Fa]},o}function Vs(t,n){return[t,n]}function $s(t,n){var e=Wa(t),r=t===n?tu(t):(e-Wa(n))/(n-t),i=e/r+t;if(Ga(r)=0;)n+=e[r].value;else n=1;t.value=n}function ll(t,n){var e,r,i,o,a,u=new vl(t),c=+t.value&&(u.value=t.value),f=[u];for(null==n&&(n=hl);e=f.pop();)if(c&&(e.value=+e.data.value),(i=n(e.data))&&(a=i.length))for(e.children=new Array(a),o=a-1;o>=0;--o)f.push(r=e.children[o]=new vl(i[o])),r.parent=e,r.depth=e.depth+1;return u.eachBefore(pl)}function hl(t){return t.children}function dl(t){t.data=t.data.data}function pl(t){var n=0;do{t.height=n}while((t=t.parent)&&t.height<++n)}function vl(t){this.data=t,this.depth=this.height=0,this.parent=null}tl.invert=function(t,n){for(var e,r=n,i=r*r,o=i*i*i,a=0;a<12&&(o=(i=(r-=e=(r*(Ws+Zs*i+o*(Qs+Js*i))-n)/(Ws+3*Zs*i+o*(7*Qs+9*Js*i)))*r)*i*i,!(Ga(e)Oa&&--i>0);return[t/(.8707+(o=r*r)*(o*(o*o*o*(.003971-.001529*o)-.013791)-.131979)),r]},il.invert=Ys(ou),ol.invert=Ys(function(t){return 2*Va(t)}),al.invert=function(t,n){return[-n,2*Va(Qa(t))-Fa]},vl.prototype=ll.prototype={constructor:vl,count:function(){return this.eachAfter(sl)},each:function(t){var n,e,r,i,o=this,a=[o];do{for(n=a.reverse(),a=[];o=n.pop();)if(t(o),e=o.children)for(r=0,i=e.length;r=0;--e)i.push(n[e]);return this},sum:function(t){return this.eachAfter(function(n){for(var e=+t(n.data)||0,r=n.children,i=r&&r.length;--i>=0;)e+=r[i].value;n.value=e})},sort:function(t){return this.eachBefore(function(n){n.children&&n.children.sort(t)})},path:function(t){for(var n=this,e=function(t,n){if(t===n)return t;var e=t.ancestors(),r=n.ancestors(),i=null;for(t=e.pop(),n=r.pop();t===n;)i=t,t=e.pop(),n=r.pop();return i}(n,t),r=[n];n!==e;)n=n.parent,r.push(n);for(var i=r.length;t!==e;)r.splice(i,0,t),t=t.parent;return r},ancestors:function(){for(var t=this,n=[t];t=t.parent;)n.push(t);return n},descendants:function(){var t=[];return this.each(function(n){t.push(n)}),t},leaves:function(){var t=[];return this.eachBefore(function(n){n.children||t.push(n)}),t},links:function(){var t=this,n=[];return t.each(function(e){e!==t&&n.push({source:e.parent,target:e})}),n},copy:function(){return ll(this).eachBefore(dl)}};var gl=Array.prototype.slice;function yl(t){for(var n,e,r=0,i=(t=function(t){for(var n,e,r=t.length;r;)e=Math.random()*r--|0,n=t[r],t[r]=t[e],t[e]=n;return t}(gl.call(t))).length,o=[];r0&&e*e>r*r+i*i}function xl(t,n){for(var e=0;e(a*=a)?(r=(f+a-i)/(2*f),o=Math.sqrt(Math.max(0,a/f-r*r)),e.x=t.x-r*u-o*c,e.y=t.y-r*c+o*u):(r=(f+i-a)/(2*f),o=Math.sqrt(Math.max(0,i/f-r*r)),e.x=n.x+r*u-o*c,e.y=n.y+r*c+o*u)):(e.x=n.x+e.r,e.y=n.y)}function Tl(t,n){var e=t.r+n.r-1e-6,r=n.x-t.x,i=n.y-t.y;return e>0&&e*e>r*r+i*i}function Sl(t){var n=t._,e=t.next._,r=n.r+e.r,i=(n.x*e.r+e.x*n.r)/r,o=(n.y*e.r+e.y*n.r)/r;return i*i+o*o}function kl(t){this._=t,this.next=null,this.previous=null}function El(t){if(!(i=t.length))return 0;var n,e,r,i,o,a,u,c,f,s,l;if((n=t[0]).x=0,n.y=0,!(i>1))return n.r;if(e=t[1],n.x=-e.r,e.x=n.r,e.y=0,!(i>2))return n.r+e.r;Al(e,n,r=t[2]),n=new kl(n),e=new kl(e),r=new kl(r),n.next=r.previous=e,e.next=n.previous=r,r.next=e.previous=n;t:for(u=3;uh&&(h=u),g=s*s*v,(d=Math.max(h/g,g/l))>p){s-=u;break}p=d}y.push(a={value:s,dice:c1?n:1)},e}(Ql);var th=function t(n){function e(t,e,r,i,o){if((a=t._squarify)&&a.ratio===n)for(var a,u,c,f,s,l=-1,h=a.length,d=t.value;++l1?n:1)},e}(Ql);function nh(t,n){return t[0]-n[0]||t[1]-n[1]}function eh(t){for(var n,e,r,i=t.length,o=[0,1],a=2,u=2;u1&&(n=t[o[a-2]],e=t[o[a-1]],r=t[u],(e[0]-n[0])*(r[1]-n[1])-(e[1]-n[1])*(r[0]-n[0])<=0);)--a;o[a++]=u}return o.slice(0,a)}function rh(){return Math.random()}var ih=function t(n){function e(t,e){return t=null==t?0:+t,e=null==e?1:+e,1===arguments.length?(e=t,t=0):e-=t,function(){return n()*e+t}}return e.source=t,e}(rh),oh=function t(n){function e(t,e){var r,i;return t=null==t?0:+t,e=null==e?1:+e,function(){var o;if(null!=r)o=r,r=null;else do{r=2*n()-1,o=2*n()-1,i=r*r+o*o}while(!i||i>1);return t+e*o*Math.sqrt(-2*Math.log(i)/i)}}return e.source=t,e}(rh),ah=function t(n){function e(){var t=oh.source(n).apply(this,arguments);return function(){return Math.exp(t())}}return e.source=t,e}(rh),uh=function t(n){function e(t){return function(){for(var e=0,r=0;rr&&(n=e,e=r,r=n),function(t){return Math.max(e,Math.min(r,t))}}function Mh(t,n,e){var r=t[0],i=t[1],o=n[0],a=n[1];return i2?Nh:Mh,i=o=null,l}function l(n){return isNaN(n=+n)?e:(i||(i=r(a.map(t),u,c)))(t(f(n)))}return l.invert=function(e){return f(n((o||(o=r(u,a.map(t),he)))(e)))},l.domain=function(t){return arguments.length?(a=dh.call(t,_h),f===mh||(f=wh(a)),s()):a.slice()},l.range=function(t){return arguments.length?(u=ph.call(t),s()):u.slice()},l.rangeRound=function(t){return u=ph.call(t),c=_e,s()},l.clamp=function(t){return arguments.length?(f=t?wh(a):mh,l):f!==mh},l.interpolate=function(t){return arguments.length?(c=t,s()):c},l.unknown=function(t){return arguments.length?(e=t,l):e},function(e,r){return t=e,n=r,s()}}function Sh(t,n){return Th()(t,n)}function kh(n,e,r,i){var o,a=w(n,e,r);switch((i=wa(null==i?",f":i)).type){case"s":var u=Math.max(Math.abs(n),Math.abs(e));return null!=i.precision||isNaN(o=za(a,u))||(i.precision=o),t.formatPrefix(i,u);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(o=Ra(a,Math.max(Math.abs(n),Math.abs(e))))||(i.precision=o-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(o=Pa(a))||(i.precision=o-2*("%"===i.type))}return t.format(i)}function Eh(t){var n=t.domain;return t.ticks=function(t){var e=n();return m(e[0],e[e.length-1],null==t?10:t)},t.tickFormat=function(t,e){var r=n();return kh(r[0],r[r.length-1],null==t?10:t,e)},t.nice=function(e){null==e&&(e=10);var r,i=n(),o=0,a=i.length-1,u=i[o],c=i[a];return c0?r=x(u=Math.floor(u/r)*r,c=Math.ceil(c/r)*r,e):r<0&&(r=x(u=Math.ceil(u*r)/r,c=Math.floor(c*r)/r,e)),r>0?(i[o]=Math.floor(u/r)*r,i[a]=Math.ceil(c/r)*r,n(i)):r<0&&(i[o]=Math.ceil(u*r)/r,i[a]=Math.floor(c*r)/r,n(i)),t},t}function Ch(t,n){var e,r=0,i=(t=t.slice()).length-1,o=t[r],a=t[i];return a0){for(;hc)break;v.push(l)}}else for(;h=1;--s)if(!((l=f*s)c)break;v.push(l)}}else v=m(h,d,Math.min(d-h,p)).map(r);return n?v.reverse():v},i.tickFormat=function(n,o){if(null==o&&(o=10===a?".0e":","),"function"!=typeof o&&(o=t.format(o)),n===1/0)return o;null==n&&(n=10);var u=Math.max(1,a*n/i.ticks().length);return function(t){var n=t/r(Math.round(e(t)));return n*a0))return u;do{u.push(a=new Date(+e)),n(e,o),t(e)}while(a=n)for(;t(n),!e(n);)n.setTime(n-1)},function(t,r){if(t>=t)if(r<0)for(;++r<=0;)for(;n(t,-1),!e(t););else for(;--r>=0;)for(;n(t,1),!e(t););})},e&&(i.count=function(n,r){return Gh.setTime(+n),Vh.setTime(+r),t(Gh),t(Vh),Math.floor(e(Gh,Vh))},i.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(r?function(n){return r(n)%t==0}:function(n){return i.count(0,n)%t==0}):i:null}),i}var Wh=$h(function(){},function(t,n){t.setTime(+t+n)},function(t,n){return n-t});Wh.every=function(t){return t=Math.floor(t),isFinite(t)&&t>0?t>1?$h(function(n){n.setTime(Math.floor(n/t)*t)},function(n,e){n.setTime(+n+e*t)},function(n,e){return(e-n)/t}):Wh:null};var Zh=Wh.range,Qh=6e4,Jh=6048e5,Kh=$h(function(t){t.setTime(t-t.getMilliseconds())},function(t,n){t.setTime(+t+1e3*n)},function(t,n){return(n-t)/1e3},function(t){return t.getUTCSeconds()}),td=Kh.range,nd=$h(function(t){t.setTime(t-t.getMilliseconds()-1e3*t.getSeconds())},function(t,n){t.setTime(+t+n*Qh)},function(t,n){return(n-t)/Qh},function(t){return t.getMinutes()}),ed=nd.range,rd=$h(function(t){t.setTime(t-t.getMilliseconds()-1e3*t.getSeconds()-t.getMinutes()*Qh)},function(t,n){t.setTime(+t+36e5*n)},function(t,n){return(n-t)/36e5},function(t){return t.getHours()}),id=rd.range,od=$h(function(t){t.setHours(0,0,0,0)},function(t,n){t.setDate(t.getDate()+n)},function(t,n){return(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*Qh)/864e5},function(t){return t.getDate()-1}),ad=od.range;function ud(t){return $h(function(n){n.setDate(n.getDate()-(n.getDay()+7-t)%7),n.setHours(0,0,0,0)},function(t,n){t.setDate(t.getDate()+7*n)},function(t,n){return(n-t-(n.getTimezoneOffset()-t.getTimezoneOffset())*Qh)/Jh})}var cd=ud(0),fd=ud(1),sd=ud(2),ld=ud(3),hd=ud(4),dd=ud(5),pd=ud(6),vd=cd.range,gd=fd.range,yd=sd.range,_d=ld.range,bd=hd.range,md=dd.range,xd=pd.range,wd=$h(function(t){t.setDate(1),t.setHours(0,0,0,0)},function(t,n){t.setMonth(t.getMonth()+n)},function(t,n){return n.getMonth()-t.getMonth()+12*(n.getFullYear()-t.getFullYear())},function(t){return t.getMonth()}),Md=wd.range,Nd=$h(function(t){t.setMonth(0,1),t.setHours(0,0,0,0)},function(t,n){t.setFullYear(t.getFullYear()+n)},function(t,n){return n.getFullYear()-t.getFullYear()},function(t){return t.getFullYear()});Nd.every=function(t){return isFinite(t=Math.floor(t))&&t>0?$h(function(n){n.setFullYear(Math.floor(n.getFullYear()/t)*t),n.setMonth(0,1),n.setHours(0,0,0,0)},function(n,e){n.setFullYear(n.getFullYear()+e*t)}):null};var Ad=Nd.range,Td=$h(function(t){t.setUTCSeconds(0,0)},function(t,n){t.setTime(+t+n*Qh)},function(t,n){return(n-t)/Qh},function(t){return t.getUTCMinutes()}),Sd=Td.range,kd=$h(function(t){t.setUTCMinutes(0,0,0)},function(t,n){t.setTime(+t+36e5*n)},function(t,n){return(n-t)/36e5},function(t){return t.getUTCHours()}),Ed=kd.range,Cd=$h(function(t){t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCDate(t.getUTCDate()+n)},function(t,n){return(n-t)/864e5},function(t){return t.getUTCDate()-1}),Pd=Cd.range;function zd(t){return $h(function(n){n.setUTCDate(n.getUTCDate()-(n.getUTCDay()+7-t)%7),n.setUTCHours(0,0,0,0)},function(t,n){t.setUTCDate(t.getUTCDate()+7*n)},function(t,n){return(n-t)/Jh})}var Rd=zd(0),Dd=zd(1),qd=zd(2),Ld=zd(3),Ud=zd(4),Od=zd(5),Bd=zd(6),Yd=Rd.range,Fd=Dd.range,Id=qd.range,jd=Ld.range,Hd=Ud.range,Xd=Od.range,Gd=Bd.range,Vd=$h(function(t){t.setUTCDate(1),t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCMonth(t.getUTCMonth()+n)},function(t,n){return n.getUTCMonth()-t.getUTCMonth()+12*(n.getUTCFullYear()-t.getUTCFullYear())},function(t){return t.getUTCMonth()}),$d=Vd.range,Wd=$h(function(t){t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},function(t,n){t.setUTCFullYear(t.getUTCFullYear()+n)},function(t,n){return n.getUTCFullYear()-t.getUTCFullYear()},function(t){return t.getUTCFullYear()});Wd.every=function(t){return isFinite(t=Math.floor(t))&&t>0?$h(function(n){n.setUTCFullYear(Math.floor(n.getUTCFullYear()/t)*t),n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0)},function(n,e){n.setUTCFullYear(n.getUTCFullYear()+e*t)}):null};var Zd=Wd.range;function Qd(t){if(0<=t.y&&t.y<100){var n=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return n.setFullYear(t.y),n}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function Jd(t){if(0<=t.y&&t.y<100){var n=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return n.setUTCFullYear(t.y),n}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function Kd(t){return{y:t,m:0,d:1,H:0,M:0,S:0,L:0}}function tp(t){var n=t.dateTime,e=t.date,r=t.time,i=t.periods,o=t.days,a=t.shortDays,u=t.months,c=t.shortMonths,f=cp(i),s=fp(i),l=cp(o),h=fp(o),d=cp(a),p=fp(a),v=cp(u),g=fp(u),y=cp(c),_=fp(c),b={a:function(t){return a[t.getDay()]},A:function(t){return o[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return u[t.getMonth()]},c:null,d:Ep,e:Ep,f:Dp,H:Cp,I:Pp,j:zp,L:Rp,m:qp,M:Lp,p:function(t){return i[+(t.getHours()>=12)]},Q:sv,s:lv,S:Up,u:Op,U:Bp,V:Yp,w:Fp,W:Ip,x:null,X:null,y:jp,Y:Hp,Z:Xp,"%":fv},m={a:function(t){return a[t.getUTCDay()]},A:function(t){return o[t.getUTCDay()]},b:function(t){return c[t.getUTCMonth()]},B:function(t){return u[t.getUTCMonth()]},c:null,d:Gp,e:Gp,f:Qp,H:Vp,I:$p,j:Wp,L:Zp,m:Jp,M:Kp,p:function(t){return i[+(t.getUTCHours()>=12)]},Q:sv,s:lv,S:tv,u:nv,U:ev,V:rv,w:iv,W:ov,x:null,X:null,y:av,Y:uv,Z:cv,"%":fv},x={a:function(t,n,e){var r=d.exec(n.slice(e));return r?(t.w=p[r[0].toLowerCase()],e+r[0].length):-1},A:function(t,n,e){var r=l.exec(n.slice(e));return r?(t.w=h[r[0].toLowerCase()],e+r[0].length):-1},b:function(t,n,e){var r=y.exec(n.slice(e));return r?(t.m=_[r[0].toLowerCase()],e+r[0].length):-1},B:function(t,n,e){var r=v.exec(n.slice(e));return r?(t.m=g[r[0].toLowerCase()],e+r[0].length):-1},c:function(t,e,r){return N(t,n,e,r)},d:bp,e:bp,f:Ap,H:xp,I:xp,j:mp,L:Np,m:_p,M:wp,p:function(t,n,e){var r=f.exec(n.slice(e));return r?(t.p=s[r[0].toLowerCase()],e+r[0].length):-1},Q:Sp,s:kp,S:Mp,u:lp,U:hp,V:dp,w:sp,W:pp,x:function(t,n,r){return N(t,e,n,r)},X:function(t,n,e){return N(t,r,n,e)},y:gp,Y:vp,Z:yp,"%":Tp};function w(t,n){return function(e){var r,i,o,a=[],u=-1,c=0,f=t.length;for(e instanceof Date||(e=new Date(+e));++u53)return null;"w"in o||(o.w=1),"Z"in o?(i=(r=Jd(Kd(o.y))).getUTCDay(),r=i>4||0===i?Dd.ceil(r):Dd(r),r=Cd.offset(r,7*(o.V-1)),o.y=r.getUTCFullYear(),o.m=r.getUTCMonth(),o.d=r.getUTCDate()+(o.w+6)%7):(i=(r=n(Kd(o.y))).getDay(),r=i>4||0===i?fd.ceil(r):fd(r),r=od.offset(r,7*(o.V-1)),o.y=r.getFullYear(),o.m=r.getMonth(),o.d=r.getDate()+(o.w+6)%7)}else("W"in o||"U"in o)&&("w"in o||(o.w="u"in o?o.u%7:"W"in o?1:0),i="Z"in o?Jd(Kd(o.y)).getUTCDay():n(Kd(o.y)).getDay(),o.m=0,o.d="W"in o?(o.w+6)%7+7*o.W-(i+5)%7:o.w+7*o.U-(i+6)%7);return"Z"in o?(o.H+=o.Z/100|0,o.M+=o.Z%100,Jd(o)):n(o)}}function N(t,n,e,r){for(var i,o,a=0,u=n.length,c=e.length;a=c)return-1;if(37===(i=n.charCodeAt(a++))){if(i=n.charAt(a++),!(o=x[i in ep?n.charAt(a++):i])||(r=o(t,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}return b.x=w(e,b),b.X=w(r,b),b.c=w(n,b),m.x=w(e,m),m.X=w(r,m),m.c=w(n,m),{format:function(t){var n=w(t+="",b);return n.toString=function(){return t},n},parse:function(t){var n=M(t+="",Qd);return n.toString=function(){return t},n},utcFormat:function(t){var n=w(t+="",m);return n.toString=function(){return t},n},utcParse:function(t){var n=M(t,Jd);return n.toString=function(){return t},n}}}var np,ep={"-":"",_:" ",0:"0"},rp=/^\s*\d+/,ip=/^%/,op=/[\\^$*+?|[\]().{}]/g;function ap(t,n,e){var r=t<0?"-":"",i=(r?-t:t)+"",o=i.length;return r+(o68?1900:2e3),e+r[0].length):-1}function yp(t,n,e){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(n.slice(e,e+6));return r?(t.Z=r[1]?0:-(r[2]+(r[3]||"00")),e+r[0].length):-1}function _p(t,n,e){var r=rp.exec(n.slice(e,e+2));return r?(t.m=r[0]-1,e+r[0].length):-1}function bp(t,n,e){var r=rp.exec(n.slice(e,e+2));return r?(t.d=+r[0],e+r[0].length):-1}function mp(t,n,e){var r=rp.exec(n.slice(e,e+3));return r?(t.m=0,t.d=+r[0],e+r[0].length):-1}function xp(t,n,e){var r=rp.exec(n.slice(e,e+2));return r?(t.H=+r[0],e+r[0].length):-1}function wp(t,n,e){var r=rp.exec(n.slice(e,e+2));return r?(t.M=+r[0],e+r[0].length):-1}function Mp(t,n,e){var r=rp.exec(n.slice(e,e+2));return r?(t.S=+r[0],e+r[0].length):-1}function Np(t,n,e){var r=rp.exec(n.slice(e,e+3));return r?(t.L=+r[0],e+r[0].length):-1}function Ap(t,n,e){var r=rp.exec(n.slice(e,e+6));return r?(t.L=Math.floor(r[0]/1e3),e+r[0].length):-1}function Tp(t,n,e){var r=ip.exec(n.slice(e,e+1));return r?e+r[0].length:-1}function Sp(t,n,e){var r=rp.exec(n.slice(e));return r?(t.Q=+r[0],e+r[0].length):-1}function kp(t,n,e){var r=rp.exec(n.slice(e));return r?(t.Q=1e3*+r[0],e+r[0].length):-1}function Ep(t,n){return ap(t.getDate(),n,2)}function Cp(t,n){return ap(t.getHours(),n,2)}function Pp(t,n){return ap(t.getHours()%12||12,n,2)}function zp(t,n){return ap(1+od.count(Nd(t),t),n,3)}function Rp(t,n){return ap(t.getMilliseconds(),n,3)}function Dp(t,n){return Rp(t,n)+"000"}function qp(t,n){return ap(t.getMonth()+1,n,2)}function Lp(t,n){return ap(t.getMinutes(),n,2)}function Up(t,n){return ap(t.getSeconds(),n,2)}function Op(t){var n=t.getDay();return 0===n?7:n}function Bp(t,n){return ap(cd.count(Nd(t),t),n,2)}function Yp(t,n){var e=t.getDay();return t=e>=4||0===e?hd(t):hd.ceil(t),ap(hd.count(Nd(t),t)+(4===Nd(t).getDay()),n,2)}function Fp(t){return t.getDay()}function Ip(t,n){return ap(fd.count(Nd(t),t),n,2)}function jp(t,n){return ap(t.getFullYear()%100,n,2)}function Hp(t,n){return ap(t.getFullYear()%1e4,n,4)}function Xp(t){var n=t.getTimezoneOffset();return(n>0?"-":(n*=-1,"+"))+ap(n/60|0,"0",2)+ap(n%60,"0",2)}function Gp(t,n){return ap(t.getUTCDate(),n,2)}function Vp(t,n){return ap(t.getUTCHours(),n,2)}function $p(t,n){return ap(t.getUTCHours()%12||12,n,2)}function Wp(t,n){return ap(1+Cd.count(Wd(t),t),n,3)}function Zp(t,n){return ap(t.getUTCMilliseconds(),n,3)}function Qp(t,n){return Zp(t,n)+"000"}function Jp(t,n){return ap(t.getUTCMonth()+1,n,2)}function Kp(t,n){return ap(t.getUTCMinutes(),n,2)}function tv(t,n){return ap(t.getUTCSeconds(),n,2)}function nv(t){var n=t.getUTCDay();return 0===n?7:n}function ev(t,n){return ap(Rd.count(Wd(t),t),n,2)}function rv(t,n){var e=t.getUTCDay();return t=e>=4||0===e?Ud(t):Ud.ceil(t),ap(Ud.count(Wd(t),t)+(4===Wd(t).getUTCDay()),n,2)}function iv(t){return t.getUTCDay()}function ov(t,n){return ap(Dd.count(Wd(t),t),n,2)}function av(t,n){return ap(t.getUTCFullYear()%100,n,2)}function uv(t,n){return ap(t.getUTCFullYear()%1e4,n,4)}function cv(){return"+0000"}function fv(){return"%"}function sv(t){return+t}function lv(t){return Math.floor(+t/1e3)}function hv(n){return np=tp(n),t.timeFormat=np.format,t.timeParse=np.parse,t.utcFormat=np.utcFormat,t.utcParse=np.utcParse,np}hv({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var dv=Date.prototype.toISOString?function(t){return t.toISOString()}:t.utcFormat("%Y-%m-%dT%H:%M:%S.%LZ");var pv=+new Date("2000-01-01T00:00:00.000Z")?function(t){var n=new Date(t);return isNaN(n)?null:n}:t.utcParse("%Y-%m-%dT%H:%M:%S.%LZ"),vv=1e3,gv=60*vv,yv=60*gv,_v=24*yv,bv=7*_v,mv=30*_v,xv=365*_v;function wv(t){return new Date(t)}function Mv(t){return t instanceof Date?+t:+new Date(+t)}function Nv(t,n,r,i,o,a,u,c,f){var s=Sh(mh,mh),l=s.invert,h=s.domain,d=f(".%L"),p=f(":%S"),v=f("%I:%M"),g=f("%I %p"),y=f("%a %d"),_=f("%b %d"),b=f("%B"),m=f("%Y"),x=[[u,1,vv],[u,5,5*vv],[u,15,15*vv],[u,30,30*vv],[a,1,gv],[a,5,5*gv],[a,15,15*gv],[a,30,30*gv],[o,1,yv],[o,3,3*yv],[o,6,6*yv],[o,12,12*yv],[i,1,_v],[i,2,2*_v],[r,1,bv],[n,1,mv],[n,3,3*mv],[t,1,xv]];function M(e){return(u(e)=1?fy:t<=-1?-fy:Math.asin(t)}function hy(t){return t.innerRadius}function dy(t){return t.outerRadius}function py(t){return t.startAngle}function vy(t){return t.endAngle}function gy(t){return t&&t.padAngle}function yy(t,n,e,r,i,o,a){var u=t-e,c=n-r,f=(a?o:-o)/ay(u*u+c*c),s=f*c,l=-f*u,h=t+s,d=n+l,p=e+s,v=r+l,g=(h+p)/2,y=(d+v)/2,_=p-h,b=v-d,m=_*_+b*b,x=i-o,w=h*v-p*d,M=(b<0?-1:1)*ay(ry(0,x*x*m-w*w)),N=(w*b-_*M)/m,A=(-w*_-b*M)/m,T=(w*b+_*M)/m,S=(-w*_+b*M)/m,k=N-g,E=A-y,C=T-g,P=S-y;return k*k+E*E>C*C+P*P&&(N=T,A=S),{cx:N,cy:A,x01:-s,y01:-l,x11:N*(i/x-1),y11:A*(i/x-1)}}function _y(t){this._context=t}function by(t){return new _y(t)}function my(t){return t[0]}function xy(t){return t[1]}function wy(){var t=my,n=xy,e=Kg(!0),r=null,i=by,o=null;function a(a){var u,c,f,s=a.length,l=!1;for(null==r&&(o=i(f=Hi())),u=0;u<=s;++u)!(u=s;--l)u.point(g[l],y[l]);u.lineEnd(),u.areaEnd()}v&&(g[f]=+t(h,f,c),y[f]=+e(h,f,c),u.point(n?+n(h,f,c):g[f],r?+r(h,f,c):y[f]))}if(d)return u=null,d+""||null}function f(){return wy().defined(i).curve(a).context(o)}return c.x=function(e){return arguments.length?(t="function"==typeof e?e:Kg(+e),n=null,c):t},c.x0=function(n){return arguments.length?(t="function"==typeof n?n:Kg(+n),c):t},c.x1=function(t){return arguments.length?(n=null==t?null:"function"==typeof t?t:Kg(+t),c):n},c.y=function(t){return arguments.length?(e="function"==typeof t?t:Kg(+t),r=null,c):e},c.y0=function(t){return arguments.length?(e="function"==typeof t?t:Kg(+t),c):e},c.y1=function(t){return arguments.length?(r=null==t?null:"function"==typeof t?t:Kg(+t),c):r},c.lineX0=c.lineY0=function(){return f().x(t).y(e)},c.lineY1=function(){return f().x(t).y(r)},c.lineX1=function(){return f().x(n).y(e)},c.defined=function(t){return arguments.length?(i="function"==typeof t?t:Kg(!!t),c):i},c.curve=function(t){return arguments.length?(a=t,null!=o&&(u=a(o)),c):a},c.context=function(t){return arguments.length?(null==t?o=u=null:u=a(o=t),c):o},c}function Ny(t,n){return nt?1:n>=t?0:NaN}function Ay(t){return t}_y.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:this._context.lineTo(t,n)}}};var Ty=ky(by);function Sy(t){this._curve=t}function ky(t){function n(n){return new Sy(t(n))}return n._curve=t,n}function Ey(t){var n=t.curve;return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t.curve=function(t){return arguments.length?n(ky(t)):n()._curve},t}function Cy(){return Ey(wy().curve(Ty))}function Py(){var t=My().curve(Ty),n=t.curve,e=t.lineX0,r=t.lineX1,i=t.lineY0,o=t.lineY1;return t.angle=t.x,delete t.x,t.startAngle=t.x0,delete t.x0,t.endAngle=t.x1,delete t.x1,t.radius=t.y,delete t.y,t.innerRadius=t.y0,delete t.y0,t.outerRadius=t.y1,delete t.y1,t.lineStartAngle=function(){return Ey(e())},delete t.lineX0,t.lineEndAngle=function(){return Ey(r())},delete t.lineX1,t.lineInnerRadius=function(){return Ey(i())},delete t.lineY0,t.lineOuterRadius=function(){return Ey(o())},delete t.lineY1,t.curve=function(t){return arguments.length?n(ky(t)):n()._curve},t}function zy(t,n){return[(n=+n)*Math.cos(t-=Math.PI/2),n*Math.sin(t)]}Sy.prototype={areaStart:function(){this._curve.areaStart()},areaEnd:function(){this._curve.areaEnd()},lineStart:function(){this._curve.lineStart()},lineEnd:function(){this._curve.lineEnd()},point:function(t,n){this._curve.point(n*Math.sin(t),n*-Math.cos(t))}};var Ry=Array.prototype.slice;function Dy(t){return t.source}function qy(t){return t.target}function Ly(t){var n=Dy,e=qy,r=my,i=xy,o=null;function a(){var a,u=Ry.call(arguments),c=n.apply(this,u),f=e.apply(this,u);if(o||(o=a=Hi()),t(o,+r.apply(this,(u[0]=c,u)),+i.apply(this,u),+r.apply(this,(u[0]=f,u)),+i.apply(this,u)),a)return o=null,a+""||null}return a.source=function(t){return arguments.length?(n=t,a):n},a.target=function(t){return arguments.length?(e=t,a):e},a.x=function(t){return arguments.length?(r="function"==typeof t?t:Kg(+t),a):r},a.y=function(t){return arguments.length?(i="function"==typeof t?t:Kg(+t),a):i},a.context=function(t){return arguments.length?(o=null==t?null:t,a):o},a}function Uy(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n=(n+r)/2,e,n,i,r,i)}function Oy(t,n,e,r,i){t.moveTo(n,e),t.bezierCurveTo(n,e=(e+i)/2,r,e,r,i)}function By(t,n,e,r,i){var o=zy(n,e),a=zy(n,e=(e+i)/2),u=zy(r,e),c=zy(r,i);t.moveTo(o[0],o[1]),t.bezierCurveTo(a[0],a[1],u[0],u[1],c[0],c[1])}var Yy={draw:function(t,n){var e=Math.sqrt(n/cy);t.moveTo(e,0),t.arc(0,0,e,0,sy)}},Fy={draw:function(t,n){var e=Math.sqrt(n/5)/2;t.moveTo(-3*e,-e),t.lineTo(-e,-e),t.lineTo(-e,-3*e),t.lineTo(e,-3*e),t.lineTo(e,-e),t.lineTo(3*e,-e),t.lineTo(3*e,e),t.lineTo(e,e),t.lineTo(e,3*e),t.lineTo(-e,3*e),t.lineTo(-e,e),t.lineTo(-3*e,e),t.closePath()}},Iy=Math.sqrt(1/3),jy=2*Iy,Hy={draw:function(t,n){var e=Math.sqrt(n/jy),r=e*Iy;t.moveTo(0,-e),t.lineTo(r,0),t.lineTo(0,e),t.lineTo(-r,0),t.closePath()}},Xy=Math.sin(cy/10)/Math.sin(7*cy/10),Gy=Math.sin(sy/10)*Xy,Vy=-Math.cos(sy/10)*Xy,$y={draw:function(t,n){var e=Math.sqrt(.8908130915292852*n),r=Gy*e,i=Vy*e;t.moveTo(0,-e),t.lineTo(r,i);for(var o=1;o<5;++o){var a=sy*o/5,u=Math.cos(a),c=Math.sin(a);t.lineTo(c*e,-u*e),t.lineTo(u*r-c*i,c*r+u*i)}t.closePath()}},Wy={draw:function(t,n){var e=Math.sqrt(n),r=-e/2;t.rect(r,r,e,e)}},Zy=Math.sqrt(3),Qy={draw:function(t,n){var e=-Math.sqrt(n/(3*Zy));t.moveTo(0,2*e),t.lineTo(-Zy*e,-e),t.lineTo(Zy*e,-e),t.closePath()}},Jy=Math.sqrt(3)/2,Ky=1/Math.sqrt(12),t_=3*(Ky/2+1),n_={draw:function(t,n){var e=Math.sqrt(n/t_),r=e/2,i=e*Ky,o=r,a=e*Ky+e,u=-o,c=a;t.moveTo(r,i),t.lineTo(o,a),t.lineTo(u,c),t.lineTo(-.5*r-Jy*i,Jy*r+-.5*i),t.lineTo(-.5*o-Jy*a,Jy*o+-.5*a),t.lineTo(-.5*u-Jy*c,Jy*u+-.5*c),t.lineTo(-.5*r+Jy*i,-.5*i-Jy*r),t.lineTo(-.5*o+Jy*a,-.5*a-Jy*o),t.lineTo(-.5*u+Jy*c,-.5*c-Jy*u),t.closePath()}},e_=[Yy,Fy,Hy,Wy,$y,Qy,n_];function r_(){}function i_(t,n,e){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+n)/6,(t._y0+4*t._y1+e)/6)}function o_(t){this._context=t}function a_(t){this._context=t}function u_(t){this._context=t}function c_(t,n){this._basis=new o_(t),this._beta=n}o_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:i_(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:i_(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},a_.prototype={areaStart:r_,areaEnd:r_,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x2=t,this._y2=n;break;case 1:this._point=2,this._x3=t,this._y3=n;break;case 2:this._point=3,this._x4=t,this._y4=n,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+n)/6);break;default:i_(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},u_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var e=(this._x0+4*this._x1+t)/6,r=(this._y0+4*this._y1+n)/6;this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break;case 3:this._point=4;default:i_(this,t,n)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=n}},c_.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,n=this._y,e=t.length-1;if(e>0)for(var r,i=t[0],o=n[0],a=t[e]-i,u=n[e]-o,c=-1;++c<=e;)r=c/e,this._basis.point(this._beta*t[c]+(1-this._beta)*(i+r*a),this._beta*n[c]+(1-this._beta)*(o+r*u));this._x=this._y=null,this._basis.lineEnd()},point:function(t,n){this._x.push(+t),this._y.push(+n)}};var f_=function t(n){function e(t){return 1===n?new o_(t):new c_(t,n)}return e.beta=function(n){return t(+n)},e}(.85);function s_(t,n,e){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-n),t._y2+t._k*(t._y1-e),t._x2,t._y2)}function l_(t,n){this._context=t,this._k=(1-n)/6}l_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:s_(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2,this._x1=t,this._y1=n;break;case 2:this._point=3;default:s_(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var h_=function t(n){function e(t){return new l_(t,n)}return e.tension=function(n){return t(+n)},e}(0);function d_(t,n){this._context=t,this._k=(1-n)/6}d_.prototype={areaStart:r_,areaEnd:r_,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:s_(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var p_=function t(n){function e(t){return new d_(t,n)}return e.tension=function(n){return t(+n)},e}(0);function v_(t,n){this._context=t,this._k=(1-n)/6}v_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:s_(this,t,n)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var g_=function t(n){function e(t){return new v_(t,n)}return e.tension=function(n){return t(+n)},e}(0);function y_(t,n,e){var r=t._x1,i=t._y1,o=t._x2,a=t._y2;if(t._l01_a>uy){var u=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);r=(r*u-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,i=(i*u-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>uy){var f=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,s=3*t._l23_a*(t._l23_a+t._l12_a);o=(o*f+t._x1*t._l23_2a-n*t._l12_2a)/s,a=(a*f+t._y1*t._l23_2a-e*t._l12_2a)/s}t._context.bezierCurveTo(r,i,o,a,t._x2,t._y2)}function __(t,n){this._context=t,this._alpha=n}__.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;break;case 2:this._point=3;default:y_(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var b_=function t(n){function e(t){return n?new __(t,n):new l_(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function m_(t,n){this._context=t,this._alpha=n}m_.prototype={areaStart:r_,areaEnd:r_,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=n;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=n);break;case 2:this._point=3,this._x5=t,this._y5=n;break;default:y_(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var x_=function t(n){function e(t){return n?new m_(t,n):new d_(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function w_(t,n){this._context=t,this._alpha=n}w_.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,n){if(t=+t,n=+n,this._point){var e=this._x2-t,r=this._y2-n;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(e*e+r*r,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:y_(this,t,n)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=n}};var M_=function t(n){function e(t){return n?new w_(t,n):new v_(t,0)}return e.alpha=function(n){return t(+n)},e}(.5);function N_(t){this._context=t}function A_(t){return t<0?-1:1}function T_(t,n,e){var r=t._x1-t._x0,i=n-t._x1,o=(t._y1-t._y0)/(r||i<0&&-0),a=(e-t._y1)/(i||r<0&&-0),u=(o*i+a*r)/(r+i);return(A_(o)+A_(a))*Math.min(Math.abs(o),Math.abs(a),.5*Math.abs(u))||0}function S_(t,n){var e=t._x1-t._x0;return e?(3*(t._y1-t._y0)/e-n)/2:n}function k_(t,n,e){var r=t._x0,i=t._y0,o=t._x1,a=t._y1,u=(o-r)/3;t._context.bezierCurveTo(r+u,i+u*n,o-u,a-u*e,o,a)}function E_(t){this._context=t}function C_(t){this._context=new P_(t)}function P_(t){this._context=t}function z_(t){this._context=t}function R_(t){var n,e,r=t.length-1,i=new Array(r),o=new Array(r),a=new Array(r);for(i[0]=0,o[0]=2,a[0]=t[0]+2*t[1],n=1;n=0;--n)i[n]=(a[n]-i[n+1])/o[n];for(o[r-1]=(t[r]+i[r-1])/2,n=0;n1)for(var e,r,i,o=1,a=t[n[0]],u=a.length;o=0;)e[n]=n;return e}function U_(t,n){return t[n]}function O_(t){var n=t.map(B_);return L_(t).sort(function(t,e){return n[t]-n[e]})}function B_(t){for(var n,e=-1,r=0,i=t.length,o=-1/0;++eo&&(o=n,r=e);return r}function Y_(t){var n=t.map(F_);return L_(t).sort(function(t,e){return n[t]-n[e]})}function F_(t){for(var n,e=0,r=-1,i=t.length;++r0)){if(o/=h,h<0){if(o0){if(o>l)return;o>s&&(s=o)}if(o=r-c,h||!(o<0)){if(o/=h,h<0){if(o>l)return;o>s&&(s=o)}else if(h>0){if(o0)){if(o/=d,d<0){if(o0){if(o>l)return;o>s&&(s=o)}if(o=i-f,d||!(o<0)){if(o/=d,d<0){if(o>l)return;o>s&&(s=o)}else if(d>0){if(o0||l<1)||(s>0&&(t[0]=[c+s*h,f+s*d]),l<1&&(t[1]=[c+l*h,f+l*d]),!0)}}}}}function tb(t,n,e,r,i){var o=t[1];if(o)return!0;var a,u,c=t[0],f=t.left,s=t.right,l=f[0],h=f[1],d=s[0],p=s[1],v=(l+d)/2,g=(h+p)/2;if(p===h){if(v=r)return;if(l>d){if(c){if(c[1]>=i)return}else c=[v,e];o=[v,i]}else{if(c){if(c[1]1)if(l>d){if(c){if(c[1]>=i)return}else c=[(e-u)/a,e];o=[(i-u)/a,i]}else{if(c){if(c[1]=r)return}else c=[n,a*n+u];o=[r,a*r+u]}else{if(c){if(c[0]=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,n){switch(t=+t,n=+n,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,n):this._context.moveTo(t,n);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,n),this._context.lineTo(t,n);else{var e=this._x*(1-this._t)+t*this._t;this._context.lineTo(e,this._y),this._context.lineTo(e,n)}}this._x=t,this._y=n}},X_.prototype={constructor:X_,insert:function(t,n){var e,r,i;if(t){if(n.P=t,n.N=t.N,t.N&&(t.N.P=n),t.N=n,t.R){for(t=t.R;t.L;)t=t.L;t.L=n}else t.R=n;e=t}else this._?(t=W_(this._),n.P=null,n.N=t,t.P=t.L=n,e=t):(n.P=n.N=null,this._=n,e=null);for(n.L=n.R=null,n.U=e,n.C=!0,t=n;e&&e.C;)e===(r=e.U).L?(i=r.R)&&i.C?(e.C=i.C=!1,r.C=!0,t=r):(t===e.R&&(V_(this,e),e=(t=e).U),e.C=!1,r.C=!0,$_(this,r)):(i=r.L)&&i.C?(e.C=i.C=!1,r.C=!0,t=r):(t===e.L&&($_(this,e),e=(t=e).U),e.C=!1,r.C=!0,V_(this,r)),e=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var n,e,r,i=t.U,o=t.L,a=t.R;if(e=o?a?W_(a):o:a,i?i.L===t?i.L=e:i.R=e:this._=e,o&&a?(r=e.C,e.C=t.C,e.L=o,o.U=e,e!==a?(i=e.U,e.U=t.U,t=e.R,i.L=t,e.R=a,a.U=e):(e.U=i,i=e,t=e.R)):(r=t.C,t=e),t&&(t.U=i),!r)if(t&&t.C)t.C=!1;else{do{if(t===this._)break;if(t===i.L){if((n=i.R).C&&(n.C=!1,i.C=!0,V_(this,i),n=i.R),n.L&&n.L.C||n.R&&n.R.C){n.R&&n.R.C||(n.L.C=!1,n.C=!0,$_(this,n),n=i.R),n.C=i.C,i.C=n.R.C=!1,V_(this,i),t=this._;break}}else if((n=i.L).C&&(n.C=!1,i.C=!0,$_(this,i),n=i.L),n.L&&n.L.C||n.R&&n.R.C){n.L&&n.L.C||(n.R.C=!1,n.C=!0,V_(this,n),n=i.L),n.C=i.C,i.C=n.L.C=!1,$_(this,i),t=this._;break}n.C=!0,t=i,i=i.U}while(!t.C);t&&(t.C=!1)}}};var ib,ob=[];function ab(){G_(this),this.x=this.y=this.arc=this.site=this.cy=null}function ub(t){var n=t.P,e=t.N;if(n&&e){var r=n.site,i=t.site,o=e.site;if(r!==o){var a=i[0],u=i[1],c=r[0]-a,f=r[1]-u,s=o[0]-a,l=o[1]-u,h=2*(c*l-f*s);if(!(h>=-wb)){var d=c*c+f*f,p=s*s+l*l,v=(l*d-f*p)/h,g=(c*p-s*d)/h,y=ob.pop()||new ab;y.arc=t,y.site=i,y.x=v+a,y.y=(y.cy=g+u)+Math.sqrt(v*v+g*g),t.circle=y;for(var _=null,b=bb._;b;)if(y.yxb)u=u.L;else{if(!((i=o-gb(u,a))>xb)){r>-xb?(n=u.P,e=u):i>-xb?(n=u,e=u.N):n=e=u;break}if(!u.R){n=u;break}u=u.R}!function(t){_b[t.index]={site:t,halfedges:[]}}(t);var c=lb(t);if(yb.insert(n,c),n||e){if(n===e)return cb(n),e=lb(n.site),yb.insert(c,e),c.edge=e.edge=Z_(n.site,c.site),ub(n),void ub(e);if(e){cb(n),cb(e);var f=n.site,s=f[0],l=f[1],h=t[0]-s,d=t[1]-l,p=e.site,v=p[0]-s,g=p[1]-l,y=2*(h*g-d*v),_=h*h+d*d,b=v*v+g*g,m=[(g*_-d*b)/y+s,(h*b-v*_)/y+l];J_(e.edge,f,p,m),c.edge=Z_(f,t,null,m),e.edge=Z_(t,p,null,m),ub(n),ub(e)}else c.edge=Z_(n.site,c.site)}}function vb(t,n){var e=t.site,r=e[0],i=e[1],o=i-n;if(!o)return r;var a=t.P;if(!a)return-1/0;var u=(e=a.site)[0],c=e[1],f=c-n;if(!f)return u;var s=u-r,l=1/o-1/f,h=s/f;return l?(-h+Math.sqrt(h*h-2*l*(s*s/(-2*f)-c+f/2+i-o/2)))/l+r:(r+u)/2}function gb(t,n){var e=t.N;if(e)return vb(e,n);var r=t.site;return r[1]===n?r[0]:1/0}var yb,_b,bb,mb,xb=1e-6,wb=1e-12;function Mb(t,n){return n[1]-t[1]||n[0]-t[0]}function Nb(t,n){var e,r,i,o=t.sort(Mb).pop();for(mb=[],_b=new Array(t.length),yb=new X_,bb=new X_;;)if(i=ib,o&&(!i||o[1]xb||Math.abs(i[0][1]-i[1][1])>xb)||delete mb[o]}(a,u,c,f),function(t,n,e,r){var i,o,a,u,c,f,s,l,h,d,p,v,g=_b.length,y=!0;for(i=0;ixb||Math.abs(v-h)>xb)&&(c.splice(u,0,mb.push(Q_(a,d,Math.abs(p-t)xb?[t,Math.abs(l-t)xb?[Math.abs(h-r)xb?[e,Math.abs(l-e)xb?[Math.abs(h-n)=u)return null;var c=t-i.site[0],f=n-i.site[1],s=c*c+f*f;do{i=o.cells[r=a],a=null,i.halfedges.forEach(function(e){var r=o.edges[e],u=r.left;if(u!==i.site&&u||(u=r.right)){var c=t-u[0],f=n-u[1],l=c*c+f*f;lr?(r+i)/2:Math.min(0,r)||Math.max(0,i),a>o?(o+a)/2:Math.min(0,o)||Math.max(0,a))}Eb.prototype=Sb.prototype,t.version="5.9.2",t.bisect=i,t.bisectRight=i,t.bisectLeft=o,t.ascending=n,t.bisector=e,t.cross=function(t,n,e){var r,i,o,u,c=t.length,f=n.length,s=new Array(c*f);for(null==e&&(e=a),r=o=0;rt?1:n>=t?0:NaN},t.deviation=f,t.extent=s,t.histogram=function(){var t=v,n=s,e=M;function r(r){var o,a,u=r.length,c=new Array(u);for(o=0;ol;)h.pop(),--d;var p,v=new Array(d+1);for(o=0;o<=d;++o)(p=v[o]=[]).x0=o>0?h[o-1]:s,p.x1=o=r.length)return null!=t&&e.sort(t),null!=n?n(e):e;for(var c,f,s,l=-1,h=e.length,d=r[i++],p=Qi(),v=a();++lr.length)return e;var a,u=i[o-1];return null!=n&&o>=r.length?a=e.entries():(a=[],e.each(function(n,e){a.push({key:e,values:t(n,o)})})),null!=u?a.sort(function(t,n){return u(t.key,n.key)}):a}(o(t,0,to,no),0)},key:function(t){return r.push(t),e},sortKeys:function(t){return i[r.length-1]=t,e},sortValues:function(n){return t=n,e},rollup:function(t){return n=t,e}}},t.set=io,t.map=Qi,t.keys=function(t){var n=[];for(var e in t)n.push(e);return n},t.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},t.entries=function(t){var n=[];for(var e in t)n.push({key:e,value:t[e]});return n},t.color=hn,t.rgb=gn,t.hsl=mn,t.lab=Rn,t.hcl=Yn,t.lch=function(t,n,e,r){return 1===arguments.length?Bn(t):new Fn(e,n,t,null==r?1:r)},t.gray=function(t,n){return new Dn(t,0,0,null==n?1:n)},t.cubehelix=Zn,t.contours=po,t.contourDensity=function(){var t=yo,n=_o,e=bo,r=960,i=500,o=20,a=2,u=3*o,c=r+2*u>>a,f=i+2*u>>a,s=uo(20);function l(r){var i=new Float32Array(c*f),l=new Float32Array(c*f);r.forEach(function(r,o,s){var l=+t(r,o,s)+u>>a,h=+n(r,o,s)+u>>a,d=+e(r,o,s);l>=0&&l=0&&h>a),go({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a),vo({width:c,height:f,data:i},{width:c,height:f,data:l},o>>a),go({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a),vo({width:c,height:f,data:i},{width:c,height:f,data:l},o>>a),go({width:c,height:f,data:l},{width:c,height:f,data:i},o>>a);var d=s(i);if(!Array.isArray(d)){var p=A(i);d=w(0,p,d),(d=g(0,Math.floor(p/d)*d,d)).shift()}return po().thresholds(d).size([c,f])(i).map(h)}function h(t){return t.value*=Math.pow(2,-2*a),t.coordinates.forEach(d),t}function d(t){t.forEach(p)}function p(t){t.forEach(v)}function v(t){t[0]=t[0]*Math.pow(2,a)-u,t[1]=t[1]*Math.pow(2,a)-u}function y(){return c=r+2*(u=3*o)>>a,f=i+2*u>>a,l}return l.x=function(n){return arguments.length?(t="function"==typeof n?n:uo(+n),l):t},l.y=function(t){return arguments.length?(n="function"==typeof t?t:uo(+t),l):n},l.weight=function(t){return arguments.length?(e="function"==typeof t?t:uo(+t),l):e},l.size=function(t){if(!arguments.length)return[r,i];var n=Math.ceil(t[0]),e=Math.ceil(t[1]);if(!(n>=0||n>=0))throw new Error("invalid size");return r=n,i=e,y()},l.cellSize=function(t){if(!arguments.length)return 1<=1))throw new Error("invalid cell size");return a=Math.floor(Math.log(t)/Math.LN2),y()},l.thresholds=function(t){return arguments.length?(s="function"==typeof t?t:Array.isArray(t)?uo(oo.call(t)):uo(t),l):s},l.bandwidth=function(t){if(!arguments.length)return Math.sqrt(o*(o+1));if(!((t=+t)>=0))throw new Error("invalid bandwidth");return o=Math.round((Math.sqrt(4*t*t+1)-1)/2),y()},l},t.dispatch=I,t.drag=function(){var n,e,r,i,o=Gt,a=Vt,u=$t,c=Wt,f={},s=I("start","drag","end"),l=0,h=0;function d(t){t.on("mousedown.drag",p).filter(c).on("touchstart.drag",y).on("touchmove.drag",_).on("touchend.drag touchcancel.drag",b).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function p(){if(!i&&o.apply(this,arguments)){var u=m("mouse",a.apply(this,arguments),Ot,this,arguments);u&&(zt(t.event.view).on("mousemove.drag",v,!0).on("mouseup.drag",g,!0),It(t.event.view),Yt(),r=!1,n=t.event.clientX,e=t.event.clientY,u("start"))}}function v(){if(Ft(),!r){var i=t.event.clientX-n,o=t.event.clientY-e;r=i*i+o*o>h}f.mouse("drag")}function g(){zt(t.event.view).on("mousemove.drag mouseup.drag",null),jt(t.event.view,r),Ft(),f.mouse("end")}function y(){if(o.apply(this,arguments)){var n,e,r=t.event.changedTouches,i=a.apply(this,arguments),u=r.length;for(n=0;nc+d||if+d||ou.index){var p=c-a.x-a.vx,v=f-a.y-a.vy,g=p*p+v*v;gt.r&&(t.r=t[n].r)}function u(){if(n){var r,i,o=n.length;for(e=new Array(o),r=0;r=a)){(t.data!==n||t.next)&&(0===s&&(d+=(s=na())*s),0===l&&(d+=(l=na())*l),d1?(null==e?u.remove(t):u.set(t,d(e)),n):u.get(t)},find:function(n,e,r){var i,o,a,u,c,f=0,s=t.length;for(null==r?r=1/0:r*=r,f=0;f1?(f.on(t,e),n):f.on(t)}}},t.forceX=function(t){var n,e,r,i=ta(.1);function o(t){for(var i,o=0,a=n.length;opc(r[0],r[1])&&(r[1]=i[1]),pc(i[0],r[1])>pc(r[0],r[1])&&(r[0]=i[0])):o.push(r=i);for(a=-1/0,n=0,r=o[e=o.length-1];n<=e;r=i,++n)i=o[n],(u=pc(r[1],i[0]))>a&&(a=u,Ru=i[0],qu=r[1])}return Fu=Iu=null,Ru===1/0||Du===1/0?[[NaN,NaN],[NaN,NaN]]:[[Ru,Du],[qu,Lu]]},t.geoCentroid=function(t){ju=Hu=Xu=Gu=Vu=$u=Wu=Zu=Qu=Ju=Ku=0,du(t,yc);var n=Qu,e=Ju,r=Ku,i=n*n+e*e+r*r;return i=.12&&i<.234&&r>=-.425&&r<-.214?u:i>=.166&&i<.234&&r>=-.214&&r<-.115?c:a).invert(t)},s.stream=function(e){return t&&n===e?t:(r=[a.stream(n=e),u.stream(e),c.stream(e)],i=r.length,t={point:function(t,n){for(var e=-1;++e2?t[2]+90:90]):[(t=e())[0],t[1],t[2]-90]},e([0,0,90]).scale(159.155)},t.geoTransverseMercatorRaw=al,t.geoRotation=qc,t.geoStream=du,t.geoTransform=function(t){return{stream:xs(t)}},t.cluster=function(){var t=ul,n=1,e=1,r=!1;function i(i){var o,a=0;i.eachAfter(function(n){var e=n.children;e?(n.x=function(t){return t.reduce(cl,0)/t.length}(e),n.y=function(t){return 1+t.reduce(fl,0)}(e)):(n.x=o?a+=t(n,o):0,n.y=0,o=n)});var u=function(t){for(var n;n=t.children;)t=n[0];return t}(i),c=function(t){for(var n;n=t.children;)t=n[n.length-1];return t}(i),f=u.x-t(u,c)/2,s=c.x+t(c,u)/2;return i.eachAfter(r?function(t){t.x=(t.x-i.x)*n,t.y=(i.y-t.y)*e}:function(t){t.x=(t.x-f)/(s-f)*n,t.y=(1-(i.y?t.y/i.y:1))*e})}return i.separation=function(n){return arguments.length?(t=n,i):t},i.size=function(t){return arguments.length?(r=!1,n=+t[0],e=+t[1],i):r?null:[n,e]},i.nodeSize=function(t){return arguments.length?(r=!0,n=+t[0],e=+t[1],i):r?[n,e]:null},i},t.hierarchy=ll,t.pack=function(){var t=null,n=1,e=1,r=Pl;function i(i){return i.x=n/2,i.y=e/2,t?i.eachBefore(Dl(t)).eachAfter(ql(r,.5)).eachBefore(Ll(1)):i.eachBefore(Dl(Rl)).eachAfter(ql(Pl,1)).eachAfter(ql(r,i.r/Math.min(n,e))).eachBefore(Ll(Math.min(n,e)/(2*i.r))),i}return i.radius=function(n){return arguments.length?(t=null==(e=n)?null:Cl(e),i):t;var e},i.size=function(t){return arguments.length?(n=+t[0],e=+t[1],i):[n,e]},i.padding=function(t){return arguments.length?(r="function"==typeof t?t:zl(+t),i):r},i},t.packSiblings=function(t){return El(t),t},t.packEnclose=yl,t.partition=function(){var t=1,n=1,e=0,r=!1;function i(i){var o=i.height+1;return i.x0=i.y0=e,i.x1=t,i.y1=n/o,i.eachBefore(function(t,n){return function(r){r.children&&Ol(r,r.x0,t*(r.depth+1)/n,r.x1,t*(r.depth+2)/n);var i=r.x0,o=r.y0,a=r.x1-e,u=r.y1-e;a0)throw new Error("cycle");return o}return e.id=function(n){return arguments.length?(t=Cl(n),e):t},e.parentId=function(t){return arguments.length?(n=Cl(t),e):n},e},t.tree=function(){var t=Hl,n=1,e=1,r=null;function i(i){var c=function(t){for(var n,e,r,i,o,a=new Wl(t,0),u=[a];n=u.pop();)if(r=n._.children)for(n.children=new Array(o=r.length),i=o-1;i>=0;--i)u.push(e=n.children[i]=new Wl(r[i],i)),e.parent=n;return(a.parent=new Wl(null,0)).children=[a],a}(i);if(c.eachAfter(o),c.parent.m=-c.z,c.eachBefore(a),r)i.eachBefore(u);else{var f=i,s=i,l=i;i.eachBefore(function(t){t.xs.x&&(s=t),t.depth>l.depth&&(l=t)});var h=f===s?1:t(f,s)/2,d=h-f.x,p=n/(s.x+h+d),v=e/(l.depth||1);i.eachBefore(function(t){t.x=(t.x+d)*p,t.y=t.depth*v})}return i}function o(n){var e=n.children,r=n.parent.children,i=n.i?r[n.i-1]:null;if(e){!function(t){for(var n,e=0,r=0,i=t.children,o=i.length;--o>=0;)(n=i[o]).z+=e,n.m+=e,e+=n.s+(r+=n.c)}(n);var o=(e[0].z+e[e.length-1].z)/2;i?(n.z=i.z+t(n._,i._),n.m=n.z-o):n.z=o}else i&&(n.z=i.z+t(n._,i._));n.parent.A=function(n,e,r){if(e){for(var i,o=n,a=n,u=e,c=o.parent.children[0],f=o.m,s=a.m,l=u.m,h=c.m;u=Gl(u),o=Xl(o),u&&o;)c=Xl(c),(a=Gl(a)).a=n,(i=u.z+l-o.z-f+t(u._,o._))>0&&(Vl($l(u,n,r),n,i),f+=i,s+=i),l+=u.m,f+=o.m,h+=c.m,s+=a.m;u&&!Gl(a)&&(a.t=u,a.m+=l-s),o&&!Xl(c)&&(c.t=o,c.m+=f-h,r=n)}return r}(n,i,n.parent.A||r[0])}function a(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function u(t){t.x*=n,t.y=t.depth*e}return i.separation=function(n){return arguments.length?(t=n,i):t},i.size=function(t){return arguments.length?(r=!1,n=+t[0],e=+t[1],i):r?null:[n,e]},i.nodeSize=function(t){return arguments.length?(r=!0,n=+t[0],e=+t[1],i):r?[n,e]:null},i},t.treemap=function(){var t=Kl,n=!1,e=1,r=1,i=[0],o=Pl,a=Pl,u=Pl,c=Pl,f=Pl;function s(t){return t.x0=t.y0=0,t.x1=e,t.y1=r,t.eachBefore(l),i=[0],n&&t.eachBefore(Ul),t}function l(n){var e=i[n.depth],r=n.x0+e,s=n.y0+e,l=n.x1-e,h=n.y1-e;l=e-1){var s=u[n];return s.x0=i,s.y0=o,s.x1=a,void(s.y1=c)}for(var l=f[n],h=r/2+l,d=n+1,p=e-1;d>>1;f[v]c-o){var _=(i*y+a*g)/r;t(n,d,g,i,o,_,c),t(d,e,y,_,o,a,c)}else{var b=(o*y+c*g)/r;t(n,d,g,i,o,a,b),t(d,e,y,i,b,a,c)}}(0,c,t.value,n,e,r,i)},t.treemapDice=Ol,t.treemapSlice=Zl,t.treemapSliceDice=function(t,n,e,r,i){(1&t.depth?Zl:Ol)(t,n,e,r,i)},t.treemapSquarify=Kl,t.treemapResquarify=th,t.interpolate=ye,t.interpolateArray=se,t.interpolateBasis=Kn,t.interpolateBasisClosed=te,t.interpolateDate=le,t.interpolateDiscrete=function(t){var n=t.length;return function(e){return t[Math.max(0,Math.min(n-1,Math.floor(e*n)))]}},t.interpolateHue=function(t,n){var e=re(+t,+n);return function(t){var n=e(t);return n-360*Math.floor(n/360)}},t.interpolateNumber=he,t.interpolateObject=de,t.interpolateRound=_e,t.interpolateString=ge,t.interpolateTransformCss=Se,t.interpolateTransformSvg=ke,t.interpolateZoom=De,t.interpolateRgb=ae,t.interpolateRgbBasis=ce,t.interpolateRgbBasisClosed=fe,t.interpolateHsl=Le,t.interpolateHslLong=Ue,t.interpolateLab=function(t,n){var e=oe((t=Rn(t)).l,(n=Rn(n)).l),r=oe(t.a,n.a),i=oe(t.b,n.b),o=oe(t.opacity,n.opacity);return function(n){return t.l=e(n),t.a=r(n),t.b=i(n),t.opacity=o(n),t+""}},t.interpolateHcl=Be,t.interpolateHclLong=Ye,t.interpolateCubehelix=Ie,t.interpolateCubehelixLong=je,t.piecewise=function(t,n){for(var e=0,r=n.length-1,i=n[0],o=new Array(r<0?0:r);e=0;--n)f.push(t[r[o[n]][2]]);for(n=+u;nu!=f>u&&a<(c-e)*(u-r)/(f-r)+e&&(s=!s),c=e,f=r;return s},t.polygonLength=function(t){for(var n,e,r=-1,i=t.length,o=t[i-1],a=o[0],u=o[1],c=0;++r0?a[n-1]:r[0],n=o?[a[o-1],r]:[a[n-1],a[n]]},c.unknown=function(t){return arguments.length?(n=t,c):c},c.thresholds=function(){return a.slice()},c.copy=function(){return t().domain([e,r]).range(u).unknown(n)},sh.apply(Eh(c),arguments)},t.scaleThreshold=function t(){var n,e=[.5],r=[0,1],o=1;function a(t){return t<=t?r[i(e,t,0,o)]:n}return a.domain=function(t){return arguments.length?(e=ph.call(t),o=Math.min(e.length,r.length-1),a):e.slice()},a.range=function(t){return arguments.length?(r=ph.call(t),o=Math.min(e.length,r.length-1),a):r.slice()},a.invertExtent=function(t){var n=r.indexOf(t);return[e[n-1],e[n]]},a.unknown=function(t){return arguments.length?(n=t,a):n},a.copy=function(){return t().domain(e).range(r).unknown(n)},sh.apply(a,arguments)},t.scaleTime=function(){return sh.apply(Nv(Nd,wd,cd,od,rd,nd,Kh,Wh,t.timeFormat).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)},t.scaleUtc=function(){return sh.apply(Nv(Wd,Vd,Rd,Cd,kd,Td,Kh,Wh,t.utcFormat).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)},t.scaleSequential=function t(){var n=Eh(Av()(mh));return n.copy=function(){return Tv(n,t())},lh.apply(n,arguments)},t.scaleSequentialLog=function t(){var n=Uh(Av()).domain([1,10]);return n.copy=function(){return Tv(n,t()).base(n.base())},lh.apply(n,arguments)},t.scaleSequentialPow=Sv,t.scaleSequentialSqrt=function(){return Sv.apply(null,arguments).exponent(.5)},t.scaleSequentialSymlog=function t(){var n=Yh(Av());return n.copy=function(){return Tv(n,t()).constant(n.constant())},lh.apply(n,arguments)},t.scaleSequentialQuantile=function t(){var e=[],r=mh;function o(t){if(!isNaN(t=+t))return r((i(e,t)-1)/(e.length-1))}return o.domain=function(t){if(!arguments.length)return e.slice();e=[];for(var r,i=0,a=t.length;i1)&&(t-=Math.floor(t));var n=Math.abs(t-.5);return Hg.h=360*t-100,Hg.s=1.5-1.5*n,Hg.l=.8-.9*n,Hg+""},t.interpolateWarm=Ig,t.interpolateCool=jg,t.interpolateSinebow=function(t){var n;return t=(.5-t)*Math.PI,Xg.r=255*(n=Math.sin(t))*n,Xg.g=255*(n=Math.sin(t+Gg))*n,Xg.b=255*(n=Math.sin(t+Vg))*n,Xg+""},t.interpolateViridis=Wg,t.interpolateMagma=Zg,t.interpolateInferno=Qg,t.interpolatePlasma=Jg,t.create=function(t){return zt(W(t).call(document.documentElement))},t.creator=W,t.local=Dt,t.matcher=tt,t.mouse=Ot,t.namespace=$,t.namespaces=V,t.clientPoint=Ut,t.select=zt,t.selectAll=function(t){return"string"==typeof t?new Ct([document.querySelectorAll(t)],[document.documentElement]):new Ct([null==t?[]:t],Et)},t.selection=Pt,t.selector=Q,t.selectorAll=K,t.style=ct,t.touch=Bt,t.touches=function(t,n){null==n&&(n=Lt().touches);for(var e=0,r=n?n.length:0,i=new Array(r);ed;if(u||(u=c=Hi()),huy)if(v>sy-uy)u.moveTo(h*ey(d),h*oy(d)),u.arc(0,0,h,d,p,!g),l>uy&&(u.moveTo(l*ey(p),l*oy(p)),u.arc(0,0,l,p,d,g));else{var y,_,b=d,m=p,x=d,w=p,M=v,N=v,A=a.apply(this,arguments)/2,T=A>uy&&(r?+r.apply(this,arguments):ay(l*l+h*h)),S=iy(ty(h-l)/2,+e.apply(this,arguments)),k=S,E=S;if(T>uy){var C=ly(T/l*oy(A)),P=ly(T/h*oy(A));(M-=2*C)>uy?(x+=C*=g?1:-1,w-=C):(M=0,x=w=(d+p)/2),(N-=2*P)>uy?(b+=P*=g?1:-1,m-=P):(N=0,b=m=(d+p)/2)}var z=h*ey(b),R=h*oy(b),D=l*ey(w),q=l*oy(w);if(S>uy){var L,U=h*ey(m),O=h*oy(m),B=l*ey(x),Y=l*oy(x);if(v1?0:s<-1?cy:Math.acos(s))/2),G=ay(L[0]*L[0]+L[1]*L[1]);k=iy(S,(l-G)/(X-1)),E=iy(S,(h-G)/(X+1))}}N>uy?E>uy?(y=yy(B,Y,z,R,h,E,g),_=yy(U,O,D,q,h,E,g),u.moveTo(y.cx+y.x01,y.cy+y.y01),Euy&&M>uy?k>uy?(y=yy(D,q,U,O,l,-k,g),_=yy(z,R,B,Y,l,-k,g),u.lineTo(y.cx+y.x01,y.cy+y.y01),k0&&(d+=l);for(null!=n?p.sort(function(t,e){return n(v[t],v[e])}):null!=e&&p.sort(function(t,n){return e(a[t],a[n])}),u=0,f=d?(y-h*b)/d:0;u0?l*f:0)+b,v[c]={data:a[c],index:u,value:l,startAngle:g,endAngle:s,padAngle:_};return v}return a.value=function(n){return arguments.length?(t="function"==typeof n?n:Kg(+n),a):t},a.sortValues=function(t){return arguments.length?(n=t,e=null,a):n},a.sort=function(t){return arguments.length?(e=t,n=null,a):e},a.startAngle=function(t){return arguments.length?(r="function"==typeof t?t:Kg(+t),a):r},a.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:Kg(+t),a):i},a.padAngle=function(t){return arguments.length?(o="function"==typeof t?t:Kg(+t),a):o},a},t.areaRadial=Py,t.radialArea=Py,t.lineRadial=Cy,t.radialLine=Cy,t.pointRadial=zy,t.linkHorizontal=function(){return Ly(Uy)},t.linkVertical=function(){return Ly(Oy)},t.linkRadial=function(){var t=Ly(By);return t.angle=t.x,delete t.x,t.radius=t.y,delete t.y,t},t.symbol=function(){var t=Kg(Yy),n=Kg(64),e=null;function r(){var r;if(e||(e=r=Hi()),t.apply(this,arguments).draw(e,+n.apply(this,arguments)),r)return e=null,r+""||null}return r.type=function(n){return arguments.length?(t="function"==typeof n?n:Kg(n),r):t},r.size=function(t){return arguments.length?(n="function"==typeof t?t:Kg(+t),r):n},r.context=function(t){return arguments.length?(e=null==t?null:t,r):e},r},t.symbols=e_,t.symbolCircle=Yy,t.symbolCross=Fy,t.symbolDiamond=Hy,t.symbolSquare=Wy,t.symbolStar=$y,t.symbolTriangle=Qy,t.symbolWye=n_,t.curveBasisClosed=function(t){return new a_(t)},t.curveBasisOpen=function(t){return new u_(t)},t.curveBasis=function(t){return new o_(t)},t.curveBundle=f_,t.curveCardinalClosed=p_,t.curveCardinalOpen=g_,t.curveCardinal=h_,t.curveCatmullRomClosed=x_,t.curveCatmullRomOpen=M_,t.curveCatmullRom=b_,t.curveLinearClosed=function(t){return new N_(t)},t.curveLinear=by,t.curveMonotoneX=function(t){return new E_(t)},t.curveMonotoneY=function(t){return new C_(t)},t.curveNatural=function(t){return new z_(t)},t.curveStep=function(t){return new D_(t,.5)},t.curveStepAfter=function(t){return new D_(t,1)},t.curveStepBefore=function(t){return new D_(t,0)},t.stack=function(){var t=Kg([]),n=L_,e=q_,r=U_;function i(i){var o,a,u=t.apply(this,arguments),c=i.length,f=u.length,s=new Array(f);for(o=0;o0){for(var e,r,i,o=0,a=t[0].length;o1)for(var e,r,i,o,a,u,c=0,f=t[n[0]].length;c=0?(r[0]=o,r[1]=o+=i):i<0?(r[1]=a,r[0]=a+=i):r[0]=o},t.stackOffsetNone=q_,t.stackOffsetSilhouette=function(t,n){if((e=t.length)>0){for(var e,r=0,i=t[n[0]],o=i.length;r0&&(r=(e=t[n[0]]).length)>0){for(var e,r,i,o=0,a=1;adr&&e.name===n)return new Er([[t]],fi,n,+r);return null},t.interrupt=Mr,t.voronoi=function(){var t=j_,n=H_,e=null;function r(r){return new Nb(r.map(function(e,i){var o=[Math.round(t(e,i,r)/xb)*xb,Math.round(n(e,i,r)/xb)*xb];return o.index=i,o.data=e,o}),e)}return r.polygons=function(t){return r(t).polygons()},r.links=function(t){return r(t).links()},r.triangles=function(t){return r(t).triangles()},r.x=function(n){return arguments.length?(t="function"==typeof n?n:I_(+n),r):t},r.y=function(t){return arguments.length?(n="function"==typeof t?t:I_(+t),r):n},r.extent=function(t){return arguments.length?(e=null==t?null:[[+t[0][0],+t[0][1]],[+t[1][0],+t[1][1]]],r):e&&[[e[0][0],e[0][1]],[e[1][0],e[1][1]]]},r.size=function(t){return arguments.length?(e=null==t?null:[[0,0],[+t[0],+t[1]]],r):e&&[e[1][0]-e[0][0],e[1][1]-e[0][1]]},r},t.zoom=function(){var n,e,r=zb,i=Rb,o=Ub,a=qb,u=Lb,c=[0,1/0],f=[[-1/0,-1/0],[1/0,1/0]],s=250,l=De,h=[],d=I("start","zoom","end"),p=500,v=150,g=0;function y(t){t.property("__zoom",Db).on("wheel.zoom",N).on("mousedown.zoom",A).on("dblclick.zoom",T).filter(u).on("touchstart.zoom",S).on("touchmove.zoom",k).on("touchend.zoom touchcancel.zoom",E).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function _(t,n){return(n=Math.max(c[0],Math.min(c[1],n)))===t.k?t:new Sb(n,t.x,t.y)}function b(t,n,e){var r=n[0]-e[0]*t.k,i=n[1]-e[1]*t.k;return r===t.x&&i===t.y?t:new Sb(t.k,r,i)}function m(t){return[(+t[0][0]+ +t[1][0])/2,(+t[0][1]+ +t[1][1])/2]}function x(t,n,e){t.on("start.zoom",function(){w(this,arguments).start()}).on("interrupt.zoom end.zoom",function(){w(this,arguments).end()}).tween("zoom",function(){var t=arguments,r=w(this,t),o=i.apply(this,t),a=e||m(o),u=Math.max(o[1][0]-o[0][0],o[1][1]-o[0][1]),c=this.__zoom,f="function"==typeof n?n.apply(this,t):n,s=l(c.invert(a).concat(u/c.k),f.invert(a).concat(u/f.k));return function(t){if(1===t)t=f;else{var n=s(t),e=u/n[2];t=new Sb(e,a[0]-n[0]*e,a[1]-n[1]*e)}r.zoom(null,t)}})}function w(t,n){for(var e,r=0,i=h.length;rg}n.zoom("mouse",o(b(n.that.__zoom,n.mouse[0]=Ot(n.that),n.mouse[1]),n.extent,f))},!0).on("mouseup.zoom",function(){i.on("mousemove.zoom mouseup.zoom",null),jt(t.event.view,n.moved),Pb(),n.end()},!0),a=Ot(this),u=t.event.clientX,c=t.event.clientY;It(t.event.view),Cb(),n.mouse=[a,this.__zoom.invert(a)],Mr(this),n.start()}}function T(){if(r.apply(this,arguments)){var n=this.__zoom,e=Ot(this),a=n.invert(e),u=n.k*(t.event.shiftKey?.5:2),c=o(b(_(n,u),e,a),i.apply(this,arguments),f);Pb(),s>0?zt(this).transition().duration(s).call(x,c,e):zt(this).call(y.transform,c)}}function S(){if(r.apply(this,arguments)){var e,i,o,a,u=w(this,arguments),c=t.event.changedTouches,f=c.length;for(Cb(),i=0;i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/webroot/rsrc/externals/font/lato/lato-bold.ttf b/webroot/rsrc/externals/font/lato/lato-bold.ttf new file mode 100644 index 0000000000..8f21fa697c Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-bold.ttf differ diff --git a/webroot/rsrc/externals/font/lato/lato-bold.woff b/webroot/rsrc/externals/font/lato/lato-bold.woff new file mode 100644 index 0000000000..3b369bae85 Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-bold.woff differ diff --git a/webroot/rsrc/externals/font/lato/lato-bold.woff2 b/webroot/rsrc/externals/font/lato/lato-bold.woff2 new file mode 100644 index 0000000000..308952d14e Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-bold.woff2 differ diff --git a/webroot/rsrc/externals/font/lato/lato-bolditalic.eot b/webroot/rsrc/externals/font/lato/lato-bolditalic.eot new file mode 100644 index 0000000000..974c1b27de Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-bolditalic.eot differ diff --git a/webroot/rsrc/externals/font/lato/lato-bolditalic.svg b/webroot/rsrc/externals/font/lato/lato-bolditalic.svg new file mode 100644 index 0000000000..e7f754961c --- /dev/null +++ b/webroot/rsrc/externals/font/lato/lato-bolditalic.svg @@ -0,0 +1,21458 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/webroot/rsrc/externals/font/lato/lato-bolditalic.ttf b/webroot/rsrc/externals/font/lato/lato-bolditalic.ttf new file mode 100644 index 0000000000..779af7690f Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-bolditalic.ttf differ diff --git a/webroot/rsrc/externals/font/lato/lato-bolditalic.woff b/webroot/rsrc/externals/font/lato/lato-bolditalic.woff new file mode 100644 index 0000000000..3ddaac4c70 Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-bolditalic.woff differ diff --git a/webroot/rsrc/externals/font/lato/lato-bolditalic.woff2 b/webroot/rsrc/externals/font/lato/lato-bolditalic.woff2 new file mode 100644 index 0000000000..c9b384d8a9 Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-bolditalic.woff2 differ diff --git a/webroot/rsrc/externals/font/lato/lato-italic.eot b/webroot/rsrc/externals/font/lato/lato-italic.eot new file mode 100644 index 0000000000..050091c4a3 Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-italic.eot differ diff --git a/webroot/rsrc/externals/font/lato/lato-italic.svg b/webroot/rsrc/externals/font/lato/lato-italic.svg new file mode 100644 index 0000000000..4dd44414f4 --- /dev/null +++ b/webroot/rsrc/externals/font/lato/lato-italic.svg @@ -0,0 +1,21472 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/webroot/rsrc/externals/font/lato/lato-italic.ttf b/webroot/rsrc/externals/font/lato/lato-italic.ttf new file mode 100644 index 0000000000..82d814c5e2 Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-italic.ttf differ diff --git a/webroot/rsrc/externals/font/lato/lato-italic.woff b/webroot/rsrc/externals/font/lato/lato-italic.woff new file mode 100644 index 0000000000..caa3808548 Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-italic.woff differ diff --git a/webroot/rsrc/externals/font/lato/lato-italic.woff2 b/webroot/rsrc/externals/font/lato/lato-italic.woff2 new file mode 100644 index 0000000000..fbcd0df65e Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-italic.woff2 differ diff --git a/webroot/rsrc/externals/font/lato/lato-regular.eot b/webroot/rsrc/externals/font/lato/lato-regular.eot new file mode 100644 index 0000000000..969929e487 Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-regular.eot differ diff --git a/webroot/rsrc/externals/font/lato/lato-regular.svg b/webroot/rsrc/externals/font/lato/lato-regular.svg new file mode 100644 index 0000000000..bc91d4ad31 --- /dev/null +++ b/webroot/rsrc/externals/font/lato/lato-regular.svg @@ -0,0 +1,22398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/webroot/rsrc/externals/font/lato/lato-regular.ttf b/webroot/rsrc/externals/font/lato/lato-regular.ttf new file mode 100644 index 0000000000..ead8c605ae Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-regular.ttf differ diff --git a/webroot/rsrc/externals/font/lato/lato-regular.woff b/webroot/rsrc/externals/font/lato/lato-regular.woff new file mode 100644 index 0000000000..225872fddf Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-regular.woff differ diff --git a/webroot/rsrc/externals/font/lato/lato-regular.woff2 b/webroot/rsrc/externals/font/lato/lato-regular.woff2 new file mode 100644 index 0000000000..a069114493 Binary files /dev/null and b/webroot/rsrc/externals/font/lato/lato-regular.woff2 differ diff --git a/webroot/rsrc/externals/javelin/LICENSE b/webroot/rsrc/externals/javelin/LICENSE index 48fb9f83b0..cc10f0dabd 100644 --- a/webroot/rsrc/externals/javelin/LICENSE +++ b/webroot/rsrc/externals/javelin/LICENSE @@ -12,14 +12,13 @@ modification, are permitted provided that the following conditions are met: may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/webroot/rsrc/externals/javelin/core/Event.js b/webroot/rsrc/externals/javelin/core/Event.js index 51e3cfd897..787a453c4d 100644 --- a/webroot/rsrc/externals/javelin/core/Event.js +++ b/webroot/rsrc/externals/javelin/core/Event.js @@ -21,7 +21,6 @@ * * @task stop Stopping Event Behaviors * @task info Getting Event Information - * @group event */ JX.install('Event', { members : { @@ -134,6 +133,20 @@ JX.install('Event', { return r.which == 3 || r.button == 2; }, + + /** + * Get whether the mouse button associated with the mouse event is the + * left-side button in a browser-agnostic way. + * + * @return bool + * @task info + */ + isLeftButton: function() { + var r = this.getRawEvent(); + return (r.which == 1 || r.button == 0); + }, + + /** * Determine if a mouse event is a normal event (left mouse button, no * modifier keys). @@ -142,9 +155,8 @@ JX.install('Event', { * @task info */ isNormalMouseEvent : function() { - var supportedEvents = ['click', 'mouseup', 'mousedown']; - - if (supportedEvents.indexOf(this.getType()) == -1) { + var supportedEvents = {'click': 1, 'mouseup': 1, 'mousedown': 1}; + if (!(this.getType() in supportedEvents)) { return false; } @@ -159,7 +171,12 @@ JX.install('Event', { } if (('button' in r) && r.button) { - return false; + if ('which' in r) { + return false; + // IE won't have which and has left click == 1 here + } else if (r.button != 1) { + return false; + } } return true; @@ -207,7 +224,7 @@ JX.install('Event', { /** * Get the metadata associated with the node that corresponds to the key - * in this event's node map. This is a simple helper method that makes + * in this event's node map. This is a simple helper method that makes * the API for accessing metadata associated with specific nodes less ugly. * * JX.Stratcom.listen('click', 'tag:a', function(event) { @@ -323,7 +340,16 @@ JX.install('Event', { /** * @task info */ - nodeDistances : {} + nodeDistances : {}, + + /** + * True if this is a cursor event that was caused by a touch interaction + * rather than a mouse device interaction. + * + * @type bool + * @taks info + */ + isTouchEvent: false }, /** @@ -336,7 +362,13 @@ JX.install('Event', { if (__DEV__) { JX.Event.prototype.toString = function() { var path = '['+this.getPath().join(', ')+']'; - return 'Event<'+this.getType()+', '+path+', '+this.getTarget()+'>'; + + var type = this.getType(); + if (this.getIsTouchEvent()) { + type = type + '/touch'; + } + + return 'Event<'+type+', '+path+', '+this.getTarget()+'>'; }; } } diff --git a/webroot/rsrc/externals/javelin/core/Stratcom.js b/webroot/rsrc/externals/javelin/core/Stratcom.js index dc62c852de..9ad2b8bbd0 100644 --- a/webroot/rsrc/externals/javelin/core/Stratcom.js +++ b/webroot/rsrc/externals/javelin/core/Stratcom.js @@ -31,7 +31,6 @@ * @task sigil Managing Sigils * @task meta Managing Metadata * @task internal Internals - * @group event */ JX.install('Stratcom', { statics : { @@ -42,6 +41,7 @@ JX.install('Stratcom', { _auto : '*', _data : {}, _execContext : [], + _touchState: null, /** * Node metadata is stored in a series of blocks to prevent collisions @@ -224,7 +224,7 @@ JX.install('Stratcom', { } // Add a remove function to the listener - listener['remove'] = function() { + listener.remove = function() { if (listener._callback) { delete listener._callback; for (var ii = 0; ii < ids.length; ii++) { @@ -331,6 +331,45 @@ JX.install('Stratcom', { etype = 'blur'; } + // Map of touch events and whether they are unique per touch. + var touch_map = { + touchstart: true, + touchend: true, + mousedown: true, + mouseup: true, + click: true, + + // These can conceivably fire multiple times per touch, so if we see + // them more than once that doesn't tell us that we're handling a new + // event. + mouseover: false, + mouseout: false, + mousemove: false, + touchmove: false + }; + + // If this is a 'touchstart', we're handling touch events. + if (etype == 'touchstart') { + this._touchState = {}; + } + + // If this is a unique touch event that we haven't seen before, remember + // it as part of the current touch state. On the other hand, if we've + // already seen it, we can deduce that we must be handling a new cursor + // event that is unrelated to the last touch we saw, and conclude that + // we are no longer processing a touch event. + if (touch_map[etype] && this._touchState) { + if (!this._touchState[etype]) { + this._touchState[etype] = true; + } else { + this._touchState = null; + } + } + + // This event is a touch event if we're carrying some touch state. + var is_touch = (etype in touch_map) && + (this._touchState !== null); + var proxy = new JX.Event() .setRawEvent(event) .setData(event.customData) @@ -338,9 +377,11 @@ JX.install('Stratcom', { .setTarget(target) .setNodes(nodes) .setNodeDistances(distances) + .setIsTouchEvent(is_touch) .setPath(path.reverse()); - // Don't touch this for debugging purposes + // You can uncomment this to print out all events flowing through + // Stratcom, which tends to make debugging easier. //JX.log('~> '+proxy.toString()); return this._dispatchProxy(proxy); @@ -476,6 +517,36 @@ JX.install('Stratcom', { return len ? this._execContext[len - 1].event : null; }, + initialize: function(initializers) { + var frameable = false; + + for (var ii = 0; ii < initializers.length; ii++) { + var kind = initializers[ii].kind; + var data = initializers[ii].data; + switch (kind) { + case 'behaviors': + JX.initBehaviors(data); + break; + case 'merge': + JX.Stratcom.mergeData(data.block, data.data); + JX.Stratcom.ready = true; + break; + case 'frameable': + frameable = !!data; + break; + } + } + + // If the initializer tags did not explicitly allow framing, framebust. + // This protects us from clickjacking attacks on older versions of IE. + // The "X-Frame-Options" and "Content-Security-Policy" headers provide + // more modern variations of this protection. + if (!frameable) { + if (window.top != window.self) { + window.top.location.replace(window.self.location.href); + } + } + }, /** * Merge metadata. You must call this (even if you have no metadata) to @@ -501,7 +572,6 @@ JX.install('Stratcom', { } else { this._data[block] = data; if (block === 0) { - JX.Stratcom.ready = true; JX.flushHoldingQueue('install-init', function(fn) { fn(); }); diff --git a/webroot/rsrc/externals/javelin/core/__tests__/event-stop-and-kill.js b/webroot/rsrc/externals/javelin/core/__tests__/event-stop-and-kill.js index bc45d43fe0..09a2d3a764 100644 --- a/webroot/rsrc/externals/javelin/core/__tests__/event-stop-and-kill.js +++ b/webroot/rsrc/externals/javelin/core/__tests__/event-stop-and-kill.js @@ -33,7 +33,3 @@ describe('Event Stop/Kill', function() { expect(target.getStopped()).toBe(true); }); }); - - - - diff --git a/webroot/rsrc/externals/javelin/core/__tests__/install.js b/webroot/rsrc/externals/javelin/core/__tests__/install.js index c6b78ce9e0..c13a281bd8 100644 --- a/webroot/rsrc/externals/javelin/core/__tests__/install.js +++ b/webroot/rsrc/externals/javelin/core/__tests__/install.js @@ -149,4 +149,3 @@ describe('Javelin Install', function() { }); }); - diff --git a/webroot/rsrc/externals/javelin/core/__tests__/stratcom.js b/webroot/rsrc/externals/javelin/core/__tests__/stratcom.js index 6638ef1fc0..2bdbae8d78 100644 --- a/webroot/rsrc/externals/javelin/core/__tests__/stratcom.js +++ b/webroot/rsrc/externals/javelin/core/__tests__/stratcom.js @@ -3,10 +3,10 @@ * javelin-dom */ describe('Stratcom Tests', function() { - node1 = document.createElement('div'); + var node1 = document.createElement('div'); JX.Stratcom.addSigil(node1, 'what'); - node2 = document; - node3 = document.createElement('div'); + var node2 = document; + var node3 = document.createElement('div'); node3.className = 'what'; it('should disallow document', function() { diff --git a/webroot/rsrc/externals/javelin/core/__tests__/util.js b/webroot/rsrc/externals/javelin/core/__tests__/util.js index b2f72c6747..0f7f861a19 100644 --- a/webroot/rsrc/externals/javelin/core/__tests__/util.js +++ b/webroot/rsrc/externals/javelin/core/__tests__/util.js @@ -29,7 +29,7 @@ describe('JX.isArray', function() { it('should identify an array from another context as an array', function() { var iframe = document.createElement('iframe'); - var name = iframe.name = 'javelin-iframe-test'; + iframe.name = 'javelin-iframe-test'; iframe.style.display = 'none'; document.body.insertBefore(iframe, document.body.firstChild); diff --git a/webroot/rsrc/externals/javelin/core/init.js b/webroot/rsrc/externals/javelin/core/init.js index cab62d34f8..61c9f13d6d 100644 --- a/webroot/rsrc/externals/javelin/core/init.js +++ b/webroot/rsrc/externals/javelin/core/init.js @@ -46,35 +46,62 @@ makeHoldingQueue('behavior'); makeHoldingQueue('install-init'); - window['__DEV__'] = window['__DEV__'] || 0; - var loaded = false; var onload = []; var master_event_queue = []; var root = document.documentElement; var has_add_event_listener = !!root.addEventListener; + window.__DEV__ = !!root.getAttribute('data-developer-mode'); + JX.__rawEventQueue = function(what) { master_event_queue.push(what); - // Evade static analysis - JX.Stratcom + var ii; var Stratcom = JX['Stratcom']; - if (Stratcom && Stratcom.ready) { - // Empty the queue now so that exceptions don't cause us to repeatedly - // try to handle events. + + if (!loaded && what.type == 'domready') { + var initializers = []; + + var tags = JX.DOM.scry(document.body, 'data'); + for (ii = 0; ii < tags.length; ii++) { + + // Ignore tags which are not immediate children of the document + // body. If an attacker somehow injects arbitrary tags into the + // content of the document, that should not give them access to + // modify initialization behaviors. + if (tags[ii].parentNode !== document.body) { + continue; + } + + var tag_kind = tags[ii].getAttribute('data-javelin-init-kind'); + var tag_data = tags[ii].getAttribute('data-javelin-init-data'); + tag_data = JX.JSON.parse(tag_data); + + initializers.push({kind: tag_kind, data: tag_data}); + } + + Stratcom.initialize(initializers); + loaded = true; + } + + if (loaded) { + // Empty the queue now so that exceptions don't cause us to repeatedly + // try to handle events. var local_queue = master_event_queue; master_event_queue = []; - for (var ii = 0; ii < local_queue.length; ++ii) { + for (ii = 0; ii < local_queue.length; ++ii) { var evt = local_queue[ii]; - // Sometimes IE gives us events which throw when ".type" is accessed; - // just ignore them since we can't meaningfully dispatch them. TODO: - // figure out where these are coming from. + // Sometimes IE gives us events which throw when ".type" is accessed; + // just ignore them since we can't meaningfully dispatch them. TODO: + // figure out where these are coming from. try { var test = evt.type; } catch (x) { continue; } - if (!loaded && evt.type == 'domready') { - document.body && (document.body.id = null); - loaded = true; + if (evt.type == 'domready') { + // NOTE: Firefox interprets "document.body.id = null" as the string + // literal "null". + document.body && (document.body.id = ''); for (var jj = 0; jj < onload.length; jj++) { onload[jj](); } @@ -130,7 +157,6 @@ 'mousedown', 'mouseover', 'mouseout', - 'mouseup', 'keyup', 'keydown', 'input', @@ -142,7 +168,8 @@ 'touchstart', 'touchmove', 'touchend', - 'touchcancel' + 'touchcancel', + 'load' ]; // Simulate focus and blur in old versions of IE using focusin and focusout @@ -170,8 +197,8 @@ JX.enableDispatch(root, document_events[ii]); } - // In particular, we're interested in capturing window focus/blur here so - // long polls can abort when the window is not focused. + // In particular, we're interested in capturing window focus/blur here so + // long polls can abort when the window is not focused. var window_events = [ ('onpagehide' in window) ? 'pagehide' : 'unload', 'resize', @@ -179,9 +206,22 @@ 'focus', 'blur', 'popstate', - 'hashchange' + 'hashchange', + + // In Firefox, if the user clicks in the window then drags the cursor + // outside of the window and releases the mouse button, we don't get this + // event unless we listen for it as a window event. + 'mouseup' ]; + try { + if (window.localStorage) { + window_events.push('storage'); + } + } catch (storage_exception) { + // See PHI985. In Firefox, accessing "window.localStorage" may throw an + // exception if cookies are disabled. + } for (ii = 0; ii < window_events.length; ++ii) { JX.enableDispatch(window, window_events[ii]); @@ -203,9 +243,9 @@ }, true); } else { var ready = - "if (this.readyState == 'complete') {" + - "JX.__rawEventQueue({type: 'domready'});" + - "}"; + 'if (this.readyState == "complete") {' + + 'JX.__rawEventQueue({type: "domready"});' + + '}'; // NOTE: Don't write a 'src' attribute, because "javascript:void(0)" causes // a mixed content warning in IE8 if the page is served over SSL. diff --git a/webroot/rsrc/externals/javelin/core/init_node.js b/webroot/rsrc/externals/javelin/core/init_node.js new file mode 100644 index 0000000000..1a7999e253 --- /dev/null +++ b/webroot/rsrc/externals/javelin/core/init_node.js @@ -0,0 +1,55 @@ +'use strict'; + +/** + * Alternative Javelin init file for Node.js. + * + * @javelin-installs JX.enableDispatch + * @javelin-installs JX.onload + * @javelin-installs JX.flushHoldingQueue + * @javelin-installs JX.require + * + * @javelin + */ + +var JX = {}; +var fs = require('fs'); +var vm = require('vm'); +var pathModule = require('path'); + +var noop = function() {}; + +JX.enableDispatch = noop; +JX.flushHoldingQueue = noop; + +JX.onload = function(func) { + func(); +}; + +JX.require = function(thing) { + var path = __dirname + '/../' + thing + '.js'; + var content = fs.readFileSync(path); + var dir = pathModule.dirname(path); + + var k; + var sandbox = {}; + + for (k in global) { + sandbox[k] = global[k]; + } + + var extra = { + JX: this, + __DEV__: 0, + window: {}, + __dirname: dir + }; + + for (k in extra) { + sandbox[k] = extra[k]; + } + + vm.createScript(content, path) + .runInNewContext(sandbox); +}; + +exports.JX = JX; diff --git a/webroot/rsrc/externals/javelin/core/install.js b/webroot/rsrc/externals/javelin/core/install.js index 9f492569f8..c56e6489a0 100644 --- a/webroot/rsrc/externals/javelin/core/install.js +++ b/webroot/rsrc/externals/javelin/core/install.js @@ -77,8 +77,6 @@ * "namespace" (e.g., JX.Pancake). * @param map Map of properties, see method documentation. * @return void - * - * @group install */ JX.install = function(new_name, new_junk) { @@ -157,8 +155,6 @@ JX.install = function(new_name, new_junk) { * * @param junk Map of properties, see method documentation. * @return function Constructor of a class created - * - * @group install */ JX.createClass = function(junk) { var name = junk.name || ''; @@ -240,7 +236,7 @@ JX.createClass = function(junk) { }; }; var getter = function(prop) { - return function(v) { + return function() { return this[prop]; }; }; diff --git a/webroot/rsrc/externals/javelin/core/util.js b/webroot/rsrc/externals/javelin/core/util.js index cf29f246a5..d8495ba4e5 100644 --- a/webroot/rsrc/externals/javelin/core/util.js +++ b/webroot/rsrc/externals/javelin/core/util.js @@ -22,8 +22,6 @@ * Throw an exception and attach the caller data in the exception. * * @param string Exception message. - * - * @group util */ JX.$E = function(message) { var e = new Error(message); @@ -45,16 +43,13 @@ JX.$E = function(message) { * * @param obj Array, or array-like object. * @return Array Actual array. - * - * @group util */ -JX.$A = function(mysterious_arraylike_object) { - // NOTE: This avoids the Array.slice() trick because some bizarre COM object - // I dug up somewhere was freaking out when I tried to do it and it made me - // very upset, so do not replace this with Array.slice() cleverness. +JX.$A = function(object) { + // IE8 throws "JScript object expected" when trying to call + // Array.prototype.slice on a NodeList, so just copy items one by one here. var r = []; - for (var ii = 0; ii < mysterious_arraylike_object.length; ii++) { - r.push(mysterious_arraylike_object[ii]); + for (var ii = 0; ii < object.length; ii++) { + r.push(object[ii]); } return r; }; @@ -78,8 +73,6 @@ JX.$A = function(mysterious_arraylike_object) { * @param wild Scalar or Array. * @return Array If the argument was a scalar, an Array with the argument as * its only element. Otherwise, the original Array. - * - * @group util */ JX.$AX = function(maybe_scalar) { return JX.isArray(maybe_scalar) ? maybe_scalar : [maybe_scalar]; @@ -94,8 +87,6 @@ JX.$AX = function(maybe_scalar) { * * @param wild Any value. * @return bool true if the argument is an array, false otherwise. - * - * @group util */ JX.isArray = Array.isArray || function(maybe_array) { return Object.prototype.toString.call(maybe_array) == '[object Array]'; @@ -133,8 +124,6 @@ JX.isArray = Array.isArray || function(maybe_array) { * @param obj Destination object, which properties should be copied to. * @param obj Source object, which properties should be copied from. * @return obj Modified destination object. - * - * @group util */ JX.copy = function(copy_dst, copy_src) { for (var k in copy_src) { @@ -228,8 +217,6 @@ JX.copy = function(copy_dst, copy_src) { * @param ... Zero or more arguments to bind. * @return function New function which invokes the original function with * bound context and arguments when called. - * - * @group util */ JX.bind = function(context, func, more) { if (__DEV__) { @@ -257,8 +244,6 @@ JX.bind = function(context, func, more) { * actually have an effect. * * @return void - * - * @group util */ JX.bag = function() { // \o\ \o/ /o/ woo dance party @@ -272,8 +257,6 @@ JX.bag = function() { * * @param obj Object to retrieve keys from. * @return list List of keys. - * - * @group util */ JX.keys = Object.keys || function(obj) { var r = []; @@ -290,38 +273,93 @@ JX.keys = Object.keys || function(obj) { * * @param wild Any value. * @return wild The passed argument. - * - * @group util */ JX.id = function(any) { return any; }; -JX.log = JX.bag; +if (!window.console || !window.console.log) { + if (window.opera && window.opera.postError) { + window.console = {log: function(m) { window.opera.postError(m); }}; + } else { + window.console = {log: function() {}}; + } +} + -if (__DEV__) { - if (!window.console || !window.console.log) { - if (window.opera && window.opera.postError) { - window.console = {log: function(m) { window.opera.postError(m); }}; - } else { - window.console = {log: function(m) { }}; +/** + * Print a message to the browser debugging console (like Firebug). + * + * @param string Message to print to the browser debugging console. + * @return void + */ +JX.log = function(message) { + // "JX.log()" accepts "Error" in addition to "string". Only try to + // treat the argument as a "sprintf()" pattern if it's a string. + if (typeof message === 'string') { + message = JX.sprintf.apply(null, arguments); + } + window.console.log(message); +}; + +JX.sprintf = function(pattern) { + var argv = Array.prototype.slice.call(arguments); + argv.reverse(); + + // Pop off the pattern argument. + argv.pop(); + + var len = pattern.length; + var output = ''; + for (var ii = 0; ii < len; ii++) { + var c = pattern.charAt(ii); + + if (c !== '%') { + output += c; + continue; + } + + ii++; + + var next = pattern.charAt(ii); + if (next === '%') { + // This is "%%" (that is, an escaped "%" symbol), so just add a literal + // "%" to the result. + output += '%'; + continue; } + + if (next === 's') { + if (!argv.length) { + throw new Error( + 'Too few arguments to "JX.sprintf(...)" for pattern: ' + pattern); + } + + output += '' + argv.pop(); + + continue; + } + + if (next === '') { + throw new Error( + 'Pattern passed to "JX.sprintf(...)" ends with "%": ' + pattern); + } + + throw new Error( + 'Unknown conversion "%' + c + '" passed to "JX.sprintf(...)" in ' + + 'pattern: ' + pattern); } - /** - * Print a message to the browser debugging console (like Firebug). This - * method exists only in ##__DEV__##. - * - * @param string Message to print to the browser debugging console. - * @return void - * - * @group util - */ - JX.log = function(message) { - window.console.log(message); - }; + if (argv.length) { + throw new Error( + 'Too many arguments to "JX.sprintf()" for pattern: ' + pattern); + } + + return output; +}; +if (__DEV__) { window.alert = (function(native_alert) { var recent_alerts = []; var in_alert = false; @@ -341,7 +379,7 @@ if (__DEV__) { if (recent_alerts.length >= 3 && (recent_alerts[recent_alerts.length - 1] - recent_alerts[0]) < 5000) { - if (confirm(msg + "\n\nLots of alert()s recently. Kill them?")) { + if (window.confirm(msg + '\n\nLots of alert()s recently. Kill them?')) { window.alert = JX.bag; } } else { diff --git a/webroot/rsrc/externals/javelin/docs/Base.js b/webroot/rsrc/externals/javelin/docs/Base.js index dc207c7758..0d32239608 100644 --- a/webroot/rsrc/externals/javelin/docs/Base.js +++ b/webroot/rsrc/externals/javelin/docs/Base.js @@ -8,7 +8,6 @@ * which exist on all Javelin classes. This class documents those methods. * * @task events Builtin Events - * @group install */ JX.install('Base', { members : { @@ -68,8 +67,3 @@ JX.install('Base', { } }); - - - - - diff --git a/webroot/rsrc/externals/javelin/docs/concepts/behaviors.diviner b/webroot/rsrc/externals/javelin/docs/concepts/behaviors.diviner index f41afe13cd..f3cea9cda6 100644 --- a/webroot/rsrc/externals/javelin/docs/concepts/behaviors.diviner +++ b/webroot/rsrc/externals/javelin/docs/concepts/behaviors.diviner @@ -52,18 +52,18 @@ The callback you pass to @{function:JX.behavior} should have this signature: The function will be invoked once for each configuration dictionary passed to @{function:JX.initBehaviors}, and the dictionary will be passed as the -##config## parameter. For example, to alert the user that they've won two hogs: +`config` parameter. For example, to alert the user that they've won two hogs: lang=js JX.initBehaviors({ "win-a-hog" : [{hogName : "Ethel"}, {hogName: "Beatrice"}] }); -This will invoke the function twice, once for each ##config## dictionary. +This will invoke the function twice, once for each `config` dictionary. Usually, you invoke a behavior multiple times if you have several similar controls on a page, like multiple @{class:JX.Tokenizer}s. -An initially empty object will be passed in the ##statics## parameter, but +An initially empty object will be passed in the `statics` parameter, but changes to this object will persist across invocations of the behavior. For example: @@ -124,7 +124,7 @@ This has a wide array of technical and architectural problems: the full power of arbitrary JS execution. - It's utterly hideous. -In 2007/2008, we introduced @{function@libphutil:jsprintf} and a function called +In 2007/2008, we introduced @{function@arcanist:jsprintf} and a function called onloadRegister() to solve some of the obvious problems: lang=php @@ -142,7 +142,7 @@ code like this in order to address some of the other problems: By 2010 (particularly with the introduction of XHP) the API had become more sophisticated, but this is basically how most of Facebook's glue code still works as of mid-2011. If you view the source of any page, you'll see a bunch -of ##onloadRegister()## calls in the markup which are generated like this. +of `onloadRegister()` calls in the markup which are generated like this. This mitigates many of the problems but is still fairly awkward. Escaping is easier, but still possible to get wrong. Stuff is a bit easier to grep for, but @@ -168,7 +168,7 @@ Javelin behaviors provide a more structured solution to some of these problems: - The entire interface the server may invoke against can be readily inferred. Note that Javelin does provide @{function:JX.onload}, which behaves like -##onloadRegister()##. However, its use is discouraged. +`onloadRegister()`. However, its use is discouraged. The two major downsides to the behavior design appear to be: @@ -179,4 +179,3 @@ The two major downsides to the behavior design appear to be: have more than just glue code, and should have been refactored into a real class some time ago. This is a pretty high-level drawback and is manageable through awareness of the risk and code review. - diff --git a/webroot/rsrc/externals/javelin/docs/concepts/event_delegation.diviner b/webroot/rsrc/externals/javelin/docs/concepts/event_delegation.diviner index 3d62afca24..ca2a177a35 100644 --- a/webroot/rsrc/externals/javelin/docs/concepts/event_delegation.diviner +++ b/webroot/rsrc/externals/javelin/docs/concepts/event_delegation.diviner @@ -111,10 +111,10 @@ parameter and listens only for events within that node: // ... }); -This is similar to setting ##node.onclick## or ##node.addEventListener##, but +This is similar to setting `node.onclick` or `node.addEventListener`, but uses the Javelin delegation core. You can also provide a sigil set, which works just like @{method:JX.Stratcom.listen} general events. This is useful if your -node is a container, like a ##
    ##, with a lot of stuff in it. +node is a container, like a `
    `, with a lot of stuff in it. = DOM Event Flow = @@ -144,7 +144,7 @@ before the listener subscribed to 'outer' = Listening to Class Events = Beyond DOM events, you can also listen to class events. Every class installed -by Javelin has static and instance methods called ##listen## (see +by Javelin has static and instance methods called `listen` (see @{method:JX.Base.listen}). The static method allows you to listen for all events emitted by every instance of a class and its descendants: @@ -172,14 +172,14 @@ specific instance: Javelin implements general delegation by building and comparing sigil sets. Some of these sigils are not DOM sigils, but derived from other things: - - ##id:*## ID sigils are generated when an examined node has an "id" property. - - ##obj:*## Object sigils are generated when an event affects a class + - `id:*` ID sigils are generated when an examined node has an "id" property. + - `obj:*` Object sigils are generated when an event affects a class instance. - - ##class:*## Class sigils are generated while walking an affected instance's + - `class:*` Class sigils are generated while walking an affected instance's class chain. - - ##tag:*## Tag sigils are generated by examining the tag names of DOM nodes. + - `tag:*` Tag sigils are generated by examining the tag names of DOM nodes. -For instance, you can listen to all clicks on #### tags in a document like +For instance, you can listen to all clicks on `` tags in a document like this: lang=js diff --git a/webroot/rsrc/externals/javelin/docs/concepts/sigils_metadata.diviner b/webroot/rsrc/externals/javelin/docs/concepts/sigils_metadata.diviner index 38192aedc2..7123cd3332 100644 --- a/webroot/rsrc/externals/javelin/docs/concepts/sigils_metadata.diviner +++ b/webroot/rsrc/externals/javelin/docs/concepts/sigils_metadata.diviner @@ -21,7 +21,7 @@ about the structure of the document. It is reasonable to think of sigils as being CSS class names in a different, semantic namespace. -If you're emitting raw tags, you specify sigils by adding a ##data-sigil## +If you're emitting raw tags, you specify sigils by adding a `data-sigil` attribute to a node: lang=html @@ -94,7 +94,7 @@ This calls the function you provide when the user clicks on a "like" link, but you need to be able to distinguish between the different links so you can know which story the user is trying to like. Javelin allows you to do this by attaching **metadata** to each node. Metadata is attached to a node by adding a -##data-meta## attribute which has an index into data later provided to +`data-meta` attribute which has an index into data later provided to @{method:JX.Stratcom.mergeData}: lang=html diff --git a/webroot/rsrc/externals/javelin/docs/facebook.diviner b/webroot/rsrc/externals/javelin/docs/facebook.diviner deleted file mode 100644 index 5126ad2c35..0000000000 --- a/webroot/rsrc/externals/javelin/docs/facebook.diviner +++ /dev/null @@ -1,82 +0,0 @@ -@title Javelin at Facebook -@group facebook - -Information specific to Javelin at Facebook. - -= Building Support Scripts = - -Javelin now ships with the source to build several libfbjs-based binaries, which -serve to completely sever its dependencies on trunk: - - - ##javelinsymbols##: used for lint - - ##jsast##: used for documentation generation - - ##jsxmin##: used to crush packages - -To build these, first build libfbjs: - - javelin/ $ cd externals/libfbjs - javelin/externals/libfbjs/ $ CXX=/usr/bin/g++ make - -Note that **you must specify CXX explicitly because the default CXX is broken**. - -Now you should be able to build the individual binaries: - - javelin/ $ cd support/javelinsymbols - javelin/support/javelinsymbols $ CXX=/usr/bin/g++ make - - javelin/ $ cd support/jsast - javelin/support/jsast $ CXX=/usr/bin/g++ make - - javelin/ $ cd support/jsxmin - javelin/support/jsxmin $ CXX=/usr/bin/g++ make - -= Synchronizing Javelin = - -To synchronize Javelin **from** Facebook trunk, run the synchronize script: - - javelin/ $ ./scripts/sync-from-facebook.php ~/www - -...where ##~/www## is the root you want to pull Javelin files from. The script -will copy files out of ##html/js/javelin## and build packages, and leave the -results in your working copy. From there you can review changes and commit, and -then push, diff, or send a pull request. - -To synchronize Javelin **to** Facebook trunk, run the, uh, reverse-synchronize -script: - - javelin/ $ ./scripts/sync-to-facebook.php ~/www - -...where ##~/www## is the root you want to push Javelin files to. The script -will copy files out of the working copy into your ##www## and leave you with a -dirty ##www##. From there you can review changes. - -Once Facebook moves to pure git for ##www## we can probably just submodule -Javelin into it and get rid of all this nonsense, but the mixed SVN/git -environment makes that difficult until then. - -= Building Documentation = - -Check out ##diviner## and ##libphutil## from Facebook github, and put them in a -directory with ##javelin##: - - somewhere/ $ ls - diviner/ - javelin/ - libphutil/ - somewhere/ $ - -Now run ##diviner## on ##javelin##: - - somewhere/ $ cd javelin - somewhere/javelin/ $ ../diviner/bin/diviner . - [DivinerArticleEngine] Generating documentation for 48 files... - [JavelinDivinerEngine] Generating documentation for 74 files... - somewhere/javelin/ $ - -Documentation is now available in ##javelin/docs/##. - -= Editing javelinjs.com = - -The source for javelinjs.com lives in ##javelin/support/webroot/##. The site -itself is served off the phabricator.com host. You need access to that host to -push it. diff --git a/webroot/rsrc/externals/javelin/docs/onload.js b/webroot/rsrc/externals/javelin/docs/onload.js index 8772745045..61865b94de 100644 --- a/webroot/rsrc/externals/javelin/docs/onload.js +++ b/webroot/rsrc/externals/javelin/docs/onload.js @@ -13,10 +13,8 @@ * * @param function Callback function to invoke after DOMContentReady. * @return void - * @group util */ JX.onload = function(callback) { // This isn't the real function definition, it's only defined here to let the // documentation generator find it. The actual definition is in init.js. }; - diff --git a/webroot/rsrc/externals/javelin/ext/reactor/core/DynVal.js b/webroot/rsrc/externals/javelin/ext/reactor/core/DynVal.js index b65950caa9..ace3fd8ebe 100644 --- a/webroot/rsrc/externals/javelin/ext/reactor/core/DynVal.js +++ b/webroot/rsrc/externals/javelin/ext/reactor/core/DynVal.js @@ -45,4 +45,3 @@ JX.install('DynVal', { })); } }); - diff --git a/webroot/rsrc/externals/javelin/ext/reactor/core/Reactor.js b/webroot/rsrc/externals/javelin/ext/reactor/core/Reactor.js index 0dbefbf78c..3af21b14b5 100644 --- a/webroot/rsrc/externals/javelin/ext/reactor/core/Reactor.js +++ b/webroot/rsrc/externals/javelin/ext/reactor/core/Reactor.js @@ -38,7 +38,7 @@ JX.install('Reactor', { * For internal use by the Reactor system. */ _postOrder : function(node, result, pending) { - if (typeof result === "undefined") { + if (typeof result === 'undefined') { result = []; pending = {}; } @@ -87,4 +87,3 @@ JX.install('Reactor', { } } }); - diff --git a/webroot/rsrc/externals/javelin/ext/reactor/core/ReactorNode.js b/webroot/rsrc/externals/javelin/ext/reactor/core/ReactorNode.js index 490b4c10f4..c500ce4c33 100644 --- a/webroot/rsrc/externals/javelin/ext/reactor/core/ReactorNode.js +++ b/webroot/rsrc/externals/javelin/ext/reactor/core/ReactorNode.js @@ -57,7 +57,7 @@ JX.install('ReactorNode', { /** * For internal use by the Reactor system */ - getNextPulse : function(pulse) { + getNextPulse : function() { return this._nextPulse; }, getTransformer : function() { @@ -94,4 +94,3 @@ JX.install('ReactorNode', { } } }); - diff --git a/webroot/rsrc/externals/javelin/ext/reactor/core/ReactorNodeCalmer.js b/webroot/rsrc/externals/javelin/ext/reactor/core/ReactorNodeCalmer.js index f06fd702dd..d652a7cbc0 100644 --- a/webroot/rsrc/externals/javelin/ext/reactor/core/ReactorNodeCalmer.js +++ b/webroot/rsrc/externals/javelin/ext/reactor/core/ReactorNodeCalmer.js @@ -45,4 +45,3 @@ JX.install('ReactorNodeCalmer', { } } }); - diff --git a/webroot/rsrc/externals/javelin/ext/reactor/dom/RDOM.js b/webroot/rsrc/externals/javelin/ext/reactor/dom/RDOM.js index 48b7b9687f..8bdbefd07b 100644 --- a/webroot/rsrc/externals/javelin/ext/reactor/dom/RDOM.js +++ b/webroot/rsrc/externals/javelin/ext/reactor/dom/RDOM.js @@ -121,7 +121,7 @@ JX.install('RDOM', { if (__DEV__) { if (!found) { - throw new Error("Mismatched radio button value"); + throw new Error('Mismatched radio button value'); } } }); @@ -163,7 +163,7 @@ JX.install('RDOM', { return rnode.transform(function(val) { if (__DEV__) { if (!(val === true || val === false)) { - throw new Error("Send boolean values to checkboxes."); + throw new Error('Send boolean values to checkboxes.'); } } @@ -255,7 +255,7 @@ JX.install('RDOM', { if (__DEV__) { if (select.value !== val) { - throw new Error("Mismatched select value"); + throw new Error('Mismatched select value'); } } }); @@ -403,5 +403,3 @@ JX.install('RDOM', { } } }); - - diff --git a/webroot/rsrc/externals/javelin/ext/view/HTMLView.js b/webroot/rsrc/externals/javelin/ext/view/HTMLView.js index aea6f7c7bd..c9eff564b8 100644 --- a/webroot/rsrc/externals/javelin/ext/view/HTMLView.js +++ b/webroot/rsrc/externals/javelin/ext/view/HTMLView.js @@ -26,10 +26,10 @@ JX.install('HTMLView', { return new JX.ViewVisitor(JX.HTMLView.validate); }, - validate: function(view, children) { + validate: function(view) { var spec = this._getHTMLSpec(); if (!(view.getName() in spec)) { - throw new Error("invalid tag"); + throw new Error('invalid tag'); } var tag_spec = spec[view.getName()]; @@ -37,11 +37,11 @@ JX.install('HTMLView', { var attrs = view.getAllAttributes(); for (var attr in attrs) { if (!(attr in tag_spec)) { - throw new Error("invalid attr"); + throw new Error('invalid attr'); } var validator = tag_spec[attr]; - if (typeof validator === "function") { + if (typeof validator === 'function') { return validator(attrs[attr]); } } @@ -51,10 +51,10 @@ JX.install('HTMLView', { _validateRel: function(target) { return target in { - "_blank": 1, - "_self": 1, - "_parent": 1, - "_top": 1 + '_blank': 1, + '_self': 1, + '_parent': 1, + '_top': 1 }; }, _getHTMLSpec: function() { @@ -135,4 +135,3 @@ JX.install('HTMLView', { } } }); - diff --git a/webroot/rsrc/externals/javelin/ext/view/View.js b/webroot/rsrc/externals/javelin/ext/view/View.js index 39d608a715..3e67320bcf 100644 --- a/webroot/rsrc/externals/javelin/ext/view/View.js +++ b/webroot/rsrc/externals/javelin/ext/view/View.js @@ -189,4 +189,3 @@ JX.install('View', { } } }); - diff --git a/webroot/rsrc/externals/javelin/ext/view/ViewInterpreter.js b/webroot/rsrc/externals/javelin/ext/view/ViewInterpreter.js index 743071e101..bb2a5b0bc7 100644 --- a/webroot/rsrc/externals/javelin/ext/view/ViewInterpreter.js +++ b/webroot/rsrc/externals/javelin/ext/view/ViewInterpreter.js @@ -56,7 +56,7 @@ JX.install('ViewInterpreter', { if (properties instanceof JX.View || properties instanceof JX.HTML || properties.nodeType || - typeof properties === "string") { + typeof properties === 'string') { children.unshift(properties); properties = {}; } diff --git a/webroot/rsrc/externals/javelin/ext/view/ViewPlaceholder.js b/webroot/rsrc/externals/javelin/ext/view/ViewPlaceholder.js index 7a2b79cfc2..6439e5c796 100644 --- a/webroot/rsrc/externals/javelin/ext/view/ViewPlaceholder.js +++ b/webroot/rsrc/externals/javelin/ext/view/ViewPlaceholder.js @@ -53,12 +53,12 @@ -JX.behavior('view-placeholder', function(config, statics) { +JX.behavior('view-placeholder', function(config) { JX.ViewPlaceholder.register(config.trigger_id, config.id, function() { var replace = JX.$(config.id); var children = config.children; - if (typeof children === "string") { + if (typeof children === 'string') { children = JX.$H(children); } diff --git a/webroot/rsrc/externals/javelin/ext/view/ViewRenderer.js b/webroot/rsrc/externals/javelin/ext/view/ViewRenderer.js index 3f11a3bec0..3fd3493683 100644 --- a/webroot/rsrc/externals/javelin/ext/view/ViewRenderer.js +++ b/webroot/rsrc/externals/javelin/ext/view/ViewRenderer.js @@ -17,4 +17,3 @@ JX.install('ViewRenderer', { } } }); - diff --git a/webroot/rsrc/externals/javelin/ext/view/ViewVisitor.js b/webroot/rsrc/externals/javelin/ext/view/ViewVisitor.js index 8c073cecb1..53d430c708 100644 --- a/webroot/rsrc/externals/javelin/ext/view/ViewVisitor.js +++ b/webroot/rsrc/externals/javelin/ext/view/ViewVisitor.js @@ -33,4 +33,3 @@ JX.install('ViewVisitor', { } } }); - diff --git a/webroot/rsrc/externals/javelin/ext/view/__tests__/View.js b/webroot/rsrc/externals/javelin/ext/view/__tests__/View.js index 909b6f67ec..1f798bd2e8 100644 --- a/webroot/rsrc/externals/javelin/ext/view/__tests__/View.js +++ b/webroot/rsrc/externals/javelin/ext/view/__tests__/View.js @@ -29,7 +29,7 @@ describe('JX.View', function() { var t = new JX.TestView( '', {}, - [new JX.TestView('Hey', {id: "child"}, [])] + [new JX.TestView('Hey', {id: 'child'}, [])] ); var result = JX.ViewRenderer.render(t); expect(JX.DOM.scry(result, 'span').length).toBe(1); diff --git a/webroot/rsrc/externals/javelin/ext/view/__tests__/ViewRenderer.js b/webroot/rsrc/externals/javelin/ext/view/__tests__/ViewRenderer.js index 1e8729e5c4..2247611f31 100644 --- a/webroot/rsrc/externals/javelin/ext/view/__tests__/ViewRenderer.js +++ b/webroot/rsrc/externals/javelin/ext/view/__tests__/ViewRenderer.js @@ -11,11 +11,11 @@ describe('JX.ViewRenderer', function() { var child = new JX.View({}); var parent = new JX.View({}); parent.addChild(child); - child.render = function(_) { + child.render = function() { child_rendered = true; }; - parent.render = function(rendered_children) { + parent.render = function() { child_rendered_first = child_rendered; }; diff --git a/webroot/rsrc/externals/javelin/lib/Cookie.js b/webroot/rsrc/externals/javelin/lib/Cookie.js index db68c96b5f..bbd4f64a66 100644 --- a/webroot/rsrc/externals/javelin/lib/Cookie.js +++ b/webroot/rsrc/externals/javelin/lib/Cookie.js @@ -82,8 +82,8 @@ JX.install('Cookie', { cookie_bits.push('Secure'); } - cookie_str = cookie_bits.join('; ') + ';'; - var cookie_str = this.getKey() + '=' + cookie_str; + var cookie_str = cookie_bits.join('; ') + ';'; + cookie_str = this.getKey() + '=' + cookie_str; this.getTarget().cookie = cookie_str; }, diff --git a/webroot/rsrc/externals/javelin/lib/DOM.js b/webroot/rsrc/externals/javelin/lib/DOM.js index 95496f4887..7eca573649 100644 --- a/webroot/rsrc/externals/javelin/lib/DOM.js +++ b/webroot/rsrc/externals/javelin/lib/DOM.js @@ -32,8 +32,6 @@ * * @param string "id" attribute to select from the document. * @return Node Node with the specified "id" attribute. - * - * @group dom */ JX.$ = function(id) { @@ -48,14 +46,14 @@ JX.$ = function(id) { if (__DEV__) { if (node && (node.id != id)) { JX.$E( - 'JX.$("'+id+'"): '+ + 'JX.$(\''+id+'\'): '+ 'document.getElementById() returned an element without the '+ 'correct ID. This usually means that the element you are trying '+ 'to select is being masked by a form with the same value in its '+ '"name" attribute.'); } } - JX.$E("JX.$('" + id + "') call matched no nodes."); + JX.$E('JX.$(\'' + id + '\') call matched no nodes.'); } return node; @@ -81,8 +79,6 @@ JX.$ = function(id) { * * @task build String into HTML * @task nodes HTML into Nodes - * - * @group dom */ JX.install('HTML', { @@ -128,7 +124,7 @@ JX.install('HTML', { 'will not do the right thing with this.'); } - // TODO(epriestley): May need to deny the user clicked has no href, or the href is empty, + // bail. + return; + } + + if (href[0] == '#') { + // If this is an anchor on the current page, bail. + return; + } + + var uri = new JX.$U(href); + var here = new JX.$U(window.location); + if (uri.getDomain() != here.getDomain()) { + // If the link is off-domain, bail. + return; + } + + if (uri.getFragment() && uri.getPath() == here.getPath()) { + // If the link has an anchor but points at the current path, bail. + // This is presumably a long-form anchor on the current page. + + // TODO: This technically gets links which change query parameters + // wrong: they are navigation events but we won't Quicksand them. + return; + } + + if (self._isURIOnBlacklist(uri)) { + // This URI is blacklisted as not navigable via Quicksand. + return; + } + + // The fate of this action is sealed. Suck it into the depths. + e.kill(); + + // If we're somewhere in history (that is, the user has pressed the + // back button one or more times, putting us in a state where pressing + // the forward button would do something) and we're navigating forward, + // all the stuff ahead of us is about to become unreachable when we + // navigate. Throw it away. + var discard = (self._history.length - self._cursor) - 1; + for (var ii = 0; ii < discard; ii++) { + var obsolete = self._history.pop(); + self._responses[obsolete.id] = false; + } + + // Set up the new state and fire a request to fetch the page data. + var path = JX.$U(uri).getRelativeURI(); + var id = ++self._id; + + self._history.push({path: path, id: id}); + JX.History.push(path, id); + + self._cursor = (self._history.length - 1); + self._responses[id] = null; + self._current = id; + + new JX.Workflow(href, {__quicksand__: true}) + .setHandler(JX.bind(null, self._onresponse, id)) + .start(); + }, + + + /** + * Receive a response from the server with page data e.g. content. + * + * Usually we'll dump it into the page, but if the user clicked very fast + * it might already be out of date. + */ + _onresponse: function(id, r) { + var self = JX.Quicksand; + + // Before possibly updating the document, check if this response is still + // relevant. + + // We don't save the new response if the user has already destroyed + // the navigation. They can do this by pressing back, then clicking + // another link before the response can load. + if (self._responses[id] === false) { + return; + } + + // Otherwise, this data is still relevant (either data on the current + // page, or data for a page that's still somewhere in history), so we + // save it. + var new_content = JX.$H(r.content).getFragment(); + self._content[id] = new_content; + self._responses[id] = r; + + // If it's the current page, draw it into the browser. It might not be + // the current page if the user already clicked another link. + if (self._current == id) { + self._draw(true); + } + }, + + + /** + * Draw the current page. + * + * After a navigation event or the arrival of page content, we paint it + * onto the page. + */ + _draw: function(from_server) { + var self = JX.Quicksand; + + if (self._onpage == self._current) { + // Don't bother redrawing if we're already on the current page. + return; + } + + if (!self._responses[self._current]) { + // If we don't have this page yet, we can't draw it. We'll draw it + // when it arrives. + return; + } + + // Otherwise, we're going to replace the page content. First, save the + // current page content. Modern computers have lots and lots of RAM, so + // there is no way this could ever create a problem. + var old = window.document.createDocumentFragment(); + while (self._frameNode.firstChild) { + JX.DOM.appendContent(old, self._frameNode.firstChild); + } + self._content[self._onpage] = old; + + // Now, replace it with the new content. + JX.DOM.setContent(self._frameNode, self._content[self._current]); + // Let other things redraw, etc as necessary + JX.Stratcom.invoke( + 'quicksand-redraw', + null, + { + newResponse: self._responses[self._current], + newResponseID: self._current, + oldResponse: self._responses[self._onpage], + oldResponseID: self._onpage, + fromServer: from_server + }); + self._onpage = self._current; + + // Scroll to the top of the page and trigger any layout adjustments. + // TODO: Maybe store the scroll position? + JX.DOM.scrollToPosition(0, 0); + JX.Stratcom.invoke('resize'); + }, + + + /** + * Handle navigation events. + * + * In general, we're going to pull the content out of our history and dump + * it into the document. + */ + _onchange: function(e) { + var self = JX.Quicksand; + + var data = e.getData(); + data.state = data.state || null; + + // Check if we're going back to the first page we started Quicksand on. + // We don't have a state value, but can look at the path. + if (data.state === null) { + if (JX.$U(window.location).getPath() == self._history[0].path) { + data.state = 0; + } + } + + // Figure out where in history the user jumped to. + if (data.state !== null) { + self._current = data.state; + + // Point the cursor at the right place in history. + for (var ii = 0; ii < self._history.length; ii++) { + if (self._history[ii].id == self._current) { + self._cursor = ii; + break; + } + } + + // Redraw the page. + self._draw(false); + } + }, + + + /** + * Set a list of regular expressions which blacklist URIs as not navigable + * via Quicksand. + * + * If a user clicks a link to one of these URIs, a normal page navigation + * event will occur instead of a Quicksand navigation. + * + * @param list List of regular expressions. + * @return self + */ + setURIPatternBlacklist: function(items) { + var self = JX.Quicksand; + + var list = []; + for (var ii = 0; ii < items.length; ii++) { + list.push(new RegExp('^' + items[ii] + '$')); + } + + self._uriPatternBlacklist = list; + + return self; + }, + + + /** + * Test if a @{class:JX.URI} is on the URI pattern blacklist. + * + * @param JX.URI URI to test. + * @return bool True if the URI is on the blacklist. + */ + _isURIOnBlacklist: function(uri) { + var self = JX.Quicksand; + var list = self._uriPatternBlacklist; + + var path = uri.getPath(); + for (var ii = 0; ii < list.length; ii++) { + if (list[ii].test(path)) { + return true; + } + } + + return false; + } + + } + +}); diff --git a/webroot/rsrc/externals/javelin/lib/Request.js b/webroot/rsrc/externals/javelin/lib/Request.js index d7438b6d3f..6cdf5132ad 100644 --- a/webroot/rsrc/externals/javelin/lib/Request.js +++ b/webroot/rsrc/externals/javelin/lib/Request.js @@ -6,14 +6,13 @@ * javelin-json * javelin-dom * javelin-resource + * javelin-routable * @provides javelin-request * @javelin */ /** * Make basic AJAX XMLHTTPRequests. - * - * @group workflow */ JX.install('Request', { construct : function(uri, handler) { @@ -40,10 +39,10 @@ JX.install('Request', { try { return new XMLHttpRequest(); } catch (x) { - return new ActiveXObject("Msxml2.XMLHTTP"); + return new ActiveXObject('Msxml2.XMLHTTP'); } } catch (x) { - return new ActiveXObject("Microsoft.XMLHTTP"); + return new ActiveXObject('Microsoft.XMLHTTP'); } }, @@ -69,6 +68,18 @@ JX.install('Request', { return this._transport; }, + getRoutable: function() { + var routable = new JX.Routable(); + routable.listen('start', JX.bind(this, function() { + // Pass the event to allow other listeners to "start" to configure this + // request before it fires. + JX.Stratcom.pass(JX.Stratcom.context()); + this.send(); + })); + this.listen('finally', JX.bind(routable, routable.done)); + return routable; + }, + send : function() { if (this._sent || this._finished) { if (__DEV__) { @@ -258,10 +269,10 @@ JX.install('Request', { try { if (typeof DOMParser != 'undefined') { var parser = new DOMParser(); - doc = parser.parseFromString(text, "text/xml"); + doc = parser.parseFromString(text, 'text/xml'); } else { // IE // an XDomainRequest - doc = new ActiveXObject("Microsoft.XMLDOM"); + doc = new ActiveXObject('Microsoft.XMLDOM'); doc.async = false; doc.loadXML(xport.responseText); } @@ -382,6 +393,11 @@ JX.install('Request', { var uri = []; for (var ii = 0; ii < list_of_pairs.length; ii++) { var pair = list_of_pairs[ii]; + + if (pair[1] === null) { + continue; + } + var name = encodeURIComponent(pair[0]); var value = encodeURIComponent(pair[1]); uri.push(name + '=' + value); diff --git a/webroot/rsrc/externals/javelin/lib/Resource.js b/webroot/rsrc/externals/javelin/lib/Resource.js index 7c93804bbf..68219e0389 100644 --- a/webroot/rsrc/externals/javelin/lib/Resource.js +++ b/webroot/rsrc/externals/javelin/lib/Resource.js @@ -25,7 +25,7 @@ JX.install('Resource', { */ load: function(list, callback) { var resources = {}, - uri, resource, path, type; + uri, resource, path; list = JX.$AX(list); @@ -135,14 +135,27 @@ JX.install('Resource', { delete JX.Resource._loading[uri]; JX.Resource._loaded[uri] = true; + var errors = []; for (ii = 0; ii < list.length; ii++) { current = list[ii]; delete current.resources[uri]; if (!JX.Resource._hasResources(current.resources)) { - current.callback(); + try { + current.callback(); + } catch (error) { + errors.push(error); + } list.splice(ii--, 1); } } + + for (var jj = 0; jj < errors.length; jj++) { + JX.log(errors[jj]); + } + + if (errors.length) { + throw errors[0]; + } }, _hasResources: function(resources) { diff --git a/webroot/rsrc/externals/javelin/lib/Routable.js b/webroot/rsrc/externals/javelin/lib/Routable.js new file mode 100644 index 0000000000..050d44df93 --- /dev/null +++ b/webroot/rsrc/externals/javelin/lib/Routable.js @@ -0,0 +1,41 @@ +/** + * @provides javelin-routable + * @requires javelin-install + * @javelin + */ + +JX.install('Routable', { + + construct : function() { + this._id = (JX.Routable._nextID++); + }, + + properties: { + key: null, + priority: 1000, + type: 'default' + }, + + events: ['start', 'done'], + + members: { + _id: null, + + getID: function() { + return this._id; + }, + + start: function() { + this.invoke('start'); + }, + + done: function() { + this.invoke('done'); + } + }, + + statics: { + _nextID: 0 + } + +}); diff --git a/webroot/rsrc/externals/javelin/lib/Router.js b/webroot/rsrc/externals/javelin/lib/Router.js new file mode 100644 index 0000000000..a53797ed3d --- /dev/null +++ b/webroot/rsrc/externals/javelin/lib/Router.js @@ -0,0 +1,115 @@ +/** + * @provides javelin-router + * @requires javelin-install + * javelin-util + * @javelin + */ + +/** + * Route requests. Primarily, this class provides a quality-of-service + * priority queue so large numbers of background loading tasks don't block + * interactive requests. + */ +JX.install('Router', { + + construct: function() { + this._queue = []; + }, + + events: ['queue', 'start', 'done'], + + members: { + _queue: null, + _active: 0, + _limit: 5, + + queue: function(routable) { + this._queue.push(routable); + + this.invoke('queue', routable); + this._update(); + }, + + getRoutableByKey: function(key) { + for (var ii = 0; ii < this._queue.length; ii++) { + if (this._queue[ii].getKey() == key) { + return this._queue[ii]; + } + } + return null; + }, + + /** + * Start new requests if we have slots free for them. + */ + _update: function() { + var active = this._active; + var limit = this._limit; + + if (active >= limit) { + // If we're already at the request limit, we can't add any more + // requests. + return; + } + + // If we only have one free slot, we reserve it for a request with + // at least priority 1000. + var minimum; + if ((active + 1) == limit) { + minimum = 1000; + } else { + minimum = 0; + } + + var idx = this._getNextRoutable(minimum); + if (idx === null) { + return; + } + + var routable = this._queue[idx]; + this._queue.splice(idx, 1); + + + routable.listen('done', JX.bind(this, this._done, routable)); + + this._active++; + routable.start(); + this.invoke('start', routable); + + this._update(); + }, + + _done: function(routable) { + this._active--; + this.invoke('done', routable); + + this._update(); + }, + + _getNextRoutable: function(minimum) { + var best = (minimum - 1); + + var routable = null; + for (var ii = 0; ii < this._queue.length; ii++) { + var priority = this._queue[ii].getPriority(); + if (priority > best) { + best = priority; + routable = ii; + } + } + + return routable; + } + + }, + + statics: { + _instance: null, + getInstance: function() { + if (!JX.Router._instance) { + JX.Router._instance = new JX.Router(); + } + return JX.Router._instance; + } + } +}); diff --git a/webroot/rsrc/externals/javelin/lib/Scrollbar.js b/webroot/rsrc/externals/javelin/lib/Scrollbar.js new file mode 100644 index 0000000000..cd69eb4def --- /dev/null +++ b/webroot/rsrc/externals/javelin/lib/Scrollbar.js @@ -0,0 +1,458 @@ +/** + * @provides javelin-scrollbar + * @requires javelin-install + * javelin-dom + * javelin-stratcom + * javelin-vector + * @javelin + */ + +/** + * Provides an aesthetic scrollbar. + * + * This shoves an element's scrollbar under a hidden overflow and draws a + * pretty looking fake one in its place. This makes complex UIs with multiple + * independently scrollable panels less hideous by (a) making the scrollbar + * itself prettier and (b) reclaiming the space occupied by the scrollbar. + * + * Note that on OSX the heavy scrollbars are normally drawn only if you have + * a mouse connected. OSX uses more aesthetic touchpad scrollbars normally, + * which these scrollbars emulate. + * + * This class was initially adapted from "Trackpad Scroll Emulator", by + * Jonathan Nicol. See . + */ +JX.install('Scrollbar', { + + construct: function(frame) { + this._frame = frame; + + JX.DOM.listen(frame, 'load', null, JX.bind(this, this._onload)); + this._onload(); + + // Before doing anything, check if the scrollbar control has a measurable + // width. If it doesn't, we're already in an environment with an aesthetic + // scrollbar (like Safari on OSX with no mouse connected, or an iPhone) + // and we don't need to do anything. + if (JX.Scrollbar.getScrollbarControlWidth() === 0) { + return; + } + + // Wrap the frame content in a bunch of nodes. The frame itself stays on + // the outside so that any positioning information the node had isn't + // disrupted. + + // We put a "viewport" node inside of it, which is what actually scrolls. + // This is the node that gets a scrollbar, but we make the viewport very + // slightly too wide for the frame. That hides the scrollbar underneath + // the edge of the frame. + + // We put a "content" node inside of the viewport. This allows us to + // measure the content height so we can resize and offset the scrollbar + // handle properly. + + // We move all the actual frame content into the "content" node. So it + // ends up wrapped by the "content" node, then by the "viewport" node, + // and finally by the original "frame" node. + + JX.DOM.alterClass(frame, 'jx-scrollbar-frame', true); + + var content = JX.$N('div', {className: 'jx-scrollbar-content'}); + while (frame.firstChild) { + JX.DOM.appendContent(content, frame.firstChild); + } + + var viewport = JX.$N('div', {className: 'jx-scrollbar-viewport'}, content); + JX.DOM.appendContent(frame, viewport); + + this._viewport = viewport; + this._content = content; + + // The handle is the visible node which you can click and drag. + this._handle = JX.$N('div', {className: 'jx-scrollbar-handle'}); + + // The bar is the area the handle slides up and down in. + this._bar = JX.$N('div', {className: 'jx-scrollbar-bar'}, this._handle); + + JX.DOM.prependContent(frame, this._bar); + + JX.DOM.listen(this._handle, 'mousedown', null, JX.bind(this, this._ondrag)); + JX.DOM.listen(this._bar, 'mousedown', null, JX.bind(this, this._onjump)); + + JX.enableDispatch(document.body, 'mouseenter'); + JX.DOM.listen(viewport, 'mouseenter', null, JX.bind(this, this._onenter)); + + JX.DOM.listen(frame, 'scroll', null, JX.bind(this, this._onscroll)); + + // Enabling dispatch for this event on `window` allows us to scroll even + // if the mouse cursor is dragged outside the window in at least some + // browsers (for example, Safari on OSX). + JX.enableDispatch(window, 'mousemove'); + JX.Stratcom.listen('mousemove', null, JX.bind(this, this._onmove)); + + JX.Stratcom.listen('mouseup', null, JX.bind(this, this._ondrop)); + JX.Stratcom.listen('resize', null, JX.bind(this, this._onresize)); + + this._resizeViewport(); + this._resizeBar(); + }, + + statics: { + _controlWidth: null, + + + /** + * Compute the width of the browser's scrollbar control, in pixels. + */ + getScrollbarControlWidth: function() { + var self = JX.Scrollbar; + + if (self._controlWidth === null) { + var tmp = JX.$N('div', {className: 'jx-scrollbar-test'}, '-'); + document.body.appendChild(tmp); + var d1 = JX.Vector.getDim(tmp); + tmp.style.overflowY = 'scroll'; + var d2 = JX.Vector.getDim(tmp); + JX.DOM.remove(tmp); + + self._controlWidth = (d2.x - d1.x); + } + + return self._controlWidth; + }, + + + /** + * Get the margin width required to avoid double scrollbars. + * + * For most browsers which render a real scrollbar control, this is 0. + * Adjacent elements may touch the edge of the content directly without + * overlapping. + * + * On OSX with a trackpad, scrollbars are only drawn when content is + * scrolled. Content panes with internal scrollbars may overlap adjacent + * scrollbars if they are not laid out with a margin. + * + * @return int Control margin width in pixels. + */ + getScrollbarControlMargin: function() { + var self = JX.Scrollbar; + + // If this browser and OS don't render a real scrollbar control, we + // need to leave a margin. Generally, this is OSX with no mouse attached. + if (self.getScrollbarControlWidth() === 0) { + return 12; + } + + return 0; + } + + + }, + + members: { + _frame: null, + _viewport: null, + _content: null, + + _bar: null, + _handle: null, + + _timeout: null, + _dragOrigin: null, + _scrollOrigin: null, + _lastHeight: null, + + + /** + * Mark this content as the scroll frame. + * + * This changes the behavior of the @{class:JX.DOM} scroll functions so the + * continue to work properly if the main page content is reframed to scroll + * independently. + */ + setAsScrollFrame: function() { + if (this._viewport) { + // If we activated the scrollbar, the viewport and content nodes become + // the new scroll and content frames. + JX.DOM.setContentFrame(this._viewport, this._content); + + // If nothing is focused, or the document body is focused, change focus + // to the viewport. This makes the arrow keys, spacebar, and page + // up/page down keys work immediately after the page loads, without + // requiring a click. + + // Focusing the
    itself doesn't work on any browser, so we + // add a fake, focusable element and focus that instead. + var focus = document.activeElement; + if (!focus || focus == window.document.body) { + var link = JX.$N('a', {href: '#', className: 'jx-scrollbar-link'}); + JX.DOM.listen(link, 'blur', null, function() { + // When the user clicks anything else, remove this. + try { + JX.DOM.remove(link); + } catch (ignored) { + // We can get a second blur event, likey related to T447. + // Fix doesn't seem trivial so just ignore it. + } + }); + JX.DOM.listen(link, 'click', null, function(e) { + // Don't respond to clicks. Since the link isn't visible, this + // most likely means the user hit enter or something like that. + e.kill(); + }); + JX.DOM.prependContent(this._viewport, link); + JX.DOM.focus(link); + } + } else { + // Otherwise, the unaltered content frame is both the scroll frame and + // content frame. + JX.DOM.setContentFrame(this._frame, this._frame); + } + }, + + + /** + * After the user scrolls the page, show the scrollbar to give them + * feedback about their position. + */ + _onscroll: function() { + this._showBar(); + }, + + + /** + * When the user mouses over the viewport, show the scrollbar. + */ + _onenter: function() { + this._showBar(); + }, + + + /** + * When the user resizes the window, recalculate everything. + */ + _onresize: function() { + this._resizeViewport(); + this._resizeBar(); + }, + + + /** + * When the user clicks the bar area (but not the handle), jump up or + * down a page. + */ + _onjump: function(e) { + if (e.getTarget() === this._handle) { + return; + } + + var distance = JX.Vector.getDim(this._viewport).y * (7/8); + var epos = JX.$V(e); + var hpos = JX.$V(this._handle); + + if (epos.y > hpos.y) { + this._viewport.scrollTop += distance; + } else { + this._viewport.scrollTop -= distance; + } + }, + + + /** + * When the user clicks the scroll handle, begin dragging it. + */ + _ondrag: function(e) { + e.kill(); + + // Store the position where the drag started. + this._dragOrigin = JX.$V(e); + + // Store the original position of the handle. + this._scrollOrigin = this._viewport.scrollTop; + }, + + + /** + * As the user drags the scroll handle up or down, scroll the viewport. + */ + _onmove: function(e) { + if (this._dragOrigin === null) { + return; + } + + var p = JX.$V(e); + var offset = (p.y - this._dragOrigin.y); + var ratio = offset / JX.Vector.getDim(this._bar).y; + var adjust = ratio * JX.Vector.getDim(this._content).y; + + if (this._shouldSnapback()) { + if (Math.abs(p.x - this._dragOrigin.x) > 140) { + adjust = 0; + } + } + + this._viewport.scrollTop = this._scrollOrigin + adjust; + }, + + + /** + * Should the scrollbar snap back to the original position if the user + * drags the mouse away to the left or right, perpendicular to the + * scrollbar? + * + * Scrollbars have this behavior on Windows, but not on OSX or Linux. + */ + _shouldSnapback: function() { + // Since this is an OS-specific behavior, detect the OS. We can't + // reasonably use feature detection here. + return (navigator.platform.indexOf('Win') > -1); + }, + + + /** + * When the user releases the mouse after a drag, stop moving the + * viewport. + */ + _ondrop: function() { + this._dragOrigin = null; + + // Reset the timer to hide the bar. + this._showBar(); + }, + + + + /** + * Something inside the frame fired a load event. + * + * The typical case is that an image loaded. This may have changed the + * height of the scroll area, and we may want to make adjustments. + */ + _onload: function() { + var viewport = this.getViewportNode(); + var height = viewport.scrollHeight; + var visible = JX.Vector.getDim(viewport).y; + if (this._lastHeight !== null && this._lastHeight != height) { + + // If the viewport was scrollable and was scrolled down to near the + // bottom, scroll it down to account for the new height. The effect + // of this rule is to keep panels like the chat column scrolled to + // the bottom as images load into the thread. + if (viewport.scrollTop > 0) { + if ((viewport.scrollTop + visible + 64) >= this._lastHeight) { + viewport.scrollTop += (height - this._lastHeight); + } + } + + } + + this._lastHeight = height; + }, + + + /** + * Shove the scrollbar on the viewport under the edge of the frame so the + * user can't see it. + */ + _resizeViewport: function() { + var fdim = JX.Vector.getDim(this._frame); + fdim.x += JX.Scrollbar.getScrollbarControlWidth(); + fdim.setDim(this._viewport); + }, + + + /** + * Figure out the correct size and offset of the scrollbar handle. + */ + _resizeBar: function() { + // We're hiding and showing the bar itself, not just the handle, because + // pages that contain other panels may have scrollbars underneath the + // bar. If we don't hide the bar, it ends up eating clicks targeting + // these panels. + + // Because the bar may be hidden, we can't measure it. Measure the + // viewport instead. + + var cdim = JX.Vector.getDim(this._content); + var spos = JX.Vector.getAggregateScrollForNode(this._viewport); + var vdim = JX.Vector.getDim(this._viewport); + + var ratio = (vdim.y / cdim.y); + + // We're scaling things down very slightly to leave a 2px margin at + // either end of the scroll gutter, so the bar doesn't quite bump up + // against the chrome. + ratio = ratio * (vdim.y / (vdim.y + 4)); + + var offset = Math.round(ratio * spos.y) + 2; + var size = Math.floor(ratio * vdim.y); + + if (size < cdim.y) { + this._handle.style.top = offset + 'px'; + this._handle.style.height = size + 'px'; + + JX.DOM.show(this._bar); + } else { + JX.DOM.hide(this._bar); + } + }, + + + /** + * Show the scrollbar for the next second. + */ + _showBar: function() { + this._resizeBar(); + + JX.DOM.alterClass(this._handle, 'jx-scrollbar-visible', true); + + this._clearTimeout(); + this._timeout = setTimeout(JX.bind(this, this._hideBar), 1000); + }, + + + /** + * Hide the scrollbar. + */ + _hideBar: function() { + if (this._dragOrigin !== null) { + // If we're currently dragging the handle, we never want to hide + // it. + return; + } + + JX.DOM.alterClass(this._handle, 'jx-scrollbar-visible', false); + this._clearTimeout(); + }, + + + /** + * Clear the scrollbar hide timeout, if one is set. + */ + _clearTimeout: function() { + if (this._timeout) { + clearTimeout(this._timeout); + this._timeout = null; + } + }, + + getContentNode: function() { + return this._content || this._frame; + }, + + getViewportNode: function() { + return this._viewport || this._frame; + }, + + scrollTo: function(scroll) { + if (this._viewport !== null) { + this._viewport.scrollTop = scroll; + } else { + this._frame.scrollTop = scroll; + } + return this; + } + } + +}); diff --git a/webroot/rsrc/externals/javelin/lib/Sound.js b/webroot/rsrc/externals/javelin/lib/Sound.js new file mode 100644 index 0000000000..68181560ff --- /dev/null +++ b/webroot/rsrc/externals/javelin/lib/Sound.js @@ -0,0 +1,82 @@ +/** + * @requires javelin-install + * @provides javelin-sound + * @javelin + */ + + +JX.install('Sound', { + statics: { + _sounds: {}, + _queue: [], + _playingQueue: false, + + load: function(uri) { + var self = JX.Sound; + + if (!(uri in self._sounds)) { + var audio = JX.$N( + 'audio', + { + src: uri, + preload: 'auto' + }); + + // In Safari, it isn't good enough to just load a sound in response + // to a click: we must also play it. Once we've played it once, we + // can continue to play it freely. + + // Play the sound, then immediately pause it. This rejects the "play()" + // promise but marks the audio as playable, so our "play()" method will + // work correctly later. + if (window.webkitAudioContext) { + audio.play().then(JX.bag, JX.bag); + audio.pause(); + } + + self._sounds[uri] = audio; + } + }, + + play: function(uri, callback) { + var self = JX.Sound; + self.load(uri); + + var sound = self._sounds[uri]; + + try { + sound.onended = callback || JX.bag; + sound.play().then(JX.bag, callback || JX.bag); + } catch (ex) { + JX.log(ex); + } + }, + + queue: function(uri) { + var self = JX.Sound; + self._queue.push(uri); + self._playQueue(); + }, + + _playQueue: function() { + var self = JX.Sound; + if (self._playingQueue) { + return; + } + self._playingQueue = true; + self._nextQueue(); + }, + + _nextQueue: function() { + var self = JX.Sound; + if (self._queue.length) { + var next = self._queue[0]; + self._queue.splice(0, 1); + self.play(next, self._nextQueue); + } else { + self._playingQueue = false; + } + } + + } +}); diff --git a/webroot/rsrc/externals/javelin/lib/URI.js b/webroot/rsrc/externals/javelin/lib/URI.js index e22982cc6b..2aaba39d1a 100644 --- a/webroot/rsrc/externals/javelin/lib/URI.js +++ b/webroot/rsrc/externals/javelin/lib/URI.js @@ -17,8 +17,6 @@ * * @param string Unparsed URI. * @return @{class:JX.URI} JX.URI instance. - * - * @group uri */ JX.$U = function(uri) { return new JX.URI(uri); @@ -38,8 +36,6 @@ JX.$U = function(uri) { * * uri.setFragment('clowntown'); * uri.toString() // http://www.example.com/asdf.php?a=b&c=d#clowntown - * - * @group uri */ JX.install('URI', { statics : { @@ -182,6 +178,14 @@ JX.install('URI', { return this._domain; }, + getRelativeURI: function() { + return JX.$U(this.toString()) + .setProtocol(null) + .setPort(null) + .setDomain(null) + .toString(); + }, + toString : function() { if (__DEV__) { if (this.getPath() && this.getPath().charAt(0) != '/') { diff --git a/webroot/rsrc/externals/javelin/lib/Vector.js b/webroot/rsrc/externals/javelin/lib/Vector.js index 20361a15e5..32cb29eb40 100644 --- a/webroot/rsrc/externals/javelin/lib/Vector.js +++ b/webroot/rsrc/externals/javelin/lib/Vector.js @@ -20,8 +20,6 @@ * If numeric, the x-coordinate for the new vector. * @param number? The y-coordinate for the new vector. * @return @{class:JX.Vector} New vector. - * - * @group dom */ JX.$V = function(x, y) { return new JX.Vector(x, y); @@ -75,8 +73,6 @@ JX.$V = function(x, y) { * @task query Querying Positions and Dimensions * @task update Changing Positions and Dimensions * @task manip Manipulating Vectors - * - * @group dom */ JX.install('Vector', { @@ -223,6 +219,18 @@ JX.install('Vector', { getPos : function(node) { JX.Event && (node instanceof JX.Event) && (node = node.getRawEvent()); + if (node.getBoundingClientRect) { + var rect; + try { + rect = node.getBoundingClientRect(); + } catch (e) { + rect = { top : 0, left : 0 }; + } + return new JX.Vector( + rect.left + window.pageXOffset, + rect.top + window.pageYOffset); + } + if (('pageX' in node) || ('clientX' in node)) { var c = JX.Vector._viewport; return new JX.Vector( @@ -289,6 +297,47 @@ JX.install('Vector', { ); }, + + /** + * Get the aggregate scroll offsets for a node and all of its parents. + * + * Note that this excludes scroll at the document level, because it does + * not normally impact operations in document coordinates, which everything + * on this class returns. Use @{method:getScroll} to get the document scroll + * position. + * + * @param Node Node to determine offsets for. + * @return JX.Vector New vector with aggregate scroll offsets. + */ + getAggregateScrollForNode: function(node) { + var x = 0; + var y = 0; + + do { + if (node == document.body || node == document.documentElement) { + break; + } + + x += node.scrollLeft || 0; + y += node.scrollTop || 0; + node = node.parentNode; + } while (node); + + return new JX.$V(x, y); + }, + + + /** + * Get the sum of a node's position and its parent scroll offsets. + * + * @param Node Node to determine aggregate position for. + * @return JX.Vector New vector with aggregate position. + */ + getPosWithScroll: function(node) { + return JX.$V(node).add(JX.Vector.getAggregateScrollForNode(node)); + }, + + /** * Determine the size of the viewport (basically, the browser window) by * building a new vector where the 'x' component corresponds to the width diff --git a/webroot/rsrc/externals/javelin/lib/WebSocket.js b/webroot/rsrc/externals/javelin/lib/WebSocket.js new file mode 100644 index 0000000000..508218cf3f --- /dev/null +++ b/webroot/rsrc/externals/javelin/lib/WebSocket.js @@ -0,0 +1,211 @@ +/** + * @requires javelin-install + * @provides javelin-websocket + * @javelin + */ + +/** + * Wraps a WebSocket. + */ +JX.install('WebSocket', { + + construct: function(uri) { + this.setURI(uri); + this._resetDelay(); + }, + + properties: { + URI: null, + + /** + * Called when a connection is established or re-established after an + * interruption. + */ + openHandler: null, + + /** + * Called when a message is received. + */ + messageHandler: null, + + /** + * Called when the connection is closed. + * + * You can return `true` to prevent the socket from reconnecting. + */ + closeHandler: null + }, + + members: { + /** + * The underlying WebSocket. + */ + _socket: null, + + /** + * Is the socket connected? + */ + _isOpen: false, + + /** + * Has the caller asked us to close? + * + * By default, we reconnect when the connection is interrupted. + * This stops us from reconnecting if @{method:close} was called. + */ + _shouldClose: false, + + /** + * Number of milliseconds to wait after a connection failure before + * attempting to reconnect. + */ + _delayUntilReconnect: null, + + + /** + * Open the connection. + */ + open: function() { + if (!window.WebSocket) { + return; + } + + this._shouldClose = false; + + this._socket = new WebSocket(this.getURI()); + this._socket.onopen = JX.bind(this, this._onopen); + this._socket.onmessage = JX.bind(this, this._onmessage); + this._socket.onclose = JX.bind(this, this._onclose); + }, + + + /** + * Send a message. + * + * If the connection is not currently open, this method has no effect and + * the messages vanishes into the ether. + */ + send: function(message) { + if (this._isOpen) { + this._socket.send(message); + } + }, + + + /** + * Close the connection. + */ + close: function() { + if (!this._isOpen) { + return; + } + this._shouldClose = true; + this._socket.close(); + }, + + + /** + * Disconnect abruptly, prompting a reconnect. + */ + reconnect: function() { + if (!this._isOpen) { + return; + } + + this._socket.close(); + }, + + + /** + * Get the current reconnect delay (in milliseconds). + */ + getReconnectDelay: function() { + return this._delayUntilReconnect; + }, + + + /** + * Callback for connection open. + */ + _onopen: function() { + this._isOpen = true; + + // Since we connected successfully, reset the reconnect delay to 0. + + // This will make us try the first reconnect immediately after a + // connection failure. This limits downtime in cases like a service + // restart or a load balancer connection timeout. + + // We only do an immediate retry after a successful connection. + this._delayUntilReconnect = 0; + + var handler = this.getOpenHandler(); + if (handler) { + handler(); + } + }, + + + /** + * Reset the reconnect delay to its base value. + */ + _resetDelay: function() { + this._delayUntilReconnect = 2000; + }, + + + /** + * Callback for message received. + */ + _onmessage: function(e) { + var data = e.data; + + var handler = this.getMessageHandler(); + if (handler) { + handler(data); + } + }, + + + /** + * Callback for connection close. + */ + _onclose: function() { + this._isOpen = false; + + var done = false; + + var handler = this.getCloseHandler(); + if (handler) { + done = handler(); + } + + // If we didn't explicitly see a close() call and the close handler + // did not return `true` to stop the reconnect, wait a little while + // and try to reconnect. + if (!done && !this._shouldClose) { + setTimeout(JX.bind(this, this._reconnect), this._delayUntilReconnect); + } + }, + + + /** + * Reconnect an interrupted socket. + */ + _reconnect: function() { + // Increase the reconnect delay by a factor of 2. If we fail to open the + // connection, the close handler will send us back here. We'll reconnect + // more and more slowly until we eventually get a valid connection. + if (!this._delayUntilReconnect) { + this._resetDelay(); + } else { + this._delayUntilReconnect = this._delayUntilReconnect * 2; + } + + // Max out at 5 minutes between attempts. + this._delayUntilReconnect = Math.min(this._delayUntilReconnect, 300000); + this.open(); + } + + } +}); diff --git a/webroot/rsrc/externals/javelin/lib/Workflow.js b/webroot/rsrc/externals/javelin/lib/Workflow.js index 1d1c03ed5c..25de547deb 100644 --- a/webroot/rsrc/externals/javelin/lib/Workflow.js +++ b/webroot/rsrc/externals/javelin/lib/Workflow.js @@ -7,13 +7,11 @@ * javelin-util * javelin-mask * javelin-uri + * javelin-routable * @provides javelin-workflow * @javelin */ -/** - * @group workflow - */ JX.install('Workflow', { construct : function(uri, data) { if (__DEV__) { @@ -27,44 +25,57 @@ JX.install('Workflow', { this.setData(data || {}); }, - events : ['error', 'finally', 'submit'], + events : ['error', 'finally', 'submit', 'start'], statics : { _stack : [], - newFromForm : function(form, data) { + newFromForm : function(form, data, keep_enabled) { var pairs = JX.DOM.convertFormToListOfPairs(form); for (var k in data) { pairs.push([k, data[k]]); } - // Disable form elements during the request - var inputs = [].concat( - JX.DOM.scry(form, 'input'), - JX.DOM.scry(form, 'button'), - JX.DOM.scry(form, 'textarea')); - for (var ii = 0; ii < inputs.length; ii++) { - if (inputs[ii].disabled) { - delete inputs[ii]; - } else { - inputs[ii].disabled = true; + var inputs; + if (keep_enabled) { + inputs = []; + } else { + // Disable form elements during the request + inputs = [].concat( + JX.DOM.scry(form, 'input'), + JX.DOM.scry(form, 'button'), + JX.DOM.scry(form, 'textarea')); + for (var ii = 0; ii < inputs.length; ii++) { + if (inputs[ii].disabled) { + delete inputs[ii]; + } else { + inputs[ii].disabled = true; + } } } var workflow = new JX.Workflow(form.getAttribute('action'), {}); + + workflow._form = form; + workflow.setDataWithListOfPairs(pairs); workflow.setMethod(form.getAttribute('method')); - workflow.listen('finally', function() { - // Re-enable form elements - for (var ii = 0; ii < inputs.length; ii++) { - inputs[ii] && (inputs[ii].disabled = false); + + var onfinally = JX.bind(workflow, function() { + if (!this._keepControlsDisabled) { + for (var ii = 0; ii < inputs.length; ii++) { + inputs[ii] && (inputs[ii].disabled = false); + } } }); + workflow.listen('finally', onfinally); + return workflow; }, newFromLink : function(link) { var workflow = new JX.Workflow(link.href); return workflow; }, + _push : function(workflow) { JX.Mask.show(); JX.Workflow._stack.push(workflow); @@ -75,16 +86,49 @@ JX.install('Workflow', { dialog._destroy(); JX.Mask.hide(); }, - disable : function() { - JX.Workflow._disabled = true; - }, - _onbutton : function(event) { + _onlink: function(event) { + // See T13302. When a user clicks a link in a dialog and that link + // triggers a navigation event, we want to close the dialog as though + // they had pressed a button. - if (JX.Stratcom.pass()) { + // When Quicksand is enabled, this is particularly relevant because + // the dialog will stay in the foreground while the page content changes + // in the background if we do not dismiss the dialog. + + // If this is a Command-Click, the link will open in a new window. + var is_command = !!event.getRawEvent().metaKey; + if (is_command) { + return; + } + + var link = event.getNode('tag:a'); + + // If the link is an anchor, or does not go anywhere, ignore the event. + var href = link.getAttribute('href'); + if (typeof href !== 'string') { + return; + } + + if (!href.length || href[0] === '#') { + return; + } + + // This link will open in a new window. + if (link.target === '_blank') { return; } - if (JX.Workflow._disabled) { + // This link is really a dialog button which we'll handle elsewhere. + if (JX.Stratcom.hasSigil(link, 'jx-workflow-button')) { + return; + } + + // Close the dialog. + JX.Workflow._pop(); + }, + _onbutton : function(event) { + + if (JX.Stratcom.pass()) { return; } @@ -94,29 +138,138 @@ JX.install('Workflow', { // or something similar. var t = event.getNode('jx-workflow-button') || event.getNode('tag:button'); + + // If this button disables workflow (normally, because it is a file + // download button) let the event through without modification. + if (JX.Stratcom.getData(t).disableWorkflow) { + return; + } + + event.prevent(); + if (t.name == '__cancel__' || t.name == '__close__') { JX.Workflow._pop(); } else { var form = event.getNode('jx-dialog'); - var data = JX.DOM.convertFormToListOfPairs(form); - - data.push([t.name, t.value || true]); - - var active = JX.Workflow._getActiveWorkflow(); - var e = active.invoke('submit', {form: form, data: data}); - if (!e.getStopped()) { - active._destroy(); - active - .setURI(form.getAttribute('action') || active.getURI()) - .setDataWithListOfPairs(data) - .start(); - } + JX.Workflow._dosubmit(form, t); + } + }, + _onsyntheticsubmit : function(e) { + if (JX.Stratcom.pass()) { + return; + } + e.prevent(); + var form = e.getNode('jx-dialog'); + var button = JX.DOM.find(form, 'button', '__default__'); + JX.Workflow._dosubmit(form, button); + }, + _dosubmit : function(form, button) { + // Issue a DOM event first, so form-oriented handlers can act. + var dom_event = JX.DOM.invoke(form, 'didWorkflowSubmit'); + if (dom_event.getPrevented()) { + return; + } + + var data = JX.DOM.convertFormToListOfPairs(form); + data.push([button.name, button.value || true]); + + var active = JX.Workflow._getActiveWorkflow(); + + active._form = form; + + var e = active.invoke('submit', {form: form, data: data}); + if (!e.getStopped()) { + // NOTE: Don't remove the current dialog yet because additional + // handlers may still want to access the nodes. + + // Disable whatever button the user clicked to prevent duplicate + // submission mistakes when you accidentally click a button multiple + // times. See T11145. + button.disabled = true; + + active + .setURI(form.getAttribute('action') || active.getURI()) + .setDataWithListOfPairs(data) + .start(); } - event.prevent(); }, _getActiveWorkflow : function() { var stack = JX.Workflow._stack; return stack[stack.length - 1]; + }, + + _onresizestart: function(e) { + var self = JX.Workflow; + if (self._resizing) { + return; + } + + var workflow = self._getActiveWorkflow(); + if (!workflow) { + return; + } + + e.kill(); + + var form = JX.DOM.find(workflow._root, 'div', 'jx-dialog'); + var resize = e.getNodeData('jx-dialog-resize'); + var node_y = JX.$(resize.resizeY); + + var dim = JX.Vector.getDim(form); + dim.y = JX.Vector.getDim(node_y).y; + + if (!form._minimumSize) { + form._minimumSize = dim; + } + + self._resizing = { + min: form._minimumSize, + form: form, + startPos: JX.$V(e), + startDim: dim, + resizeY: node_y, + resizeX: resize.resizeX + }; + }, + + _onmousemove: function(e) { + var self = JX.Workflow; + if (!self._resizing) { + return; + } + + var spec = self._resizing; + var form = spec.form; + var min = spec.min; + + var delta = JX.$V(e).add(-spec.startPos.x, -spec.startPos.y); + var src_dim = spec.startDim; + var dst_dim = JX.$V(src_dim.x + delta.x, src_dim.y + delta.y); + + if (dst_dim.x < min.x) { + dst_dim.x = min.x; + } + + if (dst_dim.y < min.y) { + dst_dim.y = min.y; + } + + if (spec.resizeX) { + JX.$V(dst_dim.x, null).setDim(form); + } + + if (spec.resizeY) { + JX.$V(null, dst_dim.y).setDim(spec.resizeY); + } + }, + + _onmouseup: function() { + var self = JX.Workflow; + if (!self._resizing) { + return; + } + + self._resizing = false; } }, @@ -124,10 +277,55 @@ JX.install('Workflow', { _root : null, _pushed : false, _data : null, + + _form: null, + _paused: 0, + _nextCallback: null, + _keepControlsDisabled: false, + + getSourceForm: function() { + return this._form; + }, + + pause: function() { + this._paused++; + return this; + }, + + resume: function() { + if (!this._paused) { + JX.$E('Resuming a workflow which is not paused!'); + } + + this._paused--; + + if (!this._paused) { + var next = this._nextCallback; + this._nextCallback = null; + if (next) { + next(); + } + } + + return this; + }, + _onload : function(r) { + this._destroy(); + // It is permissible to send back a falsey redirect to force a page // reload, so we need to take this branch if the key is present. if (r && (typeof r.redirect != 'undefined')) { + // Before we redirect to file downloads, we close the dialog. These + // redirects aren't real navigation events so we end up stuck in the + // dialog otherwise. + if (r.close) { + this._pop(); + } + + // If we're redirecting, don't re-enable for controls. + this._keepControlsDisabled = true; + JX.$U(r.redirect).go(); } else if (r && r.dialog) { this._push(); @@ -140,7 +338,27 @@ JX.install('Workflow', { 'click', [['jx-workflow-button'], ['tag:button']], JX.Workflow._onbutton); + JX.DOM.listen( + this._root, + 'didSyntheticSubmit', + [], + JX.Workflow._onsyntheticsubmit); + + var onlink = JX.Workflow._onlink; + JX.DOM.listen(this._root, 'click', 'tag:a', onlink); + + JX.DOM.listen( + this._root, + 'mousedown', + 'jx-dialog-resize', + JX.Workflow._onresizestart); + + // Note that even in the presence of a content frame, we're doing + // everything here at top level: dialogs are fully modal and cover + // the entire window. + document.body.appendChild(this._root); + var d = JX.Vector.getDim(this._root); var v = JX.Vector.getViewport(); var s = JX.Vector.getScroll(); @@ -149,7 +367,7 @@ JX.install('Workflow', { // Use more space if the dialog is large (at least roughly the size // of the viewport). var offset = Math.min(Math.max(20, (v.y - d.y) / 2), 100); - JX.$V((v.x - d.x) / 2, s.y + offset).setPos(this._root); + JX.$V(0, s.y + offset).setPos(this._root); try { JX.DOM.focus(JX.DOM.find(this._root, 'button', '__default__')); @@ -173,6 +391,8 @@ JX.install('Workflow', { // The `focus()` call may have scrolled the window. Scroll it back to // where it was before -- we want to focus the control, but not adjust // the scroll position. + + // Dialogs are window-level, so scroll the window explicitly. window.scrollTo(s.x, s.y); } else if (this.getHandler()) { @@ -202,7 +422,19 @@ JX.install('Workflow', { this._root = null; } }, + start : function() { + var next = JX.bind(this, this._send); + + this.pause(); + this._nextCallback = next; + + this.invoke('start', this); + + this.resume(); + }, + + _send: function() { var uri = this.getURI(); var method = this.getMethod(); var r = new JX.Request(uri, JX.bind(this, this._onload)); @@ -226,6 +458,18 @@ JX.install('Workflow', { r.send(); }, + getRoutable: function() { + var routable = new JX.Routable(); + routable.listen('start', JX.bind(this, function() { + // Pass the event to allow other listeners to "start" to configure this + // workflow before it fires. + JX.Stratcom.pass(JX.Stratcom.context()); + this.start(); + })); + this.listen('finally', JX.bind(routable, routable.done)); + return routable; + }, + setData : function(dictionary) { this._data = []; for (var k in dictionary) { @@ -234,6 +478,11 @@ JX.install('Workflow', { return this; }, + addData: function(key, value) { + this._data.push([key, value]); + return this; + }, + setDataWithListOfPairs : function(list_of_pairs) { this._data = list_of_pairs; return this; @@ -256,11 +505,6 @@ JX.install('Workflow', { return; } - if (JX.Workflow._disabled) { - // Workflows are disabled on this page. - return; - } - if (JX.Stratcom.pass()) { // Something else swallowed the event. return; @@ -297,6 +541,9 @@ JX.install('Workflow', { } JX.Stratcom.listen('keydown', null, close_dialog_when_user_presses_escape); + + JX.Stratcom.listen('mousemove', null, JX.Workflow._onmousemove); + JX.Stratcom.listen('mouseup', null, JX.Workflow._onmouseup); } }); diff --git a/webroot/rsrc/externals/javelin/lib/__tests__/JSON.js b/webroot/rsrc/externals/javelin/lib/__tests__/JSON.js index 539a41610e..05b236307d 100644 --- a/webroot/rsrc/externals/javelin/lib/__tests__/JSON.js +++ b/webroot/rsrc/externals/javelin/lib/__tests__/JSON.js @@ -7,7 +7,7 @@ describe('JSON', function() { it('should encode and decode an object', function() { var object = { a: [0, 1, 2], - s: "Javelin Stuffs", + s: 'Javelin Stuffs', u: '\x01', n: 1, f: 3.14, diff --git a/webroot/rsrc/externals/javelin/lib/__tests__/URI.js b/webroot/rsrc/externals/javelin/lib/__tests__/URI.js index 62387c3b9e..17ab735752 100644 --- a/webroot/rsrc/externals/javelin/lib/__tests__/URI.js +++ b/webroot/rsrc/externals/javelin/lib/__tests__/URI.js @@ -43,7 +43,7 @@ describe('Javelin URI', function() { }); function charRange(from, to) { - res = ''; + var res = ''; for (var i = from.charCodeAt(0); i <= to.charCodeAt(0); i++) { res += String.fromCharCode(i); } @@ -284,9 +284,8 @@ describe('Javelin URI', function() { }); it('no global state interference', function() { - var uri1 = JX.$U('/?key=value'); - var uri2 = JX.$U(); - expect(uri2.getQueryParams()).not.toEqual({'key' : 'value'}); + var uri = JX.$U(); + expect(uri.getQueryParams()).not.toEqual({'key' : 'value'}); }); it('should not loop indefinitely when parsing empty params', function() { @@ -300,4 +299,3 @@ describe('Javelin URI', function() { }); }); - diff --git a/webroot/rsrc/externals/javelin/lib/__tests__/behavior.js b/webroot/rsrc/externals/javelin/lib/__tests__/behavior.js index 11c47d4e36..3d25bead50 100644 --- a/webroot/rsrc/externals/javelin/lib/__tests__/behavior.js +++ b/webroot/rsrc/externals/javelin/lib/__tests__/behavior.js @@ -93,4 +93,3 @@ describe('Javelin Behaviors', function() { }); }); - diff --git a/webroot/rsrc/externals/javelin/lib/behavior.js b/webroot/rsrc/externals/javelin/lib/behavior.js index 8741b9c423..a15f763fe3 100644 --- a/webroot/rsrc/externals/javelin/lib/behavior.js +++ b/webroot/rsrc/externals/javelin/lib/behavior.js @@ -23,7 +23,6 @@ * @param string Behavior name. * @param function Behavior callback/definition. * @return void - * @group behavior */ JX.behavior = function(name, control_function) { if (__DEV__) { @@ -76,7 +75,6 @@ JX.behavior = function(name, control_function) { * are lists of configuration dictionaries. The behavior will be * invoked once for each configuration dictionary. * @return void - * @group behavior */ JX.initBehaviors = function(map) { var missing_behaviors = []; @@ -93,7 +91,14 @@ JX.initBehaviors = function(map) { configs = [null]; } for (var ii = 0; ii < configs.length; ii++) { - JX.behavior._behaviors[name](configs[ii], JX.behavior._statics[name]); + try { + JX.behavior._behaviors[name](configs[ii], JX.behavior._statics[name]); + } catch (behavior_exception) { + JX.log( + 'JX.initBehaviors(...): behavior "%s" raised an error during setup.', + name); + JX.log(behavior_exception); + } } JX.behavior._initialized[name] = true; } diff --git a/webroot/rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js b/webroot/rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js index bfcac0aaaa..2f3dc59a47 100644 --- a/webroot/rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js +++ b/webroot/rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js @@ -30,8 +30,6 @@ * * When the tokenizer is focused, the CSS class `jx-tokenizer-container-focused` * is added to the container node. - * - * @group control */ JX.install('Tokenizer', { construct : function(containerNode) { @@ -46,12 +44,16 @@ JX.install('Tokenizer', { 'change'], properties : { - limit : null + limit : null, + renderTokenCallback : null, + browseURI: null, + disabled: false }, members : { _containerNode : null, _root : null, + _frame: null, _focus : null, _orig : null, _typeahead : null, @@ -64,6 +66,11 @@ JX.install('Tokenizer', { _placeholder : null, start : function() { + if (this.getDisabled()) { + JX.DOM.alterClass(this._containerNode, 'disabled-control', true); + return; + } + if (__DEV__) { if (!this._typeahead) { throw new Error( @@ -77,6 +84,21 @@ JX.install('Tokenizer', { this._tokens = []; this._tokenMap = {}; + try { + this._frame = JX.DOM.findAbove(this._orig, 'div', 'tokenizer-frame'); + } catch (e) { + // Ignore, this tokenizer doesn't have a frame. + } + + if (this._frame) { + JX.DOM.alterClass(this._frame, 'has-browse', !!this.getBrowseURI()); + JX.DOM.listen( + this._frame, + 'click', + 'tokenizer-browse', + JX.bind(this, this._onbrowse)); + } + var focus = this.buildInput(this._orig.value); this._focus = focus; @@ -89,10 +111,19 @@ JX.install('Tokenizer', { JX.DOM.listen( focus, - ['click', 'focus', 'blur', 'keydown', 'keypress'], + ['click', 'focus', 'blur', 'keydown', 'keypress', 'paste'], null, JX.bind(this, this.handleEvent)); + // NOTE: Safari on the iPhone does not normally delegate click events on + //
    tags. This causes the event to fire. We want a click (in this + // case, a touch) anywhere in the div to trigger this event so that we + // can focus the input. Without this, you must tap an arbitrary area on + // the left side of the input to focus it. + // + // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html + input_container.onclick = JX.bag; + JX.DOM.listen( input_container, 'click', @@ -193,7 +224,6 @@ JX.install('Tokenizer', { }, handleEvent : function(e) { - this._typeahead.handleEvent(e); if (e.getPrevented()) { return; @@ -215,7 +245,10 @@ JX.install('Tokenizer', { this._typeahead.updatePlaceholder(); } else if (e.getType() == 'focus') { this._didfocus(); + } else if (e.getType() == 'paste') { + setTimeout(JX.bind(this, this._redraw), 0); } + }, refresh : function() { @@ -240,7 +273,6 @@ JX.install('Tokenizer', { } this._lastvalue = focus.value; - var root = this._root; var metrics = JX.DOM.textMetrics( this._focus, 'jx-tokenizer-metrics'); @@ -248,10 +280,20 @@ JX.install('Tokenizer', { metrics.x += 24; metrics.setDim(focus); - // This is a pretty ugly hack to force a redraw after copy/paste in - // Firefox. If we don't do this, it doesn't redraw the input so pasting - // in an email address doesn't give you a very good behavior. - focus.value = focus.value; + // NOTE: Once, long ago, we set "focus.value = focus.value;" here to fix + // an issue with copy/paste in Firefox not redrawing correctly. However, + // this breaks input of Japanese glyphs in Chrome, and I can't reproduce + // the original issue in modern Firefox. + // + // If future changes muck around with things here, test that Japanese + // inputs still work. Example: + // + // - Switch to Hiragana mode. + // - Type "ni". + // - This should produce a glyph, not the value "n". + // + // With the assignment, Chrome loses the partial input on the "n" when + // the value is assigned. }, setPlaceholder : function(string) { @@ -277,7 +319,7 @@ JX.install('Tokenizer', { root.insertBefore(token, focus); - this.invoke('change', this); + this._didChangeValue(); return true; }, @@ -311,11 +353,23 @@ JX.install('Tokenizer', { sigil: 'remove' }, '\u00d7'); // U+00D7 multiplication sign - return JX.$N('a', { + var display_token = value; + + var attrs = { className: 'jx-tokenizer-token', sigil: 'token', meta: {key: key} - }, [value, input, remove]); + }; + var container = JX.$N('a', attrs); + + var render_callback = this.getRenderTokenCallback(); + if (render_callback) { + display_token = render_callback(value, key, container); + } + + JX.DOM.setContent(container, [display_token, input, remove]); + + return container; }, getTokens : function() { @@ -327,9 +381,6 @@ JX.install('Tokenizer', { }, _onkeydown : function(e) { - var focus = this._focus; - var root = this._root; - var raw = e.getRawEvent(); if (raw.ctrlKey || raw.metaKey || raw.altKey) { return; @@ -344,8 +395,13 @@ JX.install('Tokenizer', { break; case 'delete': if (!this._focus.value.length) { + // In unusual cases, it's possible for us to end up with a token + // that has the empty string ("") as a value. Support removal of + // this unusual token. + var tok; - while ((tok = this._tokens.pop())) { + while (this._tokens.length) { + tok = this._tokens.pop(); if (this._remove(tok, true)) { break; } @@ -374,7 +430,38 @@ JX.install('Tokenizer', { this._redraw(true); focus && this.focus(); + this._didChangeValue(); + + return true; + }, + + _didChangeValue: function() { + + if (this.getBrowseURI()) { + var button = JX.DOM.find(this._frame, 'a', 'tokenizer-browse'); + JX.DOM.alterClass(button, 'disabled', !!this._shouldLockBrowse()); + } + this.invoke('change', this); + }, + + _shouldLockBrowse: function() { + var limit = this.getLimit(); + + if (!limit) { + // If there's no limit, never lock the browse button. + return false; + } + + if (limit == 1) { + // If the limit is 1, we'll replace the current token if the + // user selects a new one, so we never need to lock the button. + return false; + } + + if (limit > JX.keys(this.getTokens()).length) { + return false; + } return true; }, @@ -382,7 +469,15 @@ JX.install('Tokenizer', { focus : function() { var focus = this._focus; JX.DOM.show(focus); - setTimeout(function() { JX.DOM.focus(focus); }, 0); + + // NOTE: We must fire this focus event immediately (during event + // handling) for the iPhone to bring up the keyboard. Previously this + // focus was wrapped in setTimeout(), but it's unclear why that was + // necessary. If this is adjusted later, make sure tapping the inactive + // area of the tokenizer to focus it on the iPhone still brings up the + // keyboard. + + JX.DOM.focus(focus); }, _didfocus : function() { @@ -399,6 +494,40 @@ JX.install('Tokenizer', { false); this._focus.value = ''; this._redraw(); + }, + + _onbrowse: function(e) { + e.kill(); + + var uri = this.getBrowseURI(); + if (!uri) { + return; + } + + if (this._shouldLockBrowse()) { + return; + } + + new JX.Workflow(uri, {exclude: JX.keys(this.getTokens()).join(',')}) + .setHandler( + JX.bind(this, function(r) { + var source = this._typeahead.getDatasource(); + + source.addResult(r.token); + var result = source.getResult(r.key); + + // If we have a limit of 1 token, replace the current token with + // the new token if we currently have a token. + if (this.getLimit() == 1) { + for (var k in this.getTokens()) { + this.removeToken(k); + } + } + + this.addToken(r.key, result.name); + this.focus(); + })) + .start(); } } diff --git a/webroot/rsrc/externals/javelin/lib/control/typeahead/Typeahead.js b/webroot/rsrc/externals/javelin/lib/control/typeahead/Typeahead.js index 210e0b077c..5875bf9ea6 100644 --- a/webroot/rsrc/externals/javelin/lib/control/typeahead/Typeahead.js +++ b/webroot/rsrc/externals/javelin/lib/control/typeahead/Typeahead.js @@ -32,7 +32,6 @@ * @task start Activating a Typeahead * @task control Controlling Typeaheads from Javascript * @task internal Internal Methods - * @group control */ JX.install('Typeahead', { /** @@ -124,6 +123,7 @@ JX.install('Typeahead', { _datasource : null, _waitingListener : null, _readyListener : null, + _completeListener : null, /** * Activate your properly configured typeahead. It won't do anything until @@ -137,9 +137,9 @@ JX.install('Typeahead', { if (__DEV__) { if (!this._datasource) { throw new Error( - "JX.Typeahead.start(): " + - "No datasource configured. Create a datasource and call " + - "setDatasource()."); + 'JX.Typeahead.start(): ' + + 'No datasource configured. Create a datasource and call ' + + 'setDatasource().'); } } this.updatePlaceholder(); @@ -160,15 +160,20 @@ JX.install('Typeahead', { this._datasource.unbindFromTypeahead(); this._waitingListener.remove(); this._readyListener.remove(); + this._completeListener.remove(); } this._waitingListener = datasource.listen( 'waiting', - JX.bind(this, this.waitForResults) - ); + JX.bind(this, this.waitForResults)); + this._readyListener = datasource.listen( 'resultsready', - JX.bind(this, this.showResults) - ); + JX.bind(this, this.showResults)); + + this._completeListener = datasource.listen( + 'complete', + JX.bind(this, this.doneWaitingForResults)); + datasource.bindToTypeahead(this); this._datasource = datasource; }, @@ -211,13 +216,40 @@ JX.install('Typeahead', { * in response to events from the datasource you have configured. * * @task control - * @param list List of #### tags to show as suggestions/results. + * @param list List of #### tags to show as suggestions/results. + * @param string The query this result list corresponds to. * @return void */ - showResults : function(results) { + showResults : function(results, value) { + if (value != this._value) { + // This result list is for an old query, and no longer represents + // the input state of the typeahead. + + // For example, the user may have typed "dog", and then they delete + // their query and type "cat", and then the "dog" results arrive from + // the source. + + // Another case is that the user made a selection in a tokenizer, + // and then results returned. However, the typeahead is now empty, and + // we don't want to pop it back open. + + // In all cases, just throw these results away. They are no longer + // relevant. + return; + } + var obj = {show: results}; var e = this.invoke('show', obj); + // If the user has an element focused, store the value before we redraw. + // After we redraw, try to select the same element if it still exists in + // the list. This prevents redraws from disrupting keyboard element + // selection. + var old_focus = null; + if (this._focus >= 0 && this._display[this._focus]) { + old_focus = this._display[this._focus].name; + } + // Note that the results list may have been update by the "show" event // listener. Non-result node (e.g. divider or label) may have been // inserted. @@ -233,6 +265,18 @@ JX.install('Typeahead', { this._hardpoint.appendChild(this._root); } JX.DOM.show(this._root); + + // If we had a node focused before, look for a node with the same value + // and focus it. + if (old_focus !== null) { + for (var ii = 0; ii < this._display.length; ii++) { + if (this._display[ii].name == old_focus) { + this._focus = ii; + this._drawFocus(); + break; + } + } + } } else { this.hide(); JX.DOM.setContent(this._root, null); @@ -247,18 +291,27 @@ JX.install('Typeahead', { this._value = this._control.value; this.invoke('change', this._value); }, + /** - * Show a "waiting for results" UI in place of the typeahead's dropdown - * suggestion menu. NOTE: currently there's no such UI, lolol. + * Show a "waiting for results" UI. We may be showing a partial result set + * at this time, if the user is extending a query we already have results + * for. * * @task control * @return void */ waitForResults : function() { - // TODO: Build some sort of fancy spinner or "..." type UI here to - // visually indicate that we're waiting on the server. - // Wait on the datasource 'complete' event for hiding the spinner. - this.hide(); + JX.DOM.alterClass(this._hardpoint, 'jx-typeahead-waiting', true); + }, + + /** + * Hide the "waiting for results" UI. + * + * @task control + * @return void + */ + doneWaitingForResults : function() { + JX.DOM.alterClass(this._hardpoint, 'jx-typeahead-waiting', false); }, /** @@ -349,7 +402,7 @@ JX.install('Typeahead', { this._choose(this._display[this._focus]); return true; } else { - result = this.invoke('query', this._control.value); + var result = this.invoke('query', this._control.value); if (result.getPrevented()) { return true; } diff --git a/webroot/rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js b/webroot/rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js old mode 100755 new mode 100644 index 0410f75840..45e5b0b322 --- a/webroot/rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js +++ b/webroot/rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js @@ -4,9 +4,6 @@ * @javelin */ -/** - * @group control - */ JX.install('TypeaheadNormalizer', { statics : { /** @@ -17,9 +14,18 @@ JX.install('TypeaheadNormalizer', { * @return string Normalized string. */ normalize : function(str) { + + // NOTE: We specifically normalize "(" and ")" into spaces so that + // we can match tokenizer functions like "members(project)". + + // NOTE: We specifically do NOT normalize "\n" because it is used as + // a delimiter between components of typeahead result names, like the + // name of a project and its tags. + return ('' + str) .toLocaleLowerCase() - .replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()]/g, '') + .replace(/[\.,\/#!$%\^&\*;:{}=_`~]/g, '') + .replace(/[-\[\]\(\)]/g, ' ') .replace(/ +/g, ' ') .replace(/^\s*|\s*$/g, ''); } diff --git a/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js b/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js index d2d2afc3cc..7f1d80e86e 100644 --- a/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js +++ b/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js @@ -6,9 +6,6 @@ * @javelin */ -/** - * @group control - */ JX.install('TypeaheadCompositeSource', { extend : 'TypeaheadSource', @@ -50,9 +47,9 @@ JX.install('TypeaheadCompositeSource', { } }, - childResultsReady : function(nodes) { + childResultsReady : function(nodes, value) { this.results = this.mergeResults(this.results || [], nodes); - this.invoke('resultsready', this.results); + this.invoke('resultsready', this.results, value); }, childComplete : function() { @@ -75,4 +72,3 @@ JX.install('TypeaheadCompositeSource', { } } }); - diff --git a/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js b/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js index 43ef772ef3..5b301dc6fe 100644 --- a/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js +++ b/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js @@ -7,9 +7,6 @@ * @javelin */ -/** - * @group control - */ JX.install('TypeaheadOnDemandSource', { extend : 'TypeaheadSource', @@ -41,18 +38,40 @@ JX.install('TypeaheadOnDemandSource', { lastChange : null, haveData : null, - didChange : function(raw_value) { + didChange : function(raw_value, force) { this.lastChange = JX.now(); var value = this.normalize(raw_value); if (this.haveData[value]) { - this.matchResults(value); + this.matchResults(raw_value); } else { + // If we have data for any prefix of the query, send those results + // back immediately. This allows "alinc" -> "alinco" to show partial + // results without the UI flickering. We'll still show the loading + // state, and then can show better results once we get everything + // back. + for (var ii = value.length - 1; ii > 0; ii--) { + var substr = value.substring(0, ii); + if (this.haveData[substr]) { + this.matchResults(raw_value, true); + break; + } + } + this.waitForResults(); - setTimeout( - JX.bind(this, this.sendRequest, this.lastChange, value, raw_value), - this.getQueryDelay() - ); + + var send_request = JX.bind( + this, + this.sendRequest, + this.lastChange, + value, + raw_value); + + if (force) { + send_request(); + } else { + setTimeout(send_request, this.getQueryDelay()); + } } }, @@ -62,25 +81,27 @@ JX.install('TypeaheadOnDemandSource', { } var r = new JX.Request( this.uri, - JX.bind(this, this.ondata, this.lastChange, value)); + JX.bind(this, this.ondata, this.lastChange, raw_value)); r.setMethod('GET'); r.setData(JX.copy(this.getAuxiliaryData(), {q : value, raw: raw_value})); r.send(); }, - ondata : function(when, value, results) { + ondata : function(when, raw_value, results) { if (results) { for (var ii = 0; ii < results.length; ii++) { this.addResult(results[ii]); } } + + var value = this.normalize(raw_value); this.haveData[value] = true; + if (when != this.lastChange) { return; } - this.matchResults(value); + + this.matchResults(raw_value); } } }); - - diff --git a/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js b/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js index ace130610a..074d552892 100644 --- a/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js +++ b/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js @@ -12,8 +12,6 @@ * URI. This is appropriate if the total data size is small (up to perhaps a * few thousand items). If you have more items so you can't ship them down to * the client in one repsonse, use @{JX.TypeaheadOnDemandSource}. - * - * @group control */ JX.install('TypeaheadPreloadedSource', { @@ -53,9 +51,10 @@ JX.install('TypeaheadPreloadedSource', { this.matchResults(this.lastValue); } this.ready = true; + }, + + setReady: function(ready) { + this.ready = ready; } } }); - - - diff --git a/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js b/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js index 95e4b52f15..0dedc08666 100644 --- a/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js +++ b/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js @@ -7,13 +7,9 @@ * @javelin */ -/** - * @group control - */ JX.install('TypeaheadSource', { construct : function() { - this._raw = {}; - this._lookup = {}; + this.resetResults(); this.setNormalizer(JX.TypeaheadNormalizer.normalize); this._excludeIDs = {}; }, @@ -28,7 +24,7 @@ JX.install('TypeaheadSource', { * the server. The purpose of normalization is to strip out irrelevant data, * like uppercase/lowercase, extra spaces, or punctuation. By default, * the @{JX.TypeaheadNormalizer} is used to normalize strings, but you may - * want to provide a different normalizer, particiularly if there are + * want to provide a different normalizer, particularly if there are * special characters with semantic meaning in your object names. * * @param function @@ -60,7 +56,7 @@ JX.install('TypeaheadSource', { * - **display**: the text or nodes to show in the DOM. Usually just the * same as ##name##. * - **tokenizable**: if you want to tokenize something other than the - * ##name##, for the typeahead to complete on, specify it here. A + * ##name##, for the typeahead to complete on, specify it here. A * selected entry from the typeahead will still insert the ##name## * into the input, but the ##tokenizable## field lets you complete on * non-name things. @@ -109,7 +105,21 @@ JX.install('TypeaheadSource', { * * @param function */ - sortHandler : null + sortHandler : null, + + /** + * Optional function which is used to filter results before display. Inputs + * are the input string and a list of matches. The function should + * return a list of matches to display. This is the minimum useful + * implementation: + * + * function(value, list) { + * return list; + * } + * + * @param function + */ + filterHandler : null }, @@ -136,7 +146,7 @@ JX.install('TypeaheadSource', { this._startListener.remove(); }, - didChange : function(value) { + didChange : function() { return; }, @@ -176,8 +186,8 @@ JX.install('TypeaheadSource', { for (var k in {name : 1, id : 1, display : 1, uri : 1}) { if (!(k in obj)) { throw new Error( - "JX.TypeaheadSource.addResult(): " + - "result must have properties 'name', 'id', 'uri' and 'display'."); + 'JX.TypeaheadSource.addResult(): result must have ' + + 'properties \'name\', \'id\', \'uri\' and \'display\'.'); } } } @@ -185,7 +195,9 @@ JX.install('TypeaheadSource', { this._raw[obj.id] = obj; var t = this.tokenize(obj.tokenizable || obj.name); for (var jj = 0; jj < t.length; ++jj) { - this._lookup[t[jj]] = this._lookup[t[jj]] || []; + if (!this._lookup.hasOwnProperty(t[jj])) { + this._lookup[t[jj]] = []; + } this._lookup[t[jj]].push(obj.id); } }, @@ -209,7 +221,7 @@ JX.install('TypeaheadSource', { }, - matchResults : function(value) { + matchResults : function(value, partial) { // This table keeps track of the number of tokens each potential match // has actually matched. When we're done, the real matches are those @@ -273,31 +285,39 @@ JX.install('TypeaheadSource', { } } - this.sortHits(value, hits); + this.filterAndSortHits(value, hits); var nodes = this.renderNodes(value, hits); - this.invoke('resultsready', nodes); - this.invoke('complete'); + this.invoke('resultsready', nodes, value, partial); + if (!partial) { + this.invoke('complete'); + } }, - sortHits : function(value, hits) { + filterAndSortHits : function(value, hits) { var objs = []; var ii; for (ii = 0; ii < hits.length; ii++) { objs.push(this._raw[hits[ii]]); } - var default_comparator = function(u, v) { - var key_u = u.sort || u.name; - var key_v = v.sort || v.name; - return key_u.localeCompare(key_v); + var default_comparator = function(u, v) { + var key_u = u.sort || u.name; + var key_v = v.sort || v.name; + return key_u.localeCompare(key_v); }; - var handler = this.getSortHandler() || function(value, list, cmp) { + var filter_handler = this.getFilterHandler() || function(value, list) { + return list; + }; + + objs = filter_handler(value, objs); + + var sort_handler = this.getSortHandler() || function(value, list, cmp) { list.sort(cmp); }; - handler(value, objs, default_comparator); + sort_handler(value, objs, default_comparator); hits.splice(0, hits.length); for (ii = 0; ii < objs.length; ii++) { @@ -336,8 +356,14 @@ JX.install('TypeaheadSource', { if (!str.length) { return []; } - return str.split(/\s/g); + return str.split(/\s+/g); }, + + resetResults: function() { + this._raw = {}; + this._lookup = {}; + }, + _defaultTransformer : function(object) { return { name : object[0], diff --git a/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js b/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js index ac7045671d..9bd6bff8f4 100644 --- a/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js +++ b/webroot/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js @@ -9,8 +9,6 @@ * Typeahead source that uses static data passed to the constructor. For larger * datasets, use @{class:JX.TypeaheadPreloadedSource} or * @{class:JX.TypeaheadOnDemandSource} to improve performance. - * - * @group control */ JX.install('TypeaheadStaticSource', { @@ -18,23 +16,20 @@ JX.install('TypeaheadStaticSource', { construct : function(data) { JX.TypeaheadSource.call(this); - this._data = data; + this.data = data; }, members : { - _data : null, + data : null, didChange : function(value) { this.matchResults(value); }, didStart : function() { - for (var ii = 0; ii < this._data.length; ii++) { - this.addResult(this._data[ii]); + for (var ii = 0; ii < this.data.length; ii++) { + this.addResult(this.data[ii]); } } } }); - - - diff --git a/webroot/rsrc/externals/raphael/g.raphael.js b/webroot/rsrc/externals/raphael/g.raphael.js deleted file mode 100644 index 70936409ad..0000000000 --- a/webroot/rsrc/externals/raphael/g.raphael.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @provides raphael-g - * @do-not-minify - * @nolint - */ -/*! - * g.Raphael 0.5 - Charting library, based on Raphaël - * - * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) - * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. - */ -Raphael.el.popup=function(d,k,h,g){var c=this.paper||this[0].paper,f,j,b,e,a;if(!c){return}switch(this.type){case"text":case"circle":case"ellipse":b=true;break;default:b=false}d=d==null?"up":d;k=k||5;f=this.getBBox();h=typeof h=="number"?h:(b?f.x+f.width/2:f.x);g=typeof g=="number"?g:(b?f.y+f.height/2:f.y);e=Math.max(f.width/2-k,0);a=Math.max(f.height/2-k,0);this.translate(h-f.x-(b?f.width/2:0),g-f.y-(b?f.height/2:0));f=this.getBBox();var i={up:["M",h,g,"l",-k,-k,-e,0,"a",k,k,0,0,1,-k,-k,"l",0,-f.height,"a",k,k,0,0,1,k,-k,"l",k*2+e*2,0,"a",k,k,0,0,1,k,k,"l",0,f.height,"a",k,k,0,0,1,-k,k,"l",-e,0,"z"].join(","),down:["M",h,g,"l",k,k,e,0,"a",k,k,0,0,1,k,k,"l",0,f.height,"a",k,k,0,0,1,-k,k,"l",-(k*2+e*2),0,"a",k,k,0,0,1,-k,-k,"l",0,-f.height,"a",k,k,0,0,1,k,-k,"l",e,0,"z"].join(","),left:["M",h,g,"l",-k,k,0,a,"a",k,k,0,0,1,-k,k,"l",-f.width,0,"a",k,k,0,0,1,-k,-k,"l",0,-(k*2+a*2),"a",k,k,0,0,1,k,-k,"l",f.width,0,"a",k,k,0,0,1,k,k,"l",0,a,"z"].join(","),right:["M",h,g,"l",k,-k,0,-a,"a",k,k,0,0,1,k,-k,"l",f.width,0,"a",k,k,0,0,1,k,k,"l",0,k*2+a*2,"a",k,k,0,0,1,-k,k,"l",-f.width,0,"a",k,k,0,0,1,-k,-k,"l",0,-a,"z"].join(",")};j={up:{x:-!b*(f.width/2),y:-k*2-(b?f.height/2:f.height)},down:{x:-!b*(f.width/2),y:k*2+(b?f.height/2:f.height)},left:{x:-k*2-(b?f.width/2:f.width),y:-!b*(f.height/2)},right:{x:k*2+(b?f.width/2:f.width),y:-!b*(f.height/2)}}[d];this.translate(j.x,j.y);return c.path(i[d]).attr({fill:"#000",stroke:"none"}).insertBefore(this.node?this:this[0])};Raphael.el.tag=function(f,b,l,k){var i=3,e=this.paper||this[0].paper;if(!e){return}var c=e.path().attr({fill:"#000",stroke:"#000"}),j=this.getBBox(),m,h,a,g;switch(this.type){case"text":case"circle":case"ellipse":a=true;break;default:a=false}f=f||0;l=typeof l=="number"?l:(a?j.x+j.width/2:j.x);k=typeof k=="number"?k:(a?j.y+j.height/2:j.y);b=b==null?5:b;h=0.5522*b;if(j.height>=b*2){c.attr({path:["M",l,k+b,"a",b,b,0,1,1,0,-b*2,b,b,0,1,1,0,b*2,"m",0,-b*2-i,"a",b+i,b+i,0,1,0,0,(b+i)*2,"L",l+b+i,k+j.height/2+i,"l",j.width+2*i,0,0,-j.height-2*i,-j.width-2*i,0,"L",l,k-b-i].join(",")})}else{m=Math.sqrt(Math.pow(b+i,2)-Math.pow(j.height/2+i,2));c.attr({path:["M",l,k+b,"c",-h,0,-b,h-b,-b,-b,0,-h,b-h,-b,b,-b,h,0,b,b-h,b,b,0,h,h-b,b,-b,b,"M",l+m,k-j.height/2-i,"a",b+i,b+i,0,1,0,0,j.height+2*i,"l",b+i-m+j.width+2*i,0,0,-j.height-2*i,"L",l+m,k-j.height/2-i].join(",")})}f=360-f;c.rotate(f,l,k);if(this.attrs){this.attr(this.attrs.x?"x":"cx",l+b+i+(!a?this.type=="text"?j.width:0:j.width/2)).attr("y",a?k:k-j.height/2);this.rotate(f,l,k);f>90&&f<270&&this.attr(this.attrs.x?"x":"cx",l-b-i-(!a?j.width:j.width/2)).rotate(180,l,k)}else{if(f>90&&f<270){this.translate(l-j.x-j.width-b-i,k-j.y-j.height/2);this.rotate(f-180,j.x+j.width+b+i,j.y+j.height/2)}else{this.translate(l-j.x+b+i,k-j.y-j.height/2);this.rotate(f,j.x-b-i,j.y+j.height/2)}}return c.insertBefore(this.node?this:this[0])};Raphael.el.drop=function(d,g,f){var e=this.getBBox(),c=this.paper||this[0].paper,a,j,b,i,h;if(!c){return}switch(this.type){case"text":case"circle":case"ellipse":a=true;break;default:a=false}d=d||0;g=typeof g=="number"?g:(a?e.x+e.width/2:e.x);f=typeof f=="number"?f:(a?e.y+e.height/2:e.y);j=Math.max(e.width,e.height)+Math.min(e.width,e.height);b=c.path(["M",g,f,"l",j,0,"A",j*0.4,j*0.4,0,1,0,g+j*0.7,f-j*0.7,"z"]).attr({fill:"#000",stroke:"none"}).rotate(22.5-d,g,f);d=(d+90)*Math.PI/180;i=(g+j*Math.sin(d))-(a?0:e.width/2);h=(f+j*Math.cos(d))-(a?0:e.height/2);this.attrs?this.attr(this.attrs.x?"x":"cx",i).attr(this.attrs.y?"y":"cy",h):this.translate(i-e.x,h-e.y);return b.insertBefore(this.node?this:this[0])};Raphael.el.flag=function(e,k,j){var g=3,c=this.paper||this[0].paper;if(!c){return}var b=c.path().attr({fill:"#000",stroke:"#000"}),i=this.getBBox(),f=i.height/2,a;switch(this.type){case"text":case"circle":case"ellipse":a=true;break;default:a=false}e=e||0;k=typeof k=="number"?k:(a?i.x+i.width/2:i.x);j=typeof j=="number"?j:(a?i.y+i.height/2:i.y);b.attr({path:["M",k,j,"l",f+g,-f-g,i.width+2*g,0,0,i.height+2*g,-i.width-2*g,0,"z"].join(",")});e=360-e;b.rotate(e,k,j);if(this.attrs){this.attr(this.attrs.x?"x":"cx",k+f+g+(!a?this.type=="text"?i.width:0:i.width/2)).attr("y",a?j:j-i.height/2);this.rotate(e,k,j);e>90&&e<270&&this.attr(this.attrs.x?"x":"cx",k-f-g-(!a?i.width:i.width/2)).rotate(180,k,j)}else{if(e>90&&e<270){this.translate(k-i.x-i.width-f-g,j-i.y-i.height/2);this.rotate(e-180,i.x+i.width+f+g,i.y+i.height/2)}else{this.translate(k-i.x+f+g,j-i.y-i.height/2);this.rotate(e,i.x-f-g,i.y+i.height/2)}}return b.insertBefore(this.node?this:this[0])};Raphael.el.label=function(){var c=this.getBBox(),b=this.paper||this[0].paper,a=Math.min(20,c.width+10,c.height+10)/2;if(!b){return}return b.rect(c.x-a/2,c.y-a/2,c.width+a,c.height+a,a).attr({stroke:"none",fill:"#000"}).insertBefore(this.node?this:this[0])};Raphael.el.blob=function(z,j,i){var g=this.getBBox(),B=Math.PI/180,n=this.paper||this[0].paper,r,A,q;if(!n){return}switch(this.type){case"text":case"circle":case"ellipse":A=true;break;default:A=false}r=n.path().attr({fill:"#000",stroke:"none"});z=(+z+1?z:45)+90;q=Math.min(g.height,g.width);j=typeof j=="number"?j:(A?g.x+g.width/2:g.x);i=typeof i=="number"?i:(A?g.y+g.height/2:g.y);var m=Math.max(g.width+q,q*25/12),t=Math.max(g.height+q,q*25/12),u=j+q*Math.sin((z-22.5)*B),b=i+q*Math.cos((z-22.5)*B),v=j+q*Math.sin((z+22.5)*B),d=i+q*Math.cos((z+22.5)*B),o=(v-u)/2,l=(d-b)/2,f=m/2,e=t/2,s=-Math.sqrt(Math.abs(f*f*e*e-f*f*l*l-e*e*o*o)/(f*f*l*l+e*e*o*o)),c=s*f*l/e+(v+u)/2,a=s*-e*o/f+(d+b)/2;r.attr({x:c,y:a,path:["M",j,i,"L",v,d,"A",f,e,0,1,1,u,b,"z"].join(",")});this.translate(c-g.x-g.width/2,a-g.y-g.height/2);return r.insertBefore(this.node?this:this[0])};Raphael.fn.label=function(a,d,b){var c=this.set();b=this.text(a,d,b).attr(Raphael.g.txtattr);return c.push(b.label(),b)};Raphael.fn.popup=function(a,f,d,b,c){var e=this.set();d=this.text(a,f,d).attr(Raphael.g.txtattr);return e.push(d.popup(b,c),d)};Raphael.fn.tag=function(a,f,d,c,b){var e=this.set();d=this.text(a,f,d).attr(Raphael.g.txtattr);return e.push(d.tag(c,b),d)};Raphael.fn.flag=function(a,e,c,b){var d=this.set();c=this.text(a,e,c).attr(Raphael.g.txtattr);return d.push(c.flag(b),c)};Raphael.fn.drop=function(a,e,c,b){var d=this.set();c=this.text(a,e,c).attr(Raphael.g.txtattr);return d.push(c.drop(b),c)};Raphael.fn.blob=function(a,e,c,b){var d=this.set();c=this.text(a,e,c).attr(Raphael.g.txtattr);return d.push(c.blob(b),c)};Raphael.el.lighter=function(b){b=b||2;var a=[this.attrs.fill,this.attrs.stroke];this.fs=this.fs||[a[0],a[1]];a[0]=Raphael.rgb2hsb(Raphael.getRGB(a[0]).hex);a[1]=Raphael.rgb2hsb(Raphael.getRGB(a[1]).hex);a[0].b=Math.min(a[0].b*b,1);a[0].s=a[0].s/b;a[1].b=Math.min(a[1].b*b,1);a[1].s=a[1].s/b;this.attr({fill:"hsb("+[a[0].h,a[0].s,a[0].b]+")",stroke:"hsb("+[a[1].h,a[1].s,a[1].b]+")"});return this};Raphael.el.darker=function(b){b=b||2;var a=[this.attrs.fill,this.attrs.stroke];this.fs=this.fs||[a[0],a[1]];a[0]=Raphael.rgb2hsb(Raphael.getRGB(a[0]).hex);a[1]=Raphael.rgb2hsb(Raphael.getRGB(a[1]).hex);a[0].s=Math.min(a[0].s*b,1);a[0].b=a[0].b/b;a[1].s=Math.min(a[1].s*b,1);a[1].b=a[1].b/b;this.attr({fill:"hsb("+[a[0].h,a[0].s,a[0].b]+")",stroke:"hsb("+[a[1].h,a[1].s,a[1].b]+")"});return this};Raphael.el.resetBrightness=function(){if(this.fs){this.attr({fill:this.fs[0],stroke:this.fs[1]});delete this.fs}return this};(function(){var c=["lighter","darker","resetBrightness"],a=["popup","tag","flag","label","drop","blob"];for(var b in a){(function(d){Raphael.st[d]=function(){return Raphael.el[d].apply(this,arguments)}})(a[b])}for(var b in c){(function(d){Raphael.st[d]=function(){for(var e=0;e0?0:0.5))*Math.pow(10,b))/Math.pow(10,b);return{from:e,to:l,power:b}},axis:function(p,o,k,D,e,G,g,J,h,a,q){a=a==null?2:a;h=h||"t";G=G||10;q=arguments[arguments.length-1];var C=h=="|"||h==" "?["M",p+0.5,o,"l",0,0.001]:g==1||g==3?["M",p+0.5,o,"l",0,-k]:["M",p,o+0.5,"l",k,0],s=this.snapEnds(D,e,G),H=s.from,z=s.to,F=s.power,E=0,w={font:"11px 'Fontin Sans', Fontin-Sans, sans-serif"},v=q.set(),I;I=(z-H)/G;var n=H,m=F>0?F:0;r=k/G;if(+g==1||+g==3){var b=o,u=(g-1?1:-1)*(a+3+!!(g-1));while(b>=o-k){h!="-"&&h!=" "&&(C=C.concat(["M",p-(h=="+"||h=="|"?a:!(g-1)*a*2),b+0.5,"l",a*2+1,0]));v.push(q.text(p+u,b,(J&&J[E++])||(Math.round(n)==n?n:+n.toFixed(m))).attr(w).attr({"text-anchor":g-1?"start":"end"}));n+=I;b-=r}if(Math.round(b+r-(o-k))){h!="-"&&h!=" "&&(C=C.concat(["M",p-(h=="+"||h=="|"?a:!(g-1)*a*2),o-k+0.5,"l",a*2+1,0]));v.push(q.text(p+u,o-k,(J&&J[E])||(Math.round(n)==n?n:+n.toFixed(m))).attr(w).attr({"text-anchor":g-1?"start":"end"}))}}else{n=H;m=(F>0)*F;u=(g?-1:1)*(a+9+!g);var c=p,r=k/G,A=0,B=0;while(c<=p+k){h!="-"&&h!=" "&&(C=C.concat(["M",c+0.5,o-(h=="+"?a:!!g*a*2),"l",0,a*2+1]));v.push(A=q.text(c,o+u,(J&&J[E++])||(Math.round(n)==n?n:+n.toFixed(m))).attr(w));var l=A.getBBox();if(B>=l.x-5){v.pop(v.length-1).remove()}else{B=l.x+l.width}n+=I;c+=r}if(Math.round(c-r-p-k)){h!="-"&&h!=" "&&(C=C.concat(["M",p+k+0.5,o-(h=="+"?a:!!g*a*2),"l",0,a*2+1]));v.push(q.text(p+k,o+u,(J&&J[E])||(Math.round(n)==n?n:+n.toFixed(m))).attr(w))}}var K=q.path(C);K.text=v;K.all=q.set([K,v]);K.remove=function(){this.text.remove();this.constructor.prototype.remove.call(this)};return K},labelise:function(a,c,b){if(a){return(a+"").replace(/(##+(?:\.#+)?)|(%%+(?:\.%+)?)/g,function(d,f,e){if(f){return(+c).toFixed(f.replace(/^#+\.?/g,"").length)}if(e){return(c*100/b).toFixed(e.replace(/^%+\.?/g,"").length)+"%"}})}else{return(+c).toFixed(0)}}}; \ No newline at end of file diff --git a/webroot/rsrc/externals/raphael/g.raphael.line.js b/webroot/rsrc/externals/raphael/g.raphael.line.js deleted file mode 100644 index fe8892e190..0000000000 --- a/webroot/rsrc/externals/raphael/g.raphael.line.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @provides raphael-g-line - * @do-not-minify - * @nolint - */ -/*! - * g.Raphael 0.5 - Charting library, based on Raphaël - * - * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) - * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. - */ -(function(){function a(g,n){var f=g.length/n,h=0,e=f,m=0,i=[];while(he-2*q){z[ac]=a(z[ac],e-2*q);B=e-2*q}if(A[ac]&&A[ac].length>e-2*q){A[ac]=a(A[ac],e-2*q)}}var W=Array.prototype.concat.apply([],A),U=Array.prototype.concat.apply([],z),u=s.snapEnds(Math.min.apply(Math,W),Math.max.apply(Math,W),A[0].length-1),E=u.from,o=u.to,N=s.snapEnds(Math.min.apply(Math,U),Math.max.apply(Math,U),z[0].length-1),C=N.from,n=N.to,Z=(e-q*2)/((o-E)||1),V=(h-q*2)/((n-C)||1);var G=f.set();if(J.axis){var m=(J.axis+"").split(/[,\s]+/);+m[0]&&G.push(s.axis(P+q,O+q,e-2*q,E,o,J.axisxstep||Math.floor((e-2*q)/20),2,f));+m[1]&&G.push(s.axis(P+e-q,O+h-q,h-2*q,C,n,J.axisystep||Math.floor((h-2*q)/20),3,f));+m[2]&&G.push(s.axis(P+q,O+h-q,e-2*q,E,o,J.axisxstep||Math.floor((e-2*q)/20),0,f));+m[3]&&G.push(s.axis(P+q,O+h-q,h-2*q,C,n,J.axisystep||Math.floor((h-2*q)/20),1,f))}var M=f.set(),aa=f.set(),r;for(ac=0,L=z.length;acf*b.top){e=b.percents[y],p=b.percents[y-1]||0,t=t/b.top*(e-p),o=b.percents[y+1],j=b.anim[e];break}f&&d.attr(b.anim[b.percents[y]])}if(!!j){if(!k){for(var A in j)if(j[g](A))if(U[g](A)||d.paper.customAttributes[g](A)){u[A]=d.attr(A),u[A]==null&&(u[A]=T[A]),v[A]=j[A];switch(U[A]){case C:w[A]=(v[A]-u[A])/t;break;case"colour":u[A]=a.getRGB(u[A]);var B=a.getRGB(v[A]);w[A]={r:(B.r-u[A].r)/t,g:(B.g-u[A].g)/t,b:(B.b-u[A].b)/t};break;case"path":var D=bG(u[A],v[A]),E=D[1];u[A]=D[0],w[A]=[];for(y=0,z=u[A].length;yd)return d;while(cf?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cd(){return this.x+q+this.y+q+this.width+" × "+this.height}function cc(){return this.x+q+this.y}function bQ(a,b,c,d,e,f){a!=null?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function bw(a){var b=[];for(var c=0,d=a.length;d-2>c;c+=2){var e=[{x:+a[c],y:+a[c+1]},{x:+a[c],y:+a[c+1]},{x:+a[c+2],y:+a[c+3]},{x:+a[c+4],y:+a[c+5]}];d-4==c?(e[0]={x:+a[c-2],y:+a[c-1]},e[3]=e[2]):c&&(e[0]={x:+a[c-2],y:+a[c-1]}),b.push(["C",(-e[0].x+6*e[1].x+e[2].x)/6,(-e[0].y+6*e[1].y+e[2].y)/6,(e[1].x+6*e[2].x-e[3].x)/6,(e[1].y+6*e[2].y-e[3].y)/6,e[2].x,e[2].y])}return b}function bv(){return this.hex}function bt(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[g](f)){bs(i,f);return c?c(h[f]):h[f]}i.length>=1e3&&delete h[i.shift()],i.push(f),h[f]=a[m](b,e);return c?c(h[f]):h[f]}return d}function bs(a,b){for(var c=0,d=a.length;c',bk=bj.firstChild,bk.style.behavior="url(#default#VML)";if(!bk||typeof bk.adj!="object")return a.type=p;bj=null}a.svg=!(a.vml=a.type=="VML"),a._Paper=j,a.fn=k=j.prototype=a.prototype,a._id=0,a._oid=0,a.is=function(a,b){b=v.call(b);if(b=="finite")return!M[g](+a);if(b=="array")return a instanceof Array;return b=="null"&&a===null||b==typeof a&&a!==null||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||H.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+w.atan2(-i,-h)*180/B+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*B/180},a.deg=function(a){return a*180/B%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,E)){var e=b.length;while(e--)if(z(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(fb-d)return c-f+b}return c};var bl=a.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=w.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){eve("setWindow",a,h.win,b),h.win=b,h.doc=h.win.document,a._engine.initWin&&a._engine.initWin(h.win)};var bm=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write(""),e.close(),d=e.body}catch(f){d=createPopup().document.body}var g=d.createTextRange();bm=bt(function(a){try{d.style.color=r(a).replace(c,p);var b=g.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=h.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",h.doc.body.appendChild(i),bm=bt(function(a){i.style.color=a;return h.doc.defaultView.getComputedStyle(i,p).getPropertyValue("color")})}return bm(b)},bn=function(){return"hsb("+[this.h,this.s,this.b]+")"},bo=function(){return"hsl("+[this.h,this.s,this.l]+")"},bp=function(){return this.hex},bq=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,D)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},br=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:bp};a.is(e,"finite")&&(f.opacity=e);return f};a.color=function(b){var c;a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b?(c=a.hsb2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b?(c=a.hsl2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):(a.is(b,"string")&&(b=a.getRGB(b)),a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b?(c=a.rgb2hsl(b),b.h=c.h,b.s=c.s,b.l=c.l,c=a.rgb2hsb(b),b.v=c.b):(b={hex:"none"},b.r=b.g=b.b=b.h=b.s=b.v=b.l=-1)),b.toString=bp;return b},a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-z(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return br(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-z(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return br(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bq(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=x(a,b,c),g=f-y(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bn}},a.rgb2hsl=function(a,b,c){c=bq(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=x(a,b,c),h=y(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bo}},a._path2string=function(){return this.join(",").replace(X,"$1")};var bu=a._preload=function(a,b){var c=h.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,h.doc.body.removeChild(this)},c.onerror=function(){h.doc.body.removeChild(this)},h.doc.body.appendChild(c),c.src=a};a.getRGB=bt(function(b){if(!b||!!((b=r(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bv};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none",toString:bv};!W[g](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bm(b));var c,d,e,f,h,i,j,k=b.match(L);if(k){k[2]&&(f=R(k[2].substring(5),16),e=R(k[2].substring(3,5),16),d=R(k[2].substring(1,3),16)),k[3]&&(f=R((i=k[3].charAt(3))+i,16),e=R((i=k[3].charAt(2))+i,16),d=R((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4][s](V),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5][s](V),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,f,h)}if(k[6]){j=k[6][s](V),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,f,h)}k={r:d,g:e,b:f,toString:bv},k.hex="#"+(16777216|f|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bv}},a),a.hsb=bt(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=bt(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=bt(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=bt(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=by(b)),d.length||r(b).replace(Y,function(a,b,e){var f=[],g=b.toLowerCase();e.replace($,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(d.push([b][n](f.splice(0,2))),g="l",b=b=="m"?"l":"L");if(g=="r")d.push([b][n](f));else while(f.length>=c[g]){d.push([b][n](f.splice(0,c[g])));if(!c[g])break}}),d.toString=a._path2string;return d}),a.parseTransformString=bt(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=by(b)),d.length||r(b).replace(Z,function(a,b,c){var e=[],f=v.call(b);c.replace($,function(a,b){b&&e.push(+b)}),d.push([b][n](e))}),d.toString=a._path2string;return d}),a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=A(j,3),l=A(j,2),m=i*i,n=m*i,o=k*a+l*3*i*c+j*3*i*i*e+n*g,p=k*b+l*3*i*d+j*3*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,x=j*e+i*g,y=j*f+i*h,z=90-w.atan2(q-s,r-t)*180/B;(q>s||r1&&(v=w.sqrt(v),c=v*c,d=v*d);var x=c*c,y=d*d,A=(f==g?-1:1)*w.sqrt(z((x*y-x*u*u-y*t*t)/(x*u*u+y*t*t))),C=A*c*u/d+(a+h)/2,D=A*-d*t/c+(b+i)/2,E=w.asin(((b-D)/d).toFixed(9)),F=w.asin(((i-D)/d).toFixed(9));E=aF&&(E=E-B*2),!g&&F>E&&(F=F-B*2)}else E=j[0],F=j[1],C=j[2],D=j[3];var G=F-E;if(z(G)>k){var H=F,I=h,J=i;F=E+k*(g&&F>E?1:-1),h=C+c*w.cos(F),i=D+d*w.sin(F),m=bD(h,i,c,d,e,0,g,I,J,[F,H,C,D])}G=F-E;var K=w.cos(E),L=w.sin(E),M=w.cos(F),N=w.sin(F),O=w.tan(G/4),P=4/3*c*O,Q=4/3*d*O,R=[a,b],S=[a+P*L,b-Q*K],T=[h+P*N,i-Q*M],U=[h,i];S[0]=2*R[0]-S[0],S[1]=2*R[1]-S[1];if(j)return[S,T,U][n](m);m=[S,T,U][n](m).join()[s](",");var V=[];for(var W=0,X=m.length;W"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bE(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bE(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bE(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bE(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:y[m](0,p),y:y[m](0,o)},max:{x:x[m](0,p),y:x[m](0,o)}}}),bG=a._path2curve=bt(function(a,b){var c=bA(a),d=b&&bA(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][n](bD[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][n](bC(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][n](bC(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](bB(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](bB(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](bB(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](bB(b.x,b.y,b.X,b.Y))}return a},h=function(a,b){if(a[b].length>7){a[b].shift();var e=a[b];while(e.length)a.splice(b++,0,["C"][n](e.splice(0,6)));a.splice(b,1),k=x(c.length,d&&d.length||0)}},i=function(a,b,e,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),e.bx=0,e.by=0,e.x=a[g][1],e.y=a[g][2],k=x(c.length,d&&d.length||0))};for(var j=0,k=x(c.length,d&&d.length||0);j=j)return p;o=p}if(j==null)return k},cg=function(b,c){return function(d,e,f){d=bG(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;oe){if(c&&!l.start){m=cf(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cf(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},ch=cg(1),ci=cg(),cj=cg(0,1);a.getTotalLength=ch,a.getPointAtLength=ci,a.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return cj(a,b).end;var d=cj(a,c,1);return b?cj(d,b).end:d},b$.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return ch(this.attrs.path)}},b$.getPointAtLength=function(a){if(this.type=="path")return ci(this.attrs.path,a)},b$.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var ck=a.easing_formulas={linear:function(a){return a},"<":function(a){return A(a,1.7)},">":function(a){return A(a,.48)},"<>":function(a){var b=.48-a/1.04,c=w.sqrt(.1734+b*b),d=c-b,e=A(z(d),1/3)*(d<0?-1:1),f=-c-b,g=A(z(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return A(2,-10*a)*w.sin((a-.075)*2*B/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};ck.easeIn=ck["ease-in"]=ck["<"],ck.easeOut=ck["ease-out"]=ck[">"],ck.easeInOut=ck["ease-in-out"]=ck["<>"],ck["back-in"]=ck.backIn,ck["back-out"]=ck.backOut;var cl=[],cm=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cn=function(){var b=+(new Date),c=0;for(;c1&&!d.next){for(s in k)k[g](s)&&(r[s]=d.totalOrigin[s]);d.el.attr(r),cr(d.anim,d.el,d.anim.percents[0],null,d.totalOrigin,d.repeat-1)}d.next&&!d.stop&&cr(d.anim,d.el,d.next,null,d.totalOrigin,d.repeat)}}a.svg&&m&&m.paper&&m.paper.safari(),cl.length&&cm(cn)},co=function(a){return a>255?255:a<0?0:a};b$.animateWith=function(b,c,d,e,f,g){var h=d?a.animation(d,e,f,g):c,i=b.status(c);return this.animate(h).status(h,i*c.ms/h.ms)},b$.onAnimation=function(a){a?eve.on("anim.frame."+this.id,a):eve.unbind("anim.frame."+this.id);return this},cq.prototype.delay=function(a){var b=new cq(this.anim,this.ms);b.times=this.times,b.del=+a||0;return b},cq.prototype.repeat=function(a){var b=new cq(this.anim,this.ms);b.del=this.del,b.times=w.floor(x(a,0))||1;return b},a.animation=function(b,c,d,e){if(b instanceof cq)return b;if(a.is(d,"function")||!d)e=e||d||null,d=null;b=Object(b),c=+c||0;var f={},h,i;for(i in b)b[g](i)&&Q(i)!=i&&Q(i)+"%"!=i&&(h=!0,f[i]=b[i]);if(!h)return new cq(b,c);d&&(f.easing=d),e&&(f.callback=e);return new cq({100:f},c)},b$.animate=function(b,c,d,e){var f=this;if(f.removed){e&&e.call(f);return f}var g=b instanceof cq?b:a.animation(b,c,d,e);cr(g,f,g.percents[0],null,f.attr());return f},b$.setTime=function(a,b){a&&b!=null&&this.status(a,y(b,a.ms)/a.ms);return this},b$.status=function(a,b){var c=[],d=0,e,f;if(b!=null){cr(a,this,-1,y(b,1));return this}e=cl.length;for(;d.5)*2-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&n!=.5&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/);if(j=="linear"){var t=e.shift();t=-d(t);if(isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient);if(!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,j=="radial"?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;x1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(p),i.setAttribute(o,G.hex),o=="stroke"&&G[b]("opacity")&&q(i,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity}),o=="stroke"&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":(d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p);break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),H&&(I=H.getElementsByTagName("stop"),q(I[I.length-1],{"stop-opacity":p}));break};default:o=="font-size"&&(p=e(p,10)+"px");var J=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[J]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if(d.type=="text"&&!!(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){g.text=f.text;while(h.firstChild)h.removeChild(h.firstChild);var j=c(f.text).split("\n"),k=[],m;for(var n=0,o=j.length;n"));var $=X.getBoundingClientRect();t.W=m.w=($.right-$.left)/Y,t.H=m.h=($.bottom-$.top)/Y,t.X=m.x,t.Y=m.y+t.H/2,("x"in i||"y"in i)&&(t.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));var _=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var ba=0,bb=_.length;ba.25&&(c=e.sqrt(.25-i(b-.5,2))*((c>.5)*2-1)+.5),m=b+n+c);return o}),f=f.split(/\s*\-\s*/);if(l=="linear"){var p=f.shift();p=-d(p);if(isNaN(p))return null}var q=a._parseDots(f);if(!q)return null;b=b.shape||b.node;if(q.length){b.removeChild(g),g.on=!0,g.method="none",g.color=q[0].color,g.color2=q[q.length-1].color;var r=[];for(var s=0,t=q.length;s')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e,f=b.width,g=b.x,h=b.y;if(!c)throw new Error("VML container not found.");var i=new a._Paper,j=i.canvas=a._g.doc.createElement("div"),k=j.style;g=g||0,h=h||0,f=f||512,d=d||342,i.width=f,i.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),i.coordsize=u*1e3+n+u*1e3,i.coordorigin="0 0",i.span=a._g.doc.createElement("span"),i.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",j.appendChild(i.span),k.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(a._g.doc.body.appendChild(j),k.left=g+"px",k.top=h+"px",k.position="absolute"):c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j),i.renderfix=function(){};return i},a.prototype.clear=function(){a.eve("clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E)E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}(window.Raphael) \ No newline at end of file diff --git a/webroot/rsrc/favicons/favicon-16x16.png b/webroot/rsrc/favicons/favicon-16x16.png new file mode 100644 index 0000000000..1fbf23eb5a Binary files /dev/null and b/webroot/rsrc/favicons/favicon-16x16.png differ diff --git a/webroot/rsrc/favicons/mask-icon.svg b/webroot/rsrc/favicons/mask-icon.svg new file mode 100644 index 0000000000..b6beedd96f --- /dev/null +++ b/webroot/rsrc/favicons/mask-icon.svg @@ -0,0 +1,50 @@ + + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + diff --git a/webroot/rsrc/image/BFCFDA.png b/webroot/rsrc/image/BFCFDA.png new file mode 100644 index 0000000000..cb61819a82 Binary files /dev/null and b/webroot/rsrc/image/BFCFDA.png differ diff --git a/webroot/rsrc/image/apple-touch-icon.png b/webroot/rsrc/image/apple-touch-icon.png deleted file mode 100644 index 493b3cb2c2..0000000000 Binary files a/webroot/rsrc/image/apple-touch-icon.png and /dev/null differ diff --git a/webroot/rsrc/image/avatar.png b/webroot/rsrc/image/avatar.png index 755d19cd2e..7d2514eca6 100644 Binary files a/webroot/rsrc/image/avatar.png and b/webroot/rsrc/image/avatar.png differ diff --git a/webroot/rsrc/image/checker_lighter.png b/webroot/rsrc/image/checker_lighter.png new file mode 100644 index 0000000000..05dc450bd8 Binary files /dev/null and b/webroot/rsrc/image/checker_lighter.png differ diff --git a/webroot/rsrc/image/chevron-in.png b/webroot/rsrc/image/chevron-in.png new file mode 100644 index 0000000000..373d39cfe1 Binary files /dev/null and b/webroot/rsrc/image/chevron-in.png differ diff --git a/webroot/rsrc/image/chevron-out.png b/webroot/rsrc/image/chevron-out.png new file mode 100644 index 0000000000..787772eb27 Binary files /dev/null and b/webroot/rsrc/image/chevron-out.png differ diff --git a/webroot/rsrc/image/controls/checkbox-checked.png b/webroot/rsrc/image/controls/checkbox-checked.png new file mode 100644 index 0000000000..9e93e82a37 Binary files /dev/null and b/webroot/rsrc/image/controls/checkbox-checked.png differ diff --git a/webroot/rsrc/image/controls/checkbox-unchecked.png b/webroot/rsrc/image/controls/checkbox-unchecked.png new file mode 100644 index 0000000000..e60350d770 Binary files /dev/null and b/webroot/rsrc/image/controls/checkbox-unchecked.png differ diff --git a/webroot/rsrc/image/credit_cards.png b/webroot/rsrc/image/credit_cards.png deleted file mode 100644 index dc54a4fca4..0000000000 Binary files a/webroot/rsrc/image/credit_cards.png and /dev/null differ diff --git a/webroot/rsrc/image/d5d8e1.png b/webroot/rsrc/image/d5d8e1.png new file mode 100644 index 0000000000..352aeb61dc Binary files /dev/null and b/webroot/rsrc/image/d5d8e1.png differ diff --git a/webroot/rsrc/image/examples/hero.png b/webroot/rsrc/image/examples/hero.png new file mode 100644 index 0000000000..2e13205659 Binary files /dev/null and b/webroot/rsrc/image/examples/hero.png differ diff --git a/webroot/rsrc/image/icon/fatcow/README b/webroot/rsrc/image/icon/fatcow/README index c294834741..327a315cd4 100644 --- a/webroot/rsrc/image/icon/fatcow/README +++ b/webroot/rsrc/image/icon/fatcow/README @@ -14,4 +14,4 @@ Some icons have been adapted from the FatCow set for use in Phabricator: source/conduit.png (from satellite_dish.png) source/mobile.png (from phone.png) source/tablet.png (from tablet.png) - source/fax.png (from fax.png) \ No newline at end of file + source/fax.png (from fax.png) diff --git a/webroot/rsrc/image/icon/fatcow/arrow_branch.png b/webroot/rsrc/image/icon/fatcow/arrow_branch.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/bullet_black.png b/webroot/rsrc/image/icon/fatcow/bullet_black.png deleted file mode 100644 index a113d8ef3b..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/bullet_black.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/bullet_orange.png b/webroot/rsrc/image/icon/fatcow/bullet_orange.png deleted file mode 100644 index dacfd4697f..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/bullet_orange.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/bullet_red.png b/webroot/rsrc/image/icon/fatcow/bullet_red.png deleted file mode 100644 index cc56c4b4b8..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/bullet_red.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/calendar_edit.png b/webroot/rsrc/image/icon/fatcow/calendar_edit.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/document_black.png b/webroot/rsrc/image/icon/fatcow/document_black.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/flag_blue.png b/webroot/rsrc/image/icon/fatcow/flag_blue.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/flag_finish.png b/webroot/rsrc/image/icon/fatcow/flag_finish.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/flag_green.png b/webroot/rsrc/image/icon/fatcow/flag_green.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/flag_orange.png b/webroot/rsrc/image/icon/fatcow/flag_orange.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/flag_pink.png b/webroot/rsrc/image/icon/fatcow/flag_pink.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/flag_purple.png b/webroot/rsrc/image/icon/fatcow/flag_purple.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/flag_red.png b/webroot/rsrc/image/icon/fatcow/flag_red.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/flag_yellow.png b/webroot/rsrc/image/icon/fatcow/flag_yellow.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/folder.png b/webroot/rsrc/image/icon/fatcow/folder.png deleted file mode 100755 index f1ed9abe03..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/folder.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/folder_go.png b/webroot/rsrc/image/icon/fatcow/folder_go.png deleted file mode 100755 index 3c36ef0c95..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/folder_go.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/link.png b/webroot/rsrc/image/icon/fatcow/link.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/page_white_link.png b/webroot/rsrc/image/icon/fatcow/page_white_link.png deleted file mode 100755 index fcb5f80f7f..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/page_white_link.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/page_white_put.png b/webroot/rsrc/image/icon/fatcow/page_white_put.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/icon/fatcow/page_white_text.png b/webroot/rsrc/image/icon/fatcow/page_white_text.png deleted file mode 100755 index f64dd01170..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/page_white_text.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/default160x120.png b/webroot/rsrc/image/icon/fatcow/thumbnails/default160x120.png deleted file mode 100644 index 16d6fd4f90..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/thumbnails/default160x120.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/default60x45.png b/webroot/rsrc/image/icon/fatcow/thumbnails/default60x45.png deleted file mode 100644 index 145ea1eb63..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/thumbnails/default60x45.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/image160x120.png b/webroot/rsrc/image/icon/fatcow/thumbnails/image160x120.png deleted file mode 100644 index 90cc11c02d..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/thumbnails/image160x120.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/image60x45.png b/webroot/rsrc/image/icon/fatcow/thumbnails/image60x45.png deleted file mode 100644 index 9077e69586..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/thumbnails/image60x45.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/pdf160x120.png b/webroot/rsrc/image/icon/fatcow/thumbnails/pdf160x120.png deleted file mode 100644 index 20f08f955b..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/thumbnails/pdf160x120.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/pdf60x45.png b/webroot/rsrc/image/icon/fatcow/thumbnails/pdf60x45.png deleted file mode 100644 index 8a16eaf488..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/thumbnails/pdf60x45.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/zip160x120.png b/webroot/rsrc/image/icon/fatcow/thumbnails/zip160x120.png deleted file mode 100644 index fbe19e59f6..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/thumbnails/zip160x120.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/fatcow/thumbnails/zip60x45.png b/webroot/rsrc/image/icon/fatcow/thumbnails/zip60x45.png deleted file mode 100644 index c66416c318..0000000000 Binary files a/webroot/rsrc/image/icon/fatcow/thumbnails/zip60x45.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/lightbox/close-2.png b/webroot/rsrc/image/icon/lightbox/close-2.png deleted file mode 100644 index de2a3b8608..0000000000 Binary files a/webroot/rsrc/image/icon/lightbox/close-2.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/lightbox/close-hover-2.png b/webroot/rsrc/image/icon/lightbox/close-hover-2.png deleted file mode 100644 index f4ce42479c..0000000000 Binary files a/webroot/rsrc/image/icon/lightbox/close-hover-2.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/lightbox/left-arrow-2.png b/webroot/rsrc/image/icon/lightbox/left-arrow-2.png deleted file mode 100644 index 6499c826b0..0000000000 Binary files a/webroot/rsrc/image/icon/lightbox/left-arrow-2.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/lightbox/left-arrow-hover-2.png b/webroot/rsrc/image/icon/lightbox/left-arrow-hover-2.png deleted file mode 100644 index 73bb7927a6..0000000000 Binary files a/webroot/rsrc/image/icon/lightbox/left-arrow-hover-2.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/lightbox/right-arrow-2.png b/webroot/rsrc/image/icon/lightbox/right-arrow-2.png deleted file mode 100644 index bfe7d21027..0000000000 Binary files a/webroot/rsrc/image/icon/lightbox/right-arrow-2.png and /dev/null differ diff --git a/webroot/rsrc/image/icon/lightbox/right-arrow-hover-2.png b/webroot/rsrc/image/icon/lightbox/right-arrow-hover-2.png deleted file mode 100644 index 1bd868f92d..0000000000 Binary files a/webroot/rsrc/image/icon/lightbox/right-arrow-hover-2.png and /dev/null differ diff --git a/webroot/rsrc/image/lightblue-header.png b/webroot/rsrc/image/lightblue-header.png new file mode 100644 index 0000000000..b2177d7d7e Binary files /dev/null and b/webroot/rsrc/image/lightblue-header.png differ diff --git a/webroot/rsrc/image/loading.gif b/webroot/rsrc/image/loading.gif deleted file mode 100644 index 88b03a1445..0000000000 Binary files a/webroot/rsrc/image/loading.gif and /dev/null differ diff --git a/webroot/rsrc/image/loading/boating_24.gif b/webroot/rsrc/image/loading/boating_24.gif deleted file mode 100644 index eae5784e21..0000000000 Binary files a/webroot/rsrc/image/loading/boating_24.gif and /dev/null differ diff --git a/webroot/rsrc/image/loading/compass_24.gif b/webroot/rsrc/image/loading/compass_24.gif deleted file mode 100644 index c437e8a87d..0000000000 Binary files a/webroot/rsrc/image/loading/compass_24.gif and /dev/null differ diff --git a/webroot/rsrc/image/loading/loading_24.gif b/webroot/rsrc/image/loading/loading_24.gif deleted file mode 100644 index 79d303ac40..0000000000 Binary files a/webroot/rsrc/image/loading/loading_24.gif and /dev/null differ diff --git a/webroot/rsrc/image/loading/loading_48.gif b/webroot/rsrc/image/loading/loading_48.gif deleted file mode 100644 index 9a35be3a61..0000000000 Binary files a/webroot/rsrc/image/loading/loading_48.gif and /dev/null differ diff --git a/webroot/rsrc/image/loading/loading_d48.gif b/webroot/rsrc/image/loading/loading_d48.gif deleted file mode 100644 index 1a34b39165..0000000000 Binary files a/webroot/rsrc/image/loading/loading_d48.gif and /dev/null differ diff --git a/webroot/rsrc/image/loading/loading_w24.gif b/webroot/rsrc/image/loading/loading_w24.gif deleted file mode 100644 index b13cfb8adf..0000000000 Binary files a/webroot/rsrc/image/loading/loading_w24.gif and /dev/null differ diff --git a/webroot/rsrc/image/logo/light-eye.png b/webroot/rsrc/image/logo/light-eye.png new file mode 100644 index 0000000000..772dcb0c01 Binary files /dev/null and b/webroot/rsrc/image/logo/light-eye.png differ diff --git a/webroot/rsrc/image/people/user0.png b/webroot/rsrc/image/people/user0.png new file mode 100644 index 0000000000..43a4ebceca Binary files /dev/null and b/webroot/rsrc/image/people/user0.png differ diff --git a/webroot/rsrc/image/people/user1.png b/webroot/rsrc/image/people/user1.png new file mode 100644 index 0000000000..0f94001ed7 Binary files /dev/null and b/webroot/rsrc/image/people/user1.png differ diff --git a/webroot/rsrc/image/people/user2.png b/webroot/rsrc/image/people/user2.png new file mode 100644 index 0000000000..9629b2d38f Binary files /dev/null and b/webroot/rsrc/image/people/user2.png differ diff --git a/webroot/rsrc/image/people/user3.png b/webroot/rsrc/image/people/user3.png new file mode 100644 index 0000000000..f2f5e2338d Binary files /dev/null and b/webroot/rsrc/image/people/user3.png differ diff --git a/webroot/rsrc/image/people/user4.png b/webroot/rsrc/image/people/user4.png new file mode 100644 index 0000000000..75227cdb8d Binary files /dev/null and b/webroot/rsrc/image/people/user4.png differ diff --git a/webroot/rsrc/image/people/user5.png b/webroot/rsrc/image/people/user5.png new file mode 100644 index 0000000000..3e8aad37dc Binary files /dev/null and b/webroot/rsrc/image/people/user5.png differ diff --git a/webroot/rsrc/image/people/user6.png b/webroot/rsrc/image/people/user6.png new file mode 100644 index 0000000000..20eb2cd9af Binary files /dev/null and b/webroot/rsrc/image/people/user6.png differ diff --git a/webroot/rsrc/image/people/user7.png b/webroot/rsrc/image/people/user7.png new file mode 100644 index 0000000000..a224cdabdf Binary files /dev/null and b/webroot/rsrc/image/people/user7.png differ diff --git a/webroot/rsrc/image/people/user8.png b/webroot/rsrc/image/people/user8.png new file mode 100644 index 0000000000..e0d9fa506d Binary files /dev/null and b/webroot/rsrc/image/people/user8.png differ diff --git a/webroot/rsrc/image/people/user9.png b/webroot/rsrc/image/people/user9.png new file mode 100644 index 0000000000..001f696b94 Binary files /dev/null and b/webroot/rsrc/image/people/user9.png differ diff --git a/webroot/rsrc/image/phrequent_active.png b/webroot/rsrc/image/phrequent_active.png old mode 100755 new mode 100644 diff --git a/webroot/rsrc/image/resize.png b/webroot/rsrc/image/resize.png new file mode 100644 index 0000000000..da44a55cd1 Binary files /dev/null and b/webroot/rsrc/image/resize.png differ diff --git a/webroot/rsrc/image/search.png b/webroot/rsrc/image/search.png deleted file mode 100644 index 6b0cc17ab8..0000000000 Binary files a/webroot/rsrc/image/search.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-actions-X2.png b/webroot/rsrc/image/sprite-actions-X2.png deleted file mode 100644 index 502f126482..0000000000 Binary files a/webroot/rsrc/image/sprite-actions-X2.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-actions.png b/webroot/rsrc/image/sprite-actions.png deleted file mode 100644 index b9bfe46bc5..0000000000 Binary files a/webroot/rsrc/image/sprite-actions.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-apps-X2.png b/webroot/rsrc/image/sprite-apps-X2.png deleted file mode 100644 index 5ed083da32..0000000000 Binary files a/webroot/rsrc/image/sprite-apps-X2.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-apps-large-X2.png b/webroot/rsrc/image/sprite-apps-large-X2.png deleted file mode 100644 index d49585b892..0000000000 Binary files a/webroot/rsrc/image/sprite-apps-large-X2.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-apps-large.png b/webroot/rsrc/image/sprite-apps-large.png deleted file mode 100644 index 9ae2f1a7e1..0000000000 Binary files a/webroot/rsrc/image/sprite-apps-large.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-apps-xlarge.png b/webroot/rsrc/image/sprite-apps-xlarge.png deleted file mode 100644 index 13b7a6ad96..0000000000 Binary files a/webroot/rsrc/image/sprite-apps-xlarge.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-apps.png b/webroot/rsrc/image/sprite-apps.png deleted file mode 100644 index 8dd34bd7f1..0000000000 Binary files a/webroot/rsrc/image/sprite-apps.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-conpherence-X2.png b/webroot/rsrc/image/sprite-conpherence-X2.png deleted file mode 100644 index ef32a410db..0000000000 Binary files a/webroot/rsrc/image/sprite-conpherence-X2.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-conpherence.png b/webroot/rsrc/image/sprite-conpherence.png deleted file mode 100644 index 490f12d2c5..0000000000 Binary files a/webroot/rsrc/image/sprite-conpherence.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-docs-X2.png b/webroot/rsrc/image/sprite-docs-X2.png deleted file mode 100644 index 01e95932eb..0000000000 Binary files a/webroot/rsrc/image/sprite-docs-X2.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-docs.png b/webroot/rsrc/image/sprite-docs.png deleted file mode 100644 index 55870440ff..0000000000 Binary files a/webroot/rsrc/image/sprite-docs.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-gradient.png b/webroot/rsrc/image/sprite-gradient.png deleted file mode 100644 index f3aada92ae..0000000000 Binary files a/webroot/rsrc/image/sprite-gradient.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-icons-X2.png b/webroot/rsrc/image/sprite-icons-X2.png deleted file mode 100644 index 40c3df2ca9..0000000000 Binary files a/webroot/rsrc/image/sprite-icons-X2.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-icons.png b/webroot/rsrc/image/sprite-icons.png deleted file mode 100644 index 318b610cf4..0000000000 Binary files a/webroot/rsrc/image/sprite-icons.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-login-X2.png b/webroot/rsrc/image/sprite-login-X2.png index 45fa23c6ee..2d3c118745 100644 Binary files a/webroot/rsrc/image/sprite-login-X2.png and b/webroot/rsrc/image/sprite-login-X2.png differ diff --git a/webroot/rsrc/image/sprite-login.png b/webroot/rsrc/image/sprite-login.png index ebcdfdb9d6..2f79e7ad8a 100644 Binary files a/webroot/rsrc/image/sprite-login.png and b/webroot/rsrc/image/sprite-login.png differ diff --git a/webroot/rsrc/image/sprite-menu-X2.png b/webroot/rsrc/image/sprite-menu-X2.png deleted file mode 100644 index eb019d3eb3..0000000000 Binary files a/webroot/rsrc/image/sprite-menu-X2.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-menu.png b/webroot/rsrc/image/sprite-menu.png deleted file mode 100644 index bfb22da391..0000000000 Binary files a/webroot/rsrc/image/sprite-menu.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-minicons-X2.png b/webroot/rsrc/image/sprite-minicons-X2.png deleted file mode 100644 index de5274a363..0000000000 Binary files a/webroot/rsrc/image/sprite-minicons-X2.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-minicons.png b/webroot/rsrc/image/sprite-minicons.png deleted file mode 100644 index 3696a0d714..0000000000 Binary files a/webroot/rsrc/image/sprite-minicons.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-payments.png b/webroot/rsrc/image/sprite-payments.png deleted file mode 100644 index bf96741b77..0000000000 Binary files a/webroot/rsrc/image/sprite-payments.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-status-X2.png b/webroot/rsrc/image/sprite-status-X2.png deleted file mode 100644 index 1545ae5a47..0000000000 Binary files a/webroot/rsrc/image/sprite-status-X2.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-status.png b/webroot/rsrc/image/sprite-status.png deleted file mode 100644 index 69b35b676d..0000000000 Binary files a/webroot/rsrc/image/sprite-status.png and /dev/null differ diff --git a/webroot/rsrc/image/sprite-tokens-X2.png b/webroot/rsrc/image/sprite-tokens-X2.png new file mode 100644 index 0000000000..2833fc9373 Binary files /dev/null and b/webroot/rsrc/image/sprite-tokens-X2.png differ diff --git a/webroot/rsrc/image/sprite-tokens.png b/webroot/rsrc/image/sprite-tokens.png index c19c79c1e5..acc7f1106e 100644 Binary files a/webroot/rsrc/image/sprite-tokens.png and b/webroot/rsrc/image/sprite-tokens.png differ diff --git a/webroot/rsrc/js/application/aphlict/Aphlict.js b/webroot/rsrc/js/application/aphlict/Aphlict.js index 272d3abdef..e27ff1b4eb 100644 --- a/webroot/rsrc/js/application/aphlict/Aphlict.js +++ b/webroot/rsrc/js/application/aphlict/Aphlict.js @@ -2,73 +2,260 @@ * @provides javelin-aphlict * @requires javelin-install * javelin-util + * javelin-websocket + * javelin-leader + * javelin-json */ /** - * Simple JS API for the Flash Aphlict client. Example usage: + * Client for the notification server. Example usage: * - * var aphlict = new JX.Aphlict('aphlict_swf', '127.0.0.1', 22280) - * .setHandler(function(type, message) { - * JX.log("Got " + type + " event!") + * var aphlict = new JX.Aphlict('ws://localhost:22280', subscriptions) + * .setHandler(function(message) { + * // ... * }) * .start(); * - * Your handler will receive these events: - * - * - `connect` The client initiated a connection to the server. - * - `connected` The client completed a connection to the server. - * - `close` The client disconnected from the server. - * - `error` There was an error. - * - `receive` Received a message from the server. - * - * You do not have to handle any of them in any specific way. */ JX.install('Aphlict', { - construct : function(id, server, port) { + construct: function(uri, subscriptions) { if (__DEV__) { if (JX.Aphlict._instance) { - JX.$E('Aphlict object is sort of a singleton..!'); + JX.$E('Aphlict object is a singleton.'); } } + this._uri = uri; + this._subscriptions = subscriptions; + this._setStatus('setup'); + this._startTime = new Date().getTime(); + JX.Aphlict._instance = this; + }, - this._server = server; - this._port = port; + events: ['didChangeStatus'], - // Flash puts its "objects" into global scope in an inconsistent way, - // because it was written in like 1816 when globals were awesome and IE4 - // didn't support other scopes since global scope is the best anyway. - var container = document[id] || window[id]; + members: { + _uri: null, + _socket: null, + _subscriptions: null, + _status: null, + _isReconnect: false, + _keepaliveInterval: false, + _startTime: null, - this._flashContainer = container; - }, + start: function() { + JX.Leader.listen('onBecomeLeader', JX.bind(this, this._lead)); + JX.Leader.listen('onReceiveBroadcast', JX.bind(this, this._receive)); + JX.Leader.start(); + + JX.Leader.call(JX.bind(this, this._begin)); + }, + + getSubscriptions: function() { + return this._subscriptions; + }, + + setSubscriptions: function(subscriptions) { + this._subscriptions = subscriptions; + JX.Leader.broadcast( + null, + {type: 'aphlict.subscribe', data: this._subscriptions}); + }, + + clearSubscriptions: function(subscriptions) { + this._subscriptions = null; + JX.Leader.broadcast( + null, + {type: 'aphlict.unsubscribe', data: subscriptions}); + }, + + getStatus: function() { + return this._status; + }, + + getWebsocket: function() { + return this._socket; + }, + + _begin: function() { + JX.Leader.broadcast( + null, + {type: 'aphlict.getstatus'}); + JX.Leader.broadcast( + null, + {type: 'aphlict.subscribe', data: this._subscriptions}); + }, + + _lead: function() { + this._socket = new JX.WebSocket(this._uri); + this._socket.setOpenHandler(JX.bind(this, this._open)); + this._socket.setMessageHandler(JX.bind(this, this._message)); + this._socket.setCloseHandler(JX.bind(this, this._close)); + + this._socket.open(); + }, + + _open: function() { + // If this is a reconnect, ask the server to replay recent messages + // after other tabs have had a chance to subscribe. Do this before we + // broadcast that the connection status is now open. + if (this._isReconnect) { + setTimeout(JX.bind(this, this._didReconnect), 100); + } + + this._broadcastStatus('open'); + JX.Leader.broadcast(null, {type: 'aphlict.getsubscribers'}); + + // By default, ELBs terminate connections after 60 seconds with no + // traffic. Other load balancers may have similar configuration. Send + // a keepalive message every 15 seconds to prevent load balancers from + // deciding they can reap this connection. + + var keepalive = JX.bind(this, this._keepalive); + this._keepaliveInterval = setInterval(keepalive, 15000); + }, + + _didReconnect: function() { + this.replay(); + this.reconnect(); + }, + + replay: function() { + var age = 60000; + + // If the page was loaded a few moments ago, only query for recent + // history. This keeps us from replaying events over and over again as + // a user browses normally. + + // Allow a small margin of error for the actual page load time. It's + // also fine to replay a notification which the user saw for a brief + // moment on the previous page. + var extra_time = 500; + var now = new Date().getTime(); + + age = Math.min(extra_time + (now - this._startTime), age); + + var replay = { + age: age + }; + + JX.Leader.broadcast(null, {type: 'aphlict.replay', data: replay}); + }, + + reconnect: function() { + JX.Leader.broadcast(null, {type: 'aphlict.reconnect', data: null}); + }, - members : { - _server : null, - _port : null, - start : function() { - this._flashContainer.connect(this._server, this._port); + _close: function() { + if (this._keepaliveInterval) { + clearInterval(this._keepaliveInterval); + this._keepaliveInterval = null; + } + + this._broadcastStatus('closed'); + }, + + _broadcastStatus: function(status) { + JX.Leader.broadcast(null, {type: 'aphlict.status', data: status}); + }, + + _message: function(raw) { + var message = JX.JSON.parse(raw); + var id = message.uniqueID || null; + + // If this is just a keepalive response, don't bother broadcasting it. + if (message.type == 'pong') { + return; + } + + JX.Leader.broadcast(id, {type: 'aphlict.server', data: message}); + }, + + _receive: function(message, is_leader) { + switch (message.type) { + case 'aphlict.status': + this._setStatus(message.data); + break; + + case 'aphlict.getstatus': + if (is_leader) { + this._broadcastStatus(this.getStatus()); + } + break; + + case 'aphlict.getsubscribers': + JX.Leader.broadcast( + null, + {type: 'aphlict.subscribe', data: this._subscriptions}); + break; + + case 'aphlict.subscribe': + if (is_leader) { + this._writeCommand('subscribe', message.data); + } + break; + + case 'aphlict.replay': + if (is_leader) { + this._writeCommand('replay', message.data); + } + break; + + default: + var handler = this.getHandler(); + handler && handler(message); + break; + } + }, + + _setStatus: function(status) { + this._status = status; + + // If we've ever seen an open connection, any new connection we make + // is a reconnect and should replay history. + if (status == 'open') { + this._isReconnect = true; + } + + this.invoke('didChangeStatus'); + }, + + _write: function(message) { + this._socket.send(JX.JSON.stringify(message)); + }, + + _writeCommand: function(command, message) { + var frame = { + command: command, + data: message + }; + + return this._write(frame); + }, + + _keepalive: function() { + this._writeCommand('ping', null); } + }, - properties : { - handler : null + properties: { + handler: null }, - statics : { - _instance : null, - didReceiveEvent : function(type, message) { - if (!JX.Aphlict._instance) { - return; - } + statics: { + _instance: null, - var handler = JX.Aphlict._instance.getHandler(); - if (handler) { - handler(type, message); + getInstance: function() { + var self = JX.Aphlict; + if (!self._instance) { + return null; } + return self._instance; } + } }); diff --git a/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js b/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js index 1a36fee06b..21db1d94d5 100644 --- a/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js +++ b/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js @@ -6,15 +6,57 @@ * javelin-vector * javelin-dom * javelin-uri + * javelin-behavior-device + * phabricator-title + * phabricator-favicon */ -JX.behavior('aphlict-dropdown', function(config) { +JX.behavior('aphlict-dropdown', function(config, statics) { + // Track the current globally visible menu. + statics.visible = statics.visible || null; + var dropdown = JX.$(config.dropdownID); - var count = JX.$(config.countID); var bubble = JX.$(config.bubbleID); - var visible = false; + var icon = JX.DOM.scry(bubble, 'span', 'menu-icon')[0]; + var favicon = config.favicon; + var message_favicon = config.message_favicon; + + var count; + if (config.countID) { + count = JX.$(config.countID); + } + var request = null; - var dirty = true; + var dirty = config.local ? false : true; + + function _updateFavicon(new_count) { + if ((config.countType == 'messages') && (new_count)) { + JX.Favicon.setFavicon(message_favicon); + } else if (config.countType == 'messages') { + JX.Favicon.setFavicon(favicon); + } + } + + if (config.countType) { + JX.Title.setCount(config.countType, config.countNumber); + _updateFavicon(config.countNumber); + } + + function _updateCount(number) { + if (config.countType) { + JX.Title.setCount(config.countType, number); + _updateFavicon(number); + } else { + return; + } + + JX.DOM.setContent(count, number); + if (number === 0) { + JX.DOM.alterClass(bubble, config.unreadClass, false); + } else { + JX.DOM.alterClass(bubble, config.unreadClass, true); + } + } function refresh() { if (dirty) { @@ -25,18 +67,14 @@ JX.behavior('aphlict-dropdown', function(config) { true); } - if (request) { //already fetching + if (request) { + // Already fetching. return; } - request = new JX.Request(config.uri, function(response) { - var display = (response.number > 999) ? "\u221E" : response.number; - JX.DOM.setContent(count, display); - if (response.number === 0) { - JX.DOM.alterClass(bubble, 'alert-unread', false); - } else { - JX.DOM.alterClass(bubble, 'alert-unread', true); - } + request = new JX.Request(config.uri, function(response) { + var number = response.number; + _updateCount(number); dirty = false; JX.DOM.alterClass( dropdown, @@ -48,19 +86,78 @@ JX.behavior('aphlict-dropdown', function(config) { request.send(); } + JX.Stratcom.listen( + 'quicksand-redraw', + null, + function (e) { + var data = e.getData(); + if (!data.fromServer) { + return; + } + var new_data = data.newResponse.aphlictDropdownData; + update_counts(new_data); + }); + + JX.Stratcom.listen( + 'conpherence-redraw-aphlict', + null, + function (e) { + update_counts(e.getData()); + }); + + function update_counts(new_data) { + var updated = false; + for (var ii = 0; ii < new_data.length; ii++) { + if (new_data[ii].countType != config.countType) { + continue; + } + if (!new_data[ii].isInstalled) { + continue; + } + updated = true; + _updateCount(parseInt(new_data[ii].count)); + } + if (updated) { + dirty = true; + } + } + + function set_visible(menu, icon) { + if (menu) { + statics.visible = {menu: menu, icon: icon}; + if (icon) { + JX.DOM.alterClass(icon, 'menu-icon-selected', true); + } + } else { + if (statics.visible) { + JX.DOM.hide(statics.visible.menu); + if (statics.visible.icon) { + JX.DOM.alterClass(statics.visible.icon, 'menu-icon-selected', false); + } + } + statics.visible = null; + } + } + JX.Stratcom.listen( 'click', null, function(e) { if (!e.getNode('phabricator-notification-menu')) { // Click outside the dropdown; hide it. - JX.DOM.hide(dropdown); - visible = false; + set_visible(null); return; } if (e.getNode('tag:a')) { - // User clicked a link, just follow the link. + // User clicked a link. Hide the menu, then follow the link. + set_visible(null); + return; + } + + if (!e.getNode('notification')) { + // User clicked somewhere in the dead area of the menu, like the header + // or footer. return; } @@ -70,10 +167,10 @@ JX.behavior('aphlict-dropdown', function(config) { if (href) { JX.$U(href).go(); e.kill(); + set_visible(null); } }); - JX.DOM.listen( bubble, 'click', @@ -83,27 +180,58 @@ JX.behavior('aphlict-dropdown', function(config) { return; } - if (visible) { - JX.DOM.hide(dropdown); - } else { - if (dirty) { - refresh(); + if (config.desktop && JX.Device.getDevice() != 'desktop') { + return; + } + + e.kill(); + + // If a menu is currently open, close it. + if (statics.visible) { + var previously_visible = statics.visible; + set_visible(null); + + // If the menu we just closed was the menu attached to the clicked + // icon, we're all done -- clicking the icon for an open menu just + // closes it. Otherwise, we closed some other menu and still need to + // open the one the user just clicked. + if (previously_visible.menu === dropdown) { + return; } + } - var p = JX.$V(bubble); - p.y = null; - p.x -= 6; - p.setPos(dropdown); + if (dirty) { + refresh(); + } + + var p = JX.$V(bubble); + JX.DOM.show(dropdown); - JX.DOM.show(dropdown); + p.y = null; + if (config.containerDivID) { + var pc = JX.$V(JX.$(config.containerDivID)); + p.x -= (JX.Vector.getDim(dropdown).x - JX.Vector.getDim(bubble).x + + pc.x); + } else if (config.right) { + p.x -= (JX.Vector.getDim(dropdown).x - JX.Vector.getDim(bubble).x); + } else { + p.x -= 6; } - visible = !visible; - e.kill(); + p.setPos(dropdown); + + set_visible(dropdown, icon); } ); JX.Stratcom.listen('notification-panel-update', null, function() { + if (config.local) { + return; + } dirty = true; refresh(); }); + + JX.Stratcom.listen('notification-panel-close', null, function() { + set_visible(null); + }); }); diff --git a/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js b/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js index 19198f8be0..ac058bde40 100644 --- a/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js +++ b/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js @@ -7,82 +7,165 @@ * javelin-uri * javelin-dom * javelin-json + * javelin-router + * javelin-util + * javelin-leader + * javelin-sound * phabricator-notification */ JX.behavior('aphlict-listen', function(config) { + var page_objects = config.pageObjects; + var reload_notification = null; - var showing_reload = false; + JX.Stratcom.listen('aphlict-server-message', null, function(e) { + var message = e.getData(); - function onready() { - var client = new JX.Aphlict(config.id, config.server, config.port) - .setHandler(onaphlictmessage) - .start(); - } + if (message.type != 'notification') { + return; + } + + JX.Leader.callIfLeader(function() { + var request = new JX.Request( + '/notification/individual/', + onNotification); + + var routable = request + .addData({key: message.key}) + .getRoutable(); + + routable + .setType('notification') + .setPriority(250); + + JX.Router.getInstance().queue(routable); + }); + }); // Respond to a notification from the Aphlict notification server. We send // a request to Phabricator to get notification details. - function onaphlictmessage(type, message) { - if (type == 'receive') { - var request = new JX.Request('/notification/individual/', onnotification) - .addData({key: message.key}) - .send(); - } else if (__DEV__) { - if (config.debug) { - var details = message ? JX.JSON.stringify(message) : ''; - - new JX.Notification() - .setContent('(Aphlict) [' + type + '] ' + details) - .alterClassName('jx-notification-debug', true) - .setDuration(0) - .show(); - } + function onAphlictMessage(message) { + switch (message.type) { + case 'aphlict.server': + JX.Stratcom.invoke('aphlict-server-message', null, message.data); + break; + + case 'notification.individual': + JX.Stratcom.invoke('aphlict-notification-message', null, message.data); + break; + + case 'aphlict.reconnect': + JX.Stratcom.invoke('aphlict-reconnect', null, message.data); + break; } } - // Respond to a response from Phabricator about a specific notification. - function onnotification(response) { + function onNotification(response) { if (!response.pertinent) { return; } + JX.Leader.broadcast( + response.uniqueID, + { + type: 'notification.individual', + data: response + }); + } + + JX.Stratcom.listen('aphlict-notification-message', null, function(e) { JX.Stratcom.invoke('notification-panel-update', null, {}); + var response = e.getData(); + + if (!response.showAnyNotification && !response.showDesktopNotification) { + return; + } // Show the notification itself. new JX.Notification() .setContent(JX.$H(response.content)) + .setKey(response.primaryObjectPHID) + .setShowAsWebNotification(response.showAnyNotification) + .setShowAsDesktopNotification(response.showDesktopNotification) + .setTitle(response.title) + .setBody(response.body) + .setHref(response.href) + .setIcon(response.icon) .show(); - // If the notification affected an object on this page, show a // permanent reload notification if we aren't already. - if ((response.primaryObjectPHID in config.pageObjects) && - !showing_reload) { + if ((response.primaryObjectPHID in page_objects) && + reload_notification === null) { + var reload = new JX.Notification() .setContent('Page updated, click to reload.') .alterClassName('jx-notification-alert', true) .setDuration(0); - reload.listen('activate', function(e) { JX.$U().go(); }); + reload.listen( + 'activate', + function() { + // double check we are still on the page where re-loading makes + // sense...! + if (response.primaryObjectPHID in page_objects) { + JX.$U().go(); + } + }); reload.show(); - showing_reload = true; + reload_notification = { + dialog: reload, + phid: response.primaryObjectPHID + }; } - } + }); + + var client = new JX.Aphlict( + config.websocketURI, + config.subscriptions); + + var start_client = function() { + client + .setHandler(onAphlictMessage) + .start(); + }; + + // Don't start the client until other behaviors have had a chance to + // initialize. In particular, we want to capture events into the log for + // the DarkConsole "Realtime" panel. + setTimeout(start_client, 0); + + JX.Stratcom.listen( + 'quicksand-redraw', + null, + function (e) { + var old_data = e.getData().oldResponse; + var new_data = e.getData().newResponse; + client.clearSubscriptions(old_data.subscriptions); + client.setSubscriptions(new_data.subscriptions); + + page_objects = new_data.pageObjects; + if (reload_notification) { + if (reload_notification.phid in page_objects) { + return; + } + reload_notification.dialog.hide(); + reload_notification = null; + } + }); + + JX.Leader.listen('onReceiveBroadcast', function(message, is_leader) { + if (message.type !== 'sound') { + return; + } + + if (!is_leader) { + return; + } + + JX.Sound.play(message.data); + }); - // Wait for the element to load, and don't do anything if it never loads. - // If we just go crazy and start making calls to it before it loads, its - // interfaces won't be registered yet. - JX.Stratcom.listen('aphlict-component-ready', null, onready); - - // Add Flash object to page - JX.$(config.containerID).innerHTML = - '' + - '' + - '' + - '' + - '' + - ''; //Evan sanctioned }); diff --git a/webroot/rsrc/js/application/aphlict/behavior-aphlict-status.js b/webroot/rsrc/js/application/aphlict/behavior-aphlict-status.js new file mode 100644 index 0000000000..cb35df235f --- /dev/null +++ b/webroot/rsrc/js/application/aphlict/behavior-aphlict-status.js @@ -0,0 +1,47 @@ +/** + * @provides javelin-behavior-aphlict-status + * @requires javelin-behavior + * javelin-aphlict + * phabricator-phtize + * javelin-dom + * @javelin + */ + +JX.behavior('aphlict-status', function(config) { + var pht = JX.phtize(config.pht); + + function update() { + var client = JX.Aphlict.getInstance(); + if (!client) { + return; + } + + var node; + try { + node = JX.$(config.nodeID); + } catch (ignored) { + return; + } + + var status = client.getStatus(); + var icon = config.icon[status]; + var status_node = JX.$N( + 'span', + { + className: 'connection-status-text aphlict-connection-status-' + status + }, + pht(status)); + + var icon_node = new JX.PHUIXIconView() + .setIcon(icon['icon']) + .setColor(icon['color']) + .getNode(); + + var content = [icon_node, ' ', status_node]; + + JX.DOM.setContent(node, content); + } + + JX.Aphlict.listen('didChangeStatus', update); + update(); +}); diff --git a/webroot/rsrc/js/application/aphlict/behavior-desktop-notifications-control.js b/webroot/rsrc/js/application/aphlict/behavior-desktop-notifications-control.js new file mode 100644 index 0000000000..9be9c510b0 --- /dev/null +++ b/webroot/rsrc/js/application/aphlict/behavior-desktop-notifications-control.js @@ -0,0 +1,124 @@ +/** + * @provides javelin-behavior-desktop-notifications-control + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + * javelin-uri + * phabricator-notification + */ + +JX.behavior('desktop-notifications-control', function(config, statics) { + + function findEl(id) { + var el = null; + try { + el = JX.$(id); + } catch (e) { + // not found + } + return el; + } + function updateFormStatus(permission) { + var status_node = findEl(config.statusID); + if (!status_node) { + return; + } + + var message_node = JX.$(config.messageID); + + switch (permission) { + case 'default': + JX.DOM.setContent(message_node, config.cancelAsk); + break; + case 'granted': + JX.DOM.setContent(message_node, config.grantedAsk); + break; + case 'denied': + JX.DOM.setContent(message_node, config.deniedAsk); + break; + } + + JX.DOM.show(status_node); + } + + function updateBrowserStatus(permission) { + var browserStatusEl = findEl(config.browserStatusID); + if (!browserStatusEl) { + return; + } + switch (permission) { + case 'default': + JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', true); + JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', false); + JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', false); + JX.DOM.setContent(browserStatusEl, JX.$H(config.defaultStatus)); + break; + case 'granted': + JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', true); + JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', false); + JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', false); + JX.DOM.setContent(browserStatusEl, JX.$H(config.grantedStatus)); + break; + case 'denied': + JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-error', true); + JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-notice', false); + JX.DOM.alterClass(browserStatusEl, 'phui-info-severity-success', false); + JX.DOM.setContent(browserStatusEl, JX.$H(config.deniedStatus)); + break; + } + JX.DOM.show(browserStatusEl); + } + + function installSelectListener() { + var controlEl = findEl(config.controlID); + if (!controlEl) { + return; + } + var select = JX.DOM.find(controlEl, 'select'); + JX.DOM.listen( + select, + 'change', + null, + function (e) { + if (!JX.Notification.supportsDesktopNotifications()) { + return; + } + var value = e.getTarget().value; + if ((value == config.desktop) || (value == config.desktopOnly)) { + window.Notification.requestPermission( + function (permission) { + updateFormStatus(permission); + updateBrowserStatus(permission); + }); + } else { + var statusEl = JX.$(config.statusID); + JX.DOM.hide(statusEl); + } + }); + } + + function install() { + JX.Stratcom.listen( + 'click', + 'desktop-notifications-permission-button', + function () { + window.Notification.requestPermission( + function (permission) { + updateFormStatus(permission); + updateBrowserStatus(permission); + }); + }); + + return true; + } + + statics.installed = statics.installed || install(); + if (!JX.Notification.supportsDesktopNotifications()) { + var statusEl = JX.$(config.statusID); + JX.DOM.setContent(statusEl.firstChild, config.noSupport); + JX.DOM.show(statusEl); + } else { + updateBrowserStatus(window.Notification.permission); + } + installSelectListener(); +}); diff --git a/webroot/rsrc/js/application/calendar/behavior-day-view.js b/webroot/rsrc/js/application/calendar/behavior-day-view.js new file mode 100644 index 0000000000..7f821ffe83 --- /dev/null +++ b/webroot/rsrc/js/application/calendar/behavior-day-view.js @@ -0,0 +1,364 @@ +/** + * @provides javelin-behavior-day-view + * @requires phuix-icon-view + */ +JX.behavior('day-view', function(config) { + + function findTodayClusters() { + var events = today_events.sort(function(x, y){ + return (x.eventStartEpoch - y.eventStartEpoch); + }); + + var clusters = []; + + for (var i=0; i < events.length; i++) { + var today_event = events[i]; + + var destination_cluster_index = null; + var event_start = today_event.eventStartEpoch - (60); + var event_end = today_event.eventEndEpoch + (60); + + for (var j=0; j < clusters.length; j++) { + var cluster = clusters[j]; + + for(var k=0; k < cluster.length; k++) { + var clustered_event = cluster[k]; + var compare_event_start = clustered_event.eventStartEpoch; + var compare_event_end = clustered_event.eventEndEpoch; + + if (event_start < compare_event_end && + event_end > compare_event_start) { + destination_cluster_index = j; + break; + } + } + + if (destination_cluster_index !== null) { + break; + } + } + + if (destination_cluster_index !== null) { + clusters[destination_cluster_index].push(today_event); + destination_cluster_index = null; + } else { + var next_cluster = []; + next_cluster.push(today_event); + clusters.push(next_cluster); + } + } + + return clusters; + } + + function updateEventsFromCluster(cluster) { + var cluster_size = cluster.length; + var n = 0; + for(var i=0; i < cluster.length; i++) { + var cluster_member = cluster[i]; + + var event_id = cluster_member.eventID; + var offset = ((n / cluster_size) * 100) + '%'; + var width = ((1 / cluster_size) * 100) + '%'; + + for (var j=0; j < today_events.length; j++) { + if (today_events[j].eventID == event_id) { + + today_events[j]['offset'] = offset; + today_events[j]['width'] = width; + } + } + n++; + } + + return today_events; + } + + function drawEvent(e) { + var name = e['eventName']; + var eventID = e['eventID']; + var viewerIsInvited = e['viewerIsInvited']; + var offset = e['offset']; + var width = e['width']; + var top = e['top']; + var height = e['height']; + var uri = e['uri']; + + var sigil = 'phui-calendar-day-event'; + var link_class = 'phui-calendar-day-event-link'; + + if (viewerIsInvited) { + link_class = link_class + ' viewer-invited-day-event'; + } + + var icon = new JX.PHUIXIconView() + .setIcon(e.displayIcon) + .setColor(e.displayIconColor) + .getNode(); + + var content = [icon, ' ', name]; + + var name_link = JX.$N( + 'a', + { + className : link_class, + href: uri + }, + content); + + var class_name = 'phui-calendar-day-event'; + if (e.canEdit) { + class_name = class_name + ' can-drag'; + } + + var div = JX.$N( + 'div', + { + className: class_name, + sigil: sigil, + meta: {eventID: eventID, record: e, uri: uri}, + style: { + left: offset, + width: width, + top: top, + height: height + } + }, + name_link); + + return div; + } + + function drawAllDayEvent(e) { + var class_name = 'day-view-all-day'; + + var icon = new JX.PHUIXIconView() + .setIcon(e.displayIcon) + .setColor(e.displayIconColor) + .getNode(); + var content = [icon, ' ', e.name]; + + var name = JX.$N( + 'a', + { + className: class_name, + href: e.uri + }, + content); + + var all_day_label = JX.$N( + 'span', + {className: 'phui-calendar-all-day-label'}, + 'All Day'); + + var div_all_day = JX.$N( + 'div', + {className: 'phui-calendar-day-event all-day'}, + [all_day_label, name]); + + return div_all_day; + } + + function drawRows() { + var rows = []; + var early_hours = [8]; + if (first_event_hour) { + early_hours.push(first_event_hour); + } + var min_early_hour = Math.min(early_hours[0], early_hours[1]); + + + for(var i=0; i < hours.length; i++) { + if (hours[i]['hour'] < min_early_hour) { + continue; + } + var cell_time = JX.$N( + 'td', + {className: 'phui-calendar-day-hour'}, + hours[i].displayTime); + + var cell_event = JX.$N( + 'td', + { + meta: { + time: hours[i].displayTime + }, + className: 'phui-calendar-day-events', + sigil: 'phui-calendar-day-event-cell' + }); + + var row = JX.$N( + 'tr', + {}, + [cell_time, cell_event]); + rows.push(row); + } + return rows; + } + + function clusterAndDrawEvents() { + var today_clusters = findTodayClusters(); + for(var i=0; i < today_clusters.length; i++) { + today_events = updateEventsFromCluster(today_clusters[i]); + } + var drawn_hourly_events = []; + for (i=0; i < today_events.length; i++) { + drawn_hourly_events.push(drawEvent(today_events[i])); + } + + JX.DOM.setContent(hourly_events_wrapper, drawn_hourly_events); + + } + + var year = config.year; + var month = config.month; + var day = config.day; + var query = config.query; + + var hours = config.hours; + var first_event_hour = config.firstEventHour; + var first_event_hour_epoch = parseInt(config.firstEventHourEpoch, 10); + var today_events = config.todayEvents; + var today_all_day_events = config.allDayEvents; + var table_wrapper = JX.$(config.tableID); + var rows = drawRows(); + + var all_day_events = []; + for(i=0; i < today_all_day_events.length; i++) { + var all_day_event = today_all_day_events[i]; + all_day_events.push(drawAllDayEvent(all_day_event)); + } + + var table = JX.$N( + 'table', + {className: 'phui-calendar-day-view'}, + rows); + + var dragging = false; + var origin = null; + + var offset_top = null; + var new_top = null; + + var click_time = null; + + JX.DOM.listen( + table_wrapper, + 'mousedown', + 'phui-calendar-day-event', + function(e){ + + if (!e.isNormalMouseEvent()) { + return; + } + var data = e.getNodeData('phui-calendar-day-event'); + if (!data.record.canEdit) { + return; + } + e.kill(); + dragging = e.getNode('phui-calendar-day-event'); + JX.DOM.alterClass(dragging, 'phui-drag', true); + + click_time = new Date(); + + origin = JX.$V(e); + + var outer = JX.Vector.getPos(table); + var inner = JX.Vector.getPos(dragging); + + offset_top = inner.y - outer.y; + new_top = offset_top; + + dragging.style.top = offset_top + 'px'; + }); + JX.Stratcom.listen('mousemove', null, function(e){ + if (!dragging) { + return; + } + var cursor = JX.$V(e); + + new_top = cursor.y - origin.y + offset_top; + new_top = Math.min(new_top, 1320); + new_top = Math.max(new_top, 0); + new_top = Math.floor(new_top/15) * 15; + + dragging.style.top = new_top + 'px'; + }); + JX.Stratcom.listen('mouseup', null, function(){ + if (!dragging) { + return; + } + + var data = JX.Stratcom.getData(dragging); + var record = data.record; + + if (new_top == offset_top) { + var now = new Date(); + if (now.getTime() - click_time.getTime() < 250) { + JX.$U(record.uri).go(); + } + + JX.DOM.alterClass(dragging, 'phui-drag', false); + dragging = false; + return; + } + var new_time = first_event_hour_epoch + (new_top * 60); + var id = data.eventID; + var duration = record.eventEndEpoch - record.eventStartEpoch; + record.eventStartEpoch = new_time; + record.eventEndEpoch = new_time + duration; + record.top = new_top + 'px'; + + new JX.Workflow( + '/calendar/event/drag/' + id + '/', + {start: new_time}) + .start(); + + JX.DOM.alterClass(dragging, 'phui-drag', false); + dragging = false; + + clusterAndDrawEvents(); + }); + + JX.DOM.listen(table_wrapper, 'click', 'phui-calendar-day-event', function(e){ + if (e.isNormalClick()) { + e.kill(); + } + }); + + JX.DOM.listen(table, 'click', 'phui-calendar-day-event-cell', function(e){ + if (!e.isNormalClick()) { + return; + } + var data = e.getNodeData('phui-calendar-day-event-cell'); + var time = data.time; + + new JX.Workflow( + '/calendar/event/edit/', + { + start_d: year + '-' + month + '-' + day, + start_t: time, + end_d: year + '-' + month + '-' + day, + end_t: time + ' +1 hour' + }) + .start(); + }); + + var hourly_events_wrapper = JX.$N( + 'div', + {style: { + position: 'absolute', + left: '69px', + right: 0 + }}); + + clusterAndDrawEvents(); + + var daily_wrapper = JX.$N( + 'div', + {style: {position: 'relative'}}, + [hourly_events_wrapper, table]); + + JX.DOM.setContent(table_wrapper, [all_day_events, daily_wrapper]); + +}); diff --git a/webroot/rsrc/js/application/calendar/behavior-event-all-day.js b/webroot/rsrc/js/application/calendar/behavior-event-all-day.js new file mode 100644 index 0000000000..d9555060ba --- /dev/null +++ b/webroot/rsrc/js/application/calendar/behavior-event-all-day.js @@ -0,0 +1,17 @@ +/** + * @provides javelin-behavior-event-all-day + */ + +JX.behavior('event-all-day', function(config) { + var all_day = JX.$(config.allDayID); + + JX.DOM.listen(all_day, 'change', null, function() { + var is_all_day = !!all_day.checked; + + for (var ii = 0; ii < config.controlIDs.length; ii++) { + var control = JX.$(config.controlIDs[ii]); + JX.DOM.alterClass(control, 'no-time', is_all_day); + } + }); + +}); diff --git a/webroot/rsrc/js/application/calendar/behavior-month-view.js b/webroot/rsrc/js/application/calendar/behavior-month-view.js new file mode 100644 index 0000000000..914b3b929f --- /dev/null +++ b/webroot/rsrc/js/application/calendar/behavior-month-view.js @@ -0,0 +1,89 @@ +/** + * @provides javelin-behavior-calendar-month-view + */ +JX.behavior('calendar-month-view', function() { + + var hover_nodes = []; + + function get_info(e) { + var week_body = e.getNode('calendar-week-body'); + if (!week_body) { + week_body = e.getNode('calendar-week-foot').previousSibling; + } + + var week_foot = week_body.nextSibling; + var day_id = JX.Stratcom.getData(e.getNode('tag:td')).dayID; + + var day_body; + var day_foot; + var body_nodes = JX.DOM.scry(week_body, 'td'); + var foot_nodes = JX.DOM.scry(week_foot, 'td'); + for (var ii = 0; ii < body_nodes.length; ii++) { + if (JX.Stratcom.getData(body_nodes[ii]).dayID == day_id) { + day_body = body_nodes[ii]; + day_foot = foot_nodes[ii]; + break; + } + } + + return { + data: JX.Stratcom.getData(week_body), + dayID: day_id, + nodes: { + week: { + body: week_body, + foot: week_foot + }, + day: { + body: day_body, + foot: day_foot + } + } + }; + } + + function alter_hover(enable) { + for (var ii = 0; ii < hover_nodes.length; ii++) { + JX.DOM.alterClass(hover_nodes[ii], 'calendar-hover', enable); + } + } + + JX.enableDispatch(document.body, 'mouseover'); + JX.enableDispatch(document.body, 'mouseout'); + + JX.Stratcom.listen('mouseover', ['calendar-week', 'tag:td'], function(e) { + if (e.getNode('calendar-event-list')) { + alter_hover(false); + hover_nodes = []; + return; + } + + var info = get_info(e); + hover_nodes = [ + info.nodes.day.body, + info.nodes.day.foot + ]; + + alter_hover(true); + }); + + JX.Stratcom.listen('mouseout', ['calendar-week', 'tag:td'], function() { + alter_hover(false); + }); + + JX.Stratcom.listen('click', ['calendar-week', 'tag:td'], function(e) { + if (!e.isNormalClick()) { + return; + } + + // If this is a click in the event list or on a link, ignore it. This + // allows users to follow links to events and select text. + if (e.getNode('calendar-event-list') || e.getNode('tag:a')) { + return; + } + + var info = get_info(e); + JX.$U(info.data.actionMap[info.dayID].dayURI).go(); + }); + +}); diff --git a/webroot/rsrc/js/application/config/behavior-reorder-fields.js b/webroot/rsrc/js/application/config/behavior-reorder-fields.js index deb9da61b7..1c041e85f8 100644 --- a/webroot/rsrc/js/application/config/behavior-reorder-fields.js +++ b/webroot/rsrc/js/application/config/behavior-reorder-fields.js @@ -17,7 +17,7 @@ JX.behavior('config-reorder-fields', function(config) { return JX.DOM.scry(root, 'li', 'field-spec'); }); - list.listen('didDrop', function(node, after) { + list.listen('didDrop', function() { write_state_to_form(); }); @@ -54,5 +54,5 @@ JX.behavior('config-reorder-fields', function(config) { JX.$(config.inputID).value = JX.JSON.stringify(order); }; + write_state_to_form(); }); - diff --git a/webroot/rsrc/js/application/conpherence/ConpherenceThreadManager.js b/webroot/rsrc/js/application/conpherence/ConpherenceThreadManager.js new file mode 100644 index 0000000000..81e10bf35b --- /dev/null +++ b/webroot/rsrc/js/application/conpherence/ConpherenceThreadManager.js @@ -0,0 +1,535 @@ +/** + * @provides conpherence-thread-manager + * @requires javelin-dom + * javelin-util + * javelin-stratcom + * javelin-install + * javelin-aphlict + * javelin-workflow + * javelin-router + * javelin-behavior-device + * javelin-vector + */ +JX.install('ConpherenceThreadManager', { + + construct : function() { + if (__DEV__) { + if (JX.ConpherenceThreadManager._instance) { + JX.$E('ConpherenceThreadManager object is a singleton.'); + } + } + JX.ConpherenceThreadManager._instance = this; + return this; + }, + + members: { + _loadThreadURI: null, + _loadedThreadID: null, + _loadedThreadPHID: null, + _latestTransactionID: null, + _transactionIDMap: null, + _transactionCache: null, + _canEditLoadedThread: null, + _updating: null, + _messagesRootCallback: JX.bag, + _willLoadThreadCallback: JX.bag, + _didLoadThreadCallback: JX.bag, + _didUpdateThreadCallback: JX.bag, + _willSendMessageCallback: JX.bag, + _didSendMessageCallback: JX.bag, + _willUpdateWorkflowCallback: JX.bag, + _didUpdateWorkflowCallback: JX.bag, + + setLoadThreadURI: function(uri) { + this._loadThreadURI = uri; + return this; + }, + + getLoadThreadURI: function() { + return this._loadThreadURI; + }, + + isThreadLoaded: function() { + return Boolean(this._loadedThreadID); + }, + + isThreadIDLoaded: function(thread_id) { + return this._loadedThreadID == thread_id; + }, + + getLoadedThreadID: function() { + return this._loadedThreadID; + }, + + setLoadedThreadID: function(id) { + this._loadedThreadID = id; + return this; + }, + + getLoadedThreadPHID: function() { + return this._loadedThreadPHID; + }, + + setLoadedThreadPHID: function(phid) { + this._loadedThreadPHID = phid; + return this; + }, + + getLatestTransactionID: function() { + return this._latestTransactionID; + }, + + setLatestTransactionID: function(id) { + this._latestTransactionID = id; + return this; + }, + + _updateTransactionIDMap: function(transactions) { + var loaded_id = this.getLoadedThreadID(); + if (!this._transactionIDMap[loaded_id]) { + this._transactionIDMap[this._loadedThreadID] = {}; + } + var loaded_transaction_ids = this._transactionIDMap[loaded_id]; + var transaction; + for (var ii = 0; ii < transactions.length; ii++) { + transaction = transactions[ii]; + loaded_transaction_ids[JX.Stratcom.getData(transaction).id] = 1; + } + this._transactionIDMap[this._loadedThreadID] = loaded_transaction_ids; + return this; + }, + + _updateTransactionCache: function(transactions) { + var transaction; + for (var ii = 0; ii < transactions.length; ii++) { + transaction = transactions[ii]; + this._transactionCache[JX.Stratcom.getData(transaction).id] = + transaction; + } + return this; + }, + + _getLoadedTransactions: function() { + var loaded_id = this.getLoadedThreadID(); + var loaded_tx_ids = JX.keys(this._transactionIDMap[loaded_id]); + loaded_tx_ids.sort(function (a, b) { + var x = parseFloat(a); + var y = parseFloat(b); + if (x > y) { + return 1; + } + if (x < y) { + return -1; + } + return 0; + }); + var transactions = []; + for (var ii = 0; ii < loaded_tx_ids.length; ii++) { + transactions.push(this._transactionCache[loaded_tx_ids[ii]]); + } + return transactions; + }, + + _deleteTransactionCaches: function(id) { + delete this._transactionCache[id]; + delete this._transactionIDMap[this._loadedThreadID][id]; + + return this; + }, + + setCanEditLoadedThread: function(bool) { + this._canEditLoadedThread = bool; + return this; + }, + + getCanEditLoadedThread: function() { + if (this._canEditLoadedThread === null) { + return false; + } + return this._canEditLoadedThread; + }, + + setMessagesRootCallback: function(callback) { + this._messagesRootCallback = callback; + return this; + }, + + setWillLoadThreadCallback: function(callback) { + this._willLoadThreadCallback = callback; + return this; + }, + + setDidLoadThreadCallback: function(callback) { + this._didLoadThreadCallback = callback; + return this; + }, + + setDidUpdateThreadCallback: function(callback) { + this._didUpdateThreadCallback = callback; + return this; + }, + + setWillSendMessageCallback: function(callback) { + this._willSendMessageCallback = callback; + return this; + }, + + setDidSendMessageCallback: function(callback) { + this._didSendMessageCallback = callback; + return this; + }, + + setWillUpdateWorkflowCallback: function(callback) { + this._willUpdateWorkflowCallback = callback; + return this; + }, + + setDidUpdateWorkflowCallback: function(callback) { + this._didUpdateWorkflowCallback = callback; + return this; + }, + + _getParams: function(base_params) { + if (this._latestTransactionID) { + base_params.latest_transaction_id = this._latestTransactionID; + } + return base_params; + }, + + start: function() { + + this._transactionIDMap = {}; + this._transactionCache = {}; + + JX.Stratcom.listen( + 'aphlict-server-message', + null, + JX.bind(this, function(e) { + var message = e.getData(); + + if (message.type != 'message') { + // Not a message event. + return; + } + + if (message.threadPHID != this._loadedThreadPHID) { + // Message event for some thread other than the visible one. + return; + } + + if (message.messageID <= this._latestTransactionID) { + // Message event for something we already know about. + return; + } + + // If this notification tells us about a message which is newer than + // the newest one we know to exist, update our latest knownID so we + // can properly update later. + if (this._updating && + this._updating.threadPHID == this._loadedThreadPHID) { + if (message.messageID > this._updating.knownID) { + this._updating.knownID = message.messageID; + // We're currently updating, so wait for the update to complete. + // this.syncWorkflow has us covered in this case. + if (this._updating.active) { + return; + } + } + } + + this._updateThread(); + })); + + // If we see a reconnect, always update the thread state. + JX.Stratcom.listen( + 'aphlict-reconnect', + null, + JX.bind(this, function() { + if (!this._loadedThreadPHID) { + return; + } + + this._updateThread(); + })); + + JX.Stratcom.listen( + 'click', + 'show-older-messages', + JX.bind(this, function(e) { + e.kill(); + var data = e.getNodeData('show-older-messages'); + + var node = e.getNode('show-older-messages'); + JX.DOM.setContent(node, 'Loading...'); + JX.DOM.alterClass( + node, + 'conpherence-show-more-messages-loading', + true); + + new JX.Workflow(this._getMoreMessagesURI(), data) + .setHandler(JX.bind(this, function(r) { + this._deleteTransactionCaches(JX.Stratcom.getData(node).id); + JX.DOM.remove(node); + this._updateTransactions(r); + })).start(); + })); + JX.Stratcom.listen( + 'click', + 'show-newer-messages', + JX.bind(this, function(e) { + e.kill(); + var data = e.getNodeData('show-newer-messages'); + var node = e.getNode('show-newer-messages'); + JX.DOM.setContent(node, 'Loading...'); + JX.DOM.alterClass( + node, + 'conpherence-show-more-messages-loading', + true); + + new JX.Workflow(this._getMoreMessagesURI(), data) + .setHandler(JX.bind(this, function(r) { + this._deleteTransactionCaches(JX.Stratcom.getData(node).id); + JX.DOM.remove(node); + this._updateTransactions(r); + })).start(); + })); + }, + + _shouldUpdateDOM: function(r) { + if (this._updating && + this._updating.threadPHID == this._loadedThreadPHID) { + + if (r.non_update) { + return false; + } + + // we have a different, more current update in progress so + // return early + if (r.latest_transaction_id < this._updating.knownID) { + return false; + } + } + return true; + }, + + _updateDOM: function(r) { + this._updateTransactions(r); + + this._updating.knownID = r.latest_transaction_id; + this._latestTransactionID = r.latest_transaction_id; + + JX.Leader.broadcast( + 'conpherence.message.' + r.latest_transaction_id, + { + type: 'sound', + data: r.sound.receive + }); + + JX.Stratcom.invoke( + 'conpherence-redraw-aphlict', + null, + r.aphlictDropdownData); + }, + + _updateTransactions: function(r) { + var new_transactions = JX.$H(r.transactions).getFragment().childNodes; + this._updateTransactionIDMap(new_transactions); + this._updateTransactionCache(new_transactions); + + var transactions = this._getLoadedTransactions(); + + JX.DOM.setContent(this._messagesRootCallback(), transactions); + }, + + cacheCurrentTransactions: function() { + var root = this._messagesRootCallback(); + var transactions = JX.DOM.scry( + root , + 'div', + 'conpherence-transaction-view'); + this._updateTransactionIDMap(transactions); + this._updateTransactionCache(transactions); + }, + + _updateThread: function() { + var params = this._getParams({ + action: 'load', + }); + + var workflow = new JX.Workflow(this._getUpdateURI()) + .setData(params) + .setHandler(JX.bind(this, function(r) { + if (this._shouldUpdateDOM(r)) { + this._updateDOM(r); + this._didUpdateThreadCallback(r); + } + })); + + this.syncWorkflow(workflow, 'finally'); + }, + + syncWorkflow: function(workflow, stage) { + this._updating = { + threadPHID: this._loadedThreadPHID, + knownID: this._latestTransactionID, + active: true + }; + workflow.listen(stage, JX.bind(this, function() { + // TODO - do we need to handle if we switch threads somehow? + var need_sync = this._updating && + (this._updating.knownID > this._latestTransactionID); + if (need_sync) { + return this._updateThread(); + } + this._updating.active = false; + })); + workflow.start(); + }, + + runUpdateWorkflowFromLink: function(link, params) { + params = this._getParams(params); + this._willUpdateWorkflowCallback(); + var workflow = new JX.Workflow.newFromLink(link) + .setData(params) + .setHandler(JX.bind(this, function(r) { + if (this._shouldUpdateDOM(r)) { + this._updateDOM(r); + this._didUpdateWorkflowCallback(r); + } + })); + this.syncWorkflow(workflow, params.stage); + }, + + loadThreadByID: function(thread_id, force_reload) { + if (this.isThreadLoaded() && + this.isThreadIDLoaded(thread_id) && + !force_reload) { + return; + } + + this._willLoadThreadCallback(); + + var params = {}; + // We pick a thread from the server if not specified + if (thread_id) { + params.id = thread_id; + } + params = this._getParams(params); + + var handler = JX.bind(this, function(r) { + var client = JX.Aphlict.getInstance(); + if (client) { + var old_subs = client.getSubscriptions(); + var new_subs = []; + for (var ii = 0; ii < old_subs.length; ii++) { + if (old_subs[ii] == this._loadedThreadPHID) { + continue; + } else { + new_subs.push(old_subs[ii]); + } + } + new_subs.push(r.threadPHID); + client.clearSubscriptions(client.getSubscriptions()); + client.setSubscriptions(new_subs); + } + this._loadedThreadID = r.threadID; + this._loadedThreadPHID = r.threadPHID; + this._latestTransactionID = r.latestTransactionID; + this._canEditLoadedThread = r.canEdit; + + JX.Stratcom.invoke( + 'conpherence-redraw-aphlict', + null, + r.aphlictDropdownData); + + this._didLoadThreadCallback(r); + this.cacheCurrentTransactions(); + + if (force_reload) { + JX.Stratcom.invoke('hashchange'); + } + }); + + // should this be sync'd too? + new JX.Workflow(this.getLoadThreadURI()) + .setData(params) + .setHandler(handler) + .start(); + }, + + sendMessage: function(form, params) { + var inputs = JX.DOM.scry(form, 'input'); + var block_empty = true; + for (var i = 0; i < inputs.length; i++) { + if (inputs[i].type != 'hidden') { + continue; + } + if (inputs[i].name == 'action' && inputs[i].value == 'join_room') { + block_empty = false; + continue; + } + } + // don't bother sending up text if there is nothing to submit + var textarea = JX.DOM.find(form, 'textarea'); + if (block_empty && !textarea.value.length) { + return; + } + params = this._getParams(params); + + var keep_enabled = true; + + var workflow = JX.Workflow.newFromForm(form, params, keep_enabled) + .setHandler(JX.bind(this, function(r) { + if (this._shouldUpdateDOM(r)) { + this._updateDOM(r); + this._didSendMessageCallback(r); + } else if (r.non_update) { + this._didSendMessageCallback(r, true); + } + })); + this.syncWorkflow(workflow, 'finally'); + textarea.value = ''; + + this._willSendMessageCallback(); + }, + + handleDraftKeydown: function(e) { + var form = e.getNode('tag:form'); + var data = e.getNodeData('tag:form'); + + if (!data.preview) { + data.preview = new JX.PhabricatorShapedRequest( + this._getUpdateURI(), + JX.bag, + JX.bind(this, function () { + var data = JX.DOM.convertFormToDictionary(form); + data.action = 'draft'; + data = this._getParams(data); + return data; + })); + } + data.preview.trigger(); + }, + + _getUpdateURI: function() { + return '/conpherence/update/' + this._loadedThreadID + '/'; + }, + + _getMoreMessagesURI: function() { + return '/conpherence/' + this._loadedThreadID + '/'; + } + }, + + statics: { + _instance: null, + + getInstance: function() { + var self = JX.ConpherenceThreadManager; + if (!self._instance) { + return null; + } + return self._instance; + } + } + +}); diff --git a/webroot/rsrc/js/application/conpherence/behavior-conpherence-search.js b/webroot/rsrc/js/application/conpherence/behavior-conpherence-search.js new file mode 100644 index 0000000000..39ddd29f65 --- /dev/null +++ b/webroot/rsrc/js/application/conpherence/behavior-conpherence-search.js @@ -0,0 +1,82 @@ +/** + * @provides javelin-behavior-conpherence-search + * @requires javelin-behavior + * javelin-dom + * javelin-util + * javelin-workflow + * javelin-stratcom + */ + +JX.behavior('conpherence-search', function() { + + var shown = true; + var request = null; + + function _toggleSearch(e) { + e.kill(); + var node = JX.$('conpherence-main-layout'); + + shown = !shown; + JX.DOM.alterClass(node, 'show-searchbar', !shown); + if (!shown) { + JX.$('conpherence-search-input').focus(); + } else { + var form_root = JX.DOM.find(document, 'div', 'conpherence-form'); + var textarea = JX.DOM.find(form_root, 'textarea'); + textarea.focus(); + } + JX.Stratcom.invoke('resize'); + } + + function _doSearch(e) { + e.kill(); + var search_text = JX.$('conpherence-search-input').value; + var search_uri = JX.$('conpherence-search-form').action; + var search_node = JX.$('conpherence-search-results'); + + if (request || !search_text) { + return; + } + + request = new JX.Request(search_uri, function(response) { + JX.DOM.setContent(search_node, JX.$H(response)); + request = null; + }); + request.setData({fulltext: search_text}); + request.send(); + } + + function _viewResult(e) { + e.kill(); + var uri = e.getNode('tag:a'); + _toggleSearch(e); + JX.$U(uri).go(); + } + + JX.Stratcom.listen( + ['submit', 'didSyntheticSubmit'], + 'conpherence-search-input', + _doSearch); + + JX.Stratcom.listen( + 'keydown', + 'conpherence-search-input', + function(e) { + if (e.getSpecialKey() != 'return') { + return; + } + e.kill(); + _doSearch(e); + }); + + JX.Stratcom.listen( + 'click', + 'conpherence-search-result-jump', + _viewResult); + + JX.Stratcom.listen( + 'click', + 'conpherence-search-toggle', + _toggleSearch); + +}); diff --git a/webroot/rsrc/js/application/conpherence/behavior-durable-column.js b/webroot/rsrc/js/application/conpherence/behavior-durable-column.js new file mode 100644 index 0000000000..a521046d8e --- /dev/null +++ b/webroot/rsrc/js/application/conpherence/behavior-durable-column.js @@ -0,0 +1,364 @@ +/** + * @provides javelin-behavior-durable-column + * @requires javelin-behavior + * javelin-dom + * javelin-stratcom + * javelin-behavior-device + * javelin-scrollbar + * javelin-quicksand + * phabricator-keyboard-shortcut + * conpherence-thread-manager + */ + +JX.behavior('durable-column', function(config, statics) { + // TODO: Currently, updating the column sends the entire column back. This + // includes the `durable-column` behavior itself, which tries to re-initialize + // the column. Detect this and bail. + // + // If ThreadManager gets separated into a UI part and a thread part (which + // seems likely), responses may no longer ship back the entire column. This + // might let us remove this check. + if (statics.initialized) { + return; + } else { + statics.initialized = true; + } + + var userVisible = config.visible; + var userMinimize = config.minimize; + var show = null; + var loadThreadID = null; + var scrollbar = null; + + var margin = JX.Scrollbar.getScrollbarControlMargin(); + + var quick = JX.$('phabricator-standard-page-body'); + + function _getColumnNode() { + return JX.$('conpherence-durable-column'); + } + + function _getColumnScrollNode() { + var column = _getColumnNode(); + return JX.DOM.find(column, 'div', 'conpherence-durable-column-main'); + } + + function _updateColumnVisibility() { + var new_value = (userVisible); + if (new_value !== show) { + show = new_value; + _drawColumn(show); + } + } + + function _toggleColumn() { + userVisible = !userVisible; + _updateColumnVisibility(); + + new JX.Request(config.visibleURI) + .setData({value: (show ? 1 : 0)}) + .send(); + } + + function _minimizeColumn(e) { + e.kill(); + userMinimize = !userMinimize; + JX.DOM.alterClass(document.body, 'minimize-column', userMinimize); + JX.Stratcom.invoke('resize'); + + if (!userMinimize) { + var messages = _getColumnMessagesNode(); + scrollbar.scrollTo(messages.scrollHeight); + } + + new JX.Request(config.minimizeURI) + .setData({value: (userMinimize ? 1 : 0)}) + .send(); + } + + function _drawColumn(visible) { + JX.DOM.alterClass( + document.body, + 'with-durable-column', + visible); + + var column = _getColumnNode(); + if (visible) { + JX.DOM.show(column); + threadManager.loadThreadByID(loadThreadID); + } else { + JX.DOM.hide(column); + } + JX.Quicksand.setFrame(visible ? quick : null); + + JX.Stratcom.invoke('resize'); + } + + JX.Stratcom.listen( + 'click', + 'conpherence-persist-column', + _toggleColumn); + + JX.Stratcom.listen( + 'click', + 'conpherence-minimize-window', + _minimizeColumn); + + scrollbar = new JX.Scrollbar(_getColumnScrollNode()); + + JX.Quicksand.setFrame(userVisible ? quick : null); + JX.Quicksand.start(config.quicksandConfig); + + /* Conpherence Thread Manager configuration - lots of display + * callbacks. + */ + + var threadManager = new JX.ConpherenceThreadManager(); + threadManager.setMessagesRootCallback(function() { + return _getColumnMessagesNode(); + }); + threadManager.setLoadThreadURI('/conpherence/columnview/'); + threadManager.setWillLoadThreadCallback(function() { + _markLoading(true); + }); + threadManager.setDidLoadThreadCallback(function(r) { + var column = _getColumnNode(); + var new_column = JX.$H(r.content); + JX.DOM.replace(column, new_column); + if (show) { + JX.DOM.show(_getColumnNode()); + } else { + JX.DOM.hide(_getColumnNode()); + } + var messages = _getColumnMessagesNode(); + scrollbar = new JX.Scrollbar(_getColumnScrollNode()); + scrollbar.scrollTo(messages.scrollHeight); + _markLoading(false); + loadThreadID = threadManager.getLoadedThreadID(); + }); + threadManager.setDidUpdateThreadCallback(function(r) { + var messages = _getColumnMessagesNode(); + scrollbar.scrollTo(messages.scrollHeight); + }); + + threadManager.setWillSendMessageCallback(function() { + // Wipe the textarea immediately so the user can start typing more text. + var textarea = _getColumnTextareaNode(); + textarea.value = ''; + _focusColumnTextareaNode(); + }); + + threadManager.setDidSendMessageCallback(function(r, non_update) { + if (non_update) { + return; + } + var messages = _getColumnMessagesNode(); + scrollbar.scrollTo(messages.scrollHeight); + }); + + threadManager.setWillUpdateWorkflowCallback(function() { + JX.Stratcom.invoke('notification-panel-close'); + }); + threadManager.setDidUpdateWorkflowCallback(function(r) { + var messages = _getColumnMessagesNode(); + scrollbar.scrollTo(messages.scrollHeight); + JX.DOM.setContent(_getColumnTitleNode(), r.conpherence_title); + }); + threadManager.start(); + + JX.Stratcom.listen( + 'click', + 'conpherence-durable-column-header-action', + function (e) { + e.kill(); + var data = e.getNodeData('conpherence-durable-column-header-action'); + var action = data.action; + var link = e.getNode('tag:a'); + var params = null; + + switch (action) { + case 'go_edit': + threadManager.runUpdateWorkflowFromLink( + link, + { + action: action, + force_ajax: true, + stage: 'submit' + }); + break; + case 'add_person': + threadManager.runUpdateWorkflowFromLink( + link, + { + action: action, + stage: 'submit' + }); + break; + case 'go_conpherence': + JX.$U(link.href).go(); + break; + case 'hide_column': + JX.Stratcom.invoke('notification-panel-close'); + _toggleColumn(); + break; + } + }); + + JX.Stratcom.listen( + 'click', + 'conpherence-durable-column-thread-icon', + function (e) { + e.kill(); + var icons = JX.DOM.scry( + JX.$('conpherence-durable-column'), + 'a', + 'conpherence-durable-column-thread-icon'); + var data = e.getNodeData('conpherence-durable-column-thread-icon'); + var cdata = null; + for (var i = 0; i < icons.length; i++) { + cdata = JX.Stratcom.getData(icons[i]); + JX.DOM.alterClass( + icons[i], + 'selected', + cdata.threadID == data.threadID); + } + JX.DOM.setContent(_getColumnTitleNode(), JX.$H(data.threadTitle)); + threadManager.loadThreadByID(data.threadID); + }); + + JX.Stratcom.listen('resize', null, _updateColumnVisibility); + + function _getColumnBodyNode() { + var column = JX.$('conpherence-durable-column'); + return JX.DOM.find( + column, + 'div', + 'conpherence-durable-column-body'); + } + + function _getColumnMessagesNode() { + var column = JX.$('conpherence-durable-column'); + return JX.DOM.find( + column, + 'div', + 'conpherence-durable-column-transactions'); + } + + function _getColumnTitleNode() { + var column = JX.$('conpherence-durable-column'); + return JX.DOM.find( + column, + 'div', + 'conpherence-durable-column-header-text'); + } + + function _getColumnFormNode() { + var column = JX.$('conpherence-durable-column'); + return JX.DOM.find( + column, + 'form', + 'conpherence-message-form'); + } + + function _getColumnTextareaNode() { + var column = JX.$('conpherence-durable-column'); + return JX.DOM.find( + column, + 'textarea', + 'conpherence-durable-column-textarea'); + } + + function _focusColumnTextareaNode() { + var textarea = _getColumnTextareaNode(); + setTimeout(function() { JX.DOM.focus(textarea); }, 1); + } + + function _markLoading(loading) { + var column = _getColumnNode(); + JX.DOM.alterClass(column, 'loading', loading); + } + + function _sendMessage(e) { + e.kill(); + var form = _getColumnFormNode(); + threadManager.sendMessage(form, {}); + } + + JX.Stratcom.listen( + 'click', + 'conpherence-send-message', + _sendMessage); + + JX.Stratcom.listen( + ['submit', 'didSyntheticSubmit'], + 'conpherence-message-form', + _sendMessage); + + // Send on enter if the shift key is not held. + JX.Stratcom.listen( + 'keydown', + 'conpherence-message-form', + function(e) { + if (e.getSpecialKey() != 'return') { + return; + } + + var raw = e.getRawEvent(); + if (raw.shiftKey) { + // If the shift key is pressed, let the browser write a newline into + // the textarea. + return; + } + + // From here on, interpret this as a "send" action, not a literal + // newline. + e.kill(); + + _sendMessage(e); + }); + + JX.Stratcom.listen( + ['keydown'], + 'conpherence-durable-column-textarea', + function (e) { + threadManager.handleDraftKeydown(e); + }); + + // HTML5 placeholders are rendered as long as the input is empty, even if the + // input is currently focused. This is undesirable for the chat input, + // especially immediately after sending a message. Hide the placeholder while + // the input is focused. + JX.Stratcom.listen( + ['focus', 'blur'], + 'conpherence-durable-column-textarea', + function (e) { + var node = e.getTarget(); + if (e.getType() == 'focus') { + if (node.placeholder) { + node.placeholderStorage = node.placeholder; + node.placeholder = ''; + } + } else { + if (node.placeholderStorage) { + node.placeholder = node.placeholderStorage; + node.placeholderStorage = ''; + } + } + }); + + JX.Stratcom.listen( + 'quicksand-redraw', + null, + function (e) { + var new_data = e.getData().newResponse; + var new_classes = new_data.bodyClasses; + if (userMinimize) { + new_classes = new_classes + ' minimize-column'; + } + document.body.className = new_classes; + JX.Title.setTitle(new_data.title); + }); + + _updateColumnVisibility(); + +}); diff --git a/webroot/rsrc/js/application/conpherence/behavior-menu.js b/webroot/rsrc/js/application/conpherence/behavior-menu.js index 1dd8d8e75c..43488ce4ff 100644 --- a/webroot/rsrc/js/application/conpherence/behavior-menu.js +++ b/webroot/rsrc/js/application/conpherence/behavior-menu.js @@ -8,10 +8,13 @@ * javelin-behavior-device * javelin-history * javelin-vector + * javelin-scrollbar + * phabricator-title + * phabricator-shaped-request + * conpherence-thread-manager */ JX.behavior('conpherence-menu', function(config) { - /** * State for displayed thread. */ @@ -21,6 +24,60 @@ JX.behavior('conpherence-menu', function(config) { node: null }; + var scrollbar = null; + var cur_theme = config.theme; + + // TODO - move more logic into the ThreadManager + var threadManager = new JX.ConpherenceThreadManager(); + threadManager.setMessagesRootCallback(function() { + return scrollbar.getContentNode(); + }); + threadManager.setWillLoadThreadCallback(function() { + markThreadsLoading(true); + }); + threadManager.setDidLoadThreadCallback(function(r) { + var header = JX.$H(r.header); + var search = JX.$H(r.search); + var messages = JX.$H(r.transactions); + var form = JX.$H(r.form); + var root = JX.DOM.find(document, 'div', 'conpherence-layout'); + var header_root = JX.DOM.find(root, 'div', 'conpherence-header-pane'); + var search_root = JX.DOM.find(root, 'div', 'conpherence-search-main'); + var form_root = JX.DOM.find(root, 'div', 'conpherence-form'); + JX.DOM.setContent(header_root, header); + JX.DOM.setContent(search_root, search); + JX.DOM.setContent(scrollbar.getContentNode(), messages); + JX.DOM.setContent(form_root, form); + + markThreadsLoading(false); + + didRedrawThread(true); + }); + + threadManager.setDidUpdateThreadCallback(function(r) { + _scrollMessageWindow(); + }); + + threadManager.setWillSendMessageCallback(function () { + var root = JX.DOM.find(document, 'div', 'conpherence-layout'); + var form_root = JX.DOM.find(root, 'div', 'conpherence-form'); + markThreadLoading(true); + JX.DOM.alterClass(form_root, 'loading', true); + }); + + threadManager.setDidSendMessageCallback(function (r, non_update) { + var root = JX.DOM.find(document, 'div', 'conpherence-layout'); + var form_root = JX.DOM.find(root, 'div', 'conpherence-form'); + var textarea = JX.DOM.find(form_root, 'textarea'); + if (!non_update) { + _scrollMessageWindow(); + } + markThreadLoading(false); + + setTimeout(function() { JX.DOM.focus(textarea); }, 100); + }); + threadManager.start(); + /** * Current role of this behavior. The two possible roles are to show a 'list' * of threads or a specific 'thread'. On devices, this behavior stays in the @@ -37,7 +94,7 @@ JX.behavior('conpherence-menu', function(config) { var _oldDevice = null; /** - * Initializes this behavior based on all the configuraton jonx and the + * Initializes this behavior based on all the configuration jonx and the * result of JX.Device.getDevice(); */ function init() { @@ -50,20 +107,17 @@ JX.behavior('conpherence-menu', function(config) { } markWidgetLoading(true); onDeviceChange(); + var root = JX.DOM.find(document, 'div', 'conpherence-layout'); + var messages_root = JX.DOM.find(root, 'div', 'conpherence-message-pane'); + var messages = JX.DOM.find(messages_root, 'div', 'conpherence-messages'); + scrollbar = new JX.Scrollbar(messages); + scrollbar.setAsScrollFrame(); } init(); /** * Selecting threads */ - JX.Stratcom.listen( - 'conpherence-selectthread', - null, - function (e) { - selectThreadByID(e.getData().id); - } - ); - function selectThreadByID(id, update_page_data) { var thread = JX.$(id); selectThread(thread, update_page_data); @@ -71,13 +125,10 @@ JX.behavior('conpherence-menu', function(config) { function selectThread(node, update_page_data) { if (_thread.node) { - JX.DOM.alterClass(_thread.node, 'conpherence-selected', false); - // keep the unread-count hidden still. big TODO once we ajax in updates - // to threads to make this work right and move threads between read / - // unread + JX.DOM.alterClass(_thread.node, 'phui-list-item-selected', false); } - JX.DOM.alterClass(node, 'conpherence-selected', true); + JX.DOM.alterClass(node, 'phui-list-item-selected', true); JX.DOM.alterClass(node, 'hide-unread-count', true); _thread.node = node; @@ -93,16 +144,21 @@ JX.behavior('conpherence-menu', function(config) { } function updatePageData(data) { - var uri_suffix = _thread.selected + '/'; - if (data.use_base_uri) { - uri_suffix = ''; + var uri = '/Z' + _thread.selected; + var new_theme = data.theme; + + if (new_theme != cur_theme) { + var root = JX.$('conpherence-main-layout'); + JX.DOM.alterClass(root, cur_theme, false); + JX.DOM.alterClass(root, new_theme, true); + cur_theme = new_theme; } - JX.History.replace(config.baseURI + uri_suffix); + JX.History.replace(uri); if (data.title) { - document.title = data.title; + JX.Title.setTitle(data.title); } else if (_thread.node) { var threadData = JX.Stratcom.getData(_thread.node); - document.title = threadData.title; + JX.Title.setTitle(threadData.title); } } @@ -126,50 +182,34 @@ JX.behavior('conpherence-menu', function(config) { var data = JX.Stratcom.getData(_thread.node); if (_thread.visible !== null || !config.hasThread) { - markThreadLoading(true); - var uri = config.baseURI + data.threadID + '/'; - new JX.Workflow(uri, {}) - .setHandler(JX.bind(null, onLoadThreadResponse, data.threadID)) - .start(); + threadManager.setLoadThreadURI('/conpherence/' + data.threadID + '/'); + threadManager.loadThreadByID(data.threadID); } else if (config.hasThread) { + // we loaded the thread via the server so let the thread manager know + threadManager.setLoadedThreadID(config.selectedThreadID); + threadManager.setLoadedThreadPHID(config.selectedThreadPHID); + threadManager.setLatestTransactionID(config.latestTransactionID); + threadManager.setCanEditLoadedThread(config.canEditSelectedThread); + threadManager.cacheCurrentTransactions(); _scrollMessageWindow(); + _focusTextarea(); } else { didRedrawThread(); } if (_thread.visible !== null || !config.hasWidgets) { reloadWidget(data); - } else { - JX.Stratcom.invoke( - 'conpherence-update-widgets', - null, - { - widget : getDefaultWidget(), - buildSelectors : false, - toggleWidget : true, - threadID : _thread.selected - }); } _thread.visible = _thread.selected; } function markThreadsLoading(loading) { - var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var menu = JX.DOM.find(root, 'div', 'conpherence-menu-pane'); - JX.DOM.alterClass(menu, 'loading', loading); + var root = JX.$('conpherence-main-layout'); + JX.DOM.alterClass(root, 'loading', loading); } function markThreadLoading(loading) { - var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var header_root = JX.DOM.find(root, 'div', 'conpherence-header-pane'); - var messages_root = JX.DOM.find(root, 'div', 'conpherence-message-pane'); - var form_root = JX.DOM.find(root, 'div', 'conpherence-form'); - - JX.DOM.alterClass(header_root, 'loading', loading); - JX.DOM.alterClass(messages_root, 'loading', loading); - JX.DOM.alterClass(form_root, 'loading', loading); - try { var textarea = JX.DOM.find(form, 'textarea'); textarea.disabled = loading; @@ -182,7 +222,7 @@ JX.behavior('conpherence-menu', function(config) { function markWidgetLoading(loading) { var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var widgets_root = JX.DOM.find(root, 'div', 'conpherence-widget-pane'); + var widgets_root = JX.DOM.find(root, 'div', 'conpherence-participant-pane'); JX.DOM.alterClass(widgets_root, 'loading', loading); } @@ -192,7 +232,7 @@ JX.behavior('conpherence-menu', function(config) { if (!data.widget) { data.widget = getDefaultWidget(); } - var widget_uri = config.baseURI + 'widget/' + data.threadID + '/'; + var widget_uri = config.baseURI + 'participant/' + data.threadID + '/'; new JX.Workflow(widget_uri, {}) .setHandler(JX.bind(null, onWidgetResponse, data.threadID, data.widget)) .start(); @@ -217,48 +257,10 @@ JX.behavior('conpherence-menu', function(config) { var root = JX.DOM.find(document, 'div', 'conpherence-layout'); var widgets_root = JX.DOM.find(root, 'div', 'conpherence-widgets-holder'); JX.DOM.setContent(widgets_root, JX.$H(response.widgets)); - - JX.Stratcom.invoke( - 'conpherence-update-widgets', - null, - { - widget : widget, - buildSelectors : true, - toggleWidget : true, - threadID : _thread.selected - }); - - markWidgetLoading(false); } function getDefaultWidget() { - var device = JX.Device.getDevice(); - var widget = 'conpherence-message-pane'; - if (device == 'desktop') { - widget = 'widgets-people'; - } - return widget; - } - - function onLoadThreadResponse(thread_id, response) { - // we got impatient and this is no longer the right answer :/ - if (_thread.selected != thread_id) { - return; - } - var header = JX.$H(response.header); - var messages = JX.$H(response.messages); - var form = JX.$H(response.form); - var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var header_root = JX.DOM.find(root, 'div', 'conpherence-header-pane'); - var messages_root = JX.DOM.find(root, 'div', 'conpherence-messages'); - var form_root = JX.DOM.find(root, 'div', 'conpherence-form'); - JX.DOM.setContent(header_root, header); - JX.DOM.setContent(messages_root, messages); - JX.DOM.setContent(form_root, form); - - markThreadLoading(false); - - didRedrawThread(true); + return 'widgets-people'; } /** @@ -268,26 +270,62 @@ JX.behavior('conpherence-menu', function(config) { * - notably when the widget selector is used to invoke the message pane. * The following three functions get 'er done. */ - function didRedrawThread(build_device_widget_selector) { - _scrollMessageWindow(); - JX.Stratcom.invoke( - 'conpherence-did-redraw-thread', - null, - { - widget : getDefaultWidget(), - threadID : _thread.selected, - buildDeviceWidgetSelector : build_device_widget_selector - }); + function didRedrawThread(build_device_widget_selector) { + _scrollMessageWindow(); + _focusTextarea(); + JX.Stratcom.invoke( + 'conpherence-did-redraw-thread', + null, + { + widget : getDefaultWidget(), + threadID : _thread.selected, + buildDeviceWidgetSelector : build_device_widget_selector + }); } + + var _firstScroll = true; function _scrollMessageWindow() { + if (_firstScroll) { + _firstScroll = false; + + // We want to let the standard #anchor tech take over after we make sure + // we don't have to present the user with a "load older message?" dialog + if (window.location.hash) { + var hash = window.location.hash.replace(/^#/, ''); + try { + JX.$('anchor-' + hash); + } catch (ex) { + var uri = '/conpherence/' + + _thread.selected + '/' + hash + '/'; + threadManager.setLoadThreadURI(uri); + threadManager.loadThreadByID(_thread.selected, true); + _firstScroll = true; + return; + } + return; + } + } + scrollbar.scrollTo(scrollbar.getViewportNode().scrollHeight); + } + function _focusTextarea() { var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var messages_root = JX.DOM.find(root, 'div', 'conpherence-messages'); - messages_root.scrollTop = messages_root.scrollHeight; + var form_root = JX.DOM.find(root, 'div', 'conpherence-form'); + try { + var textarea = JX.DOM.find(form_root, 'textarea'); + // We may have a draft so do this JS trick so we end up focused at the + // end of the draft. + var textarea_value = textarea.value; + textarea.value = ''; + JX.DOM.focus(textarea); + textarea.value = textarea_value; + } catch (ex) { + // no textarea? no problem + } } JX.Stratcom.listen( 'conpherence-redraw-thread', null, - function (e) { + function () { _scrollMessageWindow(); } ); @@ -309,67 +347,6 @@ JX.behavior('conpherence-menu', function(config) { selectThread(e.getNode('conpherence-menu-click'), true); }); - JX.Stratcom.listen('click', 'conpherence-edit-metadata', function (e) { - e.kill(); - var root = e.getNode('conpherence-layout'); - var form = JX.DOM.find(root, 'form', 'conpherence-pontificate'); - var data = e.getNodeData('conpherence-edit-metadata'); - var header = JX.DOM.find(root, 'div', 'conpherence-header-pane'); - var messages = JX.DOM.find(root, 'div', 'conpherence-messages'); - - new JX.Workflow.newFromForm(form, data) - .setHandler(JX.bind(this, function(r) { - JX.DOM.appendContent(messages, JX.$H(r.transactions)); - messages.scrollTop = messages.scrollHeight; - - JX.DOM.setContent( - header, - JX.$H(r.header) - ); - - try { - // update the menu entry - JX.DOM.replace( - JX.$(r.conpherence_phid + '-nav-item'), - JX.$H(r.nav_item) - ); - JX.Stratcom.invoke( - 'conpherence-selectthread', - null, - { id : r.conpherence_phid + '-nav-item' } - ); - } catch (ex) { - // Ignore; this view may not have a menu. - } - })) - .start(); - }); - - var _loadingTransactionID = null; - JX.Stratcom.listen('click', 'show-older-messages', function(e) { - e.kill(); - var data = e.getNodeData('show-older-messages'); - if (data.oldest_transaction_id == _loadingTransactionID) { - return; - } - _loadingTransactionID = data.oldest_transaction_id; - var node = e.getNode('show-older-messages'); - JX.DOM.setContent(node, 'Loading...'); - JX.DOM.alterClass(node, 'conpherence-show-older-messages-loading', true); - - var conf_id = _thread.selected; - var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var messages_root = JX.DOM.find(root, 'div', 'conpherence-messages'); - new JX.Workflow(config.baseURI + conf_id + '/', data) - .setHandler(function(r) { - JX.DOM.remove(node); - var messages = JX.$H(r.messages); - JX.DOM.prependContent( - messages_root, - JX.$H(messages)); - }).start(); - }); - /** * On devices, we just show a thread list, so we don't want to automatically * select or load any threads. On desktop, we automatically select the first @@ -432,8 +409,6 @@ JX.behavior('conpherence-menu', function(config) { config.selectedID && selectThreadByID(config.selectedID); - _thread.node.scrollIntoView(); - markThreadsLoading(false); } @@ -458,73 +433,11 @@ JX.behavior('conpherence-menu', function(config) { } } - var handleThreadScrollers = function (e) { - e.kill(); - - var data = e.getNodeData('conpherence-menu-scroller'); - var scroller = e.getNode('conpherence-menu-scroller'); - JX.DOM.alterClass(scroller, 'loading', true); - JX.DOM.setContent(scroller.firstChild, 'Loading...'); - new JX.Workflow(scroller.href, data) - .setHandler( - JX.bind(null, threadScrollerResponse, scroller, data.direction)) - .start(); - }; - - var threadScrollerResponse = function (scroller, direction, r) { - var html = JX.$H(r.html); - - var thread_phids = r.phids; - var reselect_id = null; - // remove any threads that are in the list that we just got back - // in the result set; things have changed and they'll be in the - // right place soon - for (var ii = 0; ii < thread_phids.length; ii++) { - try { - var node_id = thread_phids[ii] + '-nav-item'; - var node = JX.$(node_id); - var node_data = JX.Stratcom.getData(node); - if (node_data.id == _thread.selected) { - reselect_id = node_id; - } - JX.DOM.remove(node); - } catch (ex) { - // ignore , just haven't seen this thread yet - } - } - - var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var menu_root = JX.DOM.find(root, 'div', 'conpherence-menu-pane'); - var scroll_y = 0; - // we have to do some hyjinx in the up case to make the menu scroll to - // where it should - if (direction == 'up') { - var style = { - position: 'absolute', - left: '-10000px' - }; - var test_size = JX.$N('div', {style: style}, html); - document.body.appendChild(test_size); - var html_size = JX.Vector.getDim(test_size); - JX.DOM.remove(test_size); - scroll_y = html_size.y; - } - JX.DOM.replace(scroller, html); - menu_root.scrollTop += scroll_y; - - if (reselect_id) { - JX.Stratcom.invoke( - 'conpherence-selectthread', - null, - { id : reselect_id } - ); - } - }; - JX.Stratcom.listen( - ['click'], - 'conpherence-menu-scroller', - handleThreadScrollers - ); + ['keydown'], + 'conpherence-pontificate', + function (e) { + threadManager.handleDraftKeydown(e); + }); }); diff --git a/webroot/rsrc/js/application/conpherence/behavior-participant-pane.js b/webroot/rsrc/js/application/conpherence/behavior-participant-pane.js new file mode 100644 index 0000000000..e428cbdbce --- /dev/null +++ b/webroot/rsrc/js/application/conpherence/behavior-participant-pane.js @@ -0,0 +1,112 @@ +/** + * @requires javelin-behavior + * javelin-dom + * javelin-stratcom + * javelin-workflow + * javelin-util + * phabricator-notification + * conpherence-thread-manager + * @provides javelin-behavior-conpherence-participant-pane + */ + +JX.behavior('conpherence-participant-pane', function() { + + /** + * Generified adding new stuff to widgets technology! + */ + JX.Stratcom.listen( + ['click'], + 'conpherence-widget-adder', + function (e) { + e.kill(); + + var threadManager = JX.ConpherenceThreadManager.getInstance(); + var href = threadManager._getUpdateURI(); + var latest_transaction_id = threadManager.getLatestTransactionID(); + var data = { + latest_transaction_id : latest_transaction_id, + action : 'add_person' + }; + + var workflow = new JX.Workflow(href, data) + .setHandler(function (r) { + var threadManager = JX.ConpherenceThreadManager.getInstance(); + threadManager.setLatestTransactionID(r.latest_transaction_id); + var root = JX.DOM.find(document, 'div', 'conpherence-layout'); + var messages = null; + try { + messages = JX.DOM.find(root, 'div', 'conpherence-messages'); + } catch (ex) { + } + if (messages) { + JX.DOM.appendContent(messages, JX.$H(r.transactions)); + JX.Stratcom.invoke('conpherence-redraw-thread', null, {}); + } + + try { + var people_root = JX.DOM.find(root, 'div', 'widgets-people'); + // update the people widget + JX.DOM.setContent( + people_root, + JX.$H(r.people_widget)); + } catch (ex) { + } + + }); + + threadManager.syncWorkflow(workflow, 'submit'); + } + ); + + JX.Stratcom.listen( + ['touchstart', 'mousedown'], + 'remove-person', + function (e) { + var threadManager = JX.ConpherenceThreadManager.getInstance(); + var href = threadManager._getUpdateURI(); + var data = e.getNodeData('remove-person'); + + // While the user is removing themselves, disable the notification + // update behavior. If we don't do this, the user can get an error + // when they remove themselves about permissions as the notification + // code tries to load what just happened. + var loadedPhid = threadManager.getLoadedThreadPHID(); + threadManager.setLoadedThreadPHID(null); + + new JX.Workflow(href, data) + .setCloseHandler(function() { + threadManager.setLoadedThreadPHID(loadedPhid); + }) + // we re-direct to conpherence home so the thread manager will + // fix itself there + .setHandler(function(r) { + JX.$U(r.href).go(); + }) + .start(); + } + ); + + /* settings widget */ + var onsubmitSettings = function (e) { + e.kill(); + var form = e.getNode('tag:form'); + var button = JX.DOM.find(form, 'button'); + JX.Workflow.newFromForm(form) + .setHandler(JX.bind(this, function (r) { + new JX.Notification() + .setDuration(6000) + .setContent(r) + .show(); + button.disabled = ''; + JX.DOM.alterClass(button, 'disabled', false); + })) + .start(); + }; + + JX.Stratcom.listen( + ['submit', 'didSyntheticSubmit'], + 'notifications-update', + onsubmitSettings + ); + +}); diff --git a/webroot/rsrc/js/application/conpherence/behavior-pontificate.js b/webroot/rsrc/js/application/conpherence/behavior-pontificate.js index 1690701b0e..537961ec71 100644 --- a/webroot/rsrc/js/application/conpherence/behavior-pontificate.js +++ b/webroot/rsrc/js/application/conpherence/behavior-pontificate.js @@ -5,62 +5,21 @@ * javelin-util * javelin-workflow * javelin-stratcom + * conpherence-thread-manager */ -JX.behavior('conpherence-pontificate', function(config) { - var onsubmit = function(e) { - e.kill(); +JX.behavior('conpherence-pontificate', function() { + var _sendMessage = function(e) { + e.kill(); var form = e.getNode('tag:form'); - - var root = e.getNode('conpherence-layout'); - var messages_root = JX.DOM.find(root, 'div', 'conpherence-message-pane'); - var header_root = JX.DOM.find(root, 'div', 'conpherence-header-pane'); - var form_root = JX.DOM.find(root, 'div', 'conpherence-form'); - var messages = JX.DOM.find(messages_root, 'div', 'conpherence-messages'); - var fileWidget = null; - try { - fileWidget = JX.DOM.find(root, 'div', 'widgets-files'); - } catch (ex) { - // Ignore; maybe no files widget - } - JX.DOM.alterClass(form_root, 'loading', true); - - JX.Workflow.newFromForm(form) - .setHandler(JX.bind(this, function(r) { - JX.DOM.appendContent(messages, JX.$H(r.transactions)); - messages.scrollTop = messages.scrollHeight; - - if (fileWidget) { - JX.DOM.setContent( - fileWidget, - JX.$H(r.file_widget) - ); - } - - var latest_transaction_dom = JX.DOM.find( - root, - 'input', - 'latest-transaction-id'); - latest_transaction_dom.value = r.latest_transaction_id; - - var textarea = JX.DOM.find(form, 'textarea'); - textarea.value = ''; - - JX.Stratcom.invoke( - 'conpherence-selectthread', - null, - { id : r.conpherence_phid + '-nav-item' } - ); - - JX.DOM.alterClass(form_root, 'loading', false); - })) - .start(); + var threadManager = JX.ConpherenceThreadManager.getInstance(); + threadManager.sendMessage(form, {}); }; JX.Stratcom.listen( ['submit', 'didSyntheticSubmit'], 'conpherence-pontificate', - onsubmit); + _sendMessage); }); diff --git a/webroot/rsrc/js/application/conpherence/behavior-quicksand-blacklist.js b/webroot/rsrc/js/application/conpherence/behavior-quicksand-blacklist.js new file mode 100644 index 0000000000..48d87d8fe5 --- /dev/null +++ b/webroot/rsrc/js/application/conpherence/behavior-quicksand-blacklist.js @@ -0,0 +1,9 @@ +/** + * @provides javelin-behavior-quicksand-blacklist + * @requires javelin-behavior + * javelin-quicksand + */ + +JX.behavior('quicksand-blacklist', function(config) { + JX.Quicksand.setURIPatternBlacklist(config.patterns); +}); diff --git a/webroot/rsrc/js/application/conpherence/behavior-toggle-widget.js b/webroot/rsrc/js/application/conpherence/behavior-toggle-widget.js new file mode 100644 index 0000000000..0022273c0e --- /dev/null +++ b/webroot/rsrc/js/application/conpherence/behavior-toggle-widget.js @@ -0,0 +1,45 @@ +/** + * @provides javelin-behavior-toggle-widget + * @requires javelin-behavior + * javelin-dom + * javelin-util + * javelin-workflow + * javelin-stratcom + */ + +JX.behavior('toggle-widget', function(config) { + + var device; + + function init() { + device = JX.Device.getDevice(); + if (device != 'phone') { + var node = JX.$('conpherence-main-layout'); + JX.DOM.alterClass(node, 'hide-widgets', !config.show); + JX.Stratcom.invoke('resize'); + } else { + config.show = 0; + } + } + init(); + + function _toggleColumn(e) { + e.kill(); + var node = JX.$('conpherence-main-layout'); + config.show = !config.show; + JX.DOM.alterClass(node, 'hide-widgets', !config.show); + JX.Stratcom.invoke('resize'); + + if (device != 'phone') { + new JX.Request(config.settingsURI) + .setData({value: (config.show ? 1 : 0)}) + .send(); + } + } + + JX.Stratcom.listen( + 'click', + 'conpherence-widget-toggle', + _toggleColumn); + +}); diff --git a/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js b/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js deleted file mode 100644 index 7c3c6c0ca1..0000000000 --- a/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js +++ /dev/null @@ -1,345 +0,0 @@ -/** - * @requires javelin-behavior - * javelin-dom - * javelin-stratcom - * javelin-workflow - * javelin-util - * phabricator-notification - * javelin-behavior-device - * phabricator-dropdown-menu - * phabricator-menu-item - * @provides javelin-behavior-conpherence-widget-pane - */ - -JX.behavior('conpherence-widget-pane', function(config) { - - /** - * There can be race conditions around loading the messages or the widgets - * first. Keep track of what widgets we've loaded with this variable. - */ - var _loadedWidgetsID = null; - - /** - * At any given time there can be only one selected widget. Keep track of - * which one it is by the user-facing name for ease of use with - * PhabricatorDropdownMenuItems. - */ - var _selectedWidgetName = null; - - /** - * This is potentially built each time the user switches conpherence threads - * or when the result JX.Device.getDevice() changes from desktop to some - * other value. - */ - var buildDeviceWidgetSelector = function (data) { - var device_header = _getDeviceWidgetHeader(); - if (!device_header) { - return; - } - JX.DOM.show(device_header); - var device_menu = new JX.PhabricatorDropdownMenu(device_header); - data.deviceMenu = true; - _buildWidgetSelector(device_menu, data); - }; - - /** - * This is potentially built each time the user switches conpherence threads - * or when the result JX.Device.getDevice() changes from mobile or tablet to - * desktop. - */ - var buildDesktopWidgetSelector = function (data) { - var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var widget_pane = JX.DOM.find(root, 'div', 'conpherence-widget-pane'); - var widget_header = JX.DOM.find(widget_pane, 'a', 'widgets-selector'); - var menu = new JX.PhabricatorDropdownMenu(widget_header); - menu.toggleAlignDropdownRight(false); - data.deviceMenu = false; - _buildWidgetSelector(menu, data); - }; - - /** - * Workhorse that actually builds the widget selector. Note some fancy bits - * where we listen for the "open" event and enable / disable widgets as - * appropos. - */ - var _buildWidgetSelector = function (menu, data) { - _loadedWidgetsID = data.threadID; - var widgets = config.widgetRegistry; - for (var widget in widgets) { - var widget_data = widgets[widget]; - if (widget_data.deviceOnly && data.deviceMenu === false) { - continue; - } - menu.addItem(new JX.PhabricatorMenuItem( - widget_data.name, - JX.bind(null, toggleWidget, { widget : widget }), - '#' - ).setDisabled(widget == data.widget)); - } - - menu.listen( - 'open', - JX.bind(menu, function () { - for (var ii = 0; ii < this._items.length; ii++) { - var item = this._items[ii]; - var name = item.getName(); - if (name == _selectedWidgetName) { - item.setDisabled(true); - } else { - item.setDisabled(false); - } - } - })); - }; - - /** - * Since this is not always on the page, avoid having a repeat - * try / catch block and consolidate into this helper function. - */ - var _getDeviceWidgetHeader = function () { - var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var device_header = null; - try { - device_header = JX.DOM.find( - root, - 'a', - 'device-widgets-selector'); - } catch (ex) { - // is okay - no deviceWidgetHeader yet... but bail time - } - return device_header; - }; - - /** - * Responder to the 'conpherence-did-redraw-thread' event, this bad boy - * hides or shows the device widget selector as appropros. - */ - var _didRedrawThread = function (data) { - if (_loadedWidgetsID === null || _loadedWidgetsID != data.threadID) { - return; - } - var device = JX.Device.getDevice(); - var device_selector = _getDeviceWidgetHeader(); - if (device == 'desktop') { - JX.DOM.hide(device_selector); - } else { - JX.DOM.show(device_selector); - } - if (data.buildDeviceWidgetSelector) { - buildDeviceWidgetSelector(data); - } - toggleWidget(data); - }; - JX.Stratcom.listen( - 'conpherence-did-redraw-thread', - null, - function (e) { - _didRedrawThread(e.getData()); - } - ); - - /** - * Toggling a widget involves showing / hiding the appropriate widget - * bodies as well as updating the selectors to have the label on the - * newly selected widget. - */ - var toggleWidget = function (data) { - var widgets = config.widgetRegistry; - var widget_data = widgets[data.widget]; - var device = JX.Device.getDevice(); - var is_desktop = device == 'desktop'; - - if (widget_data.deviceOnly && is_desktop) { - return; - } - _selectedWidgetName = widget_data.name; - - var device_header = _getDeviceWidgetHeader(); - if (device_header) { - // this is fragile but adding a sigil to this element is awkward - var device_header_spans = JX.DOM.scry(device_header, 'span'); - var device_header_span = device_header_spans[1]; - JX.DOM.setContent( - device_header_span, - widget_data.name); - } - - // don't update the non-device selector with device only widget stuff - if (!widget_data.deviceOnly) { - var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var widget_pane = JX.DOM.find(root, 'div', 'conpherence-widget-pane'); - var widget_header = JX.DOM.find(widget_pane, 'a', 'widgets-selector'); - var adder = JX.DOM.find(widget_pane, 'a', 'conpherence-widget-adder'); - JX.DOM.setContent( - widget_header, - widget_data.name); - JX.DOM.appendContent( - widget_header, - JX.$N('span', { className : 'caret' })); - if (widget_data.hasCreate) { - JX.DOM.show(adder); - } else { - JX.DOM.hide(adder); - } - } - - for (var widget in config.widgetRegistry) { - widget_data = widgets[widget]; - if (widget_data.deviceOnly && is_desktop) { - // some one off code for conpherence messages which are device-only - // as a widget, but shown always on the desktop - if (widget == 'conpherence-message-pane') { - JX.$(widget).style.display = 'block'; - JX.Stratcom.invoke('conpherence-redraw-thread', null, {}); - } - continue; - } - if (widget == data.widget) { - JX.$(widget).style.display = 'block'; - // some one off code for conpherence messages - fancier refresh tech - if (widget == 'conpherence-message-pane') { - JX.Stratcom.invoke('conpherence-redraw-thread', null, {}); - JX.Stratcom.invoke('conpherence-update-page-data', null, {}); - } - } else { - JX.$(widget).style.display = 'none'; - } - } - }; - - JX.Stratcom.listen( - 'conpherence-update-widgets', - null, - function (e) { - var data = e.getData(); - if (data.buildSelectors) { - buildDesktopWidgetSelector(data); - buildDeviceWidgetSelector(data); - } - if (data.toggleWidget) { - toggleWidget(data); - } - }); - - /** - * Generified adding new stuff to widgets technology! - */ - JX.Stratcom.listen( - ['click'], - 'conpherence-widget-adder', - function (e) { - e.kill(); - - var widgets = config.widgetRegistry; - // the widget key might be in node data, but otherwise use the - // selected widget - var event_data = e.getNodeData('conpherence-widget-adder'); - var widget_key = _selectedWidgetName; - if (event_data.widget) { - widget_key = widgets[event_data.widget].name; - } - - var widget_to_update = null; - var create_data = null; - for (var widget in widgets) { - if (widgets[widget].name == widget_key) { - create_data = widgets[widget].createData; - widget_to_update = widget; - break; - } - } - // this should be impossible, but hey - if (!widget_to_update) { - return; - } - var href = config.widgetBaseUpdateURI + _loadedWidgetsID + '/'; - if (create_data.customHref) { - href = create_data.customHref; - } - - var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var latest_transaction_dom = JX.DOM.find( - root, - 'input', - 'latest-transaction-id'); - var data = { - latest_transaction_id : latest_transaction_dom.value, - action : create_data.action - }; - - new JX.Workflow(href, data) - .setHandler(function (r) { - latest_transaction_dom.value = r.latest_transaction_id; - if (create_data.refreshFromResponse) { - var messages = null; - try { - messages = JX.DOM.find(root, 'div', 'conpherence-messages'); - } catch (ex) { - } - if (messages) { - JX.DOM.appendContent(messages, JX.$H(r.transactions)); - messages.scrollTop = messages.scrollHeight; - } - - if (r.people_widget) { - try { - var people_root = JX.DOM.find(root, 'div', 'widgets-people'); - // update the people widget - JX.DOM.setContent( - people_root, - JX.$H(r.people_widget)); - } catch (ex) { - } - } - - // otherwise let's redraw the widget somewhat lazily - } else { - JX.Stratcom.invoke( - 'conpherence-reload-widget', - null, - { - threadID : _loadedWidgetsID, - widget : widget_to_update - }); - } - }) - .start(); - } - ); - - JX.Stratcom.listen( - ['touchstart', 'mousedown'], - 'remove-person', - function (e) { - var href = config.widgetBaseUpdateURI + _loadedWidgetsID + '/'; - var data = e.getNodeData('remove-person'); - // we end up re-directing to conpherence home - new JX.Workflow(href, data) - .start(); - } - ); - - /* settings widget */ - var onsubmitSettings = function (e) { - e.kill(); - var form = e.getNode('tag:form'); - var button = JX.DOM.find(form, 'button'); - JX.Workflow.newFromForm(form) - .setHandler(JX.bind(this, function (r) { - new JX.Notification() - .setDuration(6000) - .setContent(r) - .show(); - button.disabled = ''; - JX.DOM.alterClass(button, 'disabled', false); - })) - .start(); - }; - - JX.Stratcom.listen( - ['submit', 'didSyntheticSubmit'], - 'notifications-update', - onsubmitSettings - ); - -}); diff --git a/webroot/rsrc/js/application/countdown/timer.js b/webroot/rsrc/js/application/countdown/timer.js index ce8f0a6bf4..04dbf4e3db 100644 --- a/webroot/rsrc/js/application/countdown/timer.js +++ b/webroot/rsrc/js/application/countdown/timer.js @@ -5,9 +5,11 @@ */ JX.behavior('countdown-timer', function(config) { - - var container = JX.$(config.container); - calculateTimeLeft(); + try { + var container = JX.$(config.container); + } catch (ignored) { + return; + } function setComponent(which, content) { var component = JX.DOM.find(container, '*', 'phabricator-timer-' + which); @@ -49,5 +51,5 @@ JX.behavior('countdown-timer', function(config) { setComponent('seconds', [seconds, JX.$N('small', {}, ['.', partial])]); } + calculateTimeLeft(); }); - diff --git a/webroot/rsrc/js/application/daemon/behavior-bulk-job-reload.js b/webroot/rsrc/js/application/daemon/behavior-bulk-job-reload.js new file mode 100644 index 0000000000..293f18b22c --- /dev/null +++ b/webroot/rsrc/js/application/daemon/behavior-bulk-job-reload.js @@ -0,0 +1,18 @@ +/** + * @provides javelin-behavior-bulk-job-reload + * @requires javelin-behavior + * javelin-uri + */ + +JX.behavior('bulk-job-reload', function() { + + // TODO: It would be nice to have a pretty Ajax progress bar here, but just + // reload the page for now. + + function reload() { + JX.$U().go(); + } + + setTimeout(reload, 1000); + +}); diff --git a/webroot/rsrc/js/application/dashboard/behavior-dashboard-async-panel.js b/webroot/rsrc/js/application/dashboard/behavior-dashboard-async-panel.js new file mode 100644 index 0000000000..126f2d868e --- /dev/null +++ b/webroot/rsrc/js/application/dashboard/behavior-dashboard-async-panel.js @@ -0,0 +1,26 @@ +/** + * @provides javelin-behavior-dashboard-async-panel + * @requires javelin-behavior + * javelin-dom + * javelin-workflow + */ + +JX.behavior('dashboard-async-panel', function(config) { + var panel = JX.$(config.panelID); + panel.style.opacity = '0.5'; + + var data = { + parentPanelPHIDs: config.parentPanelPHIDs.join(','), + headerMode: config.headerMode, + contextPHID: config.contextPHID, + movable: config.movable, + panelKey: config.panelKey + }; + + new JX.Workflow(config.uri) + .setData(data) + .setHandler(function(r) { + JX.DOM.replace(panel, JX.$H(r.panelMarkup)); + }) + .start(); +}); diff --git a/webroot/rsrc/js/application/dashboard/behavior-dashboard-move-panels.js b/webroot/rsrc/js/application/dashboard/behavior-dashboard-move-panels.js new file mode 100644 index 0000000000..c01ab6cd04 --- /dev/null +++ b/webroot/rsrc/js/application/dashboard/behavior-dashboard-move-panels.js @@ -0,0 +1,81 @@ +/** + * @provides javelin-behavior-dashboard-move-panels + * @requires javelin-behavior + * javelin-dom + * javelin-util + * javelin-stratcom + * javelin-workflow + * phabricator-draggable-list + */ + +JX.behavior('dashboard-move-panels', function(config) { + + var itemSigil = 'panel-movable'; + + function finditems(col) { + return JX.DOM.scry(col, 'div', itemSigil); + } + + function markcolempty(col, toggle) { + JX.DOM.alterClass(col.parentNode, 'dashboard-column-empty', toggle); + } + + function onupdate(col) { + markcolempty(col, !this.findItems().length); + } + + function onresponse(response, item, list) { + list.unlock(); + JX.DOM.alterClass(item, 'drag-sending', false); + } + + function ondrop(list, item, after) { + list.lock(); + JX.DOM.alterClass(item, 'drag-sending', true); + + var data = { + panelKey: JX.Stratcom.getData(item).panelKey, + columnKey: JX.Stratcom.getData(list.getRootNode()).columnKey + }; + + if (after) { + var after_data = JX.Stratcom.getData(after); + if (after_data.panelKey) { + data.afterKey = after_data.panelKey; + } + } + + var workflow = new JX.Workflow(config.moveURI, data) + .setHandler(function(response) { + onresponse(response, item, list); + }); + + workflow.start(); + } + + var dashboard_node = JX.$(config.dashboardNodeID); + + var lists = []; + var cols = JX.DOM.scry(dashboard_node, 'div', 'dashboard-column'); + + var ii; + for (ii = 0; ii < cols.length; ii++) { + var col = cols[ii]; + var list = new JX.DraggableList(itemSigil, col) + .setFindItemsHandler(JX.bind(null, finditems, col)) + .setCanDragX(true); + + list.listen('didSend', JX.bind(list, onupdate, col)); + list.listen('didReceive', JX.bind(list, onupdate, col)); + list.listen('didDrop', JX.bind(null, ondrop, list)); + + lists.push(list); + + markcolempty(col, finditems(col).length === 0); + } + + for (ii = 0; ii < lists.length; ii++) { + lists[ii].setGroup(lists); + } + +}); diff --git a/webroot/rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js b/webroot/rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js new file mode 100644 index 0000000000..1600470a54 --- /dev/null +++ b/webroot/rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js @@ -0,0 +1,64 @@ +/** + * @provides javelin-behavior-dashboard-query-panel-select + * @requires javelin-behavior + * javelin-dom + */ + +/** + * When editing a "Query" panel on dashboards, make the "Query" selector control + * dynamically update in response to changes to the "Engine" selector control. + */ +JX.behavior('dashboard-query-panel-select', function(config) { + + var app_control = JX.$(config.applicationID); + var query_control = JX.$(config.queryID); + + // If we have a currently-selected query, add it to the appropriate group + // in the options list if it does not already exist. + if (config.value.key !== null) { + var app = app_control.value; + if (!(app in config.options)) { + config.options[app] = []; + } + + var found = false; + for (var ii = 0; ii < config.options[app].length; ii++) { + if (config.options[app][ii].key == config.value.key) { + found = true; + break; + } + } + + if (!found) { + config.options[app] = [config.value].concat(config.options[app]); + } + } + + // When the user changes the selected search engine, update the query + // control to show available queries for that engine. + function update() { + var app = app_control.value; + + var old_value = query_control.value; + var new_value = null; + + var options = config.options[app] || []; + var nodes = []; + for (var ii = 0; ii < options.length; ii++) { + if (new_value === null) { + new_value = options[ii].key; + } + if (options[ii].key == old_value) { + new_value = options[ii].key; + } + nodes.push(JX.$N('option', {value: options[ii].key}, options[ii].name)); + } + + JX.DOM.setContent(query_control, nodes); + query_control.value = new_value; + } + + JX.DOM.listen(app_control, 'change', null, function() { update(); }); + update(); + +}); diff --git a/webroot/rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js b/webroot/rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js new file mode 100644 index 0000000000..5d79c35ce3 --- /dev/null +++ b/webroot/rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js @@ -0,0 +1,52 @@ +/** + * @provides javelin-behavior-dashboard-tab-panel + * @requires javelin-behavior + * javelin-dom + * javelin-stratcom + */ + +JX.behavior('dashboard-tab-panel', function() { + + JX.Stratcom.listen('click', 'dashboard-tab-panel-tab', function(e) { + // On dashboard panels in edit mode, the user may click the dropdown caret + // within a tab to open the context menu. If they do, this click should + // just open the menu, not select the tab. For now, pass the event here + // to let the menu handler act on it. + if (JX.Stratcom.pass(e)) { + return; + } + + e.kill(); + + var selected_key = e.getNodeData('dashboard-tab-panel-tab').panelKey; + + var root = e.getNode('dashboard-tab-panel-container'); + var data = JX.Stratcom.getData(root); + + + var ii; + // Give the tab the user clicked a selected style, and remove it from + // the other tabs. + var tabs = JX.DOM.scry(root, 'li', 'dashboard-tab-panel-tab'); + for (ii = 0; ii < tabs.length; ii++) { + var tab = tabs[ii]; + var tab_data = JX.Stratcom.getData(tab); + var is_selected = (tab_data.panelKey === selected_key); + JX.DOM.alterClass(tabs[ii], 'phui-list-item-selected', is_selected); + } + + // Switch the visible content to correspond to whatever the user clicked. + for (ii = 0; ii < data.panels.length; ii++) { + var panel = data.panels[ii]; + var node = JX.$(panel.panelContentID); + + if (panel.panelKey == selected_key) { + JX.DOM.show(node); + } else { + JX.DOM.hide(node); + } + } + + }); + +}); diff --git a/webroot/rsrc/js/application/diff/DiffChangeset.js b/webroot/rsrc/js/application/diff/DiffChangeset.js new file mode 100644 index 0000000000..af25b59c6b --- /dev/null +++ b/webroot/rsrc/js/application/diff/DiffChangeset.js @@ -0,0 +1,1091 @@ +/** + * @provides phabricator-diff-changeset + * @requires javelin-dom + * javelin-util + * javelin-stratcom + * javelin-install + * javelin-workflow + * javelin-router + * javelin-behavior-device + * javelin-vector + * phabricator-diff-inline + * phabricator-diff-path-view + * phuix-button-view + * javelin-external-editor-link-engine + * @javelin + */ + +JX.install('DiffChangeset', { + + construct : function(node) { + this._node = node; + + var data = this._getNodeData(); + + this._renderURI = data.renderURI; + this._ref = data.ref; + this._loaded = data.loaded; + this._treeNodeID = data.treeNodeID; + + this._leftID = data.left; + this._rightID = data.right; + + this._displayPath = JX.$H(data.displayPath); + this._pathParts = data.pathParts; + this._icon = data.icon; + + this._editorURITemplate = data.editorURITemplate; + this._editorConfigureURI = data.editorConfigureURI; + this._showPathURI = data.showPathURI; + this._showDirectoryURI = data.showDirectoryURI; + + this._pathIconIcon = data.pathIconIcon; + this._pathIconColor = data.pathIconColor; + this._isLowImportance = data.isLowImportance; + this._isOwned = data.isOwned; + this._isLoading = true; + + this._inlines = null; + + if (data.changesetState) { + this._loadChangesetState(data.changesetState); + } + + JX.enableDispatch(window, 'selectstart'); + + var onselect = JX.bind(this, this._onClickHeader); + JX.DOM.listen( + this._node, + ['mousedown', 'selectstart'], + 'changeset-header', + onselect); + }, + + members: { + _node: null, + _loaded: false, + _sequence: 0, + _stabilize: false, + + _renderURI: null, + _ref: null, + _rendererKey: null, + _highlight: null, + _requestDocumentEngineKey: null, + _responseDocumentEngineKey: null, + _availableDocumentEngineKeys: null, + _characterEncoding: null, + _undoTemplates: null, + + _leftID: null, + _rightID: null, + + _inlines: null, + _visible: true, + + _displayPath: null, + + _changesetList: null, + _icon: null, + + _editorURITemplate: null, + _editorConfigureURI: null, + _showPathURI: null, + _showDirectoryURI: null, + + _pathView: null, + + _pathIconIcon: null, + _pathIconColor: null, + _isLowImportance: null, + _isOwned: null, + _isHidden: null, + _isSelected: false, + _viewMenu: null, + + getEditorURITemplate: function() { + return this._editorURITemplate; + }, + + getEditorConfigureURI: function() { + return this._editorConfigureURI; + }, + + getShowPathURI: function() { + return this._showPathURI; + }, + + getShowDirectoryURI: function() { + return this._showDirectoryURI; + }, + + getLeftChangesetID: function() { + return this._leftID; + }, + + getRightChangesetID: function() { + return this._rightID; + }, + + setChangesetList: function(list) { + this._changesetList = list; + return this; + }, + + setViewMenu: function(menu) { + this._viewMenu = menu; + return this; + }, + + getIcon: function() { + if (!this._visible) { + return 'fa-file-o'; + } + + return this._icon; + }, + + getColor: function() { + if (!this._visible) { + return 'grey'; + } + + return 'blue'; + }, + + getChangesetList: function() { + return this._changesetList; + }, + + /** + * Has the content of this changeset been loaded? + * + * This method returns `true` if a request has been fired, even if the + * response has not returned yet. + * + * @return bool True if the content has been loaded. + */ + isLoaded: function() { + return this._loaded; + }, + + + /** + * Configure stabilization of the document position on content load. + * + * When we dump the changeset into the document, we can try to stabilize + * the document scroll position so that the user doesn't feel like they + * are jumping around as things load in. This is generally useful when + * populating initial changes. + * + * However, if a user explicitly requests a content load by clicking a + * "Load" link or using the dropdown menu, this stabilization generally + * feels unnatural, so we don't use it in response to explicit user action. + * + * @param bool True to stabilize the next content fill. + * @return this + */ + setStabilize: function(stabilize) { + this._stabilize = stabilize; + return this; + }, + + + /** + * Should this changeset load immediately when the page loads? + * + * Normally, changes load immediately, but if a diff or commit is very + * large we stop doing this and have the user load files explicitly, or + * choose to load everything. + * + * @return bool True if the changeset should load automatically when the + * page loads. + */ + shouldAutoload: function() { + return this._getNodeData().autoload; + }, + + + /** + * Load this changeset, if it isn't already loading. + * + * This fires a request to fill the content of this changeset, provided + * there isn't already a request in flight. To force a reload, use + * @{method:reload}. + * + * @return this + */ + load: function() { + if (this._loaded) { + return this; + } + + return this.reload(); + }, + + + /** + * Reload the changeset content. + * + * This method always issues a request, even if the content is already + * loading. To load conditionally, use @{method:load}. + * + * @return this + */ + reload: function(state) { + this._loaded = true; + this._sequence++; + + var workflow = this._newReloadWorkflow(state) + .setHandler(JX.bind(this, this._onresponse, this._sequence)); + + this._startContentWorkflow(workflow); + + var pht = this.getChangesetList().getTranslations(); + + JX.DOM.setContent( + this._getContentFrame(), + JX.$N( + 'div', + {className: 'differential-loading'}, + pht('Loading...'))); + + return this; + }, + + _newReloadWorkflow: function(state) { + var params = this._getViewParameters(state); + return new JX.Workflow(this._renderURI, params); + }, + + /** + * Load missing context in a changeset. + * + * We do this when the user clicks "Show X Lines". We also expand all of + * the missing context when they "Show All Context". + * + * @param string Line range specification, like "0-40/0-20". + * @param node Row where the context should be rendered after loading. + * @param bool True if this is a bulk load of multiple context blocks. + * @return this + */ + loadContext: function(range, target, bulk) { + var params = this._getViewParameters(); + params.range = range; + + var pht = this.getChangesetList().getTranslations(); + + var container = JX.DOM.scry(target, 'td')[0]; + JX.DOM.setContent(container, pht('Loading...')); + JX.DOM.alterClass(target, 'differential-show-more-loading', true); + + var workflow = new JX.Workflow(this._renderURI, params) + .setHandler(JX.bind(this, this._oncontext, target)); + + if (bulk) { + // If we're loading a bunch of these because the viewer clicked + // "Show All Context" or similar, use lower-priority requests + // and draw a progress bar. + this._startContentWorkflow(workflow); + } else { + // If this is a single click on a context link, use a higher priority + // load without a chrome change. + workflow.start(); + } + + return this; + }, + + loadAllContext: function() { + var nodes = JX.DOM.scry(this._node, 'tr', 'context-target'); + for (var ii = 0; ii < nodes.length; ii++) { + var show = JX.DOM.scry(nodes[ii], 'a', 'show-more'); + for (var jj = 0; jj < show.length; jj++) { + var data = JX.Stratcom.getData(show[jj]); + if (data.type != 'all') { + continue; + } + this.loadContext(data.range, nodes[ii], true); + } + } + }, + + _startContentWorkflow: function(workflow) { + var routable = workflow.getRoutable(); + + routable + .setPriority(500) + .setType('content') + .setKey(this._getRoutableKey()); + + JX.Router.getInstance().queue(routable); + }, + + getDisplayPath: function() { + return this._displayPath; + }, + + /** + * Receive a response to a context request. + */ + _oncontext: function(target, response) { + // TODO: This should be better structured. + // If the response comes back with several top-level nodes, the last one + // is the actual context; the others are headers. Add any headers first, + // then copy the new rows into the document. + var markup = JX.$H(response.changeset).getFragment(); + var len = markup.childNodes.length; + var diff = JX.DOM.findAbove(target, 'table', 'differential-diff'); + + for (var ii = 0; ii < len - 1; ii++) { + diff.parentNode.insertBefore(markup.firstChild, diff); + } + + var table = markup.firstChild; + var root = target.parentNode; + this._moveRows(table, root, target); + root.removeChild(target); + + this._onchangesetresponse(response); + }, + + _moveRows: function(src, dst, before) { + var rows = JX.DOM.scry(src, 'tr'); + for (var ii = 0; ii < rows.length; ii++) { + + // Find the table this

    " under the cursor is on the wrong side of the file. You can + // only leave inline comments on the left or right side of a file, not + // across lines on both sides. + var origin_side = this.getDisplaySideFromHeader(origin); + var target_side = this.getDisplaySideFromHeader(target); + if (origin_side != target_side) { + return; + } + + // Don't update the reticle if we're selecting a line range and the + // "" under the cursor corresponds to a different file. You can + // only leave inline comments on lines in a single file, not across + // multiple files. + var origin_table = JX.DOM.findAbove(origin, 'table'); + var target_table = JX.DOM.findAbove(target, 'table'); + if (origin_table != target_table) { + return; + } + } + + if (is_out) { + if (this._rangeActive) { + // If we're dragging a range, just leave the state as it is. This + // allows you to drag over something invalid while selecting a + // range without the range flickering or getting lost. + } else { + // Otherwise, clear the current range. + this.resetHover(); + } + return; + } + + if (this._rangeActive) { + this._rangeTarget = target; + } else { + this._rangeOrigin = target; + this._rangeTarget = target; + } + + this._setHoverRange(this._rangeOrigin, this._rangeTarget); + }, + + _onrangeup: function(e) { + if (!this._rangeActive) { + return; + } + + e.kill(); + + var origin = this._rangeOrigin; + var target = this._rangeTarget; + + // If the user dragged a range from the bottom to the top, swap the node + // order around. + if (JX.$V(origin).y > JX.$V(target).y) { + var tmp = target; + target = origin; + origin = tmp; + } + + var node = JX.DOM.findAbove(origin, null, 'differential-changeset'); + var changeset = this.getChangesetForNode(node); + + changeset.newInlineForRange(origin, target); + + this._rangeActive = false; + this._rangeOrigin = null; + this._rangeTarget = null; + + this.resetHover(); + }, + + _redrawBanner: function() { + // If the inline comment menu is open and we've done a redraw, close it. + // In particular, this makes it close when you scroll the document: + // otherwise, it stays open but the banner moves underneath it. + if (this._dropdownMenu) { + this._dropdownMenu.close(); + } + + var node = this._getBannerNode(); + var changeset = this._getVisibleChangeset(); + var tree = this._getTreeView(); + var formation = this.getFormationView(); + + if (!changeset) { + this._bannerChangeset = null; + JX.DOM.remove(node); + tree.setFocusedPath(null); + + if (formation) { + formation.repaint(); + } + + return; + } + + // Don't do anything if nothing has changed. This seems to avoid some + // flickering issues in Safari, at least. + if (this._bannerChangeset === changeset) { + return; + } + this._bannerChangeset = changeset; + + var paths = tree.getPaths(); + for (var ii = 0; ii < paths.length; ii++) { + var path = paths[ii]; + if (path.getChangeset() === changeset) { + tree.setFocusedPath(path); + } + } + + var inlines = this._getInlinesByType(); + + var unsaved = inlines.unsaved; + var unsubmitted = inlines.unsubmitted; + var undone = inlines.undone; + var done = inlines.done; + var draft_done = inlines.draftDone; + + JX.DOM.alterClass( + node, + 'diff-banner-has-unsaved', + !!unsaved.length); + + JX.DOM.alterClass( + node, + 'diff-banner-has-unsubmitted', + !!unsubmitted.length); + + JX.DOM.alterClass( + node, + 'diff-banner-has-draft-done', + !!draft_done.length); + + var pht = this.getTranslations(); + var unsaved_button = this._getUnsavedButton(); + var unsubmitted_button = this._getUnsubmittedButton(); + var done_button = this._getDoneButton(); + var menu_button = this._getMenuButton(); + + if (unsaved.length) { + unsaved_button.setText(unsaved.length + ' ' + pht('Unsaved')); + JX.DOM.show(unsaved_button.getNode()); + } else { + JX.DOM.hide(unsaved_button.getNode()); + } + + if (unsubmitted.length || draft_done.length) { + var any_draft_count = unsubmitted.length + draft_done.length; + + unsubmitted_button.setText(any_draft_count + ' ' + pht('Unsubmitted')); + JX.DOM.show(unsubmitted_button.getNode()); + } else { + JX.DOM.hide(unsubmitted_button.getNode()); + } + + if (done.length || undone.length) { + // If you haven't marked any comments as "Done", we just show text + // like "3 Comments". If you've marked at least one done, we show + // "1 / 3 Comments". + + var done_text; + if (done.length) { + done_text = [ + done.length, + ' / ', + (done.length + undone.length), + ' ', + pht('Comments') + ]; + } else { + done_text = [ + undone.length, + ' ', + pht('Comments') + ]; + } + + done_button.setText(done_text); + + JX.DOM.show(done_button.getNode()); + + // If any comments are not marked "Done", this cycles through the + // missing comments. Otherwise, it cycles through all the saved + // comments. + if (undone.length) { + this._doneMode = 'undone'; + } else { + this._doneMode = 'done'; + } + + } else { + JX.DOM.hide(done_button.getNode()); + } + + var path_view = [icon, ' ', changeset.getDisplayPath()]; + + var buttons_attrs = { + className: 'diff-banner-buttons' + }; + + var buttons_list = [ + unsaved_button.getNode(), + unsubmitted_button.getNode(), + done_button.getNode(), + menu_button.getNode() + ]; + + var buttons_view = JX.$N('div', buttons_attrs, buttons_list); + + var icon = new JX.PHUIXIconView() + .setIcon(changeset.getIcon()) + .getNode(); + JX.DOM.setContent(node, [buttons_view, path_view]); + + document.body.appendChild(node); + + if (formation) { + formation.repaint(); + } + }, + + _getInlinesByType: function() { + var changesets = this._changesets; + var unsaved = []; + var unsubmitted = []; + var undone = []; + var done = []; + var draft_done = []; + + var visible_done = []; + var visible_collapsed = []; + var visible_ghosts = []; + var visible = []; + var hidden = []; + + for (var ii = 0; ii < changesets.length; ii++) { + var inlines = changesets[ii].getInlines(); + var inline; + var jj; + for (jj = 0; jj < inlines.length; jj++) { + inline = inlines[jj]; + + if (inline.isDeleted()) { + continue; + } + + if (inline.isSynthetic()) { + continue; + } + + if (inline.isEditing()) { + unsaved.push(inline); + } else if (!inline.getID()) { + // These are new comments which have been cancelled, and do not + // count as anything. + continue; + } else if (inline.isDraft()) { + unsubmitted.push(inline); + } else { + // NOTE: Unlike other states, an inline may be marked with a + // draft checkmark and still be a "done" or "undone" comment. + if (inline.isDraftDone()) { + draft_done.push(inline); + } + + if (!inline.isDone()) { + undone.push(inline); + } else { + done.push(inline); + } + } + } + + for (jj = 0; jj < inlines.length; jj++) { + inline = inlines[jj]; + if (inline.isDeleted()) { + continue; + } + + if (inline.isEditing()) { + continue; + } + + if (inline.isHidden()) { + hidden.push(inline); + continue; + } + + visible.push(inline); + + if (inline.isDone()) { + visible_done.push(inline); + } + + if (inline.isCollapsed()) { + visible_collapsed.push(inline); + } + + if (inline.isGhost()) { + visible_ghosts.push(inline); + } + } + } + + return { + unsaved: unsaved, + unsubmitted: unsubmitted, + undone: undone, + done: done, + draftDone: draft_done, + visibleDone: visible_done, + visibleGhosts: visible_ghosts, + visibleCollapsed: visible_collapsed, + visible: visible, + hidden: hidden + }; + + }, + + _getUnsavedButton: function() { + if (!this._unsavedButton) { + var button = new JX.PHUIXButtonView() + .setIcon('fa-commenting-o') + .setButtonType(JX.PHUIXButtonView.BUTTONTYPE_SIMPLE); + + var node = button.getNode(); + + var onunsaved = JX.bind(this, this._onunsavedclick); + JX.DOM.listen(node, 'click', null, onunsaved); + + this._unsavedButton = button; + } + + return this._unsavedButton; + }, + + _getUnsubmittedButton: function() { + if (!this._unsubmittedButton) { + var button = new JX.PHUIXButtonView() + .setIcon('fa-comment-o') + .setButtonType(JX.PHUIXButtonView.BUTTONTYPE_SIMPLE); + + var node = button.getNode(); + + var onunsubmitted = JX.bind(this, this._onunsubmittedclick); + JX.DOM.listen(node, 'click', null, onunsubmitted); + + this._unsubmittedButton = button; + } + + return this._unsubmittedButton; + }, + + _getDoneButton: function() { + if (!this._doneButton) { + var button = new JX.PHUIXButtonView() + .setIcon('fa-comment') + .setButtonType(JX.PHUIXButtonView.BUTTONTYPE_SIMPLE); + + var node = button.getNode(); + + var ondone = JX.bind(this, this._ondoneclick); + JX.DOM.listen(node, 'click', null, ondone); + + this._doneButton = button; + } + + return this._doneButton; + }, + + _getMenuButton: function() { + if (!this._menuButton) { + var pht = this.getTranslations(); + + var button = new JX.PHUIXButtonView() + .setIcon('fa-bars') + .setButtonType(JX.PHUIXButtonView.BUTTONTYPE_SIMPLE) + .setAuralLabel(pht('Display Options')); + + var dropdown = new JX.PHUIXDropdownMenu(button.getNode()); + this._menuItems = {}; + + var list = new JX.PHUIXActionListView(); + dropdown.setContent(list.getNode()); + + var map = { + hideDone: { + type: 'done' + }, + hideCollapsed: { + type: 'collapsed' + }, + hideGhosts: { + type: 'ghosts' + }, + hideAll: { + type: 'all' + }, + showAll: { + type: 'show' + } + }; + + for (var k in map) { + var spec = map[k]; + + var handler = JX.bind(this, this._onhideinlines, spec.type); + var item = new JX.PHUIXActionView() + .setHandler(handler); + + list.addItem(item); + this._menuItems[k] = item; + } + + dropdown.listen('open', JX.bind(this, this._ondropdown)); + + if (this.getInlineListURI()) { + list.addItem( + new JX.PHUIXActionView() + .setDivider(true)); + + list.addItem( + new JX.PHUIXActionView() + .setIcon('fa-external-link') + .setName(pht('List Inline Comments')) + .setHref(this.getInlineListURI())); + } + + this._menuButton = button; + this._dropdownMenu = dropdown; + } + + return this._menuButton; + }, + + _ondropdown: function() { + var inlines = this._getInlinesByType(); + var items = this._menuItems; + var pht = this.getTranslations(); + + items.hideDone + .setName(pht('Hide "Done" Inlines')) + .setDisabled(!inlines.visibleDone.length); + + items.hideCollapsed + .setName(pht('Hide Collapsed Inlines')) + .setDisabled(!inlines.visibleCollapsed.length); + + items.hideGhosts + .setName(pht('Hide Older Inlines')) + .setDisabled(!inlines.visibleGhosts.length); + + items.hideAll + .setName(pht('Hide All Inlines')) + .setDisabled(!inlines.visible.length); + + items.showAll + .setName(pht('Show All Inlines')) + .setDisabled(!inlines.hidden.length); + }, + + _onhideinlines: function(type, e) { + this._dropdownMenu.close(); + e.prevent(); + + this._toggleInlines(type); + }, + + _toggleInlines: function(type) { + var inlines = this._getInlinesByType(); + + // Clear the selection state since we end up in a weird place if the + // user hides the selected inline. + this._setSelectionState(null); + + var targets; + var mode = true; + switch (type) { + case 'done': + targets = inlines.visibleDone; + break; + case 'collapsed': + targets = inlines.visibleCollapsed; + break; + case 'ghosts': + targets = inlines.visibleGhosts; + break; + case 'all': + targets = inlines.visible; + break; + case 'show': + targets = inlines.hidden; + mode = false; + break; + } + + for (var ii = 0; ii < targets.length; ii++) { + targets[ii].setHidden(mode); + } + }, + + _onunsavedclick: function(e) { + e.kill(); + + var options = { + filter: 'comment', + wrap: true, + show: true, + attribute: 'unsaved' + }; + + this._onjumpkey(1, options); + }, + + _onunsubmittedclick: function(e) { + e.kill(); + + var options = { + filter: 'comment', + wrap: true, + show: true, + attribute: 'anyDraft' + }; + + this._onjumpkey(1, options); + }, + + _ondoneclick: function(e) { + e.kill(); + + var options = { + filter: 'comment', + wrap: true, + show: true, + attribute: this._doneMode + }; + + this._onjumpkey(1, options); + }, + + _getBannerNode: function() { + if (!this._bannerNode) { + var attributes = { + className: 'diff-banner', + id: 'diff-banner' + }; + + this._bannerNode = JX.$N('div', attributes); + } + + return this._bannerNode; + }, + + _getVisibleChangeset: function() { + if (this.isAsleep()) { + return null; + } + + if (JX.Device.getDevice() != 'desktop') { + return null; + } + + // Never show the banner if we're very near the top of the page. + var margin = 480; + var s = JX.Vector.getScroll(); + if (s.y < margin) { + return null; + } + + // We're going to find the changeset which spans an invisible line a + // little underneath the bottom of the banner. This makes the header + // tick over from "A.txt" to "B.txt" just as "A.txt" scrolls completely + // offscreen. + var detect_height = 64; + + for (var ii = 0; ii < this._changesets.length; ii++) { + var changeset = this._changesets[ii]; + var c = changeset.getVectors(); + + // If the changeset starts above the line... + if (c.pos.y <= (s.y + detect_height)) { + // ...and ends below the line, this is the current visible changeset. + if ((c.pos.y + c.dim.y) >= (s.y + detect_height)) { + return changeset; + } + } + } + + return null; + }, + + _getTreeView: function() { + if (!this._treeView) { + var tree = new JX.DiffTreeView(); + + for (var ii = 0; ii < this._changesets.length; ii++) { + var changeset = this._changesets[ii]; + tree.addPath(changeset.getPathView()); + } + + this._treeView = tree; + } + return this._treeView; + }, + + _redrawFiletree : function() { + var formation = this.getFormationView(); + + if (!formation) { + return; + } + + var filetree = formation.getColumn(0); + var flank = filetree.getFlank(); + + var flank_body = flank.getBodyNode(); + + var tree = this._getTreeView(); + JX.DOM.setContent(flank_body, tree.getNode()); + }, + + _setupInlineCommentListeners: function() { + var onsave = JX.bind(this, this._onInlineEvent, 'save'); + JX.Stratcom.listen( + ['submit', 'didSyntheticSubmit'], + 'inline-edit-form', + onsave); + + var oncancel = JX.bind(this, this._onInlineEvent, 'cancel'); + JX.Stratcom.listen( + 'click', + 'inline-edit-cancel', + oncancel); + + var onundo = JX.bind(this, this._onInlineEvent, 'undo'); + JX.Stratcom.listen( + 'click', + 'differential-inline-comment-undo', + onundo); + + var ondone = JX.bind(this, this._onInlineEvent, 'done'); + JX.Stratcom.listen( + 'click', + ['differential-inline-comment', 'differential-inline-done'], + ondone); + + var ondelete = JX.bind(this, this._onInlineEvent, 'delete'); + JX.Stratcom.listen( + 'click', + ['differential-inline-comment', 'differential-inline-delete'], + ondelete); + + var onmenu = JX.bind(this, this._onInlineEvent, 'menu'); + JX.Stratcom.listen( + 'click', + ['differential-inline-comment', 'inline-action-dropdown'], + onmenu); + + var ondraft = JX.bind(this, this._onInlineEvent, 'draft'); + JX.Stratcom.listen( + 'keydown', + ['differential-inline-comment', 'tag:textarea'], + ondraft); + + var on_preview_view = JX.bind(this, this._onPreviewEvent, 'view'); + JX.Stratcom.listen( + 'click', + 'differential-inline-preview-jump', + on_preview_view); + }, + + _onPreviewEvent: function(action, e) { + if (this.isAsleep()) { + return; + } + + var data = e.getNodeData('differential-inline-preview-jump'); + var inline = this.getInlineByID(data.inlineCommentID); + if (!inline) { + return; + } + + e.kill(); + + switch (action) { + case 'view': + this.selectInline(inline, true, true); + break; + } + }, + + _onInlineEvent: function(action, e) { + if (this.isAsleep()) { + return; + } + + if (action !== 'draft' && action !== 'menu') { + e.kill(); + } + + var inline = this._getInlineForEvent(e); + var is_ref = false; + + // If we don't have a natural inline object, the user may have clicked + // an action (like "Delete") inside a preview element at the bottom of + // the page. + + // If they did, try to find an associated normal inline to act on, and + // pretend they clicked that instead. This makes the overall state of + // the page more consistent. + + // However, there may be no normal inline (for example, because it is + // on a version of the diff which is not visible). In this case, we + // act by reference. + + if (inline === null) { + var data = e.getNodeData('differential-inline-comment'); + inline = this.getInlineByID(data.id); + if (inline) { + is_ref = true; + } else { + switch (action) { + case 'delete': + this._deleteInlineByID(data.id); + return; + } + } + } + + // TODO: For normal operations, highlight the inline range here. + + switch (action) { + case 'save': + inline.save(); + break; + case 'cancel': + inline.cancel(); + break; + case 'undo': + inline.undo(); + break; + case 'done': + inline.toggleDone(); + break; + case 'delete': + inline.delete(is_ref); + break; + case 'draft': + inline.triggerDraft(); + break; + case 'menu': + var node = e.getNode('inline-action-dropdown'); + inline.activateMenu(node, e); + break; + } + }, + + _onSelectRange: function(e) { + this._updateSourceSelection(); + }, + + _updateSourceSelection: function() { + var ranges = this._getSelectedRanges(); + + // In Firefox, selecting multiple rows gives us multiple ranges. In + // Safari and Chrome, we get a single range. + if (!ranges.length) { + this._setSourceSelection(null, null); + return; + } + + var min = 0; + var max = ranges.length - 1; + + var head = ranges[min].startContainer; + var last = ranges[max].endContainer; + + var head_loc = this._getFragmentLocation(head); + var last_loc = this._getFragmentLocation(last); + + if (head_loc === null || last_loc === null) { + this._setSourceSelection(null, null); + return; + } + + if (head_loc.changesetID !== last_loc.changesetID) { + this._setSourceSelection(null, null); + return; + } + + head_loc.offset += ranges[min].startOffset; + last_loc.offset += ranges[max].endOffset; + + this._setSourceSelection(head_loc, last_loc); + }, + + _setSourceSelection: function(start, end) { + var start_updated = + !this._isSameSourceSelection(this._sourceSelectionStart, start); + + var end_updated = + !this._isSameSourceSelection(this._sourceSelectionEnd, end); + + if (!start_updated && !end_updated) { + return; + } + + this._sourceSelectionStart = start; + this._sourceSelectionEnd = end; + + if (!start) { + this._closeSourceSelectionMenu(); + return; + } + + var menu; + if (this._sourceSelectionMenu) { + menu = this._sourceSelectionMenu; + } else { + menu = this._newSourceSelectionMenu(); + this._sourceSelectionMenu = menu; + } + + var pos = JX.$V(start.node) + .add(0, -menu.getMenuNodeDimensions().y) + .add(0, -24); + + menu.setPosition(pos); + menu.open(); + }, + + _newSourceSelectionMenu: function() { + var pht = this.getTranslations(); + + var menu = new JX.PHUIXDropdownMenu(null) + .setWidth(240); + + // We need to disable autofocus for this menu, since it operates on the + // text selection in the document. If we leave this enabled, opening the + // menu immediately discards the selection. + menu.setDisableAutofocus(true); + + var list = new JX.PHUIXActionListView(); + menu.setContent(list.getNode()); + + var oncreate = JX.bind(this, this._onSourceSelectionMenuAction, 'create'); + + var comment_item = new JX.PHUIXActionView() + .setIcon('fa-comment-o') + .setName(pht('New Inline Comment')) + .setKeyCommand('c') + .setHandler(oncreate); + + list.addItem(comment_item); + + return menu; + }, + + _onSourceSelectionMenuAction: function(action, e) { + e.kill(); + this._closeSourceSelectionMenu(); + + switch (action) { + case 'create': + this._onKeyCreate(); + break; + } + }, + + _closeSourceSelectionMenu: function() { + if (this._sourceSelectionMenu) { + this._sourceSelectionMenu.close(); + } + }, + + _isSameSourceSelection: function(u, v) { + if (u === null && v === null) { + return true; + } + + if (u === null && v !== null) { + return false; + } + + if (u !== null && v === null) { + return false; + } + + return ( + (u.changesetID === v.changesetID) && + (u.line === v.line) && + (u.displayColumn === v.displayColumn) && + (u.offset === v.offset) + ); + }, + + _getFragmentLocation: function(fragment) { + // Find the changeset containing the fragment. + var changeset = null; + try { + var node = JX.DOM.findAbove( + fragment, + 'div', + 'differential-changeset'); + + changeset = this.getChangesetForNode(node); + if (!changeset) { + return null; + } + } catch (ex) { + return null; + } + + // Find the line number and display column for the fragment. + var line = null; + var column_count = -1; + var has_new = false; + var has_old = false; + var offset = null; + var target_node = null; + var td; + try { + + // NOTE: In Safari, you can carefully select an entire line and then + // move your mouse down slightly, causing selection of an empty + // document fragment which is an immediate child of the next "
    ". + + var is_end; + if (JX.DOM.isType(fragment.parentNode, 'tr')) { + // Assume this is Safari, and that the user has carefully selected a + // row and then moved their mouse down a few pixels to select the + // invisible fragment at the beginning of the next row. + var cells = fragment.parentNode.previousSibling.childNodes; + td = cells[cells.length - 1]; + is_end = true; + } else { + td = this._findContentCell(fragment); + is_end = false; + } + + var cursor = td; + while (cursor) { + if (cursor.getAttribute('data-copy-mode')) { + column_count++; + } else { + // In unified mode, the content column isn't currently marked + // with an attribute, and we can't count content columns anyway. + // Keep track of whether or not we see a "NL" (New Line) column + // and/or an "OL" (Old Line) column to try to puzzle out which + // side of the display change we're on. + + if (cursor.id.match(/NL/)) { + has_new = true; + } else if (cursor.id.match(/OL/)) { + has_old = true; + } + } + + var n = parseInt(cursor.getAttribute('data-n')); + + if (n) { + if (line === null) { + target_node = cursor; + line = n; + } + } + + cursor = cursor.previousSibling; + } + + if (!line) { + return null; + } + + if (column_count < 0) { + if (has_new || has_old) { + if (has_new) { + column_count = 1; + } else { + column_count = 0; + } + } else { + return null; + } + } + + var info = this._getSelectionOffset(td, fragment); + + if (info.found) { + offset = info.offset; + } else { + if (is_end) { + offset = info.offset; + } else { + offset = 0; + } + } + } catch (ex) { + return null; + } + + var changeset_id; + if (column_count > 0) { + changeset_id = changeset.getRightChangesetID(); + } else { + changeset_id = changeset.getLeftChangesetID(); + } + + return { + node: td, + changeset: changeset, + changesetID: changeset_id, + line: line, + displayColumn: column_count, + offset: offset, + targetNode: target_node + }; + }, + + _getSelectionOffset: function(node, target) { + // If this is an aural hint node in a unified diff, ignore it when + // calculating the selection offset. + if (node.getAttribute && node.getAttribute('data-aural')) { + return { + offset: 0, + content: '', + found: false + }; + } + + if (!node.childNodes || !node.childNodes.length) { + return { + offset: node.textContent.length, + content: node.textContent, + found: false + }; + } + + var found = false; + var offset = 0; + var content = ''; + for (var ii = 0; ii < node.childNodes.length; ii++) { + var child = node.childNodes[ii]; + + if (child === target) { + found = true; + } + + var spec = this._getSelectionOffset(child, target); + + content += spec.content; + if (!found) { + offset += spec.offset; + } + + found = found || spec.found; + } + + return { + offset: offset, + content: content, + found: found + }; + }, + + _getSelectedRanges: function() { + var ranges = []; + + if (!window.getSelection) { + return ranges; + } + + var selection = window.getSelection(); + for (var ii = 0; ii < selection.rangeCount; ii++) { + var range = selection.getRangeAt(ii); + if (range.collapsed) { + continue; + } + + ranges.push(range); + } + + return ranges; + }, + + _isContentCell: function(node) { + return !!node.getAttribute('data-copy-mode'); + }, + + _findContentCell: function(node) { + var cursor = node; + while (true) { + cursor = JX.DOM.findAbove(cursor, 'td'); + if (this._isContentCell(cursor)) { + return cursor; + } + } + } + + } + +}); diff --git a/webroot/rsrc/js/application/diff/DiffInline.js b/webroot/rsrc/js/application/diff/DiffInline.js new file mode 100644 index 0000000000..4a0db5b520 --- /dev/null +++ b/webroot/rsrc/js/application/diff/DiffInline.js @@ -0,0 +1,1221 @@ +/** + * @provides phabricator-diff-inline + * @requires javelin-dom + * phabricator-diff-inline-content-state + * @javelin + */ + +JX.install('DiffInline', { + + construct : function() { + this._state = {}; + }, + + members: { + _id: null, + _phid: null, + _changesetID: null, + _row: null, + _number: null, + _length: null, + _displaySide: null, + _isNewFile: null, + _replyToCommentPHID: null, + _snippet: null, + _menuItems: null, + _documentEngineKey: null, + + _isDeleted: false, + _isInvisible: false, + _isLoading: false, + + _changeset: null, + + _isCollapsed: false, + _isDraft: null, + _isDraftDone: null, + _isFixed: null, + _isEditing: false, + _isNew: false, + _isSynthetic: false, + _isHidden: false, + + _editRow: null, + _undoRow: null, + _undoType: null, + _undoState: null, + + _draftRequest: null, + _skipFocus: false, + _menu: null, + + _startOffset: null, + _endOffset: null, + _isSelected: false, + _canSuggestEdit: false, + + _state: null, + + bindToRow: function(row) { + this._row = row; + + var row_data = JX.Stratcom.getData(row); + row_data.inline = this; + this._isCollapsed = row_data.hidden || false; + + // TODO: Get smarter about this once we do more editing, this is pretty + // hacky. + var comment = JX.DOM.find(row, 'div', 'differential-inline-comment'); + var data = JX.Stratcom.getData(comment); + + this._readInlineState(data); + this._phid = data.phid; + + if (data.on_right) { + this._displaySide = 'right'; + } else { + this._displaySide = 'left'; + } + + this._number = parseInt(data.number, 10); + this._length = parseInt(data.length, 10); + + this._isNewFile = data.isNewFile; + + this._replyToCommentPHID = data.replyToCommentPHID; + + this._isDraft = data.isDraft; + this._isFixed = data.isFixed; + this._isGhost = data.isGhost; + this._isSynthetic = data.isSynthetic; + this._isDraftDone = data.isDraftDone; + + this._changesetID = data.changesetID; + this._isNew = false; + this._snippet = data.snippet; + this._menuItems = data.menuItems; + this._documentEngineKey = data.documentEngineKey; + + this._startOffset = data.startOffset; + this._endOffset = data.endOffset; + + this._isEditing = data.isEditing; + + if (this._isEditing) { + // NOTE: The "original" shipped down in the DOM may reflect a draft + // which we're currently editing. This flow is a little clumsy, but + // reasonable until some future change moves away from "send down + // the inline, then immediately click edit". + this.edit(null, true); + } else { + this.setInvisible(false); + } + + this._startDrafts(); + + return this; + }, + + isDraft: function() { + return this._isDraft; + }, + + isDone: function() { + return this._isFixed; + }, + + isEditing: function() { + return this._isEditing; + }, + + isUndo: function() { + return !!this._undoRow; + }, + + isDeleted: function() { + return this._isDeleted; + }, + + isSynthetic: function() { + return this._isSynthetic; + }, + + isDraftDone: function() { + return this._isDraftDone; + }, + + isHidden: function() { + return this._isHidden; + }, + + isGhost: function() { + return this._isGhost; + }, + + getStartOffset: function() { + return this._startOffset; + }, + + getEndOffset: function() { + return this._endOffset; + }, + + setIsSelected: function(is_selected) { + this._isSelected = is_selected; + + if (this._row) { + JX.DOM.alterClass( + this._row, + 'inline-comment-selected', + this._isSelected); + } + + return this; + }, + + bindToRange: function(data) { + this._displaySide = data.displaySide; + this._number = parseInt(data.number, 10); + this._length = parseInt(data.length, 10); + this._isNewFile = data.isNewFile; + this._changesetID = data.changesetID; + this._isNew = true; + + if (data.hasOwnProperty('startOffset')) { + this._startOffset = data.startOffset; + } else { + this._startOffset = null; + } + + if (data.hasOwnProperty('endOffset')) { + this._endOffset = data.endOffset; + } else { + this._endOffset = null; + } + + // Insert the comment after any other comments which already appear on + // the same row. + var parent_row = JX.DOM.findAbove(data.target, 'tr'); + var target_row = parent_row.nextSibling; + while (target_row && JX.Stratcom.hasSigil(target_row, 'inline-row')) { + target_row = target_row.nextSibling; + } + + var row = this._newRow(); + parent_row.parentNode.insertBefore(row, target_row); + + this.setInvisible(true); + this._startDrafts(); + + return this; + }, + + bindToReply: function(inline) { + this._displaySide = inline._displaySide; + this._number = inline._number; + this._length = inline._length; + this._isNewFile = inline._isNewFile; + this._changesetID = inline._changesetID; + this._isNew = true; + this._documentEngineKey = inline._documentEngineKey; + + this._replyToCommentPHID = inline._phid; + + var changeset = this.getChangeset(); + + // We're going to figure out where in the document to position the new + // inline. Normally, it goes after any existing inline rows (so if + // several inlines reply to the same line, they appear in chronological + // order). + + // However: if inlines are threaded, we want to put the new inline in + // the right place in the thread. This might be somewhere in the middle, + // so we need to do a bit more work to figure it out. + + // To find the right place in the thread, we're going to look for any + // inline which is at or above the level of the comment we're replying + // to. This means we've reached a new fork of the thread, and should + // put our new inline before the comment we found. + var ancestor_map = {}; + var ancestor = inline; + var reply_phid; + while (ancestor) { + reply_phid = ancestor.getReplyToCommentPHID(); + if (!reply_phid) { + break; + } + ancestor_map[reply_phid] = true; + ancestor = changeset.getInlineByPHID(reply_phid); + } + + var parent_row = inline._row; + var target_row = parent_row.nextSibling; + while (target_row && JX.Stratcom.hasSigil(target_row, 'inline-row')) { + var target = changeset.getInlineForRow(target_row); + reply_phid = target.getReplyToCommentPHID(); + + // If we found an inline which is replying directly to some ancestor + // of this new comment, this is where the new rows go. + if (ancestor_map.hasOwnProperty(reply_phid)) { + break; + } + + target_row = target_row.nextSibling; + } + + var row = this._newRow(); + parent_row.parentNode.insertBefore(row, target_row); + + this.setInvisible(true); + this._startDrafts(); + + return this; + }, + + setChangeset: function(changeset) { + this._changeset = changeset; + return this; + }, + + getChangeset: function() { + return this._changeset; + }, + + setEditing: function(editing) { + this._isEditing = editing; + return this; + }, + + setHidden: function(hidden) { + this._isHidden = hidden; + this._redraw(); + return this; + }, + + canReply: function() { + return this._hasMenuAction('reply'); + }, + + canEdit: function() { + return this._hasMenuAction('edit'); + }, + + canDone: function() { + if (!JX.DOM.scry(this._row, 'input', 'differential-inline-done').length) { + return false; + } + + return true; + }, + + canCollapse: function() { + return this._hasMenuAction('collapse'); + }, + + _newRow: function() { + var attributes = { + sigil: 'inline-row' + }; + + var row = JX.$N('tr', attributes); + + JX.Stratcom.getData(row).inline = this; + this._row = row; + + this._id = null; + this._phid = null; + this._isCollapsed = false; + + return row; + }, + + setCollapsed: function(collapsed) { + this._closeMenu(); + + this._isCollapsed = collapsed; + + var op; + if (collapsed) { + op = 'hide'; + } else { + op = 'show'; + } + + var inline_uri = this._getInlineURI(); + var comment_id = this._id; + + new JX.Workflow(inline_uri, {op: op, ids: comment_id}) + .setHandler(JX.bag) + .start(); + + this._redraw(); + this._didUpdate(true); + }, + + isCollapsed: function() { + return this._isCollapsed; + }, + + toggleDone: function() { + var uri = this._getInlineURI(); + var data = { + op: 'done', + id: this._id + }; + + var ondone = JX.bind(this, this._ondone); + + new JX.Workflow(uri, data) + .setHandler(ondone) + .start(); + }, + + _ondone: function(response) { + var checkbox = JX.DOM.find( + this._row, + 'input', + 'differential-inline-done'); + + checkbox.checked = (response.isChecked ? 'checked' : null); + + var comment = JX.DOM.findAbove( + checkbox, + 'div', + 'differential-inline-comment'); + + JX.DOM.alterClass(comment, 'inline-is-done', response.isChecked); + + // NOTE: This is marking the inline as having an unsubmitted checkmark, + // as opposed to a submitted checkmark. This is different from the + // top-level "draft" state of unsubmitted comments. + JX.DOM.alterClass(comment, 'inline-state-is-draft', response.draftState); + + this._isFixed = response.isChecked; + this._isDraftDone = !!response.draftState; + + this._didUpdate(); + }, + + create: function(content_state) { + var changeset = this.getChangeset(); + if (!this._documentEngineKey) { + this._documentEngineKey = changeset.getResponseDocumentEngineKey(); + } + + var uri = this._getInlineURI(); + var handler = JX.bind(this, this._oncreateresponse); + var data = this._newRequestData('new', content_state); + + this.setLoading(true); + + new JX.Request(uri, handler) + .setData(data) + .send(); + }, + + reply: function(with_quote) { + this._closeMenu(); + + var content_state = this._newContentState(); + if (with_quote) { + var text = this._getActiveContentState().getTextForQuote(); + content_state.text = text; + } + + var changeset = this.getChangeset(); + return changeset.newInlineReply(this, content_state); + }, + + edit: function(content_state, skip_focus) { + this._closeMenu(); + + this._skipFocus = !!skip_focus; + + // If you edit an inline ("A"), modify the text ("AB"), cancel, and then + // edit it again: discard the undo state ("AB"). Otherwise we end up + // with an open editor and an active "Undo" link, which is weird. + + if (this._undoRow) { + JX.DOM.remove(this._undoRow); + this._undoRow = null; + + this._undoType = null; + this._undoText = null; + } + + this._applyEdit(content_state); + }, + + delete: function(is_ref) { + var uri = this._getInlineURI(); + var handler = JX.bind(this, this._ondeleteresponse, false); + + // NOTE: This may be a direct delete (the user clicked on the inline + // itself) or a "refdelete" (the user clicked somewhere else, like the + // preview, but the inline is present on the page). + + // For a "refdelete", we prompt the user to confirm that they want to + // delete the comment, because they can not undo deletions from the + // preview. We could jump the user to the inline instead, but this would + // be somewhat disruptive and make deleting several comments more + // difficult. + + var op; + if (is_ref) { + op = 'refdelete'; + } else { + op = 'delete'; + } + + var data = this._newRequestData(op); + + this.setLoading(true); + + new JX.Workflow(uri, data) + .setHandler(handler) + .start(); + }, + + getDisplaySide: function() { + return this._displaySide; + }, + + getLineNumber: function() { + return this._number; + }, + + getLineLength: function() { + return this._length; + }, + + isNewFile: function() { + return this._isNewFile; + }, + + getID: function() { + return this._id; + }, + + getPHID: function() { + return this._phid; + }, + + getChangesetID: function() { + return this._changesetID; + }, + + getReplyToCommentPHID: function() { + return this._replyToCommentPHID; + }, + + setDeleted: function(deleted) { + this._isDeleted = deleted; + this._redraw(); + return this; + }, + + setInvisible: function(invisible) { + this._isInvisible = invisible; + this._redraw(); + return this; + }, + + setLoading: function(loading) { + this._isLoading = loading; + this._redraw(); + return this; + }, + + _newRequestData: function(operation, content_state) { + var data = { + op: operation, + is_new: this.isNewFile(), + on_right: ((this.getDisplaySide() == 'right') ? 1 : 0), + renderer: this.getChangeset().getRendererKey() + }; + + if (operation === 'new') { + var create_data = { + changesetID: this.getChangesetID(), + documentEngineKey: this._documentEngineKey, + replyToCommentPHID: this.getReplyToCommentPHID(), + startOffset: this._startOffset, + endOffset: this._endOffset, + number: this.getLineNumber(), + length: this.getLineLength() + }; + + JX.copy(data, create_data); + } else { + var edit_data = { + id: this._id + }; + + JX.copy(data, edit_data); + } + + if (content_state) { + data.hasContentState = 1; + JX.copy(data, content_state); + } + + return data; + }, + + _oneditresponse: function(response) { + var rows = JX.$H(response.view).getNode(); + + this._readInlineState(response.inline); + this._drawEditRows(rows); + + this.setInvisible(true); + }, + + _oncreateresponse: function(response) { + var rows = JX.$H(response.view).getNode(); + + this._readInlineState(response.inline); + this._drawEditRows(rows); + }, + + _readInlineState: function(state) { + this._id = state.id; + + this._state = { + initial: this._newContentStateFromWireFormat(state.state.initial), + committed: this._newContentStateFromWireFormat(state.state.committed), + active: this._newContentStateFromWireFormat(state.state.active) + }; + + this._canSuggestEdit = state.canSuggestEdit; + }, + + _newContentStateFromWireFormat: function(map) { + if (map === null) { + return null; + } + + return new JX.DiffInlineContentState().readWireFormat(map); + }, + + _ondeleteresponse: function(prevent_undo) { + if (!prevent_undo) { + // If there's an existing "unedit" undo element, remove it. + if (this._undoRow) { + JX.DOM.remove(this._undoRow); + this._undoRow = null; + } + + // If there's an existing editor, remove it. This happens when you + // delete a comment from the comment preview area. In this case, we + // read and preserve the text so "Undo" restores it. + var state = null; + if (this._editRow) { + state = this._getActiveContentState().getWireFormat(); + JX.DOM.remove(this._editRow); + this._editRow = null; + } + + this._drawUndeleteRows(state); + } + + this.setLoading(false); + this.setDeleted(true); + + this._didUpdate(); + }, + + _drawUndeleteRows: function(content_state) { + this._undoType = 'undelete'; + this._undoState = content_state || null; + + return this._drawUndoRows('undelete', this._row); + }, + + _drawUneditRows: function(content_state) { + this._undoType = 'unedit'; + this._undoState = content_state; + + return this._drawUndoRows('unedit', null); + }, + + _drawUndoRows: function(mode, cursor) { + var templates = this.getChangeset().getUndoTemplates(); + + var template; + if (this.getDisplaySide() == 'right') { + template = templates.r; + } else { + template = templates.l; + } + template = JX.$H(template).getNode(); + + this._undoRow = this._drawRows(template, cursor, mode); + }, + + _drawContentRows: function(rows) { + return this._drawRows(rows, null, 'content'); + }, + + _drawEditRows: function(rows) { + this.setEditing(true); + this._editRow = this._drawRows(rows, null, 'edit'); + + this._drawSuggestionState(this._editRow); + + // TODO: We're just doing this for the rendering side effect of drawing + // the button text. + this.setHasSuggestion(this.getHasSuggestion()); + }, + + _drawRows: function(rows, cursor, type) { + var first_row = JX.DOM.scry(rows, 'tr')[0]; + var row = first_row; + var anchor = cursor || this._row; + cursor = cursor || this._row.nextSibling; + + var result_row; + var next_row; + while (row) { + // Grab this first, since it's going to change once we insert the row + // into the document. + next_row = row.nextSibling; + + // Bind edit and undo rows to this DiffInline object so that + // interactions like hovering work properly. + JX.Stratcom.getData(row).inline = this; + + anchor.parentNode.insertBefore(row, cursor); + cursor = row; + + if (!result_row) { + result_row = row; + } + + if (!this._skipFocus) { + // If the row has a textarea, focus it. This allows the user to start + // typing a comment immediately after a "new", "edit", or "reply" + // action. + + // (When simulating an "edit" on page load, we don't do this.) + + var textareas = JX.DOM.scry( + row, + 'textarea', + 'inline-content-text'); + if (textareas.length) { + var area = textareas[0]; + area.focus(); + + var length = area.value.length; + JX.TextAreaUtils.setSelectionRange(area, length, length); + } + } + + row = next_row; + } + + JX.Stratcom.invoke('resize'); + + return result_row; + }, + + _drawSuggestionState: function(row) { + if (this._canSuggestEdit) { + var button = this._getSuggestionButton(); + var node = button.getNode(); + + // As a side effect of form submission, the button may become + // visually disabled. Re-enable it. This is a bit hacky. + JX.DOM.alterClass(node, 'disabled', false); + node.disabled = false; + + var container = JX.DOM.find(row, 'div', 'inline-edit-buttons'); + container.appendChild(node); + } + }, + + _getSuggestionButton: function() { + if (!this._suggestionButton) { + var button = new JX.PHUIXButtonView() + .setIcon('fa-pencil-square-o') + .setColor('grey'); + + var node = button.getNode(); + JX.DOM.alterClass(node, 'inline-button-left', true); + + var onclick = JX.bind(this, this._onSuggestEdit); + JX.DOM.listen(node, 'click', null, onclick); + + this._suggestionButton = button; + } + + return this._suggestionButton; + }, + + _onSuggestEdit: function(e) { + e.kill(); + + this.setHasSuggestion(!this.getHasSuggestion()); + + // Resize the suggestion input for size of the text. + if (this.getHasSuggestion()) { + if (this._editRow) { + var node = this._getSuggestionNode(this._editRow); + if (node) { + node.rows = Math.max(3, node.value.split('\n').length); + } + } + } + + // Save the "hasSuggestion" part of the content state. + this.triggerDraft(); + }, + + _getActiveContentState: function() { + var state = this._state.active; + + if (this._editRow) { + state.readForm(this._editRow); + } + + return state; + }, + + _getCommittedContentState: function() { + return this._state.committed; + }, + + _getInitialContentState: function() { + return this._state.initial; + }, + + setHasSuggestion: function(has_suggestion) { + var state = this._getActiveContentState(); + state.setHasSuggestion(has_suggestion); + + var button = this._getSuggestionButton(); + var pht = this.getChangeset().getChangesetList().getTranslations(); + if (has_suggestion) { + button + .setIcon('fa-times') + .setText(pht('Discard Edit')); + } else { + button + .setIcon('fa-plus') + .setText(pht('Suggest Edit')); + } + + if (this._editRow) { + JX.DOM.alterClass(this._editRow, 'has-suggestion', has_suggestion); + } + }, + + getHasSuggestion: function() { + return this._getActiveContentState().getHasSuggestion(); + }, + + save: function() { + if (this._shouldDeleteOnSave()) { + JX.DOM.remove(this._editRow); + this._editRow = null; + + this._applyDelete(true); + return; + } + + this._applySave(); + }, + + _shouldDeleteOnSave: function() { + var active = this._getActiveContentState(); + var initial = this._getInitialContentState(); + + // When a user clicks "Save", it counts as a "delete" if the content + // of the comment is functionally empty. + + // This isn't a delete if there's any text. Even if the text is a + // quote (so the state is the same as the initial state), we preserve + // it when the user clicks "Save". + if (!active.isTextEmpty()) { + return false; + } + + // This isn't a delete if there's a suggestion and that suggestion is + // different from the initial state. (This means that an inline which + // purely suggests a block of code should be deleted is non-empty.) + if (active.getHasSuggestion()) { + if (!active.isSuggestionSimilar(initial)) { + return false; + } + } + + // Otherwise, this comment is functionally empty, so we can just treat + // a "Save" as a "delete". + return true; + }, + + _shouldUndoOnCancel: function() { + var committed = this._getCommittedContentState(); + var active = this._getActiveContentState(); + var initial = this._getInitialContentState(); + + // When a user clicks "Cancel", we only offer to let them "Undo" the + // action if the undo would be substantive. + + // The undo is substantive if the text is nonempty, and not similar to + // the last state. + var versus = committed || initial; + if (!active.isTextEmpty() && !active.isTextSimilar(versus)) { + return true; + } + + // The undo is substantive if there's a suggestion, and the suggestion + // is not similar to the last state. + if (active.getHasSuggestion()) { + if (!active.isSuggestionSimilar(versus)) { + return true; + } + } + + return false; + }, + + _applySave: function() { + var handler = JX.bind(this, this._onsaveresponse); + + var state = this._getActiveContentState(); + var data = this._newRequestData('save', state.getWireFormat()); + + this._applyCall(handler, data); + }, + + _applyDelete: function(prevent_undo) { + var handler = JX.bind(this, this._ondeleteresponse, prevent_undo); + + var data = this._newRequestData('delete'); + + this._applyCall(handler, data); + }, + + _applyCancel: function(state) { + var handler = JX.bind(this, this._onCancelResponse); + + var data = this._newRequestData('cancel', state); + + this._applyCall(handler, data); + }, + + _applyEdit: function(state) { + var handler = JX.bind(this, this._oneditresponse); + + var data = this._newRequestData('edit', state); + + this._applyCall(handler, data); + }, + + _applyCall: function(handler, data) { + var uri = this._getInlineURI(); + + var callback = JX.bind(this, function() { + this.setLoading(false); + handler.apply(null, arguments); + }); + + this.setLoading(true); + + new JX.Workflow(uri, data) + .setHandler(callback) + .start(); + }, + + undo: function() { + JX.DOM.remove(this._undoRow); + this._undoRow = null; + + if (this._undoType === 'undelete') { + var uri = this._getInlineURI(); + var data = this._newRequestData('undelete'); + var handler = JX.bind(this, this._onundelete); + + this.setDeleted(false); + this.setLoading(true); + + new JX.Request(uri, handler) + .setData(data) + .send(); + } + + if (this._undoState !== null) { + this.edit(this._undoState); + } + }, + + _onundelete: function() { + this.setLoading(false); + this._didUpdate(); + }, + + cancel: function() { + // NOTE: Read the state before we remove the editor. Otherwise, we might + // miss text the user has entered into the textarea. + var state = this._getActiveContentState().getWireFormat(); + + JX.DOM.remove(this._editRow); + this._editRow = null; + + // When a user clicks "Cancel", we delete the comment if it has never + // been saved: we don't have a non-empty display state to revert to. + var is_delete = (this._getCommittedContentState() === null); + + var is_undo = this._shouldUndoOnCancel(); + + // If you "undo" to restore text ("AB") and then "Cancel", we put you + // back in the original text state ("A"). We also send the original + // text ("A") to the server as the current persistent state. + + if (is_undo) { + this._drawUneditRows(state); + } + + if (is_delete) { + // NOTE: We're always suppressing the undo from "delete". We want to + // use the "undo" we just added above instead, which will get us + // back to the ephemeral, client-side editor state. + this._applyDelete(true); + } else { + this.setEditing(false); + this.setInvisible(false); + + var old_state = this._getCommittedContentState(); + this._applyCancel(old_state.getWireFormat()); + + this._didUpdate(true); + } + }, + + _onCancelResponse: function(response) { + // Nothing to do. + }, + + _getSuggestionNode: function(row) { + try { + return JX.DOM.find(row, 'textarea', 'inline-content-suggestion'); + } catch (ex) { + return null; + } + }, + + _onsaveresponse: function(response) { + if (this._editRow) { + JX.DOM.remove(this._editRow); + this._editRow = null; + } + + this.setEditing(false); + this.setInvisible(false); + + var new_row = this._drawContentRows(JX.$H(response.view).getNode()); + JX.DOM.remove(this._row); + this.bindToRow(new_row); + + this._didUpdate(); + }, + + _didUpdate: function(local_only) { + // After making changes to inline comments, refresh the transaction + // preview at the bottom of the page. + if (!local_only) { + this.getChangeset().getChangesetList().redrawPreview(); + } + + this.getChangeset().getChangesetList().redrawCursor(); + this.getChangeset().getChangesetList().resetHover(); + + // Emit a resize event so that UI elements like the keyboard focus + // reticle can redraw properly. + JX.Stratcom.invoke('resize'); + }, + + _redraw: function() { + var is_invisible = + (this._isInvisible || this._isDeleted || this._isHidden); + var is_loading = this._isLoading; + var is_collapsed = (this._isCollapsed && !this._isHidden); + + var row = this._row; + JX.DOM.alterClass(row, 'differential-inline-hidden', is_invisible); + JX.DOM.alterClass(row, 'differential-inline-loading', is_loading); + JX.DOM.alterClass(row, 'inline-hidden', is_collapsed); + }, + + _getInlineURI: function() { + var changeset = this.getChangeset(); + var list = changeset.getChangesetList(); + return list.getInlineURI(); + }, + + _startDrafts: function() { + if (this._draftRequest) { + return; + } + + var onresponse = JX.bind(this, this._onDraftResponse); + var draft = JX.bind(this, this._getDraftState); + + var uri = this._getInlineURI(); + var request = new JX.PhabricatorShapedRequest(uri, onresponse, draft); + + // The main transaction code uses a 500ms delay on desktop and a + // 10s delay on mobile. Perhaps this should be standardized. + request.setRateLimit(2000); + + this._draftRequest = request; + + request.start(); + }, + + _onDraftResponse: function() { + // For now, do nothing. + }, + + _getDraftState: function() { + if (this.isDeleted()) { + return null; + } + + if (!this.isEditing()) { + return null; + } + + var state = this._getActiveContentState(); + if (state.isStateEmpty()) { + return null; + } + + var draft_data = { + op: 'draft', + id: this.getID(), + }; + + JX.copy(draft_data, state.getWireFormat()); + + return draft_data; + }, + + triggerDraft: function() { + if (this._draftRequest) { + this._draftRequest.trigger(); + } + }, + + activateMenu: function(button, e) { + // If we already have a menu for this button, let the menu handle the + // event. + var data = JX.Stratcom.getData(button); + if (data.menu) { + return; + } + + e.prevent(); + + var menu = new JX.PHUIXDropdownMenu(button) + .setWidth(240); + + var list = new JX.PHUIXActionListView(); + var items = this._newMenuItems(menu); + for (var ii = 0; ii < items.length; ii++) { + list.addItem(items[ii]); + } + + menu.setContent(list.getNode()); + + data.menu = menu; + this._menu = menu; + + menu.listen('open', JX.bind(this, function() { + var changeset_list = this.getChangeset().getChangesetList(); + changeset_list.selectInline(this, true); + })); + + menu.open(); + }, + + _newMenuItems: function(menu) { + var items = []; + + for (var ii = 0; ii < this._menuItems.length; ii++) { + var spec = this._menuItems[ii]; + + var onmenu = JX.bind(this, this._onMenuItem, menu, spec.action, spec); + + var item = new JX.PHUIXActionView() + .setIcon(spec.icon) + .setName(spec.label) + .setHandler(onmenu); + + if (spec.key) { + item.setKeyCommand(spec.key); + } + + items.push(item); + } + + return items; + }, + + _onMenuItem: function(menu, action, spec, e) { + e.prevent(); + menu.close(); + + switch (action) { + case 'reply': + this.reply(); + break; + case 'quote': + this.reply(true); + break; + case 'collapse': + this.setCollapsed(true); + break; + case 'delete': + this.delete(); + break; + case 'edit': + this.edit(); + break; + case 'raw': + new JX.Workflow(spec.uri) + .start(); + break; + } + + }, + + _hasMenuAction: function(action) { + for (var ii = 0; ii < this._menuItems.length; ii++) { + var spec = this._menuItems[ii]; + if (spec.action === action) { + return true; + } + } + return false; + }, + + _closeMenu: function() { + if (this._menu) { + this._menu.close(); + } + }, + + _newContentState: function() { + return { + text: '', + suggestionText: '', + hasSuggestion: false + }; + } + + } + +}); diff --git a/webroot/rsrc/js/application/diff/DiffInlineContentState.js b/webroot/rsrc/js/application/diff/DiffInlineContentState.js new file mode 100644 index 0000000000..0ac8628e74 --- /dev/null +++ b/webroot/rsrc/js/application/diff/DiffInlineContentState.js @@ -0,0 +1,137 @@ +/** + * @provides phabricator-diff-inline-content-state + * @requires javelin-dom + * @javelin + */ + +JX.install('DiffInlineContentState', { + + construct : function() { + + }, + + properties: { + text: null, + suggestionText: null, + hasSuggestion: false + }, + + members: { + readForm: function(row) { + var node; + + try { + node = JX.DOM.find(row, 'textarea', 'inline-content-text'); + this.setText(node.value); + } catch (ex) { + this.setText(null); + } + + node = this._getSuggestionNode(row); + if (node) { + this.setSuggestionText(node.value); + } else { + this.setSuggestionText(null); + } + + return this; + }, + + getWireFormat: function() { + return { + text: this.getText(), + suggestionText: this.getSuggestionText(), + hasSuggestion: this.getHasSuggestion() + }; + }, + + readWireFormat: function(map) { + this.setText(map.text || null); + this.setSuggestionText(map.suggestionText || null); + this.setHasSuggestion(!!map.hasSuggestion); + + return this; + }, + + getTextForQuote: function() { + var text = this.getText(); + text = '> ' + text.replace(/\n/g, '\n> ') + '\n\n'; + return text; + }, + + isStateEmpty: function() { + return (this.isTextEmpty() && this.isSuggestionEmpty()); + }, + + isTextEmpty: function() { + var text = this.getText(); + if (text === null) { + return true; + } + + if (this._isStringSimilar(text, '')) { + return true; + } + + return false; + }, + + isSuggestionEmpty: function() { + if (!this.getHasSuggestion()) { + return true; + } + + var suggestion = this.getSuggestionText(); + if (suggestion === null) { + return true; + } + + if (this._isStringSimilar(suggestion, '')) { + return true; + } + + return false; + }, + + isTextSimilar: function(v) { + if (!v) { + return false; + } + + var us = this.getText(); + var vs = v.getText(); + + return this._isStringSimilar(us, vs); + }, + + isSuggestionSimilar: function(v) { + // If we don't have a comparison state, treat them as dissimilar. This + // is expected to occur in old inline comments that did not save an + // initial state. + + if (!v) { + return false; + } + + var us = this.getSuggestionText(); + var vs = v.getSuggestionText(); + + return this._isStringSimilar(us, vs); + }, + + _isStringSimilar: function(u, v) { + u = u || ''; + v = v || ''; + return (u === v); + }, + + _getSuggestionNode: function(row) { + try { + return JX.DOM.find(row, 'textarea', 'inline-content-suggestion'); + } catch (ex) { + return null; + } + } + } + +}); diff --git a/webroot/rsrc/js/application/diff/DiffPathView.js b/webroot/rsrc/js/application/diff/DiffPathView.js new file mode 100644 index 0000000000..58c8866c21 --- /dev/null +++ b/webroot/rsrc/js/application/diff/DiffPathView.js @@ -0,0 +1,265 @@ +/** + * @provides phabricator-diff-path-view + * @requires javelin-dom + * @javelin + */ + +JX.install('DiffPathView', { + + construct: function() { + }, + + members: { + _node: null, + _path: null, + _depth: 0, + _selected: false, + _focused: false, + _icon: null, + + _indentNode: null, + _pathNode: null, + _changeset: null, + _inlineNode: null, + _isDirectory: false, + _displayPath: null, + _isLowImportance: false, + _isOwned: false, + _isHidden: false, + _isLoading: false, + + getNode: function() { + if (!this._node) { + var attrs = { + className: 'diff-tree-path' + }; + + this._node = JX.$N('li', attrs, this._getIndentNode()); + + var onclick = JX.bind(this, this._onclick); + JX.DOM.listen(this._node, 'click', null, onclick); + } + return this._node; + }, + + getIcon: function() { + if (!this._icon) { + this._icon = new JX.PHUIXIconView(); + } + return this._icon; + }, + + setPath: function(path) { + this._path = path; + this._redrawPath(); + return this; + }, + + setDisplayPath: function(path) { + this._displayPath = path; + this._redrawPath(); + return this; + }, + + setIsDirectory: function(is_directory) { + this._isDirectory = is_directory; + this._redrawPath(); + return this; + }, + + setChangeset: function(changeset) { + this._changeset = changeset; + + var node = this.getNode(); + JX.DOM.alterClass(node, 'diff-tree-path-changeset', !!changeset); + + return this; + }, + + getChangeset: function() { + return this._changeset; + }, + + getPath: function() { + return this._path; + }, + + setHidden: function(hidden) { + this._hidden = hidden; + + var node = this.getNode(); + if (this._hidden) { + JX.DOM.hide(node); + } else { + JX.DOM.show(node); + } + + return this; + }, + + setDepth: function(depth) { + this._depth = depth; + + this._getIndentNode().style.marginLeft = (8 * this._depth) + 'px'; + + return this; + }, + + setIsSelected: function(selected) { + this._selected = selected; + + var node = this.getNode(); + JX.DOM.alterClass(node, 'diff-tree-path-selected', this._selected); + + return this; + }, + + setIsFocused: function(focused) { + this._focused = focused; + + var node = this.getNode(); + JX.DOM.alterClass(node, 'diff-tree-path-focused', this._focused); + + return this; + }, + + setIsLowImportance: function(low_importance) { + this._isLowImportance = low_importance; + + var node = this.getNode(); + JX.DOM.alterClass( + node, + 'diff-tree-path-low-importance', + this._isLowImportance); + + return this; + }, + + setIsOwned: function(owned) { + this._isOwned = owned; + + var node = this.getNode(); + JX.DOM.alterClass(node, 'diff-tree-path-owned', this._isOwned); + + return this; + }, + + setIsHidden: function(hidden) { + this._isHidden = hidden; + + var node = this.getNode(); + JX.DOM.alterClass(node, 'diff-tree-path-hidden', this._isHidden); + + return this; + }, + + setIsLoading: function(loading) { + this._isLoading = loading; + + var node = this.getNode(); + JX.DOM.alterClass(node, 'diff-tree-path-loading', this._isLoading); + + return this; + }, + + _onclick: function(e) { + if (!e.isNormalClick()) { + return; + } + + var changeset = this.getChangeset(); + if (changeset) { + changeset.select(true); + } + + e.kill(); + }, + + _getIndentNode: function() { + if (!this._indentNode) { + var attrs = { + className: 'diff-tree-path-indent' + }; + + var content = [ + this.getInlineNode(), + this._getHiddenIconNode(), + this._getIconNode(), + this._getPathNode(), + ]; + + this._indentNode = JX.$N('div', attrs, content); + } + + return this._indentNode; + }, + + _getPathNode: function() { + if (!this._pathNode) { + var attrs = { + className: 'diff-tree-path-name' + }; + this._pathNode = JX.$N('div', attrs); + } + return this._pathNode; + }, + + _getIconNode: function() { + if (!this._iconNode) { + var attrs = { + className: 'diff-tree-path-icon diff-tree-path-icon-kind', + }; + this._iconNode = JX.$N('div', attrs, this.getIcon().getNode()); + } + return this._iconNode; + }, + + _getHiddenIconNode: function() { + if (!this._hiddenIconNode) { + var attrs = { + className: 'diff-tree-path-icon diff-tree-path-icon-hidden', + }; + this._hiddenIconNode = + JX.$N('div', attrs, this._getHiddenIcon().getNode()); + } + return this._hiddenIconNode; + }, + + _getHiddenIcon: function() { + if (!this._hiddenIcon) { + this._hiddenIcon = new JX.PHUIXIconView() + .setIcon('fa-times-circle-o'); + } + return this._hiddenIcon; + }, + + getInlineNode: function() { + if (!this._inlineNode) { + var attrs = { + className: 'diff-tree-path-inlines', + }; + this._inlineNode = JX.$N('div', attrs, '-'); + } + return this._inlineNode; + }, + + _redrawPath: function() { + var display; + if (this._displayPath) { + display = this._displayPath; + } else { + display = this._path[this._path.length - 1]; + } + + var is_directory = this._isDirectory; + + if (is_directory) { + display = display + '/'; + } + + JX.DOM.setContent(this._getPathNode(), display); + } + + } + +}); diff --git a/webroot/rsrc/js/application/diff/DiffTreeView.js b/webroot/rsrc/js/application/diff/DiffTreeView.js new file mode 100644 index 0000000000..a467ceb591 --- /dev/null +++ b/webroot/rsrc/js/application/diff/DiffTreeView.js @@ -0,0 +1,256 @@ +/** + * @provides phabricator-diff-tree-view + * @requires javelin-dom + * @javelin + */ + +JX.install('DiffTreeView', { + + construct: function() { + this._keys = []; + this._tree = this._newTreeNode(null, [], 0); + this._nodes = {}; + this._paths = []; + }, + + members: { + _node: null, + _keys: null, + _tree: null, + _nodes: null, + _dirty: false, + _paths: null, + _selectedPath: null, + _focusedPath: null, + + getNode: function() { + if (!this._node) { + var attrs = { + className: 'diff-tree-view' + }; + + this._node = JX.$N('ul', attrs); + } + + if (this._dirty) { + this.redraw(); + } + + return this._node; + }, + + addPath: function(path) { + this._paths.push(path); + + var tree = this._getTree(this._tree, path.getPath(), 0); + tree.pathObject = path; + + this._dirty = true; + + return this; + }, + + getPaths: function() { + return this._paths; + }, + + setSelectedPath: function(path) { + if (this._selectedPath) { + this._selectedPath.setIsSelected(false); + this._selectedPath = null; + } + + if (path) { + path.setIsSelected(true); + } + + this._selectedPath = path; + + return this; + }, + + setFocusedPath: function(path) { + if (this._focusedPath) { + this._focusedPath.setIsFocused(false); + this._focusedPath = null; + } + + if (path) { + path.setIsFocused(true); + } + + this._focusedPath = path; + + return this; + }, + + redraw: function() { + if (!this._dirty) { + return; + } + this._dirty = false; + + var ii; + + // For nodes which don't have a path object yet, build one. + var tree; + var path; + var trees = []; + for (ii = 0; ii < this._keys.length; ii++) { + var key = this._keys[ii]; + tree = this._nodes[key]; + path = tree.pathObject; + + if (!path) { + path = new JX.DiffPathView() + .setPath(tree.parts); + + path.getIcon() + .setIcon('fa-folder-open-o') + .setColor('grey'); + + tree.pathObject = path; + } + + trees.push(tree); + } + + for (ii = 0; ii < trees.length; ii++) { + tree = trees[ii]; + tree.displayRoot = null; + tree.displayPath = null; + tree.displayHide = false; + } + + var child; + for (ii = 0; ii < trees.length; ii++) { + tree = trees[ii]; + + if (tree.childCount !== 1) { + continue; + } + + for (var k in tree.children) { + if (tree.children.hasOwnProperty(k)) { + child = tree.children[k]; + break; + } + } + + if (child.pathObject.getChangeset()) { + continue; + } + + child.displayRoot = tree.displayRoot || tree; + } + + for (ii = 0; ii < trees.length; ii++) { + tree = trees[ii]; + + if (!tree.displayRoot) { + continue; + } + + if (!tree.displayRoot.displayPath) { + tree.displayRoot.displayPath = [ + tree.displayRoot.parts[tree.displayRoot.parts.length - 1] + ]; + } + + tree.displayRoot.displayPath.push(tree.parts[tree.parts.length - 1]); + tree.displayHide = true; + } + + for (ii = 0; ii < trees.length; ii++) { + tree = trees[ii]; + path = tree.pathObject; + + path.setHidden(!!tree.displayHide); + + if (tree.displayPath) { + path.setDisplayPath(tree.displayPath.join('/')); + } else { + path.setDisplayPath(null); + } + } + + for (ii = 0; ii < trees.length; ii++) { + tree = trees[ii]; + + if (!tree.parent) { + tree.depth = 0; + } else { + // If this node was collapsed into the parent node, don't increase + // the tree depth. + if (tree.displayHide) { + tree.depth = tree.parent.depth; + } else { + tree.depth = tree.parent.depth + 1; + } + } + + path = tree.pathObject; + + if (tree.childCount > 0) { + path.setIsDirectory(true); + } + + path.setDepth((tree.depth - 1)); + } + + var nodes = []; + for (ii = 0; ii < trees.length; ii++) { + tree = trees[ii]; + nodes.push(tree.pathObject.getNode()); + } + + JX.DOM.setContent(this.getNode(), nodes); + }, + + _getTree: function(root, path, ii) { + if (ii >= path.length) { + return root; + } + + var part = path[ii]; + + if (!root.children.hasOwnProperty(part)) { + root.children[part] = this._newTreeNode(root, path, ii); + root.childCount++; + } + + return this._getTree(root.children[part], path, ii + 1); + }, + + _newTreeNode: function(parent, path, ii) { + var key; + var parts; + if (path.length) { + parts = path.slice(0, ii + 1); + key = parts.join('/'); + this._keys.push(key); + } else { + parts = []; + key = null; + } + + var node = { + parent: parent, + nodeKey: key, + parts: parts, + children: {}, + pathObject: null, + childCount: 0, + depth: 0 + }; + + if (key !== null) { + this._nodes[key] = node; + } + + return node; + } + + } + +}); diff --git a/webroot/rsrc/js/application/differential/DifferentialInlineCommentEditor.js b/webroot/rsrc/js/application/differential/DifferentialInlineCommentEditor.js deleted file mode 100644 index b0a2ec8e3b..0000000000 --- a/webroot/rsrc/js/application/differential/DifferentialInlineCommentEditor.js +++ /dev/null @@ -1,275 +0,0 @@ -/** - * @provides differential-inline-comment-editor - * @requires javelin-dom - * javelin-util - * javelin-stratcom - * javelin-install - * javelin-request - * javelin-workflow - */ - -JX.install('DifferentialInlineCommentEditor', { - - construct : function(uri) { - this._uri = uri; - }, - - events : ['done'], - - members : { - _uri : null, - _undoText : null, - _skipOverInlineCommentRows : function(node) { - // TODO: Move this semantic information out of class names. - while (node && node.className.indexOf('inline') !== -1) { - node = node.nextSibling; - } - return node; - }, - _buildRequestData : function() { - return { - op : this.getOperation(), - on_right : this.getOnRight(), - id : this.getID(), - number : this.getLineNumber(), - is_new : this.getIsNew(), - length : this.getLength(), - changeset : this.getChangeset(), - text : this.getText() || '' - }; - }, - _draw : function(content, exact_row) { - var row = this.getRow(); - var table = this.getTable(); - var target = exact_row ? row : this._skipOverInlineCommentRows(row); - - return copyRows(table, content, target); - }, - _removeUndoLink : function() { - var rows = JX.DifferentialInlineCommentEditor._undoRows; - if (rows) { - for (var ii = 0; ii < rows.length; ii++) { - JX.DOM.remove(rows[ii]); - } - } - }, - _undo : function() { - this._removeUndoLink(); - - this.setText(this._undoText); - this.start(); - }, - _registerUndoListener : function() { - if (!JX.DifferentialInlineCommentEditor._activeEditor) { - JX.Stratcom.listen( - 'click', - 'differential-inline-comment-undo', - function(e) { - JX.DifferentialInlineCommentEditor._activeEditor._undo(); - e.kill(); - }); - } - JX.DifferentialInlineCommentEditor._activeEditor = this; - }, - _setRowState : function(state) { - var is_hidden = (state == 'hidden'); - var is_loading = (state == 'loading'); - var row = this.getRow(); - JX.DOM.alterClass(row, 'differential-inline-hidden', is_hidden); - JX.DOM.alterClass(row, 'differential-inline-loading', is_loading); - }, - _didContinueWorkflow : function(response) { - var drawn = this._draw(JX.$N('div', JX.$H(response))); - - var op = this.getOperation(); - if (op == 'edit') { - this._setRowState('hidden'); - } - - JX.DOM.find( - drawn[0], - 'textarea', - 'differential-inline-comment-edit-textarea').focus(); - - var oncancel = JX.bind(this, function(e) { - e.kill(); - - this._didCancelWorkflow(); - - if (op == 'edit') { - this._setRowState('visible'); - } - - JX.DOM.remove(drawn[0]); - }); - JX.DOM.listen(drawn[0], 'click', 'inline-edit-cancel', oncancel); - - var onsubmit = JX.bind(this, function(e) { - e.kill(); - - JX.Workflow.newFromForm(e.getTarget()) - .setHandler(JX.bind(this, function(response) { - JX.DOM.remove(drawn[0]); - if (op == 'edit') { - this._setRowState('visible'); - } - this._didCompleteWorkflow(response); - })) - .start(); - - JX.DOM.alterClass(drawn[0], 'differential-inline-loading', true); - }); - JX.DOM.listen( - drawn[0], - ['submit', 'didSyntheticSubmit'], - 'inline-edit-form', - onsubmit); - }, - _didCompleteWorkflow : function(response) { - var op = this.getOperation(); - - // We don't get any markup back if the user deletes a comment, or saves - // an empty comment (which effects a delete). - if (response.markup) { - this._draw(JX.$N('div', JX.$H(response.markup))); - } - - // These operations remove the old row (edit adds a new row first). - var remove_old = (op == 'edit' || op == 'delete'); - if (remove_old) { - JX.DOM.remove(this.getRow()); - var other_rows = this.getOtherRows(); - for(var i = 0; i < other_rows.length; ++i) { - JX.DOM.remove(other_rows[i]); - } - } - - // Once the user saves something, get rid of the 'undo' option. A - // particular case where we need this is saving a delete, when we might - // otherwise leave around an 'undo' for an earlier edit to the same - // comment. - this._removeUndoLink(); - - JX.Stratcom.invoke('differential-inline-comment-update'); - this.invoke('done'); - }, - _didCancelWorkflow : function() { - this.invoke('done'); - - var op = this.getOperation(); - if (op == 'delete') { - // No undo for delete, we prompt the user explicitly. - return; - } - - var textarea; - try { - textarea = JX.DOM.find( - document.body, // TODO: use getDialogRootNode() when available - 'textarea', - 'differential-inline-comment-edit-textarea'); - } catch (ex) { - // The close handler is called whenever the dialog closes, even if the - // user closed it by completing the workflow with "Save". The - // JX.Workflow API should probably be refined to allow programmatic - // distinction of close caused by 'cancel' vs 'submit'. Testing for - // presence of the textarea serves as a proxy for detecting a 'cancel'. - return; - } - - var text = textarea.value; - - // If the user hasn't edited the text (i.e., no change from original for - // 'edit' or no text at all), don't offer them an undo. - if (text == this.getOriginalText() || text === '') { - return; - } - - // Save the text so we can 'undo' back to it. - this._undoText = text; - - var templates = this.getTemplates(); - var template = this.getOnRight() ? templates.r : templates.l; - template = JX.$N('div', JX.$H(template)); - - // NOTE: Operation order matters here; we can't remove anything until - // after we draw the new rows because _draw uses the old rows to figure - // out where to place the comment. - - // We use 'exact_row' to put the "undo" text directly above the affected - // comment. - var exact_row = true; - var rows = this._draw(template, exact_row); - - this._removeUndoLink(); - - JX.DifferentialInlineCommentEditor._undoRows = rows; - }, - - start : function() { - this._registerUndoListener(); - - var data = this._buildRequestData(); - - var op = this.getOperation(); - - - if (op == 'delete') { - this._setRowState('loading'); - var oncomplete = JX.bind(this, this._didCompleteWorkflow); - var onclose = JX.bind(this, function() { - this._setRowState('visible'); - this._didCancelWorkflow(); - }); - - new JX.Workflow(this._uri, data) - .setHandler(oncomplete) - .setCloseHandler(onclose) - .start(); - } else { - var handler = JX.bind(this, this._didContinueWorkflow); - - if (op == 'edit') { - this._setRowState('loading'); - } - - new JX.Request(this._uri, handler) - .setData(data) - .send(); - } - - return this; - } - }, - - statics : { - /** - * Global refernece to the 'undo' rows currently rendered in the document. - */ - _undoRows : null, - - /** - * Global listener for the 'undo' click associated with the currently - * displayed 'undo' link. When an editor is start()ed, it becomes the active - * editor. - */ - _activeEditor : null - }, - - properties : { - operation : null, - row : null, - otherRows: [], - table : null, - onRight : null, - ID : null, - lineNumber : null, - changeset : null, - length : null, - isNew : null, - text : null, - templates : null, - originalText : null - } - -}); diff --git a/webroot/rsrc/js/application/differential/behavior-accept-with-errors.js b/webroot/rsrc/js/application/differential/behavior-accept-with-errors.js deleted file mode 100644 index 676967f6fc..0000000000 --- a/webroot/rsrc/js/application/differential/behavior-accept-with-errors.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @provides javelin-behavior-differential-accept-with-errors - * @requires javelin-behavior - * javelin-dom - */ - -JX.behavior('differential-accept-with-errors', function(config) { - if (config.warnings) { - toggleWarning(); - JX.DOM.listen( - JX.$(config.select), - 'change', - null, - toggleWarning); - } - - function toggleWarning() { - if (JX.$(config.select).value == 'accept') { - JX.DOM.show(JX.$(config.warnings)); - } else { - JX.DOM.hide(JX.$(config.warnings)); - } - } - -}); diff --git a/webroot/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js b/webroot/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js deleted file mode 100644 index 216c1d4492..0000000000 --- a/webroot/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @provides javelin-behavior-differential-add-reviewers-and-ccs - * @requires javelin-behavior - * javelin-dom - * phabricator-prefab - */ - -JX.behavior('differential-add-reviewers-and-ccs', function(config) { - - var dynamic = {}; - for (var k in config.dynamic) { - var props = config.dynamic[k]; - props.id = k; - - var tokenizer = JX.Prefab.buildTokenizer(props).tokenizer; - tokenizer.start(); - - dynamic[k] = { - row : JX.$(props.row), - tokenizer : tokenizer, - actions : props.actions, - labels: props.labels - }; - } - - JX.DOM.listen( - JX.$(config.select), - 'change', - null, - function(e) { - var v = JX.$(config.select).value; - for (var k in dynamic) { - if (dynamic[k].actions[v]) { - JX.DOM.show(dynamic[k].row); - if (dynamic[k].labels) { - var label_node = JX.DOM.find(dynamic[k].row, 'label'); - if (label_node) { - JX.DOM.setContent(label_node, dynamic[k].labels[v]); - } - } - dynamic[k].tokenizer.refresh(); - } else { - JX.DOM.hide(dynamic[k].row); - } - } - }); -}); - diff --git a/webroot/rsrc/js/application/differential/behavior-comment-jump.js b/webroot/rsrc/js/application/differential/behavior-comment-jump.js deleted file mode 100644 index 9c971df11e..0000000000 --- a/webroot/rsrc/js/application/differential/behavior-comment-jump.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @provides javelin-behavior-differential-comment-jump - * @requires javelin-behavior - * javelin-stratcom - * javelin-dom - */ - -JX.behavior('differential-comment-jump', function(config) { - function handle_jump(offset) { - return (function(e) { - var parent = JX.$('differential-review-stage'); - var clicked = e.getNode('differential-inline-comment'); - var inlines = JX.DOM.scry(parent, 'div', 'differential-inline-comment'); - var jumpto = null; - - for (var ii = 0; ii < inlines.length; ii++) { - if (inlines[ii] == clicked) { - jumpto = inlines[(ii + offset + inlines.length) % inlines.length]; - break; - } - } - JX.Stratcom.invoke('differential-toggle-file-request', null, { - element: jumpto - }); - JX.DOM.scrollTo(jumpto); - e.kill(); - }); - } - - JX.Stratcom.listen('click', 'differential-inline-prev', handle_jump(-1)); - JX.Stratcom.listen('click', 'differential-inline-next', handle_jump(+1)); -}); diff --git a/webroot/rsrc/js/application/differential/behavior-comment-preview.js b/webroot/rsrc/js/application/differential/behavior-comment-preview.js deleted file mode 100644 index c7b789d566..0000000000 --- a/webroot/rsrc/js/application/differential/behavior-comment-preview.js +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @provides javelin-behavior-differential-feedback-preview - * @requires javelin-behavior - * javelin-stratcom - * javelin-dom - * javelin-request - * javelin-util - * phabricator-shaped-request - */ - -JX.behavior('differential-feedback-preview', function(config) { - - var action = JX.$(config.action); - var content = JX.$(config.content); - var previewTokenizers = {}; - var field; - for (field in config.previewTokenizers) { - var tokenizer = JX.$(config.previewTokenizers[field]); - previewTokenizers[field] = JX.Stratcom.getData(tokenizer).tokenizer; - } - - var callback = function(r) { - var preview = JX.$(config.preview); - JX.DOM.setContent(preview, JX.$H(r)); - JX.Stratcom.invoke('differential-preview-update', null, { - container: preview - }); - }; - - var getdata = function() { - var data = { - content : content.value, - action : action.value - }; - for (var field in previewTokenizers) { - data[field] = JX.keys(previewTokenizers[field].getTokens()).join(','); - } - return data; - }; - - var request = new JX.PhabricatorShapedRequest(config.uri, callback, getdata); - request.listen('error', function (error) { - JX.DOM.setContent(JX.$(config.preview), JX.$H('ERROR: ' + error.info)); - }); - - var trigger = JX.bind(request, request.trigger); - - JX.DOM.listen(content, 'keydown', null, trigger); - JX.DOM.listen(action, 'change', null, trigger); - for (field in previewTokenizers) { - previewTokenizers[field].listen('change', trigger); - } - - request.start(); - - - function refreshInlinePreview() { - new JX.Request(config.inlineuri, function(r) { - var inline = JX.$(config.inline); - - JX.DOM.setContent(inline, JX.$H(r)); - JX.Stratcom.invoke('differential-preview-update', null, { - container: inline - }); - - // Go through the previews and activate any "View" links where the - // actual comment appears in the document. - - var links = JX.DOM.scry( - inline, - 'a', - 'differential-inline-preview-jump'); - for (var ii = 0; ii < links.length; ii++) { - var data = JX.Stratcom.getData(links[ii]); - try { - JX.$(data.anchor); - links[ii].href = '#' + data.anchor; - JX.DOM.setContent(links[ii], 'View'); - } catch (ignored) { - // This inline comment isn't visible, e.g. on some other diff. - } - } - }) - .setTimeout(5000) - .send(); - } - - JX.Stratcom.listen( - 'differential-inline-comment-update', - null, - refreshInlinePreview); - - refreshInlinePreview(); -}); diff --git a/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js b/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js deleted file mode 100644 index 8fbf856e79..0000000000 --- a/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js +++ /dev/null @@ -1,150 +0,0 @@ -/** - * @provides javelin-behavior-differential-dropdown-menus - * @requires javelin-behavior - * javelin-dom - * javelin-util - * javelin-stratcom - * phabricator-dropdown-menu - * phabricator-menu-item - * phabricator-phtize - */ - -JX.behavior('differential-dropdown-menus', function(config) { - - var pht = JX.phtize(config.pht); - - function show_more(container) { - var nodes = JX.DOM.scry(container, 'tr', 'context-target'); - for (var ii = 0; ii < nodes.length; ii++) { - var show = JX.DOM.scry(nodes[ii], 'a', 'show-more'); - for (var jj = 0; jj < show.length; jj++) { - if (JX.Stratcom.getData(show[jj]).type != 'all') { - continue; - } - var event_data = { - context : nodes[ii], - show : show[jj] - }; - JX.Stratcom.invoke('differential-reveal-context', null, event_data); - } - } - } - - function build_menu(button, data) { - - function link_to(name, uri) { - var item = new JX.PhabricatorMenuItem( - name, - JX.bind(null, window.open, uri), - uri); - item.setDisabled(!uri); - return item; - } - - var reveal_item = new JX.PhabricatorMenuItem('', function () { - show_more(JX.$(data.containerID)); - }); - - var diffusion_item; - if (data.diffusionURI) { - // Show this only if we have a link, since when this appears in Diffusion - // it is otherwise potentially confusing. - diffusion_item = link_to(pht('Browse in Diffusion'), data.diffusionURI); - } - - var menu = new JX.PhabricatorDropdownMenu(buttons[ii]) - .addItem(reveal_item); - - var visible_item = new JX.PhabricatorMenuItem('', function () { - JX.Stratcom.invoke('differential-toggle-file', null, { - diff: JX.DOM.scry(JX.$(data.containerID), 'table', 'differential-diff') - }); - }); - menu.addItem(visible_item); - - if (diffusion_item) { - menu.addItem(diffusion_item); - } - - menu.addItem(link_to(pht('View Standalone'), data.standaloneURI)); - - if (data.leftURI) { - menu.addItem(link_to(pht('Show Raw File (Left)'), data.leftURI)); - } - - if (data.rightURI) { - menu.addItem(link_to(pht('Show Raw File (Right)'), data.rightURI)); - } - - if (data.editor) { - menu.addItem(new JX.PhabricatorMenuItem( - pht('Open in Editor'), - // Open in the same window. - JX.bind(location, location.assign, data.editor), - data.editor)); - } - - if (data.editorConfigure) { - menu.addItem(link_to(pht('Configure Editor'), data.editorConfigure)); - } - - menu.listen( - 'open', - function() { - - // When the user opens the menu, check if there are any "Show More" - // links in the changeset body. If there aren't, disable the "Show - // Entire File" menu item since it won't change anything. - - var nodes = JX.DOM.scry(JX.$(data.containerID), 'a', 'show-more'); - if (nodes.length) { - reveal_item.setDisabled(false); - reveal_item.setName(pht('Show Entire File')); - } else { - reveal_item.setDisabled(true); - reveal_item.setName(pht('Entire File Shown')); - } - - visible_item.setDisabled(true); - visible_item.setName(pht("Can't Toggle Unloaded File")); - var diffs = JX.DOM.scry(JX.$(data.containerID), - 'table', 'differential-diff'); - if (diffs.length > 1) { - JX.$E( - 'More than one node with sigil "differential-diff" was found in "'+ - data.containerID+'."'); - } else if (diffs.length == 1) { - diff = diffs[0]; - visible_item.setDisabled(false); - if (JX.Stratcom.getData(diff).hidden) { - visible_item.setName(pht('Expand File')); - } else { - visible_item.setName(pht('Collapse File')); - } - } else { - // Do nothing when there is no diff shown in the table. For example, - // the file is binary. - } - }); - } - - var buttons = JX.DOM.scry(window.document, 'a', 'differential-view-options'); - for (var ii = 0; ii < buttons.length; ii++) { - build_menu(buttons[ii], JX.Stratcom.getData(buttons[ii])); - } - - JX.Stratcom.listen( - 'click', - 'differential-reveal-all', - function(e) { - var containers = JX.DOM.scry( - JX.$('differential-review-stage'), - 'div', - 'differential-changeset'); - for (var i=0; i < containers.length; i++) { - show_more(containers[i]); - } - e.kill(); - }); - -}); diff --git a/webroot/rsrc/js/application/differential/behavior-edit-inline-comments.js b/webroot/rsrc/js/application/differential/behavior-edit-inline-comments.js deleted file mode 100644 index 1ab0edae23..0000000000 --- a/webroot/rsrc/js/application/differential/behavior-edit-inline-comments.js +++ /dev/null @@ -1,264 +0,0 @@ -/** - * @provides javelin-behavior-differential-edit-inline-comments - * @requires javelin-behavior - * javelin-stratcom - * javelin-dom - * javelin-util - * javelin-vector - * differential-inline-comment-editor - */ - -JX.behavior('differential-edit-inline-comments', function(config) { - - var selecting = false; - var reticle = JX.$N('div', {className: 'differential-reticle'}); - JX.DOM.hide(reticle); - document.body.appendChild(reticle); - - var origin = null; - var target = null; - var root = null; - var changeset = null; - - var editor = null; - - function updateReticle() { - var top = origin; - var bot = target; - if (JX.$V(top).y > JX.$V(bot).y) { - var tmp = top; - top = bot; - bot = tmp; - } - var code = target.nextSibling; - - var pos = JX.$V(top).add(1 + JX.Vector.getDim(target).x, 0); - var dim = JX.Vector.getDim(code).add(-4, 0); - if (isOnRight(target)) { - dim.x += JX.Vector.getDim(code.nextSibling).x; - } - dim.y = (JX.$V(bot).y - pos.y) + JX.Vector.getDim(bot).y; - - pos.setPos(reticle); - dim.setDim(reticle); - - JX.DOM.show(reticle); - } - - function hideReticle() { - JX.DOM.hide(reticle); - } - - JX.DifferentialInlineCommentEditor.listen('done', function() { - selecting = false; - editor = false; - hideReticle(); - set_link_state(false); - }); - - function isOnRight(node) { - return node.parentNode.firstChild != node; - } - - function isNewFile(node) { - var data = JX.Stratcom.getData(root); - return isOnRight(node) || (data.left != data.right); - } - - function getRowNumber(th_node) { - try { - return parseInt(th_node.id.match(/^C\d+[ON]L(\d+)$/)[1], 10); - } catch (x) { - return undefined; - } - } - - var set_link_state = function(active) { - JX.DOM.alterClass(JX.$(config.stage), 'inline-editor-active', active); - }; - - JX.Stratcom.listen( - 'mousedown', - ['differential-changeset', 'tag:th'], - function(e) { - if (editor || - selecting || - e.isRightButton() || - getRowNumber(e.getTarget()) === undefined) { - return; - } - - selecting = true; - root = e.getNode('differential-changeset'); - - origin = target = e.getTarget(); - - var data = e.getNodeData('differential-changeset'); - if (isOnRight(target)) { - changeset = data.right; - } else { - changeset = data.left; - } - - updateReticle(); - - e.kill(); - }); - - JX.Stratcom.listen( - 'mouseover', - ['differential-changeset', 'tag:th'], - function(e) { - if (!selecting || - editor || - (getRowNumber(e.getTarget()) === undefined) || - (isOnRight(e.getTarget()) != isOnRight(origin)) || - (e.getNode('differential-changeset') !== root)) { - return; - } - - target = e.getTarget(); - - updateReticle(); - }); - - JX.Stratcom.listen( - 'mouseup', - null, - function(e) { - if (editor || !selecting) { - return; - } - - var o = getRowNumber(origin); - var t = getRowNumber(target); - - var insert; - var len; - if (t < o) { - len = (o - t); - o = t; - insert = origin.parentNode; - } else { - len = (t - o); - insert = target.parentNode; - } - - editor = new JX.DifferentialInlineCommentEditor(config.uri) - .setTemplates(config.undo_templates) - .setOperation('new') - .setChangeset(changeset) - .setLineNumber(o) - .setLength(len) - .setIsNew(isNewFile(target) ? 1 : 0) - .setOnRight(isOnRight(target) ? 1 : 0) - .setRow(insert.nextSibling) - .setTable(insert.parentNode) - .start(); - - set_link_state(true); - - e.kill(); - }); - - JX.Stratcom.listen( - ['mouseover', 'mouseout'], - 'differential-inline-comment', - function(e) { - if (e.getType() == 'mouseout') { - hideReticle(); - } else { - root = e.getNode('differential-changeset'); - if (root) { - - var data = e.getNodeData('differential-inline-comment'); - var change = e.getNodeData('differential-changeset'); - - var id_part = data.on_right ? change.right : change.left; - var th = e.getNode('tag:td').previousSibling; - var new_part = isNewFile(th) ? 'N' : 'O'; - var prefix = 'C' + id_part + new_part + 'L'; - - origin = JX.$(prefix + data.number); - target = JX.$(prefix + (parseInt(data.number, 10) + - parseInt(data.length, 10))); - - updateReticle(); - } - } - }); - - var action_handler = function(op, e) { - e.kill(); - - if (editor) { - return; - } - - var node = e.getNode('differential-inline-comment'); - handle_inline_action(node, op); - }; - - var handle_inline_action = function(node, op) { - var data = JX.Stratcom.getData(node); - var row = node.parentNode.parentNode; - var other_rows = []; - if (JX.Stratcom.hasSigil(node, 'differential-inline-comment-preview')) { - // The DOM structure around the comment is different if it's part of the - // preview, so make sure not to pass the wrong container. - row = node; - if (op === 'delete') { - // Furthermore, deleting a comment in the preview does not automatically - // delete other occurrences of the same comment, so do that manually. - var nodes = JX.DOM.scry( - document.body, - 'div', - 'differential-inline-comment'); - for (var i = 0; i < nodes.length; ++i) { - if (JX.Stratcom.getData(nodes[i]).id === data.id) { - other_rows.push(nodes[i]); - } - } - } - } - - var original = data.original; - if (op == 'reply') { - // If the user hit "reply", the original text is empty (a new reply), not - // the text of the comment they're replying to. - original = ''; - } - - editor = new JX.DifferentialInlineCommentEditor(config.uri) - .setTemplates(config.undo_templates) - .setOperation(op) - .setID(data.id) - .setLineNumber(data.number) - .setLength(data.length) - .setOnRight(data.on_right) - .setOriginalText(original) - .setRow(row) - .setOtherRows(other_rows) - .setTable(row.parentNode) - .start(); - - set_link_state(true); - }; - - for (var op in {'edit' : 1, 'delete' : 1, 'reply' : 1}) { - JX.Stratcom.listen( - 'click', - ['differential-inline-comment', 'differential-inline-' + op], - JX.bind(null, action_handler, op)); - } - - JX.Stratcom.listen( - 'differential-inline-action', - null, - function(e) { - var data = e.getData(); - handle_inline_action(data.node, data.op); - }); - -}); - diff --git a/webroot/rsrc/js/application/differential/behavior-keyboard-nav.js b/webroot/rsrc/js/application/differential/behavior-keyboard-nav.js deleted file mode 100644 index 98d0b73a04..0000000000 --- a/webroot/rsrc/js/application/differential/behavior-keyboard-nav.js +++ /dev/null @@ -1,277 +0,0 @@ -/** - * @provides javelin-behavior-differential-keyboard-navigation - * @requires javelin-behavior - * javelin-dom - * javelin-stratcom - * phabricator-keyboard-shortcut - */ - -JX.behavior('differential-keyboard-navigation', function(config) { - - var cursor = -1; - var changesets; - - var selection_begin = null; - var selection_end = null; - - var refreshFocus = function() {}; - - function init() { - if (changesets) { - return; - } - changesets = JX.DOM.scry(document.body, 'div', 'differential-changeset'); - } - - function getBlocks(cursor) { - // TODO: This might not be terribly fast; we can't currently memoize it - // because it can change as ajax requests come in (e.g., content loads). - - var rows = JX.DOM.scry(changesets[cursor], 'tr'); - var blocks = [[changesets[cursor], changesets[cursor]]]; - var start = null; - var type; - var ii; - - // Don't show code blocks inside a collapsed file. - var diff = JX.DOM.scry(changesets[cursor], 'table', 'differential-diff'); - if (diff.length == 1 && JX.Stratcom.getData(diff[0]).hidden) { - return blocks; - } - - function push() { - if (start) { - blocks.push([start, rows[ii - 1]]); - } - start = null; - } - - for (ii = 0; ii < rows.length; ii++) { - type = getRowType(rows[ii]); - if (type == 'comment') { - // If we see these types of rows, make a block for each one. - push(); - } - if (!type) { - push(); - } else if (type && !start) { - start = rows[ii]; - } - } - push(); - - return blocks; - } - - function getRowType(row) { - // NOTE: Being somewhat over-general here to allow other types of objects - // to be easily focused in the future (inline comments, 'show more..'). - - if (row.className.indexOf('inline') !== -1) { - return 'comment'; - } - - if (row.className.indexOf('differential-changeset') !== -1) { - return 'file'; - } - - var cells = JX.DOM.scry(row, 'td'); - - for (var ii = 0; ii < cells.length; ii++) { - // NOTE: The semantic use of classnames here is for performance; don't - // emulate this elsewhere since it's super terrible. - if (cells[ii].className.indexOf('old') !== -1 || - cells[ii].className.indexOf('new') !== -1) { - return 'change'; - } - } - - return null; - } - - function jump(manager, delta, jump_to_type) { - init(); - - if (cursor < 0) { - if (delta < 0) { - // If the user goes "back" without a selection, just reject the action. - return; - } else { - cursor = 0; - } - } - - while (true) { - var blocks = getBlocks(cursor); - var focus; - if (delta < 0) { - focus = blocks.length; - } else { - focus = -1; - } - - for (var ii = 0; ii < blocks.length; ii++) { - if (blocks[ii][0] == selection_begin) { - focus = ii; - break; - } - } - - while (true) { - focus += delta; - - if (blocks[focus]) { - var row_type = getRowType(blocks[focus][0]); - if (jump_to_type && row_type != jump_to_type) { - continue; - } - - selection_begin = blocks[focus][0]; - selection_end = blocks[focus][1]; - - manager.scrollTo(selection_begin); - - refreshFocus = function() { - manager.focusOn(selection_begin, selection_end); - }; - - refreshFocus(); - - return; - } else { - var adjusted = (cursor + delta); - if (adjusted < 0 || adjusted >= changesets.length) { - // Stop cursor movement when the user reaches either end. - return; - } - cursor = adjusted; - - // Break the inner loop and go to the next file. - break; - } - } - } - - } - - // When inline comments are updated, wipe out our cache of blocks since - // comments may have been added or deleted. - JX.Stratcom.listen( - null, - 'differential-inline-comment-update', - function() { - changesets = null; - }); - // Same thing when a file is hidden or shown; don't want to highlight - // invisible code. - JX.Stratcom.listen( - 'differential-toggle-file-toggled', - null, - function() { - changesets = null; - init(); - refreshFocus(); - }); - - var haunt_mode = 0; - function haunt() { - haunt_mode = (haunt_mode + 1) % 3; - - var el = JX.$(config.haunt); - for (var ii = 1; ii <= 2; ii++) { - JX.DOM.alterClass(el, 'differential-haunt-mode-'+ii, (haunt_mode == ii)); - } - } - - new JX.KeyboardShortcut('j', 'Jump to next change.') - .setHandler(function(manager) { - jump(manager, 1); - }) - .register(); - - new JX.KeyboardShortcut('k', 'Jump to previous change.') - .setHandler(function(manager) { - jump(manager, -1); - }) - .register(); - - new JX.KeyboardShortcut('J', 'Jump to next file.') - .setHandler(function(manager) { - jump(manager, 1, 'file'); - }) - .register(); - - new JX.KeyboardShortcut('K', 'Jump to previous file.') - .setHandler(function(manager) { - jump(manager, -1, 'file'); - }) - .register(); - - new JX.KeyboardShortcut('n', 'Jump to next inline comment.') - .setHandler(function(manager) { - jump(manager, 1, 'comment'); - }) - .register(); - - new JX.KeyboardShortcut('p', 'Jump to previous inline comment.') - .setHandler(function(manager) { - jump(manager, -1, 'comment'); - }) - .register(); - - - new JX.KeyboardShortcut('t', 'Jump to the table of contents.') - .setHandler(function(manager) { - var toc = JX.$('toc'); - manager.scrollTo(toc); - }) - .register(); - - new JX.KeyboardShortcut( - 'h', - 'Collapse or expand the file display (after jump).') - .setHandler(function(manager) { - if (!changesets || !changesets[cursor]) { - return; - } - JX.Stratcom.invoke('differential-toggle-file', null, { - diff: JX.DOM.scry(changesets[cursor], 'table', 'differential-diff') - }); - }) - .register(); - - - function inline_op(node, op) { - if (!JX.DOM.scry(node, 'a', 'differential-inline-' + op)) { - // No link for this operation, e.g. editing a comment you can't edit. - return; - } - - var data = { - node: JX.DOM.find(node, 'div', 'differential-inline-comment'), - op: op - }; - - JX.Stratcom.invoke('differential-inline-action', null, data); - } - - new JX.KeyboardShortcut('r', 'Reply to selected inline comment.') - .setHandler(function(manager) { - inline_op(selection_begin, 'reply'); - }) - .register(); - - new JX.KeyboardShortcut('e', 'Edit selected inline comment.') - .setHandler(function(manager) { - inline_op(selection_begin, 'edit'); - }) - .register(); - - if (config.haunt) { - new JX.KeyboardShortcut('z', 'Cycle comment panel haunting modes.') - .setHandler(haunt) - .register(); - } - -}); - diff --git a/webroot/rsrc/js/application/differential/behavior-populate.js b/webroot/rsrc/js/application/differential/behavior-populate.js index 3add4c3b1a..9581ef26e5 100644 --- a/webroot/rsrc/js/application/differential/behavior-populate.js +++ b/webroot/rsrc/js/application/differential/behavior-populate.js @@ -1,122 +1,94 @@ /** * @provides javelin-behavior-differential-populate * @requires javelin-behavior - * javelin-workflow - * javelin-util * javelin-dom * javelin-stratcom - * javelin-behavior-device - * javelin-vector * phabricator-tooltip + * phabricator-diff-changeset-list + * phabricator-diff-changeset + * phuix-formation-view + * @javelin */ -JX.behavior('differential-populate', function(config) { +JX.behavior('differential-populate', function(config, statics) { - function onresponse(target_id, response) { - // As we populate the diff, we try to hold the document scroll position - // steady, so that, e.g., users who want to leave a comment on a diff with a - // large number of changes don't constantly have the text area scrolled off - // the bottom of the screen until the entire diff loads. - // - // There are two three major cases here: - // - // - If we're near the top of the document, never scroll. - // - If we're near the bottom of the document, always scroll. - // - Otherwise, scroll if the changes were above the midline of the - // viewport. - var target = JX.$(target_id); - - var old_pos = JX.Vector.getScroll(); - var old_view = JX.Vector.getViewport(); - var old_dim = JX.Vector.getDocument(); - - // Number of pixels away from the top or bottom of the document which - // count as "nearby". - var sticky = 480; - - var near_top = (old_pos.y <= sticky); - var near_bot = ((old_pos.y + old_view.y) >= (old_dim.y - sticky)); - - var target_pos = JX.Vector.getPos(target); - var target_dim = JX.Vector.getDim(target); - var target_mid = (target_pos.y + (target_dim.y / 2)); - - var view_mid = (old_pos.y + (old_view.y / 2)); - var above_mid = (target_mid < view_mid); + // When we perform a Quicksand navigation, deactivate the changeset lists on + // the current page and activate the changeset lists on the new page. + var onredraw = function(page_id) { + // If the current page is already active, we don't need to do anything. + if (statics.pageID === page_id) { + return; + } - JX.DOM.replace(target, JX.$H(response.changeset)); + var ii; - if (!near_top) { - if (near_bot || above_mid) { - // Figure out how much taller the document got. - var delta = (JX.Vector.getDocument().y - old_dim.y); + // Put the old lists to sleep. + var old_lists = get_lists(statics.pageID); + for (ii = 0; ii < old_lists.length; ii++) { + old_lists[ii].sleep(); + } + statics.pageID = null; - window.scrollTo(old_pos.x, old_pos.y + delta); + // Awaken the new lists, if they exist. + if (statics.pages.hasOwnProperty(page_id)) { + var new_lists = get_lists(page_id); + for (ii = 0; ii < new_lists.length; ii++) { + new_lists[ii].wake(); } + + statics.pageID = page_id; } + }; - if (response.coverage) { - for (var k in response.coverage) { - try { - JX.DOM.replace(JX.$(k), JX.$H(response.coverage[k])); - } catch (ignored) { - // Not terribly important. - } - } + // Get changeset lists on the current page. + var get_lists = function(page_id) { + if (page_id === null) { + return []; } - } - // NOTE: If you load the page at one device resolution and then resize to - // a different one we don't re-render the diffs, because it's a complicated - // mess and you could lose inline comments, cursor positions, etc. - var renderer = (JX.Device.getDevice() == 'desktop') ? '2up' : '1up'; + return statics.pages[page_id] || []; + }; - // TODO: Once 1up works better, figure out when to show it. - renderer = '2up'; + if (!statics.installed) { + statics.installed = true; + statics.pages = {}; + statics.pageID = null; - for (var k in config.registry) { - var data = { - ref : config.registry[k], - whitespace: config.whitespace, - renderer: renderer - }; + JX.Stratcom.listen('quicksand-redraw', null, function(e) { + onredraw(e.getData().newResponseID); + }); + } - new JX.Workflow(config.uri, data) - .setHandler(JX.bind(null, onresponse, k)) - .start(); + var changeset_list = new JX.DiffChangesetList() + .setTranslations(JX.phtize(config.pht)) + .setInlineURI(config.inlineURI) + .setInlineListURI(config.inlineListURI) + .setIsStandalone(config.isStandalone); + + if (config.formationViewID) { + var formation_node = JX.$(config.formationViewID); + var formation_view = new JX.PHUIXFormationView(formation_node); + changeset_list.setFormationView(formation_view); + formation_view.start(); } + for (var ii = 0; ii < config.changesetViewIDs.length; ii++) { + var id = config.changesetViewIDs[ii]; + var node = JX.$(id); + var changeset = changeset_list.newChangesetForNode(node); + if (changeset.shouldAutoload()) { + changeset.setStabilize(true).load(); + } + } + + // Install and activate the current page. + var page_id = JX.Quicksand.getCurrentPageID(); + statics.pages[page_id] = [changeset_list]; + onredraw(page_id); + var highlighted = null; var highlight_class = null; - JX.Stratcom.listen( - 'click', - 'differential-load', - function(e) { - var meta = e.getNodeData('differential-load'); - var diff; - try { - diff = JX.$(meta.id); - } catch (ex) { - // Already loaded. - } - if (diff) { - JX.DOM.setContent( - diff, - JX.$H('
    Loading...
    ')); - var data = { - ref : meta.ref, - whitespace : config.whitespace - }; - new JX.Workflow(config.uri, data) - .setHandler(JX.bind(null, onresponse, meta.id)) - .start(); - } - if (meta.kill) { - e.kill(); - } - }); - JX.Stratcom.listen( ['mouseover', 'mouseout'], ['differential-changeset', 'tag:td'], @@ -173,5 +145,4 @@ JX.behavior('differential-populate', function(config) { }); - }); diff --git a/webroot/rsrc/js/application/differential/behavior-show-all-comments.js b/webroot/rsrc/js/application/differential/behavior-show-all-comments.js deleted file mode 100644 index 6bd9f825a1..0000000000 --- a/webroot/rsrc/js/application/differential/behavior-show-all-comments.js +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @provides javelin-behavior-differential-show-all-comments - * @requires javelin-behavior - * javelin-stratcom - * javelin-dom - */ - -JX.behavior('differential-show-all-comments', function(config) { - - var shown = false; - function reveal(node) { - if (shown) { - return false; - } - shown = true; - node = node || JX.DOM.find( - document.body, - 'div', - 'differential-all-comments-container'); - if (node) { - JX.DOM.setContent(node, JX.$H(config.markup)); - } - return true; - } - - // Reveal the hidden comments if the user clicks "Show All Comments", or if - // there's an anchor in the URL, since we don't want to link to "#comment-3" - // and have it collapsed. - - function at_comment_hash() { - return window.location.hash && window.location.hash.match(/comment/); - } - - if (at_comment_hash()) { - reveal(); - } else { - JX.Stratcom.listen( - 'hashchange', - null, - function(e) { - if (at_comment_hash() && reveal()) { - try { - var target = JX.$(window.location.hash.replace(/^#/, '')); - window.scrollTo(0, target.offsetTop); - } catch (ex) { - } - } - }); - } - - JX.Stratcom.listen( - 'click', - 'differential-show-all-comments', - function(e) { - reveal(e.getNode('differential-all-comments-container')); - e.kill(); - }); - -}); diff --git a/webroot/rsrc/js/application/differential/behavior-show-field-details.js b/webroot/rsrc/js/application/differential/behavior-show-field-details.js deleted file mode 100644 index b788b7a6d6..0000000000 --- a/webroot/rsrc/js/application/differential/behavior-show-field-details.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @provides javelin-behavior-differential-show-field-details - * @requires javelin-behavior - * javelin-stratcom - * javelin-dom - */ - -JX.behavior('differential-show-field-details', function(config) { - - JX.Stratcom.listen( - 'click', - ['differential-results-row-show', 'tag:a'], - function(e) { - toggle(e, true); - }); - - JX.Stratcom.listen( - 'click', - ['differential-results-row-hide', 'tag:a'], - function(e) { - toggle(e, false); - }); - - function toggle(e, show) { - e.kill(); - - var f = show ? JX.DOM.show : JX.DOM.hide; - var g = show ? JX.DOM.hide : JX.DOM.show; - - var table = e.getNode('differential-results-table'); - var rows = JX.DOM.scry(table, 'tr', 'differential-results-row-toggle'); - for (var ii = 0; ii < rows.length; ii++) { - f(rows[ii]); - } - - g(JX.DOM.find(table, 'tr', 'differential-results-row-show')); - f(JX.DOM.find(table, 'tr', 'differential-results-row-hide')); - } - -}); diff --git a/webroot/rsrc/js/application/differential/behavior-show-more.js b/webroot/rsrc/js/application/differential/behavior-show-more.js deleted file mode 100644 index 2c44b798c3..0000000000 --- a/webroot/rsrc/js/application/differential/behavior-show-more.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @provides javelin-behavior-differential-show-more - * @requires javelin-behavior - * javelin-dom - * javelin-workflow - * javelin-util - * javelin-stratcom - */ - -JX.behavior('differential-show-more', function(config) { - - function onresponse(context, response) { - var div = JX.$N('div', {}, JX.$H(response.changeset)); - var root = context.parentNode; - copyRows(root, div, context); - root.removeChild(context); - } - - JX.Stratcom.listen( - 'click', - 'show-more', - function(e) { - var event_data = { - context : e.getNodes()['context-target'], - show : e.getNodes()['show-more'] - }; - - JX.Stratcom.invoke('differential-reveal-context', null, event_data); - e.kill(); - }); - - JX.Stratcom.listen( - 'differential-reveal-context', - null, - function(e) { - var context = e.getData().context; - var data = JX.Stratcom.getData(e.getData().show); - - var container = JX.DOM.scry(context, 'td')[0]; - JX.DOM.setContent(container, 'Loading...'); - JX.DOM.alterClass(context, 'differential-show-more-loading', true); - - if (!data['whitespace']) { - data['whitespace'] = config.whitespace; - } - - new JX.Workflow(config.uri, data) - .setHandler(JX.bind(null, onresponse, context)) - .start(); - }); - -}); - -function copyRows(dst, src, before) { - var rows = JX.DOM.scry(src, 'tr'); - for (var ii = 0; ii < rows.length; ii++) { - if (before) { - dst.insertBefore(rows[ii], before); - } else { - dst.appendChild(rows[ii]); - } - } - return rows; -} diff --git a/webroot/rsrc/js/application/differential/behavior-toggle-files.js b/webroot/rsrc/js/application/differential/behavior-toggle-files.js deleted file mode 100644 index e81c77a8d2..0000000000 --- a/webroot/rsrc/js/application/differential/behavior-toggle-files.js +++ /dev/null @@ -1,96 +0,0 @@ -/** - * @provides javelin-behavior-differential-toggle-files - * @requires javelin-behavior - * javelin-dom - * javelin-stratcom - */ - -JX.behavior('differential-toggle-files', function(config) { - - JX.Stratcom.listen( - 'differential-toggle-file', - null, - function(e) { - if (e.getData().diff.length != 1) { - return; - } - var diff = e.getData().diff[0], - data = JX.Stratcom.getData(diff); - if(data.hidden) { - data.hidden = false; - JX.DOM.show(diff); - } else { - data.hidden = true; - JX.DOM.hide(diff); - } - JX.Stratcom.invoke('differential-toggle-file-toggled'); - }); - - JX.Stratcom.listen( - 'differential-toggle-file-request', - null, - function(e) { - var elt = e.getData().element; - while (elt !== document.body) { - if (JX.Stratcom.hasSigil(elt, 'differential-changeset')) { - var diffs = JX.DOM.scry(elt, 'table', 'differential-diff'); - var invoked = false; - for (var i = 0; i < diffs.length; ++i) { - if (JX.Stratcom.getData(diffs[i]).hidden) { - JX.Stratcom.invoke('differential-toggle-file', null, { - diff: [ diffs[i] ] - }); - invoked = true; - } - } - if (!invoked) { - e.prevent(); - } - return; - } - elt = elt.parentNode; - } - e.prevent(); - }); - - JX.Stratcom.listen( - 'click', - 'tag:a', - function(e) { - var link = e.getNode('tag:a'); - var id = link.getAttribute('href'); - if (!id || !id.match(/^#.+/)) { - return; - } - var raw = e.getRawEvent(); - if (raw.altKey || raw.ctrlKey || raw.metaKey || raw.shiftKey) { - return; - } - // The target may have either a matching name or a matching id. - var target; - try { - target = JX.$(id.substr(1)); - } catch(err) { - var named = document.getElementsByName(id.substr(1)); - for (var i = 0; i < named.length; ++i) { - if (named[i].tagName.toLowerCase() == 'a') { - if (target) { - return; - } - target = named[i]; - } - } - if (!target) { - return; - } - } - var event = JX.Stratcom.invoke('differential-toggle-file-request', null, { - element: target - }); - if (!event.getPrevented()) { - // This event is processed after the hash has changed, so it doesn't - // automatically jump there like we want. - JX.DOM.scrollTo(target); - } - }); -}); diff --git a/webroot/rsrc/js/application/differential/behavior-user-select.js b/webroot/rsrc/js/application/differential/behavior-user-select.js deleted file mode 100644 index 8db48b704d..0000000000 --- a/webroot/rsrc/js/application/differential/behavior-user-select.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @provides javelin-behavior-differential-user-select - * @requires javelin-behavior - * javelin-dom - * javelin-stratcom - */ - -JX.behavior('differential-user-select', function() { - - var unselectable; - - function isOnRight(node) { - return node.previousSibling && - node.parentNode.firstChild != node.previousSibling; - } - - JX.Stratcom.listen( - 'mousedown', - null, - function(e) { - var key = 'differential-unselectable'; - if (unselectable) { - JX.DOM.alterClass(unselectable, key, false); - } - var diff = e.getNode('differential-diff'); - var td = e.getNode('tag:td'); - if (diff && td && isOnRight(td)) { - unselectable = diff; - JX.DOM.alterClass(diff, key, true); - } - }); - -}); diff --git a/webroot/rsrc/js/application/diffusion/DiffusionLocateFileSource.js b/webroot/rsrc/js/application/diffusion/DiffusionLocateFileSource.js new file mode 100644 index 0000000000..1f94f349d3 --- /dev/null +++ b/webroot/rsrc/js/application/diffusion/DiffusionLocateFileSource.js @@ -0,0 +1,293 @@ +/** + * @provides javelin-diffusion-locate-file-source + * @requires javelin-install + * javelin-dom + * javelin-typeahead-preloaded-source + * javelin-util + * @javelin + */ + +JX.install('DiffusionLocateFileSource', { + + extend: 'TypeaheadPreloadedSource', + + construct: function(uri) { + JX.TypeaheadPreloadedSource.call(this, uri); + this.cache = {}; + }, + + members: { + tree: null, + limit: 20, + cache: null, + + ondata: function(results) { + this.tree = results.tree; + + if (this.lastValue !== null) { + this.matchResults(this.lastValue); + } + + this.setReady(true); + }, + + + /** + * Match a query and show results in the typeahead. + */ + matchResults: function(value, partial) { + // For now, just pretend spaces don't exist. + var search = value.toLowerCase(); + search = search.replace(' ', ''); + + var paths = this.findResults(search); + + var nodes = []; + for (var ii = 0; ii < paths.length; ii++) { + var path = paths[ii]; + var name = []; + name.push(path.path.substr(0, path.pos)); + name.push( + JX.$N('strong', {}, path.path.substr(path.pos, path.score))); + + var pos = path.score; + var lower = path.path.toLowerCase(); + for (var jj = path.pos + path.score; jj < path.path.length; jj++) { + if (lower.charAt(jj) == search.charAt(pos)) { + pos++; + name.push(JX.$N('strong', {}, path.path.charAt(jj))); + if (pos == search.length) { + break; + } + } else { + name.push(path.path.charAt(jj)); + } + } + + if (jj < path.path.length - 1 ) { + name.push(path.path.substr(jj + 1)); + } + + var attr = { + className: 'visual-only phui-icon-view phui-font-fa fa-file' + }; + var icon = JX.$N('span', attr, ''); + + nodes.push( + JX.$N( + 'a', + { + sigil: 'typeahead-result', + className: 'jx-result diffusion-locate-file', + ref: path.path + }, + [icon, name])); + } + + this.invoke('resultsready', nodes, value); + if (!partial) { + this.invoke('complete'); + } + }, + + + /** + * Find the results matching a query. + */ + findResults: function(search) { + if (!search.length) { + return []; + } + + // We know that the results for "abc" are always a subset of the results + // for "a" and "ab" -- and there's a good chance we already computed + // those result sets. Find the longest cached result which is a prefix + // of the search query. + var best = 0; + var start = this.tree; + for (var k in this.cache) { + if ((k.length <= search.length) && + (k.length > best) && + (search.substr(0, k.length) == k)) { + best = k.length; + start = this.cache[k]; + } + } + + var matches; + if (start === null) { + matches = null; + } else { + matches = this.matchTree(start, search, 0); + } + + // Save this tree in cache; throw the cache away after a few minutes. + if (!(search in this.cache)) { + this.cache[search] = matches; + setTimeout( + JX.bind(this, function() { delete this.cache[search]; }), + 1000 * 60 * 5); + } + + if (!matches) { + return []; + } + + var paths = []; + this.buildPaths(matches, paths, '', search, []); + + paths.sort( + function(u, v) { + if (u.score != v.score) { + return (v.score - u.score); + } + + if (u.pos != v.pos) { + return (u.pos - v.pos); + } + + return ((u.path > v.path) ? 1 : -1); + }); + + var num = Math.min(paths.length, this.limit); + var results = []; + for (var ii = 0; ii < num; ii++) { + results.push(paths[ii]); + } + + return results; + }, + + + /** + * Select the subtree that matches a query. + */ + matchTree: function(tree, value, pos) { + var matches = null; + for (var k in tree) { + var p = pos; + + if (p != value.length) { + p = this.matchString(k, value, pos); + } + + var result; + if (p == value.length) { + result = tree[k]; + } else { + if (tree == 1) { + continue; + } else { + result = this.matchTree(tree[k], value, p); + if (!result) { + continue; + } + } + } + + if (!matches) { + matches = {}; + } + matches[k] = result; + } + + return matches; + }, + + + /** + * Look for the needle in a string, returning how much of it was found. + */ + matchString: function(haystack, needle, pos) { + var str = haystack.toLowerCase(); + var len = str.length; + for (var ii = 0; ii < len; ii++) { + if (str.charAt(ii) == needle.charAt(pos)) { + pos++; + if (pos == needle.length) { + break; + } + } + } + return pos; + }, + + + /** + * Flatten a tree into paths. + */ + buildPaths: function(matches, paths, prefix, search) { + var first = search.charAt(0); + + for (var k in matches) { + if (matches[k] == 1) { + var path = prefix + k; + var lower = path.toLowerCase(); + + var best = 0; + var pos = 0; + for (var jj = 0; jj < lower.length; jj++) { + if (lower.charAt(jj) != first) { + continue; + } + + var score = this.scoreMatch(lower, jj, search); + if (score == -1) { + break; + } + + if (score > best) { + best = score; + pos = jj; + if (best == search.length) { + break; + } + } + } + + paths.push({ + path: path, + score: best, + pos: pos + }); + + } else { + this.buildPaths(matches[k], paths, prefix + k, search); + } + } + }, + + + /** + * Score a matching string by finding the longest prefix of the search + * query it contains contiguously. + */ + scoreMatch: function(haystack, haypos, search) { + var pos = 0; + for (var ii = haypos; ii < haystack.length; ii++) { + if (haystack.charAt(ii) == search.charAt(pos)) { + pos++; + if (pos == search.length) { + return pos; + } + } else { + ii++; + break; + } + } + + var rem = pos; + for (/* keep going */; ii < haystack.length; ii++) { + if (haystack.charAt(ii) == search.charAt(rem)) { + rem++; + if (rem == search.length) { + return pos; + } + } + } + + return -1; + } + + } +}); diff --git a/webroot/rsrc/js/application/diffusion/ExternalEditorLinkEngine.js b/webroot/rsrc/js/application/diffusion/ExternalEditorLinkEngine.js new file mode 100644 index 0000000000..c43f1c360a --- /dev/null +++ b/webroot/rsrc/js/application/diffusion/ExternalEditorLinkEngine.js @@ -0,0 +1,41 @@ +/** + * @provides javelin-external-editor-link-engine + * @requires javelin-install + * @javelin + */ + +JX.install('ExternalEditorLinkEngine', { + + properties: { + template: null, + variables: null + }, + + members: { + newURI: function() { + var template = this.getTemplate(); + var variables = this.getVariables(); + + var parts = []; + for (var ii = 0; ii < template.length; ii++) { + var part = template[ii]; + var value = part.value; + + if (part.type === 'literal') { + parts.push(value); + continue; + } + + if (part.type === 'variable') { + if (variables.hasOwnProperty(value)) { + var replacement = variables[value]; + replacement = encodeURIComponent(replacement); + parts.push(replacement); + } + } + } + + return parts.join(''); + } + } +}); diff --git a/webroot/rsrc/js/application/diffusion/behavior-audit-preview.js b/webroot/rsrc/js/application/diffusion/behavior-audit-preview.js index 7f7ebb904f..140a412d21 100644 --- a/webroot/rsrc/js/application/diffusion/behavior-audit-preview.js +++ b/webroot/rsrc/js/application/diffusion/behavior-audit-preview.js @@ -8,7 +8,6 @@ JX.behavior('audit-preview', function(config) { - var preview = JX.$(config.preview); var content = JX.$(config.content); var action = JX.$(config.action); diff --git a/webroot/rsrc/js/application/diffusion/behavior-commit-branches.js b/webroot/rsrc/js/application/diffusion/behavior-commit-branches.js index d72b5206f7..5911a84a09 100644 --- a/webroot/rsrc/js/application/diffusion/behavior-commit-branches.js +++ b/webroot/rsrc/js/application/diffusion/behavior-commit-branches.js @@ -16,4 +16,3 @@ JX.behavior('diffusion-commit-branches', function(config) { } }); - diff --git a/webroot/rsrc/js/application/diffusion/behavior-commit-graph.js b/webroot/rsrc/js/application/diffusion/behavior-commit-graph.js index e9ab4b12bb..e8946ca9b4 100644 --- a/webroot/rsrc/js/application/diffusion/behavior-commit-graph.js +++ b/webroot/rsrc/js/application/diffusion/behavior-commit-graph.js @@ -37,22 +37,37 @@ JX.behavior('diffusion-commit-graph', function(config) { // Stroke with fill (for commit circles). function fstroke(c) { + cxt.lineWidth = 1; cxt.fillStyle = color(c); cxt.strokeStyle = '#ffffff'; cxt.fill(); cxt.stroke(); } + // If the graph is going to be wide, squish it a bit so it doesn't take up + // quite as much space. + var default_width; + if (config.count >= 8) { + default_width = 6; + } else { + default_width = 12; + } for (var ii = 0; ii < nodes.length; ii++) { var data = JX.Stratcom.getData(nodes[ii]); - var cell = 12; // Width of each thread. + var cell = default_width; var xpos = function(col) { return (col * cell) + (cell / 2); }; - var h = 26; + var h; + if (config.height) { + h = config.height; + } else { + h = JX.Vector.getDim(nodes[ii].parentNode).y; + } + var w = cell * config.count; var canvas = JX.$N('canvas', {width: w, height: h}); @@ -78,6 +93,7 @@ JX.behavior('diffusion-commit-graph', function(config) { c = data.line.charAt(jj); switch (c) { case 'o': + case 'x': case '^': origin = xpos(jj); break; @@ -90,6 +106,7 @@ JX.behavior('diffusion-commit-graph', function(config) { for (jj = 0; jj < data.join.length; jj++) { var join = data.join[jj]; x = xpos(join); + cxt.beginPath(); cxt.moveTo(x, 0); cxt.bezierCurveTo(x, h/4, origin, h/4, origin, h/2); @@ -117,16 +134,17 @@ JX.behavior('diffusion-commit-graph', function(config) { case 'o': case '^': case '|': - if (c == 'o' || c == '^') { - origin = xpos(jj); - } + case 'x': + case 'X': - cxt.beginPath(); - cxt.moveTo(xpos(jj), (c == '^' ? h/2 : 0)); - cxt.lineTo(xpos(jj), h); - lstroke(jj); + if (c !== 'X') { + cxt.beginPath(); + cxt.moveTo(xpos(jj), (c == '^' ? h/2 : 0)); + cxt.lineTo(xpos(jj), (c == 'x' ? h/2 : h)); + lstroke(jj); + } - if (c == 'o' || c == '^') { + if (c == 'o' || c == '^' || c == 'x' || c == 'X') { cxt.beginPath(); cxt.arc(xpos(jj), h/2, 3, 0, 2 * Math.PI, true); fstroke(jj); @@ -135,9 +153,8 @@ JX.behavior('diffusion-commit-graph', function(config) { } } - JX.DOM.setContent(nodes[ii], canvas); + JX.DOM.replace(nodes[ii], canvas); } }); - diff --git a/webroot/rsrc/js/application/diffusion/behavior-jump-to.js b/webroot/rsrc/js/application/diffusion/behavior-jump-to.js deleted file mode 100644 index 852502e88f..0000000000 --- a/webroot/rsrc/js/application/diffusion/behavior-jump-to.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @provides javelin-behavior-diffusion-jump-to - * @requires javelin-behavior - * javelin-vector - * javelin-dom - */ - -JX.behavior('diffusion-jump-to', function(config) { - - setTimeout(function() { - window.scrollTo(0, JX.$V(JX.$(config.target)).y - 100); - }, 0); - -}); diff --git a/webroot/rsrc/js/application/diffusion/behavior-load-blame.js b/webroot/rsrc/js/application/diffusion/behavior-load-blame.js deleted file mode 100644 index bebafc8886..0000000000 --- a/webroot/rsrc/js/application/diffusion/behavior-load-blame.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @provides javelin-behavior-load-blame - * @requires javelin-behavior - * javelin-dom - * javelin-request - */ - -JX.behavior('load-blame', function(config) { - - new JX.Request(location.href, function (response) { - JX.DOM.setContent(JX.$(config.id), JX.$H(response)); - }).send(); - -}); diff --git a/webroot/rsrc/js/application/diffusion/behavior-locate-file.js b/webroot/rsrc/js/application/diffusion/behavior-locate-file.js new file mode 100644 index 0000000000..c8817428e6 --- /dev/null +++ b/webroot/rsrc/js/application/diffusion/behavior-locate-file.js @@ -0,0 +1,31 @@ +/** + * @provides javelin-behavior-diffusion-locate-file + * @requires javelin-behavior + * javelin-diffusion-locate-file-source + * javelin-dom + * javelin-typeahead + * javelin-uri + */ + +JX.behavior('diffusion-locate-file', function(config) { + var control = JX.$(config.controlID); + var input = JX.$(config.inputID); + + var datasource = new JX.DiffusionLocateFileSource(config.uri); + + var typeahead = new JX.Typeahead(control, input); + typeahead.setDatasource(datasource); + + typeahead.listen('choose', function(r) { + JX.$U(config.browseBaseURI + r.ref).go(); + }); + + var started = false; + JX.DOM.listen(input, 'click', null, function() { + if (!started) { + started = true; + typeahead.start(); + } + }); + +}); diff --git a/webroot/rsrc/js/application/diffusion/behavior-pull-lastmodified.js b/webroot/rsrc/js/application/diffusion/behavior-pull-lastmodified.js index 01e8238718..dc097487fd 100644 --- a/webroot/rsrc/js/application/diffusion/behavior-pull-lastmodified.js +++ b/webroot/rsrc/js/application/diffusion/behavior-pull-lastmodified.js @@ -3,20 +3,32 @@ * @requires javelin-behavior * javelin-dom * javelin-util - * javelin-request + * javelin-workflow + * javelin-json */ JX.behavior('diffusion-pull-lastmodified', function(config) { - for (var uri in config) { - new JX.Request(uri, JX.bind(config[uri], function(r) { + new JX.Workflow(config.uri, {paths: JX.JSON.stringify(JX.keys(config.map))}) + .setHandler(function(r) { for (var k in r) { - if (this[k]) { - JX.DOM.setContent(JX.$(this[k]), JX.$H(r[k])); + for (var l in r[k]) { + if (!config.map[k][l]) { + continue; + } + try { + JX.DOM.setContent(JX.$(config.map[k][l]), JX.$H(r[k][l])); + } catch (ex) { + // The way this works is weird and sometimes the components get + // out of sync. Fail gently until we can eventually improve the + // underlying mechanism. + + // In particular, we currently may generate lint information + // without generating a lint column. See T9524. + } } } - })).send(); - } + }) + .start(); }); - diff --git a/webroot/rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js b/webroot/rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js index 17a3aa7aa5..f725ef6082 100644 --- a/webroot/rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js +++ b/webroot/rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js @@ -40,9 +40,19 @@ JX.behavior('doorkeeper-tag', function(config, statics) { }; for (var ii = 0; ii < tags.length; ii++) { - var tag_key = tags[ii].ref.join('@'); + var key_parts = []; + + key_parts = key_parts.concat(tags[ii].ref); + key_parts.push(tags[ii].view); + + var tag_key = key_parts.join(' '); + if (tag_key in statics.cache) { - have.push({id: tags[ii].id, markup: statics.cache[tag_key]}); + have.push( + { + id: tags[ii].id, + markup: statics.cache[tag_key] + }); } else { need.push(tags[ii]); keys[tags[ii].id] = tag_key; @@ -54,7 +64,11 @@ JX.behavior('doorkeeper-tag', function(config, statics) { } if (need.length) { - new JX.Workflow('/doorkeeper/tags/', {tags: JX.JSON.stringify(need)}) + var data = { + tags: JX.JSON.stringify(need) + }; + + new JX.Workflow('/doorkeeper/tags/', data) .setHandler(function(r) { draw(r.tags); }) .start(); } @@ -62,4 +76,3 @@ JX.behavior('doorkeeper-tag', function(config, statics) { JX.onload(load); }); - diff --git a/webroot/rsrc/js/application/drydock/drydock-live-operation-status.js b/webroot/rsrc/js/application/drydock/drydock-live-operation-status.js new file mode 100644 index 0000000000..dec4e81796 --- /dev/null +++ b/webroot/rsrc/js/application/drydock/drydock-live-operation-status.js @@ -0,0 +1,32 @@ +/** + * @provides javelin-behavior-drydock-live-operation-status + * @requires javelin-behavior + * javelin-dom + * javelin-request + * @javelin + */ + +JX.behavior('drydock-live-operation-status', function(config) { + var node = JX.$(config.statusID); + + function update() { + new JX.Request(config.updateURI, onresponse) + .send(); + } + + function onresponse(r) { + var new_node = JX.$H(r.markup).getNode(); + JX.DOM.replace(node, new_node); + node = new_node; + + if (r.isUnderway) { + poll(); + } + } + + function poll() { + setTimeout(update, 1000); + } + + poll(); +}); diff --git a/webroot/rsrc/js/application/fact/Chart.js b/webroot/rsrc/js/application/fact/Chart.js new file mode 100644 index 0000000000..473feedcea --- /dev/null +++ b/webroot/rsrc/js/application/fact/Chart.js @@ -0,0 +1,246 @@ +/** + * @provides javelin-chart + * @requires phui-chart-css + * d3 + * javelin-chart-curtain-view + * javelin-chart-function-label + */ +JX.install('Chart', { + + construct: function(root_node) { + this._rootNode = root_node; + + JX.Stratcom.listen('resize', null, JX.bind(this, this._redraw)); + }, + + members: { + _rootNode: null, + _data: null, + _chartContainerNode: null, + _curtain: null, + + setData: function(blob) { + this._data = blob; + this._redraw(); + }, + + _redraw: function() { + if (!this._data) { + return; + } + + var hardpoint = this._rootNode; + var curtain = this._getCurtain(); + var container_node = this._getChartContainerNode(); + + var content = [ + container_node, + curtain.getNode(), + ]; + + JX.DOM.setContent(hardpoint, content); + + // Remove the old chart (if one exists) before drawing the new chart. + JX.DOM.setContent(container_node, []); + + var viewport = JX.Vector.getDim(container_node); + var config = this._data; + + function css_function(n) { + return n + '(' + JX.$A(arguments).slice(1).join(', ') + ')'; + } + + var padding = {}; + if (JX.Device.isDesktop()) { + padding = { + top: 24, + left: 48, + bottom: 48, + right: 12 + }; + } else { + padding = { + top: 12, + left: 36, + bottom: 24, + right: 4 + }; + } + + var size = { + frameWidth: viewport.x, + frameHeight: viewport.y, + }; + + size.width = size.frameWidth - padding.left - padding.right; + size.height = size.frameHeight - padding.top - padding.bottom; + + var x = d3.scaleTime() + .range([0, size.width]); + + var y = d3.scaleLinear() + .range([size.height, 0]); + + var xAxis = d3.axisBottom(x); + var yAxis = d3.axisLeft(y); + + var svg = d3.select(container_node).append('svg') + .attr('width', size.frameWidth) + .attr('height', size.frameHeight) + .attr('class', 'chart'); + + var g = svg.append('g') + .attr( + 'transform', + css_function('translate', padding.left, padding.top)); + + g.append('rect') + .attr('class', 'inner') + .attr('width', size.width) + .attr('height', size.height); + + x.domain([this._newDate(config.xMin), this._newDate(config.xMax)]); + y.domain([config.yMin, config.yMax]); + + var div = d3.select('body') + .append('div') + .attr('class', 'chart-tooltip') + .style('opacity', 0); + + curtain.reset(); + + for (var idx = 0; idx < config.datasets.length; idx++) { + var dataset = config.datasets[idx]; + + switch (dataset.type) { + case 'stacked-area': + this._newStackedArea(g, dataset, x, y, div, curtain); + break; + } + } + + curtain.redraw(); + + g.append('g') + .attr('class', 'x axis') + .attr('transform', css_function('translate', 0, size.height)) + .call(xAxis); + + g.append('g') + .attr('class', 'y axis') + .attr('transform', css_function('translate', 0, 0)) + .call(yAxis); + }, + + _newStackedArea: function(g, dataset, x, y, div, curtain) { + var ii; + + var to_date = JX.bind(this, this._newDate); + + var area = d3.area() + .x(function(d) { return x(to_date(d.x)); }) + .y0(function(d) { + // When the area is positive, draw it above the X axis. When the area + // is negative, draw it below the X axis. We currently avoid having + // functions which cross the X axis by clever construction. + if (d.y0 >= 0 && d.y1 >= 0) { + return y(d.y0); + } + + if (d.y0 <= 0 && d.y1 <= 0) { + return y(d.y0); + } + + return y(0); + }) + .y1(function(d) { return y(d.y1); }); + + var line = d3.line() + .x(function(d) { return x(to_date(d.x)); }) + .y(function(d) { return y(d.y1); }); + + for (ii = 0; ii < dataset.data.length; ii++) { + var label = new JX.ChartFunctionLabel(dataset.labels[ii]); + + var fill_color = label.getFillColor() || label.getColor(); + + g.append('path') + .style('fill', fill_color) + .attr('d', area(dataset.data[ii])); + + var stroke_color = label.getColor(); + + g.append('path') + .attr('class', 'line') + .style('stroke', stroke_color) + .attr('d', line(dataset.data[ii])); + + curtain.addFunctionLabel(label); + } + + // Now that we've drawn all the areas and lines, draw the dots. + for (ii = 0; ii < dataset.data.length; ii++) { + g.selectAll('dot') + .data(dataset.events[ii]) + .enter() + .append('circle') + .attr('class', 'point') + .attr('r', 3) + .attr('cx', function(d) { return x(to_date(d.x)); }) + .attr('cy', function(d) { return y(d.y1); }) + .on('mouseover', function(d) { + var dd = to_date(d.x); + + var d_y = dd.getFullYear(); + + // NOTE: Javascript months are zero-based. See PHI1017. + var d_m = dd.getMonth() + 1; + + var d_d = dd.getDate(); + + var y = parseInt(d.y1); + + var label = d.n + ' Points'; + + var view = + d_y + '-' + d_m + '-' + d_d + ': ' + y + '
    ' + + label; + + div + .html(view) + .style('opacity', 0.9) + .style('left', (d3.event.pageX - 60) + 'px') + .style('top', (d3.event.pageY - 38) + 'px'); + }) + .on('mouseout', function() { + div.style('opacity', 0); + }); + } + + }, + + _newDate: function(epoch) { + return new Date(epoch * 1000); + }, + + _getCurtain: function() { + if (!this._curtain) { + this._curtain = new JX.ChartCurtainView(); + } + return this._curtain; + }, + + _getChartContainerNode: function() { + if (!this._chartContainerNode) { + var attrs = { + className: 'chart-container' + }; + + this._chartContainerNode = JX.$N('div', attrs); + } + return this._chartContainerNode; + } + + } + +}); diff --git a/webroot/rsrc/js/application/fact/ChartCurtainView.js b/webroot/rsrc/js/application/fact/ChartCurtainView.js new file mode 100644 index 0000000000..95eb825d49 --- /dev/null +++ b/webroot/rsrc/js/application/fact/ChartCurtainView.js @@ -0,0 +1,89 @@ +/** + * @provides javelin-chart-curtain-view + */ +JX.install('ChartCurtainView', { + + construct: function() { + this._labels = []; + }, + + members: { + _node: null, + _labels: null, + _labelsNode: null, + + getNode: function() { + if (!this._node) { + var attr = { + className: 'chart-curtain' + }; + + this._node = JX.$N('div', attr); + } + return this._node; + }, + + reset: function() { + this._labels = []; + }, + + addFunctionLabel: function(label) { + this._labels.push(label); + return this; + }, + + redraw: function() { + var content = [this._getFunctionLabelsNode()]; + + JX.DOM.setContent(this.getNode(), content); + return this; + }, + + _getFunctionLabelsNode: function() { + if (!this._labels.length) { + return null; + } + + if (!this._labelsNode) { + var list_attrs = { + className: 'chart-function-label-list' + }; + + var labels = JX.$N('ul', list_attrs); + + var items = []; + for (var ii = 0; ii < this._labels.length; ii++) { + items.push(this._newFunctionLabelItem(this._labels[ii])); + } + + JX.DOM.setContent(labels, items); + + this._labelsNode = labels; + } + + return this._labelsNode; + }, + + _newFunctionLabelItem: function(label) { + var item_attrs = { + className: 'chart-function-label-list-item' + }; + + var icon = new JX.PHUIXIconView() + .setIcon(label.getIcon()); + + // Charts may use custom colors, so we can't rely on the CSS classes + // which only provide standard colors like "red" and "blue". + icon.getNode().style.color = label.getColor(); + + var content = [ + icon.getNode(), + label.getName() + ]; + + return JX.$N('li', item_attrs, content); + } + + } + +}); diff --git a/webroot/rsrc/js/application/fact/ChartFunctionLabel.js b/webroot/rsrc/js/application/fact/ChartFunctionLabel.js new file mode 100644 index 0000000000..17a943b240 --- /dev/null +++ b/webroot/rsrc/js/application/fact/ChartFunctionLabel.js @@ -0,0 +1,35 @@ +/** + * @provides javelin-chart-function-label + */ +JX.install('ChartFunctionLabel', { + + construct: function(spec) { + this._name = spec.name; + this._color = spec.color; + this._icon = spec.icon; + this._fillColor = spec.fillColor; + }, + + members: { + _name: null, + _color: null, + _icon: null, + _fillColor: null, + + getColor: function() { + return this._color; + }, + + getName: function() { + return this._name; + }, + + getIcon: function() { + return this._icon || 'fa-circle'; + }, + + getFillColor: function() { + return this._fillColor; + } + } +}); diff --git a/webroot/rsrc/js/application/files/behavior-document-engine.js b/webroot/rsrc/js/application/files/behavior-document-engine.js new file mode 100644 index 0000000000..caad5977bc --- /dev/null +++ b/webroot/rsrc/js/application/files/behavior-document-engine.js @@ -0,0 +1,479 @@ +/** + * @provides javelin-behavior-document-engine + * @requires javelin-behavior + * javelin-dom + * javelin-stratcom + */ + +JX.behavior('document-engine', function(config, statics) { + + function onmenu(e) { + var node = e.getNode('document-engine-view-dropdown'); + var data = JX.Stratcom.getData(node); + + if (data.menu) { + return; + } + + e.prevent(); + + var menu = new JX.PHUIXDropdownMenu(node); + var list = new JX.PHUIXActionListView(); + + var view; + var engines = []; + for (var ii = 0; ii < data.views.length; ii++) { + var spec = data.views[ii]; + + view = new JX.PHUIXActionView() + .setName(spec.name) + .setIcon(spec.icon) + .setIconColor(spec.color) + .setHref(spec.engineURI); + + view.setHandler(JX.bind(null, function(spec, e) { + if (!e.isNormalClick()) { + return; + } + + e.prevent(); + menu.close(); + + onview(data, spec, false); + }, spec)); + + list.addItem(view); + + engines.push({ + spec: spec, + view: view + }); + } + + list.addItem( + new JX.PHUIXActionView() + .setDivider(true)); + + var encode_item = new JX.PHUIXActionView() + .setName(data.encode.name) + .setIcon(data.encode.icon); + + var onencode = JX.bind(null, function(data, e) { + e.prevent(); + + if (encode_item.getDisabled()) { + return; + } + + new JX.Workflow(data.encode.uri, {encoding: data.encode.value}) + .setHandler(function(r) { + data.encode.value = r.encoding; + onview(data); + }) + .start(); + + menu.close(); + + }, data); + + encode_item.setHandler(onencode); + + list.addItem(encode_item); + + var highlight_item = new JX.PHUIXActionView() + .setName(data.highlight.name) + .setIcon(data.highlight.icon); + + var onhighlight = JX.bind(null, function(data, e) { + e.prevent(); + + if (highlight_item.getDisabled()) { + return; + } + + new JX.Workflow(data.highlight.uri, {highlight: data.highlight.value}) + .setHandler(function(r) { + data.highlight.value = r.highlight; + onview(data); + }) + .start(); + + menu.close(); + }, data); + + highlight_item.setHandler(onhighlight); + + list.addItem(highlight_item); + + var blame_item; + if (data.blame.uri) { + blame_item = new JX.PHUIXActionView() + .setIcon(data.blame.icon); + + var onblame = JX.bind(null, function(data, e) { + e.prevent(); + + if (blame_item.getDisabled()) { + return; + } + + data.blame.enabled = !data.blame.enabled; + onview(data); + + menu.close(); + }, data); + + blame_item.setHandler(onblame); + + list.addItem(blame_item); + } + + menu.setContent(list.getNode()); + + menu.listen('open', function() { + for (var ii = 0; ii < engines.length; ii++) { + var engine = engines[ii]; + + // Highlight the current rendering engine. + var is_selected = (engine.spec.viewKey == data.viewKey); + engine.view.setSelected(is_selected); + + if (is_selected) { + encode_item.setDisabled(!engine.spec.canEncode); + highlight_item.setDisabled(!engine.spec.canHighlight); + if (blame_item) { + blame_item.setDisabled(!engine.spec.canBlame); + } + } + } + + if (blame_item) { + var blame_label; + if (data.blame.enabled) { + blame_label = data.blame.hide; + } else { + blame_label = data.blame.show; + } + + blame_item.setName(blame_label); + } + }); + + data.menu = menu; + menu.open(); + } + + function add_params(uri, data) { + uri = JX.$U(uri); + + if (data.highlight.value) { + uri.setQueryParam('highlight', data.highlight.value); + } + + if (data.encode.value) { + uri.setQueryParam('encode', data.encode.value); + } + + if (data.blame.enabled) { + uri.setQueryParam('blame', null); + } else { + uri.setQueryParam('blame', 'off'); + } + + return uri.toString(); + } + + function onview(data, spec, immediate) { + if (!spec) { + for (var ii = 0; ii < data.views.length; ii++) { + if (data.views[ii].viewKey == data.viewKey) { + spec = data.views[ii]; + break; + } + } + } + + data.sequence = (data.sequence || 0) + 1; + var handler = JX.bind(null, onrender, data, data.sequence, spec); + + data.viewKey = spec.viewKey; + + var uri = add_params(spec.engineURI, data); + + new JX.Request(uri, handler) + .send(); + + if (data.loadingView) { + // If we're already showing "Loading...", immediately change it to + // show the new document type. + onloading(data, spec); + } else if (!immediate) { + // Otherwise, grey out the document and show "Loading..." after a + // short delay. This prevents the content from flickering when rendering + // is fast. + var viewport = JX.$(data.viewportID); + JX.DOM.alterClass(viewport, 'document-engine-in-flight', true); + + var load = JX.bind(null, onloading, data, spec); + data.loadTimer = setTimeout(load, 333); + + // Replace the URI with the URI for the specific rendering the user + // has selected. + + var view_uri = add_params(spec.viewURI, data); + JX.History.replace(view_uri); + } + } + + function onloading(data, spec) { + data.loadingView = true; + + var viewport = JX.$(data.viewportID); + JX.DOM.alterClass(viewport, 'document-engine-in-flight', false); + JX.DOM.setContent(viewport, JX.$H(spec.loadingMarkup)); + } + + function onrender(data, sequence, spec, r) { + // If this isn't the most recent request we sent, throw it away. This can + // happen if the user makes multiple selections from the menu while we are + // still rendering the first view. + if (sequence != data.sequence) { + return; + } + + if (data.loadTimer) { + clearTimeout(data.loadTimer); + data.loadTimer = null; + } + + var viewport = JX.$(data.viewportID); + + JX.DOM.alterClass(viewport, 'document-engine-in-flight', false); + data.loadingView = false; + + JX.DOM.setContent(viewport, JX.$H(r.markup)); + + // If this engine supports rendering blame, populate or draw it. + if (spec.canBlame && data.blame.enabled) { + blame(data); + } + } + + function blame(data) { + // If the rendering engine can't handle blame, bail. + if (!data.blame.uri) { + return; + } + + // If we already have an outstanding request for blame data, bail. + if (data.blame.request) { + return; + } + + // If we don't have blame data yet, request it and then try rendering + // again later. + if (!data.blame.value) { + var req = new JX.Request(data.blame.uri, JX.bind(null, onblame, data)); + data.blame.request = req; + req.send(); + return; + } + + // We're ready to render. + var viewport = JX.$(data.viewportID); + + var row_nodes = JX.DOM.scry(viewport, 'tr'); + var row_list = []; + var ii; + + for (ii = 0; ii < row_nodes.length; ii++) { + var row = {}; + var keep = false; + var node = row_nodes[ii]; + + for (var jj = 0; jj < node.childNodes.length; jj++) { + var child = node.childNodes[jj]; + + if (!JX.DOM.isType(child, 'th')) { + continue; + } + + var spec = child.getAttribute('data-blame'); + if (spec) { + row[spec] = child; + keep = true; + } + + if (spec === 'info') { + row.lines = child.getAttribute('data-blame-lines'); + } + } + + if (keep) { + row_list.push(row); + } + } + + var last = null; + for (ii = 0; ii < row_list.length; ii++) { + var commit = data.blame.value.blame[row_list[ii].lines - 1]; + row_list[ii].commit = commit; + row_list[ii].last = last; + last = commit; + } + + for (ii = 0; ii < row_list.length; ii++) { + renderBlame(row_list[ii], data.blame.value); + } + } + + function onblame(data, r) { + data.blame.request = null; + data.blame.value = r; + blame(data); + } + + function renderBlame(row, blame) { + var spec = blame.map[row.commit]; + + var info = null; + var skip = null; + + if (spec && (row.commit != row.last)) { + skip = JX.$H(spec.skip); + info = JX.$H(spec.info); + } + + if (row.skip) { + JX.DOM.setContent(row.skip, skip); + } + + if (row.info) { + JX.DOM.setContent(row.info, info); + } + + var epoch_range = (blame.epoch.max - blame.epoch.min); + + var epoch_value; + if (!epoch_range) { + epoch_value = 1; + } else { + epoch_value = (spec.epoch - blame.epoch.min) / epoch_range; + } + + var h_min = 0.04; + var h_max = 0.44; + var h = h_min + ((h_max - h_min) * epoch_value); + + var s = 0.25; + + var v_min = 0.92; + var v_max = 1.00; + var v = v_min + ((v_max - v_min) * epoch_value); + + row.info.style.background = getHSV(h, s, v); + } + + function getHSV(h, s, v) { + var r, g, b, i, f, p, q, t; + + i = Math.floor(h * 6); + f = h * 6 - i; + p = v * (1 - s); + q = v * (1 - f * s); + t = v * (1 - (1 - f) * s); + + switch (i % 6) { + case 0: r = v, g = t, b = p; break; + case 1: r = q, g = v, b = p; break; + case 2: r = p, g = v, b = t; break; + case 3: r = p, g = q, b = v; break; + case 4: r = t, g = p, b = v; break; + case 5: r = v, g = p, b = q; break; + } + + r = Math.round(r * 255); + g = Math.round(g * 255); + b = Math.round(b * 255); + + + return 'rgb(' + r + ', ' + g + ', ' + b + ')'; + } + + function onhovercoverage(data, e) { + if (e.getType() === 'mouseout') { + redraw_coverage(data, null); + return; + } + + var target = e.getNode('tag:th'); + var coverage = target.getAttribute('data-coverage'); + if (!coverage) { + return; + } + + redraw_coverage(data, target); + } + + var coverage_row = null; + function redraw_coverage(data, node) { + if (coverage_row) { + JX.DOM.alterClass( + coverage_row, + 'phabricator-source-coverage-highlight', + false); + coverage_row = null; + } + + if (!node) { + JX.Tooltip.hide(); + return; + } + + var coverage = node.getAttribute('data-coverage'); + coverage = coverage.split('/'); + + var idx = parseInt(coverage[0], 10); + var chr = coverage[1]; + + var map = data.coverage.labels[idx]; + if (map) { + var label = map[chr]; + if (label) { + JX.Tooltip.show(node, 300, 'W', label); + + coverage_row = JX.DOM.findAbove(node, 'tr'); + JX.DOM.alterClass( + coverage_row, + 'phabricator-source-coverage-highlight', + true); + } + } + } + + if (!statics.initialized) { + JX.Stratcom.listen('click', 'document-engine-view-dropdown', onmenu); + statics.initialized = true; + } + + if (config && config.controlID) { + var control = JX.$(config.controlID); + var data = JX.Stratcom.getData(control); + + switch (config.next) { + case 'render': + onview(data, null, true); + break; + case 'blame': + blame(data); + break; + } + + JX.DOM.listen( + JX.$(data.viewportID), + ['mouseover', 'mouseout'], + 'tag:th', + JX.bind(null, onhovercoverage, data)); + } + +}); diff --git a/webroot/rsrc/js/application/files/behavior-icon-composer.js b/webroot/rsrc/js/application/files/behavior-icon-composer.js new file mode 100644 index 0000000000..3a158a5ed9 --- /dev/null +++ b/webroot/rsrc/js/application/files/behavior-icon-composer.js @@ -0,0 +1,75 @@ +/** + * @provides javelin-behavior-icon-composer + * @requires javelin-behavior + * javelin-dom + * javelin-stratcom + */ + +JX.behavior('icon-composer', function(config) { + + var nodes = { + root: JX.$(config.dialogID), + colorInput: JX.$(config.colorInputID), + iconInput: JX.$(config.iconInputID), + preview: JX.$(config.previewID) + }; + + var selected = { + color: config.defaultColor, + icon: config.defaultIcon + }; + + var redraw = function() { + var ii; + + var colors = JX.DOM.scry(nodes.root, 'button', 'compose-select-color'); + for (ii = 0; ii < colors.length; ii++) { + JX.DOM.alterClass( + colors[ii], + 'profile-image-button-selected', + (JX.Stratcom.getData(colors[ii]).color == selected.color)); + } + + var icons = JX.DOM.scry(nodes.root, 'button', 'compose-select-icon'); + for (ii = 0; ii < icons.length; ii++) { + JX.DOM.alterClass( + icons[ii], + 'profile-image-button-selected', + (JX.Stratcom.getData(icons[ii]).icon == selected.icon)); + } + + nodes.colorInput.value = selected.color; + nodes.iconInput.value = selected.icon; + + var classes = ['phui-icon-view', 'phui-font-fa', 'compose-icon-bg']; + classes.push('compose-background-' + selected.color); + classes.push(selected.icon); + + nodes.preview.className = classes.join(' '); + }; + + JX.DOM.listen( + nodes.root, + 'click', + 'compose-select-color', + function (e) { + e.kill(); + + selected.color = e.getNodeData('compose-select-color').color; + redraw(); + }); + + JX.DOM.listen( + nodes.root, + 'click', + 'compose-select-icon', + function (e) { + e.kill(); + + selected.icon = e.getNodeData('compose-select-icon').icon; + redraw(); + }); + + redraw(); + +}); diff --git a/webroot/rsrc/js/application/files/behavior-launch-icon-composer.js b/webroot/rsrc/js/application/files/behavior-launch-icon-composer.js new file mode 100644 index 0000000000..65a1903690 --- /dev/null +++ b/webroot/rsrc/js/application/files/behavior-launch-icon-composer.js @@ -0,0 +1,24 @@ +/** + * @provides javelin-behavior-launch-icon-composer + * @requires javelin-behavior + * javelin-dom + * javelin-workflow + */ + +JX.behavior('launch-icon-composer', function(config) { + + JX.DOM.listen( + JX.$(config.launchID), + 'click', + null, + function(e) { + e.kill(); + new JX.Workflow('/file/compose/') + .setHandler(function(r) { + JX.$(config.inputID).value = r.phid; + JX.DOM.findAbove(e.getTarget(), 'form').submit(); + }) + .start(); + }); + +}); diff --git a/webroot/rsrc/js/application/harbormaster/behavior-harbormaster-log.js b/webroot/rsrc/js/application/harbormaster/behavior-harbormaster-log.js new file mode 100644 index 0000000000..db60c47055 --- /dev/null +++ b/webroot/rsrc/js/application/harbormaster/behavior-harbormaster-log.js @@ -0,0 +1,114 @@ +/** + * @provides javelin-behavior-harbormaster-log + * @requires javelin-behavior + */ + +JX.behavior('harbormaster-log', function(config) { + var contentNode = JX.$(config.contentNodeID); + + var following = false; + var autoscroll = false; + + JX.DOM.listen(contentNode, 'click', 'harbormaster-log-expand', function(e) { + if (!e.isNormalClick()) { + return; + } + + e.kill(); + + expand(e.getNode('harbormaster-log-expand'), true); + }); + + function expand(node, is_action) { + var row = JX.DOM.findAbove(node, 'tr'); + row = JX.DOM.findAbove(row, 'tr'); + + var data = JX.Stratcom.getData(node); + + if (data.stop) { + following = false; + autoscroll = false; + JX.DOM.alterClass(contentNode, 'harbormaster-log-following', false); + return; + } + + var uri = new JX.URI(config.renderURI) + .addQueryParams(data); + + if (data.live && is_action) { + following = true; + autoscroll = true; + JX.DOM.alterClass(contentNode, 'harbormaster-log-following', true); + } + + var request = new JX.Request(uri, function(r) { + var result = JX.$H(r.markup).getNode(); + var rows = [].slice.apply(result.firstChild.childNodes); + + // If we're following the bottom of the log, the result always includes + // the last line from the previous render. Throw it away, then add the + // new data. + if (data.live && row.previousSibling) { + JX.DOM.remove(row.previousSibling); + } + + JX.DOM.replace(row, rows); + + if (data.live) { + // If this was a live follow, scroll the new data into view. This is + // probably intensely annoying in practice but seems cool for now. + if (autoscroll) { + var last_row = rows[rows.length - 1]; + var tail_pos = JX.$V(last_row).y + JX.Vector.getDim(last_row).y; + var view_y = JX.Vector.getViewport().y; + JX.DOM.scrollToPosition(null, (tail_pos - view_y) + 32); + + // This will fire a scroll event, but we want to keep autoscroll + // enabled until we see an explicit scroll event by the user. + setTimeout(function() { autoscroll = true; }, 0); + } + + setTimeout(follow, 2000); + + for (var ii = 1; ii < (rows.length - 1); ii++) { + JX.DOM.alterClass(rows[ii], 'harbormaster-log-appear', true); + } + } + }); + + request.send(); + } + + // If the user explicitly scrolls while following a log, keep live updating + // it but stop following it with the scrollbar. + JX.Stratcom.listen('scroll', null, function() { + autoscroll = false; + }); + + function follow() { + if (!following) { + return; + } + + var live; + try { + live = JX.DOM.find(contentNode, 'a', 'harbormaster-log-live'); + } catch (e) { + return; + } + + expand(live); + } + + function onresponse(r) { + JX.DOM.alterClass(contentNode, 'harbormaster-log-view-loading', false); + + JX.DOM.setContent(contentNode, JX.$H(r.markup)); + } + + var uri = new JX.URI(config.initialURI); + + new JX.Request(uri, onresponse) + .send(); + +}); diff --git a/webroot/rsrc/js/application/herald/HeraldRuleEditor.js b/webroot/rsrc/js/application/herald/HeraldRuleEditor.js index f036e330c7..254061533a 100644 --- a/webroot/rsrc/js/application/herald/HeraldRuleEditor.js +++ b/webroot/rsrc/js/application/herald/HeraldRuleEditor.js @@ -1,11 +1,8 @@ /** * @requires multirow-row-manager * javelin-install - * javelin-typeahead * javelin-util * javelin-dom - * javelin-tokenizer - * javelin-typeahead-preloaded-source * javelin-stratcom * javelin-json * phabricator-prefab @@ -102,7 +99,7 @@ JX.install('HeraldRuleEditor', { this._onactionchange(row); } }, - _onsubmit : function(e) { + _onsubmit : function() { var rule = JX.DOM.find(this._root, 'input', 'rule'); var k; @@ -111,7 +108,6 @@ JX.install('HeraldRuleEditor', { this._config.conditions[k][2] = this._getConditionValue(k); } - var acts = this._config.actions; for (k in this._config.actions) { this._config.actions[k][1] = this._getActionTarget(k); } @@ -163,6 +159,11 @@ JX.install('HeraldRuleEditor', { JX.DOM.setContent(condition_cell, condition_select); this._onconditionchange(r); + + var condition_name = this._config.conditions[row_id][1]; + if (condition_name == 'unconditionally') { + JX.DOM.hide(condition_select); + } }, _onconditionchange : function(r) { var target = JX.DOM.find(r, 'select', 'condition-select'); @@ -200,41 +201,54 @@ JX.install('HeraldRuleEditor', { }, _buildInput : function(type) { + var spec = this._config.info.valueMap[type]; + var input; var get_fn; var set_fn; - switch (type) { - case 'rule': - input = this._renderSelect(this._config.template.rules); - get_fn = function() { return input.value; }; - set_fn = function(v) { input.value = v; }; - break; - case 'email': - case 'user': - case 'repository': - case 'tag': - case 'package': - case 'project': - var tokenizer = this._newTokenizer(type); - input = tokenizer[0]; - get_fn = tokenizer[1]; - set_fn = tokenizer[2]; - break; - case 'none': - input = ''; + switch (spec.control) { + case 'herald.control.none': + input = null; get_fn = JX.bag; set_fn = JX.bag; break; - case 'flagcolor': - input = this._renderSelect(this._config.template.colors); + case 'herald.control.text': + input = JX.$N('input', {type: 'text'}); get_fn = function() { return input.value; }; set_fn = function(v) { input.value = v; }; - set_fn(this._config.template.defaultColor); break; - default: - input = JX.$N('input', {type: 'text'}); + case 'herald.control.remarkup': + input = JX.$N('textarea'); + get_fn = function() { return input.value; }; + set_fn = function(v) { input.value = v; }; + break; + case 'herald.control.select': + var options; + + // NOTE: This is a hacky special case for "Another Herald Rule", + // which we don't currently generate normal options for. + + if (spec.key == 'select.rule') { + options = this._config.template.rules; + } else { + options = spec.template.options; + } + + input = this._renderSelect(options); get_fn = function() { return input.value; }; set_fn = function(v) { input.value = v; }; + if (spec.template.default) { + set_fn(spec.template.default); + } + break; + case 'herald.control.tokenizer': + var tokenizer = this._newTokenizer(spec.template.tokenizer); + input = tokenizer[0]; + get_fn = tokenizer[1]; + set_fn = tokenizer[2]; + break; + default: + JX.$E('No rules to build control "' + spec.control + '".'); break; } @@ -265,32 +279,38 @@ JX.install('HeraldRuleEditor', { return node; }, - _newTokenizer : function(type, limit) { - var template = JX.$N( - 'div', - JX.$H(this._config.template.markup)); - template = template.firstChild; - template.id = ''; - - var datasource = new JX.TypeaheadPreloadedSource( - this._config.template.source[type]); - - var typeahead = new JX.Typeahead(template); - typeahead.setDatasource(datasource); + _newTokenizer : function(spec) { + var tokenizerConfig = { + src: spec.datasourceURI, + placeholder: spec.placeholder, + browseURI: spec.browseURI, + limit: spec.limit + }; - var tokenizer = new JX.Tokenizer(template); - tokenizer.setLimit(limit); - tokenizer.setTypeahead(typeahead); - tokenizer.start(); + var build = JX.Prefab.newTokenizerFromTemplate( + this._config.template.markup, + tokenizerConfig); + build.tokenizer.start(); return [ - template, + build.node, function() { - return tokenizer.getTokens(); + return build.tokenizer.getTokens(); }, function(map) { for (var k in map) { - tokenizer.addToken(k, map[k]); + var v = map[k]; + + // The control value may be set from wire values from the server, + // or a transformed value from another control, or a bare string + // value from another control. + if (typeof v == 'string') { + v = v; + } else if (!v.hasOwnProperty('id')) { + v = JX.Prefab.transformDatasourceResults(v); + } + + build.tokenizer.addToken(k, v); } }]; }, @@ -309,7 +329,14 @@ JX.install('HeraldRuleEditor', { _newCondition : function(data) { var row = this._conditionsRowManager.addRow([]); var row_id = this._conditionsRowManager.getRowID(row); - this._config.conditions[row_id] = data || [null, null, '']; + + var default_condition = [ + this._config.default.field, + this._config.default.condition, + null + ]; + this._config.conditions[row_id] = data || default_condition; + var r = this._conditionsRowManager.updateRow( row_id, this._renderCondition(row_id)); @@ -317,10 +344,17 @@ JX.install('HeraldRuleEditor', { this._onfieldchange(r); }, _renderCondition : function(row_id) { - var field_select = this._renderSelect( - this._config.info.fields, - this._config.conditions[row_id][0], - 'field-select'); + var groups = this._config.info.fields; + + var attrs = { + sigil: 'field-select' + }; + + var field_select = this._renderGroupSelect( + groups, + attrs, + this._config.conditions[row_id][0]); + var field_cell = JX.$N('td', {sigil: 'field-cell'}, field_select); var condition_cell = JX.$N('td', {sigil: 'condition-cell'}); @@ -334,8 +368,48 @@ JX.install('HeraldRuleEditor', { delete actions[k]; } }, + + _renderGroupSelect: function(groups, attrs, value) { + var optgroups = []; + for (var ii = 0; ii < groups.length; ii++) { + var group = groups[ii]; + var options = []; + for (var k in group.options) { + var option = group.options[k]; + + var name = option.name; + var available = option.available; + + // See T7961. If the option is not marked as "available", we only + // include it in the dropdown if the dropdown already has it as a + // value. We want to hide options provided by applications which are + // not installed, but do not want to break existing rules. + + if (available || (k === value)) { + options.push(JX.$N('option', {value: k}, name)); + } + } + if (options.length) { + optgroups.push(JX.$N('optgroup', {label: group.label}, options)); + } + } + + var select = JX.$N('select', attrs, optgroups); + + if (value !== undefined) { + select.value = value; + } + + return select; + }, + _newAction : function(data) { - data = data || []; + var default_action = [ + this._config.default.action, + null + ]; + + data = data || default_action; var temprow = this._actionsRowManager.addRow([]); var row_id = this._actionsRowManager.getRowID(temprow); this._config.actions[row_id] = data; @@ -343,11 +417,18 @@ JX.install('HeraldRuleEditor', { this._renderAction(data)); this._onactionchange(r); }, + _renderAction : function(action) { - var action_select = this._renderSelect( - this._config.info.actions, - action[0], - 'action-select'); + var groups = this._config.info.actions; + var attrs = { + sigil: 'action-select' + }; + + var action_select = this._renderGroupSelect( + groups, + attrs, + action[0]); + var action_cell = JX.$N('td', {sigil: 'action-cell'}, action_select); var target_cell = JX.$N( diff --git a/webroot/rsrc/js/application/herald/PathTypeahead.js b/webroot/rsrc/js/application/herald/PathTypeahead.js index 988d728ced..eed6e62b62 100644 --- a/webroot/rsrc/js/application/herald/PathTypeahead.js +++ b/webroot/rsrc/js/application/herald/PathTypeahead.js @@ -11,27 +11,22 @@ JX.install('PathTypeahead', { construct : function(config) { - this._repositorySelect = config.repo_select; + this._repositoryTokenizer = config.repositoryTokenizer; this._hardpoint = config.hardpoint; this._input = config.path_input; this._completeURI = config.completeURI; this._validateURI = config.validateURI; this._errorDisplay = config.error_display; + this._textInputValues = {}; - /* - * Default values to preload the typeahead with, for extremely common - * cases. - */ - this._textInputValues = config.repositoryDefaultPaths; + this._icons = config.icons; this._initializeDatasource(); this._initializeTypeahead(this._input); }, members : { - /* - * DOM
    " in this + // row with a number in it. We may need to skip over one "" if the + // diff is being displayed in unified mode. + + var cell = JX.DOM.findAbove(target, 'td'); + if (!cell) { + return null; + } + + var row = JX.DOM.findAbove(target, 'tr'); + if (!row) { + return null; + } + + var ii; + + var cell_list = []; + for (ii = 0; ii < row.childNodes.length; ii++) { + cell_list.push(row.childNodes[ii]); + } + cell_list.reverse(); + + var found = false; + for (ii = 0; ii < cell_list.length; ii++) { + if (cell_list[ii] === cell) { + found = true; + } + + if (found && JX.DOM.isType(cell_list[ii], 'th')) { + var int_value = parseInt(cell_list[ii].textContent, 10); + if (int_value) { + return int_value; + } + } + } + + return null; + } + + function getPath(target) { + // This method works in Differential, when browsing a changeset. + var changeset; + try { + changeset = JX.DOM.findAbove(target, 'div', 'differential-changeset'); + return JX.Stratcom.getData(changeset).symbolPath || null; + } catch (ex) { + // Ignore. + } + + return null; + } + + function getChar(target) { + var cell = JX.DOM.findAbove(target, 'td'); + if (!cell) { + return null; + } + + var char = 1; + for (var ii = 0; ii < cell.childNodes.length; ii++) { + var node = cell.childNodes[ii]; + + if (node === target) { + return char; + } + + var content = '' + node.textContent; + char += content.length; + } + + return null; } JX.Stratcom.listen( @@ -77,4 +280,96 @@ JX.behavior('repository-crossreference', function(config) { linkAll(e.getData().container); }); + + JX.Stratcom.listen( + ['keydown', 'keyup'], + null, + function(e) { + if (!isHighlightModifierKey(e)) { + return; + } + + setCursorMode(e.getType() === 'keydown'); + + if (!statics.active) { + unhighlight(); + } + }); + + JX.Stratcom.listen( + 'blur', + null, + function(e) { + if (e.getTarget()) { + return; + } + unhighlight(); + setCursorMode(false); + }); + + function setCursorMode(active) { + statics.active = active; + linked.forEach(function(element) { + JX.DOM.alterClass(element, classMouseCursor, statics.active); + }); + } + + + if (config && config.container) { + link(JX.$(config.container), config.lang); + } + + JX.Stratcom.listen( + ['mouseover', 'mouseout', 'click'], + ['has-symbols', 'tag:span'], + function(e) { + var type = e.getType(); + + if (type === 'mouseout') { + unhighlight(); + return; + } + + if (!hasHighlightModifierKey(e)) { + return; + } + + var target = e.getTarget(); + + if (!canLinkNode(target)) { + return; + } + + // If only part of the symbol was edited, the symbol name itself will + // have another "" inside of it which highlights only the + // edited part. Skip over it. + if (JX.DOM.isNode(target, 'span') && (target.className === 'bright')) { + target = target.parentNode; + } + + if (type === 'click') { + openSearch(target, e.getNodeData('has-symbols').symbols); + e.kill(); + return; + } + + if (e.getType() === 'mouseover') { + while (target && target !== document.body) { + if (!JX.DOM.isNode(target, 'span')) { + target = target.parentNode; + continue; + } + + if (!class_map.hasOwnProperty(target.className)) { + target = target.parentNode; + continue; + } + + highlighted = target; + JX.DOM.alterClass(highlighted, classHighlight, true); + break; + } + } + }); + }); diff --git a/webroot/rsrc/js/application/search/behavior-reorder-profile-menu-items.js b/webroot/rsrc/js/application/search/behavior-reorder-profile-menu-items.js new file mode 100644 index 0000000000..8b0ca71e40 --- /dev/null +++ b/webroot/rsrc/js/application/search/behavior-reorder-profile-menu-items.js @@ -0,0 +1,41 @@ +/** + * @provides javelin-behavior-reorder-profile-menu-items + * @requires javelin-behavior + * javelin-stratcom + * javelin-workflow + * javelin-dom + * phabricator-draggable-list + */ + +JX.behavior('reorder-profile-menu-items', function(config) { + + var root = JX.$(config.listID); + + var list = new JX.DraggableList('profile-menu-item', root) + .setFindItemsHandler(function() { + return JX.DOM.scry(root, 'li', 'profile-menu-item'); + }); + + list.listen('didDrop', function(node) { + var nodes = list.findItems(); + var order = []; + var key; + for (var ii = 0; ii < nodes.length; ii++) { + key = JX.Stratcom.getData(nodes[ii]).key; + if (key) { + order.push(key); + } + } + + list.lock(); + JX.DOM.alterClass(node, 'drag-sending', true); + + new JX.Workflow(config.orderURI, {order: order.join()}) + .setHandler(function() { + JX.DOM.alterClass(node, 'drag-sending', false); + list.unlock(); + }) + .start(); + }); + +}); diff --git a/webroot/rsrc/js/application/search/behavior-reorder-queries.js b/webroot/rsrc/js/application/search/behavior-reorder-queries.js index 8a7359f12c..42ba03f7fa 100644 --- a/webroot/rsrc/js/application/search/behavior-reorder-queries.js +++ b/webroot/rsrc/js/application/search/behavior-reorder-queries.js @@ -16,7 +16,7 @@ JX.behavior('search-reorder-queries', function(config) { return JX.DOM.scry(root, 'li', 'named-query'); }); - list.listen('didDrop', function(node, after) { + list.listen('didDrop', function(node) { var nodes = list.findItems(); var order = []; var key; @@ -31,7 +31,7 @@ JX.behavior('search-reorder-queries', function(config) { JX.DOM.alterClass(node, 'drag-sending', true); new JX.Workflow(config.orderURI, {order: order.join()}) - .setHandler(function(e) { + .setHandler(function() { JX.DOM.alterClass(node, 'drag-sending', false); list.unlock(); }) @@ -39,4 +39,3 @@ JX.behavior('search-reorder-queries', function(config) { }); }); - diff --git a/webroot/rsrc/js/application/slowvote/behavior-slowvote-embed.js b/webroot/rsrc/js/application/slowvote/behavior-slowvote-embed.js deleted file mode 100644 index b762c1c74b..0000000000 --- a/webroot/rsrc/js/application/slowvote/behavior-slowvote-embed.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @provides javelin-behavior-slowvote-embed - * @requires javelin-behavior - * javelin-request - * javelin-stratcom - * javelin-dom - */ -JX.behavior('slowvote-embed', function(config) { - JX.Stratcom.listen( - ['click'], - 'slowvote-option', - function(e) { - if (!e.isNormalMouseEvent()) { - return; - } - e.kill(); - - var pollID = e.getNodeData('slowvote-embed').pollID; - var voteURI = '/vote/' + pollID + '/'; - - var request = new JX.Request(voteURI, function(r) { - var updated_poll = JX.$H(r.contentHTML); - var root = JX.$('base-page'); - - var polls = JX.DOM.scry(root, 'div', 'slowvote-embed'); - - for(var i = 0; i < polls.length; i++) { - var data = JX.Stratcom.getData(polls[i]); - - if (data.pollID == pollID) { - JX.DOM.replace(polls[i], updated_poll); - } - - } - - }); - - request.addData({vote: e.getNodeData('slowvote-option').optionID}); - request.send(); - - }); - -}); diff --git a/webroot/rsrc/js/application/transactions/behavior-comment-actions.js b/webroot/rsrc/js/application/transactions/behavior-comment-actions.js new file mode 100644 index 0000000000..e5d7b27b25 --- /dev/null +++ b/webroot/rsrc/js/application/transactions/behavior-comment-actions.js @@ -0,0 +1,289 @@ +/** + * @provides javelin-behavior-comment-actions + * @requires javelin-behavior + * javelin-stratcom + * javelin-workflow + * javelin-dom + * phuix-form-control-view + * phuix-icon-view + * javelin-behavior-phabricator-gesture + */ + +JX.behavior('comment-actions', function(config) { + var action_map = config.actions; + + var action_node = JX.$(config.actionID); + var form_node = JX.$(config.formID); + var input_node = JX.$(config.inputID); + var place_node = JX.$(config.placeID); + + var rows = {}; + + JX.DOM.listen(action_node, 'change', null, function() { + var option = find_option(action_node.value); + + action_node.value = '+'; + + if (option) { + add_row(option); + } + }); + + function find_option(key) { + var options = action_node.options; + var option; + + for (var ii = 0; ii < options.length; ii++) { + option = options[ii]; + if (option.value == key) { + return option; + } + } + + return null; + } + + function redraw() { + // If any of the stacked actions specify that they change the label for + // the "Submit" button, update the button text. Otherwise, return it to + // the default text. + var button_text = config.defaultButtonText; + for (var k in rows) { + var action = action_map[k]; + if (action.buttonText) { + button_text = action.buttonText; + } + } + + var button_node = JX.DOM.find(form_node, 'button', 'submit-transactions'); + JX.DOM.setContent(button_node, button_text); + } + + function remove_action(key) { + var row = rows[key]; + if (row) { + JX.DOM.remove(row.node); + row.option.disabled = false; + delete rows[key]; + } + + redraw(); + } + + function serialize_actions() { + var data = []; + + for (var k in rows) { + data.push({ + type: k, + value: rows[k].control.getValue(), + initialValue: action_map[k].initialValue || null + }); + } + + return JX.JSON.stringify(data); + } + + function get_data() { + var data = JX.DOM.convertFormToDictionary(form_node); + + data.__preview__ = 1; + data[input_node.name] = serialize_actions(); + + data.viewData = JX.JSON.stringify(config.viewData); + + return data; + } + + function restore_draft_actions(drafts) { + var draft; + var option; + var control; + + for (var ii = 0; ii < drafts.length; ii++) { + draft = drafts[ii]; + + option = find_option(draft); + if (!option) { + continue; + } + + control = add_row(option); + } + + redraw(); + } + + function onresponse(response) { + if (JX.Device.getDevice() != 'desktop') { + return; + } + + var panel = JX.$(config.panelID); + if (!response.xactions.length) { + JX.DOM.hide(panel); + } else { + var preview_root = JX.$(config.timelineID); + JX.DOM.setContent( + preview_root, + [ + JX.$H(response.header), + JX.$H(response.xactions.join('')), + JX.$H(response.previewContent) + ]); + JX.DOM.show(panel); + + // NOTE: Resonses are currently processed before associated behaviors are + // registered. We need to defer invoking this event so that any behaviors + // accompanying the response are registered. + var invoke_preview = function() { + JX.Stratcom.invoke( + 'EditEngine.didCommentPreview', + null, + { + rootNode: preview_root + }); + }; + setTimeout(invoke_preview, 0); + } + } + + function force_preview() { + if (!config.showPreview) { + return; + } + + new JX.Request(config.actionURI, onresponse) + .setData(get_data()) + .send(); + } + + function add_row(option) { + var action = action_map[option.value]; + if (!action) { + return; + } + + // Remove any conflicting actions. For example, "Accept Revision" conflicts + // with "Reject Revision". + var conflict_key = action.conflictKey || null; + if (conflict_key !== null) { + for (var k in action_map) { + if (k === action.key) { + continue; + } + if (action_map[k].conflictKey !== conflict_key) { + continue; + } + + if (!(k in rows)) { + continue; + } + + remove_action(k); + } + } + + option.disabled = true; + + var aural = JX.$N('span', {className: 'aural-only'}, action.auralLabel); + + var icon = new JX.PHUIXIconView() + .setIcon('fa-times-circle'); + + var remove = JX.$N('a', {href: '#'}, [aural, icon.getNode()]); + + var control = new JX.PHUIXFormControl() + .setLabel(action.label) + .setError(remove) + .setControl(action.type, action.spec) + .setClass('phui-comment-action'); + var node = control.getNode(); + + JX.Stratcom.addSigil(node, 'touchable'); + + JX.DOM.listen(node, 'gesture.swipe.end', null, function(e) { + var data = e.getData(); + + if (data.direction != 'left') { + // Didn't swipe left. + return; + } + + if (data.length <= (JX.Vector.getDim(node).x / 2)) { + // Didn't swipe far enough. + return; + } + + remove_action(action.key); + }); + + rows[action.key] = { + control: control, + node: node, + option: option + }; + + JX.DOM.listen(remove, 'click', null, function(e) { + e.kill(); + remove_action(action.key); + }); + + place_node.parentNode.insertBefore(node, place_node); + + redraw(); + + force_preview(); + + return control; + } + + JX.DOM.listen(form_node, ['submit', 'didSyntheticSubmit'], null, function() { + input_node.value = serialize_actions(); + }); + + if (config.showPreview) { + var request = new JX.PhabricatorShapedRequest( + config.actionURI, + onresponse, + get_data); + + var trigger = JX.bind(request, request.trigger); + + JX.DOM.listen(form_node, 'keydown', null, trigger); + + JX.DOM.listen(form_node, 'shouldRefresh', null, force_preview); + request.start(); + + var old_device = JX.Device.getDevice(); + + var ondevicechange = function() { + var new_device = JX.Device.getDevice(); + + var panel = JX.$(config.panelID); + if (new_device == 'desktop') { + request.setRateLimit(500); + + // Force an immediate refresh if we switched from another device type + // to desktop. + if (old_device != new_device) { + force_preview(); + } + } else { + // On mobile, don't show live previews and only save drafts every + // 10 seconds. + request.setRateLimit(10000); + JX.DOM.hide(panel); + } + + old_device = new_device; + }; + + ondevicechange(); + + JX.Stratcom.listen('phabricator-device-change', null, ondevicechange); + } + + restore_draft_actions(config.drafts || []); + +}); diff --git a/webroot/rsrc/js/application/transactions/behavior-reorder-configs.js b/webroot/rsrc/js/application/transactions/behavior-reorder-configs.js new file mode 100644 index 0000000000..9d1dba969a --- /dev/null +++ b/webroot/rsrc/js/application/transactions/behavior-reorder-configs.js @@ -0,0 +1,32 @@ +/** + * @provides javelin-behavior-editengine-reorder-configs + * @requires javelin-behavior + * javelin-stratcom + * javelin-workflow + * javelin-dom + * phabricator-draggable-list + */ + +JX.behavior('editengine-reorder-configs', function(config) { + + var root = JX.$(config.listID); + + var list = new JX.DraggableList('editengine-form-config', root) + .setFindItemsHandler(function() { + return JX.DOM.scry(root, 'li', 'editengine-form-config'); + }); + + list.listen('didDrop', function() { + var nodes = list.findItems(); + + var data; + var keys = []; + for (var ii = 0; ii < nodes.length; ii++) { + data = JX.Stratcom.getData(nodes[ii]); + keys.push(data.formIdentifier); + } + + JX.$(config.inputID).value = keys.join(','); + }); + +}); diff --git a/webroot/rsrc/js/application/transactions/behavior-reorder-fields.js b/webroot/rsrc/js/application/transactions/behavior-reorder-fields.js new file mode 100644 index 0000000000..bfb31f35af --- /dev/null +++ b/webroot/rsrc/js/application/transactions/behavior-reorder-fields.js @@ -0,0 +1,32 @@ +/** + * @provides javelin-behavior-editengine-reorder-fields + * @requires javelin-behavior + * javelin-stratcom + * javelin-workflow + * javelin-dom + * phabricator-draggable-list + */ + +JX.behavior('editengine-reorder-fields', function(config) { + + var root = JX.$(config.listID); + + var list = new JX.DraggableList('editengine-form-field', root) + .setFindItemsHandler(function() { + return JX.DOM.scry(root, 'li', 'editengine-form-field'); + }); + + list.listen('didDrop', function() { + var nodes = list.findItems(); + + var data; + var keys = []; + for (var ii = 0; ii < nodes.length; ii++) { + data = JX.Stratcom.getData(nodes[ii]); + keys.push(data.fieldKey); + } + + JX.$(config.inputID).value = keys.join(','); + }); + +}); diff --git a/webroot/rsrc/js/application/transactions/behavior-show-older-transactions.js b/webroot/rsrc/js/application/transactions/behavior-show-older-transactions.js new file mode 100644 index 0000000000..5e76b1608f --- /dev/null +++ b/webroot/rsrc/js/application/transactions/behavior-show-older-transactions.js @@ -0,0 +1,120 @@ +/** + * @provides javelin-behavior-phabricator-show-older-transactions + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + * phabricator-busy + */ + +JX.behavior('phabricator-show-older-transactions', function(config) { + + function get_hash() { + return window.location.hash.replace(/^#/, ''); + } + + function hash_is_hidden() { + var hash = get_hash(); + if (!hash) { + return false; + } + + // If the hash isn't purely numeric, ignore it. Comments always have + // numeric hashes. See PHI43 and T12970. + if (!hash.match(/^\d+$/)) { + return false; + } + + var id = 'anchor-'+hash; + try { + JX.$(id); + } catch (not_found_exception) { + return true; + } + return false; + } + + function check_hash() { + if (hash_is_hidden()) { + load_older(load_hidden_hash_callback); + } + } + + function load_older(callback) { + var showOlderBlock = null; + try { + showOlderBlock = JX.DOM.find( + JX.$(config.timelineID), + 'div', + 'show-older-block'); + } catch (not_found_exception) { + // we loaded everything...! + return; + } + + var showOlderLink = JX.DOM.find( + showOlderBlock, + 'a', + 'show-older-link'); + var workflow = fetch_older_workflow( + showOlderLink.href, + callback, + showOlderBlock); + var routable = workflow.getRoutable() + .setPriority(2000) + .setType('workflow'); + JX.Router.getInstance().queue(routable); + } + + var show_older = function(swap, r) { + JX.DOM.replace(swap, JX.$H(r.timeline).getFragment()); + JX.Stratcom.invoke('resize'); + }; + + var load_hidden_hash_callback = function(swap, r) { + show_older(swap, r); + + // We aren't actually doing a scroll position because + // `behavior-watch-anchor` will handle that for us. + }; + + var load_all_older_callback = function(swap, r) { + show_older(swap, r); + load_older(load_all_older_callback); + }; + + var fetch_older_workflow = function(href, callback, swap) { + var params = { + viewData: JX.JSON.stringify(config.viewData) + }; + + return new JX.Workflow(href, params) + .setHandler(JX.bind(null, callback, swap)); + }; + + JX.Stratcom.listen( + 'click', + ['show-older-block'], + function(e) { + e.kill(); + var workflow = fetch_older_workflow( + JX.DOM.find( + e.getNode('show-older-block'), + 'a', + 'show-older-link').href, + show_older, + e.getNode('show-older-block')); + var routable = workflow.getRoutable() + .setPriority(2000) + .setType('workflow'); + JX.Router.getInstance().queue(routable); + }); + + JX.Stratcom.listen('hashchange', null, check_hash); + + check_hash(); + + new JX.KeyboardShortcut(['@'], 'Show all older changes in the timeline.') + .setGroup('xactions') + .setHandler(JX.bind(null, load_older, load_all_older_callback)) + .register(); +}); diff --git a/webroot/rsrc/js/application/transactions/behavior-transaction-comment-form.js b/webroot/rsrc/js/application/transactions/behavior-transaction-comment-form.js index 93f5da08ad..935116c3b3 100644 --- a/webroot/rsrc/js/application/transactions/behavior-transaction-comment-form.js +++ b/webroot/rsrc/js/application/transactions/behavior-transaction-comment-form.js @@ -3,7 +3,6 @@ * @requires javelin-behavior * javelin-dom * javelin-util - * javelin-fx * javelin-request * phabricator-shaped-request */ @@ -12,36 +11,9 @@ JX.behavior('phabricator-transaction-comment-form', function(config) { var form = JX.$(config.formID); - JX.DOM.listen(form, 'willSubmit', null, function (e) { - e.kill(); - if (config.showPreview) { - var preview = JX.$(config.panelID); - preview.style.opacity = 0.5; - } - }); - - JX.DOM.listen(form, 'willClear', null, function(e) { - JX.$(config.commentID).value = ''; - - if (config.showPreview) { - var preview = JX.$(config.panelID); - new JX.FX(preview) - .setDuration(500) - .then(function () { - new JX.FX(preview).setDuration(1000).start({opacity: [0, 1]}); - }) - .start({opacity: [0.5, 0]}); - } - }); - var getdata = function() { var obj = JX.DOM.convertFormToDictionary(form); obj.__preview__ = 1; - - if (config.draftKey) { - obj.__draft__ = config.draftKey; - } - return obj; }; @@ -54,8 +26,7 @@ JX.behavior('phabricator-transaction-comment-form', function(config) { JX.$(config.timelineID), [ JX.$H(response.spacer), - JX.$H(response.xactions.join(response.spacer)), - JX.$H(response.spacer) + JX.$H(response.xactions.join(response.spacer)) ]); JX.DOM.show(panel); } @@ -70,8 +41,8 @@ JX.behavior('phabricator-transaction-comment-form', function(config) { JX.DOM.listen(form, 'keydown', null, trigger); var always_trigger = function() { new JX.Request(config.actionURI, onresponse) - .setData(getdata()) - .send(); + .setData(getdata()) + .send(); }; JX.DOM.listen(form, 'shouldRefresh', null, always_trigger); diff --git a/webroot/rsrc/js/application/transactions/behavior-transaction-list.js b/webroot/rsrc/js/application/transactions/behavior-transaction-list.js index 41d14a61eb..fdcb055872 100644 --- a/webroot/rsrc/js/application/transactions/behavior-transaction-list.js +++ b/webroot/rsrc/js/application/transactions/behavior-transaction-list.js @@ -4,103 +4,68 @@ * javelin-stratcom * javelin-workflow * javelin-dom - * javelin-fx + * javelin-uri + * phabricator-textareautils */ -JX.behavior('phabricator-transaction-list', function(config) { +JX.behavior('phabricator-transaction-list', function() { - var list = JX.$(config.listID); - var xaction_nodes = null; - var next_anchor = config.nextAnchor; - - function get_xaction_nodes() { - if (xaction_nodes === null) { - xaction_nodes = {}; - var xactions = JX.DOM.scry(list, 'div', 'transaction'); - for (var ii = 0; ii < xactions.length; ii++) { - xaction_nodes[JX.Stratcom.getData(xactions[ii]).phid] = xactions[ii]; - } - } - return xaction_nodes; - } - - function ontransactions(response) { - var fade_in = []; - var first_new = null; - - var nodes = get_xaction_nodes(); - for (var phid in response.xactions) { - var new_node = JX.$H(response.xactions[phid]).getFragment().firstChild; - fade_in.push(new_node); - - if (nodes[phid]) { - JX.DOM.replace(nodes[phid], new_node); - } else { - if (first_new === null) { - first_new = new_node; - } - list.appendChild(new_node); - - // Add a spacer after new transactions. - var spacer = JX.$H(response.spacer).getFragment().firstChild; - list.appendChild(spacer); - fade_in.push(spacer); - - next_anchor++; + JX.Stratcom.listen( + 'click', + [['transaction-edit'], ['transaction-remove'], ['transaction-raw']], + function(e) { + if (!e.isNormalClick()) { + return; } - nodes[phid] = new_node; - } - - // Scroll to the first new transaction, if transactions were added. - if (first_new) { - JX.DOM.scrollTo(first_new); - } - - // Make any new or updated transactions fade in. - for (var ii = 0; ii < fade_in.length; ii++) { - new JX.FX(fade_in[ii]).setDuration(500).start({opacity: [0, 1]}); - } - } - JX.DOM.listen(list, 'click', 'transaction-edit', function(e) { - if (!e.isNormalClick()) { - return; - } + e.prevent(); - JX.Workflow.newFromLink(e.getTarget()) - .setData({anchor: e.getNodeData('transaction').anchor}) - .setHandler(ontransactions) - .start(); + var anchor = e.getNodeData('tag:a').anchor; + var uri = JX.$U(window.location).setFragment(anchor); - e.kill(); - }); + JX.Workflow.newFromLink(e.getNode('tag:a')) + .setHandler(function() { + // In most cases, `uri` is on the same page (just at a new anchor), + // so we have to call reload() explicitly to get the browser to + // refresh the page. It would be nice to just issue a server-side + // redirect instead, but there isn't currently an easy way to do + // that without complexity and/or a semi-open redirect. + uri.go(); + window.location.reload(); + }) + .start(); + }); JX.Stratcom.listen( - ['submit', 'didSyntheticSubmit'], - 'transaction-append', + 'click', + 'transaction-quote', function(e) { - var form = e.getTarget(); - if (JX.Stratcom.getData(form).objectPHID != config.objectPHID) { - // This indicates there are several forms on the page, and the user - // submitted a different one than the one we're in control of. - return; - } + e.prevent(); - e.kill(); + var data = e.getNodeData('transaction-quote'); + var ref = data.ref || ''; - JX.DOM.invoke(form, 'willSubmit'); + new JX.Workflow(data.uri) + .setData({ref: ref}) + .setHandler(function(r) { + var textarea = JX.$(data.targetID); - JX.Workflow.newFromForm(form, { anchor : next_anchor }) - .setHandler(function(response) { - ontransactions(response); + JX.DOM.scrollTo(textarea); - var e = JX.DOM.invoke(form, 'willClear'); - if (!e.getPrevented()) { - form.reset(); + var value = textarea.value; + if (value.length) { + value += '\n\n'; } + value += r.quoteText; + value += '\n\n'; + textarea.value = value; + + JX.TextAreaUtils.setSelectionRange( + textarea, + textarea.value.length, + textarea.value.length); }) .start(); - }); }); diff --git a/webroot/rsrc/js/application/trigger/TriggerRule.js b/webroot/rsrc/js/application/trigger/TriggerRule.js new file mode 100644 index 0000000000..86f9ecb966 --- /dev/null +++ b/webroot/rsrc/js/application/trigger/TriggerRule.js @@ -0,0 +1,155 @@ +/** + * @provides trigger-rule + * @javelin + */ + +JX.install('TriggerRule', { + + construct: function() { + }, + + properties: { + rowID: null, + type: null, + value: null, + editor: null, + isValidRule: true, + invalidView: null + }, + + statics: { + newFromDictionary: function(map) { + return new JX.TriggerRule() + .setType(map.type) + .setValue(map.value) + .setIsValidRule(map.isValidRule) + .setInvalidView(map.invalidView); + }, + }, + + members: { + _typeCell: null, + _valueCell: null, + _readValueCallback: null, + + newRowContent: function() { + if (!this.getIsValidRule()) { + var invalid_cell = JX.$N( + 'td', + { + colSpan: 2, + className: 'invalid-cell' + }, + JX.$H(this.getInvalidView())); + + return [invalid_cell]; + } + + var type_cell = this._getTypeCell(); + var value_cell = this._getValueCell(); + + + this._rebuildValueControl(); + + return [type_cell, value_cell]; + }, + + getValueForSubmit: function() { + this._readValueFromControl(); + + return { + type: this.getType(), + value: this.getValue() + }; + }, + + _getTypeCell: function() { + if (!this._typeCell) { + var editor = this.getEditor(); + var types = editor.getTypes(); + + var options = []; + for (var ii = 0; ii < types.length; ii++) { + var type = types[ii]; + + if (!type.getIsSelectable()) { + continue; + } + + options.push( + JX.$N('option', {value: type.getType()}, type.getName())); + } + + var control = JX.$N('select', {}, options); + + control.value = this.getType(); + + var on_change = JX.bind(this, this._onTypeChange, control); + JX.DOM.listen(control, 'change', null, on_change); + + var attributes = { + className: 'type-cell' + }; + + this._typeCell = JX.$N('td', attributes, control); + } + + return this._typeCell; + }, + + _onTypeChange: function(control) { + var new_type = control.value; + + this.setType(new_type); + + // Before we build a new control, change the rule value to be appropriate + // for the new rule type. + + // TODO: Currently, we set the rule value to the default value for the + // type. This works most of the time, but if the user selects type "A", + // makes a change to the value, selects type "B", then changes back to + // type "A", it would be better to retain their edit. This is currently + // difficult because of tokenizers: if you save their value, you get a + // list of PHIDs which do not restore cleanly into tokens later. + + var editor = this.getEditor(); + var type = editor.getType(new_type); + this.setValue(type.getDefaultValue()); + + this._rebuildValueControl(); + }, + + _getValueCell: function() { + if (!this._valueCell) { + var attributes = { + className: 'value-cell' + }; + + this._valueCell = JX.$N('td', attributes); + } + + return this._valueCell; + }, + + _rebuildValueControl: function() { + var value_cell = this._getValueCell(); + + var editor = this.getEditor(); + var type = editor.getType(this.getType()); + var control = type.getControl(); + + var input = control.newInput(this); + this._readValueCallback = input.get; + + JX.DOM.setContent(value_cell, input.node); + }, + + _readValueFromControl: function() { + if (this._readValueCallback) { + this.setValue(this._readValueCallback()); + } + } + + } + +}); diff --git a/webroot/rsrc/js/application/trigger/TriggerRuleControl.js b/webroot/rsrc/js/application/trigger/TriggerRuleControl.js new file mode 100644 index 0000000000..a05e740ff9 --- /dev/null +++ b/webroot/rsrc/js/application/trigger/TriggerRuleControl.js @@ -0,0 +1,40 @@ +/** + * @requires phuix-form-control-view + * @provides trigger-rule-control + * @javelin + */ + +JX.install('TriggerRuleControl', { + + construct: function() { + }, + + properties: { + type: null, + specification: null + }, + + statics: { + newFromDictionary: function(map) { + return new JX.TriggerRuleControl() + .setType(map.type) + .setSpecification(map.specification); + }, + }, + + members: { + newInput: function(rule) { + var phuix = new JX.PHUIXFormControl() + .setControl(this.getType(), this.getSpecification()); + + phuix.setValue(rule.getValue()); + + return { + node: phuix.getRawInputNode(), + get: JX.bind(phuix, phuix.getValue) + }; + } + + } + +}); diff --git a/webroot/rsrc/js/application/trigger/TriggerRuleEditor.js b/webroot/rsrc/js/application/trigger/TriggerRuleEditor.js new file mode 100644 index 0000000000..3574a8dbca --- /dev/null +++ b/webroot/rsrc/js/application/trigger/TriggerRuleEditor.js @@ -0,0 +1,137 @@ +/** + * @requires multirow-row-manager + * trigger-rule + * @provides trigger-rule-editor + * @javelin + */ + +JX.install('TriggerRuleEditor', { + + construct: function(form_node) { + this._formNode = form_node; + this._rules = []; + this._types = []; + }, + + members: { + _formNode: null, + _tableNode: null, + _createButtonNode: null, + _inputNode: null, + _rowManager: null, + _rules: null, + _types: null, + + setTableNode: function(table) { + this._tableNode = table; + return this; + }, + + setCreateButtonNode: function(button) { + this._createButtonNode = button; + return this; + }, + + setInputNode: function(input) { + this._inputNode = input; + return this; + }, + + start: function() { + var on_submit = JX.bind(this, this._submitForm); + JX.DOM.listen(this._formNode, 'submit', null, on_submit); + + var manager = new JX.MultirowRowManager(this._tableNode); + this._rowManager = manager; + + var on_remove = JX.bind(this, this._rowRemoved); + manager.listen('row-removed', on_remove); + + var create_button = this._createButtonNode; + var on_create = JX.bind(this, this._createRow); + JX.DOM.listen(create_button, 'click', null, on_create); + }, + + _submitForm: function() { + var values = []; + for (var ii = 0; ii < this._rules.length; ii++) { + var rule = this._rules[ii]; + values.push(rule.getValueForSubmit()); + } + + this._inputNode.value = JX.JSON.stringify(values); + }, + + _createRow: function(e) { + var rule = this.newRule(); + this.addRule(rule); + e.kill(); + }, + + newRule: function() { + // Create new rules with the first valid rule type. + var types = this.getTypes(); + var type; + for (var ii = 0; ii < types.length; ii++) { + type = types[ii]; + if (!type.getIsSelectable()) { + continue; + } + + // If we make it here: this type is valid, so use it. + break; + } + + var default_value = type.getDefaultValue(); + + return new JX.TriggerRule() + .setType(type.getType()) + .setValue(default_value); + }, + + addRule: function(rule) { + rule.setEditor(this); + this._rules.push(rule); + + var manager = this._rowManager; + + var row = manager.addRow([]); + var row_id = manager.getRowID(row); + rule.setRowID(row_id); + + manager.updateRow(row_id, rule.newRowContent()); + }, + + addType: function(type) { + this._types.push(type); + return this; + }, + + getTypes: function() { + return this._types; + }, + + getType: function(type) { + for (var ii = 0; ii < this._types.length; ii++) { + if (this._types[ii].getType() === type) { + return this._types[ii]; + } + } + + return null; + }, + + _rowRemoved: function(row_id) { + for (var ii = 0; ii < this._rules.length; ii++) { + var rule = this._rules[ii]; + + if (rule.getRowID() === row_id) { + this._rules.splice(ii, 1); + break; + } + } + } + + } + +}); diff --git a/webroot/rsrc/js/application/trigger/TriggerRuleType.js b/webroot/rsrc/js/application/trigger/TriggerRuleType.js new file mode 100644 index 0000000000..1075eecedf --- /dev/null +++ b/webroot/rsrc/js/application/trigger/TriggerRuleType.js @@ -0,0 +1,36 @@ +/** + * @requires trigger-rule-control + * @provides trigger-rule-type + * @javelin + */ + +JX.install('TriggerRuleType', { + + construct: function() { + }, + + properties: { + type: null, + name: null, + isSelectable: true, + defaultValue: null, + control: null + }, + + statics: { + newFromDictionary: function(map) { + var control = JX.TriggerRuleControl.newFromDictionary(map.control); + + return new JX.TriggerRuleType() + .setType(map.type) + .setName(map.name) + .setIsSelectable(map.selectable) + .setDefaultValue(map.defaultValue) + .setControl(control); + }, + }, + + members: { + } + +}); diff --git a/webroot/rsrc/js/application/trigger/trigger-rule-editor.js b/webroot/rsrc/js/application/trigger/trigger-rule-editor.js new file mode 100644 index 0000000000..d2741cc337 --- /dev/null +++ b/webroot/rsrc/js/application/trigger/trigger-rule-editor.js @@ -0,0 +1,41 @@ +/** + * @requires javelin-behavior + * trigger-rule-editor + * trigger-rule + * trigger-rule-type + * @provides javelin-behavior-trigger-rule-editor + * @javelin + */ + +JX.behavior('trigger-rule-editor', function(config) { + var form_node = JX.$(config.formNodeID); + var table_node = JX.$(config.tableNodeID); + var create_node = JX.$(config.createNodeID); + var input_node = JX.$(config.inputNodeID); + + var editor = new JX.TriggerRuleEditor(form_node) + .setTableNode(table_node) + .setCreateButtonNode(create_node) + .setInputNode(input_node); + + editor.start(); + + var ii; + + for (ii = 0; ii < config.types.length; ii++) { + var type = JX.TriggerRuleType.newFromDictionary(config.types[ii]); + editor.addType(type); + } + + if (config.rules.length) { + for (ii = 0; ii < config.rules.length; ii++) { + var rule = JX.TriggerRule.newFromDictionary(config.rules[ii]); + editor.addRule(rule); + } + } else { + // If the trigger doesn't have any rules yet, add an empty rule to start + // with, so the user doesn't have to click "New Rule". + editor.addRule(editor.newRule()); + } + +}); diff --git a/webroot/rsrc/js/application/typeahead/behavior-typeahead-browse.js b/webroot/rsrc/js/application/typeahead/behavior-typeahead-browse.js new file mode 100644 index 0000000000..4af387f091 --- /dev/null +++ b/webroot/rsrc/js/application/typeahead/behavior-typeahead-browse.js @@ -0,0 +1,31 @@ +/** + * @provides javelin-behavior-typeahead-browse + * @requires javelin-behavior + * javelin-stratcom + * javelin-workflow + * javelin-dom + */ + +JX.behavior('typeahead-browse', function() { + var loading = false; + + JX.Stratcom.listen('click', 'typeahead-browse-more', function(e) { + e.kill(); + + if (loading) { + return; + } + var link = e.getTarget(); + + loading = true; + JX.DOM.alterClass(link, 'loading', true); + + JX.Workflow.newFromLink(link) + .setHandler(function(r) { + loading = false; + JX.DOM.replace(link, JX.$H(r.markup)); + }) + .start(); + }); + +}); diff --git a/webroot/rsrc/js/application/typeahead/behavior-typeahead-search.js b/webroot/rsrc/js/application/typeahead/behavior-typeahead-search.js new file mode 100644 index 0000000000..e657bed45d --- /dev/null +++ b/webroot/rsrc/js/application/typeahead/behavior-typeahead-search.js @@ -0,0 +1,65 @@ +/** + * @provides javelin-behavior-typeahead-search + * @requires javelin-behavior + * javelin-stratcom + * javelin-workflow + * javelin-dom + */ + +JX.behavior('typeahead-search', function(config) { + var input = JX.$(config.inputID); + var frame = JX.$(config.frameID); + var last = input.value; + var in_flight = {}; + + function update() { + if (input.value == last) { + // This is some kind of non-input keypress like an arrow key. Don't + // send a query to the server. + return; + } + + // Call load() in a little while. If the user hasn't typed anything else, + // we'll send a request to get results. + setTimeout(JX.bind(null, load, input.value), 100); + } + + function load(value) { + if (value != input.value) { + // The user has typed some more text, so don't send a request yet. We + // want to wait for them to stop typing. + return; + } + + if (value in in_flight) { + // We've already sent a request for this query. + return; + } + in_flight[value] = true; + + JX.DOM.alterClass(frame, 'loading', true); + new JX.Workflow(config.uri, {q: value, format: 'html'}) + .setHandler(function(r) { + delete in_flight[value]; + + if (value != input.value) { + // The user typed some more stuff while the request was in flight, + // so ignore the response. + return; + } + + last = input.value; + JX.DOM.setContent(frame, JX.$H(r.markup)); + JX.DOM.alterClass(frame, 'loading', false); + }) + .start(); + } + + JX.DOM.listen(input, ['keydown', 'keypress', 'keyup'], null, function() { + // We need to delay this to actually read the value after the keypress. + setTimeout(update, 0); + }); + + JX.DOM.focus(input); + +}); diff --git a/webroot/rsrc/js/application/uiexample/JavelinViewExample.js b/webroot/rsrc/js/application/uiexample/JavelinViewExample.js deleted file mode 100644 index a8e17923b2..0000000000 --- a/webroot/rsrc/js/application/uiexample/JavelinViewExample.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @provides phabricator-uiexample-javelin-view - * @requires javelin-install - * javelin-dom - * javelin-view - */ - -JX.install('JavelinViewExample', { - extend: 'View', - members: { - render: function(rendered_children) { - return JX.$N( - 'div', - { className: 'client-view' }, - rendered_children - ); - } - } -}); diff --git a/webroot/rsrc/js/application/uiexample/ReactorButtonExample.js b/webroot/rsrc/js/application/uiexample/ReactorButtonExample.js deleted file mode 100644 index 07ad129f65..0000000000 --- a/webroot/rsrc/js/application/uiexample/ReactorButtonExample.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @provides phabricator-uiexample-reactor-button - * @requires javelin-install - * javelin-dom - * javelin-util - * javelin-dynval - * javelin-reactor-dom - */ - -JX.install('ReactorButtonExample', { - extend: 'View', - members: { - render: function(rendered_children) { - var button = JX.$N('button', {}, "Fun"); - var clicks = JX.RDOM.clickPulses(button); - - var time = JX.RDOM.time(); - - // function snapshot(pulses, dynval) { - // return new DynVal( - // pulses.transform(JX.bind(dynval, dynval.getValueNow)), - // dynval.getValueNow() - // ); - // } - // - // Below could be... - // time.snapshot(clicks) - // clicks.snapshot(time) - - var snapshot_time = new JX.DynVal( - clicks.transform(JX.bind(time, time.getValueNow)), - time.getValueNow() - ); - - return [button, JX.RDOM.$DT(snapshot_time)]; - } - } -}); diff --git a/webroot/rsrc/js/application/uiexample/ReactorCheckboxExample.js b/webroot/rsrc/js/application/uiexample/ReactorCheckboxExample.js deleted file mode 100644 index b308ee4dbe..0000000000 --- a/webroot/rsrc/js/application/uiexample/ReactorCheckboxExample.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @provides phabricator-uiexample-reactor-checkbox - * @requires javelin-install - * javelin-dom - * javelin-reactor-dom - */ - -JX.install('ReactorCheckboxExample', { - extend: 'View', - members: { - render: function(rendered_children) { - var checkbox = JX.$N('input', {type: 'checkbox'}); - - return [checkbox, JX.RDOM.$DT(JX.RDOM.checkbox(checkbox))]; - } - } -}); diff --git a/webroot/rsrc/js/application/uiexample/ReactorFocusExample.js b/webroot/rsrc/js/application/uiexample/ReactorFocusExample.js deleted file mode 100644 index af76b9624a..0000000000 --- a/webroot/rsrc/js/application/uiexample/ReactorFocusExample.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @provides phabricator-uiexample-reactor-focus - * @requires javelin-install - * javelin-dom - * javelin-reactor-dom - */ - -JX.install('ReactorFocusExample', { - extend: 'View', - members: { - render: function(rendered_children) { - var input = JX.$N('input'); - return [input, JX.RDOM.$DT(JX.RDOM.hasFocus(input))]; - } - } -}); diff --git a/webroot/rsrc/js/application/uiexample/ReactorInputExample.js b/webroot/rsrc/js/application/uiexample/ReactorInputExample.js deleted file mode 100644 index 6b1a2c120f..0000000000 --- a/webroot/rsrc/js/application/uiexample/ReactorInputExample.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @provides phabricator-uiexample-reactor-input - * @requires javelin-install - * javelin-reactor-dom - * javelin-view-html - * javelin-view-interpreter - * javelin-view-renderer - */ - -JX.install('ReactorInputExample', { - extend: 'View', - members: { - render: function(rendered_children) { - var html = JX.HTMLView.registerToInterpreter(new JX.ViewInterpreter()); - - var raw_input = JX.ViewRenderer.render( - html.input({ value: this.getAttr('init') }) - ); - var input = JX.RDOM.input(raw_input); - - return JX.ViewRenderer.render( - html.div( - raw_input, - html.br(), - html.span(JX.RDOM.$DT(input)), - html.br(), - html.span(JX.RDOM.$DT(input.calm(500))) - ) - ); - } - } -}); diff --git a/webroot/rsrc/js/application/uiexample/ReactorMouseoverExample.js b/webroot/rsrc/js/application/uiexample/ReactorMouseoverExample.js deleted file mode 100644 index 05152d39d4..0000000000 --- a/webroot/rsrc/js/application/uiexample/ReactorMouseoverExample.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @provides phabricator-uiexample-reactor-mouseover - * @requires javelin-install - * javelin-dom - * javelin-reactor-dom - */ - -JX.install('ReactorMouseoverExample', { - extend: 'View', - members: { - render: function(rendered_children) { - var target = JX.$N("span", "mouseover me "); - return [target, JX.RDOM.$DT(JX.RDOM.isMouseOver(target))]; - } - } -}); diff --git a/webroot/rsrc/js/application/uiexample/ReactorRadioExample.js b/webroot/rsrc/js/application/uiexample/ReactorRadioExample.js deleted file mode 100644 index db74a2f022..0000000000 --- a/webroot/rsrc/js/application/uiexample/ReactorRadioExample.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @provides phabricator-uiexample-reactor-radio - * @requires javelin-install - * javelin-dom - * javelin-reactor-dom - */ - -JX.install('ReactorRadioExample', { - extend: 'View', - members: { - render: function(rendered_children) { - var radio_one = JX.$N('input', {type: 'radio', name: 'n', value: 'one'}); - var radio_two = JX.$N('input', {type: 'radio', name: 'n', value: 'two'}); - - radio_one.checked = true; - - return [ - radio_one, - radio_two, - JX.RDOM.$DT(JX.RDOM.radio([radio_one, radio_two])) - ]; - } - } -}); diff --git a/webroot/rsrc/js/application/uiexample/ReactorSelectExample.js b/webroot/rsrc/js/application/uiexample/ReactorSelectExample.js deleted file mode 100644 index b7bb30acb1..0000000000 --- a/webroot/rsrc/js/application/uiexample/ReactorSelectExample.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @provides phabricator-uiexample-reactor-select - * @requires javelin-install - * javelin-dom - * javelin-reactor-dom - */ - -JX.install('ReactorSelectExample', { - extend: 'View', - members: { - render: function(rendered_children) { - var select = JX.$N('select', {}, [ - JX.$N('option', { value: 'goat' }, 'Goat'), - JX.$N('option', { value: 'bat' }, 'Bat'), - JX.$N('option', { value: 'duck' }, 'Duck') - ]); - - return [select, JX.RDOM.$DT(JX.RDOM.select(select))]; - } - } -}); diff --git a/webroot/rsrc/js/application/uiexample/ReactorSendClassExample.js b/webroot/rsrc/js/application/uiexample/ReactorSendClassExample.js deleted file mode 100644 index 70615d9fec..0000000000 --- a/webroot/rsrc/js/application/uiexample/ReactorSendClassExample.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @provides phabricator-uiexample-reactor-sendclass - * @requires javelin-install - * javelin-dom - * javelin-reactor-dom - */ - -JX.install('ReactorSendClassExample', { - extend: 'View', - members: { - render: function(rendered_children) { - var input = JX.$N('input', { type: 'checkbox' }); - var span = JX.$N('a', 'Hey'); - JX.RDOM.sendClass(JX.RDOM.checkbox(input), span, 'disabled'); - return [input, span]; - } - } -}); diff --git a/webroot/rsrc/js/application/uiexample/ReactorSendPropertiesExample.js b/webroot/rsrc/js/application/uiexample/ReactorSendPropertiesExample.js deleted file mode 100644 index eeae796c2a..0000000000 --- a/webroot/rsrc/js/application/uiexample/ReactorSendPropertiesExample.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @provides phabricator-uiexample-reactor-sendproperties - * @requires javelin-install - * javelin-dom - * javelin-reactor-dom - */ - -JX.install('ReactorSendPropertiesExample', { - extend: 'View', - members: { - render: function(rendered_children) { - var color = JX.$N('input', {value: '#fff000'}); - var title = JX.$N('input', {value: 'seen on hover'}); - var target = JX.$N('span', 'Change my color and title'); - - JX.RDOM.sendProps(target, { - style: { - backgroundColor: JX.RDOM.input(color) - }, - title: JX.RDOM.input(title) - }); - - return [color, title, target]; - } - } -}); diff --git a/webroot/rsrc/js/application/uiexample/busy-example.js b/webroot/rsrc/js/application/uiexample/busy-example.js deleted file mode 100644 index d829435270..0000000000 --- a/webroot/rsrc/js/application/uiexample/busy-example.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * @provides javelin-behavior-phabricator-busy-example - * @requires phabricator-busy - * javelin-behavior - */ - -JX.behavior('phabricator-busy-example', function(config) { - JX.Busy.start(); -}); diff --git a/webroot/rsrc/js/application/uiexample/gesture-example.js b/webroot/rsrc/js/application/uiexample/gesture-example.js index 92495f97d1..750262aaab 100644 --- a/webroot/rsrc/js/application/uiexample/gesture-example.js +++ b/webroot/rsrc/js/application/uiexample/gesture-example.js @@ -42,7 +42,7 @@ JX.behavior('phabricator-gesture-example', function(config) { JX.Stratcom.listen( 'gesture.swipe.cancel', null, - function(e) { + function() { current = []; redraw(); }); diff --git a/webroot/rsrc/js/application/uiexample/notification-example.js b/webroot/rsrc/js/application/uiexample/notification-example.js index 631c4139a9..bdbdefd828 100644 --- a/webroot/rsrc/js/application/uiexample/notification-example.js +++ b/webroot/rsrc/js/application/uiexample/notification-example.js @@ -5,7 +5,7 @@ * @provides javelin-behavior-phabricator-notification-example */ -JX.behavior('phabricator-notification-example', function(config) { +JX.behavior('phabricator-notification-example', function() { var sequence = 0; @@ -39,7 +39,7 @@ JX.behavior('phabricator-notification-example', function(config) { notification.listen( 'activate', function() { - if (!confirm("Close notification?")) { + if (!window.confirm('Close notification?')) { JX.Stratcom.context().kill(); } }); diff --git a/webroot/rsrc/js/core/Busy.js b/webroot/rsrc/js/core/Busy.js index eaaad74477..e6e1fe579c 100644 --- a/webroot/rsrc/js/core/Busy.js +++ b/webroot/rsrc/js/core/Busy.js @@ -26,9 +26,11 @@ JX.install('Busy', { start : function() { var self = JX.Busy; if (!self._depth) { - self._indicator = JX.$N('div', {className: 'busy'}); + var icon = JX.$N('span', + {className: 'phui-icon-view phui-font-fa fa-gear ph-spin'}); + self._indicator = JX.$N('div', {className: 'busy'}, icon); self._indicator.style.opacity = 0; - document.body.appendChild(self._indicator); + JX.$('phabricator-standard-page').appendChild(self._indicator); // Don't actually show the indicator for a little while, to prevent // it from flashing briefly for every Ajax request. diff --git a/webroot/rsrc/js/core/DragAndDropFileUpload.js b/webroot/rsrc/js/core/DragAndDropFileUpload.js index 25c6c1a723..644f705965 100644 --- a/webroot/rsrc/js/core/DragAndDropFileUpload.js +++ b/webroot/rsrc/js/core/DragAndDropFileUpload.js @@ -11,8 +11,12 @@ JX.install('PhabricatorDragAndDropFileUpload', { - construct : function(node) { - this._node = node; + construct : function(target) { + if (JX.DOM.isNode(target)) { + this._node = target; + } else { + this._sigil = target; + } }, events : [ @@ -39,19 +43,35 @@ JX.install('PhabricatorDragAndDropFileUpload', { members : { _node : null, + _sigil: null, _depth : 0, + _isEnabled: false, + + setIsEnabled: function(bool) { + this._isEnabled = bool; + return this; + }, + + getIsEnabled: function() { + return this._isEnabled; + }, + _updateDepth : function(delta) { if (this._depth === 0 && delta > 0) { - this.invoke('didBeginDrag'); + this.invoke('didBeginDrag', this._getTarget()); } this._depth += delta; if (this._depth === 0 && delta < 0) { - this.invoke('didEndDrag'); + this.invoke('didEndDrag', this._getTarget()); } }, + _getTarget: function() { + return this._target || this._node; + }, + start : function() { // TODO: move this to JX.DOM.contains()? @@ -66,129 +86,312 @@ JX.install('PhabricatorDragAndDropFileUpload', { return false; } + // Firefox has some issues sometimes; implement this click handler so + // the user can recover. See T5188. + var on_click = JX.bind(this, function (e) { + if (!this.getIsEnabled()) { + return; + } + + if (this._depth) { + e.kill(); + // Force depth to 0. + this._updateDepth(-this._depth); + } + }); + // We track depth so that the _node may have children inside of it and // not become unselected when they are dragged over. - JX.DOM.listen( - this._node, - 'dragenter', - null, - JX.bind(this, function(e) { - if (contains(this._node, e.getTarget())) { - this._updateDepth(1); - } - })); - - JX.DOM.listen( - this._node, - 'dragleave', - null, - JX.bind(this, function(e) { - if (contains(this._node, e.getTarget())) { - this._updateDepth(-1); + var on_dragenter = JX.bind(this, function(e) { + if (!this.getIsEnabled()) { + return; + } + + if (!this._node) { + var target = e.getNode(this._sigil); + if (target !== this._target) { + this._updateDepth(-this._depth); + this._target = target; } - })); - - JX.DOM.listen( - this._node, - 'dragover', - null, - function(e) { - // NOTE: We must set this, or Chrome refuses to drop files from the - // download shelf. - e.getRawEvent().dataTransfer.dropEffect = 'copy'; - e.kill(); - }); + } - JX.DOM.listen( - this._node, - 'drop', - null, - JX.bind(this, function(e) { - e.kill(); + if (contains(this._getTarget(), e.getTarget())) { + this._updateDepth(1); + } - var files = e.getRawEvent().dataTransfer.files; - for (var ii = 0; ii < files.length; ii++) { - this._sendRequest(files[ii]); - } + }); - // Force depth to 0. - this._updateDepth(-this._depth); - })); + var on_dragleave = JX.bind(this, function(e) { + if (!this.getIsEnabled()) { + return; + } + + if (!this._getTarget()) { + return; + } - if (JX.PhabricatorDragAndDropFileUpload.isPasteSupported()) { + if (contains(this._getTarget(), e.getTarget())) { + this._updateDepth(-1); + } + }); + + var on_dragover = JX.bind(this, function(e) { + if (!this.getIsEnabled()) { + return; + } + + // NOTE: We must set this, or Chrome refuses to drop files from the + // download shelf. + e.getRawEvent().dataTransfer.dropEffect = 'copy'; + e.kill(); + }); + + var on_drop = JX.bind(this, function(e) { + if (!this.getIsEnabled()) { + return; + } + + e.kill(); + + var files = e.getRawEvent().dataTransfer.files; + for (var ii = 0; ii < files.length; ii++) { + this.sendRequest(files[ii]); + } + + // Force depth to 0. + this._updateDepth(-this._depth); + }); + + if (this._node) { + JX.DOM.listen(this._node, 'click', null, on_click); + JX.DOM.listen(this._node, 'dragenter', null, on_dragenter); + JX.DOM.listen(this._node, 'dragleave', null, on_dragleave); + JX.DOM.listen(this._node, 'dragover', null, on_dragover); + JX.DOM.listen(this._node, 'drop', null, on_drop); + } else { + JX.Stratcom.listen('click', this._sigil, on_click); + JX.Stratcom.listen('dragenter', this._sigil, on_dragenter); + JX.Stratcom.listen('dragleave', this._sigil, on_dragleave); + JX.Stratcom.listen('dragover', this._sigil, on_dragover); + JX.Stratcom.listen('drop', this._sigil, on_drop); + } + + if (JX.PhabricatorDragAndDropFileUpload.isPasteSupported() && + this._node) { JX.DOM.listen( this._node, 'paste', null, JX.bind(this, function(e) { - var clipboardData = e.getRawEvent().clipboardData; - if (!clipboardData) { + if (!this.getIsEnabled()) { return; } - for (var ii = 0; ii < clipboardData.items.length; ii++) { - var item = clipboardData.items[ii]; + var clipboard = e.getRawEvent().clipboardData; + if (!clipboard) { + return; + } + + // If there's any text on the clipboard, just let the event fire + // normally, choosing the text over any images. See T5437 / D9647. + var text = clipboard.getData('text/plain').toString(); + if (text.length) { + return; + } + + // Safari and Firefox have clipboardData, but no items. They + // don't seem to provide a way to get image data directly yet. + if (!clipboard.items) { + return; + } + + for (var ii = 0; ii < clipboard.items.length; ii++) { + var item = clipboard.items[ii]; if (!/^image\//.test(item.type)) { continue; } - this._sendRequest(item.getAsFile()); + var spec = item.getAsFile(); + // pasted files don't have a name; see + // https://code.google.com/p/chromium/issues/detail?id=361145 + if (!spec.name) { + spec.name = 'pasted_file'; + } + this.sendRequest(spec); } })); } + + this.setIsEnabled(true); }, - _sendRequest : function(spec) { + + sendRequest : function(spec) { var file = new JX.PhabricatorFileUpload() + .setRawFileObject(spec) .setName(spec.name) - .setTotalBytes(spec.size) - .setStatus('uploading') + .setTotalBytes(spec.size); + + var threshold = this.getChunkThreshold(); + if (threshold && (file.getTotalBytes() > threshold)) { + // This is a large file, so we'll go through allocation so we can + // pick up support for resume and chunking. + this._allocateFile(file); + } else { + // If this file is smaller than the chunk threshold, skip the round + // trip for allocation and just upload it directly. + this._sendDataRequest(file); + } + }, + + _allocateFile: function(file) { + file + .setStatus('allocate') .update(); this.invoke('willUpload', file); - var up_uri = JX.$U(this.getURI()) + var alloc_uri = this._getUploadURI(file) + .setQueryParam('allocate', 1); + + new JX.Workflow(alloc_uri) + .setHandler(JX.bind(this, this._didAllocateFile, file)) + .start(); + }, + + _getUploadURI: function(file) { + var uri = JX.$U(this.getURI()) .setQueryParam('name', file.getName()) - .setQueryParam('__upload__', 1) - .toString(); + .setQueryParam('length', file.getTotalBytes()); - var onupload = JX.bind(this, function(r) { - if (r.error) { - file - .setStatus('error') - .setError(r.error) - .update(); + if (this.getViewPolicy()) { + uri.setQueryParam('viewPolicy', this.getViewPolicy()); + } - this.invoke('didError', file); + if (file.getAllocatedPHID()) { + uri.setQueryParam('phid', file.getAllocatedPHID()); + } + + return uri; + }, + + _didAllocateFile: function(file, r) { + var phid = r.phid; + var upload = r.upload; + + if (!upload) { + if (phid) { + this._completeUpload(file, r); } else { - file - .setID(r.id) - .setPHID(r.phid) - .setURI(r.uri) - .setMarkup(r.html) - .setStatus('done') - .update(); + this._failUpload(file, r); + } + return; + } else { + if (phid) { + // Start or resume a chunked upload. + file.setAllocatedPHID(phid); + this._loadChunks(file); + } else { + // Proceed with non-chunked upload. + this._sendDataRequest(file); + } + } + }, - this.invoke('didUpload', file); + _loadChunks: function(file) { + file + .setStatus('chunks') + .update(); + + var chunks_uri = this._getUploadURI(file) + .setQueryParam('querychunks', 1); + + new JX.Workflow(chunks_uri) + .setHandler(JX.bind(this, this._didLoadChunks, file)) + .start(); + }, + + _didLoadChunks: function(file, r) { + file.setChunks(r); + this._uploadNextChunk(file); + }, + + _uploadNextChunk: function(file) { + var chunks = file.getChunks(); + var chunk; + for (var ii = 0; ii < chunks.length; ii++) { + chunk = chunks[ii]; + if (!chunk.complete) { + this._uploadChunk(file, chunk); + break; } + } + }, + + _uploadChunk: function(file, chunk, callback) { + file + .setStatus('upload') + .update(); + + var chunkup_uri = this._getUploadURI(file) + .setQueryParam('uploadchunk', 1) + .setQueryParam('__upload__', 1) + .setQueryParam('byteStart', chunk.byteStart) + .toString(); + + var callback = JX.bind(this, this._didUploadChunk, file, chunk); + + var req = new JX.Request(chunkup_uri, callback); + + var seen_bytes = 0; + var onprogress = JX.bind(this, function(progress) { + file + .addUploadedBytes(progress.loaded - seen_bytes) + .update(); + + seen_bytes = progress.loaded; + this.invoke('progress', file); }); - var req = new JX.Request(up_uri, onupload); + req.listen('error', JX.bind(this, this._onUploadError, req, file)); + req.listen('uploadprogress', onprogress); + + var blob = file.getRawFileObject().slice(chunk.byteStart, chunk.byteEnd); + + req + .setRawData(blob) + .send(); + }, + + _didUploadChunk: function(file, chunk, r) { + file.didCompleteChunk(chunk); + + if (r.complete) { + this._completeUpload(file, r); + } else { + this._uploadNextChunk(file); + } + }, + + _sendDataRequest: function(file) { + file + .setStatus('uploading') + .update(); + + this.invoke('willUpload', file); - var onerror = JX.bind(this, function(error) { - file.setStatus('error'); + var up_uri = this._getUploadURI(file) + .setQueryParam('__upload__', 1) + .toString(); - if (error) { - file.setError(error.code + ': ' + error.info); + var onupload = JX.bind(this, function(r) { + if (r.error) { + this._failUpload(file, r); } else { - var xhr = req.getTransport(); - if (xhr.responseText) { - file.setError('Server responded: ' + xhr.responseText); - } + this._completeUpload(file, r); } - - file.update(); - this.invoke('didError', file); }); + var req = new JX.Request(up_uri, onupload); + var onprogress = JX.bind(this, function(progress) { file .setTotalBytes(progress.total) @@ -198,16 +401,57 @@ JX.install('PhabricatorDragAndDropFileUpload', { this.invoke('progress', file); }); - req.listen('error', onerror); + req.listen('error', JX.bind(this, this._onUploadError, req, file)); req.listen('uploadprogress', onprogress); req - .setRawData(spec) + .setRawData(file.getRawFileObject()) .send(); + }, + + _completeUpload: function(file, r) { + file + .setID(r.id) + .setPHID(r.phid) + .setURI(r.uri) + .setMarkup(r.html) + .setStatus('done') + .setTargetNode(this._getTarget()) + .update(); + + this.invoke('didUpload', file); + }, + + _failUpload: function(file, r) { + file + .setStatus('error') + .setError(r.error) + .update(); + + this.invoke('didError', file); + }, + + _onUploadError: function(req, file, error) { + file.setStatus('error'); + + if (error) { + file.setError(error.code + ': ' + error.info); + } else { + var xhr = req.getTransport(); + if (xhr.responseText) { + file.setError('Server responded: ' + xhr.responseText); + } + } + + file.update(); + this.invoke('didError', file); } + }, properties: { - URI : null, - activatedClass : null + URI: null, + activatedClass: null, + viewPolicy: null, + chunkThreshold: null } }); diff --git a/webroot/rsrc/js/core/DraggableList.js b/webroot/rsrc/js/core/DraggableList.js index 042a3585d8..8930f43f94 100644 --- a/webroot/rsrc/js/core/DraggableList.js +++ b/webroot/rsrc/js/core/DraggableList.js @@ -14,13 +14,16 @@ JX.install('DraggableList', { construct : function(sigil, root) { this._sigil = sigil; this._root = root || document.body; + this._group = [this]; // NOTE: Javelin does not dispatch mousemove by default. JX.enableDispatch(document.body, 'mousemove'); JX.DOM.listen(this._root, 'mousedown', sigil, JX.bind(this, this._ondrag)); JX.Stratcom.listen('mousemove', null, JX.bind(this, this._onmove)); + JX.Stratcom.listen('scroll', null, JX.bind(this, this._onmove)); JX.Stratcom.listen('mouseup', null, JX.bind(this, this._ondrop)); + JX.Stratcom.listen('keypress', null, JX.bind(this, this._onkey)); }, events : [ @@ -30,22 +33,45 @@ JX.install('DraggableList', { 'didBeginDrag', 'didCancelDrag', 'didEndDrag', - 'didDrop'], + 'didDrop', + 'didSend', + 'didReceive'], properties : { - findItemsHandler : null + findItemsHandler: null, + compareHandler: null, + isDropTargetHandler: null, + canDragX: false, + outerContainer: null, + hasInfiniteHeight: false, + compareOnMove: false, + compareOnReorder: false, + targetChangeHandler: null }, members : { _root : null, _dragging : null, _locked : 0, - _origin : null, _target : null, + _lastTarget: null, _targets : null, - _dimensions : null, _ghostHandler : null, _ghostNode : null, + _group : null, + _cursorPosition: null, + _cursorOrigin: null, + _cursorScroll: null, + _frame: null, + _clone: null, + _offset: null, + _autoscroll: null, + _autoscroller: null, + _autotimer: null, + + getRootNode : function() { + return this._root; + }, setGhostHandler : function(handler) { this._ghostHandler = handler; @@ -68,8 +94,37 @@ JX.install('DraggableList', { return this; }, + setGroup : function(lists) { + var result = []; + var need_self = true; + for (var ii = 0; ii < lists.length; ii++) { + if (lists[ii] == this) { + need_self = false; + } + result.push(lists[ii]); + } + + if (need_self) { + result.push(this); + } + + this._group = result; + return this; + }, + + _hasGroup : function() { + return (this._group.length > 1); + }, + _defaultGhostHandler : function(ghost, target) { - var parent = this._dragging.parentNode; + var parent; + + if (!this._hasGroup()) { + parent = this._dragging.parentNode; + } else { + parent = this.getRootNode(); + } + if (target && target.nextSibling) { parent.insertBefore(ghost, target.nextSibling); } else if (!target && parent.firstChild) { @@ -87,7 +142,17 @@ JX.install('DraggableList', { } } - return handler(); + var items = handler(); + + // Make sure the clone element is never included as a target. + for (var ii = 0; ii < items.length; ii++) { + if (items[ii] === this._clone) { + items.splice(ii, 1); + break; + } + } + + return items; }, _ondrag : function(e) { @@ -110,162 +175,649 @@ JX.install('DraggableList', { return; } + if (e.getNode('tag:a')) { + // Never start a drag if we're somewhere inside an tag. This makes + // links unclickable in Firefox. + return; + } + + // See T13452. If this is an ungrabble part of the item, don't start a + // drag. We use this to allow users to select text on cards. + var target = e.getTarget(); + if (target) { + if (JX.Stratcom.hasSigil(target, 'ungrabbable')) { + return; + } + } + + if (JX.Stratcom.pass()) { + // Let other handlers deal with this event before we do. + return; + } + e.kill(); - this._dragging = e.getNode(this._sigil); - this._origin = JX.$V(e); - this._dimensions = JX.$V(this._dragging); + var drag = e.getNode(this._sigil); - var targets = []; - var items = this.findItems(); - for (var ii = 0; ii < items.length; ii++) { - targets.push({ - item: items[ii], - y: JX.$V(items[ii]).y + (JX.Vector.getDim(items[ii]).y / 2) - }); + this._autoscroll = {}; + this._autoscroller = setInterval(JX.bind(this, this._onautoscroll), 10); + this._autotimer = null; + + for (var ii = 0; ii < this._group.length; ii++) { + this._group[ii]._clearTarget(); + } + + var pos = JX.$V(drag); + var dim = JX.Vector.getDim(drag); + + // Create and adjust the ghost nodes. + for (var jj = 0; jj < this._group.length; jj++) { + var ghost = this._group[jj].getGhostNode(); + ghost.style.height = dim.y + 'px'; } - targets.sort(function(u, v) { return v.y - u.y; }); - this._targets = targets; - this._target = null; - if (!this.invoke('didBeginDrag', this._dragging).getPrevented()) { - var ghost = this.getGhostNode(); - ghost.style.height = JX.Vector.getDim(this._dragging).y + 'px'; - JX.DOM.alterClass(this._dragging, 'drag-dragging', true); + // Here's what's going on: we're cloning the thing that's being dragged. + // This is the "clone", stored in "this._clone". We're going to leave the + // original where it is in the document, and put the clone at top-level + // so it can be freely dragged around the whole document, even if it's + // inside a container with overflow hidden. + + // Because the clone has been moved up, CSS classes which rely on some + // parent selector won't work. Draggable objects need to pick up all of + // their CSS properties without relying on container classes. This isn't + // great, but leaving them where they are in the document creates a large + // number of positioning problems with scrollable, absolute, relative, + // or overflow hidden containers. + + // Note that we don't actually want to let the user drag it outside the + // document. One problem is that doing so lets the user drag objects + // infinitely far to the right by dragging them to the edge so the + // document extends, scrolling the document, dragging them to the edge + // of the new larger document, scrolling the document, and so on forever. + + // To prevent this, we're putting a "frame" (stored in "this._frame") at + // top level, then putting the clone inside the frame. The frame has the + // same size as the entire viewport, and overflow hidden, so dragging the + // item outside the document just cuts it off. + + // Create the clone for dragging. + var clone = drag.cloneNode(true); + + pos.setPos(clone); + dim.setDim(clone); + + JX.DOM.alterClass(drag, 'drag-dragging', true); + JX.DOM.alterClass(clone, 'drag-clone', true); + + var frame = JX.$N('div', {className: 'drag-frame'}); + frame.appendChild(clone); + + document.body.appendChild(frame); + JX.DOM.alterClass(document.body, 'jx-dragging', true); + + this._dragging = drag; + this._clone = clone; + this._frame = frame; + + var cursor = JX.$V(e); + this._offset = new JX.Vector(pos.x - cursor.x, pos.y - cursor.y); + + JX.Tooltip.lock(); + + this.invoke('didBeginDrag', this._dragging); + }, + + _getTargets : function() { + if (this._targets === null) { + var targets = []; + var items = this.findItems(); + for (var ii = 0; ii < items.length; ii++) { + var item = items[ii]; + + var ipos = JX.$V(item); + + targets.push({ + item: items[ii], + y: ipos.y + (JX.Vector.getDim(items[ii]).y / 2) + }); + } + targets.sort(function(u, v) { return v.y - u.y; }); + this._targets = targets; } + + return this._targets; }, - _onmove : function(e) { - if (!this._dragging) { - return; + _dirtyTargetCache: function() { + if (this._hasGroup()) { + var group = this._group; + for (var ii = 0; ii < group.length; ii++) { + group[ii]._targets = null; + } + } else { + this._targets = null; + } + + return this; + }, + + _getTargetList : function(p) { + var target_list; + var infinity; + if (this._hasGroup()) { + var group = this._group; + for (var ii = 0; ii < group.length; ii++) { + var root = group[ii].getRootNode(); + var rp = JX.$V(root); + var rd = JX.Vector.getDim(root); + + if (group[ii].getHasInfiniteHeight()) { + // The math doesn't work out quite right if we actually use + // Math.Infinity, so approximate infinity as the larger of the + // document height or viewport height. + if (!infinity) { + infinity = Math.max( + JX.Vector.getViewport().y, + JX.Vector.getDocument().y); + } + + rp.y = 0; + rd.y = infinity; + } + + var is_target = false; + if (p.x >= rp.x && p.y >= rp.y) { + if (p.x <= (rp.x + rd.x) && p.y <= (rp.y + rd.y)) { + is_target = true; + target_list = group[ii]; + } + } + + group[ii]._setIsDropTarget(is_target); + } + } else { + target_list = this; } + return target_list; + }, + + _getTarget: function() { + return this._target; + }, + + _setTarget : function(cur_target) { var ghost = this.getGhostNode(); var target = this._target; - var targets = this._targets; - var dragging = this._dragging; - var origin = this._origin; - var p = JX.$V(e); + if (cur_target !== target) { + this._clearTarget(); + if (cur_target !== false) { + var ok = this.getGhostHandler()(ghost, cur_target); + // If the handler returns explicit `false`, prevent the drag. + if (ok === false) { + cur_target = false; + } + } - // Compute the size and position of the drop target indicator, because we - // need to update our static position computations to account for it. + this._target = cur_target; + } + + return this; + }, + + _clearTarget : function() { + var target = this._target; + var ghost = this.getGhostNode(); + + if (target !== false) { + JX.DOM.remove(ghost); + } + + this._target = false; + + // Clear the target position cache, since adding or removing ghosts + // changes element positions. + this._dirtyTargetCache(); + + return this; + }, + + _didChangeTarget: function(dst_list, dst_node) { + if (dst_node === this._lastTarget) { + return; + } + + this._lastTarget = dst_node; + + var handler = this.getTargetChangeHandler(); + if (handler) { + handler(this, this._dragging, dst_list, dst_node); + } + }, + + _setIsDropTarget: function(is_target) { + var root = this.getRootNode(); + JX.DOM.alterClass(root, 'drag-target-list', is_target); + + var handler = this.getIsDropTargetHandler(); + if (handler) { + handler(is_target); + } + + return this; + }, + + _getOrderedTarget: function(src_list, src_node) { + var targets = this._getTargets(); + + // NOTE: The targets are ordered from the bottom of the column to the + // top, so we're looking for the first node that we sort below. If we + // don't find one, we'll sort to the head of the column. + + for (var ii = 0; ii < targets.length; ii++) { + var target = targets[ii]; + if (this._compareTargets(src_list, src_node, target.item) > 0) { + return target.item; + } + } + + return null; + }, - var adjust_h = JX.Vector.getDim(ghost).y; - var adjust_y = JX.$V(ghost).y; + _compareTargets: function(src_list, src_node, dst_node) { + var dst_list = this; + return this.getCompareHandler()(src_list, src_node, dst_list, dst_node); + }, + + _getCurrentTarget : function(p) { + var targets = this._getTargets(); + var dragging = this._dragging; // Find the node we're dragging the object underneath. This is the first // node in the list that's above the cursor. If that node is the node // we're dragging or its predecessor, don't select a target, because the // operation would be a no-op. + // NOTE: When we're dragging into the first position in the list, we + // use the target `null`. When we don't have a valid target, we use + // the target `false`. Spooky! Magic! Anyway, `null` and `false` mean + // completely different things. + var cur_target = null; var trigger; for (var ii = 0; ii < targets.length; ii++) { - - // If the drop target indicator is above the target, we need to adjust - // the target's trigger height down accordingly. This makes dragging - // items down the list smoother, because the target doesn't jump to the - // next item while the cursor is over it. - trigger = targets[ii].y; - if (adjust_y <= trigger) { - trigger += adjust_h; - } // If the cursor is above this target, we aren't dropping underneath it. - if (trigger >= p.y) { continue; } // Don't choose the dragged row or its predecessor as targets. - cur_target = targets[ii].item; - if (cur_target == dragging) { - cur_target = null; - } - if (targets[ii - 1] && targets[ii - 1].item == dragging) { - cur_target = null; + if (!dragging) { + // If the item on the cursor isn't from this list, it can't be + // dropped onto itself or its predecessor in this list. + } else { + if (cur_target === dragging) { + cur_target = false; + } + if (targets[ii - 1] && (targets[ii - 1].item === dragging)) { + cur_target = false; + } } break; } + // If the dragged row is the first row, don't allow it to be dragged + // into the first position, since this operation doesn't make sense. + if (dragging && cur_target === null) { + var first_item = targets[targets.length - 1].item; + if (dragging === first_item) { + cur_target = false; + } + } + + return cur_target; + }, + + _onmove : function(e) { + // We'll get a callback here for "mousemove" (and can determine the + // location of the cursor) and also for "scroll" (and can not). If this + // is a move, save the mouse position, so if we get a scroll next we can + // reuse the known position. + + if (e.getType() == 'mousemove') { + this._cursorPosition = JX.$V(e); + this._cursorOrigin = JX.$V(e); + this._cursorScroll = JX.Vector.getScroll(); + } + + if (!this._dragging) { + return; + } + + if (!this._cursorPosition) { + return; + } + + if (e.getType() == 'scroll') { + // If this is a scroll event, the positions of drag targets may have + // changed. + this._dirtyTargetCache(); + + // Correct the cursor position to account for scrolling. + var s = JX.Vector.getScroll(); + this._cursorPosition = new JX.$V( + this._cursorOrigin.x - (this._cursorScroll.x - s.x), + this._cursorOrigin.y - (this._cursorScroll.y - s.y)); + } + + var p = JX.$V(this._cursorPosition.x, this._cursorPosition.y); + + var group = this._group; + var target_list = this._getTargetList(p); + + // Compute the size and position of the drop target indicator, because we + // need to update our static position computations to account for it. + + var compare_handler = this.getCompareHandler(); + + var cur_target = false; + if (target_list) { + // Determine if we're going to use the compare handler or not: the + // compare hander locks items into a specific place in the list. For + // example, on Workboards, some operations permit the user to drag + // items between lists, but not to reorder items within a list. + + var should_compare = false; + + var is_reorder = (target_list === this); + var is_move = (target_list !== this); + + if (compare_handler) { + if (is_reorder && this.getCompareOnReorder()) { + should_compare = true; + } + if (is_move && this.getCompareOnMove()) { + should_compare = true; + } + } + + if (should_compare) { + cur_target = target_list._getOrderedTarget(this, this._dragging); + } else { + cur_target = target_list._getCurrentTarget(p); + } + } + // If we've selected a new target, update the UI to show where we're // going to drop the row. - if (cur_target != target) { + for (var ii = 0; ii < group.length; ii++) { + if (group[ii] == target_list) { + group[ii]._setTarget(cur_target); + } else { + group[ii]._clearTarget(); + } + } - if (target) { - JX.DOM.remove(ghost); + this._didChangeTarget(target_list, cur_target); + + this._updateAutoscroll(this._cursorPosition); + + var f = JX.$V(this._frame); + p.x -= f.x; + p.y -= f.y; + + p.y += this._offset.y; + this._clone.style.top = p.y + 'px'; + + if (this.getCanDragX()) { + p.x += this._offset.x; + this._clone.style.left = p.x + 'px'; + } + + e.kill(); + }, + + _updateAutoscroll: function(p) { + var container = this._getScrollAnchor().parentNode; + var autoscroll = {}; + + var outer = this.getOuterContainer(); + + var cpos; + var cdim; + + while (container) { + if (outer && (container == outer)) { + break; } - if (cur_target) { - this.getGhostHandler()(ghost, cur_target); + try { + cpos = JX.Vector.getPos(container); + cdim = JX.Vector.getDim(container); + if (container == document.body) { + cdim = JX.Vector.getViewport(); + cpos.x += container.scrollLeft; + cpos.y += container.scrollTop; + } + } catch (ignored) { + break; } - target = cur_target; + var fuzz = 64; - if (target) { + if (p.y <= cpos.y + fuzz) { + autoscroll.up = container; + } - // If we've changed where the ghost node is, update the adjustments - // so we accurately reflect document state when we tweak things below. - // This avoids a flash of bad state as the mouse is dragged upward - // across the document. + if (p.y >= cpos.y + cdim.y - fuzz) { + autoscroll.down = container; + } - adjust_h = JX.Vector.getDim(ghost).y; - adjust_y = JX.$V(ghost).y; + if (p.x <= cpos.x + fuzz) { + autoscroll.left = container; } - } - // If the drop target indicator is above the cursor in the document, - // adjust the cursor position for the change in node document position. - // Do this before choosing a new target to avoid a flash of nonsense. + if (p.x >= cpos.x + cdim.x - fuzz) { + autoscroll.right = container; + } - if (target) { - if (adjust_y <= origin.y) { - p.y -= adjust_h; + if (container == document.body) { + break; } + + container = container.parentNode; } - p.x = 0; - p.y -= origin.y; - p.setPos(dragging); - this._target = target; + this._autoscroll = autoscroll; + }, - e.kill(); + _onkey: function(e) { + // Cancel any current drag if the user presses escape. + if (this._dragging && (e.getSpecialKey() == 'esc')) { + e.kill(); + this._drop(null); + return; + } }, _ondrop : function(e) { + if (this._dragging) { + e.kill(); + } + + var p = JX.$V(e); + this._drop(p); + }, + + _drop: function(cursor) { if (!this._dragging) { return; } - var target = this._target; var dragging = this._dragging; - var ghost = this.getGhostNode(); - this._dragging = null; + clearInterval(this._autoscroller); + this._autoscroller = null; + + JX.DOM.remove(this._frame); + JX.DOM.alterClass(document.body, 'jx-dragging', false); + this._frame = null; + this._clone = null; + + var target = false; + var ghost = false; + + if (cursor) { + var target_list = this._getTargetList(cursor); + if (target_list) { + target = target_list._target; + ghost = target_list.getGhostNode(); + } + } JX.$V(0, 0).setPos(dragging); - if (target) { + if (target === false) { + this.invoke('didCancelDrag', dragging); + } else { JX.DOM.remove(dragging); JX.DOM.replace(ghost, dragging); - this.invoke('didDrop', dragging, target); - } else { - this.invoke('didCancelDrag', dragging); + this.invoke('didSend', dragging, target_list); + target_list.invoke('didReceive', dragging, this); + target_list.invoke('didDrop', dragging, target, this); } - if (!this.invoke('didEndDrag', dragging).getPrevented()) { - JX.DOM.alterClass(dragging, 'drag-dragging', false); + var group = this._group; + for (var ii = 0; ii < group.length; ii++) { + group[ii]._setIsDropTarget(false); + group[ii]._clearTarget(); } - e.kill(); + this._didChangeTarget(null, null); + + JX.DOM.alterClass(dragging, 'drag-dragging', false); + JX.Tooltip.unlock(); + + this.invoke('didEndDrag', dragging); + }, + + _getScrollAnchor: function() { + // If you drag an item from column "A" into column "B", then move the + // mouse to the top or bottom of the screen, we need to scroll the target + // column (column "B"), not the original column. + + var group = this._group; + for (var ii = 0; ii < group.length; ii++) { + var target = group[ii]._getTarget(); + if (target) { + return group[ii]._ghostNode; + } + } + + return this._dragging; + }, + + _onautoscroll: function() { + var u = this._autoscroll.up; + var d = this._autoscroll.down; + var l = this._autoscroll.left; + var r = this._autoscroll.right; + + var now = +new Date(); + + if (!this._autotimer) { + this._autotimer = now; + return; + } + + var delta = now - this._autotimer; + this._autotimer = now; + + var amount = 12 * (delta / 10); + + var anchor = this._getScrollAnchor(); + + if (u && (u != d)) { + this._tryScroll(anchor, u, 'scrollTop', amount); + } + + if (d && (d != u)) { + this._tryScroll(anchor, d, 'scrollTop', -amount); + } + + if (l && (l != r)) { + this._tryScroll(anchor, l, 'scrollLeft', amount); + } + + if (r && (r != l)) { + this._tryScroll(anchor, r, 'scrollLeft', -amount); + } + }, + + /** + * Walk up the tree from a node to some parent, trying to scroll every + * container. Stop when we find a container which we're able to scroll. + */ + _tryScroll: function(from, to, property, amount) { + var value; + + var container = from.parentNode; + while (container) { + + // In Safari, we'll eventually reach `window.document`, which is not + // sufficently node-like to support sigil tests. + var lock = false; + if (container === window.document) { + lock = false; + } else { + // Some elements may respond to, e.g., `scrollTop` adjustment, even + // though they are not scrollable. This sigil disables adjustment + // for them. + var lock_sigil; + if (property == 'scrollTop') { + lock_sigil = 'lock-scroll-y-while-dragging'; + } + + if (lock_sigil) { + lock = JX.Stratcom.hasSigil(container, lock_sigil); + } + } + + if (!lock) { + // Read the current scroll value. + value = container[property]; + + // Try to scroll. + container[property] -= amount; + + // If we scrolled it, we're all done. + if (container[property] != value) { + break; + } + + if (container == to) { + break; + } + } + + container = container.parentNode; + } }, lock : function() { + for (var ii = 0; ii < this._group.length; ii++) { + this._group[ii]._lock(); + } + return this; + }, + + _lock : function() { this._locked++; if (this._locked === 1) { this.invoke('didLock'); @@ -273,10 +825,17 @@ JX.install('DraggableList', { return this; }, - unlock : function() { + unlock: function() { + for (var ii = 0; ii < this._group.length; ii++) { + this._group[ii]._unlock(); + } + return this; + }, + + _unlock : function() { if (__DEV__) { if (!this._locked) { - JX.$E("JX.Draggable.unlock(): Draggable is not locked!"); + JX.$E('JX.Draggable.unlock(): Draggable is not locked!'); } } this._locked--; @@ -285,6 +844,7 @@ JX.install('DraggableList', { } return this; } + } }); diff --git a/webroot/rsrc/js/core/DropdownMenu.js b/webroot/rsrc/js/core/DropdownMenu.js deleted file mode 100644 index 112989daef..0000000000 --- a/webroot/rsrc/js/core/DropdownMenu.js +++ /dev/null @@ -1,156 +0,0 @@ -/** - * @requires javelin-install - * javelin-util - * javelin-dom - * javelin-vector - * javelin-stratcom - * phabricator-menu-item - * @provides phabricator-dropdown-menu - * @javelin - */ - -JX.install('PhabricatorDropdownMenu', { - - construct : function(node) { - this._node = node; - this._items = []; - this._menu = JX.$N('div', { className : 'dropdown-menu-frame' }); - - JX.DOM.listen( - this._node, - 'click', - null, - JX.bind(this, this._onclick)); - - JX.DOM.listen( - this._menu, - 'click', - null, - JX.bind(this, this._onclickitem)); - - JX.Stratcom.listen( - 'mousedown', - null, - JX.bind(this, this._onclickglobal)); - - JX.PhabricatorDropdownMenu.listen( - 'open', - JX.bind(this, this.close)); - }, - - events : ['open'], - - members : { - _node : null, - _menu : null, - _open : false, - _items : null, - _alignRight : true, - - // By default, the dropdown will have its right edge aligned with the - // right edge of _node. Making this false does left edge alignment - toggleAlignDropdownRight : function (bool) { - this._alignRight = bool; - }, - - open : function() { - if (this._open) { - return; - } - - this.invoke('open'); - - var menu_items = []; - for (var ii = 0; ii < this._items.length; ii++) { - menu_items.push(this._items[ii].render()); - } - JX.DOM.setContent(this._menu, menu_items); - - this._open = true; - this._show(); - }, - - close : function() { - if (!this._open) { - return; - } - this._open = false; - this._hide(); - }, - - addItem : function(item) { - if (__DEV__) { - if (!(item instanceof JX.PhabricatorMenuItem)) { - JX.$E( - 'JX.DropdownMenu.addItem(): ' + - 'item must be a JX.PhabricatorMenuItem.'); - } - } - this._items.push(item); - return this; - }, - - _onclick : function(e) { - if (this._open) { - this.close(); - } else { - this.open(); - } - e.prevent(); - }, - - _onclickitem : function(e) { - var item = JX.Stratcom.getData(e.getTarget()).item; - if (!item) { - return; - } - item.select(); - e.prevent(); - this.close(); - }, - - _onclickglobal : function(e) { - if (!this._open) { - return; - } - - if (JX.Stratcom.pass(e)) { - return; - } - - var t = e.getTarget(); - while (t) { - if (t == this._menu || t == this._node) { - return; - } - t = t.parentNode; - } - - this.close(); - }, - - _show : function() { - document.body.appendChild(this._menu); - - var m = JX.Vector.getDim(this._menu); - - var v = JX.$V(this._node); - var d = JX.Vector.getDim(this._node); - if (this._alignRight) { - v = v.add(d) - .add(JX.$V(-m.x, 0)); - } else { - v = v.add(0, d.y); - } - v.setPos(this._menu); - - JX.DOM.alterClass(this._node, 'dropdown-open', true); - }, - - _hide : function() { - JX.DOM.remove(this._menu); - JX.DOM.alterClass(this._node, 'dropdown-open', false); - } - - } -}); diff --git a/webroot/rsrc/js/core/DropdownMenuItem.js b/webroot/rsrc/js/core/DropdownMenuItem.js deleted file mode 100644 index 00445b0738..0000000000 --- a/webroot/rsrc/js/core/DropdownMenuItem.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @requires javelin-install - * javelin-dom - * @provides phabricator-menu-item - * @javelin - */ - -JX.install('PhabricatorMenuItem', { - - construct : function(name, action, href) { - this.setName(name); - this.setHref(href || '#'); - this._action = action; - }, - - members : { - _action : null, - - render : function() { - if (this.getDisabled()) { - return JX.$N('span', this.getName()); - } else { - var attrs = { href : this.getHref(), meta : { item : this } }; - return JX.$N('a', attrs, this.getName()); - } - }, - - select : function() { - this._action(); - } - }, - - properties : { - name : '', - href : '', - disabled : false - } - -}); diff --git a/webroot/rsrc/js/core/Favicon.js b/webroot/rsrc/js/core/Favicon.js new file mode 100644 index 0000000000..fb494dfbbd --- /dev/null +++ b/webroot/rsrc/js/core/Favicon.js @@ -0,0 +1,35 @@ +/** + * @provides phabricator-favicon + * @requires javelin-install + * javelin-dom + */ +JX.install('Favicon', { + statics: { + _favicon: null, + + setFavicon: function(favicon) { + var self = JX.Favicon; + self._favicon = favicon; + self._update(); + }, + + _update: function() { + var self = JX.Favicon; + var cur_favicon = JX.$('favicon'); + + if (self._favicon === null) { + self._favicon = cur_favicon.href; + } + + var new_favicon = JX.$N( + 'link', + {href: self._favicon, + id: 'favicon', + rel: 'shortcut icon', + }); + + JX.DOM.replace(cur_favicon, new_favicon); + + } + } +}); diff --git a/webroot/rsrc/js/core/FileUpload.js b/webroot/rsrc/js/core/FileUpload.js index bdc28f427f..22ba33f97a 100644 --- a/webroot/rsrc/js/core/FileUpload.js +++ b/webroot/rsrc/js/core/FileUpload.js @@ -13,19 +13,78 @@ JX.install('PhabricatorFileUpload', { }, properties : { - name : null, - totalBytes : null, - uploadedBytes : null, - ID : null, - PHID : null, - URI : null, - status : null, - markup : null, - error : null + name: null, + totalBytes: null, + uploadedBytes: null, + rawFileObject: null, + allocatedPHID: null, + ID: null, + PHID: null, + URI: null, + status: null, + markup: null, + targetNode: null, + error: null }, members : { _notification : null, + _chunks: null, + _isResume: false, + + addUploadedBytes: function(bytes) { + var uploaded = this.getUploadedBytes(); + this.setUploadedBytes(uploaded + bytes); + return this; + }, + + setChunks: function(chunks) { + var chunk; + for (var ii = 0; ii < chunks.length; ii++) { + chunk = chunks[ii]; + if (chunk.complete) { + this.addUploadedBytes(chunk.byteEnd - chunk.byteStart); + this._isResume = true; + } + } + + this._chunks = chunks; + + return this; + }, + + getChunks: function() { + return this._chunks; + }, + + getRemainingChunks: function() { + var chunks = this.getChunks(); + + var result = []; + for (var ii = 0; ii < chunks.length; ii++) { + if (!chunks[ii].complete) { + result.push(chunks[ii]); + } + } + + return result; + }, + + didCompleteChunk: function(chunk) { + var chunks = this.getRemainingChunks(); + for (var ii = 0; ii < chunks.length; ii++) { + if (chunks[ii].byteStart == chunk.byteStart) { + if (chunks[ii].byteEnd == chunk.byteEnd) { + if (!chunks[ii].complete) { + chunks[ii].complete = true; + } + break; + } + } + } + + return this; + }, update : function() { if (!this._notification) { @@ -37,6 +96,9 @@ JX.install('PhabricatorFileUpload', { .show(); var content; + + // TODO: This stuff needs some work for translations. + switch (this.getStatus()) { case 'done': var link = JX.$N('a', {href: this.getURI()}, 'F' + this.getID()); @@ -68,15 +130,37 @@ JX.install('PhabricatorFileUpload', { .alterClassName('jx-notification-error', true); this._notification = null; break; + case 'allocate': + content = 'Allocating "' + this.getName() + '"...'; + this._notification + .setContent(content); + break; + case 'chunks': + content = 'Loading chunks for "' + this.getName() + '"...'; + this._notification + .setContent(content); + break; default: var info = ''; if (this.getTotalBytes()) { var p = this._renderPercentComplete(); var f = this._renderFileSize(); - info = ' (' + p + ' of ' + f + ')'; + info = p + ' of ' + f; } - info = 'Uploading "' + this.getName() + '"' + info + '...'; + var head; + if (this._isResume) { + head = 'Resuming:'; + } else if (this._chunks) { + head = 'Uploading chunks:'; + } else { + head = 'Uploading:'; + } + + info = [ + JX.$N('strong', {}, this.getName()), + JX.$N('br'), + head + ' ' + info]; this._notification .setContent(info); @@ -111,4 +195,3 @@ JX.install('PhabricatorFileUpload', { } }); - diff --git a/webroot/rsrc/js/core/Hovercard.js b/webroot/rsrc/js/core/Hovercard.js index 5174a85b5a..ba3c174bd1 100644 --- a/webroot/rsrc/js/core/Hovercard.js +++ b/webroot/rsrc/js/core/Hovercard.js @@ -4,155 +4,25 @@ * javelin-vector * javelin-request * javelin-uri - * @provides phabricator-hovercard + * @provides phui-hovercard * @javelin */ JX.install('Hovercard', { - statics : { - _node : null, - _activeRoot : null, - _visiblePHID : null, - - fetchUrl : '/search/hovercard/retrieve/', - - /** - * Hovercard storage. {"PHID-XXXX-YYYY":"<...>", ...} - */ - _cards : {}, - - getAnchor : function() { - return this._activeRoot; - }, - - getCard : function() { - var self = JX.Hovercard; - return self._node; - }, - - show : function(root, phid) { - var self = JX.Hovercard; - // Already displaying - if (self.getCard() && phid == self._visiblePHID) { - return; - } - self.hide(); - - self._visiblePHID = phid; - self._activeRoot = root; - - if (!(phid in self._cards)) { - self._load([phid]); - } else { - self._drawCard(phid); - } - }, - - _drawCard : function(phid) { - var self = JX.Hovercard; - // card is loading... - if (self._cards[phid] === true) { - return; - } - // Not the current requested card - if (phid != self._visiblePHID) { - return; - } - // Not loaded - if (!(phid in self._cards)) { - return; - } - - var root = self._activeRoot; - var node = JX.$N('div', - { className: 'jx-hovercard-container' }, - JX.$H(self._cards[phid])); - - self._node = node; - - // Append the card to the document, but offscreen, so we can measure it. - node.style.left = '-10000px'; - document.body.appendChild(node); - - // Retrieve size from child (wrapper), since node gives wrong dimensions? - var child = node.firstChild; - var p = JX.$V(root); - var d = JX.Vector.getDim(root); - var n = JX.Vector.getDim(child); - - // Move the tip so it's nicely aligned. - // I'm just doing north/south alignment for now - // TODO: Fix southern graceful align - var margin = 20; - // We can't shift left by ~$margin or more here due to Pholio, Phriction - var x = parseInt(p.x, 10) - margin / 2; - var y = parseInt(p.y - n.y, 10) - margin; - - // If more in the center, we can safely center - if (x > (n.x / 2) + margin) { - x = parseInt(p.x - (n.x / 2) + d.x, 10); - } - - // Temporarily disabled, since it gives weird results (you can only see - // a hovercard once, as soon as it's hidden, it cannot be shown again) - // if (y < n.y) { - // // Place it southern, since northern is not enough space - // y = p.y + d.y + margin; - // } - - node.style.left = x + 'px'; - node.style.top = y + 'px'; - }, - - hide : function() { - var self = JX.Hovercard; - self._visiblePHID = null; - self._activeRoot = null; - if (self._node) { - JX.DOM.remove(self._node); - self._node = null; - } - }, - - /** - * Pass it an array of phids to load them into storage - * - * @param list phids - */ - _load : function(phids) { - var self = JX.Hovercard; - var uri = JX.$U(self.fetchUrl); - - var send = false; - for (var ii = 0; ii < phids.length; ii++) { - var phid = phids[ii]; - if (phid in self._cards) { - continue; - } - self._cards[phid] = true; // means "loading" - uri.setQueryParam("phids["+ii+"]", phids[ii]); - send = true; - } - - if (!send) { - // already loaded / loading everything! - return; - } - - new JX.Request(uri, function(r) { - for (var phid in r.cards) { - self._cards[phid] = r.cards[phid]; - - // Don't draw if the user is faster than the browser - // Only draw if the user is still requesting the original card - if (self.getCard() && phid != self._visiblePHID) { - continue; - } - - self._drawCard(phid); - } - }).send(); + properties: { + hovercardKey: null, + objectPHID: null, + contextPHID: null, + isLoading: false, + isLoaded: false, + content: null + }, + + members: { + newContentNode: function() { + return JX.$H(this.getContent()); } } + }); diff --git a/webroot/rsrc/js/core/HovercardList.js b/webroot/rsrc/js/core/HovercardList.js new file mode 100644 index 0000000000..645a9d00e4 --- /dev/null +++ b/webroot/rsrc/js/core/HovercardList.js @@ -0,0 +1,233 @@ +/** + * @requires javelin-install + * javelin-dom + * javelin-vector + * javelin-request + * javelin-uri + * phui-hovercard + * @provides phui-hovercard-list + * @javelin + */ + +JX.install('HovercardList', { + + construct: function() { + this._cards = {}; + this._drawRequest = {}; + }, + + members: { + _cardNode: null, + _rootNode: null, + _cards: null, + _drawRequest: null, + _visibleCard: null, + + _fetchURI : '/search/hovercard/', + + getCard: function(spec) { + var hovercard_key = this._newHovercardKey(spec); + + if (!(hovercard_key in this._cards)) { + var card = new JX.Hovercard() + .setHovercardKey(hovercard_key) + .setObjectPHID(spec.objectPHID) + .setContextPHID(spec.contextPHID || null); + + this._cards[hovercard_key] = card; + } + + return this._cards[hovercard_key]; + }, + + drawCard: function(card, node) { + this._drawRequest = { + card: card, + node: node + }; + + if (card.getIsLoaded()) { + return this._paintCard(card); + } + + if (card.getIsLoading()) { + return; + } + + var hovercard_key = card.getHovercardKey(); + + var request = {}; + request[hovercard_key] = this._newCardRequest(card); + request = JX.JSON.stringify(request); + + var uri = JX.$U(this._fetchURI) + .setQueryParam('cards', request); + + var onresponse = JX.bind(this, function(r) { + var card = this._cards[hovercard_key]; + + this._fillCard(card, r.cards[hovercard_key]); + this._paintCard(card); + }); + + card.setIsLoading(true); + + new JX.Request(uri, onresponse) + .send(); + }, + + _newHovercardKey: function(spec) { + var parts = [ + spec.objectPHID, + spec.contextPHID + ]; + + return parts.join('/'); + }, + + _newCardRequest: function(card) { + return { + objectPHID: card.getObjectPHID(), + contextPHID: card.getContextPHID() + }; + }, + + _getCardNode: function() { + if (!this._cardNode) { + var attributes = { + className: 'jx-hovercard-container' + }; + + this._cardNode = JX.$N('div', attributes); + } + + return this._cardNode; + }, + + _fillCard: function(card, response) { + card.setContent(response); + card.setIsLoaded(true); + }, + + _paintCard: function(card) { + var request = this._drawRequest; + + if (request.card !== card) { + // This paint request is no longer the most recent paint request. + return; + } + + this.hideCard(); + + this._rootNode = request.node; + var root = this._rootNode; + var node = this._getCardNode(); + + JX.DOM.setContent(node, card.newContentNode()); + + // Append the card to the document, but offscreen, so we can measure it. + node.style.left = '-10000px'; + document.body.appendChild(node); + + // Retrieve size from child (wrapper), since node gives wrong dimensions? + var child = node.firstChild; + + var p = JX.$V(root); + var d = JX.Vector.getDim(root); + var n = JX.Vector.getDim(child); + var v = JX.Vector.getViewport(); + var s = JX.Vector.getScroll(); + + // Move the tip so it's nicely aligned. + var margin = 20; + + // Try to align the card directly above the link, with left borders + // touching. + var x = p.x; + + // If this would push us off the right side of the viewport, push things + // back to the left. + if ((x + n.x + margin) > (s.x + v.x)) { + x = (s.x + v.x) - n.x - margin; + } + + // Try to put the card above the link. + var y = p.y - n.y - margin; + + var alignment = 'north'; + + // If the card is near the top of the window, show it beneath the + // link we're hovering over instead. + if ((y - margin) < s.y) { + y = p.y + d.y + margin; + alignment = 'south'; + } + + this._alignment = alignment; + node.style.left = x + 'px'; + node.style.top = y + 'px'; + + this._visibleCard = card; + }, + + hideCard: function() { + var node = this._getCardNode(); + JX.DOM.remove(node); + + this._rootNode = null; + this._alignment = null; + this._visibleCard = null; + }, + + onMouseMove: function(e) { + if (!this._visibleCard) { + return; + } + + var root = this._rootNode; + var node = this._getCardNode(); + var alignment = this._alignment; + + var mouse = JX.$V(e); + var node_pos = JX.$V(node); + var node_dim = JX.Vector.getDim(node); + var root_pos = JX.$V(root); + var root_dim = JX.Vector.getDim(root); + + var margin = 20; + + if (alignment === 'south') { + // Cursor is below the node. + if (mouse.y > node_pos.y + node_dim.y + margin) { + this.hideCard(); + } + + // Cursor is above the root. + if (mouse.y < root_pos.y - margin) { + this.hideCard(); + } + } else { + // Cursor is above the node. + if (mouse.y < node_pos.y - margin) { + this.hideCard(); + } + + // Cursor is below the root. + if (mouse.y > root_pos.y + root_dim.y + margin) { + this.hideCard(); + } + } + + // Cursor is too far to the left. + if (mouse.x < Math.min(root_pos.x, node_pos.x) - margin) { + this.hideCard(); + } + + // Cursor is too far to the right. + if (mouse.x > + Math.max(root_pos.x + root_dim.x, node_pos.x + node_dim.x) + margin) { + this.hideCard(); + } + } + } +}); diff --git a/webroot/rsrc/js/core/KeyboardShortcut.js b/webroot/rsrc/js/core/KeyboardShortcut.js index 173a7b8ee2..9d34cce8ad 100644 --- a/webroot/rsrc/js/core/KeyboardShortcut.js +++ b/webroot/rsrc/js/core/KeyboardShortcut.js @@ -20,6 +20,7 @@ JX.install('KeyboardShortcut', { properties : { keys : null, + group: null, description : null, handler : null, tooltipHandler : null diff --git a/webroot/rsrc/js/core/KeyboardShortcutManager.js b/webroot/rsrc/js/core/KeyboardShortcutManager.js index 5677335781..8cc8da1a08 100644 --- a/webroot/rsrc/js/core/KeyboardShortcutManager.js +++ b/webroot/rsrc/js/core/KeyboardShortcutManager.js @@ -16,6 +16,9 @@ JX.install('KeyboardShortcutManager', { JX.Stratcom.listen('keypress', null, JX.bind(this, this._onkeypress)); JX.Stratcom.listen('keydown', null, JX.bind(this, this._onkeydown)); JX.Stratcom.listen('keyup', null, JX.bind(this, this._onkeyup)); + + var onelement = JX.bind(this, this._onelement); + JX.Stratcom.listen('click', 'has-key-command', onelement); }, statics : { @@ -32,6 +35,18 @@ JX.install('KeyboardShortcutManager', { down: 1 }, + /** + * Some keys require Alt to be pressed in order to type them on certain + * keyboard layouts. + */ + _altkeys: { + // "Alt+L" on German layouts. + '@': 1, + + // "Alt+Shift+7" on German layouts. + '\\': 1 + }, + getInstance : function() { if (!JX.KeyboardShortcutManager._instance) { JX.KeyboardShortcutManager._instance = new JX.KeyboardShortcutManager(); @@ -42,7 +57,6 @@ JX.install('KeyboardShortcutManager', { members : { _shortcuts : null, - _focusReticle : null, /** * Instead of calling this directly, you should call @@ -54,9 +68,11 @@ JX.install('KeyboardShortcutManager', { getShortcutDescriptions : function() { var desc = []; for (var ii = 0; ii < this._shortcuts.length; ii++) { + var shortcut = this._shortcuts[ii]; desc.push({ - keys : this._shortcuts[ii].getKeys(), - description : this._shortcuts[ii].getDescription() + keys : shortcut.getKeys(), + group: shortcut.getGroup(), + description : shortcut.getDescription() }); } return desc; @@ -66,63 +82,35 @@ JX.install('KeyboardShortcutManager', { * Scroll an element into view. */ scrollTo : function(node) { - window.scrollTo(0, JX.$V(node).y - 60); - }, - - /** - * Move the keyboard shortcut focus to an element. - * - * @param Node Node to focus, or pass null to clear the focus. - * @param Node To focus multiple nodes (like rows in a table), specify the - * top-left node as the first parameter and the bottom-right - * node as the focus extension. - * @return void - */ - focusOn : function(node, extended_node) { - this._clearReticle(); - - if (!node) { - return; - } - - var r = JX.$N('div', {className : 'keyboard-focus-focus-reticle'}); - - extended_node = extended_node || node; - - // Outset the reticle some pixels away from the element, so there's some - // space between the focused element and the outline. - var p = JX.Vector.getPos(node); - p.add(-4, -4).setPos(r); - // Compute the size we need to extend to the full extent of the focused - // nodes. - JX.Vector.getPos(extended_node) - .add(-p.x, -p.y) - .add(JX.Vector.getDim(extended_node)) - .add(8, 8) - .setDim(r); - document.body.appendChild(r); - - this._focusReticle = r; + var scroll_distance = JX.Vector.getAggregateScrollForNode(node); + var node_position = JX.$V(node); + JX.DOM.scrollToPosition(0, node_position.y + scroll_distance.y - 60); }, - _clearReticle : function() { - this._focusReticle && JX.DOM.remove(this._focusReticle); - this._focusReticle = null; - }, _onkeypress : function(e) { if (!(this._getKey(e) in JX.KeyboardShortcutManager._downkeys)) { this._onkeyhit(e); } }, _onkeyhit : function(e) { + var self = JX.KeyboardShortcutManager; + var raw = e.getRawEvent(); - if (raw.altKey || raw.ctrlKey || raw.metaKey) { + if (raw.ctrlKey || raw.metaKey) { // Never activate keyboard shortcuts if modifier keys are also // depressed. return; } + // For most keystrokes, don't activate keyboard shortcuts if the Alt + // key is depressed. However, we continue if the character requires the + // use of Alt to type it on some keyboard layouts. + var key = this._getKey(e); + if (raw.altKey && !(key in self._altkeys)) { + return; + } + var target = e.getTarget(); var ignore = ['input', 'select', 'textarea', 'object', 'embed']; if (JX.DOM.isType(target, ignore)) { @@ -133,18 +121,29 @@ JX.install('KeyboardShortcutManager', { var key = this._getKey(e); + var handled = this._handleKey(key); + + if (handled) { + e.kill(); + } + }, + + _handleKey: function(key) { var shortcuts = this._shortcuts; + for (var ii = 0; ii < shortcuts.length; ii++) { var keys = shortcuts[ii].getKeys(); for (var jj = 0; jj < keys.length; jj++) { if (keys[jj] == key) { shortcuts[ii].getHandler()(this); - e.kill(); // Consume the event - return; + return true; } } } + + return false; }, + _onkeydown : function(e) { this._handleTooltipKeyEvent(e, true); @@ -158,6 +157,12 @@ JX.install('KeyboardShortcutManager', { _getKey : function(e) { return e.getSpecialKey() || String.fromCharCode(e.getRawEvent().charCode); }, + _onelement: function(e) { + var data = e.getNodeData('has-key-command'); + this._handleKey(data.keyCommand); + + e.kill(); + }, _handleTooltipKeyEvent : function(e, is_keydown) { if (e.getRawEvent().keyCode != 18) { // If this isn't the alt/option key, don't do anything. diff --git a/webroot/rsrc/js/core/MultirowRowManager.js b/webroot/rsrc/js/core/MultirowRowManager.js index 319ff353c2..938add8075 100644 --- a/webroot/rsrc/js/core/MultirowRowManager.js +++ b/webroot/rsrc/js/core/MultirowRowManager.js @@ -25,7 +25,7 @@ JX.install('MultirowRowManager', { this._root = root; this._rows = []; - if (typeof minRows !== "undefined") { + if (typeof minRows !== 'undefined') { this._minRows = minRows; } else { this._minRows = 1; @@ -45,7 +45,7 @@ JX.install('MultirowRowManager', { _rows : null, _generateRowID : function() { - return "" + this._nextID++; + return '' + this._nextID++; }, _wrapRowContents : function(row_id, row_contents) { @@ -57,13 +57,13 @@ JX.install('MultirowRowManager', { var removeButton = JX.$N( 'td', - {}, + { className: 'remove-column' }, JX.$N( 'a', - { className: "button", + { className: 'button simple', sigil: JX.MultirowRowManager._removeSigil }, - '-')); + 'Remove')); JX.DOM.appendContent(row, removeButton); return row; @@ -78,11 +78,11 @@ JX.install('MultirowRowManager', { */ updateRow : function(row_id, row_contents) { if (__DEV__) { - if (typeof this._rows[row_id] === "undefined") { - throw new Error("JX.MultirowRowManager.updateRow(row_id, " + - "row_contents): provided row id does not exist." + - " Use addRow to create a new row and make sure " + - "not to update rows that have been deleted."); + if (typeof this._rows[row_id] === 'undefined') { + throw new Error('JX.MultirowRowManager.updateRow(row_id, ' + + 'row_contents): provided row id does not exist.' + + ' Use addRow to create a new row and make sure ' + + 'not to update rows that have been deleted.'); } } var old_row = this._rows[row_id]; @@ -121,7 +121,7 @@ JX.install('MultirowRowManager', { this.invoke('row-removed', row_id); }, - _oncountchanged : function(e) { + _oncountchanged : function() { var buttons = JX.DOM.scry( this._root, 'a', @@ -138,9 +138,8 @@ JX.install('MultirowRowManager', { events : ['row-removed'], statics : { getRowSigil : function() { - return "tools-multirow-row-manager-row"; + return 'tools-multirow-row-manager-row'; }, - _removeSigil : "tools-multirow-row-manager-row-remove" + _removeSigil : 'tools-multirow-row-manager-row-remove' } }); - diff --git a/webroot/rsrc/js/core/Notification.js b/webroot/rsrc/js/core/Notification.js index 494508c32d..67e1e5c910 100644 --- a/webroot/rsrc/js/core/Notification.js +++ b/webroot/rsrc/js/core/Notification.js @@ -26,15 +26,45 @@ JX.install('Notification', { _visible : false, _hideTimer : null, _duration : 12000, + _asDesktop : false, + _asWeb : true, + _key : null, + _title : null, + _body : null, + _href : null, + _icon : null, show : function() { + var self = JX.Notification; + if (!this._visible) { this._visible = true; - var self = JX.Notification; self._show(this); this._updateTimer(); } + + if (self.supportsDesktopNotifications() && + self.desktopNotificationsEnabled() && + this._asDesktop) { + // Note: specifying "tag" means that notifications with matching + // keys will aggregate. + var n = new window.Notification(this._title, { + icon: this._icon, + body: this._body, + tag: this._key, + }); + n.onclick = JX.bind(n, function (href) { + this.close(); + window.focus(); + if (href) { + JX.$U(href).go(); + } + }, this._href); + // Note: some OS / browsers do this automagically; make the behavior + // happen everywhere. + setTimeout(n.close.bind(n), this._duration); + } return this; }, @@ -59,6 +89,41 @@ JX.install('Notification', { return this; }, + setShowAsWebNotification: function(mode) { + this._asWeb = mode; + return this; + }, + + setShowAsDesktopNotification : function(mode) { + this._asDesktop = mode; + return this; + }, + + setTitle : function(title) { + this._title = title; + return this; + }, + + setBody : function(body) { + this._body = body; + return this; + }, + + setHref : function(href) { + this._href = href; + return this; + }, + + setKey : function(key) { + this._key = key; + return this; + }, + + setIcon : function(icon) { + this._icon = icon; + return this; + }, + /** * Set duration before the notification fades away, in milliseconds. If set * to 0, the notification persists until dismissed. @@ -97,6 +162,12 @@ JX.install('Notification', { }, statics : { + supportsDesktopNotifications : function () { + return 'Notification' in window; + }, + desktopNotificationsEnabled : function () { + return window.Notification.permission === 'granted'; + }, _container : null, _listening : false, _active : [], @@ -177,6 +248,13 @@ JX.install('Notification', { var notifications = []; for (var ii = 0; ii < self._active.length; ii++) { + + // Don't render this notification if it's not configured to show as + // a web notification. + if (!self._active[ii]._asWeb) { + continue; + } + notifications.push(self._active[ii]._getContainer()); if (!(--limit)) { break; @@ -188,4 +266,3 @@ JX.install('Notification', { } }); - diff --git a/webroot/rsrc/js/core/Prefab.js b/webroot/rsrc/js/core/Prefab.js index 56bd70ac7f..ff4467881b 100644 --- a/webroot/rsrc/js/core/Prefab.js +++ b/webroot/rsrc/js/core/Prefab.js @@ -19,18 +19,42 @@ JX.install('Prefab', { statics : { - renderSelect : function(map, selected, attrs) { + renderSelect : function(map, selected, attrs, order) { var select = JX.$N('select', attrs || {}); - for (var k in map) { + + // Callers may optionally pass "order" to force options into a specific + // order. Although most browsers do retain order, maps in Javascript + // aren't technically ordered. Safari, at least, will reorder maps with + // numeric keys. + + order = order || JX.keys(map); + + var k; + for (var ii = 0; ii < order.length; ii++) { + k = order[ii]; select.options[select.options.length] = new Option(map[k], k); if (k == selected) { select.value = k; } } - select.value = select.value || JX.keys(map)[0]; + + select.value = select.value || order[0]; + return select; }, + newTokenizerFromTemplate: function(markup, config) { + var template = JX.$H(markup).getFragment().firstChild; + var container = JX.DOM.find(template, 'div', 'tokenizer-container'); + + container.id = ''; + config.root = container; + + var build = JX.Prefab.buildTokenizer(config); + build.node = template; + return build; + }, + /** * Build a Phabricator tokenizer out of a configuration with application * sorting, datasource and placeholder rules. @@ -43,9 +67,12 @@ JX.install('Prefab', { * - `limit` Optional, token limit. * - `placeholder` Optional, placeholder text. * - `username` Optional, username to sort first (i.e., viewer). + * - `icons` Optional, map of icons. * */ buildTokenizer : function(config) { + config.icons = config.icons || {}; + var root; try { @@ -58,70 +85,82 @@ JX.install('Prefab', { } var datasource; - if (config.ondemand) { + + // Default to an ondemand source if no alternate configuration is + // provided. + var ondemand = true; + if ('ondemand' in config) { + ondemand = config.ondemand; + } + + if (ondemand) { datasource = new JX.TypeaheadOnDemandSource(config.src); } else { datasource = new JX.TypeaheadPreloadedSource(config.src); } - // Sort results so that the viewing user always comes up first; after - // that, prefer unixname matches to realname matches. - - var sort_handler = function(value, list, cmp) { - var priority_hits = {}; - var self_hits = {}; - - var tokens = this.tokenize(value); + datasource.setSortHandler( + JX.bind(datasource, JX.Prefab.sortHandler, config)); + datasource.setTransformer(JX.Prefab.transformDatasourceResults); - for (var ii = 0; ii < list.length; ii++) { - var item = list[ii]; - if (!item.priority) { - continue; - } - - if (config.username && item.priority == config.username) { - self_hits[item.id] = true; - } + var typeahead = new JX.Typeahead( + root, + JX.DOM.find(root, 'input', 'tokenizer-input')); + typeahead.setDatasource(datasource); - for (var jj = 0; jj < tokens.length; jj++) { - if (item.priority.substr(0, tokens[jj].length) == tokens[jj]) { - priority_hits[item.id] = true; - } - } + var tokenizer = new JX.Tokenizer(root); + tokenizer.setTypeahead(typeahead); + tokenizer.setRenderTokenCallback(function(value, key, container) { + var result; + if (value && (typeof value == 'object') && ('id' in value)) { + // TODO: In this case, we've been passed the decoded wire format + // dictionary directly. Token rendering is kind of a huge mess that + // should be cleaned up and made more consistent. Just force our + // way through for now. + result = value; + } else { + result = datasource.getResult(key); } - list.sort(function(u, v) { - if (self_hits[u.id] != self_hits[v.id]) { - return self_hits[v.id] ? 1 : -1; - } + var icon; + var type; + var color; + var availability_color; + if (result) { + icon = result.icon; + value = result.displayName; + type = result.tokenType; + color = result.color; + availability_color = result.availabilityColor; + } else { + icon = (config.icons || {})[key]; + type = (config.types || {})[key]; + color = (config.colors || {})[key]; + availability_color = (config.availabilityColors || {})[key]; + } - if (priority_hits[u.id] != priority_hits[v.id]) { - return priority_hits[v.id] ? 1 : -1; - } + if (icon) { + icon = JX.Prefab._renderIcon(icon); + } - return cmp(u, v); - }); - }; + type = type || 'object'; + JX.DOM.alterClass(container, 'jx-tokenizer-token-' + type, true); - datasource.setSortHandler(JX.bind(datasource, sort_handler)); - datasource.setTransformer( - function(object) { - return { - name: object[0], - display: object[0], - uri: object[1], - id: object[2], - priority: object[3] - }; - }); + if (color) { + JX.DOM.alterClass(container, color, true); + } - var typeahead = new JX.Typeahead( - root, - JX.DOM.find(root, 'input', 'tokenizer-input')); - typeahead.setDatasource(datasource); + var dot; + if (availability_color) { + dot = JX.$N( + 'span', + { + className: 'phui-tag-dot phui-tag-color-' + availability_color + }); + } - var tokenizer = new JX.Tokenizer(root); - tokenizer.setTypeahead(typeahead); + return [icon, dot, value]; + }); if (config.placeholder) { tokenizer.setPlaceholder(config.placeholder); @@ -135,12 +174,165 @@ JX.install('Prefab', { tokenizer.setInitialValue(config.value); } + if (config.browseURI) { + tokenizer.setBrowseURI(config.browseURI); + } + + if (config.disabled) { + tokenizer.setDisabled(true); + } + JX.Stratcom.addData(root, {'tokenizer' : tokenizer}); return { tokenizer: tokenizer }; + }, + + sortHandler: function(config, value, list, cmp) { + // Sort results so that the viewing user always comes up first; after + // that, prefer unixname matches to realname matches. + var priority_hits = {}; + var self_hits = {}; + + // We'll put matches where the user's input is a prefix of the name + // above matches where that isn't true. + var prefix_hits = {}; + + var tokens = this.tokenize(value); + var normal = this.normalize(value); + + for (var ii = 0; ii < list.length; ii++) { + var item = list[ii]; + + if (this.normalize(item.name).indexOf(normal) === 0) { + prefix_hits[item.id] = true; + } + + if (!item.priority) { + continue; + } + + if (config.username && item.priority == config.username) { + self_hits[item.id] = true; + } + } + + list.sort(function(u, v) { + if (self_hits[u.id] != self_hits[v.id]) { + return self_hits[v.id] ? 1 : -1; + } + + // If one result is open and one is closed, show the open result + // first. The "!" tricks here are because closed values are display + // strings, so the value is either `null` or some truthy string. If + // we compare the values directly, we'll apply this rule to two + // objects which are both closed but for different reasons, like + // "Archived" and "Disabled". + + var u_open = !u.closed; + var v_open = !v.closed; + + if (u_open != v_open) { + if (u_open) { + return -1; + } else { + return 1; + } + } + + if (prefix_hits[u.id] != prefix_hits[v.id]) { + return prefix_hits[v.id] ? 1 : -1; + } + + // Sort users ahead of other result types. + if (u.priorityType != v.priorityType) { + if (u.priorityType == 'user') { + return -1; + } + if (v.priorityType == 'user') { + return 1; + } + } + + // Sort functions after other result types. + var uf = (u.tokenType == 'function'); + var vf = (v.tokenType == 'function'); + if (uf != vf) { + return uf ? 1 : -1; + } + + return cmp(u, v); + }); + }, + + + /** + * Transform results from a wire format into a usable format in a standard + * way. + */ + transformDatasourceResults: function(fields) { + var closed = fields[9]; + var closed_ui; + if (closed) { + closed_ui = JX.$N( + 'div', + {className: 'tokenizer-closed'}, + closed); + } + + var icon = fields[8]; + var icon_ui; + if (icon) { + icon_ui = JX.Prefab._renderIcon(icon); + } + + var availability_ui; + var availability_color = fields[16]; + if (availability_color) { + availability_ui = JX.$N( + 'span', + { + className: 'phui-tag-dot phui-tag-color-' + availability_color + }); + } + + var display = JX.$N( + 'div', + {className: 'tokenizer-result'}, + [icon_ui, availability_ui, fields[4] || fields[0], closed_ui]); + if (closed) { + JX.DOM.alterClass(display, 'tokenizer-result-closed', true); + } + + return { + name: fields[0], + displayName: fields[4] || fields[0], + display: display, + uri: fields[1], + id: fields[2], + priority: fields[3], + priorityType: fields[7], + imageURI: fields[6], + icon: icon, + closed: closed, + type: fields[5], + sprite: fields[10], + color: fields[11], + tokenType: fields[12], + unique: fields[13] || false, + autocomplete: fields[14], + sort: JX.TypeaheadNormalizer.normalize(fields[0]), + availabilityColor: availability_color + }; + }, + + _renderIcon: function(icon) { + return JX.$N( + 'span', + {className: 'phui-icon-view phui-font-fa ' + icon}); } + } }); diff --git a/webroot/rsrc/js/core/ShapedRequest.js b/webroot/rsrc/js/core/ShapedRequest.js index 88d6921ea9..570c05bb9c 100644 --- a/webroot/rsrc/js/core/ShapedRequest.js +++ b/webroot/rsrc/js/core/ShapedRequest.js @@ -2,6 +2,7 @@ * @requires javelin-install * javelin-util * javelin-request + * javelin-router * @provides phabricator-shaped-request * @javelin */ @@ -63,7 +64,14 @@ JX.install('PhabricatorShapedRequest', { })); this._request.setData(data); this._request.setTimeout(this.getRequestTimeout()); - this._request.send(); + + var routable = this._request.getRoutable(); + + routable + .setType('draft') + .setPriority(750); + + JX.Router.getInstance().queue(routable); } else { this._defer = setTimeout( JX.bind(this, this.trigger), @@ -73,6 +81,10 @@ JX.install('PhabricatorShapedRequest', { }, shouldSendRequest : function(last, data) { + if (data === null) { + return false; + } + if (last === null) { return true; } diff --git a/webroot/rsrc/js/core/TextAreaUtils.js b/webroot/rsrc/js/core/TextAreaUtils.js index 9beac8b1d0..56f0789a46 100644 --- a/webroot/rsrc/js/core/TextAreaUtils.js +++ b/webroot/rsrc/js/core/TextAreaUtils.js @@ -1,5 +1,7 @@ /** * @requires javelin-install + * javelin-dom + * javelin-vector * @provides phabricator-textareautils * @javelin */ @@ -31,19 +33,109 @@ JX.install('TextAreaUtils', { setSelectionRange : function(area, start, end) { if ('setSelectionRange' in area) { + + // Chrome scrolls the textarea to the bottom as a side effect of + // calling focus(), so save the scroll position, focus, then restore + // the scroll position. + var scroll_top = area.scrollTop; area.focus(); + area.scrollTop = scroll_top; + area.setSelectionRange(start, end); } }, - setSelectionText : function(area, text) { + setSelectionText : function(area, text, select) { var v = area.value; var r = JX.TextAreaUtils.getSelectionRange(area); v = v.substring(0, r.start) + text + v.substring(r.end, v.length); area.value = v; - JX.TextAreaUtils.setSelectionRange(area, r.start, r.start + text.length); + var start = r.start; + var end = r.start + text.length; + + if (!select) { + start = end; + } + + JX.TextAreaUtils.setSelectionRange(area, start, end); + }, + + + /** + * Insert a reference to a given uploaded file into a textarea. + */ + insertFileReference: function(area, file) { + var ref = '{F' + file.getID() + '}'; + + // If we're inserting immediately after a "}" (usually, another file + // reference), put some newlines before our token so that multiple file + // uploads get laid out more nicely. + var range = JX.TextAreaUtils.getSelectionRange(area); + var before = area.value.substring(0, range.start); + if (before.match(/\}$/)) { + ref = '\n\n' + ref; + } + + JX.TextAreaUtils.setSelectionText(area, ref, false); + }, + + + /** + * Get the document pixel positions of the beginning and end of a character + * range in a textarea. + */ + getPixelDimensions: function(area, start, end) { + var v = area.value; + + // We're using zero-width spaces to make sure the spans get some + // height even if there's no text in the metrics tag. + + var head = v.substring(0, start); + var before = JX.$N('span', {}, '\u200b'); + var body = v.substring(start, end); + var after = JX.$N('span', {}, '\u200b'); + + // Create a similar shadow element which we can measure. + var metrics = JX.$N( + 'var', + { + className: area.className, + }, + [head, before, body, after]); + + // If the textarea has a scrollbar, force a scrollbar on the shadow + // element too. + if (area.scrollHeight > area.clientHeight) { + metrics.style.overflowY = 'scroll'; + } + + area.parentNode.appendChild(metrics); + + // Adjust the positions we read out of the document to account for the + // current scroll position of the textarea. + var metrics_pos = JX.Vector.getPos(metrics); + metrics_pos.x += area.scrollLeft; + metrics_pos.y += area.scrollTop; + + var area_pos = JX.Vector.getPos(area); + var before_pos = JX.Vector.getPos(before); + var after_pos = JX.Vector.getPos(after); + + JX.DOM.remove(metrics); + + return { + start: { + x: area_pos.x + (before_pos.x - metrics_pos.x), + y: area_pos.y + (before_pos.y - metrics_pos.y) + }, + end: { + x: area_pos.x + (after_pos.x - metrics_pos.x), + y: area_pos.y + (after_pos.y - metrics_pos.y) + } + }; } + } }); diff --git a/webroot/rsrc/js/core/Title.js b/webroot/rsrc/js/core/Title.js new file mode 100644 index 0000000000..f99f948e39 --- /dev/null +++ b/webroot/rsrc/js/core/Title.js @@ -0,0 +1,49 @@ +/** + * @provides phabricator-title + * @requires javelin-install + */ + +/** + * Update the document title to show a notification/message count. + */ +JX.install('Title', { + statics: { + _counts: {}, + _title: null, + + setCount: function(k, v) { + var self = JX.Title; + self._counts[k] = v; + self._update(); + }, + + setTitle: function(title) { + var self = JX.Title; + self._title = title; + self._update(); + }, + + _update: function() { + var self = JX.Title; + + if (self._title === null) { + self._title = document.title; + } + + var sum = 0; + for (var k in self._counts) { + sum += parseInt(self._counts[k], 10) || 0; + } + + var title; + if (sum) { + title = '(' + sum + ') ' + self._title; + } else { + title = self._title; + } + + document.title = title; + + } + } +}); diff --git a/webroot/rsrc/js/core/ToolTip.js b/webroot/rsrc/js/core/ToolTip.js index 399c937d63..635c9466ad 100644 --- a/webroot/rsrc/js/core/ToolTip.js +++ b/webroot/rsrc/js/core/ToolTip.js @@ -9,10 +9,22 @@ JX.install('Tooltip', { - statics : { - _node : null, + statics: { + _node: null, + _last: null, + _lock: 0, show : function(root, scale, align, content) { + var self = JX.Tooltip; + + if (self._lock) { + return; + } + + if (content === null) { + return; + } + if (__DEV__) { switch (align) { case 'N': @@ -22,61 +34,209 @@ JX.install('Tooltip', { break; default: JX.$E( - "Only alignments 'N' (north), 'E' (east), 'S' (south), " + - "and 'W' (west) are supported." + 'Only alignments "N" (north), "E" (east), "S" (south), ' + + 'and "W" (west) are supported.' ); break; } } - var node = JX.$N( + var node_inner = JX.$N( 'div', - { className: 'jx-tooltip-container jx-tooltip-align-' + align }, + { className: 'jx-tooltip-inner' }, [ JX.$N('div', { className: 'jx-tooltip' }, content), JX.$N('div', { className: 'jx-tooltip-anchor' }) ]); - node.style.maxWidth = scale + 'px'; + var node = JX.$N( + 'div', + { className: 'jx-tooltip-container' }, + node_inner); + + if (scale == 'auto') { + node.style.maxWidth = ''; + } else { + node.style.maxWidth = scale + 'px'; + } JX.Tooltip.hide(); - this._node = node; + self._node = node; // Append the tip to the document, but offscreen, so we can measure it. node.style.left = '-10000px'; document.body.appendChild(node); + // Jump through some hoops trying to auto-position the tooltip + var pos = self._getSmartPosition(align, root, node); + pos.setPos(node); + + // Animate the tip if we haven't shown any tips recently. If we are + // already showing a tip (or hid one very recently) just show the tip + // immediately. This makes hunting for a particular item by mousing + // through tips smoother: you only have to sit through the animation + // once, at the beginning. + + var is_recent = false; + + var last_tip = self._last; + if (last_tip) { + // If we recently hid a tip, compute how many milliseconds ago we + // hid it. + var last_tip_age = (new Date().getTime() - self._last); + if (last_tip_age < 500) { + is_recent = true; + } + } + + if (!is_recent) { + JX.DOM.alterClass(node, 'jx-tooltip-appear', true); + } + }, + + _getSmartPosition: function (align, root, node) { + var self = JX.Tooltip; + + // Figure out how to position the tooltip on screen. We will try the + // configured aligment first. + var try_alignments = [align]; + + // If the configured alignment does not fit, we'll try the opposite + // alignment. + var opposites = { + N: 'S', + S: 'N', + E: 'W', + W: 'E' + }; + try_alignments.push(opposites[align]); + + // Then we'll try the other alignments, in arbitrary order. + for (var k in opposites) { + try_alignments.push(k); + } + + var use_alignment = null; + var use_pos = null; + for (var ii = 0; ii < try_alignments.length; ii++) { + var try_alignment = try_alignments[ii]; + + var pos = self._proposePosition(try_alignment, root, node); + if (self.isOnScreen(pos, node)) { + use_alignment = try_alignment; + use_pos = pos; + break; + } + } + + // If we don't come up with a good answer, default to the configured + // alignment. + if (use_alignment === null) { + use_alignment = align; + use_pos = self._proposePosition(use_alignment, root, node); + } + + self._setAnchor(use_alignment); + + return pos; + }, + + _proposePosition: function (align, root, node) { var p = JX.$V(root); var d = JX.Vector.getDim(root); var n = JX.Vector.getDim(node); + var l = 0; + var t = 0; - // Move the tip so it's nicely aligned. - + // Caculate the tip so it's nicely aligned. switch (align) { case 'N': - node.style.left = parseInt(p.x - ((n.x - d.x) / 2), 10) + 'px'; - node.style.top = parseInt(p.y - n.y, 10) + 'px'; + l = parseInt(p.x - ((n.x - d.x) / 2), 10); + t = parseInt(p.y - n.y, 10); break; case 'E': - node.style.left = parseInt(p.x + d.x, 10) + 'px'; - node.style.top = parseInt(p.y - ((n.y - d.y) / 2), 10) + 'px'; + l = parseInt(p.x + d.x, 10); + t = parseInt(p.y - ((n.y - d.y) / 2), 10); break; case 'S': - node.style.left = parseInt(p.x - ((n.x - d.x) / 2), 10) + 'px'; - node.style.top = parseInt(p.y + d.y + 5, 10) + 'px'; + l = parseInt(p.x - ((n.x - d.x) / 2), 10); + t = parseInt(p.y + d.y + 5, 10); break; case 'W': - node.style.left = parseInt(p.x - n.x - 5, 10) + 'px'; - node.style.top = parseInt(p.y - ((n.y - d.y) / 2), 10) + 'px'; + l = parseInt(p.x - n.x - 5, 10); + t = parseInt(p.y - ((n.y - d.y) / 2), 10); break; } + + return new JX.Vector(l, t); + }, + + isOnScreen: function (a, node) { + var view = this._getViewBoundaries(); + var corners = this._getNodeCornerPositions(a, node); + + // Check if any of the corners are offscreen. + for (var i = 0; i < corners.length; i++) { + var corner = corners[i]; + if (corner.x < view.w || + corner.y < view.n || + corner.x > view.e || + corner.y > view.s) { + return false; + } + } + return true; + }, + + _getNodeCornerPositions: function(pos, node) { + // Get positions of all four corners of a node. + var n = JX.Vector.getDim(node); + return [new JX.Vector(pos.x, pos.y), + new JX.Vector(pos.x + n.x, pos.y), + new JX.Vector(pos.x, pos.y + n.y), + new JX.Vector(pos.x + n.x, pos.y + n.y)]; + }, + + _getViewBoundaries: function() { + var s = JX.Vector.getScroll(); + var v = JX.Vector.getViewport(); + var max_x = s.x + v.x; + var max_y = s.y + v.y; + + // Even if the corner is technically on the screen, don't allow the + // tip to display too close to the edge of the screen. + var margin = 16; + + return { + w: s.x + margin, + e: max_x - margin, + n: s.y + margin, + s: max_y - margin + }; + }, + + _setAnchor: function (align) { + // Orient the little tail + JX.DOM.alterClass(this._node, 'jx-tooltip-align-' + align, true); }, hide : function() { if (this._node) { JX.DOM.remove(this._node); this._node = null; + this._last = new Date().getTime(); } + }, + + lock: function() { + var self = JX.Tooltip; + self.hide(); + self._lock++; + }, + + unlock: function() { + var self = JX.Tooltip; + self._lock--; } } }); diff --git a/webroot/rsrc/js/core/behavior-active-nav.js b/webroot/rsrc/js/core/behavior-active-nav.js deleted file mode 100644 index c0bc40b2a9..0000000000 --- a/webroot/rsrc/js/core/behavior-active-nav.js +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @provides javelin-behavior-phabricator-active-nav - * @requires javelin-behavior - * javelin-stratcom - * javelin-vector - * javelin-dom - * javelin-uri - */ - -JX.behavior('phabricator-active-nav', function(config) { - - var local = JX.$(config.localID); - - /** - * Select the navigation item corresponding to a given anchor. - */ - var selectnav = function(anchor) { - var links = JX.DOM.scry(local, 'a'); - var link; - var link_anchor; - var selected; - for (var ii = 0; ii < links.length; ii++) { - link = links[ii]; - link_anchor = JX.$U(link.href).getFragment(); - - selected = (link_anchor == anchor); - JX.DOM.alterClass( - link, - 'phabricator-active-nav-focus', - selected); - } - }; - - - /** - * Identify the current anchor based on the document scroll position. - */ - var updateposition = function() { - // Find all the markers in the document. - var scroll_position = JX.Vector.getScroll().y; - var document_size = JX.Vector.getDocument(); - var viewport_size = JX.Vector.getViewport(); - - // If we're scrolled all the way down, we always want to select the last - // anchor. - var is_at_bottom = (viewport_size.y + scroll_position >= document_size.y); - - var markers = JX.DOM.scry(document.body, 'legend', 'marker'); - - // Sort the markers by Y position, descending. - var markinfo = []; - var ii; - for (ii = 0; ii < markers.length; ii++) { - markinfo.push({ - marker: markers[ii], - position: JX.$V(markers[ii]).y - 15 - }); - } - markinfo.sort(function(u, v) { return (v.position - u.position); }); - - // Find the first marker above the current scroll position, or the first - // marker in the document if we're above all the markers. - var active = null; - for (ii = 0; ii < markinfo.length; ii++) { - active = markinfo[ii].marker; - if (markinfo[ii].position <= scroll_position) { - break; - } - if (is_at_bottom) { - break; - } - } - - // If we get above the first marker, select it. - selectnav(active && JX.Stratcom.getData(active).anchor); - }; - - var pending = null; - var onviewportchange = function(e) { - pending && clearTimeout(pending); - pending = setTimeout(updateposition, 100); - }; - - JX.Stratcom.listen('scroll', null, onviewportchange); - JX.Stratcom.listen('resize', null, onviewportchange); - JX.Stratcom.listen('hashchange', null, onviewportchange); -}); diff --git a/webroot/rsrc/js/core/behavior-audio-source.js b/webroot/rsrc/js/core/behavior-audio-source.js new file mode 100644 index 0000000000..deb68bcfc5 --- /dev/null +++ b/webroot/rsrc/js/core/behavior-audio-source.js @@ -0,0 +1,113 @@ +/** + * @provides javelin-behavior-audio-source + * @requires javelin-behavior + * javelin-stratcom + * javelin-vector + * javelin-dom + * @javelin + */ + +/** + * Allows an element to behave as an audio source. It plays a sound either + * when the user scrolls it into view, or loops a sound which gets louder and + * louder as the user gets closer. + */ +JX.behavior('audio-source', function(config, statics) { + if (!window.Audio) { + return; + } + + var audio = new Audio(); + audio.setAttribute('src', config.audioURI); + + if (config.loop) { + audio.setAttribute('loop', true); + } + + audio.load(); + + config.audio = audio; + + statics.items = statics.items || []; + statics.items.push(config); + + if (statics.initialized) { + return; + } + statics.initialized = true; + + var onupdate = function() { + timeout = null; + + var scroll = JX.Vector.getScroll(); + var view = JX.Vector.getViewport(); + var view_mid = scroll.y + (view.y / 2); + + for (var ii = 0; ii < statics.items.length; ii++) { + var item = statics.items[ii]; + if (!item.element) { + try { + item.element = JX.$(item.sourceID); + } catch (ignored) { + continue; + } + } + + var pos = JX.Vector.getPos(statics.items[ii].element); + var dim = JX.Vector.getDim(statics.items[ii].element); + + var item_mid = pos.y + (dim.y / 2); + var item_distance = Math.abs(item_mid - view_mid); + + // item_distance is the number of pixels between the vertical middle + // of the macro and the vertical middle of the viewport. We divide it + // by the viewport height to get the "number of viewports" away from + // the middle we are, then map that to [0, 1], where 0 means that the + // image is far away from the viewport and 1 means the image is pretty + // much in the middle of the viewport. + + var near = 1.25 - ((item_distance / view.y) * 1.25); + near = Math.max(0, near); + near = Math.min(1, near); + + if (near === 0) { + if (item.playing) { + item.audio.pause(); + item.playing = false; + + // If this isn't an ambient/looping sound, it only gets to fire + // once. Even if it didn't finish, throw it out. + if (!item.loop) { + statics.items.splice(ii, 1); + ii--; + } + } + continue; + } else { + if (!item.playing) { + if (!item.loop && near < 1) { + // Don't start playing one-shot items until they're solidly on + // screen. + continue; + } + item.audio.volume = near; + item.playing = true; + item.audio.play(); + } else { + item.audio.volume = near; + } + } + } + + }; + + var timeout; + var onadjust = function() { + timeout && clearTimeout(timeout); + timeout = setTimeout(onupdate, 200); + }; + + JX.Stratcom.listen(['scroll', 'resize'], null, onadjust); + onadjust(); + +}); diff --git a/webroot/rsrc/js/core/behavior-badge-view.js b/webroot/rsrc/js/core/behavior-badge-view.js new file mode 100644 index 0000000000..92c7623e9f --- /dev/null +++ b/webroot/rsrc/js/core/behavior-badge-view.js @@ -0,0 +1,41 @@ +/** + * @provides javelin-behavior-badge-view + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + */ + +/** + * Toggle CSS classes when an element is clicked. This behavior is activated + * by adding the sigil `jx-badge-view` to an element, and a key `map` to its + * data. The `map` should be a map from element IDs to the classes that should + * be toggled on them. + * + * Optionally, you may provide a `state` key to set the default state of the + * element. + */ +JX.behavior('badge-view', function(config, statics) { + function install() { + JX.Stratcom.listen( + ['click'], + 'jx-badge-view', + function(e) { + if (e.getNode('tag:a')) { + // If the event has a 'tag:a' node on it, that means the user + // either clicked a link or some other node inside a link. + return; + } + + var t = e.getNodeData('jx-badge-view'); + t.state = !t.state; + for (var k in t.map) { + JX.DOM.alterClass(JX.$(k), t.map[k], t.state); + } + e.kill(); + }); + + return true; + } + + statics.install = statics.install || install(); +}); diff --git a/webroot/rsrc/js/core/behavior-bulk-editor.js b/webroot/rsrc/js/core/behavior-bulk-editor.js new file mode 100644 index 0000000000..79e1c2714e --- /dev/null +++ b/webroot/rsrc/js/core/behavior-bulk-editor.js @@ -0,0 +1,110 @@ +/** + * @provides javelin-behavior-bulk-editor + * @requires javelin-behavior + * javelin-dom + * javelin-util + * multirow-row-manager + * javelin-json + * phuix-form-control-view + */ + +JX.behavior('bulk-editor', function(config) { + + var root = JX.$(config.rootNodeID); + var editor_table = JX.DOM.find(root, 'table', 'bulk-actions'); + + var manager = new JX.MultirowRowManager(editor_table); + var action_rows = []; + + var option_map = {}; + var option_order = []; + var spec_map = {}; + + for (var ii = 0; ii < config.edits.length; ii++) { + var edit = config.edits[ii]; + + option_map[edit.xaction] = edit.label; + option_order.push(edit.xaction); + + spec_map[edit.xaction] = edit; + } + + function renderRow() { + var action_select = new JX.PHUIXFormControl() + .setControl('optgroups', config.optgroups) + .getRawInputNode(); + + var cell = JX.$N('td', {className: 'bulk-edit-input'}); + var vfunc = null; + + function update() { + var spec = spec_map[action_select.value]; + var control = spec.control; + + var phuix = new JX.PHUIXFormControl() + .setControl(control.type, control.spec); + + JX.DOM.setContent(cell, phuix.getRawInputNode()); + + vfunc = JX.bind(phuix, phuix.getValue); + } + + JX.DOM.listen(action_select, 'change', null, update); + update(); + + return { + nodes : [JX.$N('td', {}, action_select), cell], + dataCallback : function() { + return { + type: action_select.value, + value: vfunc() + }; + } + }; + } + + function onaddaction(e) { + e.kill(); + addRow({}); + } + + function addRow(info) { + var data = renderRow(info); + var row = manager.addRow(data.nodes); + var id = manager.getRowID(row); + + action_rows[id] = data.dataCallback; + } + + function onsubmit() { + var input = JX.$(config.inputNodeID); + + var actions = []; + for (var k in action_rows) { + actions.push(action_rows[k]()); + } + + input.value = JX.JSON.stringify(actions); + } + + addRow({}); + + JX.DOM.listen( + root, + 'click', + 'add-action', + onaddaction); + + JX.DOM.listen( + root, + 'submit', + null, + onsubmit); + + manager.listen( + 'row-removed', + function(row_id) { + delete action_rows[row_id]; + }); + +}); diff --git a/webroot/rsrc/js/core/behavior-choose-control.js b/webroot/rsrc/js/core/behavior-choose-control.js new file mode 100644 index 0000000000..68fbbbc8e0 --- /dev/null +++ b/webroot/rsrc/js/core/behavior-choose-control.js @@ -0,0 +1,36 @@ +/** + * @provides javelin-behavior-choose-control + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + * javelin-workflow + */ + +JX.behavior('choose-control', function() { + + JX.Stratcom.listen( + 'click', + 'phui-form-iconset-button', + function(e) { + e.kill(); + + var data = e.getNodeData('phui-form-iconset'); + var input = JX.$(data.inputID); + + if (input.disabled) { + return; + } + + var params = { + icon: input.value + }; + + new JX.Workflow(data.uri, params) + .setHandler(function(r) { + input.value = r.value; + JX.DOM.setContent(JX.$(data.displayID), JX.$H(r.display)); + }) + .start(); + }); + +}); diff --git a/webroot/rsrc/js/core/behavior-copy.js b/webroot/rsrc/js/core/behavior-copy.js new file mode 100644 index 0000000000..4457f6e022 --- /dev/null +++ b/webroot/rsrc/js/core/behavior-copy.js @@ -0,0 +1,43 @@ +/** + * @provides javelin-behavior-phabricator-clipboard-copy + * @requires javelin-behavior + * javelin-dom + * javelin-stratcom + * @javelin + */ + +JX.behavior('phabricator-clipboard-copy', function() { + + if (!document.queryCommandSupported) { + return; + } + + if (!document.queryCommandSupported('copy')) { + return; + } + + JX.DOM.alterClass(document.body, 'supports-clipboard', true); + + JX.Stratcom.listen('click', 'clipboard-copy', function(e) { + e.kill(); + + var data = e.getNodeData('clipboard-copy'); + var attr = { + value: data.text || '', + className: 'clipboard-buffer' + }; + + var node = JX.$N('textarea', attr); + document.body.appendChild(node); + + try { + node.select(); + document.execCommand('copy'); + } catch (ignored) { + // Ignore any errors we hit. + } + + JX.DOM.remove(node); + }); + +}); diff --git a/webroot/rsrc/js/core/behavior-crop.js b/webroot/rsrc/js/core/behavior-crop.js deleted file mode 100644 index 965e3336f2..0000000000 --- a/webroot/rsrc/js/core/behavior-crop.js +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @provides javelin-behavior-aphront-crop - * @requires javelin-behavior - * javelin-dom - * javelin-vector - * javelin-magical-init - */ - - JX.behavior('aphront-crop', function(config) { - - var dragging = false; - var startX, startY; - var finalX, finalY; - var dScale = config.scale; - - var cropBox = JX.$(config.cropBoxID); - var basePos = JX.$V(cropBox); - cropBox.style.height = config.height + 'px'; - cropBox.style.width = config.width + 'px'; - var baseD = JX.$V(config.width, config.height); - - var image = JX.DOM.find(cropBox, 'img', 'crop-image'); - image.style.height = (config.imageH * config.scale) + 'px'; - image.style.width = (config.imageW * config.scale) + 'px'; - var imageD = JX.$V( - config.imageW * config.scale, - config.imageH * config.scale - ); - var minLeft = baseD.x - imageD.x; - var minTop = baseD.y - imageD.y; - - var minScale = Math.min( - config.width / config.imageW, - config.height / config.imageH, - 1 - ); - var maxScale = Math.max( - config.imageW / config.width, - config.imageH / config.height, - 2 - ); - - var ondrag = function(e) { - e.kill(); - dragging = true; - var p = JX.$V(e); - startX = p.x; - startY = p.y; - }; - - var onmove = function(e) { - if (!dragging) { - return; - } - e.kill(); - - var p = JX.$V(e); - var dx = startX - p.x; - var dy = startY - p.y; - var imagePos = JX.$V(image); - var moveLeft = imagePos.x - basePos.x - dx; - var moveTop = imagePos.y - basePos.y - dy; - - image.style.left = Math.min(Math.max(minLeft, moveLeft), 0) + 'px'; - image.style.top = Math.min(Math.max(minTop, moveTop), 0) + 'px'; - - // reset these; a new beginning! - startX = p.x; - startY = p.y; - - // save off where we are right now - imagePos = JX.$V(image); - finalX = Math.abs(imagePos.x - basePos.x); - finalY = Math.abs(imagePos.y - basePos.y); - JX.DOM.find(cropBox, 'input', 'crop-x').value = finalX; - JX.DOM.find(cropBox, 'input', 'crop-y').value = finalY; - }; - - var ondrop = function(e) { - if (!dragging) { - return; - } - dragging = false; - }; - - // NOTE: Javelin does not dispatch mousemove by default. - JX.enableDispatch(cropBox, 'mousemove'); - - JX.DOM.listen(cropBox, 'mousedown', [], ondrag); - JX.DOM.listen(cropBox, 'mousemove', [], onmove); - JX.DOM.listen(cropBox, 'mouseup', [], ondrop); - JX.DOM.listen(cropBox, 'mouseout', [], ondrop); - -}); diff --git a/webroot/rsrc/js/core/behavior-dark-console.js b/webroot/rsrc/js/core/behavior-dark-console.js deleted file mode 100644 index 02c61d0d61..0000000000 --- a/webroot/rsrc/js/core/behavior-dark-console.js +++ /dev/null @@ -1,251 +0,0 @@ -/** - * @provides javelin-behavior-dark-console - * @requires javelin-behavior - * javelin-stratcom - * javelin-util - * javelin-dom - * javelin-request - * phabricator-keyboard-shortcut - */ - -JX.behavior('dark-console', function(config, statics) { - var root = statics.root || setup_console(); - - config.key = config.key || root.getAttribute('data-console-key'); - - if (!('color' in config)) { - config.color = root.getAttribute('data-console-color'); - } - - add_request(config); - - // Do first-time setup. - function setup_console() { - statics.root = JX.$('darkconsole'); - statics.req = {all: {}, current: null}; - statics.tab = {all: {}, current: null}; - - statics.el = {}; - - statics.el.reqs = JX.$N('div', {className: 'dark-console-requests'}); - statics.root.appendChild(statics.el.reqs); - - statics.el.tabs = JX.$N('div', {className: 'dark-console-tabs'}); - statics.root.appendChild(statics.el.tabs); - - statics.el.panel = JX.$N('div', {className: 'dark-console-panel'}); - statics.root.appendChild(statics.el.panel); - - statics.el.load = JX.$N('div', {className: 'dark-console-load'}); - statics.root.appendChild(statics.el.load); - - statics.cache = {}; - - statics.visible = config.visible; - statics.selected = config.selected; - - install_shortcut(); - - if (config.headers) { - // If the main page had profiling enabled, also enable it for any Ajax - // requests. - JX.Request.listen('open', function(r) { - for (var k in config.headers) { - r.getTransport().setRequestHeader(k, config.headers[k]); - } - }); - } - - return statics.root; - } - - - // Add a new request to the console (initial page load, or new Ajax response). - function add_request(config) { - - // Ignore DarkConsole data requests. - if (config.uri.match(new RegExp('^/~/data/'))) { - return; - } - - var attr = { - className: 'dark-console-request', - sigil: 'dark-console-request', - title: config.uri, - meta: config, - href: '#' - }; - - var link = JX.$N('a', attr, [get_bullet(config.color), ' ', config.uri]); - statics.el.reqs.appendChild(link); - statics.req.all[config.key] = link; - - if (!statics.req.current) { - select_request(config.key); - } - } - - - function get_bullet(color) { - if (!color) { - return null; - } - return JX.$N('span', {style: {color: color}}, "\u2022"); - } - - - // Select a request (on load, or when the user clicks one). - function select_request(key) { - var req = statics.req; - - if (req.current) { - JX.DOM.alterClass(req.all[req.current], 'dark-selected', false); - } - statics.req.current = key; - JX.DOM.alterClass(req.all[req.current], 'dark-selected', true); - - if (statics.visible) { - draw_request(key); - } - } - - // When the user clicks a request, select it. - JX.Stratcom.listen('click', 'dark-console-request', function(e) { - e.kill(); - select_request(e.getNodeData('dark-console-request').key); - }); - - - // After the user selects a request, draw its tabs. - function draw_request(key) { - var cache = statics.cache; - - if (cache[key]) { - render_request(key); - return; - } - - new JX.Request( - '/~/data/' + key + '/', - function(r) { - cache[key] = r; - if (statics.req.current == key) { - render_request(key); - } - }) - .send(); - - show_loading(); - } - - // Show the loading indicator. - function show_loading() { - JX.DOM.hide(statics.el.tabs); - JX.DOM.hide(statics.el.panel); - JX.DOM.show(statics.el.load); - } - - // Hide the loading indicator. - function hide_loading() { - JX.DOM.show(statics.el.tabs); - JX.DOM.show(statics.el.panel); - JX.DOM.hide(statics.el.load); - } - - function render_request(key) { - var data = statics.cache[key]; - - statics.tab.all = {}; - - var links = []; - var first = null; - for (var ii = 0; ii < data.tabs.length; ii++) { - var tab = data.tabs[ii]; - var attr = { - className: 'dark-console-tab', - sigil: 'dark-console-tab', - meta: tab, - href: '#' - }; - - var link = JX.$N('a', attr, [get_bullet(tab.color), ' ', tab.name]); - links.push(link); - statics.tab.all[tab['class']] = link; - first = first || tab['class']; - } - - JX.DOM.setContent(statics.el.tabs, links); - - if (statics.tab.current in statics.tab.all) { - select_tab(statics.tab.current); - } else if (statics.selected in statics.tab.all) { - select_tab(statics.selected); - } else { - select_tab(first); - } - - hide_loading(); - } - - function select_tab(tclass) { - var tabs = statics.tab; - - if (tabs.current) { - JX.DOM.alterClass(tabs.current, 'dark-selected', false); - } - tabs.current = tabs.all[tclass]; - JX.DOM.alterClass(tabs.current, 'dark-selected', true); - - if (tclass != statics.selected) { - // Save user preference. - new JX.Request('/~/', JX.bag) - .setData({ tab : tclass }) - .send(); - statics.selected = tclass; - } - - draw_panel(); - } - - // When the user clicks a tab, select it. - JX.Stratcom.listen('click', 'dark-console-tab', function(e) { - e.kill(); - select_tab(e.getNodeData('dark-console-tab')['class']); - }); - - function draw_panel() { - var data = statics.cache[statics.req.current]; - var tclass = JX.Stratcom.getData(statics.tab.current)['class']; - var html = data.panel[tclass]; - - var div = JX.$N('div', {className: 'dark-console-panel-core'}, JX.$H(html)); - JX.DOM.setContent(statics.el.panel, div); - } - - function install_shortcut() { - var desc = 'Toggle visibility of DarkConsole.'; - new JX.KeyboardShortcut('`', desc) - .setHandler(function(manager) { - statics.visible = !statics.visible; - - if (statics.visible) { - JX.DOM.show(root); - if (statics.req.current) { - draw_request(statics.req.current); - } - } else { - JX.DOM.hide(root); - } - - // Save user preference. - new JX.Request('/~/', JX.bag) - .setData({visible: statics.visible ? 1 : 0}) - .send(); - - // Force resize listeners to take effect. - JX.Stratcom.invoke('resize'); - }) - .register(); - } - -}); diff --git a/webroot/rsrc/js/core/behavior-detect-timezone.js b/webroot/rsrc/js/core/behavior-detect-timezone.js new file mode 100644 index 0000000000..29c565b9f4 --- /dev/null +++ b/webroot/rsrc/js/core/behavior-detect-timezone.js @@ -0,0 +1,65 @@ +/** + * @provides javelin-behavior-detect-timezone + * @requires javelin-behavior + * javelin-uri + * phabricator-notification + */ + +JX.behavior('detect-timezone', function(config) { + + var offset = new Date().getTimezoneOffset(); + var ignore = config.ignore; + + if (ignore !== null) { + // If we're ignoring a client offset and it's the current offset, just + // bail. This means the user has chosen to ignore the clock difference + // between the current client setting and their server setting. + if (offset == ignore) { + return; + } + + // If we're ignoring a client offset but the current offset is different, + // wipe the offset. If you go from SF to NY, ignore the difference, return + // to SF, then travel back to NY a few months later, we want to prompt you + // again. This code will clear the ignored setting upon your return to SF. + new JX.Request('/settings/adjust/', JX.bag) + .setData({key: config.ignoreKey, value: ''}) + .send(); + + ignore = null; + } + + // If the client and server clocks are in sync, we're all set. + if (offset == config.offset) { + return; + } + + var notification = new JX.Notification() + .alterClassName('jx-notification-alert', true) + .setContent(config.message) + .setDuration(0); + + notification.listen('activate', function() { + JX.Stratcom.context().kill(); + notification.hide(); + + var uri = config.uri + offset + '/'; + + // Some browsers (notably, Chrome) expose an "Intl" API which gives us + // direct access to a timezone setting. If we are able to read this, use + // it to guess which timezone the user is in so we can prefill the + // dropdown. + try { + var guess = Intl.DateTimeFormat().resolvedOptions().timeZone; + uri = JX.$U(uri).setQueryParam('guess', guess); + } catch (error) { + // Ignore any errors here, we'll just make the user pick from the big + // list. + } + + new JX.Workflow(uri) + .start(); + }); + + notification.show(); +}); diff --git a/webroot/rsrc/js/core/behavior-device.js b/webroot/rsrc/js/core/behavior-device.js index df6d9c6cd5..9e294b0663 100644 --- a/webroot/rsrc/js/core/behavior-device.js +++ b/webroot/rsrc/js/core/behavior-device.js @@ -10,15 +10,40 @@ JX.install('Device', { statics : { _device : null, + _tabletBreakpoint: 920, + + setTabletBreakpoint: function(width) { + var self = JX.Device; + self._tabletBreakpoint = width; + self.recalculate(); + }, + + getTabletBreakpoint: function() { + return JX.Device._tabletBreakpoint; + }, + recalculate: function() { var v = JX.Vector.getViewport(); var self = JX.Device; + // Even when we emit a '' tag which tells + // devices to fit the content to the screen width, we'll sometimes measure + // a viewport dimension which is larger than the available screen width, + // particularly if we check too early. + + // If the device provides a screen width and the screen width is smaller + // than the viewport width, use the screen width. + + var screen_width = (window.screen && window.screen.availWidth); + if (screen_width) { + v.x = Math.min(v.x, screen_width); + } + var device = 'desktop'; - if (v.x <= 768) { + if (v.x <= self._tabletBreakpoint) { device = 'tablet'; } - if (v.x <= 480) { + if (v.x <= 512) { device = 'phone'; } @@ -37,6 +62,11 @@ JX.install('Device', { JX.Stratcom.invoke('phabricator-device-change', null, device); }, + isDesktop: function() { + var self = JX.Device; + return (self.getDevice() == 'desktop'); + }, + getDevice : function() { var self = JX.Device; if (self._device === null) { diff --git a/webroot/rsrc/js/core/behavior-drag-and-drop-textarea.js b/webroot/rsrc/js/core/behavior-drag-and-drop-textarea.js index 352c617a96..8cf14349b0 100644 --- a/webroot/rsrc/js/core/behavior-drag-and-drop-textarea.js +++ b/webroot/rsrc/js/core/behavior-drag-and-drop-textarea.js @@ -2,6 +2,7 @@ * @provides javelin-behavior-aphront-drag-and-drop-textarea * @requires javelin-behavior * javelin-dom + * javelin-json * phabricator-drag-and-drop-file-upload * phabricator-textareautils */ @@ -10,33 +11,49 @@ JX.behavior('aphront-drag-and-drop-textarea', function(config) { var target = JX.$(config.target); - function onupload(f) { - var text = JX.TextAreaUtils.getSelectionText(target); - var ref = '{F' + f.getID() + '}'; + var metadata_node = JX.$(config.remarkupMetadataID); + var metadata_value = config.remarkupMetadataValue; - // If the user has dragged and dropped multiple files, we'll get an event - // each time an upload completes. Rather than overwriting the first - // reference, append the new reference if the selected text looks like an - // existing file reference. - if (text.match(/^\{F/)) { - ref = text + "\n\n" + ref; + function set_metadata(key, value) { + metadata_value[key] = value; + write_metadata(); + } + + function get_metadata(key, default_value) { + if (metadata_value.hasOwnProperty(key)) { + return metadata_value[key]; } + return default_value; + } - JX.TextAreaUtils.setSelectionText(target, ref); + function write_metadata() { + metadata_node.value = JX.JSON.stringify(metadata_value); } + write_metadata(); + if (JX.PhabricatorDragAndDropFileUpload.isSupported()) { var drop = new JX.PhabricatorDragAndDropFileUpload(target) - .setURI(config.uri); - drop.listen('didBeginDrag', function(e) { + .setURI(config.uri) + .setChunkThreshold(config.chunkThreshold); + + drop.listen('didBeginDrag', function() { JX.DOM.alterClass(target, config.activatedClass, true); }); - drop.listen('didEndDrag', function(e) { + + drop.listen('didEndDrag', function() { JX.DOM.alterClass(target, config.activatedClass, false); }); - drop.listen('didUpload', onupload); + + drop.listen('didUpload', function(file) { + JX.TextAreaUtils.insertFileReference(target, file); + + var phids = get_metadata('attachedFilePHIDs', []); + phids.push(file.getPHID()); + set_metadata('attachedFilePHIDs', phids); + }); + drop.start(); } }); - diff --git a/webroot/rsrc/js/core/behavior-error-log.js b/webroot/rsrc/js/core/behavior-error-log.js deleted file mode 100644 index e8d6b0136f..0000000000 --- a/webroot/rsrc/js/core/behavior-error-log.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @provides javelin-behavior-error-log - * @requires javelin-dom - */ - -var current_details = null; - -function show_details(row) { - var node = JX.$('row-details-' + row); - - if (current_details !== null) { - JX.$('row-details-' + current_details).style.display = 'none'; - } - - node.style.display = 'block'; - current_details = row; -} diff --git a/webroot/rsrc/js/core/behavior-fancy-datepicker.js b/webroot/rsrc/js/core/behavior-fancy-datepicker.js index 31cf56ab70..8059e214fe 100644 --- a/webroot/rsrc/js/core/behavior-fancy-datepicker.js +++ b/webroot/rsrc/js/core/behavior-fancy-datepicker.js @@ -7,16 +7,56 @@ * javelin-vector */ -JX.behavior('fancy-datepicker', function(config) { +JX.behavior('fancy-datepicker', function(config, statics) { + if (statics.initialized) { + return; + } + statics.initialized = true; var picker; - var button; + var anchor_node; var root; var value_y; var value_m; var value_d; + var get_format_separator = function() { + var format = get_format(); + switch (format.toLowerCase()) { + case 'n/j/y': + return '/'; + default: + return '-'; + } + }; + + var get_key_maps = function() { + var format = get_format(); + var regex = new RegExp('[./ -]'); + return format.split(regex); + }; + + var get_format = function() { + var format = config.format; + + if (format === null) { + format = 'Y-m-d'; + } + + return format; + }; + + var get_week_start = function() { + var week_start = config.weekStart; + + if (week_start === null) { + week_start = 0; + } + + return week_start; + }; + var onopen = function(e) { e.kill(); @@ -40,19 +80,23 @@ JX.behavior('fancy-datepicker', function(config) { picker = JX.$N( 'div', - {className: 'fancy-datepicker', sigil: 'phabricator-datepicker'}, - JX.$N('div', {className: 'fancy-datepicker-core'})); + { + className: 'fancy-datepicker', + sigil: 'phabricator-datepicker' + }, + JX.$N( + 'div', + { + className: 'fancy-datepicker-core', + sigil: 'fancy-datepicker-core' + })); document.body.appendChild(picker); - var button = e.getNode('calendar-button'); - var p = JX.$V(button); - var d = JX.Vector.getDim(picker); - - picker.style.left = (p.x - d.x + 2) + 'px'; - picker.style.top = (p.y - 10) + 'px'; - + anchor_node = e.getNode('calendar-button'); JX.DOM.alterClass(root, 'picker-open', true); + JX.Mask.show('jx-date-mask'); + read_date(); render(); }; @@ -62,10 +106,14 @@ JX.behavior('fancy-datepicker', function(config) { return; } + JX.Mask.hide('jx-date-mask'); + JX.DOM.remove(picker); picker = null; JX.DOM.alterClass(root, 'picker-open', false); - e.kill(); + if (e) { + e.kill(); + } root = null; }; @@ -79,28 +127,101 @@ JX.behavior('fancy-datepicker', function(config) { var get_inputs = function() { return { - y: JX.DOM.find(root, 'select', 'year-input'), - m: JX.DOM.find(root, 'select', 'month-input'), - d: JX.DOM.find(root, 'select', 'day-input'), + d: JX.DOM.find(root, 'input', 'date-input'), t: JX.DOM.find(root, 'input', 'time-input') }; }; - var read_date = function() { - var i = get_inputs(); - value_y = +i.y.value; - value_m = +i.m.value; - value_d = +i.d.value; + var read_date = function(){ + var inputs = get_inputs(); + var date = inputs.d.value; + var regex = new RegExp('[./ -]'); + var date_parts = date.split(regex); + var map = get_key_maps(); + + for (var i=0; i < date_parts.length; i++) { + var key = map[i].toLowerCase(); + + switch (key) { + case 'y': + value_y = date_parts[i]; + break; + case 'm': + value_m = date_parts[i]; + break; + case 'd': + value_d = date_parts[i]; + break; + } + } }; var write_date = function() { - var i = get_inputs(); - i.y.value = value_y; - i.m.value = value_m; - i.d.value = value_d; + var inputs = get_inputs(); + var map = get_key_maps(); + var arr_values = []; + + for(var i=0; i < map.length; i++) { + switch (map[i].toLowerCase()) { + case 'y': + arr_values[i] = value_y; + break; + case 'm': + arr_values[i] = value_m; + break; + case 'n': + arr_values[i] = value_m; + break; + case 'd': + arr_values[i] = value_d; + break; + case 'j': + arr_values[i] = value_d; + break; + } + } + + var text_value = ''; + var separator = get_format_separator(); + + for(var j=0; j < arr_values.length; j++) { + var element = arr_values[j]; + var format = get_format(); + + if ((format.toLowerCase() === 'd-m-y' || + format.toLowerCase() === 'y-m-d') && + element < 10) { + element = '0' + element; + } + + if (text_value.length === 0) { + text_value += element; + } else { + text_value = text_value + separator + element; + } + } + + inputs.d.value = text_value; }; var render = function() { + if (!picker) { + return; + } + + var button = anchor_node; + var p = JX.$V(button); + var d = JX.Vector.getDim(picker); + var b = JX.Vector.getDim(button); + + if (JX.Device.isDesktop()) { + picker.style.top = (p.y) + 'px'; + picker.style.left = (p.x - d.x - 2) + 'px'; + } else { + picker.style.top = (p.y + b.y) + 'px'; + picker.style.left = ''; + } + JX.DOM.setContent( picker.firstChild, [ @@ -110,15 +231,8 @@ JX.behavior('fancy-datepicker', function(config) { }; var redraw_inputs = function() { - var inputs = get_inputs(); var disabled = JX.Stratcom.getData(root).disabled; - for (var k in inputs) { - if (disabled) { - inputs[k].setAttribute('disabled', 'disabled'); - } else { - inputs[k].removeAttribute('disabled'); - } - } + JX.DOM.alterClass(root, 'datepicker-disabled', disabled); var box = JX.DOM.scry(root, 'input', 'calendar-enable'); if (box.length) { @@ -141,9 +255,12 @@ JX.behavior('fancy-datepicker', function(config) { return JX.$N('td', {meta: {value: value}, className: class_name}, label); }; - // Render the top bar which allows you to pick a month and year. var render_month = function() { + var valid_date = getValidDate(); + var month = valid_date.getMonth(); + var year = valid_date.getYear() + 1900; + var months = [ 'January', 'February', @@ -159,9 +276,9 @@ JX.behavior('fancy-datepicker', function(config) { 'December']; var buttons = [ - cell("\u25C0", 'm:-1', false, 'lrbutton'), - cell(months[value_m - 1] + ' ' + value_y, null), - cell("\u25B6", 'm:1', false, 'lrbutton')]; + cell('\u25C0', 'm:-1', false, 'lrbutton'), + cell(months[month] + ' ' + year, null), + cell('\u25B6', 'm:1', false, 'lrbutton')]; return JX.$N( 'table', @@ -169,17 +286,58 @@ JX.behavior('fancy-datepicker', function(config) { JX.$N('tr', {}, buttons)); }; + function getValidDate() { + var year_int = parseInt(value_y, 10); + + if (isNaN(year_int) || year_int < 0) { + return new Date(); + } + + // If the user enters "11" for the year, interpret it as "2011" (which + // is almost certainly what they mean) not "1911" (which is the default + // behavior of Javascript). + if (year_int < 70) { + year_int += 2000; + } + + var month_int = parseInt(value_m, 10); + if (isNaN(month_int) || month_int < 1 || month_int > 12) { + return new Date(); + } + + // In Javascript, January is "0", not "1", so adjust the value down. + month_int = month_int - 1; + + var day_int = parseInt(value_d, 10); + if (isNaN(day_int) || day_int < 1 || day_int > 31) { + return new Date(); + } + + var written_date = new Date(year_int, month_int, day_int); + if (isNaN(written_date.getTime())) { + return new Date(); + } + + return written_date; + } + // Render the day-of-week and calendar views. var render_day = function() { + var today = new Date(); + var valid_date = getValidDate(); + var weeks = []; // First, render the weekday names. var weekdays = 'SMTWTFS'; var weekday_names = []; - var ii; - for (ii = 0; ii < weekdays.length; ii++) { - weekday_names.push(cell(weekdays.charAt(ii), null, false, 'day-name')); + var week_start = parseInt(get_week_start(), 10); + var week_end = weekdays.length + week_start; + + for (var ii = week_start; ii < week_end; ii++) { + var index = ii%7; + weekday_names.push(cell(weekdays.charAt(index), null, false, 'day-name')); } weeks.push(JX.$N('tr', {}, weekday_names)); @@ -187,16 +345,21 @@ JX.behavior('fancy-datepicker', function(config) { // Render the calendar itself. NOTE: Javascript uses 0-based month indexes // while we use 1-based month indexes, so we have to adjust for that. var days = []; - var start = new Date(value_y, value_m - 1, 1).getDay(); + var start = (new Date( + valid_date.getYear() + 1900, + valid_date.getMonth(), + 1).getDay() - week_start + 7) % 7; + while (start--) { days.push(cell('', null, false, 'day-placeholder')); } - var today = new Date(); - for (ii = 1; ii <= 31; ii++) { - var date = new Date(value_y, value_m - 1, ii); - if (date.getMonth() != (value_m - 1)) { + var date = new Date( + valid_date.getYear() + 1900, + valid_date.getMonth(), + ii); + if (date.getMonth() != (valid_date.getMonth())) { // We've spilled over into the next month, so stop rendering. break; } @@ -206,6 +369,7 @@ JX.behavior('fancy-datepicker', function(config) { today.getDate() == date.getDate()); var classes = []; + classes.push('day'); if (is_today) { classes.push('today'); } @@ -213,7 +377,11 @@ JX.behavior('fancy-datepicker', function(config) { classes.push('weekend'); } - days.push(cell(ii, 'd:'+ii, value_d == ii, classes.join(' '))); + days.push(cell( + ii, + 'd:'+ii, + valid_date.getDate() == ii, + classes.join(' '))); } // Slice the days into weeks. @@ -239,6 +407,11 @@ JX.behavior('fancy-datepicker', function(config) { return; } + var valid_date = getValidDate(); + value_y = valid_date.getYear() + 1900; + value_m = valid_date.getMonth() + 1; + value_d = valid_date.getDate(); + var p = data.value.split(':'); switch (p[0]) { case 'm': @@ -251,6 +424,13 @@ JX.behavior('fancy-datepicker', function(config) { value_m += 12; value_y--; } + // This relies on months greater than 11 rolling over into the next + // year and days less than 1 rolling back into the previous month. + var last_date = new Date(value_y, value_m, 0); + if (value_d > last_date.getDate()) { + // The date falls outside the new month, so stuff it back in. + value_d = last_date.getDate(); + } break; case 'd': // User clicked a day. @@ -270,4 +450,13 @@ JX.behavior('fancy-datepicker', function(config) { render(); }); + JX.Stratcom.listen('click', null, function(e){ + if (e.getNode('phabricator-datepicker-core')) { + return; + } + onclose(); + }); + + JX.Stratcom.listen('resize', null, render); + }); diff --git a/webroot/rsrc/js/core/behavior-file-tree.js b/webroot/rsrc/js/core/behavior-file-tree.js deleted file mode 100644 index d5b908eb75..0000000000 --- a/webroot/rsrc/js/core/behavior-file-tree.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @provides javelin-behavior-phabricator-file-tree - * @requires javelin-behavior - * phabricator-keyboard-shortcut - * javelin-stratcom - */ - -JX.behavior('phabricator-file-tree', function(config) { - - new JX.KeyboardShortcut('f', 'Toggle file tree.') - .setHandler(function(manager) { - JX.Stratcom.invoke('differential-filetree-toggle'); - }) - .register(); - -}); diff --git a/webroot/rsrc/js/core/behavior-form.js b/webroot/rsrc/js/core/behavior-form.js index 84defd4abf..01f88e2b09 100644 --- a/webroot/rsrc/js/core/behavior-form.js +++ b/webroot/rsrc/js/core/behavior-form.js @@ -3,7 +3,7 @@ * @provides javelin-behavior-aphront-form-disable-on-submit */ -JX.behavior('aphront-form-disable-on-submit', function(config) { +JX.behavior('aphront-form-disable-on-submit', function() { var restore = []; var root = null; @@ -15,9 +15,9 @@ JX.behavior('aphront-form-disable-on-submit', function(config) { }); - JX.Stratcom.listen('keypress', ['tag:form', 'tag:textarea'], function(e) { + JX.Stratcom.listen('keydown', ['tag:form', 'tag:textarea'], function(e) { var raw = e.getRawEvent(); - if (e.getSpecialKey() != 'return' || !raw.ctrlKey) { + if (!(e.getSpecialKey() === 'return' && (raw.ctrlKey || raw.metaKey))) { return; } @@ -84,8 +84,8 @@ JX.behavior('aphront-form-disable-on-submit', function(config) { will_submit(root); }); - JX.Stratcom.listen('unload', null, function(e) { - // Reenable everything on page unload so we don't bfcache back to a page + JX.Stratcom.listen('unload', null, function() { + // Re-enable everything on page unload so we don't bfcache back to a page // that has disabled forms. for (var ii = 0; ii < restore.length; ii++) { restore[ii].disabled = ''; diff --git a/webroot/rsrc/js/core/behavior-gesture.js b/webroot/rsrc/js/core/behavior-gesture.js index 1c4b930f89..e09c3991aa 100644 --- a/webroot/rsrc/js/core/behavior-gesture.js +++ b/webroot/rsrc/js/core/behavior-gesture.js @@ -12,7 +12,7 @@ /** * Basic gesture recognition. Unstable. Only supports swipes. */ -JX.behavior('phabricator-gesture', function(config) { +JX.behavior('phabricator-gesture', function() { var target = null; var swiping = false; @@ -89,7 +89,7 @@ JX.behavior('phabricator-gesture', function(config) { JX.Stratcom.listen( ['touchend', 'mouseup'], null, - function(e) { + function() { if (!target) { return; } diff --git a/webroot/rsrc/js/core/behavior-global-drag-and-drop.js b/webroot/rsrc/js/core/behavior-global-drag-and-drop.js index ad66625599..08b0fd1226 100644 --- a/webroot/rsrc/js/core/behavior-global-drag-and-drop.js +++ b/webroot/rsrc/js/core/behavior-global-drag-and-drop.js @@ -7,62 +7,113 @@ * phabricator-drag-and-drop-file-upload */ -JX.behavior('global-drag-and-drop', function(config) { +JX.behavior('global-drag-and-drop', function(config, statics) { if (!JX.PhabricatorDragAndDropFileUpload.isSupported()) { return; } - var pending = 0; - var files = []; - var errors = false; + function init() { + statics.pending = 0; + statics.files = []; + statics.errors = false; + statics.enabled = true; - if (config.ifSupported) { - JX.$(config.ifSupported).style.display = ''; + if (config.ifSupported) { + JX.$(config.ifSupported).style.display = ''; + } + + var page = JX.$('phabricator-standard-page'); + statics.drop = new JX.PhabricatorDragAndDropFileUpload(page) + .setURI(config.uploadURI) + .setViewPolicy(config.viewPolicy) + .setChunkThreshold(config.chunkThreshold); + + install_extra_listeners(); + + statics.drop.start(); + + return true; } - var drop = new JX.PhabricatorDragAndDropFileUpload(document.documentElement) - .setURI(config.uploadURI); - - drop.listen('didBeginDrag', function(f) { - JX.Mask.show(); - JX.DOM.show(JX.$(config.instructions)); - }); - - drop.listen('didEndDrag', function(f) { - JX.Mask.hide(); - JX.DOM.hide(JX.$(config.instructions)); - }); - - drop.listen('willUpload', function(f) { - pending++; - }); - - drop.listen('didUpload', function(f) { - files.push(f); - - pending--; - if (pending === 0 && !errors) { - // If whatever the user dropped in has finished uploading, send them to - // their uploads. - var uri; - uri = JX.$U(config.browseURI); - var ids = []; - for (var ii = 0; ii < files.length; ii++) { - ids.push(files[ii].getID()); + function install_extra_listeners() { + statics.drop.listen('didBeginDrag', function() { + if (!statics.enabled) { + return; } - uri.setQueryParam('h', ids.join(',')); + JX.Mask.show('global-upload-mask'); + JX.DOM.show(JX.$(config.instructions)); + }); - files = []; + statics.drop.listen('didEndDrag', function() { + if (!statics.enabled) { + return; + } + JX.Mask.hide('global-upload-mask'); + JX.DOM.hide(JX.$(config.instructions)); + }); - uri.go(); - } - }); + statics.drop.listen('willUpload', function() { + if (!statics.enabled) { + return; + } + statics.pending++; + }); - drop.listen('didError', function(f) { - pending--; - errors = true; - }); + statics.drop.listen('didUpload', function(f) { + if (!statics.enabled) { + return; + } + statics.files.push(f); - drop.start(); -}); + statics.pending--; + if (statics.pending === 0 && !statics.errors) { + // If whatever the user dropped in has finished uploading, send them to + // their uploads. + var uri; + var is_submit = !!config.submitURI; + + if (is_submit) { + uri = JX.$U(config.submitURI); + } else { + uri = JX.$U(config.browseURI); + } + var ids = []; + for (var ii = 0; ii < statics.files.length; ii++) { + ids.push(statics.files[ii].getID()); + } + uri.setQueryParam('h', ids.join(',')); + + statics.files = []; + + if (is_submit) { + new JX.Workflow(uri) + .start(); + } else { + uri.go(); + } + } + }); + + statics.drop.listen('didError', function() { + if (!statics.enabled) { + return; + } + statics.pending--; + statics.errors = true; + }); + + JX.Stratcom.listen( + 'quicksand-redraw', + null, + function (e) { + var data = e.getData(); + var toggle = data.newResponse.globalDragAndDrop; + statics.enabled = toggle; + statics.drop.setIsEnabled(toggle); + }); + } + + statics.init = statics.init || init(); + +}); diff --git a/webroot/rsrc/js/core/behavior-high-security-warning.js b/webroot/rsrc/js/core/behavior-high-security-warning.js new file mode 100644 index 0000000000..559338fada --- /dev/null +++ b/webroot/rsrc/js/core/behavior-high-security-warning.js @@ -0,0 +1,46 @@ +/** + * @provides javelin-behavior-high-security-warning + * @requires javelin-behavior + * javelin-uri + * phabricator-notification + */ + +JX.behavior('high-security-warning', function(config, statics) { + + function show_warning(message, uri) { + var n = new JX.Notification() + .setContent(message) + .setDuration(0) + .alterClassName('jx-notification-security', true); + + n.listen( + 'activate', + function() { + statics.showing = false; + JX.$U(uri).go(); + }); + + n.show(); + statics.showing = true; + } + + if (statics.showing) { + return; + } + + if (config.show) { + show_warning(config.message, config.uri); + } + + JX.Stratcom.listen( + 'quicksand-redraw', + null, + function (e) { + var new_data = e.getData().newResponse.hisecWarningConfig; + + if (!new_data.fromServer || !new_data.show || statics.showing) { + return; + } + show_warning(new_data.message, new_data.uri); + }); +}); diff --git a/webroot/rsrc/js/core/behavior-hovercard.js b/webroot/rsrc/js/core/behavior-hovercard.js index 6303d3c3bd..d0b2058166 100644 --- a/webroot/rsrc/js/core/behavior-hovercard.js +++ b/webroot/rsrc/js/core/behavior-hovercard.js @@ -1,14 +1,22 @@ /** - * @provides javelin-behavior-phabricator-hovercards + * @provides javelin-behavior-phui-hovercards * @requires javelin-behavior * javelin-behavior-device * javelin-stratcom * javelin-vector - * phabricator-hovercard + * phui-hovercard + * phui-hovercard-list * @javelin */ -JX.behavior('phabricator-hovercards', function(config) { +JX.behavior('phui-hovercards', function(config, statics) { + if (statics.hovercardList) { + return; + } + + var cards = new JX.HovercardList(); + statics.hovercardList = cards; + // We listen for mousemove instead of mouseover to handle the case when user // scrolls with keyboard. We don't want to display hovercard if node gets @@ -23,53 +31,19 @@ JX.behavior('phabricator-hovercards', function(config) { return; } - var data = e.getNodeData('hovercard'); + var node = e.getNode('hovercard'); + var data = e.getNodeData('hovercard').hovercardSpec; - JX.Hovercard.show( - e.getNode('hovercard'), - data.hoverPHID); + var card = cards.getCard(data); + + cards.drawCard(card, node); }); JX.Stratcom.listen( 'mousemove', null, function (e) { - if (!JX.Hovercard.getCard()) { - return; - } - - var root = JX.Hovercard.getAnchor(); - var node = JX.Hovercard.getCard(); - - // TODO: Add southern cases here, too - var mouse = JX.$V(e); - var node_pos = JX.$V(node); - var node_dim = JX.Vector.getDim(node); - var root_pos = JX.$V(root); - var root_dim = JX.Vector.getDim(root); - - var margin = 20; - - // Cursor is above the node. - if (mouse.y < node_pos.y - margin) { - JX.Hovercard.hide(); - } - - // Cursor is below the root. - if (mouse.y > root_pos.y + root_dim.y + margin) { - JX.Hovercard.hide(); - } - - // Cursor is too far to the left. - if (mouse.x < Math.min(root_pos.x, node_pos.x) - margin) { - JX.Hovercard.hide(); - } - - // Cursor is too far to the right. - if (mouse.x > - Math.max(root_pos.x + root_dim.x, node_pos.x + node_dim.x) + margin) { - JX.Hovercard.hide(); - } + cards.onMouseMove(e); }); // When we leave the page, hide any visible hovercards. If we don't do this, @@ -78,8 +52,8 @@ JX.behavior('phabricator-hovercards', function(config) { JX.Stratcom.listen( ['unload', 'onresize'], null, - function(e) { - JX.Hovercard.hide(); + function() { + cards.hideCard(); }); }); diff --git a/webroot/rsrc/js/core/behavior-keyboard-pager.js b/webroot/rsrc/js/core/behavior-keyboard-pager.js index 02b98ffe70..4cd66a3bfa 100644 --- a/webroot/rsrc/js/core/behavior-keyboard-pager.js +++ b/webroot/rsrc/js/core/behavior-keyboard-pager.js @@ -8,7 +8,7 @@ JX.behavior('phabricator-keyboard-pager', function(config) { new JX.KeyboardShortcut('[', 'Prev Page') - .setHandler(function(manager) { + .setHandler(function() { if (config.prev) { JX.$U(config.prev).go(); } @@ -16,7 +16,7 @@ JX.behavior('phabricator-keyboard-pager', function(config) { .register(); new JX.KeyboardShortcut(']', 'Next Page') - .setHandler(function(manager) { + .setHandler(function() { if (config.next) { JX.$U(config.next).go(); } diff --git a/webroot/rsrc/js/core/behavior-keyboard-shortcuts.js b/webroot/rsrc/js/core/behavior-keyboard-shortcuts.js index 5c296420da..3a0f5163be 100644 --- a/webroot/rsrc/js/core/behavior-keyboard-shortcuts.js +++ b/webroot/rsrc/js/core/behavior-keyboard-shortcuts.js @@ -11,10 +11,11 @@ * Define global keyboard shortcuts. */ JX.behavior('phabricator-keyboard-shortcuts', function(config) { + var pht = JX.phtize(config.pht); var workflow = null; - var desc = 'Show keyboard shortcut help for the current page.'; - new JX.KeyboardShortcut('?', desc) + new JX.KeyboardShortcut('?', pht('?')) + .setGroup('global') .setHandler(function(manager) { if (workflow) { // Already showing the dialog. @@ -31,8 +32,8 @@ JX.behavior('phabricator-keyboard-shortcuts', function(config) { .register(); if (config.searchID) { - desc = 'Give keyboard focus to the search box.'; - new JX.KeyboardShortcut('/', desc) + new JX.KeyboardShortcut('/', pht('/')) + .setGroup('global') .setHandler(function() { var search = JX.$(config.searchID); search.focus(); @@ -40,4 +41,5 @@ JX.behavior('phabricator-keyboard-shortcuts', function(config) { }) .register(); } + }); diff --git a/webroot/rsrc/js/core/behavior-konami.js b/webroot/rsrc/js/core/behavior-konami.js deleted file mode 100644 index e02c9c2525..0000000000 --- a/webroot/rsrc/js/core/behavior-konami.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - * @provides javelin-behavior-konami - * @requires javelin-behavior - * javelin-stratcom - */ - -JX.behavior('konami', function() { - var sequence = [ 38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13 ]; - var seen = []; - - JX.Stratcom.listen('keyup', null, function(e) { - if (!sequence) { - return; - } - - seen.push(e.getRawEvent().keyCode); - - while (seen.length) { - var mismatch = false; - for (var i = 0; i < seen.length; ++i) { - if (seen[i] != sequence[i]) { - mismatch = true; - break; - } - } - if (!mismatch) { - break; - } - seen.shift(); - } - - if (seen.length == sequence.length) { - sequence = seen = null; - activate(); - } - }); - - var prefixes = { '-webkit-': 1, '-moz-': 1, '-o-': 1, '-ms-': 1, '': 1 }; - - function generateCSS(selector, props) { - var ret = selector + '{'; - for (var key in props) { - ret += key + ':' + props[key] + ';'; - } - return ret + '}'; - } - - function generateAllCSS(selector, props) { - var more_props = {}; - for (var key in props) { - for (var prefix in prefixes) { - more_props[prefix + key] = props[key]; - } - } - return generateCSS(selector, more_props); - } - - function modifyCSS(rule, key, value) { - rule.setProperty(key, value, ''); - } - - function modifyAllCSS(rule, key, value) { - for (var prefix in prefixes) { - modifyCSS(rule, prefix + key, value); - } - } - - var top_rule; - - function activate() { - var matrix = document.createElement('style'); - matrix.textContent = [ - generateAllCSS('html', { - background: '#000' - }), - generateAllCSS('body', { - perspective: '2048px', - background: 'transparent' - }), - generateAllCSS('*', { - 'transform-style': 'preserve-3d' - }), - generateAllCSS('body > *', { - }) - ].join('\n'); - document.head.appendChild(matrix); - - top_rule = matrix.sheet.cssRules[3].style; - - var first_event = null; - document.body.addEventListener('mousemove', function(e) { - if (!first_event) { - first_event = {x: e.screenX, y: e.screenY}; - } - var dx = (e.screenX - first_event.x); - var dy = (e.screenY - first_event.y); - - var x = -(dx / window.innerWidth) * (Math.PI / 2); - var y = (dy / window.innerHeight) * (Math.PI / 2); - var body_rotate = 'rotateY(' + x + 'rad) rotateX(' + y + 'rad)'; - modifyAllCSS(top_rule, 'transform', body_rotate); - }, false); - } -}); diff --git a/webroot/rsrc/js/core/behavior-lightbox-attachments.js b/webroot/rsrc/js/core/behavior-lightbox-attachments.js index 477febd0ec..2fb9206f04 100644 --- a/webroot/rsrc/js/core/behavior-lightbox-attachments.js +++ b/webroot/rsrc/js/core/behavior-lightbox-attachments.js @@ -5,29 +5,63 @@ * javelin-dom * javelin-mask * javelin-util + * phuix-icon-view * phabricator-busy */ -JX.behavior('lightbox-attachments', function (config) { +JX.behavior('lightbox-attachments', function() { + + var lightbox = null; - var lightbox = null; var prev = null; var next = null; - var x_margin = 40; - var y_margin = 100; - var downloadForm = JX.$H(config.downloadForm).getFragment().firstChild; + var shown = false; + + function _toggleComment(e) { + e.kill(); + shown = !shown; + JX.DOM.alterClass(lightbox, 'comment-panel-open', shown); + } + + function markCommentsLoading(loading) { + var frame = JX.$('lightbox-comment-frame'); + JX.DOM.alterClass(frame, 'loading', loading); + } + + function onLoadCommentsResponse(r) { + var frame = JX.$('lightbox-comment-frame'); + JX.DOM.setContent(frame, JX.$H(r)); + markCommentsLoading(false); + } + + function loadComments(phid) { + markCommentsLoading(true); + var uri = '/file/thread/' + phid + '/'; + new JX.Workflow(uri) + .setHandler(onLoadCommentsResponse) + .start(); + } function loadLightBox(e) { if (!e.isNormalClick()) { return; } - if (JX.Stratcom.pass()) { + // If you click the "Download" link inside an embedded file element, + // don't lightbox the file. But do lightbox when the user clicks an + // "" inside an "". + if (e.getNode('tag:a') && !e.getNode('tag:img')) { return; } - e.prevent(); - var links = JX.DOM.scry(document, 'a', 'lightboxable'); + e.kill(); + + activateLightbox(e.getNode('lightboxable')); + } + + function activateLightbox(target) { + var mainFrame = JX.$('main-page-frame'); + var links = JX.DOM.scry(mainFrame, '*', 'lightboxable'); var phids = {}; var data; for (var i = 0; i < links.length; i++) { @@ -38,7 +72,6 @@ JX.behavior('lightbox-attachments', function (config) { // Now that we have the big picture phid situation sorted out, figure // out how the actual node the user clicks fits into that big picture // and build some pretty UI to show the attachment. - var target = e.getNode('lightboxable'); var target_data = JX.Stratcom.getData(target); var total = JX.keys(phids).length; var current = 1; @@ -56,54 +89,142 @@ JX.behavior('lightbox-attachments', function (config) { } var img_uri = ''; + var img = ''; var extra_status = ''; - var name_element = ''; - // for now, this conditional is always true - // revisit if / when we decide to add non-images to lightbox view + if (target_data.viewable) { img_uri = target_data.uri; + + img = + JX.$N('img', + { + className : 'loading', + alt : target_data.alt || null + } + ); } else { - img_uri = config.defaultImageUri; - extra_status = ' Image may not be representative of actual attachment.'; - name_element = JX.$N('div', - { className : 'attachment-name' }, - target_data.name - ); + var imgIcon = new JX.PHUIXIconView() + .setIcon(target_data.icon + ' phui-lightbox-file-icon') + .getNode(); + var nameElement = + JX.$N('div', + { + className : 'attachment-name' + }, + target_data.name + ); + img = + JX.$N('a', + { + className : 'lightbox-icon-frame', + sigil : 'lightbox-download-submit', + href : target_data.dUri, + }, + [ imgIcon, nameElement ] + ); } - var img = JX.$N('img', - { - className : 'loading', - alt : target_data.name, - title : target_data.name - } - ); + var imgFrame = + JX.$N('div', + { + className : 'lightbox-image-frame', + sigil : 'lightbox-image-frame', + }, + img + ); + + var commentFrame = + JX.$N('div', + { + className : 'lightbox-comment-frame', + id : 'lightbox-comment-frame' + } + ); + + var commentClass = (shown) ? 'comment-panel-open' : ''; + + lightbox = + JX.$N('div', + { + className : 'lightbox-attachment ' + commentClass, + sigil : 'lightbox-attachment' + }, + [imgFrame, commentFrame] + ); + + var monogram = JX.$N('strong', {}, target_data.monogram); + var m_url = JX.$N('a', { href : '/' + target_data.monogram }, monogram); + var statusSpan = + JX.$N('span', + { + className: 'lightbox-status-txt' + }, + [ + m_url, + current + ' / ' + total + ] + ); + + var download_icon = new JX.PHUIXIconView() + .setIcon('fa-download phui-icon-circle-icon') + .getNode(); + + var download_button = JX.$N( + 'a', + { + className: 'lightbox-download phui-icon-circle hover-sky', + href: target_data.dUri + }, + download_icon); + + var commentIcon = new JX.PHUIXIconView() + .setIcon('fa-comments phui-icon-circle-icon') + .getNode(); + var commentButton = + JX.$N('a', + { + className : 'lightbox-comment phui-icon-circle hover-sky', + href : '#', + sigil : 'lightbox-comment' + }, + commentIcon + ); + + var closeIcon = new JX.PHUIXIconView() + .setIcon('fa-times phui-icon-circle-icon') + .getNode(); + var closeButton = + JX.$N('a', + { + className : 'lightbox-close phui-icon-circle hover-red', + href : '#' + }, + closeIcon); + + var statusHTML = + JX.$N('div', + { + className : 'lightbox-status' + }, + [statusSpan, closeButton, commentButton, download_button] + ); + JX.DOM.appendContent(lightbox, statusHTML); + JX.DOM.listen(closeButton, 'click', null, closeLightBox); - lightbox = JX.$N('div', - { - className : 'lightbox-attachment', - sigil: 'lightbox-attachment' - }, - img - ); - JX.DOM.appendContent(lightbox, name_element); - - var closeIcon = JX.$N('a', - { - className : 'lightbox-close', - href : '#' - } - ); - JX.DOM.listen(closeIcon, 'click', null, closeLightBox); - JX.DOM.appendContent(lightbox, closeIcon); var leftIcon = ''; if (next) { - leftIcon = JX.$N('a', - { - className : 'lightbox-right', - href : '#' - } - ); + var r_icon = new JX.PHUIXIconView() + .setIcon('fa-angle-right') + .setColor('lightgreytext') + .getNode(); + leftIcon = + JX.$N('a', + { + className : 'lightbox-right', + href : '#' + }, + r_icon + ); JX.DOM.listen(leftIcon, 'click', null, @@ -113,12 +234,18 @@ JX.behavior('lightbox-attachments', function (config) { JX.DOM.appendContent(lightbox, leftIcon); var rightIcon = ''; if (prev) { - rightIcon = JX.$N('a', - { - className : 'lightbox-left', - href : '#' - } - ); + var l_icon = new JX.PHUIXIconView() + .setIcon('fa-angle-left') + .setColor('lightgreytext') + .getNode(); + rightIcon = + JX.$N('a', + { + className : 'lightbox-left', + href : '#' + }, + l_icon + ); JX.DOM.listen(rightIcon, 'click', null, @@ -127,39 +254,21 @@ JX.behavior('lightbox-attachments', function (config) { } JX.DOM.appendContent(lightbox, rightIcon); - var statusSpan = JX.$N('span', - { - className: 'lightbox-status-txt' - }, - 'Image '+current+' of '+total+'.'+extra_status - ); - - var downloadSpan = JX.$N('span', - { - className : 'lightbox-download' - }); - var statusHTML = JX.$N('div', - { - className : 'lightbox-status' - }, - [statusSpan, downloadSpan] - ); - JX.DOM.appendContent(lightbox, statusHTML); JX.DOM.alterClass(document.body, 'lightbox-attached', true); JX.Mask.show('jx-dark-mask'); - downloadForm.action = target_data.dUri; - downloadSpan.appendChild(downloadForm); - document.body.appendChild(lightbox); - JX.Busy.start(); - img.onload = function() { - JX.DOM.alterClass(img, 'loading', false); - JX.Busy.done(); - }; + if (img_uri) { + JX.Busy.start(); + img.onload = function() { + JX.DOM.alterClass(img, 'loading', false); + JX.Busy.done(); + }; - img.src = img_uri; + img.src = img_uri; + } + loadComments(target_data.phid); } // TODO - make this work with KeyboardShortcut, which means @@ -214,12 +323,15 @@ JX.behavior('lightbox-attachments', function (config) { } e.prevent(); closeLightBox(e); - el.click(); + + activateLightbox(el); } - JX.Stratcom.listen( + // Only look for lightboxable inside the main page, not other lightboxes. + JX.DOM.listen( + JX.$('main-page-frame'), 'click', - ['lightboxable', 'tag:a'], + ['lightboxable'], loadLightBox); JX.Stratcom.listen( @@ -230,12 +342,12 @@ JX.behavior('lightbox-attachments', function (config) { // When the user clicks the background, close the lightbox. JX.Stratcom.listen( 'click', - 'lightbox-attachment', + 'lightbox-image-frame', function (e) { if (!lightbox) { return; } - if (e.getTarget() != e.getNode('lightbox-attachment')) { + if (e.getTarget() != e.getNode('lightbox-image-frame')) { // Don't close if they clicked some other element, like the image // itself or the next/previous arrows. return; @@ -244,4 +356,33 @@ JX.behavior('lightbox-attachments', function (config) { e.kill(); }); + JX.Stratcom.listen( + 'click', + 'lightbox-comment', + _toggleComment); + + var _sendMessage = function(e) { + e.kill(); + var form = e.getNode('tag:form'); + JX.Workflow.newFromForm(form) + .setHandler(onLoadCommentsResponse) + .start(); + }; + + JX.Stratcom.listen( + ['submit', 'didSyntheticSubmit'], + 'lightbox-comment-form', + _sendMessage); + + var _startPageDownload = function(e) { + e.kill(); + var form = e.getNode('tag:form'); + form.submit(); + }; + + JX.Stratcom.listen( + 'click', + 'embed-download-form', + _startPageDownload); + }); diff --git a/webroot/rsrc/js/core/behavior-line-linker.js b/webroot/rsrc/js/core/behavior-line-linker.js index 9175b725e8..fd8510646e 100644 --- a/webroot/rsrc/js/core/behavior-line-linker.js +++ b/webroot/rsrc/js/core/behavior-line-linker.js @@ -4,56 +4,129 @@ * javelin-stratcom * javelin-dom * javelin-history + * javelin-external-editor-link-engine */ JX.behavior('phabricator-line-linker', function() { var origin = null; var target = null; var root = null; + var highlighted = null; - function getRowNumber(tr) { - var th = JX.DOM.find(tr, 'th', 'phabricator-source-line'); - return +(th.textContent || th.innerText); + var editor_link = null; + try { + editor_link = JX.$('editor_link'); + } catch (ex) { + // Ignore. + } + + function getRowNumber(th) { + // If the "" tag contains an "" with "data-n" that we're using + // to prevent copy/paste of line numbers, use that. + if (th.firstChild) { + var line = th.firstChild.getAttribute('data-n'); + if (line) { + return line; + } + } + + return null; } JX.Stratcom.listen( - 'mousedown', - 'phabricator-source-line', + ['click', 'mousedown'], + ['phabricator-source', 'tag:th', 'tag:a'], function(e) { if (!e.isNormalMouseEvent()) { return; } - origin = e.getNode('tag:tr'); - target = origin; - root = e.getNode('phabricator-source'); - e.kill(); - }); - JX.Stratcom.listen( - 'click', - 'phabricator-source-line', - function(e) { + // Make sure the link we clicked is actually a line number in a source + // table, not some kind of link in some element embedded inside the + // table. The row's immediate ancestor table needs to be the table with + // the "phabricator-source" sigil. + + var cell = e.getNode('tag:th'); + var table = e.getNode('phabricator-source'); + if (JX.DOM.findAbove(cell, 'table') !== table) { + return; + } + + var number = getRowNumber(cell); + if (!number) { + return; + } + e.kill(); + + // If this is a click event, kill it. We handle mousedown and mouseup + // instead. + if (e.getType() === 'click') { + return; + } + + origin = cell; + target = origin; + + root = table; }); var highlight = function(e) { - if (!origin || e.getNode('phabricator-source') !== root) { + if (!origin) { return; } - target = e.getNode('tag:tr'); - - var highlighting = false; - var source = null; - var trs = JX.DOM.scry(root, 'tr'); - for (var i = 0; i < trs.length; i++) { - if (!highlighting && (trs[i] === origin || trs[i] === target)) { - highlighting = true; - source = trs[i]; + + if (e.getNode('phabricator-source') !== root) { + return; + } + target = e.getNode('tag:th'); + + var min; + var max; + + // NOTE: We're using position to figure out which order these rows are in, + // not row numbers. We do this because Harbormaster build logs may have + // multiple rows with the same row number. + + if (JX.$V(origin).y <= JX.$V(target).y) { + min = origin; + max = target; + } else { + min = target; + max = origin; + } + + // If we haven't changed highlighting, we don't have a list of highlighted + // nodes yet. Assume every row is highlighted. + var ii; + if (highlighted === null) { + highlighted = []; + var rows = JX.DOM.scry(root, 'tr'); + for (ii = 0; ii < rows.length; ii++) { + highlighted.push(rows[ii]); } - JX.DOM.alterClass(trs[i], 'phabricator-source-highlight', highlighting); - if (trs[i] === (source === origin ? target : origin)) { - highlighting = false; + } + + // Unhighlight any existing highlighted rows. + for (ii = 0; ii < highlighted.length; ii++) { + JX.DOM.alterClass(highlighted[ii], 'phabricator-source-highlight', false); + } + highlighted = []; + + // Highlight the newly selected rows. + min = JX.DOM.findAbove(min, 'tr'); + max = JX.DOM.findAbove(max, 'tr'); + + var cursor = min; + while (true) { + JX.DOM.alterClass(cursor, 'phabricator-source-highlight', true); + highlighted.push(cursor); + + if (cursor === max) { + break; } + + cursor = cursor.nextSibling; } }; @@ -68,17 +141,74 @@ JX.behavior('phabricator-line-linker', function() { } highlight(e); + e.kill(); var o = getRowNumber(origin); var t = getRowNumber(target); - var lines = (o == t ? o : Math.min(o, t) + '-' + Math.max(o, t)); - var th = JX.DOM.find(origin, 'th', 'phabricator-source-line'); - var uri = JX.DOM.find(th, 'a').href; - uri = uri.replace(/(.*\$)\d+/, '$1' + lines); + var uri = JX.Stratcom.getData(root).uri; + var path; + + if (!uri) { + uri = JX.$U(window.location); + path = uri.getPath(); + path = path.replace(/\$[\d-]+$/, ''); + uri.setPath(path); + uri = uri.toString(); + } + origin = null; target = null; - e.kill(); + root = null; + + var lines = (o == t ? o : Math.min(o, t) + '-' + Math.max(o, t)); + + uri = JX.$U(uri); + path = uri.getPath(); + path = path + '$' + lines; + uri = uri.setPath(path).toString(); + JX.History.replace(uri); + + if (editor_link) { + var data = JX.Stratcom.getData(editor_link); + + var variables = { + l: parseInt(Math.min(o, t), 10), + }; + + var template = data.template; + + var editor_uri = new JX.ExternalEditorLinkEngine() + .setTemplate(template) + .setVariables(variables) + .newURI(); + + editor_link.href = editor_uri; + } }); + + // Try to jump to the highlighted lines if we don't have an explicit anchor + // in the URI. + if (!window.location.hash.length) { + try { + var anchor = JX.$('phabricator-line-linker-anchor'); + JX.DOM.scrollToPosition(0, JX.$V(anchor).y - 60); + } catch (ex) { + // If we didn't hit an element on the page, just move on. + } + } + + if (editor_link) { + // TODO: This should be pht()'d, but this behavior is weird enough to + // make that a bit tricky. + + new JX.KeyboardShortcut('\\', 'Open File in External Editor') + .setGroup('diff-nav') + .setHandler(function() { + JX.$U(editor_link.href).go(); + }) + .register(); + } + }); diff --git a/webroot/rsrc/js/core/behavior-linked-container.js b/webroot/rsrc/js/core/behavior-linked-container.js new file mode 100644 index 0000000000..9721f91b22 --- /dev/null +++ b/webroot/rsrc/js/core/behavior-linked-container.js @@ -0,0 +1,47 @@ +/** + * @provides javelin-behavior-linked-container + * @requires javelin-behavior javelin-dom + */ + +JX.behavior('linked-container', function() { + + JX.Stratcom.listen( + 'click', + 'linked-container', + function(e) { + + // If the user clicked some link inside the container, bail out and just + // click the link. + if (e.getNode('tag:a')) { + return; + } + + // If this is some sort of unusual click, bail out. Note that we'll + // handle "Left Click" and "Command + Left Click" differently, below. + if (!e.isLeftButton()) { + return; + } + + var container = e.getNode('linked-container'); + + // Find the first link in the container. We're going to pretend the user + // clicked it. + var link = JX.DOM.scry(container, 'a')[0]; + if (!link) { + return; + } + + // If the click is a "Command + Left Click", change the target of the + // link so we open it in a new tab. + var is_command = !!e.getRawEvent().metaKey; + if (is_command) { + var old_target = link.target; + link.target = '_blank'; + link.click(); + link.target = old_target; + } else { + link.click(); + } + }); + +}); diff --git a/webroot/rsrc/js/core/behavior-more.js b/webroot/rsrc/js/core/behavior-more.js index 0f167d24b0..6fdbfbd4e5 100644 --- a/webroot/rsrc/js/core/behavior-more.js +++ b/webroot/rsrc/js/core/behavior-more.js @@ -6,7 +6,7 @@ * @javelin */ -JX.behavior('aphront-more', function(config) { +JX.behavior('aphront-more', function() { JX.Stratcom.listen( 'click', 'aphront-more-view-show-more', diff --git a/webroot/rsrc/js/core/behavior-object-selector.js b/webroot/rsrc/js/core/behavior-object-selector.js index 8affe37c43..b28dac0926 100644 --- a/webroot/rsrc/js/core/behavior-object-selector.js +++ b/webroot/rsrc/js/core/behavior-object-selector.js @@ -10,18 +10,31 @@ JX.behavior('phabricator-object-selector', function(config) { var n = 0; var phids = {}; + var display = []; + var handles = config.handles; for (var k in handles) { phids[k] = true; } - var button_list = {}; + var query_timer = null; var query_delay = 50; - var phid_input = JX.DOM.find( + // TODO: This is fairly grotesque, but the dialog has two different forms + // inside it and there's no way to sigil the inputs in the "real" form right + // now. Clean this up when the dialog as a whole gets cleaned up. + + var inputs = JX.DOM.scry( JX.$(config.form), 'input', 'aphront-dialog-application-input'); + var phid_input; + for (var ii = 0; ii < inputs.length; ii++) { + if (inputs[ii].name == 'phids') { + phid_input = inputs[ii]; + break; + } + } var last_value = JX.$(config.query).value; @@ -30,41 +43,92 @@ JX.behavior('phabricator-object-selector', function(config) { return; } - var display = []; - button_list = {}; + display = []; for (var k in r) { handles[r[k].phid] = r[k]; - display.push(renderHandle(r[k], true)); + display.push({phid: r[k].phid}); } - if (!display.length) { - display = renderNote('No results.'); - } - - JX.DOM.setContent(JX.$(config.results), display); + redrawList(true); } function redrawAttached() { - var display = []; + var attached = []; for (var k in phids) { - display.push(renderHandle(handles[k], false)); + attached.push(renderHandle(handles[k], false).item); } - if (!display.length) { - display = renderNote('Nothing attached.'); + if (!attached.length) { + attached = renderNote('Nothing attached.'); } - JX.DOM.setContent(JX.$(config.current), display); + JX.DOM.setContent(JX.$(config.current), attached); phid_input.value = JX.keys(phids).join(';'); } + function redrawList(rebuild) { + var ii; + var content; + + if (rebuild) { + if (display.length) { + var handle; + + content = []; + for (ii = 0; ii < display.length; ii++) { + handle = handles[display[ii].phid]; + + display[ii].node = renderHandle(handle, true); + content.push(display[ii].node.item); + } + } else { + content = renderNote('No results.'); + } + + JX.DOM.setContent(JX.$(config.results), content); + } + + var phid; + var is_disabled; + var button; + + var at_maximum = !canSelectMore(); + + for (ii = 0; ii < display.length; ii++) { + phid = display[ii].phid; + + is_disabled = false; + + // If this object is already selected, you can not select it again. + if (phids.hasOwnProperty(phid)) { + is_disabled = true; + } + + // If the maximum number of objects are already selected, you can + // not select more. + if (at_maximum) { + is_disabled = true; + } + + button = display[ii].node.button; + JX.DOM.alterClass(button, 'disabled', is_disabled); + button.disabled = is_disabled; + } + + } + function renderHandle(h, attach) { + var some_icon = JX.$N( + 'span', + {className: 'phui-icon-view phui-font-fa ' + + 'fa-external-link phabricator-object-selector-popicon'}, + ''); var view_object_link = JX.$N( 'a', {href: h.uri, target: '_blank'}, - "\u2197"); + some_icon); var select_object_link = JX.$N( 'a', @@ -73,7 +137,9 @@ JX.behavior('phabricator-object-selector', function(config) { var select_object_button = JX.$N( 'a', - {href: '#', sigil: 'object-attacher', className: 'button small grey'}, + {href: '#', + sigil: 'object-attacher', + className: 'button small button-grey'}, attach ? 'Select' : 'Remove'); var cells = [ @@ -89,18 +155,15 @@ JX.behavior('phabricator-object-selector', function(config) { table.appendChild( JX.$N( 'tr', - {sigil: 'object-attach-row', meta: {handle: h, table:table}}, + {sigil: 'object-attach-row', + className: 'phabricator-object-selector-row', + meta: {handle: h, table:table}}, cells)); - if (attach) { - button_list[h.phid] = select_object_button; - if (h.phid in phids) { - JX.DOM.alterClass(select_object_button, 'disabled', true); - select_object_button.disabled = true; - } - } - - return table; + return { + item: table, + button: select_object_button + }; } function renderNote(note) { @@ -119,6 +182,18 @@ JX.behavior('phabricator-object-selector', function(config) { .send(); } + function canSelectMore() { + if (!config.maximum) { + return true; + } + + if (JX.keys(phids).length < config.maximum) { + return true; + } + + return false; + } + JX.DOM.listen( JX.$(config.results), 'click', @@ -132,10 +207,13 @@ JX.behavior('phabricator-object-selector', function(config) { return; } + if (!canSelectMore()) { + return; + } + phids[phid] = true; - JX.DOM.alterClass(button_list[phid], 'disabled', true); - button_list[phid].disabled = true; + redrawList(false); redrawAttached(); }); @@ -151,13 +229,7 @@ JX.behavior('phabricator-object-selector', function(config) { delete phids[phid]; - // NOTE: We may not have a button in the button list, if this result is - // not visible in the current search results. - if (button_list[phid]) { - JX.DOM.alterClass(button_list[phid], 'disabled', false); - button_list[phid].disabled = false; - } - + redrawList(false); redrawAttached(); }); @@ -174,7 +246,7 @@ JX.behavior('phabricator-object-selector', function(config) { JX.$(config.query), ['change', 'keydown', 'keyup', 'keypress'], null, - function(e) { + function() { var cur_value = JX.$(config.query).value; if (last_value == cur_value) { return; @@ -186,6 +258,7 @@ JX.behavior('phabricator-object-selector', function(config) { }); sendQuery(); - redrawAttached(); + redrawList(true); + redrawAttached(); }); diff --git a/webroot/rsrc/js/core/behavior-oncopy.js b/webroot/rsrc/js/core/behavior-oncopy.js index e048c442b5..8c2aa7808f 100644 --- a/webroot/rsrc/js/core/behavior-oncopy.js +++ b/webroot/rsrc/js/core/behavior-oncopy.js @@ -4,77 +4,330 @@ * javelin-dom */ -/** - * Tools like Paste and Differential don't normally respond to the clipboard - * 'copy' operation well, because when a user copies text they'll get line - * numbers and other metadata. - * - * To improve this behavior, applications can embed markers that delimit - * metadata (left of the marker) from content (right of the marker). When - * we get a copy event, we strip out all the metadata and just copy the - * actual text. - */ JX.behavior('phabricator-oncopy', function() { + var copy_root; + var copy_mode; + + function onstartselect(e) { + var target = e.getTarget(); + + // See T13513. If the user selects multiple lines in a 2-up diff and then + // clicks "New Inline Comment" in the context menu that pops up, the + // mousedown causes us to arrive here and remove the "selectable" CSS + // styles, and creates a flash of selected content across both sides of + // the diff, which is distracting. To attempt to avoid this, bail out if + // the user clicked a link. + + if (JX.DOM.isType(target, 'a')) { + return; + } + + var container; + try { + // NOTE: For now, all elements with custom oncopy behavior are tables, + // so this tag selection will hit everything we need it to. + container = JX.DOM.findAbove(target, 'table', 'intercept-copy'); + } catch (ex) { + container = null; + } + + var old_mode = copy_mode; + clear_selection_mode(); + + if (!container) { + return; + } - var zws = "\u200B"; // Unicode Zero-Width Space + // If the potential selection is starting inside an inline comment, + // don't do anything special. + try { + if (JX.DOM.findAbove(target, 'div', 'differential-inline-comment')) { + return; + } + } catch (ex) { + // Continue. + } + + // Find the row and cell we're copying from. If we don't find anything, + // don't do anything special. + var row; + var cell; + try { + // The target may be the cell we're after, particularly if you click + // in the white area to the right of the text, towards the end of a line. + if (JX.DOM.isType(target, 'td')) { + cell = target; + } else { + cell = JX.DOM.findAbove(target, 'td'); + } + row = JX.DOM.findAbove(target, 'tr'); + } catch (ex) { + return; + } + + // If the row doesn't have enough nodes, bail out. Note that it's okay + // to begin a selection in the whitespace on the opposite side of an inline + // comment. For example, if there's an inline comment on the right side of + // a diff, it's okay to start selecting the left side of the diff by + // clicking the corresponding empty space on the left side. + if (row.childNodes.length < 4) { + return; + } + + // If the selection's cell is in the "old" diff or the "new" diff, we'll + // activate an appropriate copy mode. + var mode; + if (cell === row.childNodes[1]) { + mode = 'copy-l'; + } else if ((row.childNodes.length >= 4) && (cell === row.childNodes[4])) { + mode = 'copy-r'; + } else { + return; + } - document.body.oncopy = function(e) { + // We found a copy mode, so set it as the current active mode. + copy_root = container; + copy_mode = mode; + + // If the user makes a selection, then clicks again inside the same + // selection, browsers retain the selection. This is because the user may + // want to drag-and-drop the text to another window. + + // Handle special cases when the click is inside an existing selection. + + var ranges = get_selected_ranges(); + if (ranges.length) { + // We'll have an existing selection if the user selects text on the right + // side of a diff, then clicks the selection on the left side of the + // diff, even if the second click is clicking part of the selection + // range where the selection highlight is currently invisible because + // of CSS rules. + + // This behavior looks and feels glitchy: an invisible selection range + // suddenly pops into existence and there's a bunch of flicker. If we're + // switching selection modes, clear the old selection to avoid this: + // assume the user is not trying to drag-and-drop text which is not + // visually selected. + + if (old_mode !== copy_mode) { + window.getSelection().removeAllRanges(); + } + + // In the more mundane case, if the user selects some text on one side + // of a diff and then clicks that same selection in a normal way (in + // the visible part of the highlighted text), we may either be altering + // the selection range or may be initiating a text drag depending on how + // long they hold the button for. Regardless of what we're doing, we're + // still in a selection mode, so keep the visual hints active. + + JX.DOM.alterClass(copy_root, copy_mode, true); + } + + // We've chosen a mode and saved it now, but we don't actually update to + // apply any visual changes until the user actually starts making some + // kind of selection. + } + + // When the selection range changes, apply CSS classes if the selection is + // nonempty. We don't want to make visual changes to the document immediately + // when the user presses the mouse button, since we aren't yet sure that + // they are starting a selection: instead, wait for them to actually select + // something. + function onchangeselect() { + if (!copy_mode) { + return; + } + + var ranges = get_selected_ranges(); + JX.DOM.alterClass(copy_root, copy_mode, !!ranges.length); + } + + // When the user releases the mouse, get rid of the selection mode if we + // don't have a selection. + function onendselect(e) { + if (!copy_mode) { + return; + } + + var ranges = get_selected_ranges(); + if (!ranges.length) { + clear_selection_mode(); + } + } + + function get_selected_ranges() { + var ranges = []; + + if (!window.getSelection) { + return ranges; + } var selection = window.getSelection(); - var text = selection.toString(); + for (var ii = 0; ii < selection.rangeCount; ii++) { + var range = selection.getRangeAt(ii); + if (range.collapsed) { + continue; + } - if (text.indexOf(zws) == -1) { - // If there's no marker in the text, just let it copy normally. + ranges.push(range); + } + + return ranges; + } + + function clear_selection_mode() { + if (!copy_root) { return; } - var result = []; + JX.DOM.alterClass(copy_root, copy_mode, false); + copy_root = null; + copy_mode = null; + } - // Strip everything before the marker (and the marker itself) out of the - // text. If a line doesn't have the marker, throw it away (the assumption - // is that it's a line number or part of some other meta-text). - var lines = text.split("\n"); - var pos; - for (var ii = 0; ii < lines.length; ii++) { - pos = lines[ii].indexOf(zws); - if (pos == -1 && ii !== 0) { + function oncopy(e) { + // If we aren't in a special copy mode, just fall back to default + // behavior. + if (!copy_mode) { + return; + } + + var ranges = get_selected_ranges(); + if (!ranges.length) { + return; + } + + var text = []; + for (var ii = 0; ii < ranges.length; ii++) { + var range = ranges[ii]; + + var fragment = range.cloneContents(); + if (!fragment.childNodes.length) { continue; } - result.push(lines[ii].substring(pos + 1)); + + // In Chrome and Firefox, because we've already applied "user-select" + // CSS to everything we don't intend to copy, the text in the selection + // range is correct, and the range will include only the correct text + // nodes. + + // However, in Safari, "user-select" does not apply to clipboard + // operations, so we get everything in the document between the beginning + // and end of the selection, even if it isn't visibly selected. + + // Even in Chrome and Firefox, we can get partial empty nodes: for + // example, where a "
    " cells + // with the correct mode. + for (ii = 0; ii < node.childNodes.length; ii++) { + text.push(extract_text(node.childNodes[ii])); + } + + return text; + } + + if (JX.DOM.isType(node, 'td')) { + var node_mode = node.getAttribute('data-copy-mode'); + if (node_mode !== copy_mode) { + return; + } + + // Otherwise, fall through and extract this node's text normally. + } + + if (node.getAttribute) { + var copy_text = node.getAttribute('data-copy-text'); + if (copy_text) { + return copy_text; + } + } + + if (!node.childNodes || !node.childNodes.length) { + return node.textContent; + } + + for (ii = 0; ii < node.childNodes.length; ii++) { + var child = node.childNodes[ii]; + text.push(extract_text(child)); + } + + return text; + } + + function flatten_list(list) { + var stack = [list]; + var result = []; + while (stack.length) { + var next = stack.pop(); + if (JX.isArray(next)) { + for (var ii = 0; ii < next.length; ii++) { + stack.push(next[ii]); + } + } else if (next === null) { + continue; + } else if (next === undefined) { + continue; + } else { + result.push(next); + } + } + + return result.reverse(); + } + + JX.enableDispatch(document.body, 'copy'); + JX.enableDispatch(window, 'selectionchange'); + + JX.Stratcom.listen('mousedown', null, onstartselect); + JX.Stratcom.listen('selectionchange', null, onchangeselect); + JX.Stratcom.listen('mouseup', null, onendselect); - // In Firefox, we have to create a
     and select the text in it, then
    -      // let the copy event fire. It has to be a 
     because Firefox won't
    -      // copy returns properly out of a div, even if it has 'whitespace: pre'.
    -      // There's been a bug open for 10 (!) years:
    -      //
    -      //   https://bugzilla.mozilla.org/show_bug.cgi?id=116083
    -
    -      var style = {
    -        position: 'absolute',
    -        left:     '-10000px'
    -      };
    -      var pre = JX.$N('pre', {style: style}, result);
    -      document.body.appendChild(pre);
    -
    -      // Select the text in the 
    .
    -      var range = document.createRange();
    -      range.selectNodeContents(pre);
    -      selection.removeAllRanges();
    -      selection.addRange(range);
    -
    -      setTimeout(function() { JX.DOM.remove(pre); }, 0);
    -
    -      // TODO: I tried to restore the old selection range but it doesn't seem
    -      // to work or give me any errors. So you lose your selection when you
    -      // copy. Oh well?
    -    }
    -  };
    +  JX.Stratcom.listen('copy', null, oncopy);
     });
    diff --git a/webroot/rsrc/js/core/behavior-phabricator-nav.js b/webroot/rsrc/js/core/behavior-phabricator-nav.js
    deleted file mode 100644
    index 99cbe127c2..0000000000
    --- a/webroot/rsrc/js/core/behavior-phabricator-nav.js
    +++ /dev/null
    @@ -1,156 +0,0 @@
    -/**
    - * @provides javelin-behavior-phabricator-nav
    - * @requires javelin-behavior
    - *           javelin-behavior-device
    - *           javelin-stratcom
    - *           javelin-dom
    - *           javelin-magical-init
    - *           javelin-vector
    - *           javelin-request
    - *           javelin-util
    - * @javelin
    - */
    -
    -JX.behavior('phabricator-nav', function(config) {
    -
    -  var content = JX.$(config.contentID);
    -  var local = JX.$(config.localID);
    -  var main = JX.$(config.mainID);
    -  var drag = JX.$(config.dragID);
    -  var background = JX.$(config.backgroundID);
    -
    -
    -// - Flexible Navigation Column ------------------------------------------------
    -
    -
    -  var dragging;
    -  var track;
    -
    -  JX.enableDispatch(document.body, 'mousemove');
    -
    -  JX.DOM.listen(drag, 'mousedown', null, function(e) {
    -    dragging = JX.$V(e);
    -
    -    // Show the "col-resize" cursor on the whole document while we're
    -    // dragging, since the mouse will slip off the actual bar fairly often and
    -    // we don't want it to flicker.
    -    JX.DOM.alterClass(document.body, 'jx-drag-col', true);
    -
    -    track = [
    -      {
    -        element: local,
    -        parameter: 'width',
    -        start: JX.Vector.getDim(local).x,
    -        width: JX.Vector.getDim(local).x,
    -        minWidth: 1
    -      },
    -      {
    -        element: background,
    -        parameter: 'width',
    -        start: JX.Vector.getDim(background).x,
    -        minWidth: 1
    -      },
    -      {
    -        element: drag,
    -        parameter: 'left',
    -        start: JX.$V(drag).x
    -      },
    -      {
    -        element: content,
    -        parameter: 'marginLeft',
    -        start: parseInt(getComputedStyle(content).marginLeft, 10),
    -        width: JX.Vector.getDim(content).x,
    -        minWidth: 300,
    -        minScale: -1
    -      }
    -    ];
    -
    -    e.kill();
    -  });
    -
    -  JX.Stratcom.listen('mousemove', null, function(e) {
    -    if (!dragging) {
    -      return;
    -    }
    -
    -    var dx = JX.$V(e).x - dragging.x;
    -    var panel;
    -    var k;
    -
    -    for (k = 0; k < track.length; k++) {
    -      panel = track[k];
    -      if (!panel.minWidth) {
    -        continue;
    -      }
    -      var new_width = panel.width + (dx * (panel.minScale || 1));
    -      if (new_width < panel.minWidth) {
    -        dx = (panel.minWidth - panel.width) * panel.minScale;
    -      }
    -    }
    -
    -    for (k = 0; k < track.length; k++) {
    -      panel = track[k];
    -      var v = (panel.start + (dx * (panel.scale || 1)));
    -      panel.element.style[panel.parameter] = v + 'px';
    -    }
    -  });
    -
    -  JX.Stratcom.listen('mouseup', null, function(e) {
    -    if (!dragging) {
    -      return;
    -    }
    -    JX.DOM.alterClass(document.body, 'jx-drag-col', false);
    -    dragging = false;
    -  });
    -
    -
    -  function resetdrag() {
    -    local.style.width = '';
    -    background.style.width = '';
    -    drag.style.left = '';
    -    content.style.marginLeft = '';
    -  }
    -
    -  var collapsed = config.collapsed;
    -  JX.Stratcom.listen('differential-filetree-toggle', null, function(e) {
    -    collapsed = !collapsed;
    -    JX.DOM.alterClass(main, 'has-local-nav', !collapsed);
    -    JX.DOM.alterClass(main, 'has-drag-nav', !collapsed);
    -    resetdrag();
    -    new JX.Request('/settings/adjust/', JX.bag)
    -      .setData({ key : 'nav-collapsed', value : (collapsed ? 1 : 0) })
    -      .send();
    -  });
    -
    -
    -// - Scroll --------------------------------------------------------------------
    -
    -  // When the user scrolls or resizes the window, anchor the menu to to the top
    -  // of the navigation bar.
    -
    -  function onresize(e) {
    -    if (JX.Device.getDevice() != 'desktop') {
    -      return;
    -    }
    -
    -    local.style.top = Math.max(
    -      0,
    -      JX.$V(content).y - Math.max(0, JX.Vector.getScroll().y)) + 'px';
    -  }
    -
    -  local.style.position = 'fixed';
    -  local.style.bottom = 0;
    -  local.style.left = 0;
    -
    -  JX.Stratcom.listen(['scroll', 'resize'], null, onresize);
    -  onresize();
    -
    -
    -// - Navigation Reset ----------------------------------------------------------
    -
    -  JX.Stratcom.listen('phabricator-device-change', null, function(event) {
    -    resetdrag();
    -    onresize();
    -  });
    -
    -});
    diff --git a/webroot/rsrc/js/core/behavior-phabricator-remarkup-assist.js b/webroot/rsrc/js/core/behavior-phabricator-remarkup-assist.js
    index ef01e1d908..89d23ef60f 100644
    --- a/webroot/rsrc/js/core/behavior-phabricator-remarkup-assist.js
    +++ b/webroot/rsrc/js/core/behavior-phabricator-remarkup-assist.js
    @@ -3,16 +3,32 @@
      * @requires javelin-behavior
      *           javelin-stratcom
      *           javelin-dom
    + *           phabricator-phtize
      *           phabricator-textareautils
      *           javelin-workflow
    - *           phabricator-notification
      *           javelin-vector
    + *           phuix-autocomplete
    + *           javelin-mask
      */
     
     JX.behavior('phabricator-remarkup-assist', function(config) {
    +  var pht = JX.phtize(config.pht);
    +  var root = JX.$(config.rootID);
    +  var area = JX.DOM.find(root, 'textarea');
     
       var edit_mode = 'normal';
       var edit_root = null;
    +  var preview = null;
    +  var pinned = false;
    +
    +  // When we pin the comment area to the bottom of the window, we need to put
    +  // an extra spacer element at the bottom of the document so that it is
    +  // possible to scroll down far enough to see content at the end. Otherwise,
    +  // the last part of the document will be hidden behind the comment area when
    +  // the document is fully scrolled.
    +  var pinned_spacer = JX.$N(
    +    'div',
    +    {className: 'remarkup-assist-pinned-spacer'});
     
       function set_edit_mode(root, mode) {
         if (mode == edit_mode) {
    @@ -21,36 +37,88 @@ JX.behavior('phabricator-remarkup-assist', function(config) {
     
         // First, disable any active mode.
         if (edit_root) {
    -      if (edit_mode == 'order') {
    -        JX.DOM.alterClass(edit_root, 'remarkup-control-order-mode', false);
    +      if (edit_mode == 'fullscreen') {
    +        JX.DOM.alterClass(edit_root, 'remarkup-control-fullscreen-mode', false);
    +        JX.DOM.alterClass(document.body, 'remarkup-fullscreen-mode', false);
    +        JX.Mask.hide('jx-light-mask');
           }
    -      if (edit_mode == 'chaos') {
    -        JX.DOM.alterClass(edit_root, 'remarkup-control-chaos-mode', false);
    +
    +      area.style.height = '';
    +
    +      // If we're in preview mode, kick the preview back down to default
    +      // size.
    +      if (preview) {
    +        JX.DOM.show(area);
    +        resize_preview();
    +        JX.DOM.hide(area);
           }
    -      JX.DOM.find(edit_root, 'textarea').style.height = '';
         }
     
         edit_root = root;
         edit_mode = mode;
     
         // Now, apply the new mode.
    -    if (mode == 'order') {
    -      JX.DOM.alterClass(edit_root, 'remarkup-control-order-mode', true);
    +    if (mode == 'fullscreen') {
    +      JX.DOM.alterClass(edit_root, 'remarkup-control-fullscreen-mode', true);
    +      JX.DOM.alterClass(document.body, 'remarkup-fullscreen-mode', true);
    +      JX.Mask.show('jx-light-mask');
    +
    +      // If we're in preview mode, expand the preview to full-size.
    +      if (preview) {
    +        JX.DOM.show(area);
    +      }
    +
           resizearea();
    +
    +      if (preview) {
    +        resize_preview();
    +        JX.DOM.hide(area);
    +      }
         }
     
    -    if (mode == 'chaos') {
    -      JX.DOM.alterClass(edit_root, 'remarkup-control-chaos-mode', true);
    +    JX.DOM.focus(area);
    +  }
    +
    +  function set_pinned_mode(root, mode) {
    +    if (mode === pinned) {
    +      return;
         }
     
    -    JX.DOM.focus(JX.DOM.find(edit_root, 'textarea'));
    +    pinned = mode;
    +
    +    var container = get_pinned_container(root);
    +    JX.DOM.alterClass(container, 'remarkup-assist-pinned', pinned);
    +
    +    if (pinned) {
    +      JX.DOM.appendContent(document.body, pinned_spacer);
    +    } else {
    +      JX.DOM.remove(pinned_spacer);
    +    }
    +
    +    resizearea();
    +
    +    JX.DOM.focus(area);
    +  }
    +
    +  function get_pinned_container(root) {
    +    return JX.DOM.findAbove(root, 'div', 'phui-comment-form');
       }
     
       function resizearea() {
    +    // If we're in the pinned comment mode, resize the pinned spacer to be the
    +    // same size as the pinned form. This allows users to scroll to the bottom
    +    // of the document by creating extra footer space to scroll through.
    +    if (pinned) {
    +      var container = get_pinned_container(root);
    +      var d = JX.Vector.getDim(container);
    +      d.x = null;
    +      d.setDim(pinned_spacer);
    +    }
    +
         if (!edit_root) {
           return;
         }
    -    if (edit_mode != 'order') {
    +    if (edit_mode != 'fullscreen') {
           return;
         }
     
    @@ -58,8 +126,6 @@ JX.behavior('phabricator-remarkup-assist', function(config) {
         // "top" and "bottom", and height "auto" renders as two lines high. Force
         // it to the correct height with Javascript.
     
    -    var area = JX.DOM.find(edit_root, 'textarea');
    -
         var v = JX.Vector.getViewport();
         v.x = null;
         v.y -= 26;
    @@ -69,52 +135,23 @@ JX.behavior('phabricator-remarkup-assist', function(config) {
     
       JX.Stratcom.listen('resize', null, resizearea);
     
    -
       JX.Stratcom.listen('keydown', null, function(e) {
    -    if (edit_mode == 'chaos') {
    -      cause_chaos();
    -    }
    -
         if (e.getSpecialKey() != 'esc') {
           return;
         }
     
    -    if (edit_mode != 'order') {
    +    if (edit_mode != 'fullscreen') {
           return;
         }
     
         e.kill();
         set_edit_mode(edit_root, 'normal');
    +    set_pinned_mode(root, false);
       });
     
    -  var chaos_states = [];
    -  function cause_chaos() {
    -    for (var ii = 0; ii <= 13; ii++) {
    -      if (Math.random() > 0.98) {
    -        chaos_states[ii] = !chaos_states[ii];
    -      }
    -      JX.DOM.alterClass(
    -        edit_root,
    -        'remarkup-control-chaos-mode-' + ii,
    -        !!chaos_states[ii]);
    -    }
    -
    -    if (Math.random() > 0.98) {
    -      var n = new JX.Notification()
    -        .setContent("Hey, listen!")
    -        .setDuration(1000 + Math.random() * 6000);
    -
    -      if (Math.random() > 0.75) {
    -        n.alterClassName('jx-notification-alert', true);
    -      }
    -
    -      n.show();
    -    }
    -  }
    -
       function update(area, l, m, r) {
         // Replace the selection with the entire assisted text.
    -    JX.TextAreaUtils.setSelectionText(area, l + m + r);
    +    JX.TextAreaUtils.setSelectionText(area, l + m + r, true);
     
         // Now, select just the middle part. For instance, if the user clicked
         // "B" to create bold text, we insert '**bold**' but just select the word
    @@ -126,44 +163,75 @@ JX.behavior('phabricator-remarkup-assist', function(config) {
           range.start + l.length + m.length);
       }
     
    -  function assist(area, action, root) {
    +  function prepend_char_to_lines(ch, sel, def) {
    +    if (sel) {
    +      sel = sel.split('\n');
    +    } else {
    +      sel = [def];
    +    }
    +
    +    if (ch === '>') {
    +      for(var i=0; i < sel.length; i++) {
    +        if (sel[i][0] === '>') {
    +          ch = '>';
    +        } else {
    +          ch = '> ';
    +        }
    +        sel[i] = ch + sel[i];
    +      }
    +      return sel.join('\n');
    +    }
    +
    +    return sel.join('\n' + ch);
    +  }
    +
    +  function assist(area, action, root, button) {
         // If the user has some text selected, we'll try to use that (for example,
         // if they have a word selected and want to bold it). Otherwise we'll insert
         // generic text.
         var sel = JX.TextAreaUtils.getSelectionText(area);
         var r = JX.TextAreaUtils.getSelectionRange(area);
    +    var ch;
     
         switch (action) {
    -      case 'b':
    -        update(area, '**', sel || 'bold text', '**');
    -        break;
    -      case 'i':
    -        update(area, '//', sel || 'italic text', '//');
    +      case 'fa-bold':
    +        update(area, '**', sel || pht('bold text'), '**');
             break;
    -      case 'tt':
    -        update(area, '`', sel || 'monospaced text', '`');
    +      case 'fa-italic':
    +        update(area, '//', sel || pht('italic text'), '//');
             break;
    -      case 'ul':
    -      case 'ol':
    -        var ch = (action == 'ol') ? '  # ' : '  - ';
    -        if (sel) {
    -          sel = sel.split("\n");
    +      case 'fa-link':
    +        var name = pht('name');
    +        if (/^https?:/i.test(sel)) {
    +          update(area, '[[ ' + sel + ' | ', name, ' ]]');
             } else {
    -          sel = ["List Item"];
    +          update(area, '[[ ', pht('URL'), ' | ' + (sel || name) + ' ]]');
             }
    -        sel = sel.join("\n" + ch);
    -        update(area, ((r.start === 0) ? "" : "\n\n") + ch, sel, "\n\n");
             break;
    -      case 'code':
    -        sel = sel || "foreach ($list as $item) {\n  work_miracles($item);\n}";
    -        sel = sel.split("\n");
    -        sel = "  " + sel.join("\n  ");
    -        update(area, ((r.start === 0) ? "" : "\n\n"), sel, "\n\n");
    +      case 'fa-text-width':
    +        update(area, '`', sel || pht('monospaced text'), '`');
             break;
    -      case 'table':
    -        update(area, (r.start === 0 ? '' : '\n\n') + '| ', sel || 'data', ' |');
    +      case 'fa-list-ul':
    +      case 'fa-list-ol':
    +        ch = (action == 'fa-list-ol') ? '  # ' : '  - ';
    +        sel = prepend_char_to_lines(ch, sel, pht('List Item'));
    +        update(area, ((r.start === 0) ? '' : '\n\n') + ch, sel, '\n\n');
             break;
    -      case 'meme':
    +      case 'fa-code':
    +        sel = sel || 'foreach ($list as $item) {\n  work_miracles($item);\n}';
    +        var code_prefix = (r.start === 0) ? '' : '\n';
    +        update(area, code_prefix + '```\n', sel, '\n```');
    +        break;
    +      case 'fa-quote-right':
    +        ch = '>';
    +        sel = prepend_char_to_lines(ch, sel, pht('Quoted Text'));
    +        update(area, ((r.start === 0) ? '' : '\n\n'), sel, '\n\n');
    +        break;
    +      case 'fa-table':
    +        var table_prefix = (r.start === 0 ? '' : '\n\n');
    +        update(area, table_prefix + '| ', sel || pht('data'), ' |');
    +        break;
    +      case 'fa-meh-o':
             new JX.Workflow('/macro/meme/create/')
               .setHandler(function(response) {
                 update(
    @@ -174,28 +242,116 @@ JX.behavior('phabricator-remarkup-assist', function(config) {
               })
               .start();
             break;
    -      case 'image':
    -        new JX.Workflow('/file/uploaddialog/').start();
    +      case 'fa-cloud-upload':
    +        new JX.Workflow('/file/uploaddialog/')
    +          .setHandler(function(response) {
    +            var files = response.files;
    +            for (var ii = 0; ii < files.length; ii++) {
    +              var file = files[ii];
    +
    +              var upload = new JX.PhabricatorFileUpload()
    +                .setID(file.id)
    +                .setPHID(file.phid)
    +                .setURI(file.uri);
    +
    +              JX.TextAreaUtils.insertFileReference(area, upload);
    +            }
    +          })
    +          .start();
             break;
    -      case 'chaos':
    -        if (edit_mode == 'chaos') {
    +      case 'fa-arrows-alt':
    +        set_pinned_mode(root, false);
    +        if (edit_mode == 'fullscreen') {
               set_edit_mode(root, 'normal');
             } else {
    -          set_edit_mode(root, 'chaos');
    +          set_edit_mode(root, 'fullscreen');
             }
             break;
    -      case 'order':
    -        if (edit_mode == 'order') {
    -          set_edit_mode(root, 'normal');
    +      case 'fa-eye':
    +        if (!preview) {
    +          preview = JX.$N(
    +            'div',
    +            {
    +              className: 'remarkup-inline-preview'
    +            },
    +            null);
    +
    +          area.parentNode.insertBefore(preview, area);
    +          JX.DOM.alterClass(button, 'preview-active', true);
    +          JX.DOM.alterClass(root, 'remarkup-preview-active', true);
    +          resize_preview();
    +          JX.DOM.hide(area);
    +
    +          update_preview();
             } else {
    -          set_edit_mode(root, 'order');
    +          JX.DOM.show(area);
    +          resize_preview(true);
    +          JX.DOM.remove(preview);
    +          preview = null;
    +
    +          JX.DOM.alterClass(button, 'preview-active', false);
    +          JX.DOM.alterClass(root, 'remarkup-preview-active', false);
             }
             break;
    +      case 'fa-thumb-tack':
    +        // If we're pinning, kick us out of fullscreen mode first.
    +        set_edit_mode(edit_root, 'normal');
    +
    +        // Now pin or unpin the area.
    +        set_pinned_mode(root, !pinned);
    +        break;
    +
    +    }
    +  }
    +
    +  function resize_preview(restore) {
    +    if (!preview) {
    +      return;
         }
    +
    +    var src;
    +    var dst;
    +
    +    if (restore) {
    +      src = preview;
    +      dst = area;
    +    } else {
    +      src = area;
    +      dst = preview;
    +    }
    +
    +    var d = JX.Vector.getDim(src);
    +    d.x = null;
    +    d.setDim(dst);
    +  }
    +
    +  function update_preview() {
    +    var value = area.value;
    +
    +    var data = {
    +      text: value
    +    };
    +
    +    var onupdate = function(r) {
    +      if (area.value !== value) {
    +        return;
    +      }
    +
    +      if (!preview) {
    +        return;
    +      }
    +
    +      JX.DOM.setContent(preview, JX.$H(r.content).getFragment());
    +    };
    +
    +    new JX.Workflow('/transactions/remarkuppreview/', data)
    +      .setHandler(onupdate)
    +      .start();
       }
     
    -  JX.Stratcom.listen(
    -    ['click'],
    +  JX.DOM.listen(
    +    root,
    +    'click',
         'remarkup-assist',
         function(e) {
           var data = e.getNodeData('remarkup-assist');
    @@ -205,10 +361,66 @@ JX.behavior('phabricator-remarkup-assist', function(config) {
     
           e.kill();
     
    -      var root = e.getNode('remarkup-assist-control');
    -      var area = JX.DOM.find(root, 'textarea');
    +      if (config.disabled) {
    +        return;
    +      }
     
    -      assist(area, data.action, root);
    +      assist(area, data.action, root, e.getNode('remarkup-assist'));
         });
     
    +  var autocomplete = new JX.PHUIXAutocomplete()
    +    .setArea(area);
    +
    +  for (var k in config.autocompleteMap) {
    +    autocomplete.addAutocomplete(k, config.autocompleteMap[k]);
    +  }
    +
    +  autocomplete.start();
    +
    +  if (config.canPin) {
    +    new JX.KeyboardShortcut('z', pht('key-help'))
    +      .setGroup('xactions')
    +      .setHandler(function() {
    +        set_pinned_mode(root, !pinned);
    +      })
    +      .register();
    +  }
    +
    +  if (config.sendOnEnter) {
    +    // Send on enter if the shift key is not held.
    +    JX.DOM.listen(area, 'keydown', null,
    +      function(e) {
    +        if (e.getSpecialKey() != 'return') {
    +          return;
    +        }
    +
    +        // Let other listeners (particularly the inline autocomplete) have a
    +        // chance to handle this event.
    +        if (JX.Stratcom.pass()) {
    +          return;
    +        }
    +
    +        var raw = e.getRawEvent();
    +        if (raw.shiftKey) {
    +          // If the shift key is pressed, let the browser write a newline into
    +          // the textarea.
    +          return;
    +        }
    +
    +        if (edit_mode == 'fullscreen') {
    +          // Don't send on enter in fullscreen
    +          return;
    +        }
    +
    +        // From here on, interpret this as a "send" action, not a literal
    +        // newline.
    +        e.kill();
    +
    +        // This allows 'workflow' and similar actions to take effect.
    +        // Such as pontificate in Conpherence
    +        var form = e.getNode('tag:form');
    +        JX.DOM.invoke(form, 'didSyntheticSubmit');
    +      });
    +  }
    +
     });
    diff --git a/webroot/rsrc/js/core/behavior-read-only-warning.js b/webroot/rsrc/js/core/behavior-read-only-warning.js
    new file mode 100644
    index 0000000000..7c333be978
    --- /dev/null
    +++ b/webroot/rsrc/js/core/behavior-read-only-warning.js
    @@ -0,0 +1,23 @@
    +/**
    + * @provides javelin-behavior-read-only-warning
    + * @requires javelin-behavior
    + *           javelin-uri
    + *           phabricator-notification
    + */
    +
    +JX.behavior('read-only-warning', function(config) {
    +
    +  var n = new JX.Notification()
    +    .setContent(config.message)
    +    .setDuration(0)
    +    .alterClassName('jx-notification-read-only', true);
    +
    +  n.listen(
    +    'activate',
    +    function() {
    +      JX.$U(config.uri).go();
    +    });
    +
    +  n.show();
    +
    +});
    diff --git a/webroot/rsrc/js/core/behavior-redirect.js b/webroot/rsrc/js/core/behavior-redirect.js
    new file mode 100644
    index 0000000000..4f6e234c0a
    --- /dev/null
    +++ b/webroot/rsrc/js/core/behavior-redirect.js
    @@ -0,0 +1,9 @@
    +/**
    + * @provides javelin-behavior-redirect
    + * @requires javelin-behavior
    + *           javelin-uri
    + */
    +
    +JX.behavior('redirect', function(config) {
    +  JX.$U(config.uri).go();
    +});
    diff --git a/webroot/rsrc/js/core/behavior-refresh-csrf.js b/webroot/rsrc/js/core/behavior-refresh-csrf.js
    index bd236838ab..27c7a9d8ee 100644
    --- a/webroot/rsrc/js/core/behavior-refresh-csrf.js
    +++ b/webroot/rsrc/js/core/behavior-refresh-csrf.js
    @@ -3,6 +3,8 @@
      * @requires javelin-request
      *           javelin-behavior
      *           javelin-dom
    + *           javelin-router
    + *           javelin-util
      *           phabricator-busy
      */
     
    @@ -48,12 +50,103 @@ JX.behavior('refresh-csrf', function(config) {
     
       // Additionally, add the CSRF token as an HTTP header to every AJAX request.
       JX.Request.listen('open', function(r) {
    -    r.getTransport().setRequestHeader(config.header, current_token);
    -    JX.Busy.start();
    +    var via = JX.$U(window.location).getRelativeURI();
    +
    +    var xport = r.getTransport();
    +
    +    xport.setRequestHeader(config.header, current_token);
    +    xport.setRequestHeader(config.viaHeader, via);
       });
     
    -  JX.Request.listen('finally', function(r) {
    -    JX.Busy.done();
    +  // Does this type of routable show the "Busy" spinner?
    +  var is_busy_type = function(type) {
    +    switch (type) {
    +      case 'workflow':
    +        return true;
    +    }
    +
    +    return false;
    +  };
    +
    +  // Does this type of routable show the "Loading" bar?
    +  var is_bar_type = function(type) {
    +    switch (type) {
    +      case 'content':
    +        return true;
    +    }
    +
    +    return false;
    +  };
    +
    +
    +  var queue = {};
    +  var count = 0;
    +  var node;
    +
    +  // Redraw the loading bar.
    +  var redraw_bar = function() {
    +    // If all requests have completed, hide the bar after a moment.
    +    if (!count) {
    +      if (node) {
    +        node.firstChild.style.width = '100%';
    +        setTimeout(JX.bind(null, JX.DOM.remove, node), 500);
    +      }
    +      node = null;
    +      queue = {};
    +      return;
    +    }
    +
    +    // If we don't have the bar yet, draw it.
    +    if (!node) {
    +      node = JX.$N('div', {className: 'routing-bar'});
    +      document.body.appendChild(node);
    +      node.appendChild(JX.$N('div', {className: 'routing-progress'}));
    +    }
    +
    +    // Update the bar progress.
    +    var done = 0;
    +    var total = 0;
    +    for (var k in queue) {
    +      total++;
    +      if (queue[k]) {
    +        done++;
    +      }
    +    }
    +
    +    node.firstChild.style.width = (100 * (done / total)) + '%';
    +  };
    +
    +
    +  // Listen for queued requests.
    +  JX.Router.listen('queue', function(r) {
    +    var type = r.getType();
    +
    +    if (is_bar_type(type)) {
    +      queue[r.getID()] = false;
    +      count++;
    +      redraw_bar();
    +    }
    +
    +    if (is_busy_type(r.getType())) {
    +      JX.Busy.start();
    +    }
       });
     
    +
    +  // Listen for completed requests.
    +  JX.Router.listen('done', function(r) {
    +    var type = r.getType();
    +
    +    if (is_bar_type(type)) {
    +      queue[r.getID()] = true;
    +      count--;
    +      redraw_bar();
    +    }
    +
    +    if (is_busy_type(r.getType())) {
    +      JX.Busy.done();
    +    }
    +  });
    +
    +
     });
    diff --git a/webroot/rsrc/js/core/behavior-remarkup-load-image.js b/webroot/rsrc/js/core/behavior-remarkup-load-image.js
    new file mode 100644
    index 0000000000..a13f3b0d78
    --- /dev/null
    +++ b/webroot/rsrc/js/core/behavior-remarkup-load-image.js
    @@ -0,0 +1,45 @@
    +/**
    + * @provides javelin-behavior-remarkup-load-image
    + * @requires javelin-behavior
    + *           javelin-request
    + */
    +
    +JX.behavior('remarkup-load-image', function(config) {
    +
    +  function get_node() {
    +    try {
    +      return JX.$(config.imageID);
    +    } catch (ex) {
    +      return null;
    +    }
    +  }
    +
    +  function onload(r) {
    +    var node = get_node();
    +    if (!node) {
    +      return;
    +    }
    +
    +    node.src = r.imageURI;
    +  }
    +
    +  function onerror(r) {
    +    var node = get_node();
    +    if (!node) {
    +      return;
    +    }
    +
    +    var error = JX.$N(
    +      'div',
    +      {
    +        className: 'phabricator-remarkup-image-error'
    +      },
    +      r.info);
    +
    +    JX.DOM.replace(node, error);
    +  }
    +
    +  var request = new JX.Request(config.uri, onload);
    +  request.listen('error', onerror);
    +  request.send();
    +});
    diff --git a/webroot/rsrc/js/core/behavior-remarkup-preview.js b/webroot/rsrc/js/core/behavior-remarkup-preview.js
    index f703e56266..4e79c48b59 100644
    --- a/webroot/rsrc/js/core/behavior-remarkup-preview.js
    +++ b/webroot/rsrc/js/core/behavior-remarkup-preview.js
    @@ -8,16 +8,26 @@
     
     JX.behavior('remarkup-preview', function(config) {
     
    +  // Don't bother with any of this on mobile.
    +  if (JX.Device.getDevice() !== 'desktop') {
    +    return;
    +  }
    +
       var preview = JX.$(config.previewID);
       var control = JX.$(config.controlID);
     
       var callback = function(r) {
    -    JX.DOM.setContent(preview, JX.$H(r));
    +    // This currently accepts responses from two controllers:
    +    // Old: PhabricatorMarkupPreviewController
    +    // New: PhabricatorApplicationTransactionRemarkupPreviewController
    +    // TODO: Swap everything to just the new controller.
    +
    +    JX.DOM.setContent(preview, JX.$H(r.content || r));
       };
     
       var getdata = function() {
         return {
    -      text : control.value
    +      text: control.value
         };
       };
     
    diff --git a/webroot/rsrc/js/core/behavior-reorder-applications.js b/webroot/rsrc/js/core/behavior-reorder-applications.js
    new file mode 100644
    index 0000000000..3bb31270fd
    --- /dev/null
    +++ b/webroot/rsrc/js/core/behavior-reorder-applications.js
    @@ -0,0 +1,37 @@
    +/**
    + * @provides javelin-behavior-reorder-applications
    + * @requires javelin-behavior
    + *           javelin-stratcom
    + *           javelin-workflow
    + *           javelin-dom
    + *           phabricator-draggable-list
    + */
    +
    +JX.behavior('reorder-applications', function(config) {
    +
    +  var root = JX.$(config.listID);
    +
    +  var list = new JX.DraggableList('pinned-application', root)
    +    .setFindItemsHandler(function() {
    +      return JX.DOM.scry(root, 'li', 'pinned-application');
    +    });
    +
    +  list.listen('didDrop', function(node) {
    +    var nodes = list.findItems();
    +    var order = [];
    +    var key;
    +    for (var ii = 0; ii < nodes.length; ii++) {
    +      key = JX.Stratcom.getData(nodes[ii]).applicationClass;
    +      if (key) {
    +        order.push(key);
    +      }
    +    }
    +
    +    list.lock();
    +    JX.DOM.alterClass(node, 'drag-sending', true);
    +
    +    new JX.Workflow(config.panelURI, {order: order.join()})
    +      .start();
    +  });
    +
    +});
    diff --git a/webroot/rsrc/js/core/behavior-reveal-content.js b/webroot/rsrc/js/core/behavior-reveal-content.js
    index 06ae482efa..f6c2a21eca 100644
    --- a/webroot/rsrc/js/core/behavior-reveal-content.js
    +++ b/webroot/rsrc/js/core/behavior-reveal-content.js
    @@ -6,7 +6,7 @@
      * @javelin
      */
     
    -JX.behavior('phabricator-reveal-content', function(config) {
    +JX.behavior('phabricator-reveal-content', function() {
       JX.Stratcom.listen(
         'click',
         'reveal-content',
    diff --git a/webroot/rsrc/js/core/behavior-scrollbar.js b/webroot/rsrc/js/core/behavior-scrollbar.js
    new file mode 100644
    index 0000000000..06f92e1810
    --- /dev/null
    +++ b/webroot/rsrc/js/core/behavior-scrollbar.js
    @@ -0,0 +1,12 @@
    +/**
    + * @provides javelin-behavior-scrollbar
    + * @requires javelin-behavior
    + *           javelin-scrollbar
    + */
    +
    +JX.behavior('scrollbar', function(config) {
    +  var bar = new JX.Scrollbar(JX.$(config.nodeID));
    +  if (config.isMainContent) {
    +    bar.setAsScrollFrame();
    +  }
    +});
    diff --git a/webroot/rsrc/js/core/behavior-search-typeahead.js b/webroot/rsrc/js/core/behavior-search-typeahead.js
    index 49c116a1e1..0f5b4d1639 100644
    --- a/webroot/rsrc/js/core/behavior-search-typeahead.js
    +++ b/webroot/rsrc/js/core/behavior-search-typeahead.js
    @@ -7,6 +7,8 @@
      *           javelin-uri
      *           javelin-util
      *           javelin-stratcom
    + *           phabricator-prefab
    + *           phuix-icon-view
      */
     
     JX.behavior('phabricator-search-typeahead', function(config) {
    @@ -14,91 +16,95 @@ JX.behavior('phabricator-search-typeahead', function(config) {
       var datasource = new JX.TypeaheadOnDemandSource(config.src);
     
       function transform(object) {
    +    object = JX.Prefab.transformDatasourceResults(object);
    +
         var attr = {
           className: 'phabricator-main-search-typeahead-result'
         };
     
    -    if (object[6]) {
    -      attr.style = {backgroundImage: 'url('http://github.com/+object[6]+')'};
    +    if (object.imageURI) {
    +      attr.style = {backgroundImage: 'url('http://github.com/+object.imageURI+')'};
    +    }
    +
    +    var icon = null;
    +    if (object.icon) {
    +      icon = new JX.PHUIXIconView()
    +        .setIcon(object.icon)
    +        .setColor('lightgreytext')
    +        .getNode();
    +      icon = [icon, ' '];
         }
     
         var render = JX.$N(
           'span',
           attr,
           [
    -        JX.$N('span', {className: 'result-name'}, object[4] || object[0]),
    -        JX.$N('span', {className: 'result-type'}, object[5])
    +        JX.$N('span', {className: object.sprite}),
    +        JX.$N('span', {className: 'result-name'}, object.displayName),
    +        icon,
    +        JX.$N('span', {className: 'result-type'}, object.type)
           ]);
     
    -    return {
    -      name: object[0],
    -      display: render,
    -      uri: object[1],
    -      id: object[2],
    -      priority: object[3],
    -      type: object[7]
    -    };
    +    if (object.closed) {
    +      JX.DOM.alterClass(render, 'result-closed', true);
    +    }
    +
    +    object.display = render;
    +
    +    return object;
       }
     
       datasource.setTransformer(transform);
     
    -  // Sort handler that orders results by type (e.g., applications, users)
    -  // and then selects for good matches on the "priority" substrings if they
    -  // exist (for instance, username matches are preferred over real name
    -  // matches, and application name matches are preferred over application
    -  // flavor text matches).
    -
       var sort_handler = function(value, list, cmp) {
    -    var priority_hits = {};
    -    var type_priority = {
    -      'jump' : 1,
    -      'apps' : 2,
    -      'user' : 3,
    -      'symb' : 4
    -    };
    -
    -    var tokens = this.tokenize(value);
    +    // First, sort all the results normally.
    +    JX.bind(this, JX.Prefab.sortHandler, {}, value, list, cmp)();
     
    +    // Now we're going to apply some special rules to order results by type,
    +    // so applications always appear near the top, then users, etc.
         var ii;
    -    for (ii = 0; ii < list.length; ii++) {
    -      var item = list[ii];
    -      if (!item.priority) {
    -        continue;
    -      }
     
    -      for (var jj = 0; jj < tokens.length; jj++) {
    -        if (item.priority.substr(0, tokens[jj].length) == tokens[jj]) {
    -          priority_hits[item.id] = true;
    -        }
    -      }
    +    var type_order = [
    +      'jump',
    +      'apps',
    +      'proj',
    +      'user',
    +      'repo',
    +      'wiki',
    +      'symb',
    +      'misc'
    +    ];
    +
    +    var type_map = {};
    +    for (ii = 0; ii < type_order.length; ii++) {
    +      type_map[type_order[ii]] = true;
         }
     
    -    list.sort(function(u, v) {
    -      var u_type = type_priority[u.type] || 999;
    -      var v_type = type_priority[v.type] || 999;
    +    var buckets = {};
    +    for (ii = 0; ii < list.length; ii++) {
    +      var item = list[ii];
     
    -      if (u_type != v_type) {
    -        return u_type - v_type;
    +      var type = item.priorityType;
    +      if (!type_map.hasOwnProperty(type)) {
    +        type = 'misc';
           }
     
    -      if (priority_hits[u.id] != priority_hits[v.id]) {
    -        return priority_hits[v.id] ? 1 : -1;
    +      if (!buckets.hasOwnProperty(type)) {
    +        buckets[type] = [];
           }
     
    -      return cmp(u, v);
    -    });
    +      buckets[type].push(item);
    +    }
     
         // If we have more results than fit, limit each type of result to 3, so
         // we show 3 applications, then 3 users, etc. For jump items, we show only
         // one result.
    -    var type_count = 0;
    -    var current_type = null;
    -    for (ii = 0; ii < list.length; ii++) {
    -      if (list[ii].type != current_type) {
    -        current_type = list[ii].type;
    -        type_count = 1;
    -      } else {
    -        type_count++;
    +    var jj;
    +    var results = [];
    +    for (ii = 0; ii < type_order.length; ii++) {
    +      var current_type = type_order[ii];
    +      var type_list = buckets[current_type] || [];
    +      for (jj = 0; jj < type_list.length; jj++) {
     
             // Skip this item if:
             //   - it's a jump nav item, and we already have at least one jump
    @@ -106,15 +112,18 @@ JX.behavior('phabricator-search-typeahead', function(config) {
             //   - we have more items than will fit in the typeahead, and this
             //     is the 4..Nth result of its type.
     
    -        var skip = ((current_type == 'jump') && (type_count > 1)) ||
    -                   ((list.length > config.limit) && (type_count > 3));
    +        var skip = ((current_type == 'jump') && (jj >= 1)) ||
    +                   ((list.length > config.limit) && (jj >= 3));
             if (skip) {
    -          list.splice(ii, 1);
    -          ii--;
    +          continue;
             }
    +
    +        results.push(type_list[jj]);
           }
         }
     
    +    // Replace the list in place with the results.
    +    list.splice.apply(list, [0, list.length].concat(results));
       };
     
       datasource.setSortHandler(JX.bind(datasource, sort_handler));
    @@ -130,4 +139,128 @@ JX.behavior('phabricator-search-typeahead', function(config) {
       });
     
       typeahead.start();
    +
    +  JX.DOM.listen(JX.$(config.button), 'click', null, function () {
    +    typeahead.setPlaceholder('');
    +    typeahead.updatePlaceHolder();
    +  });
    +
    +
    +  // When the user navigates between applications, we need to update the
    +  // input in the document, the icon on the button, and the icon in the
    +  // menu.
    +  JX.Stratcom.listen(
    +    'quicksand-redraw',
    +    null,
    +    function(e) {
    +      var r = e.getData().newResponse;
    +      updateCurrentApplication(r.applicationClass, r.applicationSearchIcon);
    +    });
    +
    +  var current_app_icon;
    +  function updateCurrentApplication(app_class, app_icon) {
    +    current_app_icon = app_icon || config.defaultApplicationIcon;
    +
    +    // Update the icon on the button.
    +    var button = JX.$(config.selectorID);
    +    var data = JX.Stratcom.getData(button);
    +    if (data.value == config.appScope) {
    +      updateIcon(button, data, current_app_icon);
    +    }
    +
    +    // Set the hidden input to the new value.
    +    JX.$(config.applicationID).value = app_class;
    +  }
    +
    +  function updateIcon(button, data, new_icon) {
    +    var icon = JX.DOM.find(button, 'span', 'global-search-dropdown-icon');
    +    JX.DOM.alterClass(icon, data.icon, false);
    +    data.icon = new_icon;
    +    JX.DOM.alterClass(icon, data.icon, true);
    +  }
    +
    +  // Implement the scope selector menu for the global search.
    +  JX.Stratcom.listen('click', 'global-search-dropdown', function(e) {
    +    var data = e.getNodeData('global-search-dropdown');
    +    var button = e.getNode('global-search-dropdown');
    +    if (data.menu) {
    +      return;
    +    }
    +
    +    e.kill();
    +
    +    function updateValue(spec) {
    +      if (data.value == spec.value) {
    +        return;
    +      }
    +
    +      // Swap out the icon.
    +      updateIcon(button, data, spec.icon);
    +
    +      // Update the value.
    +      data.value = spec.value;
    +
    +      // Update the form input.
    +      var frame = button.parentNode;
    +      var input = JX.DOM.find(frame, 'input', 'global-search-dropdown-input');
    +      input.value = data.value;
    +
    +      new JX.Request(config.scopeUpdateURI)
    +        .setData({value: data.value})
    +        .send();
    +    }
    +
    +    var menu = new JX.PHUIXDropdownMenu(button)
    +      .setAlign('left');
    +    data.menu = menu;
    +
    +    menu.listen('open', function() {
    +      var list = new JX.PHUIXActionListView();
    +
    +      for (var ii = 0; ii < data.items.length; ii++) {
    +        var spec = data.items[ii];
    +
    +        // If this is the "Search Current Application" item and we've
    +        // navigated to a page which sent us new information about the
    +        // icon, update the icon so the menu reflects the icon for the
    +        // current application.
    +        if (spec.value == config.appScope) {
    +          if (current_app_icon !== undefined) {
    +            spec.icon = current_app_icon;
    +          }
    +        }
    +
    +        var item = new JX.PHUIXActionView()
    +          .setName(spec.name)
    +          .setIcon(spec.icon);
    +
    +        if (spec.value) {
    +          if (spec.value == data.value) {
    +            item.setSelected(true);
    +          }
    +
    +          var handler = function(spec, e) {
    +            e.prevent();
    +            menu.close();
    +            updateValue(spec);
    +          };
    +
    +          item.setHandler(JX.bind(null, handler, spec));
    +        } else if (spec.href) {
    +          item.setHref(spec.href);
    +          item.setHandler(function() { menu.close(); });
    +        } else {
    +          item.setLabel(true);
    +        }
    +
    +        list.addItem(item);
    +      }
    +
    +      menu.setContent(list.getNode());
    +    });
    +
    +    menu.open();
    +  });
    +
    +
     });
    diff --git a/webroot/rsrc/js/core/behavior-select-content.js b/webroot/rsrc/js/core/behavior-select-content.js
    new file mode 100644
    index 0000000000..b54b6308cf
    --- /dev/null
    +++ b/webroot/rsrc/js/core/behavior-select-content.js
    @@ -0,0 +1,23 @@
    +/**
    + * @provides javelin-behavior-select-content
    + * @requires javelin-behavior
    + *           javelin-stratcom
    + *           javelin-dom
    + * @javelin
    + */
    +
    +JX.behavior('select-content', function() {
    +  JX.Stratcom.listen(
    +    'click',
    +    'select-content',
    +    function(e) {
    +      e.kill();
    +
    +      var node = e.getNode('select-content');
    +      var data = JX.Stratcom.getData(node);
    +
    +      var target = JX.$(data.selectID);
    +      JX.DOM.focus(target);
    +      target.select();
    +    });
    +});
    diff --git a/webroot/rsrc/js/core/behavior-select-on-click.js b/webroot/rsrc/js/core/behavior-select-on-click.js
    new file mode 100644
    index 0000000000..fbba02886d
    --- /dev/null
    +++ b/webroot/rsrc/js/core/behavior-select-on-click.js
    @@ -0,0 +1,19 @@
    +/**
    + * @provides javelin-behavior-select-on-click
    + * @requires javelin-behavior
    + *           javelin-stratcom
    + *           javelin-dom
    + * @javelin
    + */
    +
    +JX.behavior('select-on-click', function() {
    +  JX.Stratcom.listen(
    +    'click',
    +    'select-on-click',
    +    function(e) {
    +      e.kill();
    +      var node = e.getNode('select-on-click');
    +      JX.DOM.focus(node);
    +      node.select();
    +    });
    +});
    diff --git a/webroot/rsrc/js/core/behavior-setup-check-https.js b/webroot/rsrc/js/core/behavior-setup-check-https.js
    new file mode 100644
    index 0000000000..01369f0024
    --- /dev/null
    +++ b/webroot/rsrc/js/core/behavior-setup-check-https.js
    @@ -0,0 +1,39 @@
    +/**
    + * @provides javelin-behavior-setup-check-https
    + * @requires javelin-behavior
    + *           javelin-uri
    + *           phabricator-notification
    + */
    +
    +JX.behavior('setup-check-https', function(config) {
    +
    +  var server_https = config.server_https;
    +
    +  var client_uri = new JX.URI(window.location.href);
    +  var client_protocol = client_uri.getProtocol();
    +  var client_https = (client_protocol === 'https');
    +
    +  if (server_https === client_https) {
    +    return;
    +  }
    +
    +  var doc_link = JX.$N(
    +    'a',
    +    {
    +      href: config.doc_href,
    +      target: '_blank'
    +    },
    +    config.doc_name);
    +
    +  var content = [
    +    config.message,
    +    ' ',
    +    doc_link,
    +  ];
    +
    +  new JX.Notification()
    +    .alterClassName('jx-notification-alert', true)
    +    .setContent(content)
    +    .setDuration(0)
    +    .show();
    +});
    diff --git a/webroot/rsrc/js/core/behavior-time-typeahead.js b/webroot/rsrc/js/core/behavior-time-typeahead.js
    new file mode 100644
    index 0000000000..6bee5a14ef
    --- /dev/null
    +++ b/webroot/rsrc/js/core/behavior-time-typeahead.js
    @@ -0,0 +1,151 @@
    +/**
    + * @provides javelin-behavior-time-typeahead
    + * @requires javelin-behavior
    + *           javelin-util
    + *           javelin-dom
    + *           javelin-stratcom
    + *           javelin-vector
    + *           javelin-typeahead-static-source
    + */
    +
    +JX.behavior('time-typeahead', function(config) {
    +  var start_date_control = JX.$(config.startTimeID);
    +  var end_date_control = config.endTimeID ? JX.$(config.endTimeID) : null;
    +  var format = config.format;
    +
    +  var end_date_tampered = false;
    +
    +  var datasource = new JX.TypeaheadStaticSource(config.timeValues);
    +  datasource.setTransformer(function(v) {
    +    var attributes = {'className' : 'phui-time-typeahead-value'};
    +    var display = JX.$N('div', attributes, v[1]);
    +    var object = {
    +      'id' : v[0],
    +      'name' : v[1],
    +      'display' : display,
    +      'uri' : null
    +    };
    +    return object;
    +  });
    +  datasource.setSortHandler(function(value, list) {
    +    list.sort(function(u,v){
    +      return (u.id > v.id) ? 1 : -1;
    +    });
    +  });
    +  datasource.setMaximumResultCount(24);
    +  var typeahead = new JX.Typeahead(
    +    start_date_control,
    +    JX.DOM.find(start_date_control, 'input', null));
    +  typeahead.setDatasource(datasource);
    +
    +  if (!end_date_control) {
    +    typeahead.start();
    +    return;
    +  }
    +
    +  var start_time_control = JX.DOM.find(
    +    start_date_control,
    +    'input',
    +    'time-input');
    +  var end_time_control = JX.DOM.find(
    +    end_date_control,
    +    'input',
    +    'time-input');
    +
    +  JX.DOM.listen(start_time_control, 'input', null, function() {
    +    if (end_date_tampered) {
    +      return;
    +    }
    +    var time = start_time_control.value;
    +    var end_value = getNewValue(time);
    +    if (end_value) {
    +      end_time_control.value = end_value;
    +    }
    +  });
    +
    +  typeahead.listen('choose', function(e) {
    +    if (end_date_tampered) {
    +      return;
    +    }
    +    var time = e.name;
    +    var end_value = getNewValue(time);
    +    if (end_value) {
    +      end_time_control.value = end_value;
    +    }
    +  });
    +
    +  JX.DOM.listen(end_date_control, 'input', null, function() {
    +    end_date_tampered = true;
    +  });
    +
    +
    +  function getNewValue(time) {
    +    var regex = /^([0-2]?\d)(?::([0-5]\d))?\s*((am|pm))?$/i;
    +
    +    if (!regex.test(time)) {
    +      return null;
    +    }
    +
    +    var results = regex.exec(time);
    +    var hours = parseInt(results[1], 10);
    +    var minutes = parseInt(results[2], 10) ? parseInt(results[2], 10) : 0;
    +
    +    var real_time = 0;
    +    var end_value = '';
    +
    +    var end_hours;
    +    var end_minutes;
    +
    +    if (format === 'H:i' && hours < 23) {
    +      end_hours = hours + 1;
    +
    +      if (end_hours > 9) {
    +        end_hours = end_hours.toString();
    +      } else {
    +        end_hours = '0' + end_hours.toString();
    +      }
    +
    +      if (minutes > 9) {
    +        end_minutes = minutes.toString();
    +      } else {
    +        end_minutes = '0' + minutes.toString();
    +      }
    +
    +      end_value = end_hours + ':' + end_minutes;
    +    } else if (format === 'g:i A') {
    +      if (/pm/i.test(results[3])) {
    +        real_time = 12*60;
    +      } else if (/am/i.test(results[3]) && hours == 12) {
    +        hours = 0;
    +      }
    +
    +      real_time = real_time + (hours * 60) + minutes;
    +
    +      var end_time = real_time + 60;
    +
    +      var end_meridian = 'AM';
    +      end_hours = Math.floor(end_time / 60);
    +
    +      if (end_hours == 12) {
    +        end_meridian = 'PM';
    +      } else if (end_hours > 12 && end_hours < 24) {
    +        end_hours = end_hours - 12;
    +        end_meridian = 'PM';
    +      } else if (end_hours == 24) {
    +        end_hours = end_hours - 12;
    +      }
    +
    +      end_minutes = end_time%60;
    +      if (end_minutes < 9) {
    +        end_minutes = '0' + end_minutes;
    +      }
    +
    +      end_value = end_hours + ':' + end_minutes + ' ' + end_meridian;
    +    }
    +
    +
    +    return end_value;
    +  }
    +
    +  typeahead.start();
    +});
    diff --git a/webroot/rsrc/js/core/behavior-toggle-class.js b/webroot/rsrc/js/core/behavior-toggle-class.js
    index ce55deb3dc..18663b0487 100644
    --- a/webroot/rsrc/js/core/behavior-toggle-class.js
    +++ b/webroot/rsrc/js/core/behavior-toggle-class.js
    @@ -13,20 +13,24 @@
      *
      * Optionally, you may provide a `state` key to set the default state of the
      * element.
    - *
    - * @group ui
      */
    -JX.behavior('toggle-class', function() {
    -  JX.Stratcom.listen(
    -    ['touchstart', 'mousedown'],
    -    'jx-toggle-class',
    -    function(e) {
    -      e.kill();
    +JX.behavior('toggle-class', function(config, statics) {
    +  function install() {
    +    JX.Stratcom.listen(
    +      'click',
    +      'jx-toggle-class',
    +      function(e) {
    +        e.kill();
    +
    +        var t = e.getNodeData('jx-toggle-class');
    +        t.state = !t.state;
    +        for (var k in t.map) {
    +          JX.DOM.alterClass(JX.$(k), t.map[k], t.state);
    +        }
    +      });
    +
    +    return true;
    +  }
     
    -      var t = e.getNodeData('jx-toggle-class');
    -      t.state = !t.state;
    -      for (var k in t.map) {
    -        JX.DOM.alterClass(JX.$(k), t.map[k], t.state);
    -      }
    -    });
    +  statics.install = statics.install || install();
     });
    diff --git a/webroot/rsrc/js/core/behavior-tooltip.js b/webroot/rsrc/js/core/behavior-tooltip.js
    index b6284bc76e..336a5b28d0 100644
    --- a/webroot/rsrc/js/core/behavior-tooltip.js
    +++ b/webroot/rsrc/js/core/behavior-tooltip.js
    @@ -7,7 +7,7 @@
      * @javelin
      */
     
    -JX.behavior('phabricator-tooltips', function(config) {
    +JX.behavior('phabricator-tooltips', function() {
     
       JX.Stratcom.listen(
         ['mouseover', 'mouseout'],
    @@ -18,7 +18,7 @@ JX.behavior('phabricator-tooltips', function(config) {
             return;
           }
     
    -      if (JX.Device.getDevice() != 'desktop') {
    +      if (e.getIsTouchEvent()) {
             return;
           }
     
    @@ -26,19 +26,28 @@ JX.behavior('phabricator-tooltips', function(config) {
     
           JX.Tooltip.show(
             e.getNode('has-tooltip'),
    -        data.size || 120,
    +        data.size || 160,
             data.align || 'N',
             data.tip);
         });
     
    +  function wipe() {
    +    JX.Tooltip.hide();
    +  }
    +
    +  // Hide tips when any key is pressed. This prevents tips from ending up locked
    +  // on screen if you make a keypress which removes the underlying node (for
    +  // example, submitting an inline comment in Differential). See T4586.
    +  JX.Stratcom.listen('keydown', null, wipe);
    +
    +
    +  // Hide tips on mouseup. This removes tips on buttons in dialogs after the
    +  // buttons are clicked.
    +  JX.Stratcom.listen('mouseup', null, wipe);
    +
       // When we leave the page, hide any visible tooltips. If we don't do this,
       // clicking a link with a tooltip and then hitting "back" will give you a
       // phantom tooltip.
    -  JX.Stratcom.listen(
    -    'unload',
    -    null,
    -    function(e) {
    -      JX.Tooltip.hide();
    -    });
    +  JX.Stratcom.listen('unload', null, wipe);
     
     });
    diff --git a/webroot/rsrc/js/core/behavior-user-menu.js b/webroot/rsrc/js/core/behavior-user-menu.js
    new file mode 100644
    index 0000000000..b74b9d36ab
    --- /dev/null
    +++ b/webroot/rsrc/js/core/behavior-user-menu.js
    @@ -0,0 +1,57 @@
    +/**
    + * @provides javelin-behavior-user-menu
    + * @requires javelin-behavior
    + */
    +
    +JX.behavior('user-menu', function(config) {
    +  var node = JX.$(config.menuID);
    +  var list = JX.$H(config.menu.items).getFragment().firstChild;
    +
    +  var menu = new JX.PHUIXDropdownMenu(node);
    +
    +  menu.listen('open', function() {
    +    menu.setContent(list);
    +  });
    +
    +  // When the user navigates to a new page, we may need to update the links
    +  // to documentation in the menu.
    +  JX.Stratcom.listen('quicksand-redraw', null, function(e) {
    +    var data = e.getData();
    +
    +    var new_help = data.newResponse.helpItems;
    +    var nodes;
    +    if (new_help) {
    +      nodes = JX.$H(new_help.items).getFragment().firstChild.children;
    +    } else {
    +      nodes = [];
    +    }
    +
    +    var ii;
    +
    +    var tail = [];
    +    for (ii = list.children.length - 1; ii >= 0; ii--) {
    +      var node = list.children[ii];
    +
    +      // Remove any old help items.
    +      if (JX.Stratcom.hasSigil(node.firstChild, 'help-item')) {
    +        JX.DOM.remove(node);
    +      }
    +
    +      // Place the logout items aside, if any exist.
    +      if (JX.Stratcom.hasSigil(node.firstChild, 'logout-item')) {
    +        JX.DOM.remove(node);
    +        tail.push(node);
    +      }
    +    }
    +
    +    while (nodes.length) {
    +      list.appendChild(nodes[0]);
    +    }
    +
    +    tail.reverse();
    +    for (ii = 0; ii < tail.length; ii++) {
    +      list.appendChild(tail[ii]);
    +    }
    +  });
    +
    +});
    diff --git a/webroot/rsrc/js/core/behavior-watch-anchor.js b/webroot/rsrc/js/core/behavior-watch-anchor.js
    index 6c8327910d..4286d02474 100644
    --- a/webroot/rsrc/js/core/behavior-watch-anchor.js
    +++ b/webroot/rsrc/js/core/behavior-watch-anchor.js
    @@ -8,50 +8,123 @@
     
     JX.behavior('phabricator-watch-anchor', function() {
     
    -  var highlighted;
    +  // When the user loads a page with an "#anchor" or changes the "#anchor" on
    +  // an existing page, we try to scroll the page to the relevant location.
     
    -  function highlight() {
    -    highlighted && JX.DOM.alterClass(highlighted, 'anchor-target', false);
    -    try {
    -      highlighted = JX.$('anchor-' + window.location.hash.replace('#', ''));
    -    } catch (ex) {
    -      highlighted = null;
    -    }
    -    highlighted && JX.DOM.alterClass(highlighted, 'anchor-target', true);
    -  }
    +  // Browsers do this on their own, but we have some additional rules to try
    +  // to match anchors more flexibly and handle cases where an anchor is not
    +  // yet present in the document because something is still loading or
    +  // rendering it, often via Ajax.
     
    -  // Defer invocation so other listeners can update the document.
    -  function defer_highlight() {
    -    setTimeout(highlight, 0);
    -  }
    +  // Number of milliseconds we'll keep trying to find an anchor for.
    +  var wait_max = 5000;
    +
    +  // Wait between retries.
    +  var wait_ms = 100;
    +
    +  var target;
    +  var display_target;
    +  var retry_ms;
     
    -  // In some cases, we link to an anchor but the anchor target ajaxes in
    -  // later. If it pops in within the first few seconds, jump to it.
       function try_anchor() {
    +    retry_ms = wait_max;
    +    seek_anchor();
    +  }
    +
    +  function seek_anchor() {
         var anchor = window.location.hash.replace('#', '');
    -    try {
    -      // If the anchor exists, assume the browser handled the jump.
    -      if (anchor) {
    -        JX.$(anchor);
    +
    +    if (!anchor.length) {
    +      return;
    +    }
    +
    +    var ii;
    +    var node = null;
    +
    +    // When the user navigates to "#abc", we'll try to find a node with
    +    // either ID "abc" or ID "anchor-abc".
    +    var ids = [anchor, 'anchor-' + anchor];
    +
    +    for (ii = 0; ii < ids.length; ii++) {
    +      try {
    +        node = JX.$(ids[ii]);
    +        break;
    +      } catch (e) {
    +        // Continue.
           }
    -      defer_highlight();
    -    } catch (e) {
    -      var n = 50;
    -      var try_anchor_again = function () {
    -        try {
    -          window.scrollTo(0, JX.$V(JX.$(anchor)).y - 60);
    -          defer_highlight();
    -        } catch (e) {
    -          if (n--) {
    -            setTimeout(try_anchor_again, 100);
    -          }
    +    }
    +
    +    // If we haven't found a matching node yet, look for an "" tag with
    +    // a "name" attribute that has our anchor as a prefix. For example, you
    +    // can navigate to "#cat" and we'll match "#cat-and-mouse".
    +
    +    if (!node) {
    +      var anchor_nodes = JX.DOM.scry(document.body, 'a');
    +      for (ii = 0; ii < anchor_nodes.length; ii++) {
    +        if (!anchor_nodes[ii].name) {
    +          continue;
    +        }
    +
    +        if (anchor_nodes[ii].name.substring(0, anchor.length) === anchor) {
    +          node = anchor_nodes[ii];
    +          break;
             }
    -      };
    -      try_anchor_again();
    +      }
    +    }
    +
    +    // If we already have an anchor highlighted, unhighlight it and throw
    +    // it away if it doesn't match the new target.
    +    if (target && (target !== node)) {
    +      JX.DOM.alterClass(display_target, 'anchor-target', false);
    +      target = null;
    +      display_target = null;
    +    }
    +
    +    // If we didn't find a matching anchor, try again soon. This allows
    +    // rendering logic some time to complete Ajax requests and draw elements
    +    // onto the page.
    +    if (!node) {
    +      if (retry_ms > 0) {
    +        retry_ms -= wait_ms;
    +        setTimeout(try_anchor, wait_ms);
    +        return;
    +      }
    +    }
    +
    +    // If we've found a new target, highlight it.
    +    if (target !== node) {
    +      target = node;
    +
    +      // If there's an "anchor-container" parent element, we'll make the
    +      // display adjustment to that node instead. For example, this is used
    +      // by the timeline to highlight timeline stories.
    +
    +      var container;
    +
    +      try {
    +        container = JX.DOM.findAbove(node, null, 'anchor-container');
    +      } catch (ex) {
    +        // Ignore.
    +      }
    +
    +      if (container) {
    +        display_target = container;
    +      } else {
    +        display_target = node;
    +      }
    +
    +      JX.DOM.alterClass(display_target, 'anchor-target', true);
    +    }
    +
    +    // Try to scroll to the new target.
    +    try {
    +      var pos = JX.Vector.getPosWithScroll(node);
    +      JX.DOM.scrollToPosition(0, pos.y - 60);
    +    } catch (e) {
    +      // Ignore issues with scrolling the document.
         }
       }
     
       JX.Stratcom.listen('hashchange', null, try_anchor);
       try_anchor();
    -
     });
    diff --git a/webroot/rsrc/js/core/behavior-workflow.js b/webroot/rsrc/js/core/behavior-workflow.js
    index a786f098a2..6f8f839978 100644
    --- a/webroot/rsrc/js/core/behavior-workflow.js
    +++ b/webroot/rsrc/js/core/behavior-workflow.js
    @@ -4,11 +4,38 @@
      *           javelin-stratcom
      *           javelin-workflow
      *           javelin-dom
    + *           javelin-router
      */
     
     JX.behavior('workflow', function() {
     
    -  // Listen for both real
    +  // Queue a workflow at elevated priority. The user just clicked or submitted
    +  // something, so service this before loading background content.
    +  var queue = function(workflow) {
    +    var routable = workflow.getRoutable()
    +      .setPriority(2000)
    +      .setType('workflow');
    +
    +    JX.Router.getInstance().queue(routable);
    +  };
    +
    +  // If a user clicks an alternate submit button, make sure it gets marshalled
    +  // into the workflow.
    +  JX.Stratcom.listen(
    +    'click',
    +    ['workflow', 'tag:form', 'alternate-submit-button'],
    +    function(e) {
    +      e.prevent();
    +
    +      var target = e.getNode('alternate-submit-button');
    +      var form = e.getNode('tag:form');
    +      var button = {};
    +      button[target.name] = target.value || true;
    +
    +      JX.DOM.invoke(form, 'didSyntheticSubmit', {extra: button});
    +    });
    +
    +  // Listen for both real and synthetic submit events.
       JX.Stratcom.listen(
         ['submit', 'didSyntheticSubmit'],
         ['workflow', 'tag:form'],
    @@ -17,11 +44,15 @@ JX.behavior('workflow', function() {
             return;
           }
     
    +      var data = e.getData();
    +      var extra = (data && data.extra) || {};
    +
           // NOTE: We activate workflow if any parent node has the "workflow" sigil,
           // not just the 
    itself. e.prevent(); - JX.Workflow.newFromForm(e.getNode('tag:form')).start(); + + queue(JX.Workflow.newFromForm(e.getNode('tag:form'), extra)); }); JX.Stratcom.listen( @@ -51,7 +82,7 @@ JX.behavior('workflow', function() { } e.prevent(); - JX.Workflow.newFromLink(e.getNode('tag:a')).start(); + queue(JX.Workflow.newFromLink(e.getNode('tag:a'))); }); }); diff --git a/webroot/rsrc/js/core/darkconsole/DarkLog.js b/webroot/rsrc/js/core/darkconsole/DarkLog.js new file mode 100644 index 0000000000..d22f433e3e --- /dev/null +++ b/webroot/rsrc/js/core/darkconsole/DarkLog.js @@ -0,0 +1,47 @@ +/** + * @provides phabricator-darklog + * @javelin + */ + +JX.install('DarkLog', { + + construct: function() { + this._messages = []; + }, + + members: { + _node: null, + _messages: null, + + addMessage: function(message) { + var node = message.getNode(); + + this._messages.push(message); + if (this._node) { + this._append([node]); + } + + return this; + }, + + setNode: function(node) { + var nodes = []; + for (var ii = 0; ii < this._messages.length; ii++) { + nodes.push(this._messages[ii].getNode()); + } + + this._node = node; + this._append(nodes); + + return this; + }, + + _append: function(nodes) { + for (var ii = 0; ii < nodes.length; ii++) { + this._node.appendChild(nodes[ii]); + } + } + + } + +}); diff --git a/webroot/rsrc/js/core/darkconsole/DarkMessage.js b/webroot/rsrc/js/core/darkconsole/DarkMessage.js new file mode 100644 index 0000000000..2fd7697706 --- /dev/null +++ b/webroot/rsrc/js/core/darkconsole/DarkMessage.js @@ -0,0 +1,37 @@ +/** + * @provides phabricator-darkmessage + * @javelin + */ + +JX.install('DarkMessage', { + + construct: function() { + + }, + + members: { + _node: null, + _message: null, + + setMessage: function(message) { + this._message = message; + + JX.DOM.setContent(this.getNode(), message); + + return this; + }, + + getNode: function() { + if (!this._node) { + this._node = JX.$N( + 'div', + { + className: 'dark-console-log-message' + }); + } + + return this._node; + } + } + +}); diff --git a/webroot/rsrc/js/core/darkconsole/behavior-dark-console.js b/webroot/rsrc/js/core/darkconsole/behavior-dark-console.js new file mode 100644 index 0000000000..fc7b04210b --- /dev/null +++ b/webroot/rsrc/js/core/darkconsole/behavior-dark-console.js @@ -0,0 +1,428 @@ +/** + * @provides javelin-behavior-dark-console + * @requires javelin-behavior + * javelin-stratcom + * javelin-util + * javelin-dom + * javelin-request + * phabricator-keyboard-shortcut + * phabricator-darklog + * phabricator-darkmessage + */ + +JX.behavior('dark-console', function(config, statics) { + + // Do first-time setup. + function setup_console() { + init_console(config.visible); + + statics.selected = config.selected; + + install_shortcut(); + + if (config.headers) { + // If the main page had profiling enabled, also enable it for any Ajax + // requests. + JX.Request.listen('open', function(r) { + for (var k in config.headers) { + r.getTransport().setRequestHeader(k, config.headers[k]); + } + }); + } + + // When the user clicks a tab, select it. + JX.Stratcom.listen('click', 'dark-console-tab', function(e) { + e.kill(); + select_tab(e.getNodeData('dark-console-tab')['class']); + }); + + JX.Stratcom.listen( + 'quicksand-redraw', + null, + function (e) { + var data = e.getData(); + var new_console; + if (data.fromServer) { + new_console = JX.$('darkconsole'); + // The correct key has to be pulled from the rendered console + statics.quicksand_key = new_console.getAttribute('data-console-key'); + statics.quicksand_color = + new_console.getAttribute('data-console-color'); + } else { + // we need to add a console holder back in since we blew it away + new_console = JX.$N( + 'div', + { id : 'darkconsole', class : 'dark-console' }); + JX.DOM.prependContent( + JX.$('phabricator-standard-page-body'), + new_console); + } + JX.DOM.replace(new_console, statics.root); + }); + + return statics.root; + } + + function init_console(visible) { + statics.root = JX.$('darkconsole'); + statics.req = {all: {}, current: null}; + statics.tab = {all: {}, current: null}; + + statics.el = {}; + + statics.el.reqs = JX.$N('div', {className: 'dark-console-requests'}); + statics.root.appendChild(statics.el.reqs); + + statics.el.tabs = JX.$N('div', {className: 'dark-console-tabs'}); + statics.root.appendChild(statics.el.tabs); + + statics.el.panel = JX.$N('div', {className: 'dark-console-panel'}); + statics.root.appendChild(statics.el.panel); + + statics.el.load = JX.$N('div', {className: 'dark-console-load'}); + statics.root.appendChild(statics.el.load); + + statics.cache = {}; + + statics.visible = visible; + + return statics.root; + } + + // Add a new request to the console (initial page load, or new Ajax response). + function add_request(config) { + + // Ignore DarkConsole data requests. + if (config.uri.match(new RegExp('^/~/data/'))) { + return; + } + + var attr = { + className: 'dark-console-request', + sigil: 'dark-console-request', + title: config.uri, + meta: config, + href: '#' + }; + + var link = JX.$N('a', attr, [get_bullet(config.color), ' ', config.uri]); + statics.el.reqs.appendChild(link); + statics.req.all[config.key] = link; + + // When the user clicks a request, select it. + JX.DOM.listen( + link, + 'click', + 'dark-console-request', + function(e) { + e.kill(); + select_request(e.getNodeData('dark-console-request').key); + }); + + if (!statics.req.current) { + select_request(config.key); + } + } + + function get_bullet(color) { + if (!color) { + return null; + } + return JX.$N('span', {style: {color: color}}, '\u2022'); + } + + // Select a request (on load, or when the user clicks one). + function select_request(key) { + if (statics.req.current) { + JX.DOM.alterClass( + statics.req.all[statics.req.current], + 'dark-selected', + false); + } + statics.req.current = key; + JX.DOM.alterClass( + statics.req.all[statics.req.current], + 'dark-selected', + true); + + if (statics.visible) { + draw_request(key); + } + } + + // After the user selects a request, draw its tabs. + function draw_request(key) { + var cache = statics.cache; + + if (cache[key]) { + render_request(key); + return; + } + + new JX.Request( + '/~/data/' + key + '/', + function(r) { + cache[key] = r; + if (statics.req.current == key) { + render_request(key); + } + }) + .send(); + + show_loading(); + } + + // Show the loading indicator. + function show_loading() { + JX.DOM.hide(statics.el.tabs); + JX.DOM.hide(statics.el.panel); + JX.DOM.show(statics.el.load); + } + + // Hide the loading indicator. + function hide_loading() { + JX.DOM.show(statics.el.tabs); + JX.DOM.show(statics.el.panel); + JX.DOM.hide(statics.el.load); + } + + function render_request(key) { + var data = statics.cache[key]; + + statics.tab.all = {}; + + var links = []; + var first = null; + for (var ii = 0; ii < data.tabs.length; ii++) { + var tab = data.tabs[ii]; + var attr = { + className: 'dark-console-tab', + sigil: 'dark-console-tab', + meta: tab, + href: '#' + }; + + var link = JX.$N('a', attr, [get_bullet(tab.color), ' ', tab.name]); + links.push(link); + statics.tab.all[tab['class']] = link; + first = first || tab['class']; + } + + JX.DOM.setContent(statics.el.tabs, links); + + if (statics.tab.current in statics.tab.all) { + select_tab(statics.tab.current); + } else if (statics.selected in statics.tab.all) { + select_tab(statics.selected); + } else { + select_tab(first); + } + + hide_loading(); + } + + function select_tab(tclass) { + var tabs = statics.tab; + + if (tabs.current) { + JX.DOM.alterClass(tabs.current, 'dark-selected', false); + } + tabs.current = tabs.all[tclass]; + JX.DOM.alterClass(tabs.current, 'dark-selected', true); + + if (tclass != statics.selected) { + // Save user preference. + new JX.Request('/~/', JX.bag) + .setData({ tab : tclass }) + .send(); + statics.selected = tclass; + } + + draw_panel(); + } + + function draw_panel() { + var data = statics.cache[statics.req.current]; + var tclass = JX.Stratcom.getData(statics.tab.current)['class']; + var html = data.panel[tclass]; + + var div = JX.$N('div', {className: 'dark-console-panel-core'}, JX.$H(html)); + JX.DOM.setContent(statics.el.panel, div); + + var params = { + panel: tclass + }; + + JX.Stratcom.invoke('darkconsole.draw', null, params); + } + + function install_shortcut() { + var desc = 'Toggle visibility of DarkConsole.'; + new JX.KeyboardShortcut('`', desc) + .setGroup('global') + .setHandler(function() { + statics.visible = !statics.visible; + + if (statics.visible) { + JX.DOM.show(statics.root); + if (statics.req.current) { + draw_request(statics.req.current); + } + } else { + JX.DOM.hide(statics.root); + } + + // Save user preference. + new JX.Request('/~/', JX.bag) + .setData({visible: statics.visible ? 1 : 0}) + .send(); + + // Force resize listeners to take effect. + JX.Stratcom.invoke('resize'); + }) + .register(); + } + + statics.root = statics.root || setup_console(); + if (config.quicksand && statics.quicksand_key) { + config.key = statics.quicksand_key; + config.color = statics.quicksand_color; + statics.quicksand_key = null; + statics.quicksand_color = null; + } + config.key = config.key || statics.root.getAttribute('data-console-key'); + if (!('color' in config)) { + config.color = statics.root.getAttribute('data-console-color'); + } + add_request(config); + + +/* -( Realtime Panel )----------------------------------------------------- */ + + + if (!statics.realtime) { + statics.realtime = true; + + var realtime_log = new JX.DarkLog(); + var realtime_id = 'dark-console-realtime-log'; + + JX.Stratcom.listen('darkconsole.draw', null, function(e) { + var data = e.getData(); + if (data.panel != 'DarkConsoleRealtimePlugin') { + return; + } + + var node = JX.$(realtime_id); + realtime_log.setNode(node); + }); + + // If the panel is initially visible, try rendering. + try { + var node = JX.$(realtime_id); + realtime_log.setNode(node); + } catch (exception) { + // Ignore. + } + + var leader_log = function(event_name, type, is_leader, details) { + var parts = []; + if (is_leader === true) { + parts.push('+'); + } else if (is_leader === false) { + parts.push('-'); + } else { + parts.push('~'); + } + + parts.push('[Leader/' + event_name + ']'); + + if (type) { + parts.push('(' + type + ')'); + } + + if (details) { + parts.push(details); + } + + parts = parts.join(' '); + + var message = new JX.DarkMessage() + .setMessage(parts); + + realtime_log.addMessage(message); + }; + + JX.Leader.listen('onReceiveBroadcast', function(message, is_leader) { + var json = JX.JSON.stringify(message.data); + + if (message.type == 'aphlict.status') { + if (message.data == 'closed') { + var ws = JX.Aphlict.getInstance().getWebsocket(); + if (ws) { + var delay = ws.getReconnectDelay(); + json += ' [Reconnect: ' + delay + 'ms]'; + } + } + } + + leader_log('onReceiveBroadcast', message.type, is_leader, json); + }); + + JX.Leader.listen('onBecomeLeader', function() { + leader_log('onBecomeLeader'); + }); + + var action_log = function(action) { + var message = new JX.DarkMessage() + .setMessage('> ' + action); + + realtime_log.addMessage(message); + }; + + JX.Stratcom.listen('click', 'dark-console-realtime-action', function(e) { + var node = e.getNode('dark-console-realtime-action'); + var data = JX.Stratcom.getData(node); + + action_log(data.label); + + var action = data.action; + switch (action) { + case 'reconnect': + var ws = JX.Aphlict.getInstance().getWebsocket(); + if (ws) { + ws.reconnect(); + } + break; + case 'replay': + JX.Aphlict.getInstance().replay(); + break; + case 'repaint': + JX.Aphlict.getInstance().reconnect(); + break; + } + + }); + + } + + if (!statics.expand) { + statics.expand = true; + + var current_details = null; + JX.Stratcom.listen('click', 'darkconsole-expand', function(e) { + e.kill(); + + if (current_details) { + current_details.style.display = 'none'; + current_details = null; + } + + var id = e.getNodeData('darkconsole-expand').expandID; + var node = JX.$(id); + + node.style.display = 'block'; + current_details = node; + }); + } + +}); diff --git a/webroot/rsrc/js/phui/behavior-phui-dropdown-menu.js b/webroot/rsrc/js/phui/behavior-phui-dropdown-menu.js new file mode 100644 index 0000000000..d2fddc8e70 --- /dev/null +++ b/webroot/rsrc/js/phui/behavior-phui-dropdown-menu.js @@ -0,0 +1,47 @@ +/** + * @provides javelin-behavior-phui-dropdown-menu + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + * phuix-dropdown-menu + */ + +JX.behavior('phui-dropdown-menu', function() { + + JX.Stratcom.listen('click', 'phui-dropdown-menu', function(e) { + var data = e.getNodeData('phui-dropdown-menu'); + if (data.menu) { + return; + } + + e.kill(); + + var list; + var placeholder; + if (data.items) { + list = JX.$H(data.items).getFragment().firstChild; + } else { + list = JX.$(data.menuID); + placeholder = JX.$N('span'); + } + + var icon = e.getNode('phui-dropdown-menu'); + data.menu = new JX.PHUIXDropdownMenu(icon); + + data.menu.listen('open', function() { + if (placeholder) { + JX.DOM.replace(list, placeholder); + } + data.menu.setContent(list); + }); + + data.menu.listen('close', function() { + if (placeholder) { + JX.DOM.replace(placeholder, list); + } + }); + + data.menu.open(); + }); + +}); diff --git a/webroot/rsrc/js/phui/behavior-phui-file-upload.js b/webroot/rsrc/js/phui/behavior-phui-file-upload.js new file mode 100644 index 0000000000..39e3bddff6 --- /dev/null +++ b/webroot/rsrc/js/phui/behavior-phui-file-upload.js @@ -0,0 +1,80 @@ +/** + * @provides javelin-behavior-phui-file-upload + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + * phuix-dropdown-menu + */ + +JX.behavior('phui-file-upload', function(config) { + + function startUpload(workflow, input) { + var files = input.files; + + if (!files || !files.length) { + return; + } + + var state = { + workflow: workflow, + input: input, + waiting: 0, + phids: [] + }; + + var callback = JX.bind(null, didUpload, state); + + var dummy = input; + var uploader = new JX.PhabricatorDragAndDropFileUpload(dummy) + .setURI(config.uploadURI) + .setChunkThreshold(config.chunkThreshold); + + uploader.listen('didUpload', callback); + uploader.start(); + + workflow.pause(); + for (var ii = 0; ii < files.length; ii++) { + state.waiting++; + uploader.sendRequest(files[ii]); + } + } + + function didUpload(state, file) { + state.phids.push(file.getPHID()); + state.waiting--; + + if (state.waiting) { + return; + } + + state.workflow + .addData(config.inputName, state.phids.join(', ')) + .resume(); + } + + JX.Workflow.listen('start', function(workflow) { + var form = workflow.getSourceForm(); + if (!form) { + return; + } + + var input; + try { + input = JX.$(config.fileInputID); + } catch (ex) { + return; + } + + var local_form = JX.DOM.findAbove(input, 'form'); + if (!local_form) { + return; + } + + if (local_form !== form) { + return; + } + + startUpload(workflow, input); + }); + +}); diff --git a/webroot/rsrc/js/phui/behavior-phui-selectable-list.js b/webroot/rsrc/js/phui/behavior-phui-selectable-list.js new file mode 100644 index 0000000000..eaa33565d0 --- /dev/null +++ b/webroot/rsrc/js/phui/behavior-phui-selectable-list.js @@ -0,0 +1,44 @@ +/** + * @provides javelin-behavior-phui-selectable-list + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + */ + +JX.behavior('phui-selectable-list', function() { + + JX.Stratcom.listen('click', 'phui-oi-selectable', function(e) { + if (!e.isNormalClick()) { + return; + } + + // If the user clicked a link, ignore it. + if (e.getNode('tag:a')) { + return; + } + + var root = e.getNode('phui-oi-selectable'); + + // If the user did not click the checkbox, pretend they did. This makes + // the entire element a click target to make changing the selection set a + // bit easier. + if (!e.getNode('tag:input')) { + var checkbox = getCheckbox(root); + checkbox.checked = !checkbox.checked; + + e.kill(); + } + + setTimeout(JX.bind(null, redraw, root), 0); + }); + + function getCheckbox(root) { + return JX.DOM.find(root, 'input'); + } + + function redraw(root) { + var checkbox = getCheckbox(root); + JX.DOM.alterClass(root, 'phui-oi-selected', !!checkbox.checked); + } + +}); diff --git a/webroot/rsrc/js/phui/behavior-phui-submenu.js b/webroot/rsrc/js/phui/behavior-phui-submenu.js new file mode 100644 index 0000000000..b391174052 --- /dev/null +++ b/webroot/rsrc/js/phui/behavior-phui-submenu.js @@ -0,0 +1,44 @@ +/** + * @provides javelin-behavior-phui-submenu + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + */ + +JX.behavior('phui-submenu', function() { + + JX.Stratcom.listen('click', 'phui-submenu', function(e) { + if (!e.isNormalClick()) { + return; + } + + var node = e.getNode('phui-submenu'); + var data = e.getNodeData('phui-submenu'); + + e.kill(); + + data.open = !data.open; + + for (var ii = 0; ii < data.itemIDs.length; ii++) { + var id = data.itemIDs[ii]; + var item = JX.$(id); + if (data.open) { + JX.DOM.show(item); + } else { + JX.DOM.hide(item); + } + + // Add a class so we can animate zany effects. + JX.DOM.alterClass(item, 'phui-submenu-animate', data.open); + } + + JX.DOM.alterClass(node, 'phui-submenu-open', data.open); + + // Toggle the caret from ">" to "V" when opening the menu, and back again + // when closing it. + var caret = JX.$(data.caretID); + JX.DOM.alterClass(caret, 'caret', data.open); + JX.DOM.alterClass(caret, 'caret-right', !data.open); + }); + +}); diff --git a/webroot/rsrc/js/phui/behavior-phui-tab-group.js b/webroot/rsrc/js/phui/behavior-phui-tab-group.js new file mode 100644 index 0000000000..23c1ca5b68 --- /dev/null +++ b/webroot/rsrc/js/phui/behavior-phui-tab-group.js @@ -0,0 +1,39 @@ +/** + * @provides javelin-behavior-phui-tab-group + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + */ + +JX.behavior('phui-tab-group', function() { + + JX.Stratcom.listen( + 'click', + 'phui-tab-view', + function (e) { + e.kill(); + + var map = e.getNodeData('phui-tab-group-view').tabMap; + var key = e.getNodeData('phui-tab-view').tabKey; + + var group = e.getNode('phui-tab-group-view'); + var tab = e.getNode('phui-tab-view'); + var tabs = JX.DOM.scry(group, 'li', 'phui-tab-view'); + + for (var ii = 0; ii < tabs.length; ii++) { + JX.DOM.alterClass( + tabs[ii], + 'phui-list-item-selected', + (tabs[ii] == tab)); + } + + for (var k in map) { + if (k == key) { + JX.DOM.show(JX.$(map[k])); + } else { + JX.DOM.hide(JX.$(map[k])); + } + } + }); + +}); diff --git a/webroot/rsrc/js/phui/behavior-phui-timer-control.js b/webroot/rsrc/js/phui/behavior-phui-timer-control.js new file mode 100644 index 0000000000..d5b73a5ee2 --- /dev/null +++ b/webroot/rsrc/js/phui/behavior-phui-timer-control.js @@ -0,0 +1,41 @@ +/** + * @provides javelin-behavior-phui-timer-control + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + */ + +JX.behavior('phui-timer-control', function(config) { + var node = JX.$(config.nodeID); + var uri = config.uri; + var state = null; + + function onupdate(result) { + var markup = result.markup; + if (markup) { + var new_node = JX.$H(markup).getFragment().firstChild; + JX.DOM.replace(node, new_node); + node = new_node; + + // If the overall state has changed from the previous display state, + // animate the control to draw the user's attention to the state change. + if (result.state !== state) { + state = result.state; + JX.DOM.alterClass(node, 'phui-form-timer-updated', true); + } + } + + var retry = result.retry; + if (retry) { + setTimeout(update, 1000); + } + } + + function update() { + new JX.Request(uri, onupdate) + .setTimeout(10000) + .send(); + } + + update(); +}); diff --git a/webroot/rsrc/js/phuix/PHUIXActionListView.js b/webroot/rsrc/js/phuix/PHUIXActionListView.js new file mode 100644 index 0000000000..1eef60176b --- /dev/null +++ b/webroot/rsrc/js/phuix/PHUIXActionListView.js @@ -0,0 +1,36 @@ +/** + * @provides phuix-action-list-view + * @requires javelin-install + * javelin-dom + */ + +JX.install('PHUIXActionListView', { + + construct: function() { + this._items = []; + }, + + members: { + _items: null, + _node: null, + + addItem: function(item) { + this._items.push(item); + this.getNode().appendChild(item.getNode()); + return this; + }, + + getNode: function() { + if (!this._node) { + var attrs = { + className: 'phabricator-action-list-view' + }; + + this._node = JX.$N('ul', attrs); + } + + return this._node; + } + } + +}); diff --git a/webroot/rsrc/js/phuix/PHUIXActionView.js b/webroot/rsrc/js/phuix/PHUIXActionView.js new file mode 100644 index 0000000000..0cf0106f3f --- /dev/null +++ b/webroot/rsrc/js/phuix/PHUIXActionView.js @@ -0,0 +1,238 @@ +/** + * @provides phuix-action-view + * @requires javelin-install + * javelin-dom + * javelin-util + * @javelin + */ + +JX.install('PHUIXActionView', { + + members: { + _node: null, + _name: null, + _icon: 'none', + _iconColor: null, + _disabled: false, + _label: false, + _handler: null, + _selected: false, + _divider: false, + _keyCommand: null, + _unresponsive: null, + + _iconNode: null, + _nameNode: null, + + setDisabled: function(disabled) { + this._disabled = disabled; + JX.DOM.alterClass( + this.getNode(), + 'phabricator-action-view-disabled', + disabled); + + this._buildIconNode(true); + + return this; + }, + + setUnresponsive: function(unresponsive) { + this._unresponsive = unresponsive; + this._buildNameNode(true); + return this; + }, + + getDisabled: function() { + return this._disabled; + }, + + setLabel: function(label) { + this._label = label; + JX.DOM.alterClass( + this.getNode(), + 'phabricator-action-view-label', + label); + return this; + }, + + setDivider: function(divider) { + this._divider = divider; + JX.DOM.alterClass( + this.getNode(), + 'phabricator-action-view-type-divider', + divider); + return this; + }, + + setSelected: function(selected) { + this._selected = selected; + JX.DOM.alterClass( + this.getNode(), + 'phabricator-action-view-selected', + selected); + + return this; + }, + + setName: function(name) { + this._name = name; + this._buildNameNode(true); + return this; + }, + + setHandler: function(handler) { + this._handler = handler; + this._buildNameNode(true); + this._rebuildClasses(); + return this; + }, + + setIcon: function(icon) { + this._icon = icon; + this._buildIconNode(true); + return this; + }, + + setIconColor: function(color) { + this._iconColor = color; + this._buildIconNode(true); + return this; + }, + + setHref: function(href) { + this._href = href; + this._buildNameNode(true); + this._rebuildClasses(); + return this; + }, + + setKeyCommand: function(command) { + this._keyCommand = command; + + var key_node = this._buildKeyCommandNode(); + JX.DOM.setContent(key_node, this._keyCommand); + + var node = this.getNode(); + JX.DOM.alterClass(node, 'has-key-command', !!this._keyCommand); + + return this; + }, + + getNode: function() { + if (!this._node) { + var classes = ['phabricator-action-view']; + + if (this._icon) { + classes.push('action-has-icon'); + } + + var content = [ + this._buildIconNode(), + this._buildNameNode(), + this._buildKeyCommandNode(), + ]; + + var attr = { + className: classes.join(' ') + }; + this._node = JX.$N('li', attr, content); + + JX.Stratcom.addSigil(this._node, 'phuix-action-view'); + + this._rebuildClasses(); + } + + return this._node; + }, + + _rebuildClasses: function() { + var node = this.getNode(); + + var is_href = !!(this._href || this._handler); + JX.DOM.alterClass(node, 'phabricator-action-view-href', is_href); + }, + + _buildIconNode: function(dirty) { + if (!this._iconNode || dirty) { + var attr = { + className: [ + 'phui-icon-view', + 'phabricator-action-view-icon', + 'phui-font-fa' + ].join(' ') + }; + var node = JX.$N('span', attr); + + var icon_class = this._icon; + if (this._disabled) { + icon_class = icon_class + ' grey'; + } + + if (this._iconColor) { + icon_class = icon_class + ' ' + this._iconColor; + } + + JX.DOM.alterClass(node, icon_class, true); + + if (this._iconNode && this._iconNode.parentNode) { + JX.DOM.replace(this._iconNode, node); + } + this._iconNode = node; + } + + return this._iconNode; + }, + + _buildKeyCommandNode: function() { + if (!this._keyCommandNode) { + var attrs = { + className: 'keyboard-shortcut-key' + }; + + this._keyCommandNode = JX.$N('div', attrs); + } + return this._keyCommandNode; + }, + + _buildNameNode: function(dirty) { + if (!this._nameNode || dirty) { + var attr = { + className: 'phabricator-action-view-item' + }; + + var href = this._href; + if (!href && this._handler && !this._unresponsive) { + href = '#'; + } + if (href) { + attr.href = href; + } + + var tag = href ? 'a' : 'span'; + + var node = JX.$N(tag, attr, this._name); + JX.DOM.listen(node, 'click', null, JX.bind(this, this._onclick)); + + if (this._nameNode && this._nameNode.parentNode) { + JX.DOM.replace(this._nameNode, node); + } + this._nameNode = node; + } + + return this._nameNode; + }, + + _onclick: function(e) { + if (this._unresponsive) { + e.prevent(); + return; + } + + if (this._handler) { + this._handler(e); + } + } + + } + +}); diff --git a/webroot/rsrc/js/phuix/PHUIXAutocomplete.js b/webroot/rsrc/js/phuix/PHUIXAutocomplete.js new file mode 100644 index 0000000000..2eaa9bafe1 --- /dev/null +++ b/webroot/rsrc/js/phuix/PHUIXAutocomplete.js @@ -0,0 +1,782 @@ +/** + * @provides phuix-autocomplete + * @requires javelin-install + * javelin-dom + * phuix-icon-view + * phabricator-prefab + */ + +JX.install('PHUIXAutocomplete', { + + construct: function() { + this._map = {}; + this._datasources = {}; + this._listNodes = []; + this._resultMap = {}; + }, + + members: { + _area: null, + _active: false, + _cursorHead: null, + _cursorTail: null, + _pixelHead: null, + _pixelTail: null, + _map: null, + _datasource: null, + _datasources: null, + _value: null, + _node: null, + _echoNode: null, + _listNode: null, + _promptNode: null, + _focus: null, + _focusRef: null, + _listNodes: null, + _x: null, + _y: null, + _visible: false, + _resultMap: null, + + setArea: function(area) { + this._area = area; + return this; + }, + + addAutocomplete: function(code, spec) { + this._map[code] = spec; + return this; + }, + + start: function() { + var area = this._area; + + JX.DOM.listen(area, 'keypress', null, JX.bind(this, this._onkeypress)); + + JX.DOM.listen( + area, + ['click', 'keyup', 'keydown', 'keypress'], + null, + JX.bind(this, this._update)); + + var select = JX.bind(this, this._onselect); + JX.DOM.listen(this._getNode(), 'mousedown', 'typeahead-result', select); + + var device = JX.bind(this, this._ondevice); + JX.Stratcom.listen('phabricator-device-change', null, device); + + // When the user clicks away from the textarea, deactivate. + var deactivate = JX.bind(this, this._deactivate); + JX.DOM.listen(area, 'blur', null, deactivate); + }, + + _getSpec: function() { + return this._map[this._active]; + }, + + _ondevice: function() { + if (JX.Device.getDevice() != 'desktop') { + this._deactivate(); + } + }, + + _activate: function(code) { + if (JX.Device.getDevice() != 'desktop') { + return; + } + + if (!this._map[code]) { + return; + } + + var area = this._area; + var range = JX.TextAreaUtils.getSelectionRange(area); + + // Check the character immediately before the trigger character. We'll + // only activate the typeahead if it's something that we think a user + // might reasonably want to autocomplete after, like a space, newline, + // or open parenthesis. For example, if a user types "alincoln@", + // the prior letter will be the last "n" in "alincoln". They are probably + // typing an email address, not a username, so we don't activate the + // autocomplete. + var head = range.start; + var prior; + if (head > 1) { + prior = area.value.substring(head - 2, head - 1); + } else { + prior = ''; + } + + // If this is a repeating sequence and the previous character is the + // same as the one the user just typed, like "((", don't reactivate. + if (prior === String.fromCharCode(code)) { + return; + } + + switch (prior) { + case '': + case ' ': + case '\n': + case '\t': + case '(': // Might be "(@username, what do you think?)". + case '-': // Might be an unnumbered list. + case '.': // Might be a numbered list. + case '|': // Might be a table cell. + case '>': // Might be a blockquote. + case '!': // Might be a blockquote attribution line. + // We'll let these autocomplete. + break; + default: + // We bail out on anything else, since the user is probably not + // typing a username or project tag. + return; + } + + // Get all the text on the current line. If the line only contains + // whitespace, don't activate: the user is probably typing code or a + // numbered list. + var line = area.value.substring(0, head - 1); + line = line.split('\n'); + line = line[line.length - 1]; + if (line.match(/^\s+$/)) { + return; + } + + this._cursorHead = head; + this._cursorTail = range.end; + this._pixelHead = JX.TextAreaUtils.getPixelDimensions( + area, + range.start, + range.end); + + var spec = this._map[code]; + if (!this._datasources[code]) { + var datasource = new JX.TypeaheadOnDemandSource(spec.datasourceURI); + datasource.listen( + 'resultsready', + JX.bind(this, this._onresults, code)); + + datasource.setTransformer(JX.bind(this, this._transformresult)); + datasource.setSortHandler( + JX.bind(datasource, JX.Prefab.sortHandler, {})); + + this._datasources[code] = datasource; + } + + this._datasource = this._datasources[code]; + this._active = code; + + var head_icon = new JX.PHUIXIconView() + .setIcon(spec.headerIcon) + .getNode(); + var head_text = spec.headerText; + + var node = this._getPromptNode(); + JX.DOM.setContent(node, [head_icon, head_text]); + }, + + _transformresult: function(fields) { + var map = JX.Prefab.transformDatasourceResults(fields); + + var icon; + if (map.icon) { + icon = new JX.PHUIXIconView() + .setIcon(map.icon) + .getNode(); + } + + var dot; + if (map.availabilityColor) { + dot = JX.$N( + 'span', + { + className: 'phui-tag-dot phui-tag-color-' + map.availabilityColor + }); + } + + var display = JX.$N('span', {}, [icon, dot, map.displayName]); + JX.DOM.alterClass(display, 'tokenizer-result-closed', !!map.closed); + + map.display = display; + + return map; + }, + + _deactivate: function() { + var node = this._getNode(); + JX.DOM.hide(node); + + this._active = false; + this._visible = false; + }, + + _onkeypress: function(e) { + var r = e.getRawEvent(); + + // NOTE: We allow events to continue with "altKey", because you need + // to press Alt to type characters like "@" on a German keyboard layout. + // The cost of misfiring autocompleters is very small since we do not + // eat the keystroke. See T10252. + if (r.metaKey || (r.ctrlKey && !r.altKey)) { + return; + } + + var code = r.charCode; + if (this._map[code]) { + setTimeout(JX.bind(this, this._activate, code), 0); + } + }, + + _onresults: function(code, nodes, value, partial) { + // Even if these results are out of date, we still want to fill in the + // result map so we can terminate things later. + if (!partial) { + if (!this._resultMap[code]) { + this._resultMap[code] = {}; + } + + var hits = []; + for (var ii = 0; ii < nodes.length; ii++) { + var result = this._datasources[code].getResult(nodes[ii].rel); + if (!result) { + hits = null; + break; + } + + if (!result.autocomplete || !result.autocomplete.length) { + hits = null; + break; + } + + hits.push(result.autocomplete); + } + + if (hits !== null) { + this._resultMap[code][value] = hits; + } + } + + if (code !== this._active) { + return; + } + + if (value !== this._value) { + return; + } + + if (this._isTerminatedString(value)) { + if (this._hasUnrefinableResults(value)) { + this._deactivate(); + return; + } + } + + var list = this._getListNode(); + JX.DOM.setContent(list, nodes); + + this._listNodes = nodes; + + var old_ref = this._focusRef; + this._clearFocus(); + + for (var ii = 0; ii < nodes.length; ii++) { + if (nodes[ii].rel == old_ref) { + this._setFocus(ii); + break; + } + } + + if (this._focus === null && nodes.length) { + this._setFocus(0); + } + + this._redraw(); + }, + + _setFocus: function(idx) { + if (!this._listNodes[idx]) { + this._clearFocus(); + return false; + } + + if (this._focus !== null) { + JX.DOM.alterClass(this._listNodes[this._focus], 'focused', false); + } + + this._focus = idx; + this._focusRef = this._listNodes[idx].rel; + JX.DOM.alterClass(this._listNodes[idx], 'focused', true); + + return true; + }, + + _changeFocus: function(delta) { + if (this._focus === null) { + return false; + } + + return this._setFocus(this._focus + delta); + }, + + _clearFocus: function() { + this._focus = null; + this._focusRef = null; + }, + + _onselect: function (e) { + if (!e.isNormalMouseEvent()) { + // Eat right clicks, control clicks, etc., on the results. These can + // not do anything meaningful and if we let them through they'll blur + // the field and dismiss the results. + e.kill(); + return; + } + + var target = e.getNode('typeahead-result'); + + for (var ii = 0; ii < this._listNodes.length; ii++) { + if (this._listNodes[ii] === target) { + this._setFocus(ii); + this._autocomplete(); + break; + } + } + + this._deactivate(); + e.kill(); + }, + + _getSuffixes: function() { + return [' ', ':', ',', ')']; + }, + + _getCancelCharacters: function() { + // The "." character does not cancel because of projects named + // "node.js" or "blog.mycompany.com". + var defaults = ['#', '@', ',', '!', '?', '{', '}']; + + return this._map[this._active].cancel || defaults; + }, + + _getTerminators: function() { + return [' ', ':', ',', '.', '!', '?']; + }, + + _getIgnoreList: function() { + return this._map[this._active].ignore || []; + }, + + _isTerminatedString: function(string) { + var terminators = this._getTerminators(); + for (var ii = 0; ii < terminators.length; ii++) { + var term = terminators[ii]; + if (string.substring(string.length - term.length) == term) { + return true; + } + } + + return false; + }, + + _hasUnrefinableResults: function(query) { + if (!this._resultMap[this._active]) { + return false; + } + + var map = this._resultMap[this._active]; + + for (var ii = 1; ii < query.length; ii++) { + var prefix = query.substring(0, ii); + if (map.hasOwnProperty(prefix)) { + var results = map[prefix]; + + // If any prefix of the query has no results, the full query also + // has no results so we can not refine them. + if (!results.length) { + return true; + } + + // If there is exactly one match and the it is a prefix of the query, + // we can safely assume the user just typed out the right result + // from memory and doesn't need to refine it. + if (results.length == 1) { + // Strip the first character off, like a "#" or "@". + var result = results[0].substring(1); + + if (query.length >= result.length) { + if (query.substring(0, result.length) === result) { + return true; + } + } + } + } + } + + return false; + }, + + _trim: function(str) { + var suffixes = this._getSuffixes(); + for (var ii = 0; ii < suffixes.length; ii++) { + if (str.substring(str.length - suffixes[ii].length) == suffixes[ii]) { + str = str.substring(0, str.length - suffixes[ii].length); + } + } + return str; + }, + + _update: function(e) { + if (!this._active) { + return; + } + + var special = e.getSpecialKey(); + + // Deactivate if the user types escape. + if (special == 'esc') { + this._deactivate(); + e.kill(); + return; + } + + var area = this._area; + + if (e.getType() == 'keydown') { + if (special == 'up' || special == 'down') { + var delta = (special == 'up') ? -1 : +1; + if (!this._changeFocus(delta)) { + this._deactivate(); + } + e.kill(); + return; + } + } + + // Deactivate if the user moves the cursor to the left of the assist + // range. For example, they might press the "left" arrow to move the + // cursor to the left, or click in the textarea prior to the active + // range. + var range = JX.TextAreaUtils.getSelectionRange(area); + if (range.start < this._cursorHead) { + this._deactivate(); + return; + } + + if (special == 'tab' || special == 'return') { + var r = e.getRawEvent(); + if (r.shiftKey && special == 'tab') { + // Don't treat "Shift + Tab" as an autocomplete action. Instead, + // let it through normally so the focus shifts to the previous + // control. + this._deactivate(); + return; + } + + // If the user hasn't typed any text yet after typing the character + // which can summon the autocomplete, deactivate and let the keystroke + // through. For example, we hit this when a line ends with an + // autocomplete character and the user is trying to type a newline. + if (range.start == this._cursorHead) { + this._deactivate(); + return; + } + + // If we autocomplete, we're done. Otherwise, just eat the event. This + // happens if you type too fast and try to tab complete before results + // load. + if (this._autocomplete()) { + this._deactivate(); + } + + e.kill(); + return; + } + + // Deactivate if the user moves the cursor to the right of the assist + // range. For example, they might click later in the document. If the user + // is pressing the "right" arrow key, they are not allowed to move the + // cursor beyond the existing end of the text range. If they are pressing + // other keys, assume they're typing and allow the tail to move forward + // one character. + var margin; + if (special == 'right') { + margin = 0; + } else { + margin = 1; + } + + var tail = this._cursorTail; + + if ((range.start > tail + margin) || (range.end > tail + margin)) { + this._deactivate(); + return; + } + + this._cursorTail = Math.max(this._cursorTail, range.end); + + var text = area.value.substring( + this._cursorHead, + this._cursorTail); + + var pixels = JX.TextAreaUtils.getPixelDimensions( + area, + range.start, + range.end); + + var x = this._pixelHead.start.x; + var y = Math.max(this._pixelHead.end.y, pixels.end.y) + 24; + + // If the first character after the trigger is a space, just deactivate + // immediately. This occurs if a user types a numbered list using "#". + if (text.length && text[0] == ' ') { + this._deactivate(); + return; + } + + // Deactivate immediately if a user types a character that we are + // reasonably sure means they don't want to use the autocomplete. For + // example, "##" is almost certainly a header or monospaced text, not + // a project autocompletion. + var cancels = this._getCancelCharacters(); + for (var ii = 0; ii < cancels.length; ii++) { + if (text.indexOf(cancels[ii]) !== -1) { + this._deactivate(); + return; + } + } + + var trim = this._trim(text); + + // If this rule has a prefix pattern, like the "[[ document ]]" rule, + // require it match and throw it away before we begin suggesting + // results. The autocomplete remains active, it's just dormant until + // the user gives us more to work with. + var prefix = this._map[this._active].prefix; + if (prefix) { + var pattern = new RegExp(prefix); + if (!trim.match(pattern)) { + // If the prefix pattern can not match the text, deactivate. (This + // check might need to be more careful if we have a more varied + // set of prefixes in the future, but for now they're all a single + // prefix character.) + if (trim.length) { + this._deactivate(); + } + return; + } + trim = trim.replace(pattern, ''); + trim = trim.trim(); + } + + // Store the current value now that we've finished mutating the text. + // This needs to match what we pass to the typeahead datasource. + this._value = trim; + + // Deactivate immediately if the user types an ignored token like ":)", + // the smiley face emoticon. Note that we test against "text", not + // "trim", because the ignore list and suffix list can otherwise + // interact destructively. + var ignore = this._getIgnoreList(); + for (ii = 0; ii < ignore.length; ii++) { + if (text.indexOf(ignore[ii]) === 0) { + this._deactivate(); + return; + } + } + + // If the input is terminated by a space or another word-terminating + // punctuation mark, we're going to deactivate if the results can not + // be refined by adding more words. + + // The idea is that if you type "@alan ab", you're allowed to keep + // editing "ab" until you type a space, period, or other terminator, + // since you might not be sure how to spell someone's last name or the + // second word of a project. + + // Once you do terminate a word, if the words you have have entered match + // nothing or match only one exact match, we can safely deactivate and + // assume you're just typing text because further words could never + // refine the result set. + + var force; + if (this._isTerminatedString(text)) { + if (this._hasUnrefinableResults(text)) { + this._deactivate(); + return; + } + force = true; + } else { + force = false; + } + + this._datasource.didChange(trim, force); + + this._x = x; + this._y = y; + + var hint = trim; + if (hint.length) { + // We only show the autocompleter after the user types at least one + // character. For example, "@" does not trigger it, but "@d" does. + this._visible = true; + } else { + hint = this._getSpec().hintText; + } + + var echo = this._getEchoNode(); + JX.DOM.setContent(echo, hint); + + this._redraw(); + }, + + _redraw: function() { + if (!this._visible) { + return; + } + + var node = this._getNode(); + JX.DOM.show(node); + + var p = new JX.Vector(this._x, this._y); + var s = JX.Vector.getScroll(); + var v = JX.Vector.getViewport(); + + // If the menu would run off the bottom of the screen when showing the + // maximum number of possible choices, put it above instead. We're doing + // this based on the maximum size so the menu doesn't jump up and down + // as results arrive. + + var option_height = 30; + var extra_margin = 24; + if ((s.y + v.y) < (p.y + (5 * option_height) + extra_margin)) { + var d = JX.Vector.getDim(node); + p.y = p.y - d.y - 36; + } + + p.setPos(node); + }, + + _autocomplete: function() { + if (this._focus === null) { + return false; + } + + var area = this._area; + var head = this._cursorHead; + var tail = this._cursorTail; + + var text = area.value; + + var ref = this._focusRef; + var result = this._datasource.getResult(ref); + if (!result) { + return false; + } + + ref = result.autocomplete; + if (!ref || !ref.length) { + return false; + } + + // If the user types a string like "@username:" (with a trailing colon), + // then presses tab or return to pick the completion, don't destroy the + // trailing character. + var suffixes = this._getSuffixes(); + var value = this._value; + var found_suffix = false; + for (var ii = 0; ii < suffixes.length; ii++) { + var last = value.substring(value.length - suffixes[ii].length); + if (last == suffixes[ii]) { + ref += suffixes[ii]; + found_suffix = true; + break; + } + } + + // If we didn't find an existing suffix, add a space. + if (!found_suffix) { + ref = ref + ' '; + } + + area.value = text.substring(0, head - 1) + ref + text.substring(tail); + + var end = head + ref.length; + JX.TextAreaUtils.setSelectionRange(area, end, end); + + return true; + }, + + _getNode: function() { + if (!this._node) { + var head = this._getHeadNode(); + var list = this._getListNode(); + + this._node = JX.$N( + 'div', + { + className: 'phuix-autocomplete', + style: { + display: 'none' + } + }, + [head, list]); + + JX.DOM.hide(this._node); + + document.body.appendChild(this._node); + } + return this._node; + }, + + _getHeadNode: function() { + if (!this._headNode) { + this._headNode = JX.$N( + 'div', + { + className: 'phuix-autocomplete-head' + }, + [ + this._getPromptNode(), + this._getEchoNode() + ]); + } + + return this._headNode; + }, + + _getPromptNode: function() { + if (!this._promptNode) { + this._promptNode = JX.$N( + 'span', + { + className: 'phuix-autocomplete-prompt', + }); + } + return this._promptNode; + }, + + _getEchoNode: function() { + if (!this._echoNode) { + this._echoNode = JX.$N( + 'span', + { + className: 'phuix-autocomplete-echo' + }); + } + return this._echoNode; + }, + + _getListNode: function() { + if (!this._listNode) { + this._listNode = JX.$N( + 'div', + { + className: 'phuix-autocomplete-list' + }); + } + return this._listNode; + } + + } + +}); diff --git a/webroot/rsrc/js/phuix/PHUIXButtonView.js b/webroot/rsrc/js/phuix/PHUIXButtonView.js new file mode 100644 index 0000000000..1205ad3d96 --- /dev/null +++ b/webroot/rsrc/js/phuix/PHUIXButtonView.js @@ -0,0 +1,144 @@ +/** + * @provides phuix-button-view + * @requires javelin-install + * javelin-dom + */ +JX.install('PHUIXButtonView', { + + statics: { + BUTTONTYPE_DEFAULT: 'buttontype.default', + BUTTONTYPE_SIMPLE: 'buttontype.simple' + }, + + members: { + _node: null, + _textNode: null, + _auralNode: null, + + _iconView: null, + _color: null, + _selected: null, + _buttonType: null, + + setIcon: function(icon) { + this.getIconView().setIcon(icon); + return this; + }, + + getIconView: function() { + if (!this._iconView) { + this._iconView = new JX.PHUIXIconView(); + this._redraw(); + } + return this._iconView; + }, + + setColor: function(color) { + var node = this.getNode(); + + if (this._color) { + JX.DOM.alterClass(node, 'button-' + this._color, false); + } + this._color = color; + JX.DOM.alterClass(node, 'button-' + this._color, true); + + return this; + }, + + setSelected: function(selected) { + var node = this.getNode(); + this._selected = selected; + JX.DOM.alterClass(node, 'selected', this._selected); + return this; + }, + + setButtonType: function(button_type) { + var self = JX.PHUIXButtonView; + + this._buttonType = button_type; + var node = this.getNode(); + + var is_simple = (this._buttonType == self.BUTTONTYPE_SIMPLE); + JX.DOM.alterClass(node, 'phui-button-simple', is_simple); + + return this; + }, + + setText: function(text) { + JX.DOM.setContent(this._getTextNode(), text); + this._redraw(); + return this; + }, + + setAuralLabel: function(label) { + JX.DOM.setContent(this._getAuralNode(), label); + this._redraw(); + return this; + }, + + getNode: function() { + if (!this._node) { + var attrs = { + className: 'button' + }; + + this._node = JX.$N('button', attrs); + + this._redraw(); + } + + return this._node; + }, + + _getTextNode: function() { + if (!this._textNode) { + var attrs = { + className: 'phui-button-text' + }; + + this._textNode = JX.$N('div', attrs); + } + + return this._textNode; + }, + + _getAuralNode: function() { + if (!this._auralNode) { + var attrs = { + className: 'aural-only' + }; + + this._auralNode = JX.$N('span', attrs); + } + + return this._auralNode; + }, + + _redraw: function() { + var node = this.getNode(); + + var aural = this._auralNode; + var icon = this._iconView; + var text = this._textNode; + + var content = []; + + if (aural) { + content.push(aural); + } + + if (icon) { + content.push(icon.getNode()); + } + + if (text) { + content.push(text); + } + + JX.DOM.alterClass(node, 'has-icon', !!icon); + JX.DOM.alterClass(node, 'has-text', !!text); + JX.DOM.setContent(node, content); + } + } + +}); diff --git a/webroot/rsrc/js/phuix/PHUIXDropdownMenu.js b/webroot/rsrc/js/phuix/PHUIXDropdownMenu.js new file mode 100644 index 0000000000..a9fa6c8e00 --- /dev/null +++ b/webroot/rsrc/js/phuix/PHUIXDropdownMenu.js @@ -0,0 +1,312 @@ +/** + * @provides phuix-dropdown-menu + * @requires javelin-install + * javelin-util + * javelin-dom + * javelin-vector + * javelin-stratcom + * @javelin + */ + + +/** + * Basic interaction for a dropdown menu. + * + * The menu is unaware of the content inside it, so it can not close itself + * when an item is selected. Callers must make a call to @{method:close} after + * an item is chosen in order to close the menu. + */ +JX.install('PHUIXDropdownMenu', { + + construct : function(node) { + this._node = node; + + if (node) { + JX.DOM.listen( + this._node, + 'click', + null, + JX.bind(this, this._onclick)); + } + + JX.Stratcom.listen( + 'mousedown', + null, + JX.bind(this, this._onanyclick)); + + JX.Stratcom.listen( + 'resize', + null, + JX.bind(this, this._adjustposition)); + + JX.Stratcom.listen('phuix.dropdown.open', null, JX.bind(this, this.close)); + + JX.Stratcom.listen('keydown', null, JX.bind(this, this._onkey)); + + JX.DOM.listen( + this._getMenuNode(), + 'click', + 'tag:a', + JX.bind(this, this._onlink)); + }, + + events: ['open', 'close'], + + properties: { + width: null, + align: 'right', + offsetX: 0, + offsetY: 0, + disableAutofocus: false + }, + + members: { + _node: null, + _menu: null, + _open: false, + _content: null, + _position: null, + _visible: false, + + setContent: function(content) { + JX.DOM.setContent(this._getMenuNode(), content); + return this; + }, + + open: function() { + if (this._open) { + return; + } + + this.invoke('open'); + JX.Stratcom.invoke('phuix.dropdown.open'); + + this._open = true; + this._show(); + + return this; + }, + + close: function() { + if (!this._open) { + return; + } + this._open = false; + this._hide(); + + this.invoke('close'); + + return this; + }, + + setPosition: function(pos) { + this._position = pos; + this._setMenuNodePosition(pos); + return this; + }, + + _getMenuNode: function() { + if (!this._menu) { + var attrs = { + className: 'phuix-dropdown-menu', + role: 'button' + }; + + var menu = JX.$N('div', attrs); + + this._menu = menu; + } + + return this._menu; + }, + + _onclick : function(e) { + if (this._open) { + this.close(); + } else { + this.open(); + } + e.prevent(); + }, + + _onlink: function(e) { + if (!e.isNormalClick()) { + return; + } + + // If this action was built dynamically with PHUIXActionView, don't + // do anything by default. The caller is responsible for installing a + // handler if they want to react to clicks. + if (e.getNode('phuix-action-view')) { + return; + } + + // If this item opens a submenu, we don't want to close the current + // menu. One submenu is "Edit Related Objects..." on mobile. + var link = e.getNode('tag:a'); + if (JX.Stratcom.hasSigil(link, 'keep-open')) { + return; + } + + this.close(); + }, + + _onanyclick : function(e) { + if (!this._open) { + return; + } + + if (JX.Stratcom.pass(e)) { + return; + } + + var t = e.getTarget(); + while (t) { + if (t == this._menu || t == this._node) { + return; + } + t = t.parentNode; + } + + this.close(); + }, + + _show : function() { + if (!this._visible) { + this._visible = true; + document.body.appendChild(this._menu); + } + + if (this.getWidth()) { + new JX.Vector(this.getWidth(), null).setDim(this._menu); + } + + this._adjustposition(); + + if (this._node) { + JX.DOM.alterClass(this._node, 'phuix-dropdown-open', true); + this._node.setAttribute('aria-expanded', 'true'); + } + + // Try to highlight the first link in the menu for assistive technologies. + if (!this.getDisableAutofocus()) { + var links = JX.DOM.scry(this._menu, 'a'); + if (links[0]) { + JX.DOM.focus(links[0]); + } + } + }, + + _hide : function() { + this._visible = false; + JX.DOM.remove(this._menu); + + if (this._node) { + JX.DOM.alterClass(this._node, 'phuix-dropdown-open', false); + this._node.setAttribute('aria-expanded', 'false'); + } + }, + + _adjustposition : function() { + if (!this._open) { + return; + } + + if (this._position) { + this._setMenuNodePosition(this._position); + return; + } + + if (!this._node) { + return; + } + + var m = JX.Vector.getDim(this._menu); + + var v = JX.$V(this._node); + var d = JX.Vector.getDim(this._node); + + var alignments = ['right', 'left']; + var disallow = {}; + var margin = 8; + + // If "right" alignment would leave us with the dropdown near or off the + // left side of the screen, disallow it. + var x_min = ((v.x + d.x) - m.x); + if (x_min < margin) { + disallow.right = true; + } + + var align = this.getAlign(); + + // If the position disallows the configured alignment, try the next + // best alignment instead. + + // If no alignment is allowed, we'll stick with the original alignment + // and accept that it isn't going to render very nicely. This can happen + // if the browser window is very, very small. + if (align in disallow) { + for (var ii = 0; ii < alignments.length; ii++) { + if (!(alignments[ii] in disallow)) { + align = alignments[ii]; + break; + } + } + } + + switch (align) { + case 'right': + v = v.add(d) + .add(JX.$V(-m.x, 0)); + break; + default: + v = v.add(0, d.y); + break; + } + + this._setMenuNodePosition(v); + }, + + _setMenuNodePosition: function(v) { + v = v.add(this.getOffsetX(), this.getOffsetY()); + v.setPos(this._menu); + }, + + getMenuNodeDimensions: function() { + if (!this._visible) { + document.body.appendChild(this._menu); + } + + var dim = JX.Vector.getDim(this._menu); + + if (!this._visible) { + JX.DOM.remove(this._menu); + } + + return dim; + }, + + _onkey: function(e) { + // When the user presses escape with a menu open, close the menu and + // refocus the button which activates the menu. In particular, this makes + // popups more usable with assistive technologies. + + if (!this._open) { + return; + } + + if (e.getSpecialKey() != 'esc') { + return; + } + + this.close(); + + if (this._node) { + JX.DOM.focus(this._node); + } + + e.prevent(); + } + + } +}); diff --git a/webroot/rsrc/js/phuix/PHUIXExample.js b/webroot/rsrc/js/phuix/PHUIXExample.js new file mode 100644 index 0000000000..87f36b04c3 --- /dev/null +++ b/webroot/rsrc/js/phuix/PHUIXExample.js @@ -0,0 +1,65 @@ +/** + * @provides javelin-behavior-phuix-example + * @requires javelin-install + * javelin-dom + * phuix-button-view + */ + +JX.behavior('phuix-example', function(config) { + var node; + var spec; + var defaults; + + switch (config.type) { + case 'button': + var button = new JX.PHUIXButtonView(); + defaults = { + text: null, + icon: null, + type: null, + color: null + }; + + spec = JX.copy(defaults, config.spec); + + if (spec.text !== null) { + button.setText(spec.text); + } + + if (spec.icon !== null) { + button.setIcon(spec.icon); + } + + if (spec.type !== null) { + button.setButtonType(spec.type); + } + + if (spec.color !== null) { + button.setColor(spec.color); + } + + node = button.getNode(); + break; + case 'icon': + var icon = new JX.PHUIXIconView(); + defaults = { + icon: null, + color: null + }; + + spec = JX.copy(defaults, config.spec); + + if (spec.icon !== null) { + icon.setIcon(spec.icon); + } + + if (spec.color !== null) { + icon.setColor(spec.color); + } + + node = icon.getNode(); + break; + } + + JX.DOM.setContent(JX.$(config.id), node); +}); diff --git a/webroot/rsrc/js/phuix/PHUIXFormControl.js b/webroot/rsrc/js/phuix/PHUIXFormControl.js new file mode 100644 index 0000000000..88a1cd3f3d --- /dev/null +++ b/webroot/rsrc/js/phuix/PHUIXFormControl.js @@ -0,0 +1,381 @@ +/** + * @provides phuix-form-control-view + * @requires javelin-install + * javelin-dom + */ + +JX.install('PHUIXFormControl', { + + members: { + _node: null, + _labelNode: null, + _errorNode: null, + _inputNode: null, + _className: null, + _valueSetCallback: null, + _valueGetCallback: null, + _rawInputNode: null, + _tokenizer: null, + + setLabel: function(label) { + JX.DOM.setContent(this._getLabelNode(), label); + return this; + }, + + setError: function(error) { + JX.DOM.setContent(this._getErrorNode(), error); + return this; + }, + + setClass: function(className) { + this._className = className; + return this; + }, + + setControl: function(type, spec) { + var node = this._getInputNode(); + + var input; + switch (type) { + case 'tokenizer': + input = this._newTokenizer(spec); + break; + case 'select': + input = this._newSelect(spec); + break; + case 'points': + input = this._newPoints(spec); + break; + case 'optgroups': + input = this._newOptgroups(spec); + break; + case 'static': + input = this._newStatic(spec); + break; + case 'checkboxes': + input = this._newCheckboxes(spec); + break; + case 'text': + input = this._newText(spec); + break; + case 'remarkup': + input = this._newRemarkup(spec); + break; + default: + // TODO: Default or better error? + JX.$E('Bad Input Type'); + return; + } + + JX.DOM.setContent(node, input.node); + this._valueGetCallback = input.get; + this._valueSetCallback = input.set; + this._rawInputNode = input.node; + this._tokenizer = input.tokenizer || null; + + return this; + }, + + setValue: function(value) { + this._valueSetCallback(value); + return this; + }, + + getValue: function() { + return this._valueGetCallback(); + }, + + getRawInputNode: function() { + return this._rawInputNode; + }, + + getTokenizer: function() { + return this._tokenizer; + }, + + getNode: function() { + if (!this._node) { + + var attrs = { + className: 'aphront-form-control ' + this._className + ' grouped' + }; + + var content = [ + this._getLabelNode(), + this._getErrorNode(), + this._getInputNode() + ]; + + this._node = JX.$N('div', attrs, content); + } + + return this._node; + }, + + _getLabelNode: function() { + if (!this._labelNode) { + var attrs = { + className: 'aphront-form-label' + }; + + this._labelNode = JX.$N('label', attrs); + } + + return this._labelNode; + }, + + _getErrorNode: function() { + if (!this._errorNode) { + var attrs = { + className: 'aphront-form-error' + }; + + this._errorNode = JX.$N('span', attrs); + } + + return this._errorNode; + }, + + _getInputNode: function() { + if (!this._inputNode) { + var attrs = { + className: 'aphront-form-input' + }; + + this._inputNode = JX.$N('div', attrs); + } + + return this._inputNode; + }, + + _newTokenizer: function(spec) { + var build = JX.Prefab.newTokenizerFromTemplate( + spec.markup, + spec.config); + build.tokenizer.start(); + + function get_value() { + return JX.keys(build.tokenizer.getTokens()); + } + + function set_value(map) { + var tokens = get_value(); + for (var ii = 0; ii < tokens.length; ii++) { + build.tokenizer.removeToken(tokens[ii]); + } + for (var k in map) { + var v = JX.Prefab.transformDatasourceResults(map[k]); + build.tokenizer.addToken(k, v); + } + } + + set_value(spec.value || {}); + + return { + node: build.node, + get: get_value, + set: set_value, + tokenizer: build.tokenizer + }; + }, + + _newSelect: function(spec) { + var node = JX.Prefab.renderSelect( + spec.options, + spec.value, + {}, + spec.order); + + return { + node: node, + get: function() { + return node.value; + }, + set: function(value) { + node.value = value; + } + }; + }, + + _newStatic: function(spec) { + var node = JX.$N( + 'div', + { + className: 'phui-form-static-action' + }, + spec.description || ''); + + return { + node: node, + get: function() { + return true; + }, + set: function() { + return; + } + }; + }, + + _newCheckboxes: function(spec) { + var checkboxes = []; + var checkbox_list = []; + for (var ii = 0; ii < spec.keys.length; ii++) { + var key = spec.keys[ii]; + var checkbox_id = 'checkbox-' + Math.floor(Math.random() * 1000000); + + var checkbox = JX.$N( + 'input', + { + type: 'checkbox', + value: key, + id: checkbox_id + }); + + checkboxes.push(checkbox); + + var label = JX.$N( + 'label', + { + className: 'phuix-form-checkbox-label', + htmlFor: checkbox_id + }, + JX.$H(spec.labels[key] || '')); + + var display = JX.$N( + 'div', + { + className: 'phuix-form-checkbox-item' + }, + [checkbox, label]); + + checkbox_list.push(display); + } + + var node = JX.$N( + 'div', + { + className: 'phuix-form-checkbox-action' + }, + checkbox_list); + + var get_value = function() { + var list = []; + for (var ii = 0; ii < checkboxes.length; ii++) { + if (checkboxes[ii].checked) { + list.push(checkboxes[ii].value); + } + } + return list; + }; + + var set_value = function(value) { + value = value || []; + + if (!value.length) { + value = []; + } + + var map = {}; + var ii; + for (ii = 0; ii < value.length; ii++) { + map[value[ii]] = true; + } + + for (ii = 0; ii < checkboxes.length; ii++) { + if (map.hasOwnProperty(checkboxes[ii].value)) { + checkboxes[ii].checked = 'checked'; + } else { + checkboxes[ii].checked = false; + } + } + }; + + set_value(spec.value); + + return { + node: node, + get: get_value, + set: set_value + }; + }, + + _newPoints: function(spec) { + return this._newText(spec); + }, + + _newText: function(spec) { + var attrs = { + type: 'text', + value: spec.value + }; + + var node = JX.$N('input', attrs); + + return { + node: node, + get: function() { + return node.value; + }, + set: function(value) { + node.value = value; + } + }; + }, + + _newRemarkup: function(spec) { + var attrs = {}; + + // We could imagine a world where this renders a full remarkup control + // with all the hint buttons and client behaviors, but today much of that + // behavior is defined server-side and thus this isn't a world we + // currently live in. + + var node = JX.$N('textarea', attrs); + node.value = spec.value || ''; + + return { + node: node, + get: function() { + return node.value; + }, + set: function(value) { + node.value = value; + } + }; + }, + + _newOptgroups: function(spec) { + var value = spec.value || null; + + var optgroups = []; + for (var ii = 0; ii < spec.groups.length; ii++) { + var group = spec.groups[ii]; + var options = []; + for (var jj = 0; jj < group.options.length; jj++) { + var option = group.options[jj]; + options.push(JX.$N('option', {value: option.key}, option.label)); + + if (option.selected && (value === null)) { + value = option.key; + } + } + optgroups.push(JX.$N('optgroup', {label: group.label}, options)); + } + + var node = JX.$N('select', {}, optgroups); + node.value = value; + + return { + node: node, + get: function() { + return node.value; + }, + set: function(value) { + node.value = value; + } + }; + } + + } + +}); diff --git a/webroot/rsrc/js/phuix/PHUIXFormationColumnView.js b/webroot/rsrc/js/phuix/PHUIXFormationColumnView.js new file mode 100644 index 0000000000..16831cc488 --- /dev/null +++ b/webroot/rsrc/js/phuix/PHUIXFormationColumnView.js @@ -0,0 +1,198 @@ +/** + * @provides phuix-formation-column-view + * @requires javelin-install + * javelin-dom + */ + +JX.install('PHUIXFormationColumnView', { + + construct: function(node) { + this._node = node; + }, + + properties: { + isRightAligned: false, + isVisible: true, + expanderNode: null, + resizerItem: null, + resizerControl: null, + width: null, + widthSettingKey: null, + visibleSettingKey: null, + minimumWidth: null, + maximumWidth: null, + flank: null + }, + + members: { + _node: null, + _resizingWidth: null, + _resizingBarPosition: null, + _dragging: null, + + start: function() { + var onshow = JX.bind(this, this._setVisibility, true); + var onhide = JX.bind(this, this._setVisibility, false); + + JX.DOM.listen(this._node, 'click', 'phui-flank-header-hide', onhide); + + var expander = this.getExpanderNode(); + if (expander) { + JX.DOM.listen(expander, 'click', null, onshow); + } + + var resizer = this.getResizerItem(); + if (resizer) { + var ondown = JX.bind(this, this._onresizestart); + JX.DOM.listen(resizer, 'mousedown', null, ondown); + + var onmove = JX.bind(this, this._onresizemove); + JX.Stratcom.listen('mousemove', null, onmove); + + var onup = JX.bind(this, this._onresizeend); + JX.Stratcom.listen('mouseup', null, onup); + } + + this.repaint(); + }, + + _onresizestart: function(e) { + if (!e.isNormalMouseEvent()) { + return; + } + + this._dragging = JX.$V(e); + this._resizingWidth = this.getWidth(); + this._resizingBarPosition = JX.$V(this.getResizerControl()); + + // Show the "col-resize" cursor on the whole document while we're + // dragging, since the mouse will slip off the actual bar fairly often + // and we don't want it to flicker. + JX.DOM.alterClass(document.body, 'jx-drag-col', true); + + e.kill(); + }, + + _onresizemove: function(e) { + if (!this._dragging) { + return; + } + + var dx = (JX.$V(e).x - this._dragging.x); + + var width; + if (this.getIsRightAligned()) { + width = this.getWidth() - dx; + } else { + width = this.getWidth() + dx; + } + + var min_width = this.getMinimumWidth(); + if (min_width) { + width = Math.max(width, min_width); + } + + var max_width = this.getMaximumWidth(); + if (max_width) { + width = Math.min(width, max_width); + } + + this._resizingWidth = width; + + this._node.style.width = this._resizingWidth + 'px'; + + var adjust_x = (this._resizingWidth - this.getWidth()); + if (this.getIsRightAligned()) { + adjust_x = -adjust_x; + } + + this.getResizerControl().style.left = + (this._resizingBarPosition.x + adjust_x) + 'px'; + + var flank = this.getFlank(); + if (flank) { + flank + .setWidth(this._resizingWidth) + .repaint(); + } + }, + + _onresizeend: function(e) { + if (!this._dragging) { + return; + } + + this.setWidth(this._resizingWidth); + + JX.DOM.alterClass(document.body, 'jx-drag-col', false); + this._dragging = null; + + var width_key = this.getWidthSettingKey(); + if (width_key) { + this._adjustSetting(width_key, this.getWidth()); + } + }, + + _setVisibility: function(visible, e) { + e.kill(); + this.setVisibility(visible); + }, + + toggleVisibility: function() { + return this.setVisibility(!this.getIsVisible()); + }, + + setVisibility: function(visible) { + this.setIsVisible(visible); + this.repaint(); + + var visible_key = this.getVisibleSettingKey(); + if (visible_key) { + this._adjustSetting(visible_key, visible ? 1 : 0); + } + + return this; + }, + + _adjustSetting: function(key, value) { + new JX.Request('/settings/adjust/', JX.bag) + .setData( + { + key: key, + value: value + }) + .send(); + }, + + repaint: function() { + var resizer = this.getResizerItem(); + var expander = this.getExpanderNode(); + + if (this.getIsVisible()) { + JX.DOM.show(this._node); + if (resizer) { + JX.DOM.show(resizer); + } + if (expander) { + JX.DOM.hide(expander); + } + } else { + JX.DOM.hide(this._node); + if (resizer) { + JX.DOM.hide(resizer); + } + if (expander) { + JX.DOM.show(expander); + } + } + + if (this.getFlank()) { + this.getFlank().repaint(); + } + + }, + + + } + +}); diff --git a/webroot/rsrc/js/phuix/PHUIXFormationFlankView.js b/webroot/rsrc/js/phuix/PHUIXFormationFlankView.js new file mode 100644 index 0000000000..28b5d80703 --- /dev/null +++ b/webroot/rsrc/js/phuix/PHUIXFormationFlankView.js @@ -0,0 +1,57 @@ +/** + * @provides phuix-formation-flank-view + * @requires javelin-install + * javelin-dom + */ + +JX.install('PHUIXFormationFlankView', { + + construct: function(node, head, body, tail) { + this._node = node; + + this._headNode = head; + this._bodyNode = body; + this._tailNode = tail; + }, + + properties: { + isFixed: false, + bannerHeight: null, + width: null + }, + + members: { + _node: null, + _headNode: null, + _bodyNode: null, + _tailNode: null, + + getBodyNode: function() { + return this._bodyNode; + }, + + getTailNode: function() { + return this._tailNode; + }, + + repaint: function() { + if (!this.getIsFixed()) { + return; + } + + this._node.style.top = this.getBannerHeight() + 'px'; + this._node.style.width = this.getWidth() + 'px'; + + var body = this.getBodyNode(); + var body_pos = JX.$V(body); + + var tail = this.getTailNode(); + var tail_pos = JX.$V(tail); + + var max_height = (tail_pos.y - body_pos.y); + + body.style.maxHeight = max_height + 'px'; + } + } + +}); diff --git a/webroot/rsrc/js/phuix/PHUIXFormationView.js b/webroot/rsrc/js/phuix/PHUIXFormationView.js new file mode 100644 index 0000000000..b31e7878da --- /dev/null +++ b/webroot/rsrc/js/phuix/PHUIXFormationView.js @@ -0,0 +1,127 @@ +/** + * @provides phuix-formation-view + * @requires javelin-install + * javelin-dom + * phuix-formation-column-view + * phuix-formation-flank-view + */ + +JX.install('PHUIXFormationView', { + + construct: function(node) { + this._node = node; + this._columns = []; + + var config = JX.Stratcom.getData(this._node); + + var items = config.items; + var count = items.length; + for (var ii = 0; ii < count; ii++) { + var item = items[ii]; + var item_node = JX.$(item.itemID); + + var column = new JX.PHUIXFormationColumnView(item_node) + .setIsRightAligned(item.isRightAligned) + .setWidth(item.width) + .setIsVisible(item.isVisible); + + if (item.expanderID) { + column.setExpanderNode(JX.$(item.expanderID)); + } + + if (item.resizer) { + column + .setWidthSettingKey(item.resizer.widthKey) + .setVisibleSettingKey(item.resizer.visibleKey) + .setMinimumWidth(item.resizer.minimumWidth) + .setMaximumWidth(item.resizer.maximumWidth) + .setResizerItem(JX.$(item.resizer.itemID)) + .setResizerControl(JX.$(item.resizer.controlID)); + } + + var spec = item.column; + if (spec) { + if (spec.type === 'flank') { + var flank_node = JX.$(spec.nodeID); + + var head = JX.$(spec.headID); + var body = JX.$(spec.bodyID); + var tail = JX.$(spec.tailID); + + var flank = new JX.PHUIXFormationFlankView( + flank_node, + head, + body, + tail); + + flank.setIsFixed(spec.isFixed); + + column.setFlank(flank); + } + } + + this.addColumn(column); + } + }, + + members: { + _node: null, + _columns: null, + + addColumn: function(column) { + this._columns.push(column); + }, + + getColumn: function(idx) { + return this._columns[idx]; + }, + + start: function() { + JX.enableDispatch(document.body, 'mousemove'); + + for (var ii = 0; ii < this._columns.length; ii++) { + this._columns[ii].start(); + } + + var repaint = JX.bind(this, this.repaint); + JX.Stratcom.listen(['scroll', 'resize'], null, repaint); + + this.repaint(); + }, + + repaint: function(e) { + // Unless we've scrolled past it, the page has a 44px main menu banner. + var menu_height = (44 - JX.Vector.getScroll().y); + + // When the buoyant header is visible, move the menu down below it. This + // is a bit of a hack. + var banner_height = 0; + try { + var banner = JX.$('diff-banner'); + banner_height = JX.Vector.getDim(banner).y; + } catch (error) { + // Ignore if there's no banner on the page. + } + + var header_height = Math.max(0, menu_height, banner_height); + + var column; + var flank; + for (var ii = 0; ii < this._columns.length; ii++) { + column = this._columns[ii]; + + flank = column.getFlank(); + if (!flank) { + continue; + } + + flank + .setBannerHeight(header_height) + .setWidth(column.getWidth()) + .repaint(); + } + } + + } + +}); diff --git a/webroot/rsrc/js/phuix/PHUIXIconView.js b/webroot/rsrc/js/phuix/PHUIXIconView.js new file mode 100644 index 0000000000..f341e54967 --- /dev/null +++ b/webroot/rsrc/js/phuix/PHUIXIconView.js @@ -0,0 +1,47 @@ +/** + * @provides phuix-icon-view + * @requires javelin-install + * javelin-dom + */ + +JX.install('PHUIXIconView', { + + members: { + _node: null, + _icon: null, + _color: null, + + setIcon: function(icon) { + var node = this.getNode(); + if (this._icon) { + JX.DOM.alterClass(node, this._icon, false); + } + this._icon = icon; + JX.DOM.alterClass(node, this._icon, true); + return this; + }, + + setColor: function(color) { + var node = this.getNode(); + if (this._color) { + JX.DOM.alterClass(node, this._color, false); + } + this._color = color; + JX.DOM.alterClass(node, this._color, true); + return this; + }, + + getNode: function() { + if (!this._node) { + var attrs = { + className: 'phui-icon-view phui-font-fa' + }; + + this._node = JX.$N('span', attrs); + } + + return this._node; + } + } + +}); diff --git a/webroot/rsrc/swf/aphlict.swf b/webroot/rsrc/swf/aphlict.swf deleted file mode 100644 index 4ac315b9de..0000000000 Binary files a/webroot/rsrc/swf/aphlict.swf and /dev/null differ diff --git a/webroot/rsrc/swf/test.html b/webroot/rsrc/swf/test.html deleted file mode 100755 index 1cdf65ae62..0000000000 --- a/webroot/rsrc/swf/test.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file