summaryrefslogtreecommitdiffstats
path: root/admin/survey/minify/vendor/mrclay
diff options
context:
space:
mode:
Diffstat (limited to 'admin/survey/minify/vendor/mrclay')
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/.editorconfig19
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/.gitignore5
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/HISTORY.txt24
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/LICENSE.txt26
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/composer.json34
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/phpunit.xml.dist27
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/JSMin.php454
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/UnterminatedCommentException.php6
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/UnterminatedRegExpException.php6
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/UnterminatedStringException.php6
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/before.js27
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/condcomm.js6
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/issue144.js1
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/issue256.js2
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/keyword-regex.js1
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/not-regexp.js1
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/regexes.js2
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/starts-regex.js1
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/token-regexp.js1
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/before.js66
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/condcomm.js14
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/issue144.js9
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/issue256.js3
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/keyword-regex.js3
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/not-regexp.js3
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/regexes.js24
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/starts-regex.js3
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/token-regexp.js3
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/Tests/JSMin/JSMinTest.php168
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/tests/bootstrap.php1
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/web/README.txt2
-rw-r--r--admin/survey/minify/vendor/mrclay/jsmin-php/web/index.php92
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/.gitignore21
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/.travis.yml30
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/LICENSE19
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/README.md165
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/composer.json27
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/phpunit.xml27
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/scripts/example-pimple.php75
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/scripts/example.php71
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/scripts/pizza.php55
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/src/Props/BadMethodCallException.php9
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/src/Props/Container.php249
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/src/Props/FactoryUncallableException.php9
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/src/Props/NotFoundException.php9
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/src/Props/Pimple.php56
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/src/Props/ValueUnresolvableException.php9
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/test/Props/ContainerTest.php324
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/Invokable.php38
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/NonInvokable.php34
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/PimpleTest.php452
-rw-r--r--admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/Service.php38
52 files changed, 2757 insertions, 0 deletions
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/.editorconfig b/admin/survey/minify/vendor/mrclay/jsmin-php/.editorconfig
new file mode 100644
index 0000000..4a017bc
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/.editorconfig
@@ -0,0 +1,19 @@
+# top-most EditorConfig file
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+
+; temporary
+trim_trailing_whitespace = false
+
+[*.php]
+indent_style = space
+indent_size = 4
+insert_final_newline = true
+
+[vendor/**]
+; Use editor default (possible autodetection).
+indent_style =
+indent_size =
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/.gitignore b/admin/survey/minify/vendor/mrclay/jsmin-php/.gitignore
new file mode 100644
index 0000000..8f56454
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/.gitignore
@@ -0,0 +1,5 @@
+.idea/
+.DS_Store
+/vendor
+/composer.lock
+/tests/Resources/*/actual/* \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/HISTORY.txt b/admin/survey/minify/vendor/mrclay/jsmin-php/HISTORY.txt
new file mode 100644
index 0000000..90fcf5b
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/HISTORY.txt
@@ -0,0 +1,24 @@
+JSMin fixes (from Minify)
+
+Version 2.3.0
+ * Removes leading UTF-8 BOM
+
+Version 2.2.0
+ * Fix handling of RegEx in certain situations in JSMin
+ * Fix bug in JSMin exceptions
+
+Version 2.1.6
+ * JSMin fixes
+
+Version 2.1.4
+ * JSMin won't choke on common Closure compiler syntaxes (i+ ++j)
+ * mbstring.func_overload usage is safer
+
+Version 2.1.2
+ * quote characters inside RegExp literals no longer cause exception
+
+Version 2.1.0
+ * JS: preserves IE conditional comments
+
+Version 1.0.1 (2007-05-05)
+ * Replaced old JSMin library with a much faster custom implementation.
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/LICENSE.txt b/admin/survey/minify/vendor/mrclay/jsmin-php/LICENSE.txt
new file mode 100644
index 0000000..d88c1b3
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/LICENSE.txt
@@ -0,0 +1,26 @@
+Copyright (c) 2008 Ryan Grove <ryan@wonko.com>
+Copyright (c) 2008 Steve Clay <steve@mrclay.org>
+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 this project nor the names of its contributors may be
+ used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 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/admin/survey/minify/vendor/mrclay/jsmin-php/composer.json b/admin/survey/minify/vendor/mrclay/jsmin-php/composer.json
new file mode 100644
index 0000000..202348c
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/composer.json
@@ -0,0 +1,34 @@
+{
+ "name": "mrclay/jsmin-php",
+ "type": "library",
+ "description": "Provides a modified port of Douglas Crockford's jsmin.c, which removes unnecessary whitespace from JavaScript files.",
+ "keywords": ["jsmin", "minify", "compress"],
+ "homepage": "https://github.com/mrclay/jsmin-php/",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Stephen Clay",
+ "email": "steve@mrclay.org",
+ "role": "Developer"
+ },
+ {
+ "name": "Ryan Grove",
+ "email": "ryan@wonko.com",
+ "role": "Developer"
+ }
+ ],
+ "support": {
+ "email": "minify@googlegroups.com",
+ "issues": "https://github.com/mrclay/jsmin-php/issues"
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "ext-pcre": "*"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.2"
+ },
+ "autoload": {
+ "psr-0": {"JSMin\\": "src/"}
+ }
+}
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/phpunit.xml.dist b/admin/survey/minify/vendor/mrclay/jsmin-php/phpunit.xml.dist
new file mode 100644
index 0000000..ec53e75
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/phpunit.xml.dist
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+ backupStaticAttributes="false"
+ colors="true"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ processIsolation="false"
+ bootstrap="tests/bootstrap.php"
+ >
+ <testsuites>
+ <testsuite name="JSMin Test Suite">
+ <directory>./tests/</directory>
+ </testsuite>
+ </testsuites>
+
+ <filter>
+ <whitelist>
+ <directory>./</directory>
+ <exclude>
+ <directory>./tests</directory>
+ <directory>./vendor</directory>
+ </exclude>
+ </whitelist>
+ </filter>
+</phpunit> \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/JSMin.php b/admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/JSMin.php
new file mode 100644
index 0000000..9dc2e20
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/JSMin.php
@@ -0,0 +1,454 @@
+<?php
+
+namespace JSMin;
+
+/**
+ * JSMin.php - modified PHP implementation of Douglas Crockford's JSMin.
+ *
+ * <code>
+ * $minifiedJs = JSMin::minify($js);
+ * </code>
+ *
+ * This is a modified port of jsmin.c. Improvements:
+ *
+ * Does not choke on some regexp literals containing quote characters. E.g. /'/
+ *
+ * Spaces are preserved after some add/sub operators, so they are not mistakenly
+ * converted to post-inc/dec. E.g. a + ++b -> a+ ++b
+ *
+ * Preserves multi-line comments that begin with /*!
+ *
+ * PHP 5 or higher is required.
+ *
+ * Permission is hereby granted to use this version of the library under the
+ * same terms as jsmin.c, which has the following license:
+ *
+ * --
+ * Copyright (c) 2002 Douglas Crockford (www.crockford.com)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * The Software shall be used for Good, not Evil.
+ *
+ * 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.
+ * --
+ *
+ * @package JSMin
+ * @author Ryan Grove <ryan@wonko.com> (PHP port)
+ * @author Steve Clay <steve@mrclay.org> (modifications + cleanup)
+ * @author Andrea Giammarchi <http://www.3site.eu> (spaceBeforeRegExp)
+ * @copyright 2002 Douglas Crockford <douglas@crockford.com> (jsmin.c)
+ * @copyright 2008 Ryan Grove <ryan@wonko.com> (PHP port)
+ * @license http://opensource.org/licenses/mit-license.php MIT License
+ * @link http://code.google.com/p/jsmin-php/
+ */
+class JSMin {
+ const ORD_LF = 10;
+ const ORD_SPACE = 32;
+ const ACTION_KEEP_A = 1;
+ const ACTION_DELETE_A = 2;
+ const ACTION_DELETE_A_B = 3;
+
+ protected $a = "\n";
+ protected $b = '';
+ protected $input = '';
+ protected $inputIndex = 0;
+ protected $inputLength = 0;
+ protected $lookAhead = null;
+ protected $output = '';
+ protected $lastByteOut = '';
+ protected $keptComment = '';
+
+ /**
+ * Minify Javascript.
+ *
+ * @param string $js Javascript to be minified
+ *
+ * @return string
+ */
+ public static function minify($js)
+ {
+ $jsmin = new JSMin($js);
+ return $jsmin->min();
+ }
+
+ /**
+ * @param string $input
+ */
+ public function __construct($input)
+ {
+ $this->input = $input;
+ }
+
+ /**
+ * Perform minification, return result
+ *
+ * @return string
+ */
+ public function min()
+ {
+ if ($this->output !== '') { // min already run
+ return $this->output;
+ }
+
+ $mbIntEnc = null;
+ if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) {
+ $mbIntEnc = mb_internal_encoding();
+ mb_internal_encoding('8bit');
+ }
+
+ if (isset($this->input[0]) && $this->input[0] === "\xef") {
+ $this->input = substr($this->input, 3);
+ }
+
+ $this->input = str_replace("\r\n", "\n", $this->input);
+ $this->inputLength = strlen($this->input);
+
+ $this->action(self::ACTION_DELETE_A_B);
+
+ while ($this->a !== null) {
+ // determine next command
+ $command = self::ACTION_KEEP_A; // default
+ if ($this->a === ' ') {
+ if (($this->lastByteOut === '+' || $this->lastByteOut === '-')
+ && ($this->b === $this->lastByteOut)) {
+ // Don't delete this space. If we do, the addition/subtraction
+ // could be parsed as a post-increment
+ } elseif (! $this->isAlphaNum($this->b)) {
+ $command = self::ACTION_DELETE_A;
+ }
+ } elseif ($this->a === "\n") {
+ if ($this->b === ' ') {
+ $command = self::ACTION_DELETE_A_B;
+
+ // in case of mbstring.func_overload & 2, must check for null b,
+ // otherwise mb_strpos will give WARNING
+ } elseif ($this->b === null
+ || (false === strpos('{[(+-!~', $this->b)
+ && ! $this->isAlphaNum($this->b))) {
+ $command = self::ACTION_DELETE_A;
+ }
+ } elseif (! $this->isAlphaNum($this->a)) {
+ if ($this->b === ' '
+ || ($this->b === "\n"
+ && (false === strpos('}])+-"\'', $this->a)))) {
+ $command = self::ACTION_DELETE_A_B;
+ }
+ }
+ $this->action($command);
+ }
+ $this->output = trim($this->output);
+
+ if ($mbIntEnc !== null) {
+ mb_internal_encoding($mbIntEnc);
+ }
+ return $this->output;
+ }
+
+ /**
+ * ACTION_KEEP_A = Output A. Copy B to A. Get the next B.
+ * ACTION_DELETE_A = Copy B to A. Get the next B.
+ * ACTION_DELETE_A_B = Get the next B.
+ *
+ * @param int $command
+ * @throws UnterminatedRegExpException|UnterminatedStringException
+ */
+ protected function action($command)
+ {
+ // make sure we don't compress "a + ++b" to "a+++b", etc.
+ if ($command === self::ACTION_DELETE_A_B
+ && $this->b === ' '
+ && ($this->a === '+' || $this->a === '-')) {
+ // Note: we're at an addition/substraction operator; the inputIndex
+ // will certainly be a valid index
+ if ($this->input[$this->inputIndex] === $this->a) {
+ // This is "+ +" or "- -". Don't delete the space.
+ $command = self::ACTION_KEEP_A;
+ }
+ }
+
+ switch ($command) {
+ case self::ACTION_KEEP_A: // 1
+ $this->output .= $this->a;
+
+ if ($this->keptComment) {
+ $this->output = rtrim($this->output, "\n");
+ $this->output .= $this->keptComment;
+ $this->keptComment = '';
+ }
+
+ $this->lastByteOut = $this->a;
+
+ // fallthrough intentional
+ case self::ACTION_DELETE_A: // 2
+ $this->a = $this->b;
+ if ($this->a === "'" || $this->a === '"') { // string literal
+ $str = $this->a; // in case needed for exception
+ for(;;) {
+ $this->output .= $this->a;
+ $this->lastByteOut = $this->a;
+
+ $this->a = $this->get();
+ if ($this->a === $this->b) { // end quote
+ break;
+ }
+ if ($this->isEOF($this->a)) {
+ $byte = $this->inputIndex - 1;
+ throw new UnterminatedStringException(
+ "JSMin: Unterminated String at byte {$byte}: {$str}");
+ }
+ $str .= $this->a;
+ if ($this->a === '\\') {
+ $this->output .= $this->a;
+ $this->lastByteOut = $this->a;
+
+ $this->a = $this->get();
+ $str .= $this->a;
+ }
+ }
+ }
+
+ // fallthrough intentional
+ case self::ACTION_DELETE_A_B: // 3
+ $this->b = $this->next();
+ if ($this->b === '/' && $this->isRegexpLiteral()) {
+ $this->output .= $this->a . $this->b;
+ $pattern = '/'; // keep entire pattern in case we need to report it in the exception
+ for(;;) {
+ $this->a = $this->get();
+ $pattern .= $this->a;
+ if ($this->a === '[') {
+ for(;;) {
+ $this->output .= $this->a;
+ $this->a = $this->get();
+ $pattern .= $this->a;
+ if ($this->a === ']') {
+ break;
+ }
+ if ($this->a === '\\') {
+ $this->output .= $this->a;
+ $this->a = $this->get();
+ $pattern .= $this->a;
+ }
+ if ($this->isEOF($this->a)) {
+ throw new UnterminatedRegExpException(
+ "JSMin: Unterminated set in RegExp at byte "
+ . $this->inputIndex .": {$pattern}");
+ }
+ }
+ }
+
+ if ($this->a === '/') { // end pattern
+ break; // while (true)
+ } elseif ($this->a === '\\') {
+ $this->output .= $this->a;
+ $this->a = $this->get();
+ $pattern .= $this->a;
+ } elseif ($this->isEOF($this->a)) {
+ $byte = $this->inputIndex - 1;
+ throw new UnterminatedRegExpException(
+ "JSMin: Unterminated RegExp at byte {$byte}: {$pattern}");
+ }
+ $this->output .= $this->a;
+ $this->lastByteOut = $this->a;
+ }
+ $this->b = $this->next();
+ }
+ // end case ACTION_DELETE_A_B
+ }
+ }
+
+ /**
+ * @return bool
+ */
+ protected function isRegexpLiteral()
+ {
+ if (false !== strpos("(,=:[!&|?+-~*{;", $this->a)) {
+ // we can't divide after these tokens
+ return true;
+ }
+
+ // check if first non-ws token is "/" (see starts-regex.js)
+ $length = strlen($this->output);
+ if ($this->a === ' ' || $this->a === "\n") {
+ if ($length < 2) { // weird edge case
+ return true;
+ }
+ }
+
+ // if the "/" follows a keyword, it must be a regexp, otherwise it's best to assume division
+
+ $subject = $this->output . trim($this->a);
+ if (!preg_match('/(?:case|else|in|return|typeof)$/', $subject, $m)) {
+ // not a keyword
+ return false;
+ }
+
+ // can't be sure it's a keyword yet (see not-regexp.js)
+ $charBeforeKeyword = substr($subject, 0 - strlen($m[0]) - 1, 1);
+ if ($this->isAlphaNum($charBeforeKeyword)) {
+ // this is really an identifier ending in a keyword, e.g. "xreturn"
+ return false;
+ }
+
+ // it's a regexp. Remove unneeded whitespace after keyword
+ if ($this->a === ' ' || $this->a === "\n") {
+ $this->a = '';
+ }
+
+ return true;
+ }
+
+ /**
+ * Return the next character from stdin. Watch out for lookahead. If the character is a control character,
+ * translate it to a space or linefeed.
+ *
+ * @return string
+ */
+ protected function get()
+ {
+ $c = $this->lookAhead;
+ $this->lookAhead = null;
+ if ($c === null) {
+ // getc(stdin)
+ if ($this->inputIndex < $this->inputLength) {
+ $c = $this->input[$this->inputIndex];
+ $this->inputIndex += 1;
+ } else {
+ $c = null;
+ }
+ }
+ if (ord($c) >= self::ORD_SPACE || $c === "\n" || $c === null) {
+ return $c;
+ }
+ if ($c === "\r") {
+ return "\n";
+ }
+ return ' ';
+ }
+
+ /**
+ * Does $a indicate end of input?
+ *
+ * @param string $a
+ * @return bool
+ */
+ protected function isEOF($a)
+ {
+ return ord($a) <= self::ORD_LF;
+ }
+
+ /**
+ * Get next char (without getting it). If is ctrl character, translate to a space or newline.
+ *
+ * @return string
+ */
+ protected function peek()
+ {
+ $this->lookAhead = $this->get();
+ return $this->lookAhead;
+ }
+
+ /**
+ * Return true if the character is a letter, digit, underscore, dollar sign, or non-ASCII character.
+ *
+ * @param string $c
+ *
+ * @return bool
+ */
+ protected function isAlphaNum($c)
+ {
+ return (preg_match('/^[a-z0-9A-Z_\\$\\\\]$/', $c) || ord($c) > 126);
+ }
+
+ /**
+ * Consume a single line comment from input (possibly retaining it)
+ */
+ protected function consumeSingleLineComment()
+ {
+ $comment = '';
+ while (true) {
+ $get = $this->get();
+ $comment .= $get;
+ if (ord($get) <= self::ORD_LF) { // end of line reached
+ // if IE conditional comment
+ if (preg_match('/^\\/@(?:cc_on|if|elif|else|end)\\b/', $comment)) {
+ $this->keptComment .= "/{$comment}";
+ }
+ return;
+ }
+ }
+ }
+
+ /**
+ * Consume a multiple line comment from input (possibly retaining it)
+ *
+ * @throws UnterminatedCommentException
+ */
+ protected function consumeMultipleLineComment()
+ {
+ $this->get();
+ $comment = '';
+ for(;;) {
+ $get = $this->get();
+ if ($get === '*') {
+ if ($this->peek() === '/') { // end of comment reached
+ $this->get();
+ if (0 === strpos($comment, '!')) {
+ // preserved by YUI Compressor
+ if (!$this->keptComment) {
+ // don't prepend a newline if two comments right after one another
+ $this->keptComment = "\n";
+ }
+ $this->keptComment .= "/*!" . substr($comment, 1) . "*/\n";
+ } else if (preg_match('/^@(?:cc_on|if|elif|else|end)\\b/', $comment)) {
+ // IE conditional
+ $this->keptComment .= "/*{$comment}*/";
+ }
+ return;
+ }
+ } elseif ($get === null) {
+ throw new UnterminatedCommentException(
+ "JSMin: Unterminated comment at byte {$this->inputIndex}: /*{$comment}");
+ }
+ $comment .= $get;
+ }
+ }
+
+ /**
+ * Get the next character, skipping over comments. Some comments may be preserved.
+ *
+ * @return string
+ */
+ protected function next()
+ {
+ $get = $this->get();
+ if ($get === '/') {
+ switch ($this->peek()) {
+ case '/':
+ $this->consumeSingleLineComment();
+ $get = "\n";
+ break;
+ case '*':
+ $this->consumeMultipleLineComment();
+ $get = ' ';
+ break;
+ }
+ }
+ return $get;
+ }
+}
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/UnterminatedCommentException.php b/admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/UnterminatedCommentException.php
new file mode 100644
index 0000000..3ee2b01
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/UnterminatedCommentException.php
@@ -0,0 +1,6 @@
+<?php
+
+namespace JSMin;
+
+class UnterminatedCommentException extends \Exception {
+}
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/UnterminatedRegExpException.php b/admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/UnterminatedRegExpException.php
new file mode 100644
index 0000000..0aaf5f1
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/UnterminatedRegExpException.php
@@ -0,0 +1,6 @@
+<?php
+
+namespace JSMin;
+
+class UnterminatedRegExpException extends \Exception {
+}
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/UnterminatedStringException.php b/admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/UnterminatedStringException.php
new file mode 100644
index 0000000..0da6e48
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/src/JSMin/UnterminatedStringException.php
@@ -0,0 +1,6 @@
+<?php
+
+namespace JSMin;
+
+class UnterminatedStringException extends \Exception {
+}
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/before.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/before.js
new file mode 100644
index 0000000..e63d477
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/before.js
@@ -0,0 +1,27 @@
+/*! is.js
+
+ (c) 2001 Douglas Crockford
+ 2001 June 3
+*/
+var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
+/*!*
+ * preserve this comment, too
+ */
+is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
+if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}/*@cc_on
+ /*@if (@_win32)
+ if (is.ie && is.win)
+ document.write("PASS: IE/win honored conditional comment.<br>");
+ @else @*/if(is.ie&&is.win)
+document.write("FAIL: IE/win did not honor multi-line conditional comment.<br>");else
+document.write("PASS: Non-IE/win browser ignores multi-line conditional comment.<br>");/*@end
+@*/var recognizesCondComm=true;//@cc_on/*
+recognizesCondComm=false;//@cc_on*/
+if((is.ie&&is.win)==recognizesCondComm)
+document.write("PASS: IE/win honored single-line conditional comment.<br>");else
+document.write("FAIL: Non-IE/win browser did not ignore single-line conditional comment.<br>");//@cc_on/*
+//@cc_on*/
+//@cc_on/*
+'hello';
+/*!* preserved */
+/*!* preserved */ \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/condcomm.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/condcomm.js
new file mode 100644
index 0000000..ff2c122
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/condcomm.js
@@ -0,0 +1,6 @@
+var isWin;/*@cc_on
+ @if (@_win32)
+ isWin = true;
+ @else @*/isWin=false;/*@end
+@*/isWin=/*@cc_on!*/!1;var recognizesCondComm=true;//@cc_on/*
+recognizesCondComm=false;//@cc_on*/ \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/issue144.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/issue144.js
new file mode 100644
index 0000000..e339d0a
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/issue144.js
@@ -0,0 +1 @@
+a/++b;a*--b;a++-b;a+--b;a-++b;a+-b;a+ ++b;a+--b;a- --b; \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/issue256.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/issue256.js
new file mode 100644
index 0000000..9c3ce2e
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/issue256.js
@@ -0,0 +1,2 @@
+!function(){}(window)
+!function(){}(window) \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/keyword-regex.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/keyword-regex.js
new file mode 100644
index 0000000..02ec79e
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/keyword-regex.js
@@ -0,0 +1 @@
+return/return/; \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/not-regexp.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/not-regexp.js
new file mode 100644
index 0000000..a7516fb
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/not-regexp.js
@@ -0,0 +1 @@
+!function(){return xreturn/foo}();!function(){return xtypeof/foo}(); \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/regexes.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/regexes.js
new file mode 100644
index 0000000..d47fdfc
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/regexes.js
@@ -0,0 +1,2 @@
+function testIssue74(){return/'/;}
+!function(s){return/^[£$€?.]/.test(s);}();typeof/ ' /;x=/ [/] /;1/foo;(2)/foo;function(){return/foo/};function(){return typeof/foo/}; \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/starts-regex.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/starts-regex.js
new file mode 100644
index 0000000..2623624
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/starts-regex.js
@@ -0,0 +1 @@
+/return/.test(bar); \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/token-regexp.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/token-regexp.js
new file mode 100644
index 0000000..13f263c
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/expected/token-regexp.js
@@ -0,0 +1 @@
+typeof[/return/]; \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/before.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/before.js
new file mode 100644
index 0000000..c28fbe9
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/before.js
@@ -0,0 +1,66 @@
+/*! is.js
+
+ (c) 2001 Douglas Crockford
+ 2001 June 3
+*/
+
+// is
+
+// The -is- object is used to identify the browser. Every browser edition
+// identifies itself, but there is no standard way of doing it, and some of
+// the identification is deceptive. This is because the authors of web
+// browsers are liars. For example, Microsoft's IE browsers claim to be
+// Mozilla 4. Netscape 6 claims to be version 5.
+
+var is = {
+ ie: navigator.appName == 'Microsoft Internet Explorer',
+ java: navigator.javaEnabled(),
+ ns: navigator.appName == 'Netscape',
+ ua: navigator.userAgent.toLowerCase(),
+ version: parseFloat(navigator.appVersion.substr(21)) ||
+ parseFloat(navigator.appVersion),
+ win: navigator.platform == 'Win32'
+}
+/*!*
+ * preserve this comment, too
+ */
+is.mac = is.ua.indexOf('mac') >= 0;
+if (is.ua.indexOf('opera') >= 0) {
+ is.ie = is.ns = false;
+ is.opera = true;
+}
+if (is.ua.indexOf('gecko') >= 0) {
+ is.ie = is.ns = false;
+ is.gecko = true;
+}
+
+/*@cc_on
+ /*@if (@_win32)
+ if (is.ie && is.win)
+ document.write("PASS: IE/win honored conditional comment.<br>");
+ @else @*/
+ if (is.ie && is.win)
+ document.write("FAIL: IE/win did not honor multi-line conditional comment.<br>");
+ else
+ document.write("PASS: Non-IE/win browser ignores multi-line conditional comment.<br>");
+ /*@end
+@*/
+
+var recognizesCondComm = true;
+//@cc_on/*
+recognizesCondComm = false;
+//@cc_on*/
+
+if ((is.ie && is.win) == recognizesCondComm)
+ document.write("PASS: IE/win honored single-line conditional comment.<br>");
+else
+ document.write("FAIL: Non-IE/win browser did not ignore single-line conditional comment.<br>");
+
+// hello
+//@cc_on/*
+// world
+//@cc_on*/
+//@cc_on/*
+'hello';
+/*!* preserved */
+/*!* preserved */ \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/condcomm.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/condcomm.js
new file mode 100644
index 0000000..b603aea
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/condcomm.js
@@ -0,0 +1,14 @@
+var isWin;
+/*@cc_on
+ @if (@_win32)
+ isWin = true;
+ @else @*/ isWin = false;
+ /*@end
+@*/
+
+isWin = /*@cc_on!*/!1;
+
+var recognizesCondComm = true;
+//@cc_on/*
+recognizesCondComm = false;
+//@cc_on*/
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/issue144.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/issue144.js
new file mode 100644
index 0000000..ba1b297
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/issue144.js
@@ -0,0 +1,9 @@
+a / ++b;
+a * --b;
+a++ - b;
+a + --b;
+a - ++b;
+a + -b;
+a + ++b;
+a + --b;
+a - --b; \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/issue256.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/issue256.js
new file mode 100644
index 0000000..df3dd45
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/issue256.js
@@ -0,0 +1,3 @@
+!function(){}(window)
+
+!function(){}(window) \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/keyword-regex.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/keyword-regex.js
new file mode 100644
index 0000000..5b2a47a
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/keyword-regex.js
@@ -0,0 +1,3 @@
+// this is specifically designed so that, if the first "/" is misinterpreted as division,
+// then "/;" will be interpreted as an incomplete regexp, causing a failing test.
+return /return/; \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/not-regexp.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/not-regexp.js
new file mode 100644
index 0000000..26318f6
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/not-regexp.js
@@ -0,0 +1,3 @@
+!function(){return xreturn/foo}();
+
+!function(){return xtypeof/foo}();
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/regexes.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/regexes.js
new file mode 100644
index 0000000..687cbc3
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/regexes.js
@@ -0,0 +1,24 @@
+function testIssue74() {
+ return /'/;
+}
+
+!function(s) {
+ return /^[£$€?.]/.test(s);
+}();
+
+typeof
+ / ' /;
+
+x = / [/] /;
+
+1
+
+/ foo;
+
+(2)
+
+/ foo;
+
+function(){return/foo/};
+
+function(){return typeof/foo/};
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/starts-regex.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/starts-regex.js
new file mode 100644
index 0000000..2e7d08a
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/starts-regex.js
@@ -0,0 +1,3 @@
+// this is specifically designed so that, if the first "/" is misinterpreted as division,
+// then "/.test(bar);" will be interpreted as an incomplete regexp, causing a failing test.
+/return/.test(bar); \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/token-regexp.js b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/token-regexp.js
new file mode 100644
index 0000000..fb38f60
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Resources/minify/input/token-regexp.js
@@ -0,0 +1,3 @@
+// this is specifically designed so that, if the first "/" is misinterpreted as division,
+// then "/[;" will be interpreted as an incomplete regexp, causing a failing test.
+typeof [/return/]; \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Tests/JSMin/JSMinTest.php b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Tests/JSMin/JSMinTest.php
new file mode 100644
index 0000000..1c9e6dc
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/Tests/JSMin/JSMinTest.php
@@ -0,0 +1,168 @@
+<?php
+
+namespace Tests\JSMin;
+
+use JSMin\JSMin;
+
+/**
+ * Copyright (c) 2009, Robert Hafner
+ * 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 Stash Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Robert Hafner 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.
+ *
+ */
+class JSMinTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @group minify
+ * @dataProvider minifyProvider
+ */
+ public function testMinify($testName, $input, $expected, $actualFile)
+ {
+ $actual = JSMin::minify($input);
+ if ($actual !== $expected && is_writable(dirname($actualFile))) {
+ file_put_contents($actualFile, $actual);
+ }
+ $this->assertEquals($expected, $actual, 'Running Minify Test: ' . $testName);
+ }
+
+ public function testWhitespace() {
+ $this->assertEquals("hello;", JSMin::minify("\r\n\r\nhello;\r\n"));
+ }
+
+ public function testBomRemoval() {
+ $this->assertEquals("hello;", JSMin::minify("\xEF\xBB\xBFhello;"));
+ }
+
+ public function testFuncOverload() {
+ if (!function_exists('mb_strlen') || !((int)ini_get('mbstring.func_overload') & 2)) {
+ $this->markTestIncomplete('Cannot be tested unless mbstring.func_overload is used');
+ return;
+ }
+
+ $input = 'function(s) { return /^[£$€?.]/.test(s); }';
+ $expected = 'function(s){return/^[£$€?.]/.test(s);}';
+ $this->assertEquals($expected, JSMin::minify($input));
+ }
+
+ /**
+ * @dataProvider exceptionProvider
+ */
+ public function testExpections($input, $label, $expClass, $expMessage) {
+ $eClass = $eMsg = '';
+ try {
+ JSMin::minify($input);
+ } catch (\Exception $e) {
+ $eClass = get_class($e);
+ $eMsg = $e->getMessage();
+ }
+ $this->assertTrue(
+ $eClass === $expClass && $eMsg === $expMessage,
+ 'JSMin : throw on ' . $label
+ );
+ }
+
+ public function exceptionProvider() {
+ return array(
+ array(
+ '"Hello'
+ ,'Unterminated String'
+ ,'JSMin\\UnterminatedStringException'
+ ,"JSMin: Unterminated String at byte 5: \"Hello"),
+ array(
+ "return /regexp\n}"
+ ,'Unterminated RegExp'
+ ,'JSMin\\UnterminatedRegExpException'
+ ,"JSMin: Unterminated RegExp at byte 14: /regexp\n"),
+ array(
+ "return/regexp\n}"
+ ,'Unterminated RegExp'
+ ,'JSMin\\UnterminatedRegExpException'
+ ,"JSMin: Unterminated RegExp at byte 13: /regexp\n"),
+ array(
+ ";return/regexp\n}"
+ ,'Unterminated RegExp'
+ ,'JSMin\\UnterminatedRegExpException'
+ ,"JSMin: Unterminated RegExp at byte 14: /regexp\n"),
+ array(
+ ";return /regexp\n}"
+ ,'Unterminated RegExp'
+ ,'JSMin\\UnterminatedRegExpException'
+ ,"JSMin: Unterminated RegExp at byte 15: /regexp\n"),
+ array(
+ "typeof/regexp\n}"
+ ,'Unterminated RegExp'
+ ,'JSMin\\UnterminatedRegExpException'
+ ,"JSMin: Unterminated RegExp at byte 13: /regexp\n"),
+ array(
+ "/* Comment "
+ ,'Unterminated Comment'
+ ,'JSMin\\UnterminatedCommentException'
+ ,"JSMin: Unterminated comment at byte 11: /* Comment "),
+ );
+ }
+
+ /**
+ * This function loads all of the test cases from the specified group.
+ * Groups are created simply by populating the appropriate directories:
+ *
+ * /tests/Resources/GROUPNAME/input/
+ * /tests/Resources/GROUPNAME/output/
+ *
+ * Each test case should have two identically named files, with the raw
+ * javascript going in the test folder and the expected results to be in
+ * the output folder.
+ *
+ * @param $group string
+ * @return array
+ */
+ public function getTestFiles($group)
+ {
+ $baseDir = __DIR__ . '/../../Resources/' . $group . '/';
+ $testDir = $baseDir . 'input/';
+ $expectDir = $baseDir . 'expected/';
+ $actualDir = $baseDir . 'actual/';
+
+ $returnData = array();
+
+ $testFiles = scandir($testDir);
+ foreach ($testFiles as $testFile) {
+ if (substr($testFile, -3) !== '.js' || !file_exists(($expectDir . $testFile))) {
+ continue;
+ }
+
+ $testInput = file_get_contents($testDir . $testFile);
+ $expectedOutput = file_get_contents($expectDir . $testFile);
+ $actualFile = $actualDir . $testFile;
+
+ $returnData[] = array($testFile, $testInput, $expectedOutput, $actualFile);
+ }
+
+ return $returnData;
+ }
+
+ public function minifyProvider()
+ {
+ return $this->getTestFiles('minify');
+ }
+}
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/tests/bootstrap.php b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/bootstrap.php
new file mode 100644
index 0000000..6fd199e
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/tests/bootstrap.php
@@ -0,0 +1 @@
+<?php
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/web/README.txt b/admin/survey/minify/vendor/mrclay/jsmin-php/web/README.txt
new file mode 100644
index 0000000..fbf0238
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/web/README.txt
@@ -0,0 +1,2 @@
+This can be placed in webroot to allow easy direct testing of JSMin.
+
diff --git a/admin/survey/minify/vendor/mrclay/jsmin-php/web/index.php b/admin/survey/minify/vendor/mrclay/jsmin-php/web/index.php
new file mode 100644
index 0000000..5b50068
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/jsmin-php/web/index.php
@@ -0,0 +1,92 @@
+<?php
+
+require __DIR__ . '/../vendor/autoload.php';
+
+function h($txt) {
+ return htmlspecialchars($txt, ENT_QUOTES, 'UTF-8');
+}
+
+$tpl = array();
+
+if (isset($_POST['textIn'])) {
+ $textIn = str_replace("\r\n", "\n", $_POST['textIn']);
+
+ $tpl['inBytes'] = strlen($textIn);
+ $startTime = microtime(true);
+ try {
+ $tpl['output'] = \JSMin\JSMin::minify($textIn);
+ } catch (Exception $e) {
+ $tpl['exceptionMsg'] = getExceptionMsg($e, $textIn);
+ $tpl['output'] = $textIn;
+ sendPage($tpl);
+ }
+ $tpl['time'] = microtime(true) - $startTime;
+ $tpl['outBytes'] = strlen($tpl['output']);
+}
+
+sendPage($tpl);
+
+
+/**
+ * @param Exception $e
+ * @param string $input
+ * @return string HTML
+ */
+function getExceptionMsg(Exception $e, $input) {
+ $msg = "<p>" . h($e->getMessage()) . "</p>";
+
+ if (0 !== strpos(get_class($e), 'JSMin\\Unterminated')
+ || !preg_match('~byte (\d+)~', $e->getMessage(), $m)) {
+ return $msg;
+ }
+
+ $msg .= "<pre>";
+ if ($m[1] > 200) {
+ $msg .= h(substr($input, ($m[1] - 200), 200));
+ } else {
+ $msg .= h(substr($input, 0, $m[1]));
+ }
+ $highlighted = isset($input[$m[1]]) ? h($input[$m[1]]) : '&#9220;';
+ if ($highlighted === "\n") {
+ $highlighted = "&#9166;\n";
+ }
+ $msg .= "<span style='background:#c00;color:#fff'>$highlighted</span>";
+ $msg .= h(substr($input, $m[1] + 1, 200)) . "</span></pre>";
+
+ return $msg;
+}
+
+/**
+ * Draw page
+ *
+ * @param array $vars
+ */
+function sendPage($vars) {
+ header('Content-Type: text/html; charset=utf-8');
+
+ ?>
+ <!DOCTYPE html><head><title>JSMin</title></head>
+ <?php
+ if (isset($vars['exceptionMsg'])) {
+ echo $vars['exceptionMsg'];
+ }
+ if (isset($vars['time'])) {
+ echo "
+<table>
+ <tr><th>Bytes in</th><td>{$vars['inBytes']} (after line endings normalized to <code>\\n</code>)</td></tr>
+ <tr><th>Bytes out</th><td>{$vars['outBytes']} (reduced " . round(100 - (100 * $vars['outBytes'] / $vars['inBytes'])) . "%)</td></tr>
+ <tr><th>Time (s)</th><td>" . round($vars['time'], 5) . "</td></tr>
+</table>
+ ";
+ }
+ ?>
+ <form action="?2" method="post">
+ <p><label>Content<br><textarea name="textIn" cols="80" rows="35" style="width:99%"><?php
+ if (isset($vars['output'])) {
+ echo h($vars['output']);
+ }
+ ?></textarea></label></p>
+ <p><input type="submit" name="method" value="JSMin::minify()"></p>
+ </form><?php
+ exit;
+}
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/.gitignore b/admin/survey/minify/vendor/mrclay/props-dic/.gitignore
new file mode 100644
index 0000000..160ebc0
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/.gitignore
@@ -0,0 +1,21 @@
+# ignore IDE/hidden/OS cache files
+.*
+*~
+nbproject
+nb-configuration.xml
+Session.vim
+*.tmproj
+*.tmproject
+tmtags
+Thumbs.db
+Desktop.ini
+
+# ignore Composer downloads
+/vendor/*
+
+# keep some hiddens
+!.htaccess
+!/.gitignore
+!/.travis.yml
+
+/composer.lock
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/.travis.yml b/admin/survey/minify/vendor/mrclay/props-dic/.travis.yml
new file mode 100644
index 0000000..79f80a3
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/.travis.yml
@@ -0,0 +1,30 @@
+language: php
+
+sudo: false
+
+php:
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+ - 7.0
+ - hhvm
+
+matrix:
+ allow_failures:
+ - php: hhvm
+ fast_finish: true
+
+branches:
+ only:
+ - master
+ - 2.x
+
+before_install:
+ - composer self-update
+
+install:
+ - composer install
+
+script:
+ - phpunit
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/LICENSE b/admin/survey/minify/vendor/mrclay/props-dic/LICENSE
new file mode 100644
index 0000000..adf65b7
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2013 The Authors
+
+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/admin/survey/minify/vendor/mrclay/props-dic/README.md b/admin/survey/minify/vendor/mrclay/props-dic/README.md
new file mode 100644
index 0000000..a01f55b
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/README.md
@@ -0,0 +1,165 @@
+# Props [![Build Status](https://travis-ci.org/mrclay/Props.png)](https://travis-ci.org/mrclay/Props)
+
+Most [Dependency Injection](http://www.mrclay.org/2014/04/06/dependency-injection-ask-for-what-you-need/) containers have fetch operations, like `$di->get('foo')` or `$di['foo']`, which don't allow your IDE to know the type of value received, nor offer you any help remembering/typing key names.
+
+With **Props**, you access values via custom property reads `$di->foo` or method calls `$di->new_foo()`. This allows you to subclass the container and provide `@property` and/or `@method` PHPDoc declarations, giving your IDE and static analysis tools valuable runtime type information.
+
+An example will help:
+
+```php
+/**
+ * @property-read Foo $foo
+ * @method Foo new_foo()
+ */
+class MyContainer extends \Props\Container {
+ public function __construct() {
+ $this->foo = function (MyContainer $c) {
+ return new Foo();
+ };
+ }
+}
+
+$c = new MyContainer();
+
+$foo1 = $c->foo; // your IDE knows this is a Foo instance
+
+$foo2 = $c->new_foo(); // A fresh Foo instance
+
+$foo3 = $c->foo; // same as $foo1
+```
+
+Here's a more complex example:
+
+```php
+/**
+ * @property-read string $style
+ * @property-read Dough $dough
+ * @property-read Cheese $cheese
+ * @property-read Pizza $pizza
+ * @method Slice new_slice()
+ */
+class PizzaServices extends \Props\Container {
+ public function __construct() {
+ $this->style = 'deluxe';
+
+ $this->dough = function (PizzaServices $c) {
+ return new Dough();
+ };
+
+ $this->setFactory('cheese', 'CheeseFactory::getCheese');
+
+ $this->pizza = function (PizzaServices $c) {
+ $pizza = new Pizza($c->style, $c->cheese);
+ $pizza->setDough($c->dough);
+ return $pizza;
+ };
+
+ $this->slice = function (PizzaServices $c) {
+ return $c->pizza->getSlice();
+ };
+ }
+}
+
+$c = new PizzaServices;
+
+$c->pizza; // This first resolves and caches the cheese and dough.
+
+$c->pizza; // The same pizza instance as above (no factories called).
+```
+
+Since "slice" has a factory function set, we can call `new_slice()` to get fresh instances from it:
+
+```php
+$c->new_slice(); // a new Slice instance
+$c->new_slice(); // a new Slice instance
+```
+
+Your IDE sees the container as a plain old class of typed properties, allowing it to offer suggestions of available properties, autocomplete their names, and autocomplete the objects returned. It gives you much more power when providing static analysis and automated refactoring.
+
+## Compatibility
+
+`Props\Container` implements [`ContainerInterface`](https://github.com/container-interop/container-interop).
+
+## Overview
+
+You can specify dependencies via direct setting:
+
+```php
+$c->aaa = new AAA();
+```
+
+You can specify factories by setting a `Closure`, or by using the `setFactory()` method. These are functionally equivalent:
+
+```php
+$c->bbb = function ($c) {
+ return BBB::factory($c);
+};
+
+$c->setFactory('bbb', 'BBB::factory');
+```
+
+Resolved dependencies are cached, returning the same instance:
+
+```php
+$c->bbb === $c->bbb; // true
+```
+
+### Using factories
+
+If you don't want a cached value, use `new_PROPERTYNAME()` to always fetch a fresh instance:
+
+```php
+$c->new_bbb() === $c->new_bbb(); // false
+```
+
+Regular value sets do not store a factory, so you may want to check `hasFactory()` before you use `new_PROPERTYNAME()`:
+
+```php
+// store a value
+$c->ccc = new CCC();
+$c->hasFactory('ccc'); // false
+
+// store a factory
+$c->ccc = function () {
+ return new CCC();
+};
+$c->hasFactory('ccc'); // true
+```
+
+You can also get access to a set factory:
+
+```php
+$callable = $c->getFactory('ccc');
+```
+
+### Extending a factory
+
+Use `extend` to have the return value of a factory filtered before it's returned:
+
+```php
+$c->foo = function ($c) {
+ return new Foo($c->bar);
+};
+
+$c->extend('foo', function ($value, Container $c) {
+ return array($value, $c->bing);
+});
+
+$c->foo; // [Foo, "bing"]
+
+$c->new_foo(); // re-call original foo factory and re-extend output (`bar` and `bing` will be re-read)
+```
+
+## Pimple with property access
+
+If you're used to the [Pimple](http://pimple.sensiolabs.org/) API, try `Props\Pimple`, which just adds property access. With that you can add `@property` declarations and get the same typing benefits.
+
+You can see an [example](https://github.com/mrclay/Props/blob/master/scripts/example-pimple.php) that's similar to the Pimple docs.
+
+## Requirements
+
+ * PHP 5.3
+
+### License (MIT)
+
+See [LICENSE](https://github.com/mrclay/Props/blob/master/src/LICENSE).
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/composer.json b/admin/survey/minify/vendor/mrclay/props-dic/composer.json
new file mode 100644
index 0000000..78f64dd
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/composer.json
@@ -0,0 +1,27 @@
+{
+ "name": "mrclay/props-dic",
+ "type": "library",
+ "description": "Props is a simple DI container that allows retrieving values via custom property and method names",
+ "keywords": ["container", "dependency injection", "di", "di container", "dependency injection container"],
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Steve Clay",
+ "email": "steve@mrclay.org",
+ "homepage": "http://www.mrclay.org/"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.3",
+ "container-interop/container-interop": "^1.1",
+ "pimple/pimple": "~3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "autoload": {
+ "psr-0": {
+ "Props\\": ["src/", "test/"]
+ }
+ }
+} \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/phpunit.xml b/admin/survey/minify/vendor/mrclay/props-dic/phpunit.xml
new file mode 100644
index 0000000..4fc4d1b
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/phpunit.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+ backupStaticAttributes="false"
+ colors="true"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ processIsolation="false"
+ bootstrap="vendor/autoload.php"
+ >
+ <testsuites>
+ <testsuite name="Props Test Suite">
+ <directory>./test/</directory>
+ </testsuite>
+ </testsuites>
+
+ <filter>
+ <whitelist>
+ <directory>./</directory>
+ <exclude>
+ <directory>./test</directory>
+ <directory>./vendor</directory>
+ </exclude>
+ </whitelist>
+ </filter>
+</phpunit>
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/scripts/example-pimple.php b/admin/survey/minify/vendor/mrclay/props-dic/scripts/example-pimple.php
new file mode 100644
index 0000000..23bfee5
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/scripts/example-pimple.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Example of Props\Pimple based on official Pimple docs
+ */
+
+namespace {
+ require __DIR__ . '/../vendor/autoload.php';
+}
+
+namespace PropsExample {
+
+ class SessionStorage {
+ public function __construct($cookieName) { $this->cookieName = $cookieName; }
+ }
+ class Session {
+ public function __construct($storage) { $this->storage = $storage; }
+ }
+ class Zend_Mail {
+ public function setFrom($from) { $this->from = $from; }
+ }
+
+ /**
+ * @property-read string $cookie_name
+ * @property-read string $session_storage_class
+ * @property-read Session $session
+ * @property-read \Closure $random
+ * @property-read Zend_Mail $mail
+ */
+ class MyContainer2 extends \Props\Pimple {
+ public function __construct() {
+ parent::__construct();
+
+ $this->cookie_name = 'SESSION_ID';
+
+ $this->session_storage_class = 'PropsExample\\SessionStorage';
+
+ $this->session_storage = function (MyContainer2 $c) {
+ $class = $c->session_storage_class;
+ return new $class($c->cookie_name);
+ };
+
+ $this->session = $this->factory(function (MyContainer2 $c) {
+ return new Session($c->session_storage);
+ });
+
+ $this->random = $this->protect(function () { return rand(); });
+
+ $this->mail = function (MyContainer2 $c) {
+ return new Zend_Mail();
+ };
+
+ $this->{'mail.default_from'} = 'foo@example.com';
+
+ $this->extend('mail', function($mail, MyContainer2 $c) {
+ $mail->setFrom($c->{'mail.default_from'});
+ return $mail;
+ });
+ }
+ }
+
+ $c = new MyContainer2;
+
+ $r1 = $c->random;
+ $r2 = $c->random;
+
+ echo (int)($r1 === $r2) . "<br>";
+
+ echo $r1() . "<br>";
+
+ echo get_class($c->raw('session')) . '<br>';
+
+ echo var_export($c->session, true) . '<br>';
+
+ echo var_export($c->mail, true) . '<br>';
+}
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/scripts/example.php b/admin/survey/minify/vendor/mrclay/props-dic/scripts/example.php
new file mode 100644
index 0000000..7778860
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/scripts/example.php
@@ -0,0 +1,71 @@
+<?php
+
+require __DIR__ . '/../vendor/autoload.php';
+
+class AAA {}
+class BBB {}
+class CCC {
+ public function __construct(BBB $bbb) {}
+ public function setBbb(BBB $bbb) {}
+ public $aaa;
+}
+class DDD {}
+function get_a_bbb() { return new BBB; }
+
+/**
+ * @property-read AAA $aaa
+ * @property-read BBB $bbb1
+ * @property-read BBB $bbb2
+ * @property-read BBB $bbb3
+ * @property-read CCC $ccc
+ * @property-read DDD $ddd
+ *
+ * @method AAA new_aaa()
+ */
+class MyContainer extends \Props\Container {
+ public function __construct() {
+ // store plain old values
+ $this->ddd = new DDD;
+ $this->{'bbb.class'} = 'BBB';
+
+ // set a factory, which will construct an object on demand
+ $this->aaa = function () {
+ return new AAA();
+ };
+
+ // alternative factory syntax, and using a reference to specify the class name
+ $this->setFactory('bbb1', function (MyContainer $c) {
+ return new $c->{'bbb.class'};
+ });
+
+ // fetch with a callback
+ $this->setFactory('bbb2', 'get_a_bbb');
+
+ // Closures automatically used as factories
+ $this->bbb3 = function (MyContainer $c) {
+ return $c->bbb2;
+ };
+
+ // more advanced factory
+ $this->ccc = function (MyContainer $c) {
+ $val = new CCC($c->bbb1);
+ $val->setBbb($c->bbb2);
+ $val->aaa = $c->aaa;
+ return $val;
+ };
+ }
+}
+
+$c = new MyContainer;
+
+$c->aaa; // factory builds a AAA
+$c->aaa; // the same AAA
+$c->new_aaa(); // always a freshly-built AAA
+
+$c->bbb1; // factory resolves bar.class, builds a BBB
+$c->bbb2; // invoker calls get_a_bbb()
+$c->bbb3; // invoker executes anon func, returning the already-cached $c->bbb2 instance
+
+$c->ccc; // factory creates CCC, passing a new BBB object,
+ // calls setBbb(), passing in $c->bbb2,
+ // and sets the aaa property to $c->aaa
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/scripts/pizza.php b/admin/survey/minify/vendor/mrclay/props-dic/scripts/pizza.php
new file mode 100644
index 0000000..fcb30b0
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/scripts/pizza.php
@@ -0,0 +1,55 @@
+<?php
+
+require __DIR__ . '/../vendor/autoload.php';
+
+class Dough {}
+class Cheese {}
+class Slice {}
+class Pizza {
+ function __construct($style, Cheese $cheese) {}
+ function setDough(Dough $dough) {}
+ function getSlice() { return new Slice(); }
+}
+class CheeseFactory {
+ static function getCheese() { return new Cheese(); }
+}
+
+/**
+ * @property-read string $style
+ * @property-read Dough $dough
+ * @property-read Cheese $cheese
+ * @property-read Pizza $pizza
+ * @method Slice new_slice()
+ */
+class MyDI extends \Props\Container {
+ public function __construct() {
+ $this->style = 'deluxe';
+
+ $this->dough = function (MyContainer $c) {
+ return new Dough();
+ };
+
+ $this->setFactory('cheese', 'CheeseFactory::getCheese');
+
+ $this->pizza = function (MyContainer $c) {
+ $pizza = new Pizza($c->style, $c->cheese);
+ $pizza->setDough($c->dough);
+ return $pizza;
+ };
+
+ // note 3rd argument $shared is false
+ $this->slice = function (MyContainer $c) {
+ return $c->pizza->getSlice();
+ };
+ }
+}
+
+$c = new MyContainer;
+
+// You can request dependencies in any order. They're resolved as needed.
+
+$slice1 = $c->new_slice(); // This first resolves and caches the cheese, dough, and pizza.
+$slice2 = $c->new_slice(); // This just gets a new slice from the existing pizza.
+
+assert($slice1 !== $slice2);
+assert($c->pizza === $c->pizza);
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/src/Props/BadMethodCallException.php b/admin/survey/minify/vendor/mrclay/props-dic/src/Props/BadMethodCallException.php
new file mode 100644
index 0000000..d91f5f0
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/src/Props/BadMethodCallException.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Props;
+
+use Interop\Container\Exception\ContainerException;
+
+class BadMethodCallException extends \Exception implements ContainerException
+{
+}
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/src/Props/Container.php b/admin/survey/minify/vendor/mrclay/props-dic/src/Props/Container.php
new file mode 100644
index 0000000..e1c5789
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/src/Props/Container.php
@@ -0,0 +1,249 @@
+<?php
+
+namespace Props;
+
+use Interop\Container\ContainerInterface;
+
+/**
+ * Container holding values which can be resolved upon reading and optionally stored and shared
+ * across reads.
+ *
+ * Values are read/set as properties.
+ *
+ * @note see scripts/example.php
+ */
+class Container implements ContainerInterface
+{
+ /**
+ * @var callable[]
+ */
+ private $factories = array();
+
+ /**
+ * @var array
+ */
+ private $cache = array();
+
+ /**
+ * Fetch a value.
+ *
+ * @param string $name
+ * @return mixed
+ * @throws FactoryUncallableException|ValueUnresolvableException|NotFoundException
+ */
+ public function __get($name)
+ {
+ if (array_key_exists($name, $this->cache)) {
+ return $this->cache[$name];
+ }
+ $value = $this->build($name);
+ $this->cache[$name] = $value;
+ return $value;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function get($name)
+ {
+ return $this->__get($name);
+ }
+
+ /**
+ * Set a value.
+ *
+ * @param string $name
+ * @param mixed $value
+ * @throws \InvalidArgumentException
+ */
+ public function __set($name, $value)
+ {
+ if ($value instanceof \Closure) {
+ $this->setFactory($name, $value);
+ return;
+ }
+
+ $this->cache[$name] = $value;
+ unset($this->factories[$name]);
+ }
+
+ /**
+ * Set a value to be later returned as is. You only need to use this if you wish to store
+ * a Closure.
+ *
+ * @param string $name
+ * @param mixed $value
+ * @throws \InvalidArgumentException
+ */
+ public function setValue($name, $value)
+ {
+ unset($this->factories[$name]);
+ $this->cache[$name] = $value;
+ }
+
+ /**
+ * @param string $name
+ */
+ public function __unset($name)
+ {
+ unset($this->cache[$name]);
+ unset($this->factories[$name]);
+ }
+
+ /**
+ * @param string $name
+ * @return bool
+ */
+ public function __isset($name)
+ {
+ return array_key_exists($name, $this->factories) || array_key_exists($name, $this->cache);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function has($name)
+ {
+ return $this->__isset($name);
+ }
+
+ /**
+ * Fetch a freshly-resolved value.
+ *
+ * @param string $method method name must start with "new_"
+ * @param array $args
+ * @return mixed
+ * @throws BadMethodCallException
+ */
+ public function __call($method, $args)
+ {
+ if (0 !== strpos($method, 'new_')) {
+ throw new BadMethodCallException("Method name must begin with 'new_'");
+ }
+
+ return $this->build(substr($method, 4));
+ }
+
+ /**
+ * Can we fetch a new value via new_$name()?
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function hasFactory($name)
+ {
+ return array_key_exists($name, $this->factories);
+ }
+
+ /**
+ * Set a factory to generate a value when the container is read.
+ *
+ * @param string $name The name of the value
+ * @param callable $factory Factory for the value
+ * @throws FactoryUncallableException
+ */
+ public function setFactory($name, $factory)
+ {
+ if (!is_callable($factory, true)) {
+ throw new FactoryUncallableException('$factory must appear callable');
+ }
+
+ unset($this->cache[$name]);
+ $this->factories[$name] = $factory;
+ }
+
+ /**
+ * Get an already-set factory callable (Closure, invokable, or callback)
+ *
+ * @param string $name The name of the value
+ * @return callable
+ * @throws NotFoundException
+ */
+ public function getFactory($name)
+ {
+ if (!array_key_exists($name, $this->factories)) {
+ throw new NotFoundException("No factory available for: $name");
+ }
+
+ return $this->factories[$name];
+ }
+
+ /**
+ * Add a function that gets applied to the return value of an existing factory
+ *
+ * @note A cached value (from a previous property read) will thrown away. The next property read
+ * (and all new_NAME() calls) will call the original factory.
+ *
+ * @param string $name The name of the value
+ * @param callable $extender Function that is applied to extend the returned value
+ * @return \Closure
+ * @throws FactoryUncallableException|NotFoundException
+ */
+ public function extend($name, $extender)
+ {
+ if (!is_callable($extender, true)) {
+ throw new FactoryUncallableException('$extender must appear callable');
+ }
+
+ if (!array_key_exists($name, $this->factories)) {
+ throw new NotFoundException("No factory available for: $name");
+ }
+
+ $factory = $this->factories[$name];
+
+ $newFactory = function (Container $c) use ($extender, $factory) {
+ return call_user_func($extender, call_user_func($factory, $c), $c);
+ };
+
+ $this->setFactory($name, $newFactory);
+
+ return $newFactory;
+ }
+
+ /**
+ * Get all keys available
+ *
+ * @return string[]
+ */
+ public function getKeys()
+ {
+ $keys = array_keys($this->cache) + array_keys($this->factories);
+ return array_unique($keys);
+ }
+
+ /**
+ * Build a value
+ *
+ * @param string $name
+ * @return mixed
+ * @throws FactoryUncallableException|ValueUnresolvableException|NotFoundException
+ */
+ private function build($name)
+ {
+ if (!array_key_exists($name, $this->factories)) {
+ throw new NotFoundException("Missing value: $name");
+ }
+
+ $factory = $this->factories[$name];
+
+ if (is_callable($factory)) {
+ try {
+ return call_user_func($factory, $this);
+ } catch (\Exception $e) {
+ throw new ValueUnresolvableException("Factory for '$name' threw an exception.", 0, $e);
+ }
+ }
+
+ $msg = "Factory for '$name' was uncallable";
+ if (is_string($factory)) {
+ $msg .= ": '$factory'";
+ } elseif (is_array($factory)) {
+ if (is_string($factory[0])) {
+ $msg .= ": '{$factory[0]}::{$factory[1]}'";
+ } else {
+ $msg .= ": " . get_class($factory[0]) . "->{$factory[1]}";
+ }
+ }
+ throw new FactoryUncallableException($msg);
+ }
+}
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/src/Props/FactoryUncallableException.php b/admin/survey/minify/vendor/mrclay/props-dic/src/Props/FactoryUncallableException.php
new file mode 100644
index 0000000..58c813e
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/src/Props/FactoryUncallableException.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Props;
+
+use Interop\Container\Exception\ContainerException;
+
+class FactoryUncallableException extends \Exception implements ContainerException
+{
+}
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/src/Props/NotFoundException.php b/admin/survey/minify/vendor/mrclay/props-dic/src/Props/NotFoundException.php
new file mode 100644
index 0000000..570cb68
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/src/Props/NotFoundException.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Props;
+
+use Interop\Container\Exception\NotFoundException as NotFound;
+
+class NotFoundException extends \Exception implements NotFound
+{
+}
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/src/Props/Pimple.php b/admin/survey/minify/vendor/mrclay/props-dic/src/Props/Pimple.php
new file mode 100644
index 0000000..a3b1abf
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/src/Props/Pimple.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Props;
+
+/**
+ * A version of Pimple that uses property access instead of array access
+ *
+ * @author Steve Clay <steve@mrclay.org>
+ */
+class Pimple extends \Pimple\Container
+{
+ /**
+ * Sets a parameter or an object.
+ *
+ * @param string $id The unique identifier for the parameter or object
+ * @param mixed $value The value of the parameter or a closure to define an object
+ * @throws \RuntimeException Prevent override of a frozen service
+ */
+ public function __set($id, $value)
+ {
+ $this->offsetSet($id, $value);
+ }
+
+ /**
+ * Gets a parameter or an object.
+ *
+ * @param string $id The unique identifier for the parameter or object
+ * @return mixed The value of the parameter or an object
+ * @throws \InvalidArgumentException if the identifier is not defined
+ */
+ public function __get($id)
+ {
+ return $this->offsetGet($id);
+ }
+
+ /**
+ * Checks if a parameter or an object is set.
+ *
+ * @param string $id The unique identifier for the parameter or object
+ * @return Boolean
+ */
+ public function __isset($id)
+ {
+ return $this->offsetExists($id);
+ }
+
+ /**
+ * Unsets a parameter or an object.
+ *
+ * @param string $id The unique identifier for the parameter or object
+ */
+ public function __unset($id)
+ {
+ $this->offsetUnset($id);
+ }
+}
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/src/Props/ValueUnresolvableException.php b/admin/survey/minify/vendor/mrclay/props-dic/src/Props/ValueUnresolvableException.php
new file mode 100644
index 0000000..76bba96
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/src/Props/ValueUnresolvableException.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Props;
+
+use Interop\Container\Exception\ContainerException;
+
+class ValueUnresolvableException extends \Exception implements ContainerException
+{
+}
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/test/Props/ContainerTest.php b/admin/survey/minify/vendor/mrclay/props-dic/test/Props/ContainerTest.php
new file mode 100644
index 0000000..d61a206
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/test/Props/ContainerTest.php
@@ -0,0 +1,324 @@
+<?php
+
+namespace Props;
+
+class ContainerTest extends \PHPUnit_Framework_TestCase
+{
+ const TEST_CLASS = 'Props\ContainerTestObject';
+
+ public function testBasicInterop()
+ {
+ $di = new Container();
+ $this->assertInstanceOf('Interop\Container\ContainerInterface', $di);
+
+ $this->assertFalse($di->has('foo'));
+ $di->foo = 'bar';
+ $this->assertTrue($di->has('foo'));
+ }
+
+ /**
+ * @expectedException \Interop\Container\Exception\NotFoundException
+ */
+ public function testInteropNotFound()
+ {
+ $di = new Container();
+ $di->get('foo');
+ }
+
+ /**
+ * @expectedException \Interop\Container\Exception\ContainerException
+ */
+ public function testInteropException1()
+ {
+ $di = new Container();
+ $di->setFactory('foo', null);
+ }
+
+ /**
+ * @expectedException \Interop\Container\Exception\ContainerException
+ */
+ public function testInteropException2()
+ {
+ $di = new Container();
+ $di->setFactory('foo', function () {
+ throw new \Exception();
+ });
+ $di->foo;
+ }
+
+ public function testEmpty()
+ {
+ $di = new Container();
+ $this->assertFalse(isset($di->foo));
+ $this->assertFalse($di->has('foo'));
+ }
+
+ public function testValueSetRemovesFactory()
+ {
+ $di = new Container();
+ $di->foo = function () {
+ return 'Bar';
+ };
+ $di->foo = 'Foo';
+ $this->assertTrue(isset($di->foo));
+ $this->assertFalse($di->hasFactory('foo'));
+ }
+
+ public function testSetResolvable()
+ {
+ $di = new Container();
+ $di->foo = function () {
+ return new ContainerTestObject();
+ };
+
+ $this->assertTrue(isset($di->foo));
+ $this->assertTrue($di->has('foo'));
+ $this->assertTrue($di->hasFactory('foo'));
+ }
+
+ /**
+ * @expectedException \Props\NotFoundException
+ */
+ public function testReadMissingValue()
+ {
+ $di = new Container();
+ $di->foo;
+ }
+
+ /**
+ * @expectedException \Props\NotFoundException
+ */
+ public function testGetMissingValue()
+ {
+ $di = new Container();
+ $di->get('foo');
+ }
+
+ public function testGetNewUnresolvableValue()
+ {
+ $di = new Container();
+ $di->foo = 'Foo';
+
+ $this->setExpectedException('Props\NotFoundException');
+ $di->new_foo();
+ }
+
+ public function testSetAfterRead()
+ {
+ $di = new Container();
+
+ $di->foo = 'Foo';
+ $di->foo = 'Foo2';
+ $this->assertEquals('Foo2', $di->foo);
+ }
+
+ public function testHandlesNullValue()
+ {
+ $di = new Container();
+ $di->null = null;
+ $this->assertTrue(isset($di->null));
+ $this->assertTrue($di->has('null'));
+ $this->assertNull($di->null);
+ $this->assertNull($di->get('null'));
+ }
+
+ public function testFactoryReceivesContainer()
+ {
+ $di = new Container();
+ $di->foo = function () {
+ return func_get_args();
+ };
+ $foo = $di->foo;
+ $this->assertSame($foo[0], $di);
+ $this->assertEquals(count($foo), 1);
+ }
+
+ public function testGetResolvables()
+ {
+ $di = new Container();
+
+ $di->foo = function () {
+ return new ContainerTestObject();
+ };
+ $foo1 = $di->foo;
+ $foo2 = $di->foo;
+ $this->assertInstanceOf(self::TEST_CLASS, $foo1);
+ $this->assertSame($foo1, $foo2);
+
+ $foo3 = $di->new_foo();
+ $foo4 = $di->new_foo();
+ $this->assertInstanceOf(self::TEST_CLASS, $foo3);
+ $this->assertInstanceOf(self::TEST_CLASS, $foo4);
+ $this->assertNotSame($foo3, $foo4);
+ $this->assertNotSame($foo1, $foo3);
+ }
+
+ public function testKeyNamespace()
+ {
+ $di = new Container();
+ $di->foo = function () {
+ return new ContainerTestObject();
+ };
+ $di->new_foo = 'Foo';
+
+ $this->assertInstanceOf(self::TEST_CLASS, $di->new_foo());
+ $this->assertEquals('Foo', $di->new_foo);
+ }
+
+ public function testUnset()
+ {
+ $di = new Container();
+ $di->foo = 'Foo';
+
+ unset($di->foo);
+ $this->assertFalse(isset($di->foo));
+ }
+
+ public function testAccessUnsetValue()
+ {
+ $di = new Container();
+ $di->foo = 'Foo';
+ unset($di->foo);
+
+ $this->setExpectedException('Props\NotFoundException');
+ $di->foo;
+ }
+
+ public function testSetFactory()
+ {
+ $di = new Container();
+ $di->setFactory('foo', function () {
+ $obj = new ContainerTestObject();
+ $obj->bar = 'bar';
+ return $obj;
+ });
+
+ $foo = $di->foo;
+
+ $this->assertInstanceOf(self::TEST_CLASS, $foo);
+ $this->assertEquals('bar', $foo->bar);
+ }
+
+ public function testSetValue()
+ {
+ $di = new Container();
+ $di->setValue('foo', function () {});
+
+ $this->assertInstanceOf('Closure', $di->foo);
+ }
+
+ /**
+ * @expectedException \Props\NotFoundException
+ */
+ public function testCannotExtendValue()
+ {
+ $di = new Container();
+ $di->foo = 1;
+ $di->extend('foo', function ($value, Container $c) {
+ return $value + 1;
+ });
+ }
+
+ public function testExtend()
+ {
+ $di = new Container();
+ $di->key = 'count';
+
+ $di->counter = function (Container $c) {
+ static $i = 0;
+ $i++;
+ return (object)array(
+ $c->key => $i,
+ );
+ };
+
+ $c1 = $di->counter; // cached with $i = 1
+
+ $di->extend('counter', function ($value, Container $c) {
+ static $i = 0;
+ $i++;
+ $value->one = $i;
+ return $value;
+ });
+
+ $c2 = $di->counter; // because of extension, doesn't use original cached value
+ $this->assertEquals((object)array('count' => 2, 'one' => 1), $c2);
+ $this->assertNotSame($c1, $c2);
+
+ $di->key = 'total';
+
+ $c3 = $di->counter; // but caches repeat reads
+ $this->assertEquals((object)array('count' => 2, 'one' => 1), $c3);
+ $this->assertSame($c2, $c3);
+
+ $c4 = $di->new_counter();
+ $this->assertEquals((object)array('total' => 3, 'one' => 2), $c4);
+ $this->assertNotSame($c3, $c4);
+
+ $di->extend('counter', function ($value, Container $c) {
+ static $i = 0;
+ $i++;
+ $value->two = $i;
+ return $value;
+ });
+
+ $c5 = $di->counter; // going deep!
+ $this->assertEquals((object)array('total' => 4, 'one' => 3, 'two' => 1), $c5);
+
+ $c6 = $di->new_counter();
+ $this->assertEquals((object)array('total' => 5, 'one' => 4, 'two' => 2), $c6);
+ }
+
+ /**
+ * @expectedException \Props\NotFoundException
+ */
+ public function testGetFactoryForValue()
+ {
+ $di = new Container();
+ $di->key = 'count';
+ $di->getFactory('key');
+ }
+
+ /**
+ * @expectedException \Props\NotFoundException
+ */
+ public function testGetMissingFactory()
+ {
+ $di = new Container();
+ $di->getFactory('key');
+ }
+
+ public function testGetFactory()
+ {
+ $di = new Container();
+ $factory = function () {};
+ $di->foo = $factory;
+ $factory2 = $di->getFactory('foo');
+ $this->assertSame($factory, $factory2);
+ }
+
+ public function testGetKeys()
+ {
+ $di = new Container();
+ $di->foo = 'foo';
+ $di->bar = function () {};
+ $di->bar;
+ $this->assertEquals(array('foo', 'bar'), $di->getKeys());
+ }
+}
+
+class ContainerTestObject
+{
+ public $calls;
+ public $args;
+
+ public function __construct()
+ {
+ $this->args = func_get_args();
+ }
+
+ public function __call($name, $args)
+ {
+ $this->calls[$name] = $args[0];
+ }
+}
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/Invokable.php b/admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/Invokable.php
new file mode 100644
index 0000000..0b87de9
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/Invokable.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * 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.
+ */
+
+namespace Props\Pimple\Tests;
+
+class Invokable
+{
+ public function __invoke($value = null)
+ {
+ $service = new Service();
+ $service->value = $value;
+
+ return $service;
+ }
+} \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/NonInvokable.php b/admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/NonInvokable.php
new file mode 100644
index 0000000..5d0b7c1
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/NonInvokable.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * 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.
+ */
+
+namespace Props\Pimple\Tests;
+
+class NonInvokable
+{
+ public function __call($a, $b)
+ {
+ }
+} \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/PimpleTest.php b/admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/PimpleTest.php
new file mode 100644
index 0000000..2a29660
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/PimpleTest.php
@@ -0,0 +1,452 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * 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.
+ */
+
+namespace Props\Pimple\Tests;
+
+use Props\Pimple;
+
+/**
+ * Pimple Test
+ *
+ * @package pimple
+ * @author Igor Wiedler <igor@wiedler.ch>
+ */
+class PimpleTest extends \PHPUnit_Framework_TestCase
+{
+ public function testWithString()
+ {
+ $pimple = new Pimple();
+ $pimple->param = 'value';
+
+ $this->assertEquals('value', $pimple->param);
+ }
+
+ public function testWithClosure()
+ {
+ $pimple = new Pimple();
+ $pimple->service = function () {
+ return new Service();
+ };
+
+ $this->assertInstanceOf('Props\Pimple\Tests\Service', $pimple->service);
+ }
+
+ public function testServicesShouldBeDifferent()
+ {
+ $pimple = new Pimple();
+ $pimple->service = $pimple->factory(function () {
+ return new Service();
+ });
+
+ $serviceOne = $pimple->service;
+ $this->assertInstanceOf('Props\Pimple\Tests\Service', $serviceOne);
+
+ $serviceTwo = $pimple->service;
+ $this->assertInstanceOf('Props\Pimple\Tests\Service', $serviceTwo);
+
+ $this->assertNotSame($serviceOne, $serviceTwo);
+ }
+
+ public function testShouldPassContainerAsParameter()
+ {
+ $pimple = new Pimple();
+ $pimple->service = function () {
+ return new Service();
+ };
+ $pimple->container = function ($container) {
+ return $container;
+ };
+
+ $this->assertNotSame($pimple, $pimple->service);
+ $this->assertSame($pimple, $pimple->container);
+ }
+
+ public function testIsset()
+ {
+ $pimple = new Pimple();
+ $pimple->param = 'value';
+ $pimple->service = function () {
+ return new Service();
+ };
+
+ $pimple->null = null;
+
+ $this->assertTrue(isset($pimple->param));
+ $this->assertTrue(isset($pimple->service));
+ $this->assertTrue(isset($pimple->null));
+ $this->assertFalse(isset($pimple->non_existent));
+ }
+
+ public function testConstructorInjection()
+ {
+ $params = array("param" => "value");
+ $pimple = new Pimple($params);
+
+ $this->assertSame($pimple->param, $pimple->param);
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Identifier "foo" is not defined.
+ */
+ public function testOffsetGetValidatesKeyIsPresent()
+ {
+ $pimple = new Pimple();
+ echo $pimple->foo;
+ }
+
+ public function testOffsetGetHonorsNullValues()
+ {
+ $pimple = new Pimple();
+ $pimple->foo = null;
+ $this->assertNull($pimple->foo);
+ }
+
+ public function testUnset()
+ {
+ $pimple = new Pimple();
+ $pimple->param = 'value';
+ $pimple->service = function () {
+ return new Service();
+ };
+
+ unset($pimple->param, $pimple->service);
+ $this->assertFalse(isset($pimple->param));
+ $this->assertFalse(isset($pimple->service));
+ }
+
+ /**
+ * @dataProvider serviceDefinitionProvider
+ */
+ public function testShare($service)
+ {
+ $pimple = new Pimple();
+ $pimple->shared_service = $service;
+
+ $serviceOne = $pimple->shared_service;
+ $this->assertInstanceOf('Props\Pimple\Tests\Service', $serviceOne);
+
+ $serviceTwo = $pimple->shared_service;
+ $this->assertInstanceOf('Props\Pimple\Tests\Service', $serviceTwo);
+
+ $this->assertSame($serviceOne, $serviceTwo);
+ }
+
+ /**
+ * @dataProvider serviceDefinitionProvider
+ */
+ public function testProtect($service)
+ {
+ $pimple = new Pimple();
+ $pimple->protected = $pimple->protect($service);
+
+ $this->assertSame($service, $pimple->protected);
+ }
+
+ public function testGlobalFunctionNameAsParameterValue()
+ {
+ $pimple = new Pimple();
+ $pimple->global_function = 'strlen';
+ $this->assertSame('strlen', $pimple->global_function);
+ }
+
+ public function testRaw()
+ {
+ $pimple = new Pimple();
+ $pimple->service = $definition = $pimple->factory(function () { return 'foo'; });
+ $this->assertSame($definition, $pimple->raw('service'));
+ }
+
+ public function testRawHonorsNullValues()
+ {
+ $pimple = new Pimple();
+ $pimple->foo = null;
+ $this->assertNull($pimple->raw('foo'));
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Identifier "foo" is not defined.
+ */
+ public function testRawValidatesKeyIsPresent()
+ {
+ $pimple = new Pimple();
+ $pimple->raw('foo');
+ }
+
+ /**
+ * @dataProvider serviceDefinitionProvider
+ */
+ public function testExtend($service)
+ {
+ $pimple = new Pimple();
+ $pimple->shared_service = function () {
+ return new Service();
+ };
+ $pimple->factory_service = $pimple->factory(function () {
+ return new Service();
+ });
+
+ $pimple->extend('shared_service', $service);
+ $serviceOne = $pimple->shared_service;
+ $this->assertInstanceOf('Props\Pimple\Tests\Service', $serviceOne);
+ $serviceTwo = $pimple->shared_service;
+ $this->assertInstanceOf('Props\Pimple\Tests\Service', $serviceTwo);
+ $this->assertSame($serviceOne, $serviceTwo);
+ $this->assertSame($serviceOne->value, $serviceTwo->value);
+
+ $pimple->extend('factory_service', $service);
+ $serviceOne = $pimple->factory_service;
+ $this->assertInstanceOf('Props\Pimple\Tests\Service', $serviceOne);
+ $serviceTwo = $pimple->factory_service;
+ $this->assertInstanceOf('Props\Pimple\Tests\Service', $serviceTwo);
+ $this->assertNotSame($serviceOne, $serviceTwo);
+ $this->assertNotSame($serviceOne->value, $serviceTwo->value);
+ }
+
+ public function testExtendDoesNotLeakWithFactories()
+ {
+ $pimple = new Pimple();
+
+ $pimple->foo = $pimple->factory(function () { return; });
+ $pimple->foo = $pimple->extend('foo', function ($foo, $pimple) { return; });
+ unset($pimple->foo);
+
+ $class = new \ReflectionClass($pimple);
+ $class = $class->getParentClass();
+ $p = $class->getProperty('values');
+ $p->setAccessible(true);
+ $this->assertEmpty($p->getValue($pimple));
+
+ $p = $class->getProperty('factories');
+ $p->setAccessible(true);
+ $this->assertCount(0, $p->getValue($pimple));
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Identifier "foo" is not defined.
+ */
+ public function testExtendValidatesKeyIsPresent()
+ {
+ $pimple = new Pimple();
+ $pimple->extend('foo', function () {});
+ }
+
+ public function testKeys()
+ {
+ $pimple = new Pimple();
+ $pimple->foo = 123;
+ $pimple->bar = 123;
+
+ $this->assertEquals(array('foo', 'bar'), $pimple->keys());
+ }
+
+ /** @test */
+ public function settingAnInvokableObjectShouldTreatItAsFactory()
+ {
+ $pimple = new Pimple();
+ $pimple->invokable = new Invokable();
+
+ $this->assertInstanceOf('Props\Pimple\Tests\Service', $pimple->invokable);
+ }
+
+ /** @test */
+ public function settingNonInvokableObjectShouldTreatItAsParameter()
+ {
+ $pimple = new Pimple();
+ $pimple->non_invokable = new NonInvokable();
+
+ $this->assertInstanceOf('Props\Pimple\Tests\NonInvokable', $pimple->non_invokable);
+ }
+
+ /**
+ * @dataProvider badServiceDefinitionProvider
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Service definition is not a Closure or invokable object.
+ */
+ public function testFactoryFailsForInvalidServiceDefinitions($service)
+ {
+ $pimple = new Pimple();
+ $pimple->factory($service);
+ }
+
+ /**
+ * @dataProvider badServiceDefinitionProvider
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Callable is not a Closure or invokable object.
+ */
+ public function testProtectFailsForInvalidServiceDefinitions($service)
+ {
+ $pimple = new Pimple();
+ $pimple->protect($service);
+ }
+
+ /**
+ * @dataProvider badServiceDefinitionProvider
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Identifier "foo" does not contain an object definition.
+ */
+ public function testExtendFailsForKeysNotContainingServiceDefinitions($service)
+ {
+ $pimple = new Pimple();
+ $pimple->foo = $service;
+ $pimple->extend('foo', function () {});
+ }
+
+ /**
+ * @dataProvider badServiceDefinitionProvider
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Extension service definition is not a Closure or invokable object.
+ */
+ public function testExtendFailsForInvalidServiceDefinitions($service)
+ {
+ $pimple = new Pimple();
+ $pimple->foo = function () {};
+ $pimple->extend('foo', $service);
+ }
+
+ /**
+ * Provider for invalid service definitions
+ */
+ public function badServiceDefinitionProvider()
+ {
+ return array(
+ array(123),
+ array(new NonInvokable())
+ );
+ }
+
+ /**
+ * Provider for service definitions
+ */
+ public function serviceDefinitionProvider()
+ {
+ return array(
+ array(function ($value) {
+ $service = new Service();
+ $service->value = $value;
+
+ return $service;
+ }),
+ array(new Invokable())
+ );
+ }
+
+ public function testDefiningNewServiceAfterFreeze()
+ {
+ $pimple = new Pimple();
+ $pimple->foo = function () {
+ return 'foo';
+ };
+ $foo = $pimple->foo;
+
+ $pimple->bar = function () {
+ return 'bar';
+ };
+ $this->assertSame('bar', $pimple->bar);
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ * @expectedExceptionMessage Cannot override frozen service "foo".
+ */
+ public function testOverridingServiceAfterFreeze()
+ {
+ $pimple = new Pimple();
+ $pimple->foo = function () {
+ return 'foo';
+ };
+ $foo = $pimple->foo;
+
+ $pimple->foo = function () {
+ return 'bar';
+ };
+ }
+
+ public function testRemovingServiceAfterFreeze()
+ {
+ $pimple = new Pimple();
+ $pimple->foo = function () {
+ return 'foo';
+ };
+ $foo = $pimple->foo;
+
+ unset($pimple->foo);
+ $pimple->foo = function () {
+ return 'bar';
+ };
+ $this->assertSame('bar', $pimple->foo);
+ }
+
+ public function testExtendingService()
+ {
+ $pimple = new Pimple();
+ $pimple->foo = function () {
+ return 'foo';
+ };
+ $pimple->foo = $pimple->extend('foo', function ($foo, $app) {
+ return "$foo.bar";
+ });
+ $pimple->foo = $pimple->extend('foo', function ($foo, $app) {
+ return "$foo.baz";
+ });
+ $this->assertSame('foo.bar.baz', $pimple->foo);
+ }
+
+ public function testExtendingServiceAfterOtherServiceFreeze()
+ {
+ $pimple = new Pimple();
+ $pimple->foo = function () {
+ return 'foo';
+ };
+ $pimple->bar = function () {
+ return 'bar';
+ };
+ $foo = $pimple->foo;
+
+ $pimple->bar = $pimple->extend('bar', function ($bar, $app) {
+ return "$bar.baz";
+ });
+ $this->assertSame('bar.baz', $pimple->bar);
+ }
+
+ public function testNoPrivateAccess()
+ {
+ $check = new AccessCheck();
+ $this->assertTrue(isset($check['values']));
+ $this->assertEquals('values', $check['values']);
+ }
+}
+
+class AccessCheck extends Pimple {
+ function __construct()
+ {
+ $this->values = 'values';
+
+ parent::__construct();
+ }
+} \ No newline at end of file
diff --git a/admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/Service.php b/admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/Service.php
new file mode 100644
index 0000000..9784ed3
--- /dev/null
+++ b/admin/survey/minify/vendor/mrclay/props-dic/test/Props/Pimple/Tests/Service.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of Pimple.
+ *
+ * Copyright (c) 2009 Fabien Potencier
+ *
+ * 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.
+ */
+
+namespace Props\Pimple\Tests;
+
+/**
+ * Pimple Test Service
+ *
+ * @package pimple
+ * @author Igor Wiedler <igor@wiedler.ch>
+ */
+class Service
+{
+ public $value;
+} \ No newline at end of file